Upgrade to ExtJS 3.0.0 - Released 07/06/2009
[extjs.git] / docs / source / code-display.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">// Create and append to the body, a Panel containing a block of code from the passed URL\r
9 function createCodePanel(url, title) {\r
10         var panel = new Ext.Panel({\r
11                 hideMode: 'visibility',\r
12                 title: title,\r
13         width: 750,\r
14         style: {\r
15                 'margin-top': '10px'\r
16         },\r
17         hideCollapseTool: true,\r
18         titleCollapse: true,\r
19         collapsible: true,\r
20         collapsed: true,\r
21                 autoScroll: true,\r
22                 renderTo: Ext.getBody(),\r
23                 listeners: {\r
24                         render: function(p) {\r
25                                 p.getUpdater().setRenderer({\r
26                                         render: Ext.isIE ? function(el, response, scripts, callback) {\r
27                                                 el.update('');\r
28                                                 var np = el.createChild({\r
29                                                         tag: 'pre',\r
30                                                         cls: 'code',\r
31                                                         cn: {\r
32                                                                 tag: 'code'\r
33                                                         }\r
34                                                 });\r
35                                                 var t = response.responseText.split("\n");\r
36                                                 var c = np.child('code', true);\r
37                                                 for (var i = 0, l = t.length; i < l; i++) {\r
38                                                         var pre = document.createElement('pre');\r
39                                                         if (t[i].length) {\r
40                                                                 pre.appendChild(document.createTextNode(t[i]));\r
41                                                                 c.appendChild(pre);\r
42                                                         } else if (i < (l - 1)) {\r
43                                                                 c.appendChild(document.createElement("br"));\r
44                                                         }\r
45                                                         \r
46                                                 }\r
47                                         } : function(el, response, scripts, callback) {\r
48                                                 el.update('');\r
49                                                 el.createChild({\r
50                                                         tag: 'pre',\r
51                                                         cls: 'code',\r
52                                                         cn: {\r
53                                                                 tag: 'code',\r
54                                                                 html: response.responseText\r
55                                                         }\r
56                                                 });\r
57                                         }\r
58                                 });\r
59                         },\r
60                         beforeexpand: function(p) {\r
61                                 p.load(url);\r
62                         },\r
63                         single: true\r
64                 }\r
65         });\r
66 }\r
67 \r
68 // Patch to allow XHR to local files. From hendricd: http://extjs.com/forum/member.php?u=8730\r
69 Ext.apply( Ext.lib.Ajax ,\r
70 { forceActiveX:false,\r
71   createXhrObject:function(transactionId)\r
72         {\r
73             var obj={  status:{isError:false}\r
74                      , tId:transactionId}, http;\r
75             try\r
76             {\r
77                 \r
78                 if(Ext.isIE7 && !!this.forceActiveX){throw("IE7forceActiveX");}\r
79                 \r
80                 obj.conn= new XMLHttpRequest();\r
81                 \r
82             }\r
83             catch(e)\r
84             {\r
85                 for (var i = 0; i < this.activeX.length; ++i) {\r
86                     try\r
87                     {\r
88                         obj.conn= new ActiveXObject(this.activeX[i]);\r
89                         \r
90                         break;\r
91                     }\r
92                     catch(e) { \r
93                     }\r
94                 }\r
95             }\r
96             finally\r
97             {\r
98                 obj.status.isError = typeof(obj.conn) === undefined;\r
99             }   \r
100             return obj;\r
101             \r
102         },\r
103         \r
104         getHttpStatus: function(reqObj){\r
105         \r
106                 var statObj = {  status:0\r
107                                 ,statusText:''\r
108                                 ,isError:false\r
109                                 ,isLocal:false\r
110                                 ,isOK:false\r
111                                 ,error:null};\r
112                 \r
113                 try {\r
114                         if(!reqObj)throw('noobj');\r
115                         statObj.status = reqObj.status;\r
116                         \r
117                         statObj.isLocal = !reqObj.status && location.protocol == "file:" || \r
118                                            Ext.isSafari && reqObj.status === undefined;\r
119                         \r
120                         statObj.isOK = (statObj.isLocal || (statObj.status > 199 && statObj.status < 300));\r
121                         statObj.statusText = reqObj.statusText || '';\r
122                     } catch(e){ //status may not avail/valid yet (or called too early).\r
123                       } \r
124                     \r
125                 return statObj; \r
126         \r
127         },\r
128         handleTransactionResponse:function(o, callback, isAbort)\r
129                 {\r
130         \r
131                 \r
132                 callback = callback || {};\r
133                 var responseObject=null;\r
134                 \r
135                  if(!o.status.isError){\r
136                         o.status = this.getHttpStatus(o.conn);          \r
137                         /* create and enhance the response with proper status and XMLDOM if necessary */\r
138                         responseObject = this.createResponseObject(o, callback.argument);\r
139                  }\r
140                 \r
141                  if(o.status.isError){ /* checked again in case exception was raised - ActiveX was disabled during XML-DOM creation? */\r
142                      // And mixin everything the XHR object had to offer as well\r
143                    responseObject = Ext.applyIf(responseObject||{},this.createExceptionObject(o.tId, callback.argument, (isAbort ? isAbort : false)));\r
144                    \r
145                  }\r
146                 \r
147                  responseObject.options = o.options;\r
148                  responseObject.stat = o.status;\r
149                  \r
150                  if (o.status.isOK && !o.status.isError) {\r
151                         if (callback.success) {\r
152                                 if (!callback.scope) {\r
153                                         callback.success(responseObject);\r
154                                 }\r
155                                 else {\r
156                                         callback.success.apply(callback.scope, [responseObject]);\r
157                                 }\r
158                         }\r
159                   } else {\r
160 \r
161                         if (callback.failure) {\r
162                                 if (!callback.scope) {\r
163                                         callback.failure(responseObject);\r
164                                 }\r
165                                 else {\r
166                                         callback.failure.apply(callback.scope, [responseObject]);\r
167                                 }\r
168                         }\r
169 \r
170                  }\r
171                 \r
172                 if(o.options.async){\r
173                         this.releaseObject(o);  \r
174                         responseObject = null;\r
175                 }else{ \r
176                         this.releaseObject(o);\r
177                         return responseObject; \r
178                 }\r
179                         \r
180         },\r
181         createResponseObject:function(o, callbackArg)\r
182         {\r
183             var obj = {};\r
184             var headerObj = {},headerStr='';\r
185 \r
186             try{  //to catch bad encoding problems here\r
187                 obj.responseText = o.conn.responseText;\r
188             }catch(e){obj.responseText ='';}\r
189 \r
190             obj.responseXML = o.conn.responseXML;\r
191 \r
192             try{\r
193                 headerStr = o.conn.getAllResponseHeaders()||'';\r
194             } catch(e){}\r
195 \r
196             if(o.status.isLocal){\r
197 \r
198                    o.status.isOK = ((o.status.status = (!!obj.responseText.length)?200:404) == 200);\r
199 \r
200                    if(o.status.isOK && (!obj.responseXML || obj.responseXML.childNodes.length == 0)){\r
201 \r
202                         var xdoc=null;\r
203                         try{   //ActiveX may be disabled\r
204                                 if(typeof(DOMParser) == 'undefined'){ \r
205                                         xdoc=new ActiveXObject("Microsoft.XMLDOM"); \r
206                                         xdoc.async="false";\r
207                                         xdoc.loadXML(obj.responseText); \r
208 \r
209                                 }else{ \r
210                                         try{  //Opera 9 will fail parsing non-XML content, so trap here.\r
211                                                 var domParser = new DOMParser(); \r
212                                                 xdoc = domParser.parseFromString(obj.responseText, 'application\/xml'); \r
213                                         }catch(ex){}\r
214                                         finally{domParser = null;}\r
215 \r
216                                 }\r
217                         } catch(ex){ \r
218                                 o.status.isError = true; \r
219                                 o.status.error = ex;\r
220 \r
221                                 }\r
222 \r
223                         obj.responseXML = xdoc;\r
224                     }\r
225 \r
226                     if(obj.responseXML){\r
227 \r
228                         var parseBad = (obj.responseXML.parseError || 0) != 0 || obj.responseXML.childNodes.length == 0;\r
229                         if(!parseBad){\r
230                                 headerStr = 'Content-Type: ' + (obj.responseXML.contentType || 'text\/xml') + '\n' + headerStr ;\r
231                                 }                           \r
232                     }           \r
233 \r
234 \r
235             }   \r
236 \r
237            var header = headerStr.split('\n');\r
238            for (var i = 0; i < header.length; i++) {\r
239                 var delimitPos = header[i].indexOf(':');\r
240                 if (delimitPos != -1) {\r
241                         headerObj[header[i].substring(0, delimitPos)] = header[i].substring(delimitPos + 2);\r
242                 }\r
243             }\r
244 \r
245             obj.tId = o.tId;\r
246             obj.status = o.status.status;\r
247             obj.statusText = o.status.statusText;\r
248             obj.getResponseHeader = headerObj;\r
249             obj.getAllResponseHeaders = headerStr;\r
250             obj.stat = o.status\r
251 \r
252             if (typeof callbackArg !== undefined) {\r
253                 obj.argument = callbackArg;\r
254             }\r
255 \r
256             return obj;\r
257         },\r
258         \r
259         request : function(method, uri, cb, data, options) {\r
260                     \r
261                      options = Ext.apply({async:true,\r
262                            headers:false,\r
263                            userId:null,\r
264                            password:null,\r
265                            xmlData:null }, options||{});\r
266                                                 \r
267                         var hs = options.headers;\r
268                         if(hs){\r
269                             for(var h in hs){\r
270                                 if(hs.hasOwnProperty(h)){\r
271                                     this.initHeader(h, hs[h], false);\r
272                                 }\r
273                             }\r
274                         }\r
275                         if(options.xmlData){\r
276                             this.initHeader('Content-Type', 'text/xml', false);\r
277                             method = 'POST';\r
278                             data = options.xmlData;\r
279                         }\r
280                                     \r
281                     return this.makeRequest(method, uri, cb, data, options);\r
282                     \r
283         },\r
284         asyncRequest:function(method, uri, callback, postData)\r
285         {\r
286             var o = this.getConnectionObject();\r
287 \r
288             if (!o || o.status.isError) {\r
289                 return null;\r
290             }\r
291             else {\r
292                 o.options = options;\r
293                 try{\r
294                         o.conn.open(method, uri, true);\r
295                 } catch(ex){\r
296                         o.status.isError = true;\r
297                         o.status.error = ex;\r
298                         return Ext.apply(o,this.handleTransactionResponse(o, callback));\r
299                         \r
300                 }\r
301                 \r
302                 \r
303                 if (this.useDefaultXhrHeader) {\r
304                     if (!this.defaultHeaders['X-Requested-With']) {\r
305                         this.initHeader('X-Requested-With', this.defaultXhrHeader, true);\r
306                     }\r
307                 }\r
308 \r
309                 if(postData && this.useDefaultHeader){\r
310                     this.initHeader('Content-Type', this.defaultPostHeader);\r
311                 }\r
312 \r
313                  if (this.hasDefaultHeaders || this.hasHeaders) {\r
314                     this.setHeader(o);\r
315                 }\r
316 \r
317                 this.handleReadyState(o, callback);\r
318                 \r
319                 try{ o.conn.send(postData || null);\r
320                 } catch(ex){ \r
321                         o.status.isError=true;\r
322                         o.status.error = ex;\r
323                         return Ext.apply(o,this.handleTransactionResponse(o, callback));\r
324                 }\r
325                         \r
326                                         \r
327                 return o;\r
328             }\r
329         },\r
330         \r
331         makeRequest:function(method, uri, callback, postData, options)\r
332         {\r
333             var o = this.getConnectionObject();\r
334                      \r
335             if (!o || o.status.isError) {\r
336                 return null;\r
337             }\r
338             else {\r
339                 o.options = options;    \r
340                 try{\r
341                         o.conn.open(method, uri, options.async, options.userId, options.password);\r
342                 } catch(ex){\r
343                         o.status.isError = true;\r
344                         o.status.error = ex;\r
345                         var r=this.handleTransactionResponse(o, callback);\r
346                         return Ext.apply(o,r);\r
347                 }\r
348 \r
349                 if (this.useDefaultXhrHeader) {\r
350                     if (!this.defaultHeaders['X-Requested-With']) {\r
351                         this.initHeader('X-Requested-With', this.defaultXhrHeader, true);\r
352                     }\r
353                 }\r
354 \r
355                 if(postData && this.useDefaultHeader){\r
356                     this.initHeader('Content-Type', this.defaultPostHeader);\r
357                 }\r
358 \r
359                  if (this.hasDefaultHeaders || this.hasHeaders) {\r
360                     this.setHeader(o);\r
361                 }\r
362 \r
363                 if(o.options.async){ //Timers won't work here as it's a blocking call\r
364                         this.handleReadyState(o, callback);\r
365                 }\r
366                 \r
367                 try{ o.conn.send(postData || null);\r
368                 } catch(ex){ \r
369                         //Ext.apply(o,this.handleTransactionResponse(o, callback));\r
370                 }\r
371                                 \r
372                 return options.async?o:Ext.apply(o,this.handleTransactionResponse(o, callback));\r
373             }\r
374    }});\r
375         \r
376 Ext.lib.Ajax.forceActiveX = (document.location.protocol == 'file:');/* or other true/false mechanism */</pre>    \r
377 </body>\r
378 </html>