/**
* @package GLibrary::GXHR
* @copyright AV-Consulting, 2007
* @link http://www.agapa.com.ua
* @author Kondratenko Pavel, Ukraine, Krivoj Rog;
* @desc Библиоткеа XHR. Для асинхронного взаимодействия с сервером
*/
/**
* Функция принимает адрес, получает данные по адресу и сохраняет их в объект place_id (DIV)
*/
function getAjax(url,place_id,act)
{
	function getData(data)
	{
		if(act == 1) document.getElementById(place_id).innerHTML += data;
		else document.getElementById(place_id).innerHTML = data;
	}
	function error(error)
	{
		//alert("Ошибка №"+ error + " при получении данных")
	}
	function waiting()
	{
		//alert("Ожидание ответа")
	}
	myXHR= new GXHR(getData);
	myXHR.setAction(url);
	myXHR.setAsyncType(true);
	myXHR.setFunctionError(error);
	myXHR.sendData();
	//if(data) alert(data);
}
function Ajax(url,funcname)
{
	function error(error)
	{
		//alert("Ошибка №"+ error + " при получении данных")
	}
	function waiting()
	{
		alert("Ожидание ответа")
	}
	
	myXHR= new GXHR(funcname);
	myXHR.setAction(url);
	myXHR.setAsyncType(true);
	myXHR.setFunctionError(error);
	myXHR.sendData();
	//if(data) alert(data);
}
/**
* Класс работы с данными по методу Ajax
*/
function GXHR(userFunctionContent)
{
	/**
	* Содержит тип отправки данных GET|POST
	*
	*/
	this.method;
	/**
	* Содержит url куда будут отосланы данные
	*
	*/
	this.action = null;
	/**
	* Содержит вид работы с сервером асинхронный или обыкновенный
	*
	*/
	this.async_type = true;
	/**
	* Содержит ссылку на пользовательскую ф-ю обрабатывающую полученное данные с сервера
	*
	*/
	this.userFunctionContent = userFunctionContent;
	/**
	* Содержит ссылку на пользовательскую ф-ю обрабатывающую полученное данные с сервера
	*
	*/
	this.userFunctionError = this.defaultError;
	/**
	* Содержит ссылку на пользовательскую ф-ю вызываемую при ожидании ответа с сервера
	*
	*/
	this.userFunctionWaiting = false;
	/**
	* Содержит название переменной
	*
	*/
	this.user_var_index = new Array();
	/**
	* Содержит значение переменной
	*
	*/
	this.user_var_value = new Array();
	/**
	* Определяет тип переменной GET или POST
	*
	*/
	this.type_var = new Array();
	/**
	* Определяет тип получаемых данных text|xml
	*
	*/
	this.type_response_data = "text";
	/**
	* Массив заголовков
	*
	*/
	this.user_header_ar = new Array();
	/**
	* Признак того что массив заголовков был установлен
	*
	*/
	this.header_exists = false;

	var xhr

	/**
	* Возвращает объект XMLHttpRequest
	*
	* @return object
	*/
	this.getRequest = function()
	{
		var xmlhttp;
		/*@cc_on
		@if (@_jscript_version >= 5)
		try {
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
		try {
		xmlhttp = new
		ActiveXObject("Microsoft.XMLHTTP");
		} catch (E) {
		xmlhttp = false;
		}
		}
		@else
		xmlhttp = false;
		@end @*/
		if(!xmlhttp && typeof XMLHttpRequest != 'undefined')
		{
			try
			{
				xmlhttp = new XMLHttpRequest();
			}
			catch (e)
			{
				xmlhttp = false;
			}
		}
		return xmlhttp;
	}

	/**
	* Отсылает данные на сервер
	*
	*/
	this.sendData = function()
	{
		if(!this.xhr)
		{
			this.xhr = this.getRequest();
		}
		if(this.xhr)
		{
			this.method = this.getMethod();
			//var xhr = this.xhr;
			xhr = this.xhr;
			var load = this;
			this.xhr.onreadystatechange = function()
			{
				load.onReadyState.call(load);
			}
			if(this.header_exists)
			{
				this.sendRequestHeader();
			}
			this.xhr.open(this.method,this.getGetVars(),this.async_type);
			if(this.method == "POST")
			{
				this.xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
			}
			this.xhr.send(this.getPostVars());
		}
		if(!this.xhr)
		{
			//alert("Ваш браузер не поддерживает технологию Ajax")
		}
	}

	/**
	* Устанавливает ф-и обрабатывающие полученные данные
	*
	*/
	this.onReadyState = function()
	{
		if(this.xhr.readyState == 4)
		{
			if(this.xhr.status == 200)
			{
				if(this.type_response_data = "text")
				{
					this.userFunctionContent.call(this,this.xhr.responseText);
				}
				else if(this.type_response_data = "xml")
				{
					this.userFunctionContent.call(this,this.xhr.responseXML);
				}
			}
			else
			{
				if(this.userFunctionError)
				{
					this.userFunctionError.call(this,this.xhr.status);
				}
				else
				{
					this.defaultError.call(this,this.xhr.status);
				}
			}
		}
		else
		{
			if(this.userFunctionWaiting)
			{
				this.userFunctionWaiting.call();
			}
		}
	}

	/**
	* Возвращает method формы
	*
	* @return string
	*/
	this.getMethod = function()
	{
		for(var key in this.type_var)
		{
			if(!this.checkTypeVar(key))
			{
				return "POST";
			}
		}

		return "GET";
	}

	/**
	* Устанавливает переменные
	*
	* @param string index название переменной
	* @param string value значение переменной
	* @param string type_var тип переменной GET|POST
	*
	*/
	this.setVar = function(index,value,type_var)
	{
		this.user_var_index[index] = index;
		this.user_var_value[index] = value;
		this.type_var[index] = type_var;
	}

	/**
	* Возвращает GET переменные
	*
	* @return string
	*/
	this.getGetVars = function()
	{
		for(var key in this.user_var_index)
		{
			if(this.user_var_index[key])
			{
				if(this.checkTypeVar(key))
				{
					this.action += (this.action.indexOf('?') == -1 ? "?" : "&") + this.user_var_index[key] + "=" + this.user_var_value[key];
				}
			}
		}
		return this.action;
	}


	/**
	* Возвращает POST переменные
	*
	* @return null|string
	*/
	this.getPostVars = function()
	{
		var j, var_post = "";
		for(var key in this.user_var_index)
		{
			if(this.user_var_index[key])
			{
				if(!this.checkTypeVar(key))
				{
					var_post += (!j ? "" : "&") + this.user_var_index[key] + "=" + encodeURIComponent(this.user_var_value[key]);
					j = 1;
				}
			}
		}
		if(!var_post)
		{
			return null;
		}
		return var_post;
	}

	/**
	* Проверяет тип переменной. Если GET возвращает true иначе - false
	*
	* @param int key индекс массива this.type_var
	* @return boolean
	*/
	this.checkTypeVar = function(key)
	{
		if(this.type_var[key] == "POST")
		{
			return 0;
		}
		else
		{
			return 1;
		}
	}

	/**
	* Устанавливает тип получаемых данных в виде текста - text или xml
	*
	* @param string t тип получаемых данных text|xml
	*/
	this.setTypeResponseData = function(t)
	{
		this.type_response_data = t;
	}

	/**
	* Отвечает за обработку ошибок
	*
	*/
	this.defaultError = function(error)
	{
		//alert("Ошибка (№ " + error + ") при получении страницы");
	}

	/**
	* Устанавливает пользовательскую ф-ю обрабатывающую ошибки
	*
	* @param object userFunctionError пользовательская ф-я
	*/
	this.setFunctionError = function(userFunctionError)
	{
		this.userFunctionError = userFunctionError;
	}

	/**
	* Устанавливает пользовательскую ф-ю вызываемую при ожидании ответа с серевера
	*
	* @param object userFunctionWaiting пользовательская ф-я
	*/
	this.setFunctionWaiting = function(userFunctionWaiting)
	{
		this.userFunctionWaiting = userFunctionWaiting;
	}

	/**
	* Устанавливает url обработки ajax запроса
	*
	* @param string a url адрес обработки данных
	*/
	this.setAction = function(a)
	{
		this.action = a;
	}

	/**
	* Устанавливает заголовки
	*
	* @param string index название переменной
	* @param string value значение переменной
	*
	*/
	this.setUserRequestHeader = function(index,value)
	{
		this.user_header_ar[index] = value;
		this.header_exists = true;
	}

	this.sendRequestHeader = function()
	{
		//		alert(this.setAction)
		//		for(key in this.user_header_ar)
		//		{
		//			//xhr.setRequestHeader(key,this.user_header_ar[key])
		//			//this.xhr.setRequestHeader(key,this.user_header_ar[key])
		//			alert(key+" = "+this.user_header_ar[key])
		//		}
		//		alert(this.setRequestHeader)
	}

	/**
	* Тип запроса
	*
	* @param boolean at url тип запроса
	*/
	this.setAsyncType = function(at)
	{
		this.async_type = at;
	}
}
