var arAJAX = {};

arAJAX.getXMLHttpObj = function()
{
	if (typeof(XMLHttpRequest) != 'undefined')
		return new XMLHttpRequest();
	var axO = ['Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.4.0', 'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP'], i;
	for(i=0; i < axO.length; i++)
		try {return new ActiveXObject(axO[i]);}
		catch(e) {}
	return null;
}

arAJAX.serialize = function(data)
{
	if (data == null)
		return 'N;';

	var type = typeof(data);
	var code = '';
	var iterator = 0;
	var length = null;
	var asciiCode = null;
	var key = null;

	if (type == 'boolean') {
		code += 'b:' + (data ? 1 : 0) + ';';
	} else if (type == 'number') {
		if (Math.round(data) == data) {
			code += 'i:' + data + ';';
		} else {
			code += 'd:' + data + ';';
		}
	} else if (type == 'string') {
		length = data.length;
		for (iterator = 0; iterator < data.length; iterator ++) {
			asciiCode = data.charCodeAt(iterator);
			if ((asciiCode >= 0x00000080) && (asciiCode <= 0x000007FF)) {
				length += 1;
			} else if ((asciiCode >= 0x00000800) && (asciiCode <= 0x0000FFFF)) {
				length += 2;
			} else if ((asciiCode >= 0x00010000) && (asciiCode <= 0x001FFFFF)) {
				length += 3;
			} else if ((asciiCode >= 0x00200000) && (asciiCode <= 0x03FFFFFF)) {
				length += 4;
			} else if ((asciiCode >= 0x04000000) && (asciiCode <= 0x7FFFFFFF)) {
				length += 5;
			}
		}
		code += 's:' + length + ':"' + data + '";';
	} else if (type == 'object') {
		if (typeof(data.__class) == 'undefined') {
			length = 0;
			if (
			(typeof(data.length) == 'number') &&
			(data.length > 0) &&
			(typeof(data[0]) != 'undefined')) {
				for (iterator = 0; iterator < data.length; iterator ++) {
					if (typeof(data[iterator]) != 'function') {
						code += arAJAX.serialize(iterator);
						code += arAJAX.serialize(data[iterator]);
						length ++;
					}
				}
			} else {
				for (key in data) {
					if (typeof(data[key]) != 'function') {
						if (/^[0-9]+$/.test(key)) {
							code += arAJAX.serialize(parseInt(key));
						} else {
							code += arAJAX.serialize(key);
						}
						code += arAJAX.serialize(data[key]);
						length ++;
					}
				}
			}
			code = 'a:' + length + ':{' + code + '}';
		} else {
			code += 'O:' + data.__class.length + ':"' + data.__class + '":' + data.__size + ':{';
			if (data.__meta != null) {
				for (key in data.__meta) {
					if (typeof(data[key]) != 'function') {
						code += arAJAX.serialize(key);
						code += arAJAX.serialize(data[key]);
					}
				}
			}
			code += '}';
		}
	} else {
		code = 'N;'
	}
	return code;
};

arAJAX.sendDataAsync = false;

arAJAX.setAsync = function (tf)
{
	tf = tf || true; 
	this.sendDataAsync = tf;
}

arAJAX.sendData = function (opc, dat, mod, lnk) //opc: opcode, dat: data, mod: module 
{
	var link = (typeof(lnk) == 'string' && lnk != '') ? lnk : location.href;
	__xml=arAJAX.getXMLHttpObj();
	__xml.open("POST",link,this.sendDataAsync);
	__xml.setRequestHeader('Content-Type','CMSPANEL/AJAX');
	data = arAJAX.serialize({opcode:opc,module:mod,data:dat});
	__xml.send(data);

	if((__xml.responseText.indexOf('<b>Parse error</b>:')!=-1)||
		(__xml.responseText.indexOf('<b>Fatal error</b>:')!=-1)||
		(__xml.responseText.indexOf('<b>Warning</b>:')!=-1)||
		(__xml.responseText.indexOf('escdbsqlerror')!=-1))
		{
			alert("ERROR NR.1:" + __xml.responseText);
			return null;
		}
		if (__xml.responseText!='')
		{
			try{eval('var $$$= ' + __xml.responseText + ';');}
			catch(e){alert("AJAX: Status: "+__xml.status+", URL: "+link+", Request: "+data);var $$$='';}
		    return $$$;
		}
};