
    function GetXHR()
    {
        var xmlhttp = false;
        if (window.XMLHttpRequest)
            xmlhttp = new XMLHttpRequest();
        else
        {
            try
            {
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch(e)
            {
                xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
            }
        }
        return xmlhttp;
    }

    var InRequest = false;
    
    function XHRRequester(pURL, pKVPDataObject, pProgressCallback, pCompletedCallback)
    {
        var XHR = GetXHR();
        var KVPDataObject = pKVPDataObject;
        var ProgressCallback = pProgressCallback;
        var CompletedCallback = pCompletedCallback;

        this.MakeRequest = function()
        {
            var force_this_request = false;
            if (arguments.length > 0 && 1 == arguments[0])
            {
                force_this_request = true;
            }
            if (force_this_request || !InRequest)
            {
                var URL = pURL;
                if (KVPDataObject != null && KVPDataObject.length > 0)
                {
                    URL += "?";
                    var elm = null;
                    for (var i = 0; i < KVPDataObject.length; i++)
                    {
                        elm = KVPDataObject[i];
                        URL += (elm[0] + "=" + elm[1]);
                        if ((KVPDataObject.length - 1) > i)
                        {
                            URL += "&";
                        }
                    }
                }
                var dt = new Date();
                XHR.open("GET", URL + "&" + dt.getTime() + "=" + dt.getTime(), true);
                XHR.onreadystatechange = function()
                {
                    if (XHR.readyState == 1)
                    {
                        InRequest = true;
                        pProgressCallback();
                    }
                    else if (XHR.readyState == 4 && XHR.status == 200)
                    {
                        var obj = null;
                        try
                        {
                            obj = eval("obj = " + XHR.responseText);
                        }
                        catch (exp)
                        {
                            obj = null;
                            throw "Eval Error : URL = [" + URL + "] : " + exp;
                        }
                        InRequest = false;
                        if (obj != null)
                            pCompletedCallback(obj);
                    }
                }
                XHR.send(null);
            }
        }
    }