//----------------------------------------------------- HTTPRequest
function HTTPRequest(url, handler, postData){
  try{      
    if(postData!=undefined) this._postData = postData;
    this._url = url;
    this._handler = handler;
    if(typeof XMLHttpRequest == "undefined" && typeof ActiveXObject != "undefined"){
      XMLHttpRequest = function(){return (new ActiveXObject("MSXML2.XmlHttp"));};
    }  
    this._request = new XMLHttpRequest();

    var owner = this;
    this._request.onreadystatechange = function(e){
      if(owner._request.readyState == 4){
        // Avoid memory leak in MSIE and prevent infinte recursion in Firefox      
        owner._request.onreadystatechange = function(){} 
        try{
          // no error:
          if(owner._request.status == 200 || owner._request.status == 0){
            owner.requestTime = new Date() - owner.sendTime;
            owner._handler(owner._request.responseText, owner._request.responseXML, owner._request.status);
          }
          // http error:
          else{
            var message = "Problem retrieving the HTTPRequest ("+ owner._url + "): " +
                          owner._request.status+" " + owner._request.statusText +
                          "\n\nHere is the full response text:\n\n" +
                          owner._request.responseText;
            owner._handler(message, null, owner._request.status);
          }
        }
        catch(exception){
          owner._request.abort();
          throw(exception);
        }
      }
    }
    this.sendTime = new Date();
    if(this._postData != undefined){
      this._request.open("POST", url, true);
      this._request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    }
    else{
      this._request.open("GET", url, true);
      this._request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    }
    this._request.send(this._postData);
  }
  catch(exception){
    this._request.abort();
    throw(exception);
  }
}

/*
usage example:

if(get)
  new HTTPRequest("/query.xml?q=chaos&write=0", onRequestLoaded);

if(post)
  new HTTPRequest("/query.xml", onRequestLoaded, "q=chaos&write=0");

function onRequestLoaded(text, xml, status){
  alert(text);
  alert(xml.firstChild.nodeValue);
}
*/