var xmlHttp		= createXmlHttpRequestObject();
var script_name	= '/includes/ajax.php';
var destination	= new Array();		// очередь для хранения id дивов, в которое вставляем результат запроса
var cache		= new Array();		// очередь запросов (запросы могут поступать непрерывно, но отправляем очередной только после обработки предыдущего)
var showError	= true;
var dest_current;
var ajax_req;
var br_iE;

// Создание объекта XMLHttpRequest в зависимости от браузера
function createXmlHttpRequestObject()
{
	var xmlHttp;
	
	try
	{
		br_iE = 0;
		xmlHttp = new XMLHttpRequest;
	}
	catch(e)
	{
		br_iE = 1;
		var XmlHttpVersion = new Array(
									   "MSXML2.XMLHTTP.6.0",
									   "MSXML2.XMLHTTP.5.0",
									   "MSXML2.XMLHTTP.4.0",
									   "MSXML2.XMLHTTP.3.0",
									   "MSXML2.XMLHTTP",
									   "Microsoft.XMLHTTP"
									   );
		for (var i=0; i<XmlHttpVersion.length && !xmlHttp; i++)
		{
			try
			{
				xmlHttp = new ActiveXObject(XmlHttpVersion[i]);
			}
			catch(e)
			{}
		}
	}
	if (!xmlHttp) 
	{
		alert("Ошибка создания объекта XMLHttpRequest.");
	}
	else
	{
		return xmlHttp;
	}
}


// Обработчик состояния запроса
function handleRequestStateChange()
{
	if (xmlHttp.readyState == 4)
	{
		if(xmlHttp.status == 200)
		{
			try
			{
				readResponse();
			}
			catch(e)
			{
				displayError(e.toString());
			}
		}
		else
		{
			displayError(xmlHttp.statusText);
		}
	}
}


function fnShowProps(obj, objName)
{
    var result = "";
	
    // обращение к свойствам объекта по индексу
	for (var i in obj) 
	{
		result += objName + "." + i + " = " + obj[i] + "";
	}
    alert(result);
}



// Результат запроса (просто как тектст - не XLM) вставлеям в документ
function readResponse()
{
	// возьмем ID дива из очереди 
	var div_id = destination.shift();
	
	// Если при вызове AJAX не был указан DIV, в который необходимо
	// вывести HTML с результатами работы скрипта, 
	// то не будем обрабатывать вывод результатов совсем.
	if ( div_id != '' && document.getElementById(div_id) )
	{
		// Если передан ID дива для вывода результатов работы скрипта
		// и такой див найден...
		var div = document.getElementById(div_id);
		var response = xmlHttp.responseText;
		div.innerHTML = response;
	}

	/*if(!response || !response.documentElement)
		throw("Неправильная структура XML"+xmlHttp.responseText);

	var rootNodeName = response.documentElement.nodeName;

	if(rootNodeName=="parsererror")
		throw("Неправильная структура XML"+xmlHttp.responseText);	*/
	//var arrCnt = response.getElementsByTagName('content');

	// заменим HTML на результат запроса

	//только в случае корзины
	//if(div_id=="cnt_basket")
	//	ChangeBasket();

	//следующий запрос (если есть в очереди запросы, это проверятся в самом методе)
	getAjaxRequest();
}

function displayError($message)
{
	if (showError)
	{
		alert("Обнаружена ошибка: \n" + $message);
	}
}


// Запрос к серверу посредсвтом XMLHttpRequest (его экземпляра - xmlHttp)
function getAjaxRequest()
{
	// Вернем курсор на странице к нормальному виду
	document.body.style.cursor = 'default';	
	
	if (xmlHttp)
	{
		try
		{
			//если объект свободен и имеются в очереди запросы
			if ( (xmlHttp.readyState == 4 || xmlHttp.readyState == 0) && cache.length >0 )
			{
				// Сменим курсор на странице на время работы скрипта
				document.body.style.cursor = 'wait';
				
				// достаем из очереди запрос
				var cacheEntry = cache.shift();
				xmlHttp.open("POST", script_name, true);
				xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
				xmlHttp.onreadystatechange = handleRequestStateChange;
				xmlHttp.send(cacheEntry);
			}
		}
		catch (e)
		{
			//Если возникла ошибка(в Opere иногда возникает), не выводим ее пользователю, а просто перезагружаем страницу
			location.reload();
			/*fnShowProps(location, "location");*/
			/*displayError(e.toString());*/
		}
	}
}
