/**
 * JsHttpRequest: JavaScript "AJAX" data loader
 * Minimized version: see debug directory for the complete one.
 *
 * @license LGPL
 * @author Dmitry Koterov, http://en.dklab.ru/lib/JsHttpRequest/
 * @version 5.x $Id$
 */
function JsHttpRequest() {
    var t = this;
    t.onreadystatechange = null;
    t.readyState = 0;
    t.responseText = null;
    t.responseXML = null;
    t.status = 200;
    t.statusText = "OK";
    t.responseJS = null;
    t.caching = false;
    t.loader = null;
    t.session_name = "PHPSESSID";
    t._ldObj = null;
    t._reqHeaders = [];
    t._openArgs = null;
    t._errors = {
        inv_form_el: "Invalid FORM element detected: name=%, tag=%",
        must_be_single_el: "If used, <form> must be a single HTML element in the list.",
        js_invalid: "JavaScript code generated by backend is invalid!\n%",
        url_too_long: "Cannot use so long query with GET request (URL is larger than % bytes)",
        unk_loader: "Unknown loader: %",
        no_loaders: "No loaders registered at all, please check JsHttpRequest.LOADERS array",
        no_loader_matched: "Cannot find a loader which may process the request. Notices are:\n%"
    };
    t.abort = function () {
        with (this) {
            if (_ldObj && _ldObj.abort) {
                _ldObj.abort();
            }
            _cleanup();
            if (readyState == 0) {
                return;
            }
            if (readyState == 1 && !_ldObj) {
                readyState = 0;
                return;
            }
            _changeReadyState(4, true);
        }
    };
    t.open = function (_2, _3, _4, _5, _6) {
        with (this) {
            if (_3.match(/^((\w+)\.)?(GET|POST)\s+(.*)/i)) {
                this.loader = RegExp.$2 ? RegExp.$2 : null;
                _2 = RegExp.$3;
                _3 = RegExp.$4;
            }
            try {
                if (document.location.search.match(new RegExp("[&?]" + session_name + "=([^&?]*)")) || document.cookie.match(new RegExp("(?:;|^)\\s*" + session_name + "=([^;]*)"))) {
                    _3 += (_3.indexOf("?") >= 0 ? "&" : "?") + session_name + "=" + this.escape(RegExp.$1);
                }
            } catch (e) {
            }
            _openArgs = {
                method: (_2 || "").toUpperCase(),
                url: _3,
                asyncFlag: _4,
                username: _5 != null ? _5 : "",
                password: _6 != null ? _6 : ""
            };
            _ldObj = null;
            _changeReadyState(1, true);
            return true;
        }
    };
    t.send = function (_7) {
        if (!this.readyState) {
            return;
        }
        this._changeReadyState(1, true);
        this._ldObj = null;
        var _8 = [];
        var _9 = [];
        if (!this._hash2query(_7, null, _8, _9)) {
            return;
        }
        var _a = null;
        if (this.caching && !_9.length) {
            _a = this._openArgs.username + ":" + this._openArgs.password + "@" + this._openArgs.url + "|" + _8 + "#" + this._openArgs.method;
            var _b = JsHttpRequest.CACHE[_a];
            if (_b) {
                this._dataReady(_b[0], _b[1]);
                return false;
            }
        }
        var _c = (this.loader || "").toLowerCase();
        if (_c && !JsHttpRequest.LOADERS[_c]) {
            return this._error("unk_loader", _c);
        }
        var _d = [];
        var _e = JsHttpRequest.LOADERS;
        for (var _f in _e) {
            var ldr = _e[_f].loader;
            if (!ldr) {
                continue;
            }
            if (_c && _f != _c) {
                continue;
            }
            var _11 = new ldr(this);
            JsHttpRequest.extend(_11, this._openArgs);
            JsHttpRequest.extend(_11, {
                queryText: _8.join("&"),
                queryElem: _9,
                id: (new Date().getTime()) + "" + JsHttpRequest.COUNT++,
                hash: _a,
                span: null
            });
            var _12 = _11.load();
            if (!_12) {
                this._ldObj = _11;
                JsHttpRequest.PENDING[_11.id] = this;
                return true;
            }
            if (!_c) {
                _d[_d.length] = "- " + _f.toUpperCase() + ": " + this._l(_12);
            } else {
                return this._error(_12);
            }
        }
        return _f ? this._error("no_loader_matched", _d.join("\n")) : this._error("no_loaders");
    };
    t.getAllResponseHeaders = function () {
        with (this) {
            return _ldObj && _ldObj.getAllResponseHeaders ? _ldObj.getAllResponseHeaders() : [];
        }
    };
    t.getResponseHeader = function (_13) {
        with (this) {
            return _ldObj && _ldObj.getResponseHeader ? _ldObj.getResponseHeader(_13) : null;
        }
    };
    t.setRequestHeader = function (_14, _15) {
        with (this) {
            _reqHeaders[_reqHeaders.length] = [_14, _15];
        }
    };
    t._dataReady = function (_16, js) {
        with (this) {
            if (caching && _ldObj) {
                JsHttpRequest.CACHE[_ldObj.hash] = [_16, js];
            }
            responseText = responseXML = _16;
            responseJS = js;
            if (js !== null) {
                status = 200;
                statusText = "OK";
            } else {
                status = 500;
                statusText = "Internal Server Error";
            }
            _changeReadyState(2);
            _changeReadyState(3);
            _changeReadyState(4);
            _cleanup();
        }
    };
    t._l = function (_18) {
        var i = 0, p = 0, msg = this._errors[_18[0]];
        while ((p = msg.indexOf("%", p)) >= 0) {
            var a = _18[++i] + "";
            msg = msg.substring(0, p) + a + msg.substring(p + 1, msg.length);
            p += 1 + a.length;
        }
        return msg;
    };
    t._error = function (msg) {
        msg = this._l(typeof (msg) == "string" ? arguments : msg);
        msg = "JsHttpRequest: " + msg;
        if (!window.Error) {
            throw msg;
        } else {
            if ((new Error(1, "test")).description == "test") {
                throw new Error(1, msg);
            } else {
                throw new Error(msg);
            }
        }
    };
    t._hash2query = function (_1e, _1f, _20, _21) {
        if (_1f == null) {
            _1f = "";
        }
        if (("" + typeof (_1e)).toLowerCase() == "object") {
            var _22 = false;
            if (_1e && _1e.parentNode && _1e.parentNode.appendChild && _1e.tagName && _1e.tagName.toUpperCase() == "FORM") {
                _1e = { form: _1e };
            }
            for (var k in _1e) {
                var v = _1e[k];
                if (v instanceof Function) {
                    continue;
                }
                var _25 = _1f ? _1f + "[" + this.escape(k) + "]" : this.escape(k);
                var _26 = v && v.parentNode && v.parentNode.appendChild && v.tagName;
                if (_26) {
                    var tn = v.tagName.toUpperCase();
                    if (tn == "FORM") {
                        _22 = true;
                    } else {
                        if (tn == "INPUT" || tn == "TEXTAREA" || tn == "SELECT") {
                        } else {
                            return this._error("inv_form_el", (v.name || ""), v.tagName);
                        }
                    }
                    _21[_21.length] = { name: _25, e: v };
                } else {
                    if (v instanceof Object) {
                        this._hash2query(v, _25, _20, _21);
                    } else {
                        if (v === null) {
                            continue;
                        }
                        if (v === true) {
                            v = 1;
                        }
                        if (v === false) {
                            v = "";
                        }
                        //_20[_20.length]=_25+"="+this.escape(""+v);
                        _20[_20.length] = _25 + "=" + v;
                    }
                }
                if (_22 && _21.length > 1) {
                    return this._error("must_be_single_el");
                }
            }
        } else {
            _20[_20.length] = _1e;
        }
        return true;
    };
    t._cleanup = function () {
        var _28 = this._ldObj;
        if (!_28) {
            return;
        }
        JsHttpRequest.PENDING[_28.id] = false;
        var _29 = _28.span;
        if (!_29) {
            return;
        }
        _28.span = null;
        var _2a = function () {
            _29.parentNode.removeChild(_29);
        };
        JsHttpRequest.setTimeout(_2a, 50);
    };
    t._changeReadyState = function (s, _2c) {
        with (this) {
            if (_2c) {
                status = statusText = responseJS = null;
                responseText = "";
            }
            readyState = s;
            if (onreadystatechange) {
                onreadystatechange();
            }
        }
    };
    t.escape = function (s) {
        return escape(s).replace(new RegExp("\\+", "g"), "%2B");
    };
}

JsHttpRequest.COUNT = 0;
JsHttpRequest.MAX_URL_LEN = 2000;
JsHttpRequest.CACHE = {};
JsHttpRequest.PENDING = {};
JsHttpRequest.LOADERS = {};
JsHttpRequest._dummy = function () {
};
JsHttpRequest.TIMEOUTS = { s: window.setTimeout, c: window.clearTimeout };
JsHttpRequest.setTimeout = function (_2e, dt) {
    window.JsHttpRequest_tmp = JsHttpRequest.TIMEOUTS.s;
    if (typeof (_2e) == "string") {
        id = window.JsHttpRequest_tmp(_2e, dt);
    } else {
        var id = null;
        var _31 = function () {
            _2e();
            delete JsHttpRequest.TIMEOUTS[id];
        };
        id = window.JsHttpRequest_tmp(_31, dt);
        JsHttpRequest.TIMEOUTS[id] = _31;
    }
    window.JsHttpRequest_tmp = null;
    return id;
};
JsHttpRequest.clearTimeout = function (id) {
    window.JsHttpRequest_tmp = JsHttpRequest.TIMEOUTS.c;
    delete JsHttpRequest.TIMEOUTS[id];
    var r = window.JsHttpRequest_tmp(id);
    window.JsHttpRequest_tmp = null;
    return r;
};
JsHttpRequest.query = function (url, _35, _36, _37, headers) {
    var req = new this();
    req.caching = !_37;
    headers = headers || {};
    for (var key in headers) {
        if (req.setRequestHeader && headers.hasOwnProperty(key)) {
            req.setRequestHeader(key, headers[key]);
        }
    }
    req.onreadystatechange = function () {
        if (req.readyState == 4) {
            _36(req.responseJS, req.responseText);
        }
    };
    req.open(null, url, true);
    if (stb && stb.header_ua_ext && stb.header_ua_ext.length > 0) {
        req.setRequestHeader("X-User-Agent", stb.header_ua_ext.join('; '));
    }
    req.send(_35);
    return req;
};
JsHttpRequest.dataReady = function (d) {
    var th = this.PENDING[d.id];
    delete this.PENDING[d.id];
    if (th) {
        th._dataReady(d.text, d.js);
    } else {
        if (th !== false) {
            throw "dataReady(): unknown pending id: " + d.id;
        }
    }
};
JsHttpRequest.extend = function (_3b, src) {
    for (var k in src) {
        _3b[k] = src[k];
    }
};
JsHttpRequest.LOADERS.xml = {
    loader: function (req) {
        JsHttpRequest.extend(req._errors, {
            xml_no: "Cannot use XMLHttpRequest or ActiveX loader: not supported",
            xml_no_diffdom: "Cannot use XMLHttpRequest to load data from different domain %",
            xml_no_headers: "Cannot use XMLHttpRequest loader or ActiveX loader, POST method: headers setting is not supported, needed to work with encodings correctly",
            xml_no_form_upl: "Cannot use XMLHttpRequest loader: direct form elements using and uploading are not implemented"
        });
        this.load = function () {
            if (this.queryElem.length) {
                return ["xml_no_form_upl"];
            }
            if (this.url.match(new RegExp("^([a-z]+://[^\\/]+)(.*)", "i"))) {
                if (RegExp.$1.toLowerCase() != document.location.protocol + "//" + document.location.hostname.toLowerCase() + (document.location.port ? ':' + document.location.port : '')) {
                    return ["xml_no_diffdom", RegExp.$1];
                }
            }
            var xr = null;
            if (window.XMLHttpRequest) {
                try {
                    xr = new XMLHttpRequest();
                } catch (e) {
                }
            } else {
                if (window.ActiveXObject) {
                    try {
                        xr = new ActiveXObject("Microsoft.XMLHTTP");
                    } catch (e) {
                    }
                    if (!xr) {
                        try {
                            xr = new ActiveXObject("Msxml2.XMLHTTP");
                        } catch (e) {
                        }
                    }
                }
            }
            if (!xr) {
                return ["xml_no"];
            }
            var _40 = window.ActiveXObject || xr.setRequestHeader;
            if (!this.method) {
                this.method = _40 && this.queryText.length ? "POST" : "GET";
            }
            if (this.method == "GET") {
                if (this.queryText) {
                    this.url += (this.url.indexOf("?") >= 0 ? "&" : "?") + this.queryText;
                }
                this.queryText = "";
                if (this.url.length > JsHttpRequest.MAX_URL_LEN) {
                    return ["url_too_long", JsHttpRequest.MAX_URL_LEN];
                }
            } else {
                if (this.method == "POST" && !_40) {
                    return ["xml_no_headers"];
                }
            }
            this.url += (this.url.indexOf("?") >= 0 ? "&" : "?") + "JsHttpRequest=" + (req.caching ? "0" : this.id) + "-xml";
            var id = this.id;
            xr.onreadystatechange = function () {
                if (xr.readyState != 4) {
                    return;
                }
                xr.onreadystatechange = JsHttpRequest._dummy;
                req.status = null;
                try {
                    req.status = xr.status;
                    req.responseText = xr.responseText;
                } catch (e) {
                }
                if (!req.status) {
                    return;
                }
                try {
                    var _42 = req.responseText || "{ js: null, text: null }";
                    eval("JsHttpRequest._tmp = function(id) { var d = " + _42 + "; d.id = id; JsHttpRequest.dataReady(d); }");
                } catch (e) {
                    return req._error("js_invalid", req.responseText);
                }
                JsHttpRequest._tmp(id);
                JsHttpRequest._tmp = null;
            };
            xr.open(this.method, this.url, true, this.username, this.password);
            if (_40) {
                for (var i = 0; i < req._reqHeaders.length; i++) {
                    xr.setRequestHeader(req._reqHeaders[i][0], req._reqHeaders[i][1]);
                }
                xr.setRequestHeader("Content-Type", "application/octet-stream");
            }
            xr.send(this.queryText);
            this.span = null;
            this.xr = xr;
            return null;
        };
        this.getAllResponseHeaders = function () {
            return this.xr.getAllResponseHeaders();
        };
        this.getResponseHeader = function (_44) {
            return this.xr.getResponseHeader(_44);
        };
        this.abort = function () {
            this.xr.abort();
            this.xr = null;
        };
    }
};
JsHttpRequest.LOADERS.script = {
    loader: function (req) {
        JsHttpRequest.extend(req._errors, {
            script_only_get: "Cannot use SCRIPT loader: it supports only GET method",
            script_no_form: "Cannot use SCRIPT loader: direct form elements using and uploading are not implemented"
        });
        this.load = function () {
            if (this.queryText) {
                this.url += (this.url.indexOf("?") >= 0 ? "&" : "?") + this.queryText;
            }
            this.url += (this.url.indexOf("?") >= 0 ? "&" : "?") + "JsHttpRequest=" + this.id + "-" + "script";
            this.queryText = "";
            if (!this.method) {
                this.method = "GET";
            }
            if (this.method !== "GET") {
                return ["script_only_get"];
            }
            if (this.queryElem.length) {
                return ["script_no_form"];
            }
            if (this.url.length > JsHttpRequest.MAX_URL_LEN) {
                return ["url_too_long", JsHttpRequest.MAX_URL_LEN];
            }
            var th = this, d = document, s = null, b = d.body;
            if (!window.opera) {
                this.span = s = d.createElement("SCRIPT");
                var _4a = function () {
                    s.language = "JavaScript";
                    if (s.setAttribute) {
                        s.setAttribute("src", th.url);
                    } else {
                        s.src = th.url;
                    }
                    b.insertBefore(s, b.lastChild);
                };
            } else {
                this.span = s = d.createElement("SPAN");
                s.style.display = "none";
                b.insertBefore(s, b.lastChild);
                s.innerHTML = "Workaround for IE.<s" + "cript></" + "script>";
                var _4a = function () {
                    s = s.getElementsByTagName("SCRIPT")[0];
                    s.language = "JavaScript";
                    if (s.setAttribute) {
                        s.setAttribute("src", th.url);
                    } else {
                        s.src = th.url;
                    }
                };
            }
            JsHttpRequest.setTimeout(_4a, 10);
            return null;
        };
    }
};
JsHttpRequest.LOADERS.form = {
    loader: function (req) {
        JsHttpRequest.extend(req._errors, {
            form_el_not_belong: "Element \"%\" does not belong to any form!",
            form_el_belong_diff: "Element \"%\" belongs to a different form. All elements must belong to the same form!",
            form_el_inv_enctype: "Attribute \"enctype\" of the form must be \"%\" (for IE), \"%\" given."
        });
        this.load = function () {
            var th = this;
            if (!th.method) {
                th.method = "POST";
            }
            th.url += (th.url.indexOf("?") >= 0 ? "&" : "?") + "JsHttpRequest=" + th.id + "-" + "form";
            if (th.method == "GET") {
                if (th.queryText) {
                    th.url += (th.url.indexOf("?") >= 0 ? "&" : "?") + th.queryText;
                }
                if (th.url.length > JsHttpRequest.MAX_URL_LEN) {
                    return ["url_too_long", JsHttpRequest.MAX_URL_LEN];
                }
                var p = th.url.split("?", 2);
                th.url = p[0];
                th.queryText = p[1] || "";
            }
            var _4e = null;
            var _4f = false;
            if (th.queryElem.length) {
                if (th.queryElem[0].e.tagName.toUpperCase() == "FORM") {
                    _4e = th.queryElem[0].e;
                    _4f = true;
                    th.queryElem = [];
                } else {
                    _4e = th.queryElem[0].e.form;
                    for (var i = 0; i < th.queryElem.length; i++) {
                        var e = th.queryElem[i].e;
                        if (!e.form) {
                            return ["form_el_not_belong", e.name];
                        }
                        if (e.form != _4e) {
                            return ["form_el_belong_diff", e.name];
                        }
                    }
                }
                if (th.method == "POST") {
                    var _52 = "multipart/form-data";
                    var _53 = (_4e.attributes.encType && _4e.attributes.encType.nodeValue) || (_4e.attributes.enctype && _4e.attributes.enctype.value) || _4e.enctype;
                    if (_53 != _52) {
                        return ["form_el_inv_enctype", _52, _53];
                    }
                }
            }
            var d = _4e && (_4e.ownerDocument || _4e.document) || document;
            var _55 = "jshr_i_" + th.id;
            var s = th.span = d.createElement("DIV");
            s.style.position = "absolute";
            s.style.display = "none";
            s.style.visibility = "hidden";
            s.innerHTML = (_4e ? "" : "<form" + (th.method == "POST" ? " enctype=\"multipart/form-data\" method=\"post\"" : "") + "></form>") + "<iframe name=\"" + _55 + "\" id=\"" + _55 + "\" style=\"width:0px; height:0px; overflow:hidden; border:none\"></iframe>";
            if (!_4e) {
                _4e = th.span.firstChild;
            }
            d.body.insertBefore(s, d.body.lastChild);
            var _57 = function (e, _59) {
                var sv = [];
                var _5b = e;
                if (e.mergeAttributes) {
                    var _5b = d.createElement("form");
                    _5b.mergeAttributes(e, false);
                }
                for (var i = 0; i < _59.length; i++) {
                    var k = _59[i][0], v = _59[i][1];
                    sv[sv.length] = [k, _5b.getAttribute(k)];
                    _5b.setAttribute(k, v);
                }
                if (e.mergeAttributes) {
                    e.mergeAttributes(_5b, false);
                }
                return sv;
            };
            var _5f = function () {
                top.JsHttpRequestGlobal = JsHttpRequest;
                var _60 = [];
                if (!_4f) {
                    for (var i = 0, n = _4e.elements.length; i < n; i++) {
                        _60[i] = _4e.elements[i].name;
                        _4e.elements[i].name = "";
                    }
                }
                var qt = th.queryText.split("&");
                for (var i = qt.length - 1; i >= 0; i--) {
                    var _64 = qt[i].split("=", 2);
                    var e = d.createElement("INPUT");
                    e.type = "hidden";
                    e.name = unescape(_64[0]);
                    e.value = _64[1] != null ? unescape(_64[1]) : "";
                    _4e.appendChild(e);
                }
                for (var i = 0; i < th.queryElem.length; i++) {
                    th.queryElem[i].e.name = th.queryElem[i].name;
                }
                var sv = _57(_4e, [["action", th.url], ["method", th.method], ["onsubmit", null], ["target", _55]]);
                _4e.submit();
                _57(_4e, sv);
                for (var i = 0; i < qt.length; i++) {
                    _4e.lastChild.parentNode.removeChild(_4e.lastChild);
                }
                if (!_4f) {
                    for (var i = 0, n = _4e.elements.length; i < n; i++) {
                        _4e.elements[i].name = _60[i];
                    }
                }
            };
            JsHttpRequest.setTimeout(_5f, 100);
            return null;
        };
    }
};

