
/* Ajax controller
 ******************************************************************************/
function Ajax(url, options) {
  var self = this;                              //referencia interna ao objeto (para uso em sub-objetos)
  self.options    = options || {};              //opcoes de configuracao
  self.postBody   = options.postBody || '';     //parametros para requisicao via post
  self.method     = options.method || 'post';   //metodo da requisicao ('get' ou 'post')
  self.onComplete = options.onComplete || null; //funcao chamada ao terminar a requisicao
  self.onError    = options.onError || null;    //funcao chamada se expirar o timeout da requisicao
  self.timeout    = options.timeout || 5000;    //timeout limite da requisicao
  self.transport  = null;                       //objeto que contem o XMLHttpRequest()
  self.timer      = null;                       //contador para controlar o timeout da requisicao

  self.init = function() {
    self.transport = self.getTransport();
    self.request(url);
  }

  self.request = function(url) {
    self.timer = setTimeout(self.setError, self.timeout);
    self.transport.open(self.method, url, true);
    self.transport.onreadystatechange = self.onStateChange;
    if (self.method == 'post') {
      self.transport.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
      if (self.transport.overrideMimeType) self.transport.setRequestHeader('Connection', 'close');
    }
    self.transport.send(self.postBody);
  }

  self.onStateChange = function() {
    if (self.transport.readyState == 4 && self.transport.status == 200) {
      if (self.timer) clearTimeout(self.timer);
      if (self.onComplete) setTimeout(function(){self.onComplete(self.transport);}, 10);
      self.transport.onreadystatechange = function(){};
    }
  }

  self.setError = function() {
    if (self.transport) self.transport.abort();
    if (self.onError) setTimeout(function(){self.onError();}, 10);
  }

  self.getTransport = function() {
    if (window.XMLHttpRequest) return new XMLHttpRequest();
    else if (window.ActiveXObject) return new ActiveXObject('Microsoft.XMLHTTP');
    else return false;
  }

  self.init();
}
