// Based on http://www.webpasties.com/xmlHttpRequest/
//      and http://www.w3.org/TR/XMLHttpRequest/

function getHttpObject()
{
  // Código específico para Internet Explorer que no soporta
  // el estándar XMLHttpRequest
  var xmlhttp;
  /*@cc_on
  @if (@_jscript_version >= 5)
    try {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (E) {
        xmlhttp = false;
      }
    }
  @else
    xmlhttp = false;
  @end @*/

  // Resto de navegadores que sí soportan XMLHttpRequest
  if (!xmlhttp && typeof XMLHttpRequest != 'undefined')
  {
    try {
      xmlhttp = new XMLHttpRequest();
    } catch (e) {
      xmlhttp = false;
    }
  }

  return xmlhttp;
}

// Petición síncrona, el navegador se queda esperando y el JavaScript no se sigue ejecutando
// hasta que no reciba la respuesta. La respuesta del servidor es devuelta por la función.
function sjax(url, query)
{
  var sxmlhttp = getHttpObject();
  if (!sxmlhttp) return false;

  sxmlhttp.open('POST', url, false);
  sxmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  sxmlhttp.send(query);
  return sxmlhttp.responseText;
}

// Para peticiones asíncronas necesitamos que la variable en la que se guarda el objeto
// XMLHttpRequest sea una variable global para que la función que maneja el evento
// pueda accederlo, aunque supongo que también podríamos usar el parametro Event del
// handler para accederlo (véase:
//                    http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-Event
//                    https://developer.mozilla.org/en/DOM/event )
//var xmlhttp;

// Petición asíncrona, el script sigue ejecutándose y la petición se realiza asíncronamente
// en segundo plano.
// Como segundo parámetro de la función se le pasa la función que manejará el evento
// ReadyStateChange cuando se reciba la respuesta del servidor.
function ajax(url, query, handler)
{
  var xmlhttp = getHttpObject();
  if (!xmlhttp) return false;

  xmlhttp.open('POST', url, true);
  xmlhttp.onreadystatechange = handler;
  xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  xmlhttp.send(query);
  return xmlhttp;
}

// Ejemplo de función que maneja el evento XMLHTTPRequest.ReadyStateChange
// Para asociar este evento con la petición AJAX haríamos algo así como
//   ajax("parametro1=valor1&parametro2=valor2...", get_ajax_response);
/*function get_ajax_response()
{
  if ((xmlhttp.readyState == 4) && (xmlhttp.status == 200) && (xmlhttp.responseText != null))
    return xmlhttp.responseText;
  else
    return false;
}*/

// End of code based on http://www.webpasties.com/xmlHttpRequest/
//                  and http://www.w3.org/TR/XMLHttpRequest/
