root/cemail/JsHttpRequest.js

Revision 51, 8.4 kB (checked in by teiko, 4 years ago)

набросок cemail

Line 
1 /**
2  * JsHttpRequest: JavaScript "AJAX" data loader (script 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  */
9 function JsHttpRequest(){
10 var t=this;
11 t.onreadystatechange=null;
12 t.readyState=0;
13 t.responseText=null;
14 t.responseXML=null;
15 t.status=200;
16 t.statusText="OK";
17 t.responseJS=null;
18 t.caching=false;
19 t.loader=null;
20 t.session_name="PHPSESSID";
21 t._ldObj=null;
22 t._reqHeaders=[];
23 t._openArgs=null;
24 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%"};
25 t.abort=function(){
26 with(this){
27 if(_ldObj&&_ldObj.abort){
28 _ldObj.abort();
29 }
30 _cleanup();
31 if(readyState==0){
32 return;
33 }
34 if(readyState==1&&!_ldObj){
35 readyState=0;
36 return;
37 }
38 _changeReadyState(4,true);
39 }
40 };
41 t.open=function(_2,_3,_4,_5,_6){
42 with(this){
43 if(_3.match(/^((\w+)\.)?(GET|POST)\s+(.*)/i)){
44 this.loader=RegExp.$2?RegExp.$2:null;
45 _2=RegExp.$3;
46 _3=RegExp.$4;
47 }
48 try{
49 if(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 }
53 catch(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);
58 return true;
59 }
60 };
61 t.send=function(_7){
62 if(!this.readyState){
63 return;
64 }
65 this._changeReadyState(1,true);
66 this._ldObj=null;
67 var _8=[];
68 var _9=[];
69 if(!this._hash2query(_7,null,_8,_9)){
70 return;
71 }
72 var _a=null;
73 if(this.caching&&!_9.length){
74 _a=this._openArgs.username+":"+this._openArgs.password+"@"+this._openArgs.url+"|"+_8+"#"+this._openArgs.method;
75 var _b=JsHttpRequest.CACHE[_a];
76 if(_b){
77 this._dataReady(_b[0],_b[1]);
78 return false;
79 }
80 }
81 var _c=(this.loader||"").toLowerCase();
82 if(_c&&!JsHttpRequest.LOADERS[_c]){
83 return this._error("unk_loader",_c);
84 }
85 var _d=[];
86 var _e=JsHttpRequest.LOADERS;
87 for(var _f in _e){
88 var ldr=_e[_f].loader;
89 if(!ldr){
90 continue;
91 }
92 if(_c&&_f!=_c){
93 continue;
94 }
95 var _11=new ldr(this);
96 JsHttpRequest.extend(_11,this._openArgs);
97 JsHttpRequest.extend(_11,{queryText:_8.join("&"),queryElem:_9,id:(new Date().getTime())+""+JsHttpRequest.COUNT++,hash:_a,span:null});
98 var _12=_11.load();
99 if(!_12){
100 this._ldObj=_11;
101 JsHttpRequest.PENDING[_11.id]=this;
102 return true;
103 }
104 if(!_c){
105 _d[_d.length]="- "+_f.toUpperCase()+": "+this._l(_12);
106 }else{
107 return this._error(_12);
108 }
109 }
110 return _f?this._error("no_loader_matched",_d.join("\n")):this._error("no_loaders");
111 };
112 t.getAllResponseHeaders=function(){
113 with(this){
114 return _ldObj&&_ldObj.getAllResponseHeaders?_ldObj.getAllResponseHeaders():[];
115 }
116 };
117 t.getResponseHeader=function(_13){
118 with(this){
119 return _ldObj&&_ldObj.getResponseHeader?_ldObj.getResponseHeader(_13):null;
120 }
121 };
122 t.setRequestHeader=function(_14,_15){
123 with(this){
124 _reqHeaders[_reqHeaders.length]=[_14,_15];
125 }
126 };
127 t._dataReady=function(_16,js){
128 with(this){
129 if(caching&&_ldObj){
130 JsHttpRequest.CACHE[_ldObj.hash]=[_16,js];
131 }
132 responseText=responseXML=_16;
133 responseJS=js;
134 if(js!==null){
135 status=200;
136 statusText="OK";
137 }else{
138 status=500;
139 statusText="Internal Server Error";
140 }
141 _changeReadyState(2);
142 _changeReadyState(3);
143 _changeReadyState(4);
144 _cleanup();
145 }
146 };
147 t._l=function(_18){
148 var i=0,p=0,msg=this._errors[_18[0]];
149 while((p=msg.indexOf("%",p))>=0){
150 var a=_18[++i]+"";
151 msg=msg.substring(0,p)+a+msg.substring(p+1,msg.length);
152 p+=1+a.length;
153 }
154 return msg;
155 };
156 t._error=function(msg){
157 msg=this._l(typeof (msg)=="string"?arguments:msg);
158 msg="JsHttpRequest: "+msg;
159 if(!window.Error){
160 throw msg;
161 }else{
162 if((new Error(1,"test")).description=="test"){
163 throw new Error(1,msg);
164 }else{
165 throw new Error(msg);
166 }
167 }
168 };
169 t._hash2query=function(_1e,_1f,_20,_21){
170 if(_1f==null){
171 _1f="";
172 }
173 if((""+typeof (_1e)).toLowerCase()=="object"){
174 var _22=false;
175 if(_1e&&_1e.parentNode&&_1e.parentNode.appendChild&&_1e.tagName&&_1e.tagName.toUpperCase()=="FORM"){
176 _1e={form:_1e};
177 }
178 for(var k in _1e){
179 var v=_1e[k];
180 if(v instanceof Function){
181 continue;
182 }
183 var _25=_1f?_1f+"["+this.escape(k)+"]":this.escape(k);
184 var _26=v&&v.parentNode&&v.parentNode.appendChild&&v.tagName;
185 if(_26){
186 var tn=v.tagName.toUpperCase();
187 if(tn=="FORM"){
188 _22=true;
189 }else{
190 if(tn=="INPUT"||tn=="TEXTAREA"||tn=="SELECT"){
191 }else{
192 return this._error("inv_form_el",(v.name||""),v.tagName);
193 }
194 }
195 _21[_21.length]={name:_25,e:v};
196 }else{
197 if(v instanceof Object){
198 this._hash2query(v,_25,_20,_21);
199 }else{
200 if(v===null){
201 continue;
202 }
203 if(v===true){
204 v=1;
205 }
206 if(v===false){
207 v="";
208 }
209 _20[_20.length]=_25+"="+this.escape(""+v);
210 }
211 }
212 if(_22&&_21.length>1){
213 return this._error("must_be_single_el");
214 }
215 }
216 }else{
217 _20[_20.length]=_1e;
218 }
219 return true;
220 };
221 t._cleanup=function(){
222 var _28=this._ldObj;
223 if(!_28){
224 return;
225 }
226 JsHttpRequest.PENDING[_28.id]=false;
227 var _29=_28.span;
228 if(!_29){
229 return;
230 }
231 _28.span=null;
232 var _2a=function(){
233 _29.parentNode.removeChild(_29);
234 };
235 JsHttpRequest.setTimeout(_2a,50);
236 };
237 t._changeReadyState=function(s,_2c){
238 with(this){
239 if(_2c){
240 status=statusText=responseJS=null;
241 responseText="";
242 }
243 readyState=s;
244 if(onreadystatechange){
245 onreadystatechange();
246 }
247 }
248 };
249 t.escape=function(s){
250 return escape(s).replace(new RegExp("\\+","g"),"%2B");
251 };
252 }
253 JsHttpRequest.COUNT=0;
254 JsHttpRequest.MAX_URL_LEN=2000;
255 JsHttpRequest.CACHE={};
256 JsHttpRequest.PENDING={};
257 JsHttpRequest.LOADERS={};
258 JsHttpRequest._dummy=function(){
259 };
260 JsHttpRequest.TIMEOUTS={s:window.setTimeout,c:window.clearTimeout};
261 JsHttpRequest.setTimeout=function(_2e,dt){
262 window.JsHttpRequest_tmp=JsHttpRequest.TIMEOUTS.s;
263 if(typeof (_2e)=="string"){
264 id=window.JsHttpRequest_tmp(_2e,dt);
265 }else{
266 var id=null;
267 var _31=function(){
268 _2e();
269 delete JsHttpRequest.TIMEOUTS[id];
270 };
271 id=window.JsHttpRequest_tmp(_31,dt);
272 JsHttpRequest.TIMEOUTS[id]=_31;
273 }
274 window.JsHttpRequest_tmp=null;
275 return id;
276 };
277 JsHttpRequest.clearTimeout=function(id){
278 window.JsHttpRequest_tmp=JsHttpRequest.TIMEOUTS.c;
279 delete JsHttpRequest.TIMEOUTS[id];
280 var r=window.JsHttpRequest_tmp(id);
281 window.JsHttpRequest_tmp=null;
282 return r;
283 };
284 JsHttpRequest.query=function(url,_35,_36,_37){
285 var req=new this();
286 req.caching=!_37;
287 req.onreadystatechange=function(){
288 if(req.readyState==4){
289 _36(req.responseJS,req.responseText);
290 }
291 };
292 req.open(null,url,true);
293 req.send(_35);
294 };
295 JsHttpRequest.dataReady=function(d){
296 var th=this.PENDING[d.id];
297 delete this.PENDING[d.id];
298 if(th){
299 th._dataReady(d.text,d.js);
300 }else{
301 if(th!==false){
302 throw "dataReady(): unknown pending id: "+d.id;
303 }
304 }
305 };
306 JsHttpRequest.extend=function(_3b,src){
307 for(var k in src){
308 _3b[k]=src[k];
309 }
310 };
311 JsHttpRequest.LOADERS.script={loader:function(req){
312 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"});
313 this.load=function(){
314 if(this.queryText){
315 this.url+=(this.url.indexOf("?")>=0?"&":"?")+this.queryText;
316 }
317 this.url+=(this.url.indexOf("?")>=0?"&":"?")+"JsHttpRequest="+this.id+"-"+"script";
318 this.queryText="";
319 if(!this.method){
320 this.method="GET";
321 }
322 if(this.method!=="GET"){
323 return ["script_only_get"];
324 }
325 if(this.queryElem.length){
326 return ["script_no_form"];
327 }
328 if(this.url.length>JsHttpRequest.MAX_URL_LEN){
329 return ["url_too_long",JsHttpRequest.MAX_URL_LEN];
330 }
331 var th=this,d=document,s=null,b=d.body;
332 if(!window.opera){
333 this.span=s=d.createElement("SCRIPT");
334 var _43=function(){
335 s.language="JavaScript";
336 if(s.setAttribute){
337 s.setAttribute("src",th.url);
338 }else{
339 s.src=th.url;
340 }
341 b.insertBefore(s,b.lastChild);
342 };
343 }else{
344 this.span=s=d.createElement("SPAN");
345 s.style.display="none";
346 b.insertBefore(s,b.lastChild);
347 s.innerHTML="Workaround for IE.<s"+"cript></"+"script>";
348 var _43=function(){
349 s=s.getElementsByTagName("SCRIPT")[0];
350 s.language="JavaScript";
351 if(s.setAttribute){
352 s.setAttribute("src",th.url);
353 }else{
354 s.src=th.url;
355 }
356 };
357 }
358 JsHttpRequest.setTimeout(_43,10);
359 return null;
360 };
361 }};
362
Note: See TracBrowser for help on using the browser.