// === AJAX-клиент ===
// (c) Corelogic, 2007

if (!ajax_global)
{
	var ajax_global = new Object();
	ajax_global.version = '1.0.30';
	ajax_global.releaseDate = '2007.09.21';
	// создание элемента оповещения
	try 
	{
		if (main_$T('body')[0].length>0) {ajax_createProcessBar()}
		else (main_addEvent(window, 'load', ajax_createProcessBar));
	}
	catch(e) {main_addEvent(window, 'load', ajax_createProcessBar)};
}

// создание элемента оповещения
function ajax_createProcessBar()
{
	var path = 'js/';
	try {path = project_global.path} catch(e) {};
	ajax_global.processCount = 0;
	ajax_global.progress = document.createElement('DIV');
	ajax_global.progress.className = "bordered";
	ajax_global.progress.innerHTML = '<table style="width: 100%; height: 100%;"><tr><td style="padding: 10px;" width=10><img src="'+path+'lib/i/progress.gif" /></td><td style="padding: 10px 10px 10px 0;"><small>Обмен данными с сервером&hellip;</small></td></tr></table>'
	with (ajax_global.progress.style)
	{
		width = '200px';
		backgroundColor = 'White';
		position = 'absolute';
		display = 'none';
	}
	main_$T('body')[0].appendChild(ajax_global.progress);
}

//  конструктор объекта
function ajax(clientFunction, requestTarget, serverUrl)
{
	// определяемые параметры
	if (!serverUrl || serverUrl=='') {return false};
	this.serverUrl = serverUrl;
	if (!clientFunction || typeof(clientFunction)!='function') {return false};
	this.clientFunction = clientFunction;
	if (!requestTarget || requestTarget=='') {return false};
	this.requestTarget = requestTarget;
	// функция очистки
	this.clear = function()
	{
		// начальные параметры
		this.requestMethod = '';
		this.alreadySend = false;
		this.alreadyGet = false;
		this.requestError = false;
		this.requestText = false;
		this.requestId = Math.round(Math.random()*1E10);
		this.requestParameters = new Object;
		this.requestForm = new Object;
		this.requestElements = new Object;
		this.responseText = false;
		this.responseObject = false;
		this.requestFormat = 'j';
		this.responseFormat = 'j';
		// удаление старого объекта отсылки
		ajax_deleteRequest(this);
		// объект запроса
		this.request = new Object;
	};
	// заведение остальных параметров
	this.clear();
	// функция отправки запроса
	this.send = function(requestFormat, responseFormat, requestMethod)
	{
		if (this.alreadySend) {return false};
		if (requestFormat && requestFormat.toUpperCase()=='RAW') {this.requestFormat='r'};
		if ((responseFormat && responseFormat.toUpperCase()=='RAW') || (!responseFormat && requestFormat && requestFormat.toUpperCase()=='RAW')) {this.responseFormat='r'};
		if (ajax_getMethod(this))
		{
			if (requestMethod && this.requestMethod!='ffPOST') {this.requestMethod = requestMethod};
			ajax_send(this);
		}
	};
	return this;
}

// устанавливаем оповещение об обмене данными
function ajax_processCounter(inc)
{
	if (ajax_global.progress)
	{
		var inc = inc || 0;
		ajax_global.processCount += inc;
		if (ajax_global.processCount<0) {ajax_global.processCount = 0};
		if (ajax_global.processCount==1 && inc===1)
		{
			ajax_processCounterPos();
			main_addEvent(window, 'resize', ajax_processCounterPos);
			main_addEvent(window, 'scroll', ajax_processCounterPos);
		};
		if (ajax_global.processCount==0)
		{
			ajax_global.progress.style.display = 'none';
			main_removeEvent(window, 'resize', ajax_processCounterPos);
			main_removeEvent(window, 'scroll', ajax_processCounterPos);
		}
	}
}

// позиция оповещения
function ajax_processCounterPos()
{
	var bd = main_$T('body')[0];
	with (ajax_global.progress.style)
	{
		left = '10px';
		if (window.innerHeight) {top = (bd.scrollTop + window.innerHeight -50) + 'px';}
		else {top = (bd.scrollTop + bd.clientHeight -50) + 'px';};
		display='block';
	}
}

// выбираем нужный метов
function ajax_getMethod(ajax)
{
	// проверка на наличие файлов
	if (!ajax_els2params(ajax))
	{
		ajax.requestMethod = 'ffPOST';
		return true;
	};
	// проверка на длину URL
	var method = ajax_getParamURL(ajax).length>255 ? 'xPOST' : 'xGET';
	// проверка на возможность httpreq
	if (!ajax_getXMLHTTPRequest())
	{var method = 'fPOST'};
	ajax.requestMethod = method;
	return true;
}

// получение URL с параметрами
function ajax_getParamURL(ajax, ispost)
{
	var url = ajax.serverUrl;
	if (/\?/.test(url)) {url+='&'} else {url+='?'};
	url += 't='+ajax.requestTarget+'&n='+ajax.requestId;
	if (ajax.requestFormat==ajax.responseFormat) {url += '&f='+ajax.requestFormat}
	else {url += '&qf='+ajax.requestFormat + '&rf='+ajax.responseFormat};
	if (ispost) {url += '&m=p'}
	else
	{
		url += '&m=g&p=';
		if (ajax.requestFormat=='j')
		{var params = json_toString(ajax.requestParameters)}
		else {var params = ajax.requestText}
		url += escape(params);
	};
	if (ajax.requestMethod=='xPOST') {url = url.replace('&m=p', '&m=x')};
	return url;
}

// переводим форму в массив элементов
function ajax_els2params(ajax)
{
	if (ajax.requestForm.tagName)
	{
		ajax_arrnaming(ajax);
		for (var i=0, imax = ajax.requestForm.elements.length; i<imax; i++)
		{
			var el = ajax.requestForm.elements[i];
			if (el.name && el.name!='') {ajax.requestElements[el.name] = el};
		}
	}
	var nofiles = true;
	for (var i in ajax.requestElements)
	{
		var el = ajax.requestElements[i];
		if (el.type.toUpperCase()!='FILE')
		{
			ajax.requestParameters[i] = el.value;
		}
		else
		{
			nofiles = false;
		}
	}
	return nofiles;
}

// переименовываем имена-массивы
function ajax_arrnaming(ajax)
{
	var more = false;
	var n = 0;
	var nm = '';
	for (var i=0, imax = ajax.requestForm.elements.length; i<imax; i++)
	{
		var el = ajax.requestForm.elements[i];
		if (el.name && /\[\]$/.test(el.name))
		{
			if (nm=='') {nm=el.name};
			if (el.name==nm)
			{
				el.name = el.name.replace(/\[\]$/, '['+n+']');
				n++;
			}
			else (more = true);
		}
	}
	if (more) {ajax_arrnaming(ajax)};
}

// создание XMLHTTPRequest
function ajax_getXMLHTTPRequest()
{
	var request = false;
	// для встроенного XMLHttpRequest
	if (window.XMLHttpRequest)
	{
		try 
		{
			request = new XMLHttpRequest();
			if (request.overrideMimeType) {request.overrideMimeType('text/xml')};
		}
		catch(e) {var request = false};
	}
	// для версии с ActiveX
	else if (window.ActiveXObject) 
	{
		try
		{
			try {var request = new ActiveXObject("Microsoft.XMLHTTP")}
			catch(e) {var request = new ActiveXObject("Msxml2.XMLHTTP")};
		}
		catch(e){var request = false};
	}
	return request;
}

// создаём и отсылаем запрос
function ajax_send(ajax)
{
	ajax.alreadySend = true;
	ajax_processCounter(1);
	var url = /GET/.test(ajax.requestMethod) ? ajax_getParamURL(ajax) : ajax_getParamURL(ajax, true);
	var method = /GET/.test(ajax.requestMethod) ? 'GET' : 'POST';
	// если через запрос
	if (/x/.test(ajax.requestMethod))
	{
		var content = /GET/.test(ajax.requestMethod) ? null : json_toString(ajax.requestParameters);
		try
		{
			ajax.request = ajax_getXMLHTTPRequest();
			ajax.request.open(method, url, true, '', '');
			ajax.request.onreadystatechange = function()
			{
				if (ajax.request.readyState == 4)
				{
			        if (ajax.request.status == 200) 
					{ajax_getLuck(ajax)}
					else
					{ajax_getError(ajax)};
			    } 
			};
			ajax.request.send(escape(content));
		}
		catch (e)
		{
			ajax.requestMethod = 'fPOST';
			ajax_send(ajax);
		};
	}
	// если через iframe
	else
	{
		ajax.request = document.createElement('DIV');
		ajax.request.style.border = 'none';
		ajax.request.style.height = '0';
		ajax.request.style.width = '0';
		ajax.request.style.padding = '0';
		ajax.request.style.position = 'absolute';
		ajax.request.style.overflow = 'hidden';
		main_$T('body')[0].appendChild(ajax.request);
		ajax.request.innerHTML = '<iframe name="ajaxframe_'+ajax.requestId+'" id="ajaxframe_'+ajax.requestId+'" src="about:blank"></iframe>'
		// создаём форму
		try
		{var form = document.createElement('<form enctype="multipart/form-data" action='+url+' name=ajaxform_'+ajax.requestId+' id=ajaxform_'+ajax.requestId+' target=ajaxframe_'+ajax.requestId+' method='+method+' >');}
		catch(e)
		{
			var form = document.createElement('FORM');
			form.enctype = ajax.requestMethod=='ffPOST' ? 'multipart/form-data' : '';
			form.action = url;
			form.name = 'ajaxform_'+ajax.requestId;
			form.id = 'ajaxform_'+ajax.requestId;
			form.target = 'ajaxframe_'+ajax.requestId;
			form.method = method;
		};
		ajax.request.appendChild(form);
		if (ajax.requestText)
		{
			try {var ta = document.createElement('<TEXTAREA name="p">');}
			catch(e)
			{
				var ta = document.createElement('TEXTAREA');
				ta.name = 'p';
			};
			ta.value = ajax.requestText;
			form.appendChild(ta);
		};
		for (var i in ajax.requestElements)
		{
			var el = ajax.requestElements[i];
			if (el.type && el.type.toUpperCase()=='FILE' && el.value!='')
			{
				try
				{el.parentNode.insertBefore(el.cloneNode(true), el)}
				catch (e) {};
				form.appendChild(el);
			};
		}
		form.submit();
		main_addEvent(main_$('ajaxframe_'+ajax.requestId), 'load', function() {ajax_getLuck(ajax)});
	};
};

// ошибка запроса
function ajax_getError(ajax)
{
	ajax_processCounter(-1);
	ajax.requestError = true;
	if (!ajax.alreadySend) {return false};
	ajax.clientFunction(false, ajax);
	ajax_deleteRequest(ajax);
}

// запрос прошёл нормально
function ajax_getLuck(ajax)
{
	ajax_processCounter(-1);
	if (ajax.alreadyGet || !ajax.alreadySend) {return false};
	ajax.alreadyGet = true;
	try
	{
		if (/x/.test(ajax.requestMethod))
		{
			ajax.responseText = ajax.request.responseText.replace(/^<textarea [^>]*response[^>]*>/i, '').replace(/<\/textarea>(?:(?!<\/textarea>).|\n|\r)*$/i, '');
		}
		else
		{
			for (var i = 0; i < 100000; i++);
			if (ajax.request.getElementsByTagName('iframe')[0].contentWindow)
			{
				try {ajax.request.getElementsByTagName('iframe')[0].contentWindow.document.body}
				catch(e)
				{
					alert('Доступ к пришедшим данным запрещён.\nПроверьте идентичность домена.');
					ajax_getError(ajax);
					return false;
				};
			};
			ajax.responseText = ajax.request.getElementsByTagName('iframe')[0].contentWindow.document.getElementById('response').value;
		};
		if (ajax.responseFormat=='j')
		{
			ajax.responseObject = json_toObject(ajax.responseText);
			ajax.responseText = json_toString(ajax.responseObject);
		};
	}
	catch (e)
	{
		ajax_getError(ajax);
		return false;
	};
	ajax.clientFunction(true, ajax);
	ajax_deleteRequest(ajax);
}

// удаляем объект запроса
function ajax_deleteRequest(ajax)
{
	if (ajax.request && ajax.request.tagName)
	{
		ajax.request.getElementsByTagName('iframe')[0].src = 'about:blank';
		ajax.request.parentNode.removeChild(ajax.request);
	};
	if (ajax.request)
	{delete ajax.request};
}