function number_format(number, decimals, dec_point, thousands_sep) {    /*Formats a number with grouped thousands      //     // version: 1001.2911    // discuss at: http://phpjs.org/functions/number_format    // +   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    // *     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'    */    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);}
function md5 (str) {    // http://kevin.vanzonneveld.net    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)    // + namespaced by: Michael White (http://getsprink.com)    // +    tweaked by: Jack    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // +      input by: Brett Zamir (http://brett-zamir.me)    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // -    depends on: utf8_encode    // *     example 1: md5('Kevin van Zonneveld');    // *     returns 1: '6e658d4bfcb59cc13f96c14450ac40b9'    var xl;    var rotateLeft = function (lValue, iShiftBits) {        return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));    };    var addUnsigned = function (lX,lY) {        var lX4,lY4,lX8,lY8,lResult;        lX8 = (lX & 0x80000000);        lY8 = (lY & 0x80000000);        lX4 = (lX & 0x40000000);        lY4 = (lY & 0x40000000);        lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);        if (lX4 & lY4) {            return (lResult ^ 0x80000000 ^ lX8 ^ lY8);        }        if (lX4 | lY4) {            if (lResult & 0x40000000) {                return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);            } else {                return (lResult ^ 0x40000000 ^ lX8 ^ lY8);            }        } else {            return (lResult ^ lX8 ^ lY8);        }    };    var _F = function (x,y,z) { return (x & y) | ((~x) & z); };    var _G = function (x,y,z) { return (x & z) | (y & (~z)); };    var _H = function (x,y,z) { return (x ^ y ^ z); };    var _I = function (x,y,z) { return (y ^ (x | (~z))); };    var _FF = function (a,b,c,d,x,s,ac) {        a = addUnsigned(a, addUnsigned(addUnsigned(_F(b, c, d), x), ac));        return addUnsigned(rotateLeft(a, s), b);    };    var _GG = function (a,b,c,d,x,s,ac) {        a = addUnsigned(a, addUnsigned(addUnsigned(_G(b, c, d), x), ac));        return addUnsigned(rotateLeft(a, s), b);    };    var _HH = function (a,b,c,d,x,s,ac) {        a = addUnsigned(a, addUnsigned(addUnsigned(_H(b, c, d), x), ac));        return addUnsigned(rotateLeft(a, s), b);    };    var _II = function (a,b,c,d,x,s,ac) {        a = addUnsigned(a, addUnsigned(addUnsigned(_I(b, c, d), x), ac));        return addUnsigned(rotateLeft(a, s), b);    };    var convertToWordArray = function (str) {        var lWordCount;        var lMessageLength = str.length;        var lNumberOfWords_temp1=lMessageLength + 8;        var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;        var lNumberOfWords = (lNumberOfWords_temp2+1)*16;        var lWordArray=new Array(lNumberOfWords-1);        var lBytePosition = 0;        var lByteCount = 0;        while ( lByteCount < lMessageLength ) {            lWordCount = (lByteCount-(lByteCount % 4))/4;            lBytePosition = (lByteCount % 4)*8;            lWordArray[lWordCount] = (lWordArray[lWordCount] | (str.charCodeAt(lByteCount)<<lBytePosition));            lByteCount++;        }        lWordCount = (lByteCount-(lByteCount % 4))/4;        lBytePosition = (lByteCount % 4)*8;        lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);        lWordArray[lNumberOfWords-2] = lMessageLength<<3;        lWordArray[lNumberOfWords-1] = lMessageLength>>>29;        return lWordArray;    };    var wordToHex = function (lValue) {        var wordToHexValue="",wordToHexValue_temp="",lByte,lCount;        for (lCount = 0;lCount<=3;lCount++) {            lByte = (lValue>>>(lCount*8)) & 255;            wordToHexValue_temp = "0" + lByte.toString(16);            wordToHexValue = wordToHexValue + wordToHexValue_temp.substr(wordToHexValue_temp.length-2,2);        }        return wordToHexValue;    };    var x=[],        k,AA,BB,CC,DD,a,b,c,d,        S11=7, S12=12, S13=17, S14=22,        S21=5, S22=9 , S23=14, S24=20,        S31=4, S32=11, S33=16, S34=23,        S41=6, S42=10, S43=15, S44=21;    str = this.utf8_encode(str);    x = convertToWordArray(str);    a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;        xl = x.length;    for (k=0;k<xl;k+=16) {        AA=a; BB=b; CC=c; DD=d;        a=_FF(a,b,c,d,x[k+0], S11,0xD76AA478);        d=_FF(d,a,b,c,x[k+1], S12,0xE8C7B756);        c=_FF(c,d,a,b,x[k+2], S13,0x242070DB);        b=_FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);        a=_FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);        d=_FF(d,a,b,c,x[k+5], S12,0x4787C62A);        c=_FF(c,d,a,b,x[k+6], S13,0xA8304613);        b=_FF(b,c,d,a,x[k+7], S14,0xFD469501);        a=_FF(a,b,c,d,x[k+8], S11,0x698098D8);        d=_FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);        c=_FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);        b=_FF(b,c,d,a,x[k+11],S14,0x895CD7BE);        a=_FF(a,b,c,d,x[k+12],S11,0x6B901122);        d=_FF(d,a,b,c,x[k+13],S12,0xFD987193);        c=_FF(c,d,a,b,x[k+14],S13,0xA679438E);        b=_FF(b,c,d,a,x[k+15],S14,0x49B40821);        a=_GG(a,b,c,d,x[k+1], S21,0xF61E2562);        d=_GG(d,a,b,c,x[k+6], S22,0xC040B340);        c=_GG(c,d,a,b,x[k+11],S23,0x265E5A51);        b=_GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);        a=_GG(a,b,c,d,x[k+5], S21,0xD62F105D);        d=_GG(d,a,b,c,x[k+10],S22,0x2441453);        c=_GG(c,d,a,b,x[k+15],S23,0xD8A1E681);        b=_GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);        a=_GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);        d=_GG(d,a,b,c,x[k+14],S22,0xC33707D6);        c=_GG(c,d,a,b,x[k+3], S23,0xF4D50D87);        b=_GG(b,c,d,a,x[k+8], S24,0x455A14ED);        a=_GG(a,b,c,d,x[k+13],S21,0xA9E3E905);        d=_GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);        c=_GG(c,d,a,b,x[k+7], S23,0x676F02D9);        b=_GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);        a=_HH(a,b,c,d,x[k+5], S31,0xFFFA3942);        d=_HH(d,a,b,c,x[k+8], S32,0x8771F681);        c=_HH(c,d,a,b,x[k+11],S33,0x6D9D6122);        b=_HH(b,c,d,a,x[k+14],S34,0xFDE5380C);        a=_HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);        d=_HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);        c=_HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);        b=_HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);        a=_HH(a,b,c,d,x[k+13],S31,0x289B7EC6);        d=_HH(d,a,b,c,x[k+0], S32,0xEAA127FA);        c=_HH(c,d,a,b,x[k+3], S33,0xD4EF3085);        b=_HH(b,c,d,a,x[k+6], S34,0x4881D05);        a=_HH(a,b,c,d,x[k+9], S31,0xD9D4D039);        d=_HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);        c=_HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);        b=_HH(b,c,d,a,x[k+2], S34,0xC4AC5665);        a=_II(a,b,c,d,x[k+0], S41,0xF4292244);        d=_II(d,a,b,c,x[k+7], S42,0x432AFF97);        c=_II(c,d,a,b,x[k+14],S43,0xAB9423A7);        b=_II(b,c,d,a,x[k+5], S44,0xFC93A039);        a=_II(a,b,c,d,x[k+12],S41,0x655B59C3);        d=_II(d,a,b,c,x[k+3], S42,0x8F0CCC92);        c=_II(c,d,a,b,x[k+10],S43,0xFFEFF47D);        b=_II(b,c,d,a,x[k+1], S44,0x85845DD1);        a=_II(a,b,c,d,x[k+8], S41,0x6FA87E4F);        d=_II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);        c=_II(c,d,a,b,x[k+6], S43,0xA3014314);        b=_II(b,c,d,a,x[k+13],S44,0x4E0811A1);        a=_II(a,b,c,d,x[k+4], S41,0xF7537E82);        d=_II(d,a,b,c,x[k+11],S42,0xBD3AF235);        c=_II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);        b=_II(b,c,d,a,x[k+9], S44,0xEB86D391);        a=addUnsigned(a,AA);        b=addUnsigned(b,BB);        c=addUnsigned(c,CC);        d=addUnsigned(d,DD);    }    var temp = wordToHex(a)+wordToHex(b)+wordToHex(c)+wordToHex(d);    return temp.toLowerCase();}function makeArray(IntarrSize) {	for (var n = 0; n < IntarrSize; n++)		this[n] = "";	return this;}this.makeArray = makeArray;function customSplit(strvalue, separator, arrayName) {	  var n = 0;	  if (separator.length != 0) {	    while (strvalue.indexOf(separator) != -1) {	      eval("arr"+n+" = strvalue.substring(0, strvalue.indexOf(separator));");	      strvalue = strvalue.substring(strvalue.indexOf(separator)+separator.length,	          strvalue.length+1);	      n++;	    }	    eval("arr" + n + " = strvalue;");	    arraySize = n+1;	  }	  else {	    for (var x = 0; x < strvalue.length; x++) {	      eval("arr"+n+" = \"" + strvalue.substring(x, x+1) + "\";");	      n++;	    }	    arraySize = n;	  }	  eval(arrayName + " = new this.makeArray(arraySize);");	  for (var i = 0; i < arraySize; i++)	    eval(arrayName + "[" + i + "] = arr" + i + ";");	  return arraySize;}this.customSplit = customSplit;function isEmail(argvalue) {	if (argvalue.indexOf(" ") != -1)		return false;	else if (argvalue.indexOf("@") == -1)		return false;	else if (argvalue.indexOf("@") == 0)		return false;	else if (argvalue.indexOf("@") == (argvalue.length-1))		return false;	//arrayString = argvalue.split("@"); (works only in netscape3 and above.)	var retSize = customSplit(argvalue, "@", "arrayString");	if (arrayString[1].indexOf(".") == -1)		return false;	else if (arrayString[1].indexOf(".") == 0)		return false;	else if (arrayString[1].charAt(arrayString[1].length-1) == ".") {		return false;	}	return true;}function isURL(argvalue) {	if (argvalue.indexOf(" ") != -1)		return false;	else if (argvalue.indexOf("http://") == -1)		return false;	else if (argvalue == "http://")		return false;	else if (argvalue.indexOf("http://") > 0)		return false;	argvalue = argvalue.substring(7, argvalue.length);	if (argvalue.indexOf(".") == -1)		return false;	else if (argvalue.indexOf(".") == 0)		return false;	else if (argvalue.charAt(argvalue.length - 1) == ".")		return false;	if (argvalue.indexOf("/") != -1) 	{		argvalue = argvalue.substring(0, argvalue.indexOf("/"));		if (argvalue.charAt(argvalue.length - 1) == ".")			return false;	}	if (argvalue.indexOf(":") != -1) 	{		if (argvalue.indexOf(":") == (argvalue.length - 1))			return false;		else if (argvalue.charAt(argvalue.indexOf(":") + 1) == ".")			return false;		argvalue = argvalue.substring(0, argvalue.indexOf(":"));		if (argvalue.charAt(argvalue.length - 1) == ".")			return false;	}	return true;}this.isURL = isURL;function nl2br (str, is_xhtml) {    // http://kevin.vanzonneveld.net    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // +   improved by: Philip Peterson    // +   improved by: Onno Marsman    // +   improved by: Atli Þór    // +   bugfixed by: Onno Marsman    // +      input by: Brett Zamir (http://brett-zamir.me)    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // +   improved by: Brett Zamir (http://brett-zamir.me)    // +   improved by: Maximusya    // *     example 1: nl2br('Kevin\nvan\nZonneveld');    // *     returns 1: 'Kevin<br />\nvan<br />\nZonneveld'    // *     example 2: nl2br("\nOne\nTwo\n\nThree\n", false);    // *     returns 2: '<br>\nOne<br>\nTwo<br>\n<br>\nThree<br>\n'    // *     example 3: nl2br("\nOne\nTwo\n\nThree\n", true);    // *     returns 3: '<br />\nOne<br />\nTwo<br />\n<br />\nThree<br />\n'    var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '<br />' : '<br>';    return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1'+ breakTag +'$2');}
function ltrim ( str, charlist ) {    // http://kevin.vanzonneveld.net    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // +      input by: Erkekjetter    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // +   bugfixed by: Onno Marsman    // *     example 1: ltrim('    Kevin van Zonneveld    ');    // *     returns 1: 'Kevin van Zonneveld    '     charlist = !charlist ? ' \\s\u00A0' : (charlist+'').replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '$1');    var re = new RegExp('^[' + charlist + ']+', 'g');    return (str+'').replace(re, '');}function trim (str, charlist) {    // Strips whitespace from the beginning and end of a string      //     // version: 909.322    // discuss at: http://phpjs.org/functions/trim    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // +   improved by: mdsjack (http://www.mdsjack.bo.it)    // +   improved by: Alexander Ermolaev (http://snippets.dzone.com/user/AlexanderErmolaev)    // +      input by: Erkekjetter    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // +      input by: DxGx    // +   improved by: Steven Levithan (http://blog.stevenlevithan.com)    // +    tweaked by: Jack    // +   bugfixed by: Onno Marsman    // *     example 1: trim('    Kevin van Zonneveld    ');    // *     returns 1: 'Kevin van Zonneveld'    // *     example 2: trim('Hello World', 'Hdle');    // *     returns 2: 'o Wor'    // *     example 3: trim(16, 1);    // *     returns 3: 6    var whitespace, l = 0, i = 0;    str += '';        if (!charlist)     {        //default list            	whitespace = " \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000";    }     else     {        // preg_quote custom list        charlist += '';        whitespace = charlist.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '$1');        }        l = str.length;    for (i = 0; i < l; i++) {        if (whitespace.indexOf(str.charAt(i)) === -1)         {          	str = str.substring(i);            break;        }    }    l = str.length;    for (i = l - 1; i >= 0; i--)     {        if (whitespace.indexOf(str.charAt(i)) === -1)         {            str = str.substring(0, i + 1);            break;                }    }        return whitespace.indexOf(str.charAt(0)) === -1 ? str : '';}
function in_array(needle, haystack, argStrict) {    // http://kevin.vanzonneveld.net    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // +   improved by: vlado houba    // *     example 1: in_array('van', ['Kevin', 'van', 'Zonneveld']);    // *     returns 1: true    // *     example 2: in_array('vlado', {0: 'Kevin', vlado: 'van', 1: 'Zonneveld'});    // *     returns 2: false    // *     example 3: in_array(1, ['1', '2', '3']);    // *     returns 3: true    // *     example 3: in_array(1, ['1', '2', '3'], false);    // *     returns 3: true    // *     example 4: in_array(1, ['1', '2', '3'], true);    // *     returns 4: false     var key = '', strict = !!argStrict;     if (strict) {        for (key in haystack) {            if (haystack[key] === needle) {                return true;            }        }    } else {        for (key in haystack) {            if (haystack[key] == needle) {                return true;            }        }    }     return false;}

function htmlspecialchars (string, quote_style) {    // http://kevin.vanzonneveld.net    // +   original by: Mirek Slugen    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // +   bugfixed by: Nathan    // +   bugfixed by: Arno    // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // -    depends on: get_html_translation_table    // *     example 1: htmlspecialchars("<a href='test'>Test</a>", 'ENT_QUOTES');    // *     returns 1: '&lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;'     var histogram = {}, symbol = '', tmp_str = '', entity = '';    tmp_str = string.toString();        if (false === (histogram = get_html_translation_table('HTML_SPECIALCHARS', quote_style))) {        return false;    }        for (symbol in histogram) {        entity = histogram[symbol];        tmp_str = tmp_str.split(symbol).join(entity);    }        return tmp_str;}
function count( mixed_var, mode ) {    // http://kevin.vanzonneveld.net    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // +      input by: Waldo Malqui Silva    // *     example 1: count([[0,0],[0,-4]], 'COUNT_RECURSIVE');    // *     returns 1: 6    // *     example 2: count({'one' : [1,2,3,4,5]}, 'COUNT_RECURSIVE');    // *     returns 2: 6     var key, cnt = 0;     if( mode == 'COUNT_RECURSIVE' ) mode = 1;    if( mode != 1 ) mode = 0;     for (key in mixed_var){        cnt++;        if( mode==1 && mixed_var[key] && (mixed_var[key].constructor === Array || mixed_var[key].constructor === Object) ){            cnt += count(mixed_var[key], 1);        }    }     return cnt;}
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://brettz9.blogspot.com)    // +   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 base64_encode( data ) {    // http://kevin.vanzonneveld.net    // +   original by: Tyler Akins (http://rumkin.com)    // +   improved by: Bayron Guevara    // +   improved by: Thunder.m    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // +   bugfixed by: Pellentesque Malesuada    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // -    depends on: utf8_encode    // *     example 1: base64_encode('Kevin van Zonneveld');    // *     returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='     // mozilla has this native    // - but breaks in 2.0.0.12!    //if (typeof window['atob'] == 'function') {    //    return atob(data);    //}            var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";    var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, enc="", tmp_arr = [];     if (!data) {        return data;    }     data = utf8_encode(data+'');        do { // pack three octets into four hexets        o1 = data.charCodeAt(i++);        o2 = data.charCodeAt(i++);        o3 = data.charCodeAt(i++);         bits = o1<<16 | o2<<8 | o3;         h1 = bits>>18 & 0x3f;        h2 = bits>>12 & 0x3f;        h3 = bits>>6 & 0x3f;        h4 = bits & 0x3f;         // use hexets to index into b64, and append result to encoded string        tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);    } while (i < data.length);        enc = tmp_arr.join('');        switch( data.length % 3 ){        case 1:            enc = enc.slice(0, -2) + '==';        break;        case 2:            enc = enc.slice(0, -1) + '=';        break;    }     return enc;}

function base64_decode( data ) {    // http://kevin.vanzonneveld.net    // +   original by: Tyler Akins (http://rumkin.com)    // +   improved by: Thunder.m    // +      input by: Aman Gupta    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // +   bugfixed by: Onno Marsman    // +   bugfixed by: Pellentesque Malesuada    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // +      input by: Brett Zamir (http://brettz9.blogspot.com)    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // -    depends on: utf8_decode    // *     example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA==');    // *     returns 1: 'Kevin van Zonneveld'     // mozilla has this native    // - but breaks in 2.0.0.12!    //if (typeof window['btoa'] == 'function') {    //    return btoa(data);    //}     var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";    var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, dec = "", tmp_arr = [];     if (!data) {        return data;    }     data += '';     do {  // unpack four hexets into three octets using index points in b64        h1 = b64.indexOf(data.charAt(i++));        h2 = b64.indexOf(data.charAt(i++));        h3 = b64.indexOf(data.charAt(i++));        h4 = b64.indexOf(data.charAt(i++));         bits = h1<<18 | h2<<12 | h3<<6 | h4;         o1 = bits>>16 & 0xff;        o2 = bits>>8 & 0xff;        o3 = bits & 0xff;         if (h3 == 64) {           tmp_arr[ac++] = String.fromCharCode(o1);        } else if (h4 == 64) {            tmp_arr[ac++] = String.fromCharCode(o1, o2);        } else {            tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);        }    } while (i < data.length);     dec = tmp_arr.join('');        //alert('dec\n\ndl = ' + dec.length  + "\n\n" + dec);     //dec = utf8_decode(dec);    //alert('dec po utf-8 decode\n\ndl = ' + dec.length  + "\n\n" + dec);    return dec;}

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 implode (glue, pieces) {    // Joins array elements placing glue string between items and return one string      //     // version: 911.718    // discuss at: http://phpjs.org/functions/implode    // +   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 print_r(arr,level) {	var dumped_text = "";	if(!level) level = 0;		//The padding given at the beginning of the line.	var level_padding = "";	for(var j=0;j<level+1;j++) level_padding += "    ";		if(typeof(arr) == 'object') { //Array/Hashes/Objects 		for(var item in arr) {			var value = arr[item];						if(typeof(value) == 'object') { //If it is an array,				dumped_text += level_padding + "'" + item + "' ...\n";				dumped_text += print_r(value,level+1);			} else {				dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";			}		}	} else { //Stings/Chars/Numbers etc.		dumped_text = "===>"+arr+"<===("+typeof(arr)+")";	}	return dumped_text;}/*Array.prototype.unique =	  function() {	    var a = [];	    var l = this.length;	    for(var i=0; i<l; i++) {	      for(var j=i+1; j<l; j++) {	        // If this[i] is found later in the array	        if (this[i] === this[j])	          j = ++i;	      }	      a.push(this[i]);	    }	    return a;	  };	  */

function str_replace(search, replace, subject) {    // http://kevin.vanzonneveld.net    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // +   improved by: Gabriel Paderni    // +   improved by: Philip Peterson    // +   improved by: Simon Willison (http://simonwillison.net)    // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)    // +   bugfixed by: Anton Ongson    // +      input by: Onno Marsman    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // +    tweaked by: Onno Marsman    // +      input by: Brett Zamir (http://brettz9.blogspot.com)    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // *     example 1: str_replace(' ', '.', 'Kevin van Zonneveld');    // *     returns 1: 'Kevin.van.Zonneveld'    // *     example 2: str_replace(['{name}', 'l'], ['hello', 'm'], '{name}, lars');    // *     returns 2: 'hemmo, mars'     var s = subject;    var ra = r instanceof Array, sa = s instanceof Array;    var f = [].concat(search);    var r = [].concat(replace);    var i = (s = [].concat(s)).length;    var j = 0;        while (j = 0, i--) {        if (s[i]) {            while (s[i] = (s[i]+'').split(f[j]).join(ra ? r[j] || "" : r[0]), ++j in f){};        }    }     return sa ? s : s[0];}function addslashes( str ) {    // http://kevin.vanzonneveld.net    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // +   improved by: Ates Goral (http://magnetiq.com)    // +   improved by: marrtins    // +   improved by: Nate    // +   improved by: Onno Marsman    // *     example 1: addslashes("kevin's birthday");    // *     returns 1: 'kevin\'s birthday'     return (str+'').replace(/([\\"'])/g, "\\$1").replace(/\0/g, "\\0");}

function get_html_translation_table(table, quote_style) {    // http://kevin.vanzonneveld.net    // +   original by: Philip Peterson    // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // +   bugfixed by: noname    // +   bugfixed by: Alex    // +   bugfixed by: Marco    // +   bugfixed by: madipta    // %          note: It has been decided that we're not going to add global    // %          note: dependencies to php.js. Meaning the constants are not    // %          note: real constants, but strings instead. integers are also supported if someone    // %          note: chooses to create the constants themselves.    // %          note: Table from http://www.the-art-of-web.com/html/character-codes/    // *     example 1: get_html_translation_table('HTML_SPECIALCHARS');    // *     returns 1: {'"': '&quot;', '&': '&amp;', '<': '&lt;', '>': '&gt;'}        var entities = {}, histogram = {}, decimal = 0, symbol = '';    var constMappingTable = {}, constMappingQuoteStyle = {};    var useTable = {}, useQuoteStyle = {};        useTable      = (table ? table.toUpperCase() : 'HTML_SPECIALCHARS');    useQuoteStyle = (quote_style ? quote_style.toUpperCase() : 'ENT_COMPAT');        // Translate arguments    constMappingTable[0]      = 'HTML_SPECIALCHARS';    constMappingTable[1]      = 'HTML_ENTITIES';    constMappingQuoteStyle[0] = 'ENT_NOQUOTES';    constMappingQuoteStyle[2] = 'ENT_COMPAT';    constMappingQuoteStyle[3] = 'ENT_QUOTES';        // Map numbers to strings for compatibilty with PHP constants    if (!isNaN(useTable)) {        useTable = constMappingTable[useTable];    }    if (!isNaN(useQuoteStyle)) {        useQuoteStyle = constMappingQuoteStyle[useQuoteStyle];    }     if (useTable == 'HTML_SPECIALCHARS') {        // ascii decimals for better compatibility        entities['38'] = '&amp;';        if (useQuoteStyle != 'ENT_NOQUOTES') {            entities['34'] = '&quot;';        }        if (useQuoteStyle == 'ENT_QUOTES') {            entities['39'] = '&#039;';        }        entities['60'] = '&lt;';        entities['62'] = '&gt;';    } else if (useTable == 'HTML_ENTITIES') {        // ascii decimals for better compatibility      entities['38']  = '&amp;';        if (useQuoteStyle != 'ENT_NOQUOTES') {            entities['34'] = '&quot;';        }        if (useQuoteStyle == 'ENT_QUOTES') {            entities['39'] = '&#039;';        }
      entities['60']  = '&lt;';      entities['62']  = '&gt;';      entities['160'] = '&nbsp;';      entities['161'] = '&iexcl;';      entities['162'] = '&cent;';      entities['163'] = '&pound;';      entities['164'] = '&curren;';      entities['165'] = '&yen;';      entities['166'] = '&brvbar;';      entities['167'] = '&sect;';      entities['168'] = '&uml;';      entities['169'] = '&copy;';      entities['170'] = '&ordf;';      entities['171'] = '&laquo;';      entities['172'] = '&not;';      entities['173'] = '&shy;';      entities['174'] = '&reg;';      entities['175'] = '&macr;';      entities['176'] = '&deg;';      entities['177'] = '&plusmn;';      entities['178'] = '&sup2;';      entities['179'] = '&sup3;';      entities['180'] = '&acute;';      entities['181'] = '&micro;';      entities['182'] = '&para;';      entities['183'] = '&middot;';      entities['184'] = '&cedil;';      entities['185'] = '&sup1;';      entities['186'] = '&ordm;';      entities['187'] = '&raquo;';      entities['188'] = '&frac14;';      entities['189'] = '&frac12;';      entities['190'] = '&frac34;';      entities['191'] = '&iquest;';      entities['192'] = '&Agrave;';      entities['193'] = '&Aacute;';      entities['194'] = '&Acirc;';      entities['195'] = '&Atilde;';      entities['196'] = '&Auml;';      entities['197'] = '&Aring;';      entities['198'] = '&AElig;';      entities['199'] = '&Ccedil;';      entities['200'] = '&Egrave;';      entities['201'] = '&Eacute;';      entities['202'] = '&Ecirc;';      entities['203'] = '&Euml;';      entities['204'] = '&Igrave;';      entities['205'] = '&Iacute;';      entities['206'] = '&Icirc;';      entities['207'] = '&Iuml;';      entities['208'] = '&ETH;';      entities['209'] = '&Ntilde;';      entities['210'] = '&Ograve;';      entities['211'] = '&Oacute;';      entities['212'] = '&Ocirc;';      entities['213'] = '&Otilde;';      entities['214'] = '&Ouml;';      entities['215'] = '&times;';      entities['216'] = '&Oslash;';      entities['217'] = '&Ugrave;';      entities['218'] = '&Uacute;';      entities['219'] = '&Ucirc;';      entities['220'] = '&Uuml;';      entities['221'] = '&Yacute;';      entities['222'] = '&THORN;';      entities['223'] = '&szlig;';      entities['224'] = '&agrave;';      entities['225'] = '&aacute;';      entities['226'] = '&acirc;';      entities['227'] = '&atilde;';      entities['228'] = '&auml;';      entities['229'] = '&aring;';      entities['230'] = '&aelig;';      entities['231'] = '&ccedil;';      entities['232'] = '&egrave;';      entities['233'] = '&eacute;';      entities['234'] = '&ecirc;';      entities['235'] = '&euml;';      entities['236'] = '&igrave;';      entities['237'] = '&iacute;';      entities['238'] = '&icirc;';      entities['239'] = '&iuml;';      entities['240'] = '&eth;';      entities['241'] = '&ntilde;';      entities['242'] = '&ograve;';      entities['243'] = '&oacute;';      entities['244'] = '&ocirc;';      entities['245'] = '&otilde;';      entities['246'] = '&ouml;';      entities['247'] = '&divide;';      entities['248'] = '&oslash;';      entities['249'] = '&ugrave;';      entities['250'] = '&uacute;';      entities['251'] = '&ucirc;';      entities['252'] = '&uuml;';      entities['253'] = '&yacute;';      entities['254'] = '&thorn;';      entities['255'] = '&yuml;';    } else {        throw Error("Table: "+useTable+' not supported');        return false;    }        // ascii decimals to real symbols    for (decimal in entities) {        symbol = String.fromCharCode(decimal);        histogram[symbol] = entities[decimal];    }        return histogram;}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    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // %            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 error = function (type, msg, filename, line){throw new 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);        }        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 = new Function('x', 'return x');                switch(dtype){            case "i":                typeconvert = new Function('x', 'return parseInt(x)');                readData = read_until(data, dataoffset, ';');                chrs = readData[0];                readdata = readData[1];                dataoffset += chrs + 1;            break;            case "b":                typeconvert = new Function('x', 'return (parseInt(x) == 1)');                readData = read_until(data, dataoffset, ';');                chrs = readData[0];                readdata = readData[1];                dataoffset += chrs + 1;            break;            case "d":                typeconvert = new 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));                chrs = readData[0];                readdata = readData[1];                dataoffset += chrs + 2;                if(chrs != parseInt(stringlength) && chrs != readdata.length){                    error('SyntaxError', 'String length mismatch');                }            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);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 stripslashes( str ) {    // http://kevin.vanzonneveld.net    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // +   improved by: Ates Goral (http://magnetiq.com)    // +      fixed by: Mick@el    // +   improved by: marrtins    // +   bugfixed by: Onno Marsman    // +   improved by: rezna    // *     example 1: stripslashes('Kevin\'s code');    // *     returns 1: "Kevin's code"    // *     example 2: stripslashes('Kevin\\\'s code');    // *     returns 2: "Kevin\'s code"
    return (str+'').replace(/\0/g, '0').replace(/\\([\\'"])/g, '$1');}

function htmlspecialchars_decode(string, quote_style) {    // http://kevin.vanzonneveld.net	// +   original by: Mirek Slugen    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // +   bugfixed by: Mateusz "loonquawl" Zalega    // +      input by: ReverseSyntax    // +      input by: Slawomir Kaniecki    // +      input by: Scott Cariss    // +      input by: Francois    // +   bugfixed by: Onno Marsman    // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)    // -    depends on: get_html_translation_table    // *     example 1: htmlspecialchars_decode("<p>this -&gt; &quot;</p>", 'ENT_NOQUOTES');    // *     returns 1: '<p>this -> &quot;</p>'     var histogram = {}, symbol = '', tmp_str = '', entity = '';    tmp_str = string.toString();        if (false === (histogram = get_html_translation_table('HTML_SPECIALCHARS', quote_style))) {        return false;    }     // &amp; must be the last character when decoding!    delete(histogram['&']);    histogram['&'] = '&amp;';     for (symbol in histogram) {        entity = histogram[symbol];        tmp_str = tmp_str.split(entity).join(symbol);    }        return tmp_str;}
