function CHttpRequest(){
	
	if(!self.__Requests){
		self.__Requests = new Array();
		self.__Contexts = new Array();
		if(self.attachEvent)
			self.attachEvent('onunload', __ClearRequestArray);
		else if(self.addEventListener)
			self.addEventListener('onunload', __ClearRequestArray, false);
			
	}
	this.AsyncCall = true;
	this.arProperties = new Array();
	this.QueryString = "";
	this.OnResponse = "";
	this.Debug = false;
	this.Context = new Array();
	
	this.RequestFile = "Index.php?hNoMarkup=1&SuppressRedirect=1&XmlHttpRequest=1";
	
	this.AddProperty = function(PropertyName, PropertyValue){
		var arProperty = new Array();
		arProperty["PropertyName"] = PropertyName;
		arProperty["PropertyValue"] = PropertyValue;
		this.arProperties.push(arProperty);
	}

	this.Send = function(){
		var currentRequest = null;

		if (window.XMLHttpRequest) {
            currentRequest = new XMLHttpRequest();
            if (currentRequest.overrideMimeType) {
                currentRequest.overrideMimeType('text/xml');
            }
        } else if (window.ActiveXObject) { // IE
            try {
                currentRequest = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    currentRequest = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {}
            }
        }
        
		currentRequest.open('POST', this.RequestFile, this.AsyncCall);
		currentRequest.setRequestHeader('content-type', 'application/x-www-form-urlencoded;charset=windows-1251');

		var savedIndex = null;
		for(var i = 0; i < self.__Requests.length; i++){
			if(self.__Requests[i].readyState == 4){
				self.__Requests[i] = currentRequest;
				savedIndex= i;
				break;
			}
		}
		if(savedIndex == null){
			self.__Requests.push(currentRequest);
			savedIndex = self.__Requests.length - 1;
		}
		self.__Contexts[savedIndex] = this.Context;
		if(this.OnResponse != ""){
			currentRequest.onreadystatechange = new Function("if(self.__Requests["+ savedIndex +"].readyState == 4){"+ this.OnResponse +"(self.__Requests["+ savedIndex +"].responseXML.childNodes[0], self.__Requests["+ savedIndex +"], self.__Contexts["+ savedIndex +"]);}");
		}			
		
		for(var i = 0; i < this.arProperties.length; i++){
			var arProperty = this.arProperties[i];
			//this.QueryString += "&"+ arProperty["PropertyName"] +"="+ encodeURIComponent(arProperty["PropertyValue"]);
			this.QueryString += "&"+ arProperty["PropertyName"] +"="+ arProperty["PropertyValue"];
		}
		if(this.Debug){
			if(typeof(window.Debug.DumpWindow) != "undefined")
				window.Debug.DumpWindow(this.RequestFile+"&Debug=1"+ this.QueryString);
			else
				window.open(this.RequestFile+"&Debug=1"+ this.QueryString, "XmlRequestDebug");
		}
		currentRequest.send(this.QueryString);
		
		return currentRequest;
	}
}

function __ClearRequestArray(){
	self.__Requests = null;
	self.__Contexts = null;
}


///////////////////////////////////////////////////////////////////////////////////////////////////
function XmlToObject(Response){
	var ObjectProperties = Response.childNodes;

	var ResultObject = new Object();
	var Value = null;
	var CurrentProperty = null;
	var i;
	
	for(i = 0; i < ObjectProperties.length; i++){
		CurrentProperty = ObjectProperties[i];
		if((CurrentProperty.childNodes.length == 1 && CurrentProperty.childNodes[0].nodeType == 3) || CurrentProperty.childNodes.length == 0){
			if(CurrentProperty.childNodes.length == 0 && CurrentProperty.nodeType != 3){
				Value = "";
			}else{
				Value = decodeURIComponent(CurrentProperty.text);
			}
		}else{		  
			Value = XmlToObject(CurrentProperty);
		}
		if(typeof(CurrentProperty.tagName) != 'undefined'){
			if(typeof(ResultObject[CurrentProperty.tagName]) == 'undefined'){
				ResultObject[CurrentProperty.tagName] = Value;
			}else if(typeof(ResultObject[CurrentProperty.tagName].push) != 'undefined') {
				ResultObject[CurrentProperty.tagName].push(Value);
			}else{
				ResultObject[CurrentProperty.tagName] = new Array(ResultObject[CurrentProperty.tagName], Value);
			}
		}else{
			ResultObject.Value = Value;
		}
	}		
	return ResultObject;
}