// JavaScript Document
  function retrieveData(requestURL, requestMethod, requestAsynchronous, requestData, returnFunction){
      // Inicializa a variável http_request como falsa, ou seja, na dúvida presumimos que não conseguiremos realizar uma requisição
      http_request = false;
      // Testes de compatibilidades de browser
      if (window.XMLHttpRequest) // Mozilla, Firefox, Safari
      {
      http_request = new XMLHttpRequest();
      if (http_request.overrideMimeType) // Definimos o cabeçalho da resposta como sendo text/xml, pois algumas versões dos browsers Mozilla exigem este mimetype
      {
      http_request.overrideMimeType('text/xml');
      }
      }
      else if (window.ActiveXObject) // Internet Explorer
      {
      try
      {
      http_request = new ActiveXObject("Msxml2.XMLHTTP") // Versão 6
      }
      catch(e)
      {
      try
      {
      http_request = new ActiveXObject('Microsoft.XMLHTTP') // Versão 5.5
      }
      catch(e)
      {
      }
     }
    }
    
	if (!http_request) // http_request continua sendo false, ou seja, não conseguimos implementar nenhum dos casos acima
    {
    alert('Não foi possível processar a requisição HTTP.');
    }
    // Usamos um eval para executar a função passada como returnFunction
    eval('http_request.onreadystatechange = ' + returnFunction + ';');
    // Abrimos a requisição, usando os parâmetros passados para a função
    http_request.open(requestMethod, requestURL, requestAsynchronous);
    // adicionado por tobia: envia cabeçalho para o servidor identificar que é ajax
    http_request.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
    // Setamos o content-type da requisição. 
	//Este content-type é obrigatório quando estamos postando dados de um form e não faz diferença em caso contrário
    http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    // Enviamos a requisição com os dados
    http_request.send(requestData);
  }		