/** * 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 PHP TO JAVASCRIPT VARIABLES: * [ PHP TYPE ] [ JAVASCRIPT TYPE ] * array Array * class Object (*) * string String * boolean Boolean * undefined or null null * integer / double Number * * PARSABLE JAVASCRIPT TO 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 anything (*) * __class anything (*) * * (*) 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). * _____________________________________________ * * 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 2005/12/07 14:30 [fixed deer Park serialize problem] * @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.5d, tested on FireFox 1.0.7, FireFox 1.5, IE 6 SP2 and Opera 8 */ function PHP_Serializer() { if(String(Object).indexOf('(') != 16) this.__cut = 9; else this.__cut = 10; } function PHP_Serializer__String(__s) { return ('s:'+__s.length+':"'+__s+'";'); } function PHP_UnSerializer__String() { var sls = this.__s.substr(2,(this.__s.indexOf(':',2)-2)); var sli = parseInt(sls); sls = sls.length + 4; var tmp = this.__s.substr(sls,sli); this.reduce((sli + sls + 2)); return tmp; } function PHP_Serializer__Boolean(__s) { return ('b:'+(__s==false?'0':'1')+';'); } function PHP_UnSerializer__Boolean() { var tmp = (this.__s.substr(2,1)=='1'?true:false); this.reduce(4); return tmp; } function PHP_Serializer__Number(__s) { __s = String(__s); return ((__s.indexOf('.')==-1)?'i:'+__s+';':'d:'+__s+';'); } function PHP_UnSerializer__Number() { var sli = this.__s.indexOf(';',1) - 2; var tmp = Number(this.__s.substr(2,sli)); this.reduce((sli + 3)); return tmp; } function PHP_Serializer__Function() { return ''; } function PHP_Serializer__Undefined() { return 'N;'; } function PHP_UnSerializer__Undefined() { this.reduce(2); return null; } function PHP_Serializer__Common_ArrayObject(__s) { var n; var a = 0; var ser = ''; for(var b in __s) { n = (__s[b] == null); if(n || (__s[b].constructor != Function && b != '__class')) { ser+=(!isNaN(b))?this.__number(b):this.__string(b); ser+=n?this.__undefined():this[__s[b].constructor](__s[b]); ++a; } } return [a,ser]; } function PHP_UnSerializer__Common_ArrayObject(tmp) { var l; var key; var a = this.__s.indexOf(':',2); var k = parseInt(this.__s.substr(2,(a-2))); this.reduce((a+2)); if(k!=0) { do { key = this[this.__s.substr(0,1)](); l = this.__s.substr(0,1); tmp[key] = this[l](); }while(--k); } return tmp; } function PHP_Serializer__Object(__s) { var o = String(__s.constructor); var oname = o.substr(this.__cut,o.indexOf('(')-this.__cut); var 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(1,(this.__s.indexOf(':',4)-1))+';'; var a = tmp.substr(2,(tmp.indexOf(':',2)-2)); this.reduce(tmp.length-2); var o = tmp.substr((a.length+4),parseInt(a)); if(eval("typeof("+o+") == 'undefined'")) eval('function '+o+'(){}'); tmp = 'tmp = this.__common(new '+o+'());'; eval(tmp); this.reduce(1); 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.reduce(1); return tmp; } function PHP_Serializer__serialize(what) { if(what==null) var ser = this.__undefined(); else if(!this[what.constructor]) var ser = this[Object](what); else var ser = this[what.constructor](what); return ser; } function PHP_UnSerializer__Reducer(l) { this.__s = this.__s.substr(l,(this.__s.length-l)); } function PHP_UnSerializer__unserialize(what) { this.__s = what; delete what; return this[this.__s.substr(0,1)](); } PHP_Serializer.prototype[Boolean] = PHP_Serializer__Boolean; PHP_Serializer.prototype[Number] = PHP_Serializer.prototype.__number = PHP_Serializer__Number; PHP_Serializer.prototype[String] = PHP_Serializer.prototype.__string = PHP_Serializer__String; 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.reduce = PHP_UnSerializer__Reducer; PHP_Serializer.prototype.s = PHP_UnSerializer__String; 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;