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