/* Only one xmlhttprequest so only one request at a time... Something to think about... */
var i_requester = false;
var i_callback = 0;

var i_queryBuffer = new Object();
var i_queryInProgress  = 0;
var i_bufferLast = 0;
var i_bufferNext = 0;
var i_queryOnBuffer = 0;

function http_readystatehandler()
{
  if ( i_requester.readyState == 4 && i_requester.status == 200 )
  {  
    if ( typeof i_callback == "function" )
      i_callback( eval( i_requester.responseText ) );


    if ( i_bufferNext > i_bufferLast )
    { 
      i_queryOnBuffer=1;
      http_request_withhandler( i_queryBuffer[ "q" + ( i_bufferLast ) ].request, 
                                i_queryBuffer[ "q" + ( i_bufferLast ) ].args, 
                                i_queryBuffer[ "q" + ( i_bufferLast ) ].callback, 
                                i_queryBuffer[ "q" + ( i_bufferLast ) ].handler );
      i_bufferLast++;
    }
    else
      i_queryInProgress = 0;
  }
} // http_readystatehandler

/* Functions to call... */
function http_request_withhandler( request, args, callback, handler )
{
// alert(request);
  if ( i_queryInProgress && !i_queryOnBuffer )
  {
    i_queryBuffer[ "q" + i_bufferNext ] = new Object();
    i_queryBuffer[ "q" + i_bufferNext ].request = request;
    i_queryBuffer[ "q" + i_bufferNext ].args = args;
    i_queryBuffer[ "q" + i_bufferNext ].callback = callback;
    i_queryBuffer[ "q" + i_bufferNext ].handler = handler;
    i_bufferNext++;
    return;
  }


  i_queryInProgress = 1;
  i_queryOnBuffer = 0;

  if ( i_requester )
  {
    i_callback = callback;
    i_requester.abort(); // For IE...
    i_requester.onreadystatechange = http_readystatehandler;
    i_requester.open( "POST", "http://" + window.location.hostname + "/requesthandler.php", true );
    i_requester.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded" );
    i_requester.send( "request=" + request + "&args=" + args + "&handler=" + handler );
  }
} // http_request
function http_request( request, args, callback )
{
  http_request_withhandler( request, args, callback, "none" );
} // http_request_withhandler

/*@cc_on
@if ( @_jscript_version >= 5 )
  try
  {
    i_requester = new ActiveXObject( "Msxml2.XMLHTTP" );
  }
  catch (e)
  {
    try
    {
      i_requester = new ActiveXObject( "Microsoft.XMLHTTP" );
    }
    catch (E)
    {
      i_requester = false;
    }
  }
@else
    i_requester = false;
@end @*/

if (!i_requester && typeof XMLHttpRequest != 'undefined')
{
  try
  {
    i_requester = new XMLHttpRequest();
  }
  catch (e)
  {
    i_requester = false;
  }
}
