1/** 2 * JsHttpRequest: JavaScript "AJAX" data loader 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%"}; 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){ 43if(_3.match(/^((\w+)\.)?(GET|POST)\s+(.*)/i)){ 44this.loader=RegExp.$2?RegExp.$2:null; 45_2=RegExp.$3; 46_3=RegExp.$4; 47} 48try{ 49if(document.location.search.match(new RegExp("[&?]"+session_name+"=([^&?]*)"))||document.cookie.match(new RegExp("(?:;|^)\\s*"+session_name+"=([^;]*)"))){ 50_3+=(_3.indexOf("?")>=0?"&":"?")+session_name+"="+this.escape(RegExp.$1); 51} 52} 53catch(e){ 54} 55_openArgs={method:(_2||"").toUpperCase(),url:_3,asyncFlag:_4,username:_5!=null?_5:"",password:_6!=null?_6:""}; 56_ldObj=null; 57_changeReadyState(1,true); 58return true; 59} 60}; 61t.send=function(_7){ 62if(!this.readyState){ 63return; 64} 65this._changeReadyState(1,true); 66this._ldObj=null; 67var _8=[]; 68var _9=[]; 69if(!this._hash2query(_7,null,_8,_9)){ 70return; 71} 72var _a=null; 73if(this.caching&&!_9.length){ 74_a=this._openArgs.username+":"+this._openArgs.password+"@"+this._openArgs.url+"|"+_8+"#"+this._openArgs.method; 75var _b=JsHttpRequest.CACHE[_a]; 76if(_b){ 77this._dataReady(_b[0],_b[1]); 78return false; 79} 80} 81var _c=(this.loader||"").toLowerCase(); 82if(_c&&!JsHttpRequest.LOADERS[_c]){ 83return this._error("unk_loader",_c); 84} 85var _d=[]; 86var _e=JsHttpRequest.LOADERS; 87for(var _f in _e){ 88var ldr=_e[_f].loader; 89if(!ldr){ 90continue; 91} 92if(_c&&_f!=_c){ 93continue; 94} 95var _11=new ldr(this); 96JsHttpRequest.extend(_11,this._openArgs); 97JsHttpRequest.extend(_11,{queryText:_8.join("&"),queryElem:_9,id:(new Date().getTime())+""+JsHttpRequest.COUNT++,hash:_a,span:null}); 98var _12=_11.load(); 99if(!_12){ 100this._ldObj=_11; 101JsHttpRequest.PENDING[_11.id]=this; 102return true; 103} 104if(!_c){ 105_d[_d.length]="- "+_f.toUpperCase()+": "+this._l(_12); 106}else{ 107return this._error(_12); 108} 109} 110return _f?this._error("no_loader_matched",_d.join("\n")):this._error("no_loaders"); 111}; 112t.getAllResponseHeaders=function(){ 113with(this){ 114return _ldObj&&_ldObj.getAllResponseHeaders?_ldObj.getAllResponseHeaders():[]; 115} 116}; 117t.getResponseHeader=function(_13){ 118with(this){ 119return _ldObj&&_ldObj.getResponseHeader?_ldObj.getResponseHeader(_13):null; 120} 121}; 122t.setRequestHeader=function(_14,_15){ 123with(this){ 124_reqHeaders[_reqHeaders.length]=[_14,_15]; 125} 126}; 127t._dataReady=function(_16,js){ 128with(this){ 129if(caching&&_ldObj){ 130JsHttpRequest.CACHE[_ldObj.hash]=[_16,js]; 131} 132responseText=responseXML=_16; 133responseJS=js; 134if(js!==null){ 135status=200; 136statusText="OK"; 137}else{ 138status=500; 139statusText="Internal Server Error"; 140} 141_changeReadyState(2); 142_changeReadyState(3); 143_changeReadyState(4); 144_cleanup(); 145} 146}; 147t._l=function(_18){ 148var i=0,p=0,msg=this._errors[_18[0]]; 149while((p=msg.indexOf("%",p))>=0){ 150var a=_18[++i]+""; 151msg=msg.substring(0,p)+a+msg.substring(p+1,msg.length); 152p+=1+a.length; 153} 154return msg; 155}; 156t._error=function(msg){ 157msg=this._l(typeof (msg)=="string"?arguments:msg); 158msg="JsHttpRequest: "+msg; 159if(!window.Error){ 160throw msg; 161}else{ 162if((new Error(1,"test")).description=="test"){ 163throw new Error(1,msg); 164}else{ 165throw new Error(msg); 166} 167} 168}; 169t._hash2query=function(_1e,_1f,_20,_21){ 170if(_1f==null){ 171_1f=""; 172} 173if((""+typeof (_1e)).toLowerCase()=="object"){ 174var _22=false; 175if(_1e&&_1e.parentNode&&_1e.parentNode.appendChild&&_1e.tagName&&_1e.tagName.toUpperCase()=="FORM"){ 176_1e={form:_1e}; 177} 178for(var k in _1e){ 179var v=_1e[k]; 180if(v instanceof Function){ 181continue; 182} 183var _25=_1f?_1f+"["+this.escape(k)+"]":this.escape(k); 184var _26=v&&v.parentNode&&v.parentNode.appendChild&&v.tagName; 185if(_26){ 186var tn=v.tagName.toUpperCase(); 187if(tn=="FORM"){ 188_22=true; 189}else{ 190if(tn=="INPUT"||tn=="TEXTAREA"||tn=="SELECT"){ 191}else{ 192return this._error("inv_form_el",(v.name||""),v.tagName); 193} 194} 195_21[_21.length]={name:_25,e:v}; 196}else{ 197if(v instanceof Object){ 198this._hash2query(v,_25,_20,_21); 199}else{ 200if(v===null){ 201continue; 202} 203if(v===true){ 204v=1; 205} 206if(v===false){ 207v=""; 208} 209_20[_20.length]=_25+"="+this.escape(""+v); 210} 211} 212if(_22&&_21.length>1){ 213return this._error("must_be_single_el"); 214} 215} 216}else{ 217_20[_20.length]=_1e; 218} 219return true; 220}; 221t._cleanup=function(){ 222var _28=this._ldObj; 223if(!_28){ 224return; 225} 226JsHttpRequest.PENDING[_28.id]=false; 227var _29=_28.span; 228if(!_29){ 229return; 230} 231_28.span=null; 232var _2a=function(){ 233_29.parentNode.removeChild(_29); 234}; 235JsHttpRequest.setTimeout(_2a,50); 236}; 237t._changeReadyState=function(s,_2c){ 238with(this){ 239if(_2c){ 240status=statusText=responseJS=null; 241responseText=""; 242} 243readyState=s; 244if(onreadystatechange){ 245onreadystatechange(); 246} 247} 248}; 249t.escape=function(s){ 250return escape(s).replace(new RegExp("\\+","g"),"%2B"); 251}; 252} 253JsHttpRequest.COUNT=0; 254JsHttpRequest.MAX_URL_LEN=2000; 255JsHttpRequest.CACHE={}; 256JsHttpRequest.PENDING={}; 257JsHttpRequest.LOADERS={}; 258JsHttpRequest._dummy=function(){ 259}; 260JsHttpRequest.TIMEOUTS={s:window.setTimeout,c:window.clearTimeout}; 261JsHttpRequest.setTimeout=function(_2e,dt){ 262window.JsHttpRequest_tmp=JsHttpRequest.TIMEOUTS.s;
263if(typeof (_2e)=="string"){ 264id=window.JsHttpRequest_tmp(_2e,dt); 265}else{ 266var id=null; 267var _31=function(){ 268_2e(); 269delete JsHttpRequest.TIMEOUTS[id]; 270}; 271id=window.JsHttpRequest_tmp(_31,dt); 272JsHttpRequest.TIMEOUTS[id]=_31; 273} 274window.JsHttpRequest_tmp=null; 275return id; 276}; 277JsHttpRequest.clearTimeout=function(id){ 278window.JsHttpRequest_tmp=JsHttpRequest.TIMEOUTS.c; 279delete JsHttpRequest.TIMEOUTS[id]; 280var r=window.JsHttpRequest_tmp(id); 281window.JsHttpRequest_tmp=null; 282return r; 283}; 284JsHttpRequest.query=function(url,_35,_36,_37){ 285var req=new this(); 286req.caching=!_37; 287req.onreadystatechange=function(){ 288if(req.readyState==4){ 289_36(req.responseJS,req.responseText); 290} 291}; 292req.open(null,url,true); 293req.send(_35); 294}; 295JsHttpRequest.dataReady=function(d){ 296var th=this.PENDING[d.id]; 297delete this.PENDING[d.id]; 298if(th){ 299th._dataReady(d.text,d.js); 300}else{ 301if(th!==false){ 302throw "dataReady(): unknown pending id: "+d.id; 303} 304} 305}; 306JsHttpRequest.extend=function(_3b,src){ 307for(var k in src){ 308_3b[k]=src[k]; 309} 310}; 311JsHttpRequest.LOADERS.xml={loader:function(req){ 312JsHttpRequest.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"}); 313this.load=function(){ 314if(this.queryElem.length){ 315return ["xml_no_form_upl"]; 316} 317if(this.url.match(new RegExp("^([a-z]+://[^\\/]+)(.*)","i"))){ 318if(RegExp.$1.toLowerCase()!=document.location.protocol+"//"+document.location.hostname.toLowerCase()){ 319return ["xml_no_diffdom",RegExp.$1]; 320} 321} 322var xr=null; 323if(window.XMLHttpRequest){ 324try{ 325xr=new XMLHttpRequest(); 326} 327catch(e){ 328} 329}else{ 330if(window.ActiveXObject){ 331try{ 332xr=new ActiveXObject("Microsoft.XMLHTTP"); 333} 334catch(e){ 335} 336if(!xr){ 337try{ 338xr=new ActiveXObject("Msxml2.XMLHTTP"); 339} 340catch(e){ 341} 342} 343} 344} 345if(!xr){ 346return ["xml_no"]; 347} 348var _40=window.ActiveXObject||xr.setRequestHeader; 349if(!this.method){ 350this.method=_40&&this.queryText.length?"POST":"GET"; 351} 352if(this.method=="GET"){ 353if(this.queryText){ 354this.url+=(this.url.indexOf("?")>=0?"&":"?")+this.queryText; 355} 356this.queryText=""; 357if(this.url.length>JsHttpRequest.MAX_URL_LEN){ 358return ["url_too_long",JsHttpRequest.MAX_URL_LEN]; 359} 360}else{ 361if(this.method=="POST"&&!_40){ 362return ["xml_no_headers"]; 363} 364} 365this.url+=(this.url.indexOf("?")>=0?"&":"?")+"JsHttpRequest="+(req.caching?"0":this.id)+"-xml"; 366var id=this.id; 367xr.onreadystatechange=function(){ 368if(xr.readyState!=4){ 369return; 370} 371xr.onreadystatechange=JsHttpRequest._dummy; 372req.status=null; 373try{ 374req.status=xr.status; 375req.responseText=xr.responseText; 376} 377catch(e){ 378} 379if(!req.status){ 380return; 381} 382try{ 383var _42=req.responseText||"{ js: null, text: null }"; 384eval("JsHttpRequest._tmp = function(id) { var d = "+_42+"; d.id = id; JsHttpRequest.dataReady(d); }"); 385} 386catch(e){ 387return req._error("js_invalid",req.responseText); 388} 389JsHttpRequest._tmp(id); 390JsHttpRequest._tmp=null; 391}; 392xr.open(this.method,this.url,true,this.username,this.password); 393if(_40){ 394for(var i=0;i<req._reqHeaders.length;i++){ 395xr.setRequestHeader(req._reqHeaders[i][0],req._reqHeaders[i][1]); 396} 397xr.setRequestHeader("Content-Type","application/octet-stream"); 398} 399xr.send(this.queryText); 400this.span=null; 401this.xr=xr; 402return null; 403}; 404this.getAllResponseHeaders=function(){ 405return this.xr.getAllResponseHeaders(); 406}; 407this.getResponseHeader=function(_44){ 408return this.xr.getResponseHeader(_44); 409}; 410this.abort=function(){ 411this.xr.abort(); 412this.xr=null; 413}; 414}}; 415JsHttpRequest.LOADERS.script={loader:function(req){ 416JsHttpRequest.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"}); 417this.load=function(){ 418if(this.queryText){ 419this.url+=(this.url.indexOf("?")>=0?"&":"?")+this.queryText; 420} 421this.url+=(this.url.indexOf("?")>=0?"&":"?")+"JsHttpRequest="+this.id+"-"+"script"; 422this.queryText=""; 423if(!this.method){ 424this.method="GET"; 425} 426if(this.method!=="GET"){ 427return ["script_only_get"]; 428} 429if(this.queryElem.length){ 430return ["script_no_form"]; 431} 432if(this.url.length>JsHttpRequest.MAX_URL_LEN){ 433return ["url_too_long",JsHttpRequest.MAX_URL_LEN]; 434} 435var th=this,d=document,s=null,b=d.body; 436if(!window.opera){ 437this.span=s=d.createElement("SCRIPT"); 438var _4a=function(){ 439s.language="JavaScript"; 440if(s.setAttribute){ 441s.setAttribute("src",th.url); 442}else{ 443s.src=th.url; 444} 445b.insertBefore(s,b.lastChild); 446}; 447}else{ 448this.span=s=d.createElement("SPAN"); 449s.style.display="none"; 450b.insertBefore(s,b.lastChild); 451s.innerHTML="Workaround for IE.<s"+"cript></"+"script>"; 452var _4a=function(){ 453s=s.getElementsByTagName("SCRIPT")[0]; 454s.language="JavaScript"; 455if(s.setAttribute){ 456s.setAttribute("src",th.url); 457}else{ 458s.src=th.url; 459} 460}; 461} 462JsHttpRequest.setTimeout(_4a,10); 463return null; 464}; 465}}; 466JsHttpRequest.LOADERS.form={loader:function(req){ 467JsHttpRequest.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."}); 468this.load=function(){ 469var th=this; 470if(!th.method){ 471th.method="POST"; 472} 473th.url+=(th.url.indexOf("?")>=0?"&":"?")+"JsHttpRequest="+th.id+"-"+"form"; 474if(th.method=="GET"){ 475if(th.queryText){ 476th.url+=(th.url.indexOf("?")>=0?"&":"?")+th.queryText; 477} 478if(th.url.length>JsHttpRequest.MAX_URL_LEN){ 479return ["url_too_long",JsHttpRequest.MAX_URL_LEN]; 480} 481var p=th.url.split("?",2); 482th.url=p[0]; 483th.queryText=p[1]||""; 484} 485var _4e=null; 486var _4f=false; 487if(th.queryElem.length){ 488if(th.queryElem[0].e.tagName.toUpperCase()=="FORM"){ 489_4e=th.queryElem[0].e; 490_4f=true; 491th.queryElem=[]; 492}else{ 493_4e=th.queryElem[0].e.form; 494for(var i=0;i<th.queryElem.length;i++){ 495var e=th.queryElem[i].e; 496if(!e.form){ 497return ["form_el_not_belong",e.name]; 498} 499if(e.form!=_4e){ 500return ["form_el_belong_diff",e.name]; 501} 502} 503} 504if(th.method=="POST"){ 505var _52="multipart/form-data"; 506var _53=(_4e.attributes.encType&&_4e.attributes.encType.nodeValue)||(_4e.attributes.enctype&&_4e.attributes.enctype.value)||_4e.enctype; 507if(_53!=_52){ 508return ["form_el_inv_enctype",_52,_53]; 509} 510} 511} 512var d=_4e&&(_4e.ownerDocument||_4e.document)||document; 513var _55="jshr_i_"+th.id; 514var s=th.span=d.createElement("DIV"); 515s.style.position="absolute"; 516s.style.display="none"; 517s.style.visibility="hidden"; 518s.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>"; 519if(!_4e){ 520_4e=th.span.firstChild; 521} 522d.body.insertBefore(s,d.body.lastChild); 523var _57=function(e,_59){ 524var sv=[]; 525var _5b=e; 526if(e.mergeAttributes){ 527var _5b=d.createElement("form"); 528_5b.mergeAttributes(e,false); 529} 530for(var i=0;i<_59.length;i++){ 531var k=_59[i][0],v=_59[i][1]; 532sv[sv.length]=[k,_5b.getAttribute(k)]; 533_5b.setAttribute(k,v); 534} 535if(e.mergeAttributes){
536e.mergeAttributes(_5b,false); 537} 538return sv; 539}; 540var _5f=function(){ 541top.JsHttpRequestGlobal=JsHttpRequest; 542var _60=[]; 543if(!_4f){ 544for(var i=0,n=_4e.elements.length;i<n;i++){ 545_60[i]=_4e.elements[i].name; 546_4e.elements[i].name=""; 547} 548} 549var qt=th.queryText.split("&"); 550for(var i=qt.length-1;i>=0;i--){ 551var _64=qt[i].split("=",2); 552var e=d.createElement("INPUT"); 553e.type="hidden"; 554e.name=unescape(_64[0]); 555e.value=_64[1]!=null?unescape(_64[1]):""; 556_4e.appendChild(e); 557} 558for(var i=0;i<th.queryElem.length;i++){ 559th.queryElem[i].e.name=th.queryElem[i].name; 560} 561var sv=_57(_4e,[["action",th.url],["method",th.method],["onsubmit",null],["target",_55]]); 562_4e.submit(); 563_57(_4e,sv); 564for(var i=0;i<qt.length;i++){ 565_4e.lastChild.parentNode.removeChild(_4e.lastChild); 566} 567if(!_4f){ 568for(var i=0,n=_4e.elements.length;i<n;i++){ 569_4e.elements[i].name=_60[i]; 570} 571} 572}; 573JsHttpRequest.setTimeout(_5f,100); 574return null; 575}; 576}}; 577
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.