if( !window.XMLHttpRequest ) XMLHttpRequest = function()
{
  try{ return new ActiveXObject("Msxml2.XMLHTTP.6.0") }catch(e){}
  try{ return new ActiveXObject("Msxml2.XMLHTTP.3.0") }catch(e){}
  try{ return new ActiveXObject("Msxml2.XMLHTTP") }catch(e){}
  try{ return new ActiveXObject("Microsoft.XMLHTTP") }catch(e){}
  throw new Error("Could not find an XMLHttpRequest alternative.")
};

//
// Makes an AJAX request to a local server function w/ optional arguments
//
// functionName: the name of the server's AJAX function to call
// opt_argv: an Array of arguments for the AJAX function
//
function Request(function_name, opt_argv) {

  if (!opt_argv)
    opt_argv = new Array();
 
  // Find if the last arg is a callback function; save it
  var callback = null;
  var len = opt_argv.length;
  if (len > 0 && typeof opt_argv[len-1] == 'function') {
    callback = opt_argv[len-1];
    opt_argv.length--;
  }
  var async = (callback != null);
 
	// Build an Array of parameters, w/ function_name being the first parameter
	var params = new Array(function_name);
	for (var i = 0; i < opt_argv.length; i++) {
	  params.push(opt_argv[i]);
	}
	var body = JSON.stringify(params);


	// Create an XMLHttpRequest 'POST' request w/ an optional callback handler 
	var req = new XMLHttpRequest();
	req.open('POST', '/rpc', async);

	req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	req.setRequestHeader("Content-length", body.length);
	req.setRequestHeader("Connection", "close");
 

  if (async) {
    req.onreadystatechange = function() {
      if (req.readyState == 4)
	  {
        if (req.status == 200) 
		{
			var response = null;
	        try {
	         response = JSON.parse(req.responseText);
	        } catch (e) {
	         response = req.responseText;
	        }
			callback(response);
	    }
		else callback(null);
      }
  	}
  }
 
  // Make the actual request
  //req.send(null);
	req.send(body);
}

// Adds a stub function that will pass the arguments to the AJAX call 
function InstallFunction(obj, functionName) {
  obj[functionName] = function() { Request(functionName, arguments); }
}
