
////////////////////////////////////////////////////////////////////////////////////////////////////
// Creates an instance of an HttpRequest object
////////////////////////////////////////////////////////////////////////////////////////////////////
function CreateHttpRequest()
{
    var httpRequest = false;

    if (window.XMLHttpRequest)
    	httpRequest = new XMLHttpRequest();
    else if (window.ActiveXObject)
    {
        try
        { httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); }
        catch (e)
        {
            try
            { httpRequest = new ActiveXObject("Msxml2.XMLHTTP"); }
            catch (e)
            { }
        }
    }

    if (!httpRequest)
    {
        alert('Unable to create HttpRequest.');
        return false;
    }

    return httpRequest;
}


////////////////////////////////////////////////////////////////////////////////////////////////////
// HttpRequestHandler constructor
////////////////////////////////////////////////////////////////////////////////////////////////////
function HttpRequestHandler(iAsynchronous, iEventHandler)
{
    var self = this;

    self.httpRequest = CreateHttpRequest();
    self.asynchronous = iAsynchronous;

    self.getContent = function(iUrl, iContentType)
        {
            var httpRequestHandler = self;           
            
            self.httpRequest.onreadystatechange = function()
                {
                    httpRequestHandler._onContentLoaded(iUrl, iContentType);
                }
            
            if (self.httpRequest.overrideMimeType && iContentType)
                self.httpRequest.overrideMimeType(iContentType);

            self.httpRequest.open('GET', iUrl, self.asynchronous);
            
            self.httpRequest.send(null);
            
            if (!self.asynchronous && iContentType)
            {
                if (iContentType == 'text/xml')
                    return self.httpRequest.responseXML;
                else if (iContentType.startsWith('text/'))
                    return self.httpRequest.responseText;
            }
        }

    self.getText = function(iUrl)
        {
            self.getContent(iUrl, 'text/plain');
        }

    self.getXML = function(iUrl)
        {
            self.getContent(iUrl, 'text/xml');
        }

    self.post = function(iUrl, iData, iContentType)
        {
            var httpRequestHandler = self;
            
            self.httpRequest.onreadystatechange = function()
                {
                    httpRequestHandler._onContentLoaded(iUrl, iContentType);
                }
            
            if (self.httpRequest.overrideMimeType)
                self.httpRequest.overrideMimeType(iContentType);
        
            self.httpRequest.open('POST', iUrl, self.asynchronous);
            self.httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            self.httpRequest.setRequestHeader('Content-length', iData.length);
            self.httpRequest.setRequestHeader('Connection', 'close');
            self.httpRequest.send(iData);
        }

    self._onContentLoaded = function(iUrl, iContentType)
        {
            if (self.httpRequest.readyState == 4)
            {
                if (self.httpRequest.status == 200)
                {
                    var content = null;
                    
                    if (iContentType)
                    {
                        if (iContentType == 'text/xml')
                            content = self.httpRequest.responseXML;
                        else if (iContentType.startsWith('text/'))
                            content = self.httpRequest.responseText;
                    }

                    self.onContentLoaded(iUrl, content);
                }
                else
                    alert('Unable to load '+iUrl+', error code:'+self.httpRequest.status);
             }        
        }

    if (iEventHandler)
    {
        if (typeof iEventHandler == "object")
            self.onContentLoaded = iEventHandler.invoke;
        else
            self.onContentLoaded = iEventHandler;
    }
    else
        self.onContentLoaded = null;
}
