Upgrade to ExtJS 3.0.0 - Released 07/06/2009
[extjs.git] / docs / source / ext-base-ajax.html
1 <html>\r
2 <head>\r
3   <title>The source code</title>\r
4     <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />\r
5     <script type="text/javascript" src="../resources/prettify/prettify.js"></script>\r
6 </head>\r
7 <body  onload="prettyPrint();">\r
8     <pre class="prettyprint lang-js">/*\r
9  * Portions of this file are based on pieces of Yahoo User Interface Library\r
10  * Copyright (c) 2007, Yahoo! Inc. All rights reserved.\r
11  * YUI licensed under the BSD License:\r
12  * http://developer.yahoo.net/yui/license.txt\r
13  */\r
14     Ext.lib.Ajax = function() {     \r
15             var activeX = ['MSXML2.XMLHTTP.3.0',\r
16                                    'MSXML2.XMLHTTP',\r
17                                    'Microsoft.XMLHTTP'],\r
18             CONTENTTYPE = 'Content-Type';\r
19                                    \r
20                 // private\r
21                 function setHeader(o) {\r
22                 var conn = o.conn,\r
23                         prop;\r
24                 \r
25                 function setTheHeaders(conn, headers){\r
26                         for (prop in headers) {\r
27                     if (headers.hasOwnProperty(prop)) {\r
28                         conn.setRequestHeader(prop, headers[prop]);\r
29                     }\r
30                 }   \r
31                 }               \r
32                 \r
33             if (pub.defaultHeaders) {\r
34                     setTheHeaders(conn, pub.defaultHeaders);\r
35             }\r
36 \r
37             if (pub.headers) {\r
38                                 setTheHeaders(conn, pub.headers);\r
39                 pub.headers = null;                \r
40             }\r
41         }    \r
42         \r
43         // private\r
44         function createExceptionObject(tId, callbackArg, isAbort, isTimeout) {          \r
45             return {\r
46                     tId : tId,\r
47                     status : isAbort ? -1 : 0,\r
48                     statusText : isAbort ? 'transaction aborted' : 'communication failure',\r
49                     isAbort: true,\r
50                     isTimeout: true,\r
51                     argument : callbackArg\r
52             };\r
53         }  \r
54         \r
55         // private \r
56         function initHeader(label, value) {         \r
57                         (pub.headers = pub.headers || {})[label] = value;                                   \r
58         }\r
59             \r
60         // private\r
61         function createResponseObject(o, callbackArg) {\r
62             var headerObj = {},\r
63                 headerStr,              \r
64                 conn = o.conn,\r
65                 t,\r
66                 s;\r
67 \r
68             try {\r
69                 headerStr = o.conn.getAllResponseHeaders();   \r
70                 Ext.each(headerStr.replace(/\r\n/g, '\n').split('\n'), function(v){\r
71                     t = v.indexOf(':');\r
72                     if(t >= 0){\r
73                         s = v.substr(0, t).toLowerCase();\r
74                         if(v.charAt(t + 1) == ' '){\r
75                             ++t;\r
76                         }\r
77                         headerObj[s] = v.substr(t + 1);\r
78                     }\r
79                 });\r
80             } catch(e) {}\r
81                         \r
82             return {\r
83                 tId : o.tId,\r
84                 status : conn.status,\r
85                 statusText : conn.statusText,\r
86                 getResponseHeader : function(header){return headerObj[header.toLowerCase()];},\r
87                 getAllResponseHeaders : function(){return headerStr},\r
88                 responseText : conn.responseText,\r
89                 responseXML : conn.responseXML,\r
90                 argument : callbackArg\r
91             };\r
92         }\r
93         \r
94         // private\r
95         function releaseObject(o) {\r
96             o.conn = null;\r
97             o = null;\r
98         }        \r
99             \r
100         // private\r
101         function handleTransactionResponse(o, callback, isAbort, isTimeout) {\r
102             if (!callback) {\r
103                 releaseObject(o);\r
104                 return;\r
105             }\r
106 \r
107             var httpStatus, responseObject;\r
108 \r
109             try {\r
110                 if (o.conn.status !== undefined && o.conn.status != 0) {\r
111                     httpStatus = o.conn.status;\r
112                 }\r
113                 else {\r
114                     httpStatus = 13030;\r
115                 }\r
116             }\r
117             catch(e) {\r
118                 httpStatus = 13030;\r
119             }\r
120 \r
121             if ((httpStatus >= 200 && httpStatus < 300) || (Ext.isIE && httpStatus == 1223)) {\r
122                 responseObject = createResponseObject(o, callback.argument);\r
123                 if (callback.success) {\r
124                     if (!callback.scope) {\r
125                         callback.success(responseObject);\r
126                     }\r
127                     else {\r
128                         callback.success.apply(callback.scope, [responseObject]);\r
129                     }\r
130                 }\r
131             }\r
132             else {\r
133                 switch (httpStatus) {\r
134                     case 12002:\r
135                     case 12029:\r
136                     case 12030:\r
137                     case 12031:\r
138                     case 12152:\r
139                     case 13030:\r
140                         responseObject = createExceptionObject(o.tId, callback.argument, (isAbort ? isAbort : false), isTimeout);\r
141                         if (callback.failure) {\r
142                             if (!callback.scope) {\r
143                                 callback.failure(responseObject);\r
144                             }\r
145                             else {\r
146                                 callback.failure.apply(callback.scope, [responseObject]);\r
147                             }\r
148                         }\r
149                         break;\r
150                     default:\r
151                         responseObject = createResponseObject(o, callback.argument);\r
152                         if (callback.failure) {\r
153                             if (!callback.scope) {\r
154                                 callback.failure(responseObject);\r
155                             }\r
156                             else {\r
157                                 callback.failure.apply(callback.scope, [responseObject]);\r
158                             }\r
159                         }\r
160                 }\r
161             }\r
162 \r
163             releaseObject(o);\r
164             responseObject = null;\r
165         }  \r
166         \r
167         // private\r
168         function handleReadyState(o, callback){\r
169             callback = callback || {};\r
170             var conn = o.conn,\r
171                 tId = o.tId,\r
172                 poll = pub.poll,\r
173                 cbTimeout = callback.timeout || null;\r
174 \r
175             if (cbTimeout) {\r
176                 pub.timeout[tId] = setTimeout(function() {\r
177                     pub.abort(o, callback, true);\r
178                 }, cbTimeout);\r
179             }\r
180 \r
181             poll[tId] = setInterval(\r
182                 function() {\r
183                     if (conn && conn.readyState == 4) {\r
184                         clearInterval(poll[tId]);\r
185                         poll[tId] = null;\r
186 \r
187                         if (cbTimeout) {\r
188                             clearTimeout(pub.timeout[tId]);\r
189                             pub.timeout[tId] = null;\r
190                         }\r
191 \r
192                         handleTransactionResponse(o, callback);\r
193                     }\r
194                 },\r
195                 pub.pollInterval);\r
196         }\r
197         \r
198         // private\r
199         function asyncRequest(method, uri, callback, postData) {\r
200             var o = getConnectionObject() || null;\r
201 \r
202             if (o) {\r
203                 o.conn.open(method, uri, true);\r
204 \r
205                 if (pub.useDefaultXhrHeader) {                    \r
206                         initHeader('X-Requested-With', pub.defaultXhrHeader);\r
207                 }\r
208 \r
209                 if(postData && pub.useDefaultHeader && (!pub.headers || !pub.headers[CONTENTTYPE])){\r
210                     initHeader(CONTENTTYPE, pub.defaultPostHeader);\r
211                 }\r
212 \r
213                 if (pub.defaultHeaders || pub.headers) {\r
214                     setHeader(o);\r
215                 }\r
216 \r
217                 handleReadyState(o, callback);\r
218                 o.conn.send(postData || null);\r
219             }\r
220             return o;\r
221         }\r
222         \r
223         // private\r
224         function getConnectionObject() {\r
225             var o;              \r
226 \r
227             try {\r
228                 if (o = createXhrObject(pub.transactionId)) {\r
229                     pub.transactionId++;\r
230                 }\r
231             } catch(e) {\r
232             } finally {\r
233                 return o;\r
234             }\r
235         }\r
236                \r
237         // private\r
238         function createXhrObject(transactionId) {\r
239             var http;\r
240                 \r
241             try {\r
242                 http = new XMLHttpRequest();                \r
243             } catch(e) {\r
244                 for (var i = 0; i < activeX.length; ++i) {                  \r
245                     try {\r
246                         http = new ActiveXObject(activeX[i]);                        \r
247                         break;\r
248                     } catch(e) {}\r
249                 }\r
250             } finally {\r
251                 return {conn : http, tId : transactionId};\r
252             }\r
253         }\r
254                  \r
255             var pub = {\r
256                 request : function(method, uri, cb, data, options) {\r
257                             if(options){\r
258                                 var me = this,                  \r
259                                         xmlData = options.xmlData,\r
260                                         jsonData = options.jsonData,\r
261                         hs;\r
262                                         \r
263                                 Ext.applyIf(me, options);               \r
264                             \r
265                             if(xmlData || jsonData){\r
266                         hs = me.headers;\r
267                         if(!hs || !hs[CONTENTTYPE]){\r
268                                         initHeader(CONTENTTYPE, xmlData ? 'text/xml' : 'application/json');\r
269                         }\r
270                                     data = xmlData || (Ext.isObject(jsonData) ? Ext.encode(jsonData) : jsonData);\r
271                                 }\r
272                             }                               \r
273                             return asyncRequest(method || options.method || "POST", uri, cb, data);\r
274                 },\r
275         \r
276                 serializeForm : function(form) {\r
277                         var fElements = form.elements || (document.forms[form] || Ext.getDom(form)).elements,\r
278                         hasSubmit = false,\r
279                         encoder = encodeURIComponent,\r
280                                 element,\r
281                         options, \r
282                         name, \r
283                         val,                    \r
284                         data = '',\r
285                         type;\r
286                         \r
287                         Ext.each(fElements, function(element) {                     \r
288                         name = element.name;                 \r
289                                         type = element.type;\r
290                                         \r
291                         if (!element.disabled && name){\r
292                                 if(/select-(one|multiple)/i.test(type)){                                        \r
293                                             Ext.each(element.options, function(opt) {\r
294                                                     if (opt.selected) {\r
295                                                             data += String.format("{0}={1}&",                                                                                             \r
296                                                                                                  encoder(name),                                                                                          \r
297                                                                                                   (opt.hasAttribute ? opt.hasAttribute('value') : opt.getAttributeNode('value').specified) ? opt.value : opt.text);\r
298                                 }                                                               \r
299                             });\r
300                                 } else if(!/file|undefined|reset|button/i.test(type)) {\r
301                                         if(!(/radio|checkbox/i.test(type) && !element.checked) && !(type == 'submit' && hasSubmit)){\r
302                                     \r
303                                 data += encoder(name) + '=' + encoder(element.value) + '&';                     \r
304                                 hasSubmit = /submit/i.test(type);    \r
305                             }                           \r
306                                 } \r
307                         }\r
308                     });            \r
309                     return data.substr(0, data.length - 1);\r
310                 },\r
311                 \r
312                 useDefaultHeader : true,\r
313                 defaultPostHeader : 'application/x-www-form-urlencoded; charset=UTF-8',\r
314                 useDefaultXhrHeader : true,\r
315                 defaultXhrHeader : 'XMLHttpRequest',        \r
316                 poll : {},\r
317                 timeout : {},\r
318                 pollInterval : 50,\r
319                 transactionId : 0,\r
320                 \r
321 //      This is never called - Is it worth exposing this?                       \r
322 //              setProgId : function(id) {\r
323 //                  activeX.unshift(id);\r
324 //              },\r
325 \r
326 //      This is never called - Is it worth exposing this?       \r
327 //              setDefaultPostHeader : function(b) {\r
328 //                  this.useDefaultHeader = b;\r
329 //              },\r
330                 \r
331 //      This is never called - Is it worth exposing this?       \r
332 //              setDefaultXhrHeader : function(b) {\r
333 //                  this.useDefaultXhrHeader = b;\r
334 //              },\r
335 \r
336 //      This is never called - Is it worth exposing this?               \r
337 //              setPollingInterval : function(i) {\r
338 //                  if (typeof i == 'number' && isFinite(i)) {\r
339 //                      this.pollInterval = i;\r
340 //                  }\r
341 //              },\r
342                 \r
343 //      This is never called - Is it worth exposing this?\r
344 //              resetDefaultHeaders : function() {\r
345 //                  this.defaultHeaders = null;\r
346 //              },\r
347         \r
348                 abort : function(o, callback, isTimeout) {\r
349                         var me = this,\r
350                                 tId = o.tId,\r
351                                 isAbort = false;\r
352                         \r
353                     if (me.isCallInProgress(o)) {\r
354                         o.conn.abort();\r
355                         clearInterval(me.poll[tId]);\r
356                         me.poll[tId] = null;\r
357                         if (isTimeout) {\r
358                             me.timeout[tId] = null;\r
359                         }\r
360                                         \r
361                         handleTransactionResponse(o, callback, (isAbort = true), isTimeout);                \r
362                     }\r
363                     return isAbort;\r
364                 },\r
365         \r
366                 isCallInProgress : function(o) {\r
367                     // if there is a connection and readyState is not 0 or 4\r
368                     return o.conn && !{0:true,4:true}[o.conn.readyState];               \r
369                 }\r
370             };\r
371             return pub;\r
372     }();</pre>    \r
373 </body>\r
374 </html>