function AjaxObject()
{
 this.request 		= null;
 this.url 		= null;
 this.method 		= 'GET';
 this.async 		= true;
 this.status		= null;
 this.statusText	= '';
 this.postData		= null;
 this.readyState	= null;
 this.responseText	= null;
 this.responseXML	= null;
 this.handleResponse 	= null;
 this.handleErr 	= null;
 this.responseFormat 	= 'text', // 'text', 'xml', or 'object'
 this.mimeType 		= null;

 this.init = function()
 {
  if (!this.request)
  {
   try
   {
    this.request = new XMLHttpRequest(); //Firefox, Safari, IE7, etc
   }
   catch(e)
   {
    try
    {
     this.request = new ActiveXObject('MSXML2.XMLHTTP'); //later versions of IE.
    }
    catch(e)
    {
     try
     {
      this.request = new ActiveXObject('Microsoft.XMLHTTP'); //early versions of IE.
     }
     catch(e)
     {
      return false; // failed
     }
    }
   }
  }
  return this.request;
 };
 this.doRequest = function()
 {
  if (!this.init())
  {
   alert('Не удалось создать объект XMLHttpRequest!');
   return false;
  }
  this.request.open(this.method, this.url, this.async);
  if (this.method == 'POST')
    this.request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=windows-1251"); //
  else
    this.request.setRequestHeader("Content-Type", "text/xml;charset=windows-1251");
  var self = this;
  this.request.onreadystatechange = function()
  	{
	 var oResp = null;
	 if (self.request.readyState == 4)
	 {
      switch (self.responseFormat)
	  {
 	   case 'text':{oResp = self.request.responseText; break;}
 	   case 'xml':{oResp = self.request.responseXML; break;}
 	   case 'object':{oResp = self.request; break;}
	  };
	  if (self.request.status >= 200 && self.request.status <= 299)
	    self.handleResponse(oResp);
 	  else
	    self.handleErr(oResp);
     }
	};
  this.request.send(this.postData);
 };
 this.setHandlerErr = function(funcRef)
  {
   this.handleErr = funcRef;
  };

 this.setHandlerResponse = function(funcRef)
  {
   this.handleResponse = funcRef;
  };

 this.abort = function()
  {
   if (this.request)
   {
    this.request.onreadystatechange = function() {};
    this.request.abort();
    this.request = null;
   }
  };

 this.doGet = function(sUrl, oHand, sFormat)
  {
   this.url = sUrl;
   this.method = 'GET';
   this.handleResponse = oHand;
   this.responseFormat = sFormat || 'text';
   this.doRequest();
  };

 this.doPost = function(sUrl, sPostData, oHand, sFormat)
  {
   this.url = sUrl;
   this.handleResponse = oHand;
   this.responseFormat = sFormat || 'text';
   this.method = 'POST';
   this.postData = sPostData;
   this.doRequest();
  };
};

function NodeText(oNode)
{
 var s = oNode.text || oNode.textContent;

 if (s == undefined)
   s = '';

 return s;
}
