/*
	Klasse zum Serialisieren von Javascript Datenstrukturen in PHP Objekte
	(C) 2001-2003 flying dog software (Nicolay Mausz)
	Version 1.1	

		Folgende Datentypen werden erkannt:
			- Objekte: [object Object]+ Typ="object"
			- Array: Typ="object"
			- Zahl: Typ="number"
			- String: Typ="string"

	Beispiel:
		var subobj={subvar1:"unterwert1",subvar2:200};
		var subarr=new Array(1000,2000);;
		var obj={var1:"wert1",var2:subobj,var3:subarr};
		s=new SerializeToPHP();
		s.serialize(obj);
		var string=s.serialize(obj);
		alert(string);
*/

function serializeToPHP(utf) {
	this.utf=utf;
}
/*
	Objekt serialisieren
	Übergabe: - Objekt
		  -this.utf: wenn gesetzt, dann UTF8 Kodierung verwenden
*/
serializeToPHP.prototype.serialize=function(obj) {
	var name,value,type,len;
	string="";
	type=typeof(obj);
	value=obj;
	if (!value && type=="object" ) type="array";
	try {	// wg. IE Bug
		if (value && type=="object" && value!="[object Object]") type="array";
	} catch (e) {
		type="object";
	}
	
	if (type=="object" && obj.length) type="array";

	switch (type) {
		case "string":
			var str=value;			
			if (this.utf) {
				arr=new Array()
				var l=0;
				for (i=0;i<str.length;i++) {
					var ch=str.charCodeAt(i);
					if (ch==95) show=true;
					if (ch < 128)  l++;
					else if((ch>127) && (ch<2048))  l+=2;
					else  l+=3;
				}
			}  else l=str.length
			str=str.replace(/\x0A/g,"_HEX:A_");
			str=str.replace(/\x0D/g,"_HEX:D_");
			string="s:"+l+':"'+str+'";';
		break;
		case "number": string="i:"+value+";";break;
		case "boolean": if (value==true) string="b:1;"; else string="b:0;";
						break;
		case "object":
			len=0;for(name in obj) len++;
  		    string="O:8:\"stdClass\":"+len +":{";
			for (name in obj){

				string+=this.serialize(name)+this.serialize(obj[name]);
			}
			string+="}";
			break;
		case "array":
			len=0;for(name in obj) len++;
			string="a:"+len +":{";
			for (var name in obj){
				s=""+parseInt(name);
				if (s==name) name=parseInt(name);
				string+=this.serialize(name)+this.serialize(obj[name]);
			}
			string+="}";
			break;
		default:
			string="N;";

	}
	//alert(string);

    return string;
}
