/** * Object PHP_Serializer * JavaScript to PHP serialize / unserialize class. * This class is designed to convert php variables to javascript * and javascript variables to php with a php serialize unserialize * compatible way. * * PARSABLE JAVASCRIPT < === > PHP VARIABLES: * [ JAVASCRIPT TYPE ] [ PHP TYPE ] * Array < === > array * Object < === > class (*) * String < === > string * Boolean < === > boolean * null < === > null * Number < === > int or double * Date < === > class * Error < === > class * Function < === > class (*) * * (*) NOTE: * Any PHP serialized class requires the native PHP class to be used, then it's not a * PHP => JavaScript converter, it's just a usefull serilizer class for each * compatible JS and PHP variable types. * However is possible to change public parameters. * Lambda, Resources or other dedicated PHP variables are not usefull for JavaScript. * (i.e. * $v = create_function('', 'return 1;'); serialize($v); * $conn = mydb_connect(); serialize($conn); * ) * There are same restrictions for javascript functions too then these will not be sent * (but will be filtered / ignored automatically). * * NEW ON V 1.6a and greater: * You can use experimental version of utf8 compatible serialized / unserialized strings * with true while you declare your php_serializer var: * var php = new PHP_Serializer(true); // enable experimental multybyte convertion * _____________________________________________ * * EXAMPLE: * var php = new PHP_Serializer(); * alert(php.unserialize(php.serialize(somevar))); * // should alert the original value of somevar * --------------------------------------------- * @author Andrea Giammarchi * @site www.devpro.it * @date 2005/11/26 * @lastmod 2006/04/29 14:30 * ["faster and safer" utf-8 serialize/unserialize version] * * @oldfixes * [fixed function error if constructor of a var is not native, function converted to object, * thanks to Kroc Camen for its debug] * [now array index with 0N char or -0N as first value will not be converted into integer, * note that "-0" index will be converted into 0 automatically by javascript with FireFox] * thanks to Cecile Maigrot for its debug] * @credits Special thanks to Fabio Sutto for some ideas and some debug * Special thanks to kentaromiura for a faster loop idea while unserialize * @version 1.8, tested on FireFox 1.5, IE 6 SP2 and Opera 8 */ function PHP_Serializer() { this.__cut = (String(Object).indexOf('(')!=16)?9:10; if(arguments.length == 1 && arguments[0] == true) { this.__m = Math; PHP_Serializer.prototype.encode = PHP_Serializer__Encoded_length; PHP_Serializer.prototype[String] = PHP_Serializer.prototype.__string = PHP_Serializer__String__2; PHP_Serializer.prototype.s = PHP_UnSerializer__String_2; } else { PHP_Serializer.prototype[String] = PHP_Serializer.prototype.__string = PHP_Serializer__String__1; PHP_Serializer.prototype.s = PHP_UnSerializer__String_1; }; }; function PHP_Serializer__String__1(__s) { return ('s:'+__s.length+':"'+__s+'";'); }; function PHP_UnSerializer__String_1() { var sls, sli; this.__c += 2; sls = this.__s.substr(this.__c,(this.__s.indexOf(':',this.__c)-this.__c)); sli = parseInt(sls); sls = this.__c + sls.length + 2; this.__c = sls + sli + 2; return this.__s.substr(sls,sli); }; function PHP_Serializer__Encoded_length(__s) { var a, b = 0, len = __s.length; while(len) { a = __s.charCodeAt(--len); b += (a<128)?1:((a<2048)?2:((a<65536)?3:4)); }; return b; }; function PHP_Serializer__String__2(__s) { __s = __s.replace(/\r\n/g, '\n'); return ('s:'+this.encode(__s)+':"'+__s+'";'); }; function PHP_UnSerializer__String_2() { var c, sls, sli, pos = 0; this.__c += 2; sls = this.__s.substr(this.__c,(this.__s.indexOf(':',this.__c)-this.__c)); sli = parseInt(sls); sls = this.__c + sls.length + 2; while(sli) { pos = this.__s.indexOf('";', (sls + (++pos))) - sls; if(sli === this.encode(this.__s.substr(sls,pos))) sli = 0; }; this.__c = sls + pos + 2; return this.__s.substr(sls,pos); }; function PHP_Serializer__Boolean(__s) { return ('b:'+(__s==false?'0':'1')+';'); }; function PHP_UnSerializer__Boolean() { var tmp = (this.__s.substr((this.__c+2),1)=='1'?true:false); this.__c += 4; return tmp; }; function PHP_Serializer__Number(__s) { __s = String(__s); return ((__s.indexOf('.')<0)?'i:'+__s+';':'d:'+__s+';'); }; function PHP_UnSerializer__Number() { var sli = this.__s.indexOf(';',(this.__c+1))-2, tmp = Number(this.__s.substr((this.__c+2),(sli-this.__c))); this.__c = sli + 3; return tmp; }; function PHP_Serializer__Function() { return ''; }; function PHP_Serializer__Undefined() { return 'N;'; }; function PHP_UnSerializer__Undefined() { this.__c += 2; return null; }; function PHP_Serializer__Common_ArrayObject(__s) { var b, c, n, a = 0, ser = new Array(); for(b in __s) { n = (__s[b] == null); if(n || __s[b].constructor != Function) { c = !isNaN(b) ? String(b) : false; if(c !== false) c = c.length === 1 || (c.substr(0,1)!=='0' && c.substr(0,2)!=="-0"); ser[a++]=((c !== false)?this.__number(b):this.__string(b))+ (n?this.__undefined():this[__s[b].constructor]?this[__s[b].constructor](__s[b]):this[Object](__s[b])); }; }; return [a,ser.join('')]; }; function PHP_UnSerializer__Common_ArrayObject(tmp) { var a, k; this.__c += 2; a = this.__s.indexOf(':',this.__c); k = parseInt(this.__s.substr(this.__c,(a-this.__c))) + 1; this.__c = a + 2; while(--k) tmp[this[this.__s.substr(this.__c,1)]()] = this[this.__s.substr(this.__c,1)](); return tmp; }; function PHP_Serializer__Object(__s) { var o = String(__s.constructor), oname = o.substr(this.__cut,o.indexOf('(')-this.__cut), ser = this.__common_array_object(__s); return ('O:'+oname.length+':"'+oname+'":'+ser[0]+':{'+ser[1]+'}'); }; function PHP_UnSerializer__Object() { var tmp = 's'+this.__s.substr(++this.__c,(this.__s.indexOf(':',(this.__c+3))-this.__c))+';', a = tmp.substr(2,(tmp.indexOf(':',2)-2)), o = tmp.substr((a.length+4),parseInt(a)); if(eval("typeof("+o+") == 'undefined'")) eval('function '+o+'(){}'); this.__c += (tmp.length-3); eval('tmp = this.__common(new '+o+'());'); ++this.__c; return tmp; }; function PHP_Serializer__Array(__s) { var ser = this.__common_array_object(__s); return ('a:'+ser[0]+':{'+ser[1]+'}'); }; function PHP_UnSerializer__Array() { var tmp = this.__common(new Array()); ++this.__c; return tmp; }; function PHP_Serializer__serialize(what) { var ser; if(what==null) ser = this.__undefined(); else if(!this[what.constructor]) ser = this[Object](what); else ser = this[what.constructor](what); return ser; }; function PHP_UnSerializer__unserialize(what) { this.__c = 0; this.__s = what; delete what; return this[this.__s.substr(this.__c,1)](); }; PHP_Serializer.prototype[Boolean] = PHP_Serializer__Boolean; PHP_Serializer.prototype[Number] = PHP_Serializer.prototype.__number = PHP_Serializer__Number; PHP_Serializer.prototype[Function] = PHP_Serializer__Function; PHP_Serializer.prototype[Date] = PHP_Serializer.prototype[Error] = PHP_Serializer.prototype[Object] = PHP_Serializer__Object; PHP_Serializer.prototype[Array] = PHP_Serializer__Array; PHP_Serializer.prototype.__common_array_object = PHP_Serializer__Common_ArrayObject; PHP_Serializer.prototype.__undefined = PHP_Serializer__Undefined; PHP_Serializer.prototype.serialize = PHP_Serializer__serialize; PHP_Serializer.prototype.b = PHP_UnSerializer__Boolean; PHP_Serializer.prototype.i = PHP_Serializer.prototype.d = PHP_UnSerializer__Number; PHP_Serializer.prototype.N = PHP_UnSerializer__Undefined; PHP_Serializer.prototype.__common = PHP_UnSerializer__Common_ArrayObject; PHP_Serializer.prototype.O = PHP_UnSerializer__Object; PHP_Serializer.prototype.a = PHP_UnSerializer__Array; PHP_Serializer.prototype.unserialize = PHP_UnSerializer__unserialize;