
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';
  this.mimeType = null;


  this.init = function(){
    if (!this.req){
      try {
// Try to create object for Firefox, Safari, IE7, etc. 
        this.req= new XMLHttpRequest();
      } catch (e){
        try {
          // for Later IE version
	  this.req = new ActiveXObject('MSXML2.XMLHTTP'); 
        } catch (e){
          try {
	// Early IE
	    this.req = new ActiveXObject('Microsoft.XMLHTTP');
	  } catch (e){
	    return false;
	  }
	}
      }
    }
    return this.req;
  };

  this.doReq = function(){
    if (!this.init()) {
      alert('Could not create XMLHttpRequest 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');
    }
    if (this.mimeType){
      try {
        req.overrideMimeType(this.mimeType);
      } catch (e){
	// Can't override mime type -- IE6 or Opera?
      }
    }
    var self = this;
    var resp = null;
    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);
        }
      }
    };
    this.req.send(this.postData);
  };
 
  this.setMimeType = function(mimeType) {
    this.mimeType = mimeType;
  }; 

  this.handleErr = function(){
      alert(this.responseText
	+ '\n'
	+ 'Status Code: '+this.req.status + '\n'
	+ 'Status Description: ' + this.req.statusText);
   };


  this.setHandleErr = function(funcRef){
    this.handleErr = funcRef;
  }; 

  this.setHandleBoth = 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();
  };

  this.doPost = function(url, postData, hand, format){
    this.url = url;
    this.handleResp = hand;
    this.responseFormat = format || 'text';
    this.method = 'POST';
    this.postData = postData;
    this.doReq();
  }

}
