/**
* 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%",
		no_headers:"Method setRequestHeader() cannot work together with the % loader."
	};
	
	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){
	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():[];
	}
	};
	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];
	}
	if(_16!==null||js!==null){
	status=4;
	responseText=responseXML=_16;
	responseJS=js;
	}else{
	status=500;
	responseText=responseXML=responseJS=null;
	}
	_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(_1e instanceof Object){
	var _22=false;
	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",(e.name||""),e.tagName);
	}
	}
	_21[_21.length]={name:_25,e:v};
	}else{
	if(v instanceof Object){
	this._hash2query(v,_25,_20,_21);
	}else{
	if(v===null){
	continue;
	}
	_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, img){
		document.getElementById(img).style.display = "block";
		var req=new this();
		req.caching=!_37;
		req.onreadystatechange=function(){
		if(req.readyState==4){
			document.getElementById(img).style.display = "none";
			_36(req.responseJS,req.responseText);
		}
	};
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	var _39=null;
	if(url.match(/^((\w+)\.)?(GET|POST)\s+(.*)/i)){
	req.loader=RegExp.$2?RegExp.$2:null;
	_39=RegExp.$3;
	url=RegExp.$4;
	}
	req.open(_39,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(_3c,src){
	for(var k in src){
	_3c[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.$2.toLowerCase()==document.location.hostname.toLowerCase()){
	this.url=RegExp.$3;
	}else{
	return ["xml_no_diffdom",RegExp.$2];
	}
	}
	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 _41=window.ActiveXObject||xr.setRequestHeader;
	if(!this.method){
	this.method=_41?"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"&&!_41){
	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(_41){
	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];
	}
	if(req._reqHeaders.length){
	return ["no_headers","SCRIPT"];
	}
	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(req._reqHeaders.length){
	return ["no_headers","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.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;
	};
}};

