/*{	AJAX
    
	(c) Vitaly Andrejev "AnVi" anvi@fromru.com, 09.2006

	uses:
		AJAX_Run(serversideMethod, serversideMethodArguments, callback);

	where:	
		serversideMethod - string with a server side method to perform. 
		                   Func name for CallFuncA, or ModView if is started by 'mv:'.
		serversideMethodArguments - array of arguments or object of parameters
		callback 		 - array of [callbackFunction, extraParameter, returnMode]
		where:	
			callbackFunction - callbackFunction(result, extraParameter)
							   invokes when a result is dispatched or failed(result=undefined) 	
			extraParameter	 - parameter, passed as a second argument for callbackFunction.
			returnMode		 - 0: result = <resultOfServersideMethod>
						   	   1: result = {ret:<resultOfServersideMethod>, arg0:<agrument1>, arg1:<argumet2>,...}
			
}*/
var ajax_debug = {};
function ajax_escapestr(s) {
//	s = s.replace(/([%&=\x80-\xFF])/m,function($1){return '%'+$1.charCodeAt(0).toString(16);});
//	return s;
	return encodeURIComponent(s);
}
function AJAX_Run(method, args, callback) {
	var xmlhttp  = AJAX_GetXmlHttp();
	if (callback.length != undefined) {
		callback = {cb:callback[0], info:callback.length>1 ?callback[1] :null, ret:callback.length>2 ?callback[2] :null};
	}
	if (!xmlhttp) {
		AJAX_Callback(callback, undefined);
		return;
	}
	xmlhttp.onreadystatechange = 
		function () {
			if (xmlhttp && xmlhttp.readyState==4) {
				var val=(xmlhttp.status==200) ?AJAX_GetResponseValue(xmlhttp.responseText) :undefined;
				//alert(AJAX_Dump(val));
				AJAX_Callback(callback, val);
			} else {
			}
		}
	var url='/ajax.php'
	var q  ='run='+ajax_escapestr(method);
	for(i in args) {
		q += '&arg['+i+']='+ajax_escapestr(args[i]);
	}
	if (callback.ret!=null) {
		q += '&ret='+callback.ret;
	}
	q += '&'+Math.random();
		
	if (ajax_debug.url!=null && ajax_debug.url) alert(url+'?'+q);
	if (ajax_debug.win!=null && ajax_debug.win)  window.open(url+'?'+q,'AJAX');
	
	if (q.length>200) {
		xmlhttp.open("POST",url,true);
		xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		xmlhttp.send(q);
	} else {
		xmlhttp.open("GET",url+'?'+q,true);
		xmlhttp.send(null);
	}
}
//------------------------------------------------------------------------------
function AJAX_Submit(form, callback) {
	var args={};
	for(var i=0; i<form.elements.length; i++) {
		var e = form.elements[i];
		if (e.value!=null) {
			args[e.name] = e.value;
		}
	}
	AJAX_Run(form.action, args, callback);
	return false;
}
//------------------------------------------------------------------------------
function AJAX_Callback(callback, val) {
   	var func = callback.cb;
   	var info = callback.info;
	func(val, info);
}
//------------------------------------------------------------------------------
function AJAX_GetXmlHttp() {	
	var xmlhttp = null;
	if (window.XMLHttpRequest) {
		xmlhttp = new XMLHttpRequest();
    }
	else if (window.ActiveXObject) {
		try { 	xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");} 
		catch (e) {
		try {	xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");} 
		catch (e) {
				xmlhttp=false;
		}}
	}
	return xmlhttp;
}
//------------------------------------------------------------------------------
function AJAX_GetResponseValue(txt) {
	var r = txt.split('|');
	r.RV = AJAX_ResponseValue;
	return r.RV();
}
function AJAX_ResponseValue() {
	var v = this.length ?this.shift() :null;
	switch(v) {
	case '[': v=new Array();  while(this.length && this[0]!=']') v.push(this.RV()); this.shift(); break;
	case '{': v=new Object(); while(this.length && this[0]!='}') { var n=this.RV(); v[n]=this.RV();} this.shift(); break;
	default:  v = unescape(v); break;
	}
	return v;
}
//------------------------------------------------------------------------------
function AJAX_Dump(v) {
	if (typeof v == 'undefined') return "undefined\n";
	if (typeof v == 'string') return "\""+v+"\"\n";
	if (v instanceof Array) return "["+v+"]\n";
	var s='{'; for(var i in v) { s+=i+":"+AJAX_Dump(v[i])+"";}
	return s+"}\n";
}
