/* --------------------- Copyright Marcin Zadęcki - WSZYSTKIE PRAWA ZASTRZEŻONE --------------------- */
/* ---------- Wykorzystywanie całości lub fragmentów kodu wyłącznie za zgodą Marcin Zadęcki --------- */
function XHclient() { }
XHclient.prototype = {
    XH_ASYNC            : true,
	XH_TIMEOUT_LIMIT    : 10000,
    XH_OBJ              : false,
	XH_ABORTED          : false,
	XH_TIMEOUT_ID       : null,
    XH_READY_STATE_FUNC : null,
    XH_SHOW_ERR         : false,
    XH_XML_FORMAT       : true,
    XHerror: function(oErr, sFunc)
    {
        if(!this.XH_SHOW_ERR) return false;
        var sErr = 'UWAGA BŁˇD!\n\n';
        if(sFunc) sErr += 'Function: '+sFunc+'\n';
        sErr += 'Message: '+oErr.message+'\n';
        sErr += 'File Name: '+oErr.fileName+'\n';
        sErr += 'Line Number: '+oErr.lineNumber+'\n';
        sErr += 'Description: '+oErr.description+'\n';
        sErr += 'Name: '+oErr.name+'\n';
        sErr += 'Number: '+oErr.number+'\n';
        return alert(sErr);
    },
    XHinit: function()
    {
        if(this.XH_ABORTED) return false;
        if(window.ActiveXObject)
        {
            var aMsxml = ['Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.7.0', 'Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP'];
            for(var i = 0; i < aMsxml.length; i++)
            {
                try
                {
                    this.XH_OBJ = new ActiveXObject(aMsxml[i]);
                    return true;
                }
                catch(e) {}
            }
        }
        else if(window.XMLHttpRequest)
        {
            try
            {
                this.XH_OBJ = new XMLHttpRequest();
                if(this.XH_XML_FORMAT && this.XH_OBJ.overrideMimeType)
                    this.XH_OBJ.overrideMimeType('text/xml');
                return true;
            }
            catch(e)
            {
                if(this.XH_SHOW_ERR) this.XHerror(e, 'XHinit');
                else                 return false;
            }
        }
        return false;
    },
    XHload: function(sURL, sMethod, sVars, func)
    {
        if(this.XH_ABORTED) return false;
        if(!this.XH_OBJ)    this.XHinit();
        if(!this.XH_OBJ)    return false;
        this.XH_READY_STATE_FUNC = func;
        sMethod = sMethod.toUpperCase();
        try
        {
            var oSelf = this;
            if(this.XH_ASYNC)
                this.XH_OBJ.onreadystatechange = function() { oSelf.XHcallBack(); };
            else
                this.XH_OBJ.onreadystatechange = function() {  };
            if(sMethod == 'GET' || sMethod == 'HEAD')
            {
                this.XH_OBJ.open(sMethod, sURL+'?'+sVars, this.XH_ASYNC);
                if(this.XH_XML_FORMAT)
                    this.XH_OBJ.setRequestHeader('Content-Type', 'text/xml');
                sVars = '';
            }
            else if(sMethod == 'POST')
            {
                this.XH_OBJ.open(sMethod, sURL, this.XH_ASYNC);
                this.XH_OBJ.setRequestHeader('Method', 'POST '+sURL+' HTTP/1.1');
                this.XH_OBJ.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            }
            this.XH_OBJ.send(sVars);
            if(!this.XH_ASYNC)
            {
                var oTimeOutCheck  = this;
                this.XH_TIMEOUT_ID = window.setTimeout(function() { oTimeOutCheck.XHabort(); }, this.XH_TIMEOUT_LIMIT);
                this.XHcallBack();
            }
        }
        catch(e)
        {
            if(this.XH_SHOW_ERR) this.XHerror(e, 'XHload');
            else                 return false;
        }
        return;
    },
    XHcallBack: function()
    {
        if(this.XH_ABORTED) return false;
        try
        {
            if(this.XH_OBJ.readyState == 4)
            {
                if(this.XH_READY_STATE_FUNC) this.XH_READY_STATE_FUNC(this);
                if(!this.XH_ASYNC)           window.clearTimeout(this.XH_TIMEOUT_ID);
            }
        }
        catch(e)
        {
            if(this.XH_SHOW_ERR) this.XHerror(e, 'XHcallBack');
            else                 return false;
        }
        return;
    },
	XHcallInProgress: function() 
    {
        switch(this.XH_OBJ.readyState)
        {
            case 1:
            case 2:
            case 3:
                return true;
                break;
            default:
                return false;
                break;
        }
    },
    XHabort: function(iNoCallProgressCheck)
    {
        if(iNoCallProgressCheck || this.XHcallInProgress())
        {
            this.XH_ABORTED = true;
            this.XH_OBJ.abort();
        }
        return;
    }
}
