function XMLRequest() {}

XMLRequest.sending = false;

XMLRequest.stack = new Array();

XMLRequest.request = null;

XMLRequest.create = function () {

    if(window.XMLHttpRequest)
    {
        XMLRequest.request = new XMLHttpRequest();
    }
    else if(window.ActiveXObject)
    {
        var objects = new Array('Microsoft.XMLHTTP', 'Msxml2.XMLHTTP', 'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP.4.0', 'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.7.0');

        for(var i = 0, len = objects.length; i < len; i++)
        {
            try
            {
                XMLRequest.request = new ActiveXObject(objects[i]);

                break;
            }
            catch(e)
            {
                XMLRequest.request = null;
            }
        }
    }
}

XMLRequest.timeout = -1;

XMLRequest.send = function(url, callbackFunction) {

    if(XMLRequest.request == null)
       XMLRequest.create();

    XMLRequest.stack[XMLRequest.stack.length] = new Array(url, callbackFunction);

    if(!XMLRequest.sending) XMLRequest.sendNext();
}

XMLRequest.sendNext = function() {

    if(XMLRequest.stack.length == 0) return;

    XMLRequest.sending = true;

    var re     = new RegExp("http:\/\/[^\/]+\/");
    var domain = re.exec(document.location.href);
    var parts  = XMLRequest.stack[0][0].split("?");
    var query  = (parts.length == 1 ? "" : parts[1]);

    if(XMLRequest.request == null) XMLRequest.create(); 

    XMLRequest.request.open("POST", (re.exec(parts[0]) == null ? domain : "") + parts[0], true);

    XMLRequest.request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
    XMLRequest.request.onreadystatechange = XMLRequest.complete;
    XMLRequest.request.send(query + "&rand=" + Math.random().toString());

    XMLRequest.timeout = setTimeout("XMLRequest.abort()", 10000);
}

XMLRequest.complete = function () {

    if(XMLRequest.request.readyState == 4)
    {
        clearTimeout(XMLRequest.timeout);

        if(XMLRequest.request.status == 200)
        {
            if(XMLRequest.request.responseText)
                XMLRequest.stack[0][1](XMLRequest.request.responseText);
        }

        XMLRequest.stack.shift();

        if(XMLRequest.stack.length > 0)
            setTimeout("XMLRequest.sendNext()", 500);
        else XMLRequest.sending = false;
    }
}

XMLRequest.abort = function () {

    XMLRequest.request.abort();

    setTimeout("XMLRequest.sendNext()", 2000);
}
