// JavaScript Document
// this function requires the following snippets:

// JavaScript/readable_MM_functions/findObj

// JavaScript/readable_MM_functions/showHideLayers

// JavaScript/events/getMouseLoc



var ie5=document.all&&document.getElementById
var ns6=document.getElementById&&!document.all

function writeHTML(id,text)
{
	if (document.getElementById)
	{
		x = document.getElementById(id);
		x.innerHTML = '';
		x.innerHTML = text;
	}
	else if (document.all)
	{
		x = document.all[id];
		x.innerHTML = text;
	}
	else if (document.layers)
	{
		x = document.layers[id];
		//text2 = '<P CLASS="testclass">' + text + '</P>';
		x.document.open();
		x.document.write(text);
		x.document.close();
	}
	//alert(text);
}

function readHTML(id)
{
	if (document.getElementById)
	{
		x = document.getElementById(id);
		return x.innerHTML;
	}
	else if (document.all)
	{
		x = document.all[id];
		return x.innerHTML;
	}
	else if (document.layers)
	{
		alert('Browser not support');
	}
}


function moveLayerToMouseLoc(theLayer, offsetH, offsetV)

{

  var obj;

	if (document.getElementById)
	{
		 document.onMouseMove = getMouseLoc;
		x = document.getElementById(theLayer);
		x.style.left = mLoc.x +offsetH;
		x.style.top = mLoc.y +offsetV;
	}
	else if (document.all)
	{
      getMouseLoc();
      obj = document.all[theLayer].style;
      obj.pixelLeft = mLoc.x +offsetH;
      obj.pixelTop  = mLoc.y +offsetV;
	}
	else if (document.layers)
	{
      document.onMouseMove = getMouseLoc;
      obj = document.layers[theLayer];
      obj.left = mLoc.x +offsetH;
      obj.top  = mLoc.y +offsetV;
	}

/*
  if ((findObj(theLayer))!=null)

  {

    if (document.layers)  //NS

    {

      document.onMouseMove = getMouseLoc;

      obj = document.layers[theLayer];

      obj.left = mLoc.x +offsetH;

      obj.top  = mLoc.y +offsetV;

		//sprite=document.layers[theLayer].document;
		// add father layers if needed! document.layers[''+father+'']...
		//sprite.open();
		//sprite.write(content);
		//sprite.close();
//      document.all['textfield'].value=detailtext;
//	  document.all['PopUP'].innerHTML

    }

    else if (document.all)//IE

    {

      getMouseLoc();

      obj = document.all[theLayer].style;

      obj.pixelLeft = mLoc.x +offsetH;

      obj.pixelTop  = mLoc.y +offsetV;
      
//      document.all['textfield'].value=detailtext;
	  //document.all[theLayer].innerHTML = detailtext;

    }else	if (document.getElementById)	{
		
		 document.onMouseMove = getMouseLoc;
		//mLoc.x = event.pageX;
		//mLoc.y = event.pageY;

		x = document.getElementById(theLayer);
		
		//x.clientLeft = mLoc.x +offsetH;
		//x.clientTop = mLoc.y +offsetV;
		x.style.left = mLoc.x +offsetH;
		x.style.top = mLoc.y +offsetV;
		//alert(event.pageX);
		//alert(mLoc.x+' '+offsetH);
		//alert(mLoc.y+' '+offsetV);
		//x.innerHTML = '';
		//x.innerHTML = text;
		//x.style.visibility ='visible';
	}
    //showHideLayers(theLayer,'','show');

  }*/

}

// get mouse location

function Point(x,y) {  this.x = x; this.y = y; }

mLoc = new Point(-500,-500);


function getMouseLoc(e)
{

  if(!document.all)  //NS

  {

    mLoc.x = e.pageX;
    mLoc.y = e.pageY;
	//alert('');
  }
  else               //IE

  {
//alert('');
    mLoc.x = event.x + document.body.scrollLeft;

    mLoc.y = event.y + document.body.scrollTop;

  }
  

  return true;

}

//NS init:

//if(!document.all){document.captureEvents(Event.MOUSEMOVE); document.onMouseMove = getMouseLoc; }// * Dependencies * 
//if(document.layers){ document.captureEvents(Event.MOUSEMOVE); document.onMouseMove = getMouseLoc; }// * Dependencies * 
//if(document.getElementById){ document.captureEvents(Event.MOUSEMOVE); document.onMouseMove = getMouseLoc; }// * Dependencies * 

// this function requires the following snippets:

// JavaScript/readable_MM_functions/findObj

//

// Accepts a variable number of arguments, in triplets as follows:

// arg 1: simple name of a layer object, such as "Layer1"

// arg 2: ignored (for backward compatibility)

// arg 3: 'hide' or 'show'

// repeat...

//

// Example: showHideLayers(Layer1,'','show',Layer2,'','hide');

function showHideLayers()

{ 

  var i, visStr, obj, args = showHideLayers.arguments;

  for (var i=0; i<(args.length-2); i+=3)

  {

    if ((obj = findObj(args[i])) != null)

    {

      visStr = args[i+2];

      if (obj.style)

      {

        obj = obj.style;

//        if(visStr == 'show') visStr = 'visible';

//        else if(visStr == 'hide') visStr = 'hidden';
        if(visStr == 'show') visStr = 'inline';

        else if(visStr == 'hide') visStr = 'none';

      }

      //obj.visibility = visStr;
      obj.display = visStr;

    }

  }

}

function iecompattest(){
	return (!window.opera && document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body
}
var centerWind;
var oldTop;
function makeCenterScreen(wind){
	if(!wind){
		nowtop = ns6? window.pageYOffset : iecompattest().scrollTop;
		if(oldTop==nowtop)return;
		oldTop=nowtop;
		wind = centerWind;
	}
		if(!wind)return;
	  var myWidth = 0, myHeight = 0;
	  if( typeof( window.innerWidth ) == 'number' ) {
		//Non-IE
		myWidth = window.innerWidth;
		myHeight = window.innerHeight;
	  } 
	  else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) 		
	  {
		//IE 6+ in 'standards compliant mode'
		myWidth = document.documentElement.clientWidth;
		myHeight = document.documentElement.clientHeight;
	  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
		//IE 4 compatible
		myWidth = document.body.clientWidth;
		myHeight = document.body.clientHeight;
	  }

	var  obj;
	if ((obj = findObj(wind)) != null){
		centerWind = wind;
		if (obj.style){
			obj = obj.style;
		}
		//alert(obj.width.substring(0,obj.width.length-2));
		
		obj.left= (myWidth-obj.width.substring(0,obj.width.length-2))/2+ "px";
		var offsetTop = (myHeight-obj.height.substring(0,obj.height.length-2))/2;
		//alert(obj.height);
		obj.top = ns6? window.pageYOffset*1+offsetTop+"px" : iecompattest().scrollTop*1+offsetTop+"px";
		
		//obj.top = offsetTop+"px";//ns6? window.pageYOffset*1+offsetTop+"px" : iecompattest().scrollTop*1+offsetTop+"px";
		//obj.position = 'fixed'; 
	}
	//findObj('backgroundLayer').style.top=ns6? window.pageYOffset+"px" : iecompattest().scrollTop+"px";
//	 alertSize() ;
}
function makeConnerScreen(wind){
	  var myWidth = 0, myHeight = 0;
	  if( typeof( window.innerWidth ) == 'number' ) {
		//Non-IE
		myWidth = window.innerWidth;
		myHeight = window.innerHeight;
	  } 
	  else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) 		
	  {
		//IE 6+ in 'standards compliant mode'
		myWidth = document.documentElement.clientWidth;
		myHeight = document.documentElement.clientHeight;
	  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
		//IE 4 compatible
		myWidth = document.body.clientWidth;
		myHeight = document.body.clientHeight;
	  }

	var  obj;
	if ((obj = findObj(wind)) != null){
		centerWind = wind;
		if (obj.style){
			obj = obj.style;
		}
		//alert(obj.width.substring(0,obj.width.length-2));
		
		obj.left= (myWidth-obj.width.substring(0,obj.width.length-2)-20)+ "px";
		var offsetTop = 5;//(myHeight-obj.height.substring(0,obj.height.length-2))/2;
		//alert(obj.height);
		obj.top = ns6? window.pageYOffset*1+offsetTop+"px" : iecompattest().scrollTop*1+offsetTop+"px";
		
		//obj.top = offsetTop+"px";//ns6? window.pageYOffset*1+offsetTop+"px" : iecompattest().scrollTop*1+offsetTop+"px";
		//obj.position = 'fixed'; 
	}
	//findObj('backgroundLayer').style.top=ns6? window.pageYOffset+"px" : iecompattest().scrollTop+"px";
//	 alertSize() ;
}


function makeScale(wind,w,h,ow,oh){
  ow = typeof(ow) != 'undefined' ? ow : 0;
  oh = typeof(oh) != 'undefined' ? oh : 0;
	
	  if( typeof( window.innerWidth ) == 'number' ) {
		//Non-IE
		myWidth = window.innerWidth;
		myHeight = window.innerHeight;
	  } 
	  else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) 		
	  {
		//IE 6+ in 'standards compliant mode'
		myWidth = document.documentElement.clientWidth;
		myHeight = document.documentElement.clientHeight;
	  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
		//IE 4 compatible
		myWidth = document.body.clientWidth;
		myHeight = document.body.clientHeight;
	  }
	var  obj;
	if ((obj = findObj(wind)) != null){
		if (obj.style){
			obj = obj.style;
		}
		
		obj.width= (parseInt(myWidth*w/100)+ow)+ "px";
		obj.height = (parseInt(myHeight*h/100)+oh)+ "px";
		
		//obj.top = offsetTop+"px";//ns6? window.pageYOffset*1+offsetTop+"px" : iecompattest().scrollTop*1+offsetTop+"px";
		//obj.position = 'fixed'; 
	}

	  
}

function setBG(comp,color){
	var  obj;
	if ((obj = findObj(comp)) != null){
		if (obj.style){
			obj = obj.style;
		}
		obj.background=color;
	}else{
		alert("Not found object name "+comp)
	}
}

function alertSize() {

  window.alert( 'Width = ' + myWidth );
  window.alert( 'Height = ' + myHeight );
}


function moveXY(wind,x,y){
	var  obj;
	if ((obj = findObj(wind)) != null){
		if (obj.style){
			obj = obj.style;
		}
		//alert(obj.width.substring(0,obj.width.length-2));
		
		obj.left = x+ "px";
		obj.top = y+"px";
	}
}
// Example: obj = findObj("image1");

function findObj(theObj, theDoc)

{
//alert(theObj+''+theDoc);
  var p, i, foundObj;

  

  if(!theDoc) theDoc = document;

  if( (p = theObj.indexOf("?")) > 0 && parent.frames.length)

  {

    theDoc = parent.frames[theObj.substring(p+1)].document;

    theObj = theObj.substring(0,p);

  }

  if(!(foundObj = theDoc[theObj]) && theDoc.all) foundObj = theDoc.all[theObj];

  for (i=0; !foundObj && i < theDoc.forms.length; i++) 

    foundObj = theDoc.forms[i][theObj];

  for(i=0; !foundObj && theDoc.layers && i < theDoc.layers.length; i++) 

    foundObj = findObj(theObj,theDoc.layers[i].document);

  if(!foundObj && document.getElementById) foundObj = document.getElementById(theObj);

  
//alert(foundObj);
  return foundObj;

}
function setFocus(objname){
	var  obj;
	if ((obj = findObj(objname)) != null){
		obj.focus();
	}
	
}
function popTooltip(head,text,w,h){
	writeit('PopUPTooltipHead',head); 
	writeit('PopUPTooltipText',text); 
	moveLayerToMouseLoc('PopUPTooltip',+40,+20);
	showHideLayers('PopUPTooltip','','show');
}
function closeTooltip(){
	showHideLayers('PopUPTooltip','','hide');
}


function activeBG(){
	  if( typeof( window.innerWidth ) == 'number' ) {
		//Non-IE
		myWidth = window.innerWidth;
		myHeight = window.innerHeight;
	  } 
	  else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) 		
	  {
		//IE 6+ in 'standards compliant mode'
		myWidth = document.documentElement.clientWidth;
		myHeight = document.documentElement.clientHeight;
	  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
		//IE 4 compatible
		myWidth = document.body.clientWidth;
		myHeight = document.body.clientHeight;
	  }
	var  obj;
	if ((obj = findObj('backgroundLayer')) != null){
		if (obj.style){
			obj = obj.style;
		}
		//alert(obj.width.substring(0,obj.width.length-2));
		
		//obj.left= (myWidth-obj.width.substring(0,obj.width.length-2))/2+ "px";
		//obj.position = 'fixed'; 
		var offsetTop = 0;//(myHeight-obj.height.substring(0,obj.width.length-2))/2;
		obj.top = ns6? window.pageYOffset*1+offsetTop+"px" : iecompattest().scrollTop*1+offsetTop+"px";
		obj.height=myHeight+'px';	  
		//obj.top = "0px";
		obj.left = "0px";
		//obj.top = "0px";	
	}

	//document.body.style.overflow="hidden";
	showHideLayers("stupid_ie_select1",'','hide');
	//makeCenterScreen('backgroundLayer');
	showHideLayers('backgroundLayer','','show');
	//window.scrollbars.visible = false;
}
function hideBG(){
	
	//document.body.style.overflow="auto";
	
	showHideLayers("stupid_ie_select1",'','show');
	showHideLayers('backgroundLayer','','hide');
}
function setValue(objname,val){
	var  obj;
	if ((obj = findObj(objname)) != null){
		obj.value = val;
	}
	
}
function setChecked(objname,val){
	var  obj;
	if ((obj = findObj(objname)) != null){
		obj.checked = val;
	}
}
function isChecked(objname){
	var  obj;
	if ((obj = findObj(objname)) != null){
		return obj.checked;
	}
	return false;
}


function getValue(objname){
	var  obj;
	if ((obj = findObj(objname)) != null){
		return obj.value;
	}
	return null;
}

function getCheckedValue(radioObj) {
	if(!radioObj)
		return "";
	var radioLength = radioObj.length;
	if(radioLength == undefined)
		if(radioObj.checked)
			return radioObj.value;
		else
			return "";
	for(var i = 0; i < radioLength; i++) {
		if(radioObj[i].checked) {
			return radioObj[i].value;
		}
	}
	return "";
}


function Loading(){
	  if( typeof( window.innerWidth ) == 'number' ) {
		//Non-IE
		myWidth = window.innerWidth;
		myHeight = window.innerHeight;
	  } 
	  else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) 		
	  {
		//IE 6+ in 'standards compliant mode'
		myWidth = document.documentElement.clientWidth;
		myHeight = document.documentElement.clientHeight;
	  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
		//IE 4 compatible
		myWidth = document.body.clientWidth;
		myHeight = document.body.clientHeight;
	  }
	var  obj;
	if ((obj = findObj('loadingLayer')) != null){
		if (obj.style){
			obj = obj.style;
		}
		//alert(obj.width.substring(0,obj.width.length-2));
		
		//obj.left= (myWidth-obj.width.substring(0,obj.width.length-2))/2+ "px";
		var offsetTop = 0;//(myHeight-obj.height.substring(0,obj.width.length-2))/2;
		obj.top = ns6? window.pageYOffset*1+offsetTop+"px" : iecompattest().scrollTop*1+offsetTop+"px";
		obj.height=myHeight+'px';	  
		obj.left = "0px";
		//obj.position = 'fixed'; 
		//obj.top = "0px";	
	}

	//document.body.style.overflow="hidden";
	//showHideLayers("stupid_ie_select1",'','hide');
	//makeCenterScreen('backgroundLayer');
	showHideLayers('loadingLayer','','show');
	//window.scrollbars.visible = false;	
}

function hideLoading(){
	//showHideLayers("stupid_ie_select1",'','show');
	showHideLayers('loadingLayer','','hide');
}

/*
function scroller() {
  makeCenterScreen();
//  setTimeout("scroller()", 100);
}*/
/*
window.onscroll = function()
{
	if( window.XMLHttpRequest ) { // IE 6 doesn't implement position fixed nicely...
		if (document.documentElement.scrollTop > 318) {
			$('side_bar').style.position = 'fixed'; 
			$('side_bar').style.top = '0';
		} else {
			$('side_bar').style.position = 'absolute'; 
			$('side_bar').style.top = 'auto';
		}
	}
}
*/
function hasClass(ele,cls) {
	return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
}
function addClass(ele,cls) {
	if (!this.hasClass(ele,cls)) ele.className += " "+cls;
}
function removeClass(ele,cls) {
	if (hasClass(ele,cls)) {
		var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
		ele.className=ele.className.replace(reg,' ');
	}
}
function popup(URLStr){
	
	open(URLStr, 'popUpWin'+(new Date().getTime()), 'toolbar=no,type=fullWindow,fullscreen,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,copyhistory=yes');
	
	return false;
}
function loadIFrame(iframe,URLStr){
	if ((obj = findObj(iframe)) != null){
		//obj.src = URLStr;
		if($.browser.opera){
			obj.location.href = URLStr;
		}else{
			obj.src = URLStr;
		}
	}
	return false;
}
//,width='+964+',height='+600+',left='+0+', top='+0+',screenX='+0+',screenY='+0+'

function numbersonly(e, dec, myfield)
{
	var key;
	var keychar;
	
	if (window.event)
	   key = window.event.keyCode;
	else if (e)
	   key = e.which;
	else
	   return true;
	keychar = String.fromCharCode(key);
	
	// control keys
	if ((key==null) || (key==0) || (key==8) || (key==9) || (key==13) || (key==27) ) {
	   return true;
	
	// numbers
	} else if ((("0123456789").indexOf(keychar) > -1)) {
	   return true;
	
	// decimal point jump
	} else if (dec && (keychar == ".")) {
		if(myfield!=undefined) {
			return (myfield.value.indexOf(".",0) === -1);
		}
		return true;
	} else {
	   return false;
	}
}

function checkNumber(e, element, dec) {
	if(dec==undefined || dec==null) dec = false;
	var key;
	var keychar;
	var regexp;
	if (window.event) {
	   key = window.event.keyCode;
	} else if (e) {
	   key = e.which;
	} else {
	   return true;
	}
	keychar = String.fromCharCode(key);
	if ((key==null) || (key==0) || (key==8) || (key==9) || (key==13) || (key==27) ) {
	   return true;
	}
	if(dec) {
		regexp = new RegExp("^[0-9]+(\.[0-9]+)?$","ig");
	} else {
		regexp = new RegExp("^[0-9]+$","ig");
	}
	var text = $(element).val();
	if(regexp.test(text)) {
		return true;
	} else {
		alert("You have entered incorrect value to textbox. Please verify and retype again.");
		$(element).focus();
	}
}


/*
Array.prototype.remove = function (subject) {
	var r = new Array();
	for(var i = 0, n = this.length; i < n; i++)
	{
		if(!(this[i]==subject))
		{
			r[r.length] = this[i];
		}
	}
	return r;
}

Array.prototype.del = function (item) {
	this.sort(function (a, b) {return a == item;});
	var deleted = 0;
	while (this[this.length-1] == item) {
		this.pop();
		deleted++;
	}
	return deleted;
}
*/
Date.prototype.Add = function(strInterval, intIncrement)
{
   if(
   strInterval != "M"
   && strInterval != "D"
   && strInterval != "Y"
   && strInterval != "h"
   && strInterval != "m"
   && strInterval != "uM"
   && strInterval != "uD"
   && strInterval != "uY"
   && strInterval != "uh"
   && strInterval != "um"
   && strInterval != "us"
   )
   {
	  throw("DateAdd: Second parameter must be M, D, Y, h, m, uM, uD, uY, uh, um or us");
   }

   if(typeof(intIncrement) != "number")
   {
	  throw("DateAdd: Third parameter must be a number");
   }

   switch(strInterval)
   {
	  case "M":
	  this.setMonth(parseInt(this.getMonth()) + parseInt(intIncrement));
	  break;

	  case "D":
	  this.setDate(parseInt(this.getDate()) + parseInt(intIncrement));
	  break;

	  case "Y":
	  this.setYear(parseInt(this.getYear()) + parseInt(intIncrement));
	  break;

	  case "h":
	  this.setHours(parseInt(this.getHours()) + parseInt(intIncrement));
	  break;

	  case "m":
	  this.setMinutes(parseInt(this.getMinutes()) + parseInt(intIncrement));
	  break;

	  case "s":
	  this.setSeconds(parseInt(this.getSeconds()) + parseInt(intIncrement));
	  break;

	  case "uM":
	  this.setUTCMonth(parseInt(this.getUTCMonth()) + parseInt(intIncrement));
	  break;

	  case "uD":
	  this.setUTCDate(parseInt(this.getUTCDate()) + parseInt(intIncrement));
	  break;

	  case "uY":
	  this.setUTCFullYear(parseInt(this.getUTCFullYear()) + parseInt(intIncrement));
	  break;

	  case "uh":
	  this.setUTCHours(parseInt(this.getUTCHours()) + parseInt(intIncrement));
	  break;

	  case "um":
	  this.setUTCMinutes(parseInt(this.getUTCMinutes()) + parseInt(intIncrement));
	  break;

	  case "us":
	  this.setUTCSeconds(parseInt(this.getUTCSeconds()) + parseInt(intIncrement));
	  break;
   }
   return this;
}
str_pad = function(input, pad_length, pad_string, pad_type) {
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // + namespaced by: Michael White (http://getsprink.com)
    // +      input by: Marco van Oort
    // +   bugfixed by: Brett Zamir (http://brett-zamir.me)
    // *     example 1: str_pad('Kevin van Zonneveld', 30, '-=', 'STR_PAD_LEFT');
    // *     returns 1: '-=-=-=-=-=-Kevin van Zonneveld'
    // *     example 2: str_pad('Kevin van Zonneveld', 30, '-', 'STR_PAD_BOTH');
    // *     returns 2: '------Kevin van Zonneveld-----'

    var half = '', pad_to_go;

    var str_pad_repeater = function (s, len) {
        var collect = '', i;

        while (collect.length < len) {collect += s;}
        collect = collect.substr(0,len);

        return collect;
    };

    input += '';
    pad_string = pad_string !== undefined ? pad_string : ' ';
    
    if (pad_type != 'STR_PAD_LEFT' && pad_type != 'STR_PAD_RIGHT' && pad_type != 'STR_PAD_BOTH') { pad_type = 'STR_PAD_RIGHT'; }
    if ((pad_to_go = pad_length - input.length) > 0) {
        if (pad_type == 'STR_PAD_LEFT') { input = str_pad_repeater(pad_string, pad_to_go) + input; }
        else if (pad_type == 'STR_PAD_RIGHT') { input = input + str_pad_repeater(pad_string, pad_to_go); }
        else if (pad_type == 'STR_PAD_BOTH') {
            half = str_pad_repeater(pad_string, Math.ceil(pad_to_go/2));
            input = half + input + half;
            input = input.substr(0, pad_length);
        }
    }

    return input;
}

function zeroPad(num,count)
{
	var numZeropad = num + '';
	while(numZeropad.length < count) {
		numZeropad = "0" + numZeropad;
	}
	return numZeropad;
}

function utf8_encode ( argString ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: sowberry
    // +    tweaked by: Jack
    // +   bugfixed by: Onno Marsman
    // +   improved by: Yves Sucaet
    // +   bugfixed by: Onno Marsman
    // +   bugfixed by: Ulrich
    // *     example 1: utf8_encode('Kevin van Zonneveld');
    // *     returns 1: 'Kevin van Zonneveld'

    var string = (argString+''); // .replace(/\r\n/g, "\n").replace(/\r/g, "\n");

    var utftext = "";
    var start, end;
    var stringl = 0;

    start = end = 0;
    stringl = string.length;
    for (var n = 0; n < stringl; n++) {
        var c1 = string.charCodeAt(n);
        var enc = null;

        if (c1 < 128) {
            end++;
        } else if (c1 > 127 && c1 < 2048) {
            enc = String.fromCharCode((c1 >> 6) | 192) + String.fromCharCode((c1 & 63) | 128);
        } else {
            enc = String.fromCharCode((c1 >> 12) | 224) + String.fromCharCode(((c1 >> 6) & 63) | 128) + String.fromCharCode((c1 & 63) | 128);
        }
        if (enc !== null) {
            if (end > start) {
                utftext += string.substring(start, end);
            }
            utftext += enc;
            start = end = n+1;
        }
    }

    if (end > start) {
        utftext += string.substring(start, string.length);
    }

    return utftext;
}

function utf8_decode ( str_data ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
    // +      input by: Aman Gupta
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Norman "zEh" Fuchs
    // +   bugfixed by: hitwork
    // +   bugfixed by: Onno Marsman
    // +      input by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: utf8_decode('Kevin van Zonneveld');
    // *     returns 1: 'Kevin van Zonneveld'

    var tmp_arr = [], i = 0, ac = 0, c1 = 0, c2 = 0, c3 = 0;
    
    str_data += '';
    
    while ( i < str_data.length ) {
        c1 = str_data.charCodeAt(i);
        if (c1 < 128) {
            tmp_arr[ac++] = String.fromCharCode(c1);
            i++;
        } else if ((c1 > 191) && (c1 < 224)) {
            c2 = str_data.charCodeAt(i+1);
            tmp_arr[ac++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
            i += 2;
        } else {
            c2 = str_data.charCodeAt(i+1);
            c3 = str_data.charCodeAt(i+2);
            tmp_arr[ac++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
            i += 3;
        }
    }

    return tmp_arr.join('');
}

function serialize (mixed_value) {
    // http://kevin.vanzonneveld.net
    // +   original by: Arpad Ray (mailto:arpad@php.net)
    // +   improved by: Dino
    // +   bugfixed by: Andrej Pavlovic
    // +   bugfixed by: Garagoth
    // +      input by: DtTvB (http://dt.in.th/2008-09-16.string-length-in-bytes.html)
    // +   bugfixed by: Russell Walker (http://www.nbill.co.uk/)
    // +   bugfixed by: Jamie Beck (http://www.terabit.ca/)
    // +      input by: Martin (http://www.erlenwiese.de/)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // -    depends on: utf8_encode
    // %          note: We feel the main purpose of this function should be to ease the transport of data between php & js
    // %          note: Aiming for PHP-compatibility, we have to translate objects to arrays
    // *     example 1: serialize(['Kevin', 'van', 'Zonneveld']);
    // *     returns 1: 'a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}'
    // *     example 2: serialize({firstName: 'Kevin', midName: 'van', surName: 'Zonneveld'});
    // *     returns 2: 'a:3:{s:9:"firstName";s:5:"Kevin";s:7:"midName";s:3:"van";s:7:"surName";s:9:"Zonneveld";}'

    var _getType = function (inp) {
        var type = typeof inp, match;
        var key;
        if (type == 'object' && !inp) {
            return 'null';
        }
        if (type == "object") {
            if (!inp.constructor) {
                return 'object';
            }
            var cons = inp.constructor.toString();
            match = cons.match(/(\w+)\(/);
            if (match) {
                cons = match[1].toLowerCase();
            }
            var types = ["boolean", "number", "string", "array"];
            for (key in types) {
                if (cons == types[key]) {
                    type = types[key];
                    break;
                }
            }
        }
        return type;
    };
    var type = _getType(mixed_value);
    var val, ktype = '';
    
    switch (type) {
        case "function": 
            val = ""; 
            break;
        case "boolean":
            val = "b:" + (mixed_value ? "1" : "0");
            break;
        case "number":
            val = (Math.round(mixed_value) == mixed_value ? "i" : "d") + ":" + mixed_value;
            break;
        case "string":
            mixed_value = this.utf8_encode(mixed_value);
            val = "s:" + encodeURIComponent(mixed_value).replace(/%../g, 'x').length + ":\"" + mixed_value + "\"";
            break;
        case "array":
        case "object":
            val = "a";
            /*
            if (type == "object") {
                var objname = mixed_value.constructor.toString().match(/(\w+)\(\)/);
                if (objname == undefined) {
                    return;
                }
                objname[1] = this.serialize(objname[1]);
                val = "O" + objname[1].substring(1, objname[1].length - 1);
            }
            */
            var count = 0;
            var vals = "";
            var okey;
            var key;
            for (key in mixed_value) {
                ktype = _getType(mixed_value[key]);
                if (ktype == "function") { 
                    continue; 
                }
                
                okey = (key.match(/^[0-9]+$/) ? parseInt(key, 10) : key);
                vals += this.serialize(okey) +
                        this.serialize(mixed_value[key]);
                count++;
            }
            val += ":" + count + ":{" + vals + "}";
            break;
        case "undefined": // Fall-through
        default: // if the JS object has a property which contains a null value, the string cannot be unserialized by PHP
            val = "N";
            break;
    }
    if (type != "object" && type != "array") {
        val += ";";
    }
    return val;
}

function unserialize (data) {
    // http://kevin.vanzonneveld.net
    // +     original by: Arpad Ray (mailto:arpad@php.net)
    // +     improved by: Pedro Tainha (http://www.pedrotainha.com)
    // +     bugfixed by: dptr1988
    // +      revised by: d3x
    // +     improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +        input by: Brett Zamir (http://brett-zamir.me)
    // +     improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +     improved by: Chris
    // +     improved by: James
    // +        input by: Martin (http://www.erlenwiese.de/)
    // +     bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +     improved by: Le Torbi
    // +     input by: kilops
    // +     bugfixed by: Brett Zamir (http://brett-zamir.me)
    // -      depends on: utf8_decode
    // %            note: We feel the main purpose of this function should be to ease the transport of data between php & js
    // %            note: Aiming for PHP-compatibility, we have to translate objects to arrays
    // *       example 1: unserialize('a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}');
    // *       returns 1: ['Kevin', 'van', 'Zonneveld']
    // *       example 2: unserialize('a:3:{s:9:"firstName";s:5:"Kevin";s:7:"midName";s:3:"van";s:7:"surName";s:9:"Zonneveld";}');
    // *       returns 2: {firstName: 'Kevin', midName: 'van', surName: 'Zonneveld'}

    var that = this;
    var utf8Overhead = function(chr) {
        // http://phpjs.org/functions/unserialize:571#comment_95906
        var code = chr.charCodeAt(0);
        if (code < 0x0080) {
            return 0;
        }
        if (code < 0x0800) {
             return 1;
        }
        return 2;
    };


    var error = function (type, msg, filename, line){throw new that.window[type](msg, filename, line);};
    var read_until = function (data, offset, stopchr){
        var buf = [];
        var chr = data.slice(offset, offset + 1);
        var i = 2;
        while (chr != stopchr) {
            if ((i+offset) > data.length) {
                error('Error', 'Invalid');
            }
            buf.push(chr);
            chr = data.slice(offset + (i - 1),offset + i);
            i += 1;
        }
        return [buf.length, buf.join('')];
    };
    var read_chrs = function (data, offset, length){
        var buf;

        buf = [];
        for (var i = 0;i < length;i++){
            var chr = data.slice(offset + (i - 1),offset + i);
            buf.push(chr);
            length -= utf8Overhead(chr); 
        }
        return [buf.length, buf.join('')];
    };
    var _unserialize = function (data, offset){
        var readdata;
        var readData;
        var chrs = 0;
        var ccount;
        var stringlength;
        var keyandchrs;
        var keys;

        if (!offset) {offset = 0;}
        var dtype = (data.slice(offset, offset + 1)).toLowerCase();

        var dataoffset = offset + 2;
        var typeconvert = function(x) {return x;};

        switch (dtype){
            case 'i':
                typeconvert = function (x) {return parseInt(x, 10);};
                readData = read_until(data, dataoffset, ';');
                chrs = readData[0];
                readdata = readData[1];
                dataoffset += chrs + 1;
            break;
            case 'b':
                typeconvert = function (x) {return parseInt(x, 10) !== 0;};
                readData = read_until(data, dataoffset, ';');
                chrs = readData[0];
                readdata = readData[1];
                dataoffset += chrs + 1;
            break;
            case 'd':
                typeconvert = function (x) {return parseFloat(x);};
                readData = read_until(data, dataoffset, ';');
                chrs = readData[0];
                readdata = readData[1];
                dataoffset += chrs + 1;
            break;
            case 'n':
                readdata = null;
            break;
            case 's':
                ccount = read_until(data, dataoffset, ':');
                chrs = ccount[0];
                stringlength = ccount[1];
                dataoffset += chrs + 2;

                readData = read_chrs(data, dataoffset+1, parseInt(stringlength, 10));
                chrs = readData[0];
                readdata = readData[1];
                dataoffset += chrs + 2;
                if (chrs != parseInt(stringlength, 10) && chrs != readdata.length){
                    error('SyntaxError', 'String length mismatch');
                }

                // Length was calculated on an utf-8 encoded string
                // so wait with decoding
                readdata = that.utf8_decode(readdata);
            break;
            case 'a':
                readdata = {};

                keyandchrs = read_until(data, dataoffset, ':');
                chrs = keyandchrs[0];
                keys = keyandchrs[1];
                dataoffset += chrs + 2;

                for (var i = 0; i < parseInt(keys, 10); i++){
                    var kprops = _unserialize(data, dataoffset);
                    var kchrs = kprops[1];
                    var key = kprops[2];
                    dataoffset += kchrs;

                    var vprops = _unserialize(data, dataoffset);
                    var vchrs = vprops[1];
                    var value = vprops[2];
                    dataoffset += vchrs;

                    readdata[key] = value;
                }

                dataoffset += 1;
            break;
            default:
                error('SyntaxError', 'Unknown / Unhandled data type(s): ' + dtype);
            break;
        }
        return [dtype, dataoffset - offset, typeconvert(readdata)];
    };
    
    return _unserialize((data+''), 0)[2];
}
function implode (glue, pieces) {
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Waldo Malqui Silva
    // +   improved by: Itsacon (http://www.itsacon.net/)
    // +   bugfixed by: Brett Zamir (http://brett-zamir.me)
    // *     example 1: implode(' ', ['Kevin', 'van', 'Zonneveld']);
    // *     returns 1: 'Kevin van Zonneveld'
    // *     example 2: implode(' ', {first:'Kevin', last: 'van Zonneveld'});
    // *     returns 2: 'Kevin van Zonneveld'

    var i = '', retVal='', tGlue='';
    if (arguments.length === 1) {
        pieces = glue;
        glue = '';
    }
    if (typeof(pieces) === 'object') {
        if (pieces instanceof Array) {
            return pieces.join(glue);
        }
        else {
            for (i in pieces) {
                retVal += tGlue + pieces[i];
                tGlue = glue;
            }
            return retVal;
        }
    }
    else {
        return pieces;
    }
}
function explode (delimiter, string, limit) {
    // http://kevin.vanzonneveld.net
    // +     original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +     improved by: kenneth
    // +     improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +     improved by: d3x
    // +     bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: explode(' ', 'Kevin van Zonneveld');
    // *     returns 1: {0: 'Kevin', 1: 'van', 2: 'Zonneveld'}
    // *     example 2: explode('=', 'a=bc=d', 2);
    // *     returns 2: ['a', 'bc=d']
 
    var emptyArray = { 0: '' };
    
    // third argument is not required
    if ( arguments.length < 2 ||
        typeof arguments[0] == 'undefined' ||
        typeof arguments[1] == 'undefined' ) {
        return null;
    }
 
    if ( delimiter === '' ||
        delimiter === false ||
        delimiter === null ) {
        return false;
    }
 
    if ( typeof delimiter == 'function' ||
        typeof delimiter == 'object' ||
        typeof string == 'function' ||
        typeof string == 'object' ) {
        return emptyArray;
    }
 
    if ( delimiter === true ) {
        delimiter = '1';
    }
    
    if (!limit) {
        return string.toString().split(delimiter.toString());
    } else {
        // support for limit argument
        var splitted = string.toString().split(delimiter.toString());
        var partA = splitted.splice(0, limit - 1);
        var partB = splitted.join(delimiter.toString());
        partA.push(partB);
        return partA;
    }
}

function number_format(number, decimals, dec_point, thousands_sep) {
    // http://kevin.vanzonneveld.net
    // +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +     bugfix by: Michael White (http://getsprink.com)
    // +     bugfix by: Benjamin Lupton
    // +     bugfix by: Allan Jensen (http://www.winternet.no)
    // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +     bugfix by: Howard Yeend
    // +    revised by: Luke Smith (http://lucassmith.name)
    // +     bugfix by: Diogo Resende
    // +     bugfix by: Rival
    // +      input by: Kheang Hok Chin (http://www.distantia.ca/)
    // +   improved by: davook
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +      input by: Jay Klehr
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +      input by: Amir Habibi (http://www.residence-mixte.com/)
    // +     bugfix by: Brett Zamir (http://brett-zamir.me)
    // +   improved by: Theriault
    // +      input by: Amirouche
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: number_format(1234.56);
    // *     returns 1: '1,235'
    // *     example 2: number_format(1234.56, 2, ',', ' ');
    // *     returns 2: '1 234,56'
    // *     example 3: number_format(1234.5678, 2, '.', '');
    // *     returns 3: '1234.57'
    // *     example 4: number_format(67, 2, ',', '.');
    // *     returns 4: '67,00'
    // *     example 5: number_format(1000);
    // *     returns 5: '1,000'
    // *     example 6: number_format(67.311, 2);
    // *     returns 6: '67.31'
    // *     example 7: number_format(1000.55, 1);
    // *     returns 7: '1,000.6'
    // *     example 8: number_format(67000, 5, ',', '.');
    // *     returns 8: '67.000,00000'
    // *     example 9: number_format(0.9, 0);
    // *     returns 9: '1'
    // *    example 10: number_format('1.20', 2);
    // *    returns 10: '1.20'
    // *    example 11: number_format('1.20', 4);
    // *    returns 11: '1.2000'
    // *    example 12: number_format('1.2000', 3);
    // *    returns 12: '1.200'
    // *    example 13: number_format('1 000,50', 2, '.', ' ');
    // *    returns 13: '100 050.00'
    number = (number+'').replace(',', '').replace(' ', '');
    var n = !isFinite(+number) ? 0 : +number, 
        prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
        sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
        dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
        s = '',
        toFixedFix = function (n, prec) {
            var k = Math.pow(10, prec);
            return '' + Math.round(n * k) / k;
        };
    // Fix for IE parseFloat(0.55).toFixed(0) = 0;
    s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
    if (s[0].length > 3) {
        s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
    }
    if ((s[1] || '').length < prec) {
        s[1] = s[1] || '';
        s[1] += new Array(prec - s[1].length + 1).join('0');
    }
    return s.join(dec);
}

