function ICAJAX(o) {
  
  this.url="";
  this.method="get";
  this.onComplete=null;  
  this.onError=null;
  this.data=null;
  this.xtra=null;
  
  //send AJAX request. Parameter o is options: {url, method, onComplete, onError, data (for post)}
  this.send = function(o) {
    this.createRequest(o).send(o && o.data?o.data:null);
  };
  
  this.createRequest=function(o) {
    
    var me=this;
    
    this.$setOpt(o);
    
    var req = createXMLHttp();
    
    req.open(this.method, this.url, true);          
    req.onreadystatechange=function() {
      if(req.readyState==4) {
        if(req.status==200 || req.status==304) {
          if(me.onComplete)me.onComplete(req);
        } else {
          if(me.onError)me.onError(req);
        }
      }
    };
    
    if(this.method.toLowerCase()=="post") {
      req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    }    
    
    return req;
    
  };
  
  //create AJAX request
  function createXMLHttp() {
    if (typeof XMLHttpRequest != "undefined") { //for mozilla
      return (new XMLHttpRequest());
    } else {
      var arrObj=["MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0",
        "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp", "Microsoft.XMHttp"];
      var req=null;
      for (var i=0;i<arrObj.length;i++) {
        try {
          req=new ActiveXObject(arrObj[i]);
          return req;
        } catch (e) { }
      }
    }  
  };
  
  //set options to this object
  this.$setOpt=function (o) {
    if(!o)o={};
    if(o.method) this.method=o.method;
    if(o.onComplete) this.onComplete=o.onComplete;
    if(o.onError) this.onError=o.onError;
    if(o.url) this.url=o.url;
    if(o.data) this.data=o.data;    
    if(o.xtra) this.xtra=o.xtra;    
  };
  
  this.$setOpt(o);
  
  return this;

};
