// instanza di un oggetto XMLHttpRequest
var xmlHttp = createXmlHttpRequestObject();

// funzione per la creazione di un oggetti XMLHttpRequest
function createXmlHttpRequestObject()
{
  var xmlHttp;
  // dovrebbe funzionare per tutti i browsers ad eccezione di IE6 e precedenti
  try
  {
    // prova a creare un oggetto XMLHttpRequest
    xmlHttp = new XMLHttpRequest();
  }
  catch(e)
  {
    // IE6 o precedente
    var XmlHttpVersions = new Array('MSXML2.XMLHTTP.6.0',
                                    'MSXML2.XMLHTTP.5.0',
                                    'MSXML2.XMLHTTP.4.0',
                                    'MSXML2.XMLHTTP.3.0',
                                    'MSXML2.XMLHTTP',
                                    'Microsoft.XMLHTTP');
    // prova tutte le versioni fino a quella corretta
    for (var i=0; i<XmlHttpVersions.length && !xmlHttp; i++)
    {
      try

      {
        // prova a creare un oggetto XMLHttpRequest
        xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
      }
      catch (e) {}
    }
  }
  // restituisce l'oggetto creato o un messaggio di errore
  if (!xmlHttp)
    alert("Errore durante la creazione di un oggetto XMLHttpRequest.");
  else
    return xmlHttp;
}

// esegue la funzione passata per parametro con il risultato dell'interrogazione all'url passato per parametro
function process(indirizzo,parametri,funzione)
{
  // prosegue solo se xmlHttp non è nullo
  if (xmlHttp)
  {
    // tenta di connettersi al server
    try
    {
      // effettua la lettura dall'indirizzo
      xmlHttp.open("POST", indirizzo, true);
      xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      xmlHttp.setRequestHeader("Content-length", parametri.length);
      xmlHttp.setRequestHeader("Connection", "close");
      xmlHttp.onreadystatechange = gestCambStatoRequest;
      xmlHttp.send(parametri);
    }
    // messaggio di avviso nel caso di errore
    catch (e)
    {
      alert("Impossibile connettersi al server:\n" + e.toString());
    }
  }

  function gestCambStatoRequest()
  {
    // quando il readyState è 4, siamo in grado di leggere la risposta del server
    if (xmlHttp.readyState == 4)
    {
      // prosegue solo se lo status HTTP è 200=OK
      if (xmlHttp.status == 200)
      {
        try
        {
          // esegue la funzione passata per parametro
          funzione();
        }
        catch(e)
        {
          // messaggio di errore
          alert("Errore durante la lettura: " + e.toString());
        }
      }
      else
      {
        // messaggio di errore
        alert("Si sono verificati problemi durante la lettura del risultato:\n" +
              xmlHttp.statusText);
      }
    }
  }
}
