function HttpRequest() {
  // PRIVATE VARIABLES;
  var httpRequest = null;

  // CONSTRUCTOR
  try {
    httpRequest = new XMLHttpRequest();
    if (httpRequest.overrideMimeType) httpRequest.overrideMimeType('text/xml');
  } catch (e) {
    try { httpRequest = new ActiveXObject("Msxml2.XMLHTTP"); }
    catch (e) {
        try { httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); }
        catch (e) { 
          //alert('HttpRequest Failed:\n' + errMsg);
        }
    }
  }
  // PUBLIC FUNCTIONS
  this.getRequest = function() {
    return httpRequest;
  }
  this.getXml = function(method, url, func, data) {
    if (httpRequest == null) return;
    getContent(method, url, func, data, false);
  }
  this.getText = function(method, url, func, data) {
    if (httpRequest == null) return;
    getContent(method, url, func, data, true);
  }

  // PRIVATE FUNCTIONS
  function getContent(method, url, func, data, text) {
    method = method.toUpperCase()
    httpRequest.onreadystatechange = processContent;
    httpRequest.open(method, url, true);
    if (method == 'POST') {
      httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      httpRequest.setRequestHeader('Content-length', data.length);
      httpRequest.setRequestHeader('Connection', 'close');
      httpRequest.send(data);
    } else {
      httpRequest.send(null);
    }
    function processContent() {
      if (httpRequest.readyState != 4) return;
      if (httpRequest.status == 200) {
        if (text) {
          func(httpRequest.responseText);
        } else {
          func(httpRequest.responseXML);
        }
      } else {
        func(null);
      }
    }
  }
}
