1/**
2 * JsHttpRequest: JavaScript "AJAX" data loader (script-xml support only!)
3 * Minimized version: see debug directory for the complete one.
4 *
5 * @license LGPL
6 * @author Dmitry Koterov, http://en.dklab.ru/lib/JsHttpRequest/
7 * @version 5.x $Id$
8 */
9function JsHttpRequest(){
10var t=this;
11t.onreadystatechange=null;
12t.readyState=0;
13t.responseText=null;
14t.responseXML=null;
15t.status=200;
16t.statusText="OK";
17t.responseJS=null;
18t.caching=false;
19t.loader=null;
20t.session_name="PHPSESSID";
21t._ldObj=null;
22t._reqHeaders=[];
23t._openArgs=null;
24t._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."};
25t.abort=function(){
26with(this){
27if(_ldObj&&_ldObj.abort){
28_ldObj.abort();
29}
30_cleanup();
31if(readyState==0){
32return;
33}
34if(readyState==1&&!_ldObj){
35readyState=0;
36return;
37}
38_changeReadyState(4,true);
39}
40};
41t.open=function(_2,_3,_4,_5,_6){
42with(this){
43try{
44if(document.location.search.match(new RegExp("[&?]"+session_name+"=([^&?]*)"))||document.cookie.match(new RegExp("(?:;|^)\\s*"+session_name+"=([^;]*)"))){
45_3+=(_3.indexOf("?")>=0?"&":"?")+session_name+"="+this.escape(RegExp.$1);
46}
47}
48catch(e){
49}
50_openArgs={method:(_2||"").toUpperCase(),url:_3,asyncFlag:_4,username:_5!=null?_5:"",password:_6!=null?_6:""};
51_ldObj=null;
52_changeReadyState(1,true);
53return true;
54}
55};
56t.send=function(_7){
57if(!this.readyState){
58return;
59}
60this._changeReadyState(1,true);
61this._ldObj=null;
62var _8=[];
63var _9=[];
64if(!this._hash2query(_7,null,_8,_9)){
65return;
66}
67var _a=null;
68if(this.caching&&!_9.length){
69_a=this._openArgs.username+":"+this._openArgs.password+"@"+this._openArgs.url+"|"+_8+"#"+this._openArgs.method;
70var _b=JsHttpRequest.CACHE[_a];
71if(_b){
72this._dataReady(_b[0],_b[1]);
73return false;
74}
75}
76var _c=(this.loader||"").toLowerCase();
77if(_c&&!JsHttpRequest.LOADERS[_c]){
78return this._error("unk_loader",_c);
79}
80var _d=[];
81var _e=JsHttpRequest.LOADERS;
82for(var _f in _e){
83var ldr=_e[_f].loader;
84if(!ldr){
85continue;
86}
87if(_c&&_f!=_c){
88continue;
89}
90var _11=new ldr(this);
91JsHttpRequest.extend(_11,this._openArgs);
92JsHttpRequest.extend(_11,{queryText:_8.join("&"),queryElem:_9,id:(new Date().getTime())+""+JsHttpRequest.COUNT++,hash:_a,span:null});
93var _12=_11.load();
94if(!_12){
95this._ldObj=_11;
96JsHttpRequest.PENDING[_11.id]=this;
97return true;
98}
99if(!_c){
100_d[_d.length]="- "+_f.toUpperCase()+": "+this._l(_12);
101}else{
102return this._error(_12);
103}
104}
105return _f?this._error("no_loader_matched",_d.join("\n")):this._error("no_loaders");
106};
107t.getAllResponseHeaders=function(){
108with(this){
109return _ldObj&&_ldObj.getAllResponseHeaders?_ldObj.getAllResponseHeaders():[];
110}
111};
112t.getResponseHeader=function(_13){
113with(this){
114return _ldObj&&_ldObj.getResponseHeader?_ldObj.getResponseHeader():[];
115}
116};
117t.setRequestHeader=function(_14,_15){
118with(this){
119_reqHeaders[_reqHeaders.length]=[_14,_15];
120}
121};
122t._dataReady=function(_16,js){
123with(this){
124if(caching&&_ldObj){
125JsHttpRequest.CACHE[_ldObj.hash]=[_16,js];
126}
127if(_16!==null||js!==null){
128status=4;
129responseText=responseXML=_16;
130responseJS=js;
131}else{
132status=500;
133responseText=responseXML=responseJS=null;
134}
135_changeReadyState(2);
136_changeReadyState(3);
137_changeReadyState(4);
138_cleanup();
139}
140};
141t._l=function(_18){
142var i=0,p=0,msg=this._errors[_18[0]];
143while((p=msg.indexOf("%",p))>=0){
144var a=_18[++i]+"";
145msg=msg.substring(0,p)+a+msg.substring(p+1,msg.length);
146p+=1+a.length;
147}
148return msg;
149};
150t._error=function(msg){
151msg=this._l(typeof (msg)=="string"?arguments:msg);
152msg="JsHttpRequest: "+msg;
153if(!window.Error){
154throw msg;
155}else{
156if((new Error(1,"test")).description=="test"){
157throw new Error(1,msg);
158}else{
159throw new Error(msg);
160}
161}
162};
163t._hash2query=function(_1e,_1f,_20,_21){
164if(_1f==null){
165_1f="";
166}
167if((""+typeof (_1e)).toLowerCase()=="object"){
168var _22=false;
169if(_1e&&_1e.parentNode&&_1e.parentNode.appendChild&&_1e.tagName&&_1e.tagName.toUpperCase()=="FORM"){
170_1e={form:_1e};
171}
172for(var k in _1e){
173var v=_1e[k];
174if(v instanceof Function){
175continue;
176}
177var _25=_1f?_1f+"["+this.escape(k)+"]":this.escape(k);
178var _26=v&&v.parentNode&&v.parentNode.appendChild&&v.tagName;
179if(_26){
180var tn=v.tagName.toUpperCase();
181if(tn=="FORM"){
182_22=true;
183}else{
184if(tn=="INPUT"||tn=="TEXTAREA"||tn=="SELECT"){
185}else{
186return this._error("inv_form_el",(v.name||""),v.tagName);
187}
188}
189_21[_21.length]={name:_25,e:v};
190}else{
191if(v instanceof Object){
192this._hash2query(v,_25,_20,_21);
193}else{
194if(v===null){
195continue;
196}
197_20[_20.length]=_25+"="+this.escape(""+v);
198}
199}
200if(_22&&_21.length>1){
201return this._error("must_be_single_el");
202}
203}
204}else{
205_20[_20.length]=_1e;
206}
207return true;
208};
209t._cleanup=function(){
210var _28=this._ldObj;
211if(!_28){
212return;
213}
214JsHttpRequest.PENDING[_28.id]=false;
215var _29=_28.span;
216if(!_29){
217return;
218}
219_28.span=null;
220var _2a=function(){
221_29.parentNode.removeChild(_29);
222};
223JsHttpRequest.setTimeout(_2a,50);
224};
225t._changeReadyState=function(s,_2c){
226with(this){
227if(_2c){
228status=statusText=responseJS=null;
229responseText="";
230}
231readyState=s;
232if(onreadystatechange){
233onreadystatechange();
234}
235}
236};
237t.escape=function(s){
238return escape(s).replace(new RegExp("\\+","g"),"%2B");
239};
240}
241JsHttpRequest.COUNT=0;
242JsHttpRequest.MAX_URL_LEN=2000;
243JsHttpRequest.CACHE={};
244JsHttpRequest.PENDING={};
245JsHttpRequest.LOADERS={};
246JsHttpRequest._dummy=function(){
247};
248JsHttpRequest.TIMEOUTS={s:window.setTimeout,c:window.clearTimeout};
249JsHttpRequest.setTimeout=function(_2e,dt){
250window.JsHttpRequest_tmp=JsHttpRequest.TIMEOUTS.s;
251if(typeof (_2e)=="string"){
252id=window.JsHttpRequest_tmp(_2e,dt);
253}else{
254var id=null;
255var _31=function(){
256_2e();
257delete JsHttpRequest.TIMEOUTS[id];
258};
259id=window.JsHttpRequest_tmp(_31,dt);
260JsHttpRequest.TIMEOUTS[id]=_31;
261}
262window.JsHttpRequest_tmp=null;
263return id;
264};
265JsHttpRequest.clearTimeout=function(id){
266window.JsHttpRequest_tmp=JsHttpRequest.TIMEOUTS.c;
267delete JsHttpRequest.TIMEOUTS[id];
268var r=window.JsHttpRequest_tmp(id);
269window.JsHttpRequest_tmp=null;
270return r;
271};
272JsHttpRequest.query=function(url,_35,_36,_37){
273var req=new this();
274req.caching=!_37;
275req.onreadystatechange=function(){
276if(req.readyState==4){
277_36(req.responseJS,req.responseText);
278}
279};
280var _39=null;
281if(url.match(/^((\w+)\.)?(GET|POST)\s+(.*)/i)){
282req.loader=RegExp.$2?RegExp.$2:null;
283_39=RegExp.$3;
284url=RegExp.$4;
285}
286req.open(_39,url,true);
287req.send(_35);
288};
289JsHttpRequest.dataReady=function(d){
290var th=this.PENDING[d.id];
291delete this.PENDING[d.id];
292if(th){
293th._dataReady(d.text,d.js);
294}else{
295if(th!==false){
296throw "dataReady(): unknown pending id: "+d.id;
297}
298}
299};
300JsHttpRequest.extend=function(_3c,src){
301for(var k in src){
302_3c[k]=src[k];
303}
304};
305JsHttpRequest.LOADERS.script={loader:function(req){
306JsHttpRequest.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"});
307this.load=function(){
308if(this.queryText){
309this.url+=(this.url.indexOf("?")>=0?"&":"?")+this.queryText;
310}
311this.url+=(this.url.indexOf("?")>=0?"&":"?")+"JsHttpRequest="+this.id+"-"+"script";
312this.queryText="";
313if(!this.method){
314this.method="GET";
315}
316if(this.method!=="GET"){
317return ["script_only_get"];
318}
319if(this.queryElem.length){
320return ["script_no_form"];
321}
322if(this.url.length>JsHttpRequest.MAX_URL_LEN){
323return ["url_too_long",JsHttpRequest.MAX_URL_LEN];
324}
325if(req._reqHeaders.length){
326return ["no_headers","SCRIPT"];
327}
328var th=this,d=document,s=null,b=d.body;
329if(!window.opera){
330this.span=s=d.createElement("SCRIPT");
331var _44=function(){
332s.language="JavaScript";
333if(s.setAttribute){
334s.setAttribute("src",th.url);
335}else{
336s.src=th.url;
337}
338b.insertBefore(s,b.lastChild);
339};
340}else{
341this.span=s=d.createElement("SPAN");
342s.style.display="none";
343b.insertBefore(s,b.lastChild);
344s.innerHTML="Workaround for IE.<s"+"cript></"+"script>";
345var _44=function(){
346s=s.getElementsByTagName("SCRIPT")[0];
347s.language="JavaScript";
348if(s.setAttribute){
349s.setAttribute("src",th.url);
350}else{
351s.src=th.url;
352}
353};
354}
355JsHttpRequest.setTimeout(_44,10);
356return null;
357};
358}};
359JsHttpRequest.LOADERS.xml={loader:function(req){
360JsHttpRequest.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"});
361this.load=function(){
362if(this.queryElem.length){
363return ["xml_no_form_upl"];
364}
365if(this.url.match(new RegExp("^([a-z]+)://([^\\/]+)(.*)","i"))){
366if(RegExp.$2.toLowerCase()==document.location.hostname.toLowerCase()){
367this.url=RegExp.$3;
368}else{
369return ["xml_no_diffdom",RegExp.$2];
370}
371}
372var xr=null;
373if(window.XMLHttpRequest){
374try{
375xr=new XMLHttpRequest();
376}
377catch(e){
378}
379}else{
380if(window.ActiveXObject){
381try{
382xr=new ActiveXObject("Microsoft.XMLHTTP");
383}
384catch(e){
385}
386if(!xr){
387try{
388xr=new ActiveXObject("Msxml2.XMLHTTP");
389}
390catch(e){
391}
392}
393}
394}
395if(!xr){
396return ["xml_no"];
397}
398var _47=window.ActiveXObject||xr.setRequestHeader;
399if(!this.method){
400this.method=_47?"POST":"GET";
401}
402if(this.method=="GET"){
403if(this.queryText){
404this.url+=(this.url.indexOf("?")>=0?"&":"?")+this.queryText;
405}
406this.queryText="";
407if(this.url.length>JsHttpRequest.MAX_URL_LEN){
408return ["url_too_long",JsHttpRequest.MAX_URL_LEN];
409}
410}else{
411if(this.method=="POST"&&!_47){
412return ["xml_no_headers"];
413}
414}
415this.url+=(this.url.indexOf("?")>=0?"&":"?")+"JsHttpRequest="+(req.caching?"0":this.id)+"-xml";
416var id=this.id;
417xr.onreadystatechange=function(){
418if(xr.readyState!=4){
419return;
420}
421xr.onreadystatechange=JsHttpRequest._dummy;
422req.status=null;
423try{
424req.status=xr.status;
425req.responseText=xr.responseText;
426}
427catch(e){
428}
429if(!req.status){
430return;
431}
432try{
433eval("JsHttpRequest._tmp = function(id) { var d = "+req.responseText+"; d.id = id; JsHttpRequest.dataReady(d); }");
434}
435catch(e){
436return req._error("js_invalid",req.responseText);
437}
438JsHttpRequest._tmp(id);
439JsHttpRequest._tmp=null;
440};
441xr.open(this.method,this.url,true,this.username,this.password);
442if(_47){
443for(var i=0;i<req._reqHeaders.length;i++){
444xr.setRequestHeader(req._reqHeaders[i][0],req._reqHeaders[i][1]);
445}
446xr.setRequestHeader("Content-Type","application/octet-stream");
447}
448xr.send(this.queryText);
449this.span=null;
450this.xr=xr;
451return null;
452};
453this.getAllResponseHeaders=function(){
454return this.xr.getAllResponseHeaders();
455};
456this.getResponseHeader=function(_4a){
457return this.xr.getResponseHeader(_4a);
458};
459this.abort=function(){
460this.xr.abort();
461this.xr=null;
462};
463}};
464
465