function Ajax() {
		
  // Atributos do objeto Ajax
  erro = null;
  method = null;
  mode = null;
  parameters = null;
  receptor = null;
  url = null;
  retryTime = null;
  requesting = null;
  retryTimer = null;
  connection = false;
		
  // Adiciona parametros a serem enviados na requisição
  this.addParam = function(name, arg) {
  	document.title = "2";
  	var wf = new WebFormat();
    if (!wf.isUTF8(name)) {
      erro = name + " não é um nome válido para a criação do parametro\nUtilize somente letras e números";
	  return false;
	}
	wf = null;
	document.title = "3";
	if (arg.isWhite()) {
	  erro = "O valor do parametro " + name + " não podem ser vazio";
	  return false;
	}
	document.title = "4";
	if (parameters != null) parameters += "&" + name + "=" + arg;
	else parameters = name + "=" + arg;
	document.title = "5";
	return true;
  }
		
		// Configura e recebe a resposta da requisição
  this.open = function(config) {
  	document.title = "8";
    if (erro != null) return false;
	
    if (isVoid(config.method)) {
      erro = "Método de envio não especificado";
	  return false;
	} 
	document.title = "9";
	if (config.method.toUpperCase() != "GET" && config.method.toUpperCase() != "POST") {
	  erro = config.method + " não é um método válido";
	  return false;
	}
	document.title = "10";
	if (isVoid(config.mode)) {
	  erro = "Modo de envio não especificado";
	  return false;
	}
	document.title = "11";
	if (config.mode != true && config.mode != false) {
	  erro = config.mode + " não é um modo válido";
	  return false;
	}
	document.title = "12";
	if (isVoid(config.receptor)) {
	  erro = "Uma função de recepção deve ser setada";
	  return false;
	}
	document.title = "13";		
	if (isVoid(config.url)) {
	  erro = "Defina a url do documento alvo";
	  return false;
	}
	document.title = "14 - "+config.retry;
	if (isVoid(config.retry+"")) {
	  retryTime = 10000;
	  return false;
	} else {
      if (config.retry/config.retry == 1 && config.retry > 0) retryTime = parseInt(config.retry);
      else {
	    erro = "O tempo de retry deve ser um valor inteiro positivo";
	    return false;
      }
	}
	document.title = "15";
	if (!isVoid(config.loading)) 
	  config.loading = config.loading.replace("()","")
	document.title = "16";
	method = config.method;
	mode = config.mode;
	receptor = config.receptor.replace("()","");
	url = config.url;
	loading = config.loading;
			
	var resp = this.requester();
			
	return resp;
  }
		
  this.retry = function() {
  	retryTimer = null;
    if (requesting) {
	  if (connection) connection.abort();
		this.requester();
	}
  }
		
  // Faz a requisição
  this.requester = function() {
	var ti;
	document.title = "17";
	/*@cc_on
	  @if (@_jscript_version >= 5)
		try {	connection = new ActiveXObject("Msxml2.XMLHTTP");	} 
		catch (e){
		  try {	connection = new ActiveXObject("Microsoft.XMLHTTP"); }
		  catch (e2){}
		}
	  @end
	@*/
	document.title = "18";
	if (!connection && typeof connection != "undefined") connection = new XMLHttpRequest();
	document.title = "19";
	if (!connection) {
	  erro = "Seu browser não suporta o objeto XMLHTTP";
	  return false;
	}
    document.title = "20";
	if (parseInt(connection.readyState) == 0) {
	  document.title = "21";
	  if (method == "GET") {
	  	document.title = "22";
	    if (parameters != null) url += "?" + parameters;
	      document.title = "23a";
		  ti = new Date().getTime();
		  connection.open(method, url, mode);
		  connection.send(null);
	  } else {   
	    if (method == "POST") {
		  	document.title = "23b";
		    ti = new Date().getTime();
			connection.open(method, url, mode);
			connection.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
			connection.setRequestHeader("Cache-Control", "no-store, no-cache, must-revalidate");
			connection.setRequestHeader("Cache-Control", "post-check=0, pre-check=0");
			connection.setRequestHeader("Pragma", "no-cache");
			connection.send(parameters);
	    }
	  }
        document.title = "24";
		requesting = true;
		retryTimer = setInterval("function(){alert('retry');this.retry();}",retryTime);
		var w = loading;
		var r = receptor;
		
		if (w != null) eval(w + "(\"show\")");
		document.title = "25 - "+connection;
		
		connection.onreadystatechange = function() {
		  document.title = "26 - "+connection.readyState;	
		  if (connection.readyState == 4) {
		    document.title = "27";						
		  }
		};
		
		for (p in connection) {
			try {
			  $("log").innerHTML += "connection["+p+"] = " + connection[p] + "<br />";
			} catch (e) {
			  $("log").innerHTML += "connection["+p+"] = CRASH! (" + e + ")<br />";
			}
		}
				
	  } else {
		erro = "Impossível completar operação pois este objeto Ajax já está em uso";
        connection = null;
		return false;
	  }
	
	connection = null;
    erro = "Erro desconhecido";
	return false;
			
  }
  
  this.process = function() {
	  document.title = "26 - "+connection.readyState;	
	  if (connection.readyState == 4) {
	  	document.title = "26";
					
	    requesting = false;
		var tf = new Date().getTime();
		var tLapsed = tf - ti;

		if (w != null) eval(w + "(\"hide\")");
	
		if (connection.status == 200) {
	      document.title = "27";
	      if (connection.responseXML) {	
	      	document.title = "28";			
			var container = {
			  status: true,
			  responseType: "xml",
			  response: connection.responseXML,
			  timeLapsed: tLapsed,
			  isValidResponse: function() { return status; }
			}
			
			eval(r + "(container)");
			connection = null;
			return true;
							
		  } else {
			
		    if (connection.responseText) {	
			  var container = {
			    status: true,
				responseType: "text",
				response: connection.responseText,
				timeLapsed: tLapsed,
				isValidResponse: function() { return status; }
			  }
								
			  eval(r + "(container)");
			  connection = null;
			  return true;
								
			} else {
			  app.logEvent("no response");
								
			  var container = {
			    status: false,
				erro: "A conexão não retornou nenhuma resposta",
				isValidResponse: function() { return status; },
				getErro: function() { return erro; }
			  }
								
			  eval(r + "(container)");
			  connection = null;
			  return false;
			}
		  }
			
		} else {
		  var container = {
		    status: 0,
			erro: connection.status,
			isValidResponse: function() { return status; },
			getErro: function() { return erro; }
		  }

		  eval(r + "(container)");
		  connection = null;
		  return false;
		}
	    this.close();
					
	  }
  }
		
  // Retorna um erro quando houver
  this.getErro = function() {
    return erro;
  }
		
  // Destroi as propriedades do objeto Ajax
  this.close = function() {
			
    erro = null;
	method = null;
	mode = null;
	parameters = null;
	returnFunction = null;
	url = null;
			
  }
  
}