/**
 * 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
				{
					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;
		};
	}
};