/*      class ReqWrapper - wrapper for XMLHttpRequest      */

// constructor
function ReqWrapper(script_uri, handler, parent)
{
	// properties
	this.script_uri = script_uri || "";
	
	this.req_handler = function(){ handler(this); } || function(){ };
	
	this.parent = parent || null;
}

RW = ReqWrapper.prototype;

// выполнение запроса
RW.MakeRequest = function(keys_values)
{
	try
	{
		if (this.req)
		{
			if ((this.req.readyState != 0) && (this.req.readyState != 4)) this.req.abort();
			delete this.req;
		}
	}
	catch (e){};
	
	var ua = navigator.userAgent.toLowerCase();
	
	// create XMLHttpRequest
	// branch for native XMLHttpRequest object
	if (window.XMLHttpRequest)
	{
		this.req = new XMLHttpRequest();
	}
	// branch for IE/Windows ActiveX version
	else if (ua.indexOf('msie 5') == -1)
	{
		this.req = new ActiveXObject("Msxml2.XMLHTTP");
	}
	else
	{
		this.req = new ActiveXObject("Microsoft.XMLHTTP");
	}
	
	// making request
	if (this.req)
	{
		var obj_link = this;
		this.req.onreadystatechange = function(){ obj_link.RequestHandler(obj_link); };
		this.req.open("POST", this.script_uri, true);
		
		// making request string
		var post_data = '';
		if (keys_values)
		{
			var i, cnt = 0, arr = new Array(), enc_val;
			for (i in keys_values)
			{
				if (window.encodeURIComponent) enc_val = encodeURIComponent(keys_values[i]);
				else enc_val = keys_values[i];

				arr[cnt++] = i + "=" + enc_val;
			}
			post_data = arr.join('&');
		}
		// sending request
		this.req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		this.req.send(post_data);
		
		return true;
	}
	else return false;
}

// состояние запроса
RW.getState = function()
{
	if (this.req) return this.req.readyState;
	else return 0;
}

// результат - объект XML
RW.getXML = function()
{
	if (this.req && this.req.responseXML) return this.req.responseXML;
	else return null;
}

// обработчик XMLHttpRequest
RW.RequestHandler = function(ac_obj)
{	
	try
	{
		if (ac_obj.req.readyState == 4)
		{
			if ((ac_obj.req.status == 200) && (ac_obj.req.responseXML != null)) ac_obj.req_handler();
		}
	}
	catch (e) { };
}

// возвращает тип
RW.toString = function(){ return "[object ReqWrapper]"; };

// функция обработчик - function(ac_obj [object ReqWrapper])
