/**
 * 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);
                    }
                }
                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){
    var req=new this();
    req.caching=!_37;
    req.onreadystatechange=function(){
        if(req.readyState==4){
            _36(req.responseJS,req.responseText);
        }
    };
    req.open(null,url,true);
    req.send(_35);
};
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()){
                    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{
                    eval("JsHttpRequest._tmp = function(id) { var d = "+req.responseText+"; 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(_43){
            return this.xr.getResponseHeader(_43);
        };
        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 _49=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 _49=function(){
                    s=s.getElementsByTagName("SCRIPT")[0];
                    s.language="JavaScript";
                    if(s.setAttribute){
                        s.setAttribute("src",th.url);
                    }else{
                        s.src=th.url;
                    }
                };
            }
            JsHttpRequest.setTimeout(_49,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 _4d=null;
            var _4e=false;
            if(th.queryElem.length){
                if(th.queryElem[0].e.tagName.toUpperCase()=="FORM"){
                    _4d=th.queryElem[0].e;
                    _4e=true;
                    th.queryElem=[];
                }else{
                    _4d=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!=_4d){
                            return ["form_el_belong_diff",e.name];
                        }
                    }
                }
                if(th.method=="POST"){
                    var _51="multipart/form-data";
                    var _52=(_4d.attributes.encType&&_4d.attributes.encType.nodeValue)||(_4d.attributes.enctype&&_4d.attributes.enctype.value)||_4d.enctype;
                    if(_52!=_51){
                        return ["form_el_inv_enctype",_51,_52];
                    }
                }
            }
            var d=_4d&&(_4d.ownerDocument||_4d.document)||document;
            var _54="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=(_4d?"":"<form"+(th.method=="POST"?" enctype=\"multipart/form-data\" method=\"post\"":"")+"></form>")+"";
            if(!_4d){
                _4d=th.span.firstChild;
            }
            d.body.insertBefore(s,d.body.lastChild);
            var _56=function(e,_58){
                var sv=[];
                var _5a=e;
                if(e.mergeAttributes){
                    var _5a=d.createElement("form");
                    _5a.mergeAttributes(e,false);
                }
                for(var i=0;i<_58.length;i++){
                    var k=_58[i][0],v=_58[i][1];
                    sv[sv.length]=[k,_5a.getAttribute(k)];
                    _5a.setAttribute(k,v);
                }
                if(e.mergeAttributes){
                    e.mergeAttributes(_5a,false);
                }
                return sv;
            };
            var _5e=function(){
                top.JsHttpRequestGlobal=JsHttpRequest;
                var _5f=[];
                if(!_4e){
                    for(var i=0,n=_4d.elements.length;i<n;i++){
                        _5f[i]=_4d.elements[i].name;
                        _4d.elements[i].name="";
                    }
                }
                var qt=th.queryText.split("&");
                for(var i=qt.length-1;i>=0;i--){
                    var _63=qt[i].split("=",2);
                    var e=d.createElement("INPUT");
                    e.type="hidden";
                    e.name=unescape(_63[0]);
                    e.value=_63[1]!=null?unescape(_63[1]):"";
                    _4d.appendChild(e);
                }
                for(var i=0;i<th.queryElem.length;i++){
                    th.queryElem[i].e.name=th.queryElem[i].name;
                }
                var sv=_56(_4d,[["action",th.url],["method",th.method],["onsubmit",null],["target",_54]]);
                _4d.submit();
                _56(_4d,sv);
                for(var i=0;i<qt.length;i++){
                    _4d.lastChild.parentNode.removeChild(_4d.lastChild);
                }
                if(!_4e){
                    for(var i=0,n=_4d.elements.length;i<n;i++){
                        _4d.elements[i].name=_5f[i];
                    }
                }
            };
            JsHttpRequest.setTimeout(_5e,100);
            return null;
        };
    }
};


