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