/**************************************
* COPYRIGHT : (C) 2006 Titansoft, Anaken
* STARTED	: 28.08.2006
* FILENAME  : ajax_multithreaded.js
* version	: 1.070209
**************************************/

var TEK_CORE_ADDON = '';	//
var MAX_THREADS = 10;				// Максимальное количество одновременных потоков
var RESTART_DELAY = 1000;			// Задержка перед проверкой на доступность потоков
var XMLMethodDefault = "GET";		// Метод запроса по умолчанию
var SHOW_STATUS = true;				// Показывать сообщение в строке состояния при занятости всех потоков
var TO_CACHE_PAGES = true;			// Кэшировать страницы
var XMLResponse = 'Не выполнен еще ни один запрос';
var _data_waiting_ = '...';
var alerted;
var __current_thread;
__xml_request_object	= new Array(MAX_THREADS);
__pages_cache 			= new Array();
Call 		= ExecuteXMLCall;

initThreads();
function initThreads()
{
	for(var i = 1; i <= MAX_THREADS; i++)
	{
		__xml_request_object[i] = new AJSO(i);
	}
}
function AJSO(id) // Asynchronous JavaScript Object
{
	/*@cc_on @*/
	/*@if (@_jscript_version >= 5)
	try {
		this.object = new ActiveXObject("Msxml2.XMLHTTP");
		this.answer = true;
	} 
	catch (AbsenceOfMsxml2Exception) {
		try {
			this.object = new ActiveXObject("Microsoft.XMLHTTP");
			this.answer = true;
		}
		catch (AbsenceOfMSXMLException)
		{
			alert("Sorry, but you can't use this action");
		}
	}
	@else
	alert("Sorry, but your brouser does not support this action");
	this.object = false;
	alerted = true;
	@end @*/
	if (!this.object && !alerted) {
		try {
			this.object = new XMLHttpRequest();
			this.answer = true;
		} catch (e) { alert("")	}
	}
	if(this.object)
	{
		this.element = '';
		this.id = id;
		this.url = '';
		this.post_data = '';
		this.to_eval = '';
		eval('this.Response = function () { id = ' + id + '; if (__xml_request_object[id].object.readyState == 4) { if(__xml_request_object[id].element) { if(document.getElementById(__xml_request_object[id].element).value) document.getElementById(__xml_request_object[id].element).value = __xml_request_object[id].object.responseText; else document.getElementById(__xml_request_object[id].element).innerHTML = __xml_request_object[id].object.responseText; } __xml_request_object[id].answer = true; if(SHOW_STATUS) window.status = ""; if(TO_CACHE_PAGES) __put_cached(__xml_request_object[id].url + __xml_request_object[id].post_data, __xml_request_object[id].object.responseText); XMLResponse = __xml_request_object[id].object.responseText; MyUserFunction(); try { if(m[id].to_eval) eval(m[id].to_eval); OnExecutedRequest(__xml_request_object[id].id, __xml_request_object[id].object.responseText);} catch (e){ } } } ');
	}
}
function __getFree()
{
	for(var i = 1; i <= MAX_THREADS; i++) if(__xml_request_object[i].answer) return i;
	return false;
}
function __get_cached(url)
{
	for(var i = 0; i < __pages_cache.length; i++) 
	{
		if(__pages_cache[i][0] == url+ '&') {
			return __pages_cache[i][1];
		}
	}

	return false;
}
function __put_cached(url, text)
{
	if(!__get_cached(url)) {
		var i = __pages_cache.length;
		__pages_cache[i] = new Array(3);
		__pages_cache[i][0] = url;
		__pages_cache[i][1] = text;
		return false;
	} else { return true;}
}
function ExecuteXMLCall(XMLURL, element, XMLMethod, data, no_cache, to_eval_on_receive,data_waiting)
{
	_data_waiting_ = (data_waiting != '') ? data_waiting : _data_waiting_;

	__current_thread = __getFree();
	if (__xml_request_object[1] && __current_thread) {
		if (TO_CACHE_PAGES && !no_cache) {
	
			var page = __get_cached(XMLURL + (data ? data : ''));

			if(page) {
				document.getElementById(element).innerHTML = page;
				XMLResponse = page;
				MyUserFunction();
				try {
					OnExecutedRequest(__current_thread, page);
				} catch (e) { }
				return false;
			}
		}
		if (XMLURL) {
			if(element) {
				XMLResponse = _data_waiting_;	//для совместимости
				try {
				document.getElementById(element).innerHTML = _data_waiting_;
				} catch (e) { }
			}
			if(!data) data = null;
			else 
			{
				data += '&' + TEK_CORE_ADDON;
				__xml_request_object[__current_thread].post_data = data;
			}
			if(!XMLMethod) XMLMethod = XMLMethodDefault;
			__xml_request_object[__current_thread].to_eval = to_eval_on_receive;
			__xml_request_object[__current_thread].answer = false;
			__xml_request_object[__current_thread].element = element;
			__xml_request_object[__current_thread].url = XMLURL;
			__xml_request_object[__current_thread].id = __current_thread;
			__xml_request_object[__current_thread].object.open(XMLMethod, XMLURL, true);
			if(XMLMethod.toLowerCase() == 'post')
			{
				__xml_request_object[__current_thread].object.setRequestHeader( 'Connection', 'close' );
				__xml_request_object[__current_thread].object.setRequestHeader( 'Content-type', 'application/x-www-form-urlencoded' );
			}
			__xml_request_object[__current_thread].object.onreadystatechange = __xml_request_object[__current_thread].Response;
			__xml_request_object[__current_thread].object.send(data);
			return false;
		}
	}
	else {
		if(!XMLMethod) XMLMethod = XMLMethodDefault;
		if(!data) 	setTimeout('ExecuteXMLCall("'+XMLURL+'", "'+element+'", "'+XMLMethod+'")', RESTART_DELAY);
		else 		setTimeout('ExecuteXMLCall("'+XMLURL+'", "'+element+'", "'+XMLMethod+'", "'+data+'")', RESTART_DELAY);
		if(SHOW_STATUS) window.status = _data_waiting_;
		return true;
	}
}