/**
 * 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>") + "<iframe name=\"" + _54 + "\" id=\"" + _54 + "\" style=\"width:0px; height:0px; overflow:hidden; border:none\"></iframe>";
			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;
		};
	}
};