﻿

function HttpRequestManager()
{
    var This = this;

    // Data members
    This.ActiveXClsids = [
        'MSXML2.XMLHTTP.6.0',
        'MSXML2.XMLHTTP.4.0',
        'MSXML2.XMLHTTP.3.0',
        'MSXML2.XMLHTTP',
        'Microsoft.XMLHTTP'
    ];
    This.Clsid = null;

    // Methods
    This.CreateHandler = function()
    {
        var httpRequest = false;

        if (window.XMLHttpRequest)
        {
            httpRequest = new XMLHttpRequest();
            This.Clsid = 'XMLHttpRequest';
        }
        else if (window.ActiveXObject)
        {
            if (This.Clsid)
                return new ActiveXObject(This.Clsid);

            for (var i = 0; i < This.ActiveXClsids.length; i++)
            {
                try
                {
                    httpRequest = new ActiveXObject(This.ActiveXClsids[i]);
                    if (httpRequest)
                    {
                        This.Clsid = This.ActiveXClsids[i];
                        Debug.Trace('clsid: ' + This.Clsid);
                    }
                }
                catch (e)
                {
                }
            }
        }

        if (!httpRequest)
        {
            alert('Unable to create HttpRequest.');
            return false;
        }

        return httpRequest;
    }

}

var HttpRequests = new HttpRequestManager();


function HttpRequest(iAsynchronous)
{
    var This = this;

    // Data members
    This.RequestHandler = null; 
    This.Asynchronous = iAsynchronous;

    // Events
    This.OnLoad = new EventHandler();
    This.OnLoadFailure = new EventHandler();

    // Methods
    This.GetRequest = function(iUrl)
    {
        This.RequestHandler = HttpRequests.CreateHandler();
        This.RequestHandler.onreadystatechange = function() { This._StateChanged(iUrl); };
        This.RequestHandler.open('GET', iUrl, This.Asynchronous);
        This.RequestHandler.send(null);
        if (!This.Asynchronous)
            return This.RequestHandler.responseText;
    }

    This.PostRequest = function(iUrl, iData)
    {
        This.RequestHandler = HttpRequests.CreateHandler();
        This.RequestHandler.onreadystatechange = function() { This._StateChanged(iUrl); };
        This.RequestHandler.open('POST', iUrl, This.Asynchronous);
        This.RequestHandler.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        This.RequestHandler.setRequestHeader('Content-length', iData.length);
        This.RequestHandler.setRequestHeader('Connection', 'close');
        This.RequestHandler.send(iData);
        if (!This.Asynchronous)
            return This.RequestHandler.responseText;        
    }

    This._StateChanged = function(iUrl)
    {
        if (This.RequestHandler.readyState == 4)
        {
            Debug.Trace('[HttpRequest.OnLoad] ' + iUrl + ' status=' + This.RequestHandler.status);
            
            if (This.RequestHandler.status == 200)
                This.OnLoad.Invoke(iUrl, This.RequestHandler.responseText);
            else
                This.OnLoadFailure.Invoke(iUrl);
            
            This.RequestHandler.onreadystatechange = null;
            This.RequestHandler = null;                
        }
    }
}


function HttpVarSet(iData)
{
    var This = this;

    // Data members
    This.Vars = {};

    // Methods
    This.Set = function(iName, iValue)
    { This.Vars[iName] = iValue; }

    This.Get = function(iName)
    { return This.Vars[iName]; }

    This.Load = function(iData)
    {
        var pairs = iData.split('&');
        for (var i = 0; i < pairs.length; i++)
        {
            var pair = pairs[i].split('=');
            This.Vars[pair[0]] = pair[1];
        }
    }

    This.Clear = function()
    { This.Vars = {}; }

    This.ToString = function()
    {
        var data = '';

        for (var key in This.Vars)
        {
            if (data.length)
                data = data + '&';
            data = data + key + '=' + escape(This.Vars[key]);
        }

        return data;
    }
    
    // Initialize
    {
        if (iData)
        {
            if (typeof iData == "object")
                This.Vars = iData;
            else
                This.Load(iData);
        }
    }
}

