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