function Ajax() {
  this.req = 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.handleResp = null;
  this.responseFormat = 'text', // 'text', 'xml' or object
  this.mimeType = null;
  this.setMimeType = function(mimeType) {
    this.mimeType = mimeType;
  };
  this.init = function() {
        if (!this.req) {
          try {
            //Try to create object for firefox / safari etc
            this.req = new XMLHttpRequest();
          }
          catch (e) {
            try {
              //try to create object for later versions of IE
              this.req = new ActiveXObject("MSXML2.XMLHTTP");
            }
            catch(e) {
                try {
                //try to create object for earlier versions of IE
                    this.req = new ActiveObject('Microsoft.XMLHTTP');
            } catch (e) {
              //could not create the object so return false
              return false;
            }
          }
        }
  }
  return this.req;
};


this.doReq = function() {
  if (!this.init()) {
    alert("Could not create XMLHttp Object");
    return;
  }
  this.req.open(this.method, this.url, this.async);
  if (this.method == "POST") {
    this.req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    this.req.setRequestHeader("Content-length", this.postData.length);
    this.req.setRequestHeader("Connection", "close");
  }
  if (this.mimeType) {
        try {
          req.overrideMimeType(this.mimeType);
        }
        catch (e) {
          //could not override mime type, opera or IE6?
        }
  }
  var self = this;
  this.req.onreadystatechange = function() {
    if (self.req.readyState == 4) {
        switch(self.responseFormat) {
            case 'text':
                resp = self.req.responseText;
                break;
            case 'xml':
                resp = self.req.responseXML;
                break;
            case 'object':
                resp = req;
                break;
        }
        if (self.req.status >= 200 && self.req.status <= 299) {
            self.handleResp(resp);
        } else {
            self.handleErr(resp);
        }
    }
  };
  try {
    this.req.send(this.postData);
    } catch (e) {
      alert("there is an error with the req send");
    }
};


this.handleErr = function() {
  var errorWin;
  try {
    errorWin = window.open('', 'errorWin');
    errorWin.document.body.innerHTML = this.responseText;
  }
  catch (e) {
    alert ('An error has occured, but the error message cannot be'
    + 'displayed. This is probably because of your browser\'s '
    + 'popup blocker.\n'
    + 'Please allow popups from this web site if you want to '
    + 'see the full error messages.\n'
    + 'Status code: ' + this.req.status + '\n'
    + 'Status description: ' + this.req.statusText
    + ' URL: ' + this.url);
  }
};

this.setHandlerBoth = function(funcRef) {
  this.handleResp = funcRef;
  this.handleErr = funcRef;
};

this.abort = function() {
  if (this.req) {
    this.req.onreadystatechange = function () {};
    this.req.abort();
    this.req = null;
  }
};

this.doGet = function(url, hand, format) {
  this.url = url;
  this.handleResp = hand;
  this.responseFormat = format || 'text';
  this.doReq();
};

}
