// classname, functionname, paramarray - обязательные
// application - надо указывать, если вызов не из основного  модуля
function Ajax(classname, functionname, paramarray, application) {
	var param = __AjaxCreateParam(classname, functionname, paramarray, application);
	var updateInterval = window.screen.updateInterval;
	window.screen.updateInterval = 10;
	var texthttp = __AjaxLoadXML(param.url, false);
	if (texthttp != null) {
		texthttp.send(param.parameters);
		window.screen.updateInterval = updateInterval;
		return __AjaxResult(texthttp);
	}
}

// classname, functionname, paramarray - обязательные
// application - надо указывать, если вызов не из основного  модуля
// functionresultparam - (необязательный) любые параметры передаваемые в функцию возвращения результатов functionresult
// ajaxtimeout - время в миллисек. для прерывания запроса, если 0 - то ждать пока не будет окончательный результат
// ajaxtimestart - время отложенной перезагрузки в миллисек.
function AjaxAsync(functionresult, functionresultparam, ajaxtimeout, ajaxtimestart, classname, functionname, paramarray, application, timestart) {
	var param = __AjaxCreateParam(classname, functionname, paramarray, application);
	var texthttp = __AjaxLoadXML(param.url, true);
	if (texthttp != null) {
		var index = -1;
		var aObject = __AjaxObject(texthttp, param, functionresult, functionresultparam, ajaxtimeout);
		if (ajaxtimestart == null || isNaN(parseInt(ajaxtimestart)) || ajaxtimestart < 0) ajaxtimestart = 50;
		for (i = 0; i < (__AjaxObjectsArray.length); i += 1) {
			if (index == -1 && __AjaxObjectsArray[i] == null) {
				__AjaxObjectsArray[i] = aObject;
				index = i;
				break;
			}
		}
		if (index == -1) {
			__AjaxObjectsArray[__AjaxObjectsArray.length] = aObject;
			index = __AjaxObjectsArray.length - 1;
		}
		__AjaxStartWaiting(index, ajaxtimestart);
		return index;
	}
}

function AjaxAsyncAbort(index) {
	var aObject = __AjaxObjectsArray[index];
	if (aObject != null) aObject.abort = true;
}

function AjaxGetResult(result, namevar) {
	if (namevar == null && result.length == 1) {
		var index =	result[0].indexOf(":");
		return result[0].substring(index + 1, result[0].length);
	} else {
		for (i = 0; i < (result.length); i += 1) {
			var index =	result[i].indexOf(":");
			if (namevar.toLowerCase() == result[i].substring(0, index)) return result[i].substring(index + 1, result[i].length);
		}
		alert("The meaning of result is not found");
		return ""
	}
}


// ****************************************************************
// 
// вспомогательные функции
// 
// ****************************************************************
function __AjaxObject(texthttp, paramajax, functionresult, functionresultparam, ajaxtimeout) {
	var o = new Object();
	o.paramAjax = paramajax;
	o.textHttp = texthttp;
	o.functionResult = functionresult;
	o.dateStart = new Date();
	o.functionResultParam = functionresultparam;
	o.timeOut = ajaxtimeout;
	o.abort = false;
	o.start = false;
	return o;
}
function __AjaxAsyncWaitOk(index) {
	var aObject = __AjaxObjectsArray[index];
	if (aObject != null) {
		if (aObject.abort) {
			try {
				texthttp.abort();
			} catch (e) {
			}
			__AjaxObjectsArray[index] = null;
		} else if (!aObject.start) {
			aObject.start = true;
			var texthttp = aObject.textHttp;
			texthttp.send(aObject.paramAjax.parameters);
			__AjaxStartWaiting(index);
		} else {
			var texthttp = aObject.textHttp;
			if (texthttp.readyState == 4) {
				var functionresult = aObject.functionResult;
				var param = aObject.functionResultParam;
				var res = __AjaxResult(texthttp);
				var ResFunc = new Function("res", "param", "return(" + functionresult + "(res, param))");
				__AjaxObjectsArray[index] = null;
				ResFunc(res, param);
				ResFunc = null;
			} else {
				var datestart = aObject.dateStart;
				var ajaxtimeout = aObject.timeOut;
				if (ajaxtimeout != null && ajaxtimeout > 0) {
					var d = new Date();
					if (d.getTime() - datestart.getTime() < ajaxtimeout) {
						__AjaxStartWaiting(index);
					} else {
						var functionresult = aObject.functionResult;
						try {
							texthttp.abort();
						} catch (e) {
						}
						__AjaxObjectsArray[index] = null;
						var res = __AjaxResult(null);
						var ResFunc = new Function("res", "param", "return(" + functionresult + "(res, param))");
						ResFunc(res, param);
					}
				} else {
					__AjaxStartWaiting(index)
				}
			}
		}
	}
}

function __AjaxStartWaiting(index, ajaxtimestart) {
	if (ajaxtimestart == null) ajaxtimestart = 50;
	window.setTimeout("__AjaxAsyncWaitOk(" + index + ")", ajaxtimestart);
}

function __AjaxCreateParam(classname, functionname, paramarray, application) {
	var o = new Object();
	if (application == null) application = "";
	var parameters;
	if (paramarray != null) {
		for (i = 0; i < (paramarray.length); i += 1) {
			paramarray[i] = __AjaxEscape(paramarray[i]);
		}
		parameters = paramarray.join("&");
	}
	parameters = "classname=" + classname + "&functionname=" + functionname + "&parameters=" + __AjaxEscape(parameters) + "&application=" + __AjaxEscape(application);
	o.parameters = parameters;
	o.url = "../ajax.aspx/GetValue";
	return o;
}

function __AjaxEscape(str) {
	return escape(str).replace(/\+/g, "%2B");
}

function __AjaxResult(texthttp) {
	var res = new Array();
	if (texthttp != null && texthttp.status == 200 && texthttp.readyState == 4) {
		if (texthttp.responseText.substring(0, 7) != "ERROR: ") {
			var sizestr = texthttp.responseText.split("\r\n")[0];
			var text = texthttp.responseText.substring(sizestr.length + 2, texthttp.responseText.length);
			var size = sizestr.split(",");
			var index = 0;
			for (i = 0; i < (size.length); i += 1) {
				var newindex = index + parseInt(size[i]);
				res[i] = text.substring(index, newindex);
				index = newindex;
			}
		} else {
			alert(texthttp.responseText);
			return false;
		}
	} else {
		var msg;
		if (texthttp != null && texthttp.status == 404 && texthttp.readyState == 4) {
			msg = "Ajax path not found.";
		} else {
			msg = "Can not load an element Ajax.";
		}
		alert("ERROR: " + msg);
		return false;
	}
	return res;
}

var __AgaxErrorMessage = false;
function __AjaxLoadXML(url, async) {
	var texthttp = null;
	if (!((navigator.userAgent.toLowerCase().indexOf("opera") != -1) && parseFloat(navigator.appVersion) <= 8.5)) {
		if (async != true) async = false;
		if(window.XMLHttpRequest) {
			texthttp = new XMLHttpRequest();
		} else {
			if(window.ActiveXObject) {
				texthttp = new ActiveXObject("Microsoft.XMLHTTP");
				try {
					http_request = new ActiveXObject("Msxml2.XMLHTTP");
				} catch (e) {
					try {
						http_request = new ActiveXObject("Microsoft.XMLHTTP");
					} catch (e) {
					}
				}
			}
		}
	}
	if (texthttp != null) {
		texthttp.open("POST", url, async);
		texthttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		return texthttp;
	} else {
		if (!__AgaxErrorMessage) alert("Error initializing XMLHttpRequest!\nUse the new version brawser.");
		__AgaxErrorMessage = true;
		return null;
	}
}

var __AjaxObjectsArray = new Array();