stack = new Array();

function ajax(url, data, timeout, returncallback, errorcallback) {
    if (url != null && url != undefined) {
        var ajax = new Object();
        var timer = new Date();
        ajax.url = url;
        ajax.timeout = timeout;
        ajax.returncallback = returncallback;
        ajax.errorcallback = errorcallback;
        ajax.startTime = timer.getTime();
        ajax.instance = null;
        if (window.XMLHttpRequest) {
            ajax.instance = new XMLHttpRequest();
        }
        else {
            try {
                ajax.instance = new ActiveXObject('Msxml2.XMLHTTP');
            }
            catch(e) {
                try {
                    ajax.instance = new ActiveXObject("Microsoft.XMLHTTP");
                }
                catch(e) {
                    ajax.instance = null;
                }
            }
        }
        if (ajax.instance) {
            if (data != null && data.replace(/^\s+|\s+$/g, "") != "") {
                ajax.instance.open("POST", url, true);
                ajax.instance.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
            }
            else {
                ajax.instance.open("GET", url, true);
            }
            ajax.instance.send(data);
            stack.push(ajax);
        }
        else {
            if (errorcallback) {
                errorcallback("This browser does not support AJAX.");
            }
            ajax = null;
        }
    }
}

function processStack() {
    var ajax = new Object();
    var timer = new Date();
    var elapsedTime;
    for(i = stack.length; i > 0; i--) {
        ajax = stack.shift();
        elapsedTime = timer.getTime() - ajax.startTime;
        if(ajax.instance.readyState == 4) {
            if(ajax.instance.status == 200) {
                if (ajax.returncallback) {
                    ajax.returncallback(ajax.instance);
                }
            } else {
                if (ajax.errorcallback) {
                    ajax.errorcallback("Request returned an unexpected status : " + ajax.instance.status);
                }
            }
            ajax.instance.abort();
            ajax.instance = null;
            ajax = null;
            continue;
        } 
        if (ajax.timeout != null && timeout.replace(/^\s+|\s+$/g, "") != "" && elapsedTime > ajax.timeout) {
            if (ajax.errorcallback) {
                ajax.errorcallback("Request timeout");
            }
            ajax.instance.abort();
            ajax.instance = null;
            ajax = null;
            continue;
        }
        stack.push(ajax);
    }
    setTimeout("processStack()",10);
}

setTimeout("processStack()",500);