

var ajaxCallPending = false;
var xmlHttp = null;
var successFn = null;
var failureFn = null;


function getXmlHttpObject()
{
  try
  {
    // Firefox, Opera 8.0+, Safari
    xmlHttp = new XMLHttpRequest();
  }
  catch (e)
  {
    // Internet Explorer
    try
    {
      xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (e)
    {
      xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
  }
}
  
 
function packData(data)
{
  var result = "";
  var separator = ""; // "?"
  for (var key in data)
  {
    result += separator + key + "=" + escape(data[key]);
    separator = "&";
  }
  return result;
}
  

function unpackData(data)
{
  var unpacked = new Object();
  
  var separated = data.split("|");
  
  var i = 0;
  while (i < separated.length)
  {
    unpacked[separated[i]] = separated[i + 1];
    i += 2;
  }
  
  return unpacked;
}

    
function ajax(aData, aSuccessFn, aFailureFn)
{
  // Try and get an xml http object and stop concurrent calls
  getXmlHttpObject();
  if (!xmlHttp)
  {
    failureFn("No XML HTTP Object");
    return;
  }
  
  if (successFn || failureFn)
  {
    failureFn("Ajax call already outstanding");
    return;
  }
  
  successFn = aSuccessFn;
  failureFn = aFailureFn;
  
  // Pack data and add random parameter to prevent IE caching.
  var data = packData(aData) + "&rnd=" + (new Date()).getTime();
  
  ajaxCallPending = true;
  xmlHttp.onreadystatechange=xmlCallbackHandler;
  xmlHttp.open("POST", "/cgi-bin/ajax.cgi", true);
  xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  xmlHttp.setRequestHeader("Content-length", data.length);
  xmlHttp.setRequestHeader("Connection", "close");
  xmlHttp.send(data);
}
 
 
function xmlCallbackHandler()
{
  // readsState 0 = unsent
  // readyState 1 = open
  // readyState 2 = sent
  // readyState 3 = loading
  // readyState 4 = done
  if (xmlHttp.readyState == 4)
  {
    ajaxCallPending = false;
    if (xmlHttp.responseText.indexOf("PASS") == 0)
    {
      successFn(xmlHttp.responseText.substr(4));
    }
    else if (xmlHttp.responseText.indexOf("FAIL") == 0)
    {
      failureFn(xmlHttp.responseText.substr(4));
    }
    else
    {
      failureFn("Internal server error occurred" + xmlHttp.responseText);
    }
    successFn = null;
    failureFn = null;
  }
}


