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%",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(_1e instanceof Object){ 168var _22=false; 169for(var k in _1e){ 170var v=_1e[k]; 171if(v instanceof Function){ 172continue; 173} 174var _25=_1f?_1f+"["+this.escape(k)+"]":this.escape(k); 175var _26=v&&v.parentNode&&v.parentNode.appendChild&&v.tagName; 176if(_26){ 177var tn=v.tagName.toUpperCase(); 178if(tn=="FORM"){ 179_22=true; 180}else{ 181if(tn=="INPUT"||tn=="TEXTAREA"||tn=="SELECT"){ 182}else{
183return this._error("inv_form_el",(e.name||""),e.tagName); 184} 185} 186_21[_21.length]={name:_25,e:v}; 187}else{ 188if(v instanceof Object){ 189this._hash2query(v,_25,_20,_21); 190}else{ 191if(v===null){ 192continue; 193} 194_20[_20.length]=_25+"="+this.escape(""+v); 195} 196} 197if(_22&&_21.length>1){ 198return this._error("must_be_single_el"); 199} 200} 201}else{ 202_20[_20.length]=_1e; 203} 204return true; 205}; 206t._cleanup=function(){ 207var _28=this._ldObj; 208if(!_28){ 209return; 210} 211JsHttpRequest.PENDING[_28.id]=false; 212var _29=_28.span; 213if(!_29){ 214return; 215} 216_28.span=null; 217var _2a=function(){ 218_29.parentNode.removeChild(_29); 219}; 220JsHttpRequest.setTimeout(_2a,50); 221}; 222t._changeReadyState=function(s,_2c){ 223with(this){ 224if(_2c){ 225status=statusText=responseJS=null; 226responseText=""; 227} 228readyState=s; 229if(onreadystatechange){ 230onreadystatechange(); 231} 232} 233}; 234t.escape=function(s){ 235return escape(s).replace(new RegExp("\\+","g"),"%2B"); 236}; 237} 238JsHttpRequest.COUNT=0; 239JsHttpRequest.MAX_URL_LEN=2000; 240JsHttpRequest.CACHE={}; 241JsHttpRequest.PENDING={}; 242JsHttpRequest.LOADERS={}; 243JsHttpRequest._dummy=function(){ 244}; 245JsHttpRequest.TIMEOUTS={s:window.setTimeout,c:window.clearTimeout}; 246JsHttpRequest.setTimeout=function(_2e,dt){ 247window.JsHttpRequest_tmp=JsHttpRequest.TIMEOUTS.s; 248if(typeof (_2e)=="string"){ 249id=window.JsHttpRequest_tmp(_2e,dt); 250}else{ 251var id=null; 252var _31=function(){ 253_2e(); 254delete JsHttpRequest.TIMEOUTS[id]; 255}; 256id=window.JsHttpRequest_tmp(_31,dt); 257JsHttpRequest.TIMEOUTS[id]=_31; 258} 259window.JsHttpRequest_tmp=null; 260return id; 261}; 262JsHttpRequest.clearTimeout=function(id){ 263window.JsHttpRequest_tmp=JsHttpRequest.TIMEOUTS.c; 264delete JsHttpRequest.TIMEOUTS[id]; 265var r=window.JsHttpRequest_tmp(id); 266window.JsHttpRequest_tmp=null; 267return r; 268}; 269JsHttpRequest.query=function(url,_35,_36,_37){ 270var req=new this(); 271req.caching=!_37; 272req.onreadystatechange=function(){ 273if(req.readyState==4){ 274_36(req.responseJS,req.responseText); 275} 276}; 277var _39=null; 278if(url.match(/^((\w+)\.)?(GET|POST)\s+(.*)/i)){ 279req.loader=RegExp.$2?RegExp.$2:null; 280_39=RegExp.$3; 281url=RegExp.$4; 282} 283req.open(_39,url,true); 284req.send(_35); 285}; 286JsHttpRequest.dataReady=function(d){ 287var th=this.PENDING[d.id]; 288delete this.PENDING[d.id]; 289if(th){ 290th._dataReady(d.text,d.js); 291}else{ 292if(th!==false){ 293throw "dataReady(): unknown pending id: "+d.id; 294} 295} 296}; 297JsHttpRequest.extend=function(_3c,src){ 298for(var k in src){ 299_3c[k]=src[k]; 300} 301}; 302JsHttpRequest.LOADERS.xml={loader:function(req){ 303JsHttpRequest.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"}); 304this.load=function(){ 305if(this.queryElem.length){ 306return ["xml_no_form_upl"]; 307} 308if(this.url.match(new RegExp("^([a-z]+)://([^\\/]+)(.*)","i"))){ 309if(RegExp.$2.toLowerCase()==document.location.hostname.toLowerCase()){ 310this.url=RegExp.$3; 311}else{ 312return ["xml_no_diffdom",RegExp.$2]; 313} 314} 315var xr=null; 316if(window.XMLHttpRequest){ 317try{ 318xr=new XMLHttpRequest(); 319} 320catch(e){ 321} 322}else{ 323if(window.ActiveXObject){ 324try{ 325xr=new ActiveXObject("Microsoft.XMLHTTP"); 326} 327catch(e){ 328} 329if(!xr){ 330try{ 331xr=new ActiveXObject("Msxml2.XMLHTTP"); 332} 333catch(e){ 334} 335} 336} 337} 338if(!xr){ 339return ["xml_no"]; 340} 341var _41=window.ActiveXObject||xr.setRequestHeader; 342if(!this.method){ 343this.method=_41?"POST":"GET"; 344} 345if(this.method=="GET"){ 346if(this.queryText){ 347this.url+=(this.url.indexOf("?")>=0?"&":"?")+this.queryText; 348} 349this.queryText=""; 350if(this.url.length>JsHttpRequest.MAX_URL_LEN){ 351return ["url_too_long",JsHttpRequest.MAX_URL_LEN]; 352} 353}else{ 354if(this.method=="POST"&&!_41){ 355return ["xml_no_headers"]; 356} 357} 358this.url+=(this.url.indexOf("?")>=0?"&":"?")+"JsHttpRequest="+(req.caching?"0":this.id)+"-xml"; 359var id=this.id; 360xr.onreadystatechange=function(){ 361if(xr.readyState!=4){ 362return; 363} 364xr.onreadystatechange=JsHttpRequest._dummy; 365req.status=null; 366try{ 367req.status=xr.status; 368req.responseText=xr.responseText; 369} 370catch(e){ 371} 372if(!req.status){ 373return; 374} 375try{ 376eval("JsHttpRequest._tmp = function(id) { var d = "+req.responseText+"; d.id = id; JsHttpRequest.dataReady(d); }"); 377} 378catch(e){
379return req._error("js_invalid",req.responseText); 380} 381JsHttpRequest._tmp(id); 382JsHttpRequest._tmp=null; 383}; 384xr.open(this.method,this.url,true,this.username,this.password); 385if(_41){ 386for(var i=0;i<req._reqHeaders.length;i++){ 387xr.setRequestHeader(req._reqHeaders[i][0],req._reqHeaders[i][1]); 388} 389xr.setRequestHeader("Content-Type","application/octet-stream"); 390} 391xr.send(this.queryText); 392this.span=null; 393this.xr=xr; 394return null; 395}; 396this.getAllResponseHeaders=function(){ 397return this.xr.getAllResponseHeaders(); 398}; 399this.getResponseHeader=function(_44){ 400return this.xr.getResponseHeader(_44); 401}; 402this.abort=function(){ 403this.xr.abort(); 404this.xr=null; 405}; 406}}; 407JsHttpRequest.LOADERS.script={loader:function(req){ 408JsHttpRequest.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"}); 409this.load=function(){ 410if(this.queryText){ 411this.url+=(this.url.indexOf("?")>=0?"&":"?")+this.queryText; 412} 413this.url+=(this.url.indexOf("?")>=0?"&":"?")+"JsHttpRequest="+this.id+"-"+"script"; 414this.queryText=""; 415if(!this.method){ 416this.method="GET"; 417} 418if(this.method!=="GET"){ 419return ["script_only_get"]; 420} 421if(this.queryElem.length){ 422return ["script_no_form"]; 423} 424if(this.url.length>JsHttpRequest.MAX_URL_LEN){ 425return ["url_too_long",JsHttpRequest.MAX_URL_LEN]; 426} 427if(req._reqHeaders.length){ 428return ["no_headers","SCRIPT"]; 429} 430var th=this,d=document,s=null,b=d.body; 431if(!window.opera){ 432this.span=s=d.createElement("SCRIPT"); 433var _4a=function(){ 434s.language="JavaScript"; 435if(s.setAttribute){ 436s.setAttribute("src",th.url); 437}else{ 438s.src=th.url; 439} 440b.insertBefore(s,b.lastChild); 441}; 442}else{ 443this.span=s=d.createElement("SPAN"); 444s.style.display="none"; 445b.insertBefore(s,b.lastChild); 446s.innerHTML="Workaround for IE.<s"+"cript></"+"script>"; 447var _4a=function(){ 448s=s.getElementsByTagName("SCRIPT")[0]; 449s.language="JavaScript"; 450if(s.setAttribute){ 451s.setAttribute("src",th.url); 452}else{ 453s.src=th.url; 454} 455}; 456} 457JsHttpRequest.setTimeout(_4a,10); 458return null; 459}; 460}}; 461JsHttpRequest.LOADERS.form={loader:function(req){ 462JsHttpRequest.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."}); 463this.load=function(){ 464var th=this; 465if(!th.method){ 466th.method="POST"; 467} 468th.url+=(th.url.indexOf("?")>=0?"&":"?")+"JsHttpRequest="+th.id+"-"+"form"; 469if(req._reqHeaders.length){ 470return ["no_headers","FORM"]; 471} 472if(th.method=="GET"){ 473if(th.queryText){ 474th.url+=(th.url.indexOf("?")>=0?"&":"?")+th.queryText; 475} 476if(th.url.length>JsHttpRequest.MAX_URL_LEN){ 477return ["url_too_long",JsHttpRequest.MAX_URL_LEN]; 478} 479var p=th.url.split("?",2); 480th.url=p[0]; 481th.queryText=p[1]||""; 482} 483var _4e=null; 484var _4f=false; 485if(th.queryElem.length){ 486if(th.queryElem[0].e.tagName.toUpperCase()=="FORM"){ 487_4e=th.queryElem[0].e; 488_4f=true; 489th.queryElem=[]; 490}else{ 491_4e=th.queryElem[0].e.form; 492for(var i=0;i<th.queryElem.length;i++){ 493var e=th.queryElem[i].e; 494if(!e.form){ 495return ["form_el_not_belong",e.name]; 496} 497if(e.form!=_4e){ 498return ["form_el_belong_diff",e.name]; 499} 500} 501} 502if(th.method=="POST"){ 503var _52="multipart/form-data"; 504var _53=(_4e.attributes.encType&&_4e.attributes.encType.nodeValue)||(_4e.attributes.enctype&&_4e.attributes.enctype.value)||_4e.enctype; 505if(_53!=_52){ 506return ["form_el_inv_enctype",_52,_53]; 507} 508} 509} 510var d=_4e&&(_4e.ownerDocument||_4e.document)||document; 511var _55="jshr_i_"+th.id; 512var s=th.span=d.createElement("DIV"); 513s.style.position="absolute"; 514s.style.visibility="hidden"; 515s.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>"; 516if(!_4e){ 517_4e=th.span.firstChild; 518} 519d.body.insertBefore(s,d.body.lastChild); 520var _57=function(e,_59){ 521var sv=[]; 522var _5b=e; 523if(e.mergeAttributes){ 524var _5b=d.createElement("form"); 525_5b.mergeAttributes(e,false); 526} 527for(var i=0;i<_59.length;i++){ 528var k=_59[i][0],v=_59[i][1]; 529sv[sv.length]=[k,_5b.getAttribute(k)]; 530_5b.setAttribute(k,v); 531} 532if(e.mergeAttributes){
533e.mergeAttributes(_5b,false); 534} 535return sv; 536}; 537var _5f=function(){ 538top.JsHttpRequestGlobal=JsHttpRequest; 539var _60=[]; 540if(!_4f){ 541for(var i=0,n=_4e.elements.length;i<n;i++){ 542_60[i]=_4e.elements[i].name; 543_4e.elements[i].name=""; 544} 545} 546var qt=th.queryText.split("&"); 547for(var i=qt.length-1;i>=0;i--){ 548var _64=qt[i].split("=",2); 549var e=d.createElement("INPUT"); 550e.type="hidden"; 551e.name=unescape(_64[0]); 552e.value=_64[1]!=null?unescape(_64[1]):""; 553_4e.appendChild(e); 554} 555for(var i=0;i<th.queryElem.length;i++){ 556th.queryElem[i].e.name=th.queryElem[i].name; 557} 558var sv=_57(_4e,[["action",th.url],["method",th.method],["onsubmit",null],["target",_55]]); 559_4e.submit(); 560_57(_4e,sv); 561for(var i=0;i<qt.length;i++){ 562_4e.lastChild.parentNode.removeChild(_4e.lastChild); 563} 564if(!_4f){ 565for(var i=0,n=_4e.elements.length;i<n;i++){ 566_4e.elements[i].name=_60[i]; 567} 568} 569}; 570JsHttpRequest.setTimeout(_5f,100); 571return null; 572}; 573}}; 574
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.