/**
 * @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)
{
	function getData(data)
	{
		//alert(document.getElementById(place_id).innerHTML);
		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.setFunctionWaiting(waiting);

//	myXHR.setVar('go','its');
//	myXHR.setVar('that','creat_data','POST');
//	myXHR.setVar('pr_id','21');
	myXHR.sendData();
}
/**
 * Класс работы с данными по методу 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;
	}
}