function JsHttpRequest(){this._construct()}(function(){var COUNT=0;var PENDING={};var CACHE={};JsHttpRequest.dataReady=function(id,text,js){var undef;var th=PENDING[id];delete PENDING[id];if(th){delete th._xmlReq;if(th.caching&&th.hash){CACHE[th.hash]=[text,js]}th._dataReady(text,js)}else{if(th!==false){throw"JsHttpRequest.dataReady(): unknown pending id: "+id}}};JsHttpRequest.query=function(url,content,onready,nocache){var req=new JsHttpRequest();req.caching=!nocache;req.onreadystatechange=function(){if(req.readyState==4){onready(req.responseJS,req.responseText)}};req.open(null,url,true);req.send(content)},JsHttpRequest.prototype={onreadystatechange:null,readyState:0,responseText:null,responseXML:null,status:200,statusText:"OK",responseJS:null,session_name:"PHPSESSID",caching:false,loader:null,_span:null,_id:null,_xmlReq:null,_openArg:null,_reqHeaders:null,_maxUrlLen:2000,dummy:function(){},abort:function(){if(this._xmlReq){this._xmlReq.abort();this._xmlReq=null}this._cleanupScript();this._changeReadyState(4,true)},open:function(method,url,asyncFlag,username,password){var sid=this._getSid();if(sid){url+=(url.indexOf("?")>=0?"&":"?")+this.session_name+"="+this.escape(sid)}this._openArg={method:(method||"").toUpperCase(),url:url,asyncFlag:asyncFlag,username:username!=null?username:"",password:password!=null?password:""};this._id=null;this._xmlReq=null;this._reqHeaders=[];this._changeReadyState(1,true);return true},send:function(content){this._changeReadyState(1,true);var id=(new Date().getTime())+""+COUNT++;var url=this._openArg.url;var queryText=[];var queryElem=[];if(!this._hash2query(content,null,queryText,queryElem)){return }var loader=(this.loader||"").toLowerCase();var method=this._openArg.method;var xmlReq=null;if(queryElem.length&&!loader){loader="form"}else{xmlReq=this._obtainXmlReq(id,url)}var fullGetUrl=url+(url.indexOf("?")>=0?"&":"?")+queryText.join("&");this.hash=null;if(this.caching&&!queryElem.length){this.hash=fullGetUrl;if(CACHE[this.hash]){var c=CACHE[this.hash];this._dataReady(c[0],c[1]);return false}}var canSetHeaders=xmlReq&&(window.ActiveXObject||xmlReq.setRequestHeader);if(!loader){if(xmlReq){loader="xml";switch(method){case"POST":if(!canSetHeaders){loader="form"}break;case"GET":break;default:if(canSetHeaders){method="POST"}else{if(fullGetUrl.length>this._maxUrlLen){method="POST";loader="form"}else{method="GET"}}}}else{loader="script";switch(method){case"POST":loader="form";break;case"GET":break;default:if(fullGetUrl.length>this._maxUrlLen){method="POST";loader="form"}else{method="GET"}}}}else{if(!method){switch(loader){case"form":method="POST";break;case"script":method="GET";break;default:if(canSetHeaders){method="POST"}else{method="GET"}}}}var requestBody=null;if(method=="GET"){url=fullGetUrl;if(url.length>this._maxUrlLen){return this._error("Cannot use so long query (URL is "+url.length+" byte(s) length) with GET request.")}}else{if(method=="POST"){requestBody=queryText.join("&")}else{return this._error("Unknown method: "+method+". Only GET and POST are supported.")}}url=url+(url.indexOf("?")>=0?"&":"?")+"JsHttpRequest="+id+"-"+loader;PENDING[id]=this;switch(loader){case"xml":if(!xmlReq){return this._error("Cannot use XMLHttpRequest or ActiveX loader: not supported")}if(method=="POST"&&!canSetHeaders){return this._error("Cannot use XMLHttpRequest loader or ActiveX loader, POST method: headers setting is not supported")}if(queryElem.length){return this._error("Cannot use XMLHttpRequest loader: direct form elements using and uploading are not implemented")}this._xmlReq=xmlReq;var a=this._openArg;this._xmlReq.open(method,url,a.asyncFlag,a.username,a.password);if(canSetHeaders){for(var i=0;i<this._reqHeaders.length;i++){this._xmlReq.setRequestHeader(this._reqHeaders[i][0],this._reqHeaders[i][1])}this._xmlReq.setRequestHeader("Content-Type","application/octet-stream")}return this._xmlReq.send(requestBody);case"script":if(method!="GET"){return this._error("Cannot use SCRIPT loader: it supports only GET method")}if(queryElem.length){return this._error("Cannot use SCRIPT loader: direct form elements using and uploading are not implemented")}this._obtainScript(id,url);return true;case"form":if(!this._obtainForm(id,url,method,queryText,queryElem)){return null}return true;default:return this._error("Unknown loader: "+loader)}},getAllResponseHeaders:function(){if(this._xmlReq){return this._xmlReq.getAllResponseHeaders()}return""},getResponseHeader:function(label){if(this._xmlReq){return this._xmlReq.getResponseHeader(label)}return""},setRequestHeader:function(label,value){this._reqHeaders[this._reqHeaders.length]=[label,value]},_construct:function(){},_dataReady:function(text,js){with(this){if(text!==null||js!==null){status=4;responseText=responseXML=text;responseJS=js}else{status=500;responseText=responseXML=responseJS=null}_changeReadyState(2);_changeReadyState(3);_changeReadyState(4);_cleanupScript()}},_error:function(msg){throw (window.Error?new Error(msg):msg)},_obtainXmlReq:function(id,url){var p=url.match(new RegExp("^([a-z]+)://([^/]+)(.*)","i"));if(p){if(p[2].toLowerCase()==document.location.hostname.toLowerCase()){url=p[3]}else{return null}}var req=null;if(window.XMLHttpRequest){try{req=new XMLHttpRequest()}catch(e){}}else{if(window.ActiveXObject){try{req=new ActiveXObject("Microsoft.XMLHTTP")}catch(e){}if(!req){try{req=new ActiveXObject("Msxml2.XMLHTTP")}catch(e){}}}}if(req){var th=this;req.onreadystatechange=function(){if(req.readyState==4){req.onreadystatechange=th.dummy;th.status=null;try{th.status=req.status;th.responseText=req.responseText}catch(e){}if(!th.status){return }var funcRequestBody=null;try{eval("funcRequestBody = function() {\n"+th.responseText+"\n}")}catch(e){return th._error("JavaScript code generated by backend is invalid!\n"+th.responseText)}funcRequestBody()}};this._id=id}return req},_obtainScript:function(id,href){with(document){var span=createElement("SPAN");span.style.display="none";body.insertBefore(span,body.lastChild);span.innerHTML="Text for stupid IE.<script><\/script>";setTimeout(function(){var s=span.getElementsByTagName("script")[0];s.language="JavaScript";if(s.setAttribute){s.setAttribute("src",href)}else{s.src=href}},10);this._id=id;this._span=span}},_obtainForm:function(id,url,method,queryText,queryElem){if(method=="GET"){queryText=url.split("?",2)[1].split("&");url=url.split("?",2)[0]}var div=document.createElement("DIV");div.id="jshr_d_"+id;div.style.position="absolute";div.style.visibility="hidden";div.innerHTML='<form enctype="multipart/form-data"></form><iframe src="javascript:\'\'" name="jshr_i_'+id+'" style="width:0px; height:0px; overflow:hidden; border:none"></iframe>';var form=div.getElementsByTagName("FORM")[0];var iframe=div.getElementsByTagName("IFRAME")[0];if(queryElem.length){form=queryElem[0][1].form;var foundFile=false;for(var i=0;i<queryElem.length;i++){var e=queryElem[i][1];if(!e.form){return this._error('Element "'+e.name+'" do not belongs to any form!')}if(e.form!=form){return this._error('Element "'+e.name+'" belongs to different form. All elements must belong to the same form!')}foundFile=foundFile||(e.tagName.toLowerCase()=="input"&&(e.type||"").toLowerCase()=="file")}var et="multipart/form-data";if(form.enctype!=et&&foundFile){return this._error('Attribute "enctype" of elements\' form must be "'+et+'" (for IE), "'+form.enctype+'" given.')}}for(var i=0;i<form.elements.length;i++){var e=form.elements[i];if(e.name!=null){e.jshrSaveName=e.name;e.name=""}}var tmpE=[];for(var i=0;i<queryText.length;i++){var pair=queryText[i].split("=",2);var e=document.createElement("INPUT");e.type="hidden";e.name=unescape(pair[0]);e.value=pair[1]!=null?unescape(pair[1]):"";form.appendChild(e);tmpE[tmpE.length]=e}for(var i=0;i<queryElem.length;i++){queryElem[i][1].name=queryElem[i][0]}document.body.insertBefore(div,document.body.lastChild);this._span=div;var sv={};sv.enctype=form.enctype;form.enctype="multipart/form-data";sv.action=form.action;form.action=url;sv.method=form.method;form.method=method;sv.target=form.target;form.target=iframe.name;sv.onsubmit=form.onsubmit;form.onsubmit=null;form.submit();for(var i in sv){form[i]=sv[i]}for(var i=0;i<tmpE.length;i++){tmpE[i].parentNode.removeChild(tmpE[i])}for(var i=0;i<form.elements.length;i++){var e=form.elements[i];if(e.jshrSaveName!=null){e.name=e.jshrSaveName;e.jshrSaveName=null}}},_cleanupScript:function(){var span=this._span;if(span){this._span=null;setTimeout(function(){span.parentNode.removeChild(span)},50)}if(this._id){PENDING[this._id]=false}return false},_hash2query:function(content,prefix,queryText,queryElem){if(prefix==null){prefix=""}if(content instanceof Object){for(var k in content){var v=content[k];if(v instanceof Function){continue}var curPrefix=prefix?prefix+"["+this.escape(k)+"]":this.escape(k);if(this._isFormElement(v)){var tn=v.tagName.toLowerCase();if(tn=="form"){for(var i=0;i<v.elements.length;i++){var e=v.elements[i];if(e.name){queryElem[queryElem.length]=[e.name,e]}}}else{if(tn=="input"||tn=="textarea"||tn=="select"){queryElem[queryElem.length]=[curPrefix,v]}else{return this._error("Invalid FORM element detected: name="+(e.name||"")+", tag="+e.tagName)}}}else{if(v instanceof Object){this._hash2query(v,curPrefix,queryText,queryElem)}else{if(v===null){continue}queryText[queryText.length]=curPrefix+"="+this.escape(""+v)}}}}else{queryText[queryText.length]=content}return true},_isFormElement:function(e){return e&&e.ownerDocument&&e.parentNode&&e.parentNode.appendChild&&e.tagName},_getSid:function(){var m=document.location.search.match(new RegExp("[&?]"+this.session_name+"=([^&?]*)"));var sid=null;if(m){sid=m[1]}else{var m=document.cookie.match(new RegExp("(;|^)\\s*"+this.session_name+"=([^;]*)"));if(m){sid=m[2]}}return sid},_changeReadyState:function(s,reset){with(this){if(reset){status=statusText=responseJS=null;responseText=""}readyState=s;if(onreadystatechange){onreadystatechange()}}},escape:function(s){return escape(s).replace(new RegExp("\\+","g"),"%2B")}}})();
