// Create and append to the body, a Panel containing a block of code from the passed URL function createCodePanel(url, title) { var panel = new Ext.Panel({ hideMode: 'visibility', title: title, width: 750, style: { 'margin-top': '10px' }, hideCollapseTool: true, titleCollapse: true, collapsible: true, collapsed: true, autoScroll: true, renderTo: Ext.getBody(), listeners: { render: function(p) { p.getUpdater().setRenderer({ render: Ext.isIE ? function(el, response, scripts, callback) { el.update(''); var np = el.createChild({ tag: 'pre', cls: 'code', cn: { tag: 'code' } }); var t = response.responseText.split("\n"); var c = np.child('code', true); for (var i = 0, l = t.length; i < l; i++) { var pre = document.createElement('pre'); if (t[i].length) { pre.appendChild(document.createTextNode(t[i])); c.appendChild(pre); } else if (i < (l - 1)) { c.appendChild(document.createElement("br")); } } } : function(el, response, scripts, callback) { el.update(''); el.createChild({ tag: 'pre', cls: 'code', cn: { tag: 'code', html: response.responseText } }); } }); }, beforeexpand: function(p) { p.load(url); }, single: true } }); } // Patch to allow XHR to local files. From hendricd: http://extjs.com/forum/member.php?u=8730 Ext.apply( Ext.lib.Ajax , { forceActiveX:false, createXhrObject:function(transactionId) { var obj={ status:{isError:false} , tId:transactionId}, http; try { if(Ext.isIE7 && !!this.forceActiveX){throw("IE7forceActiveX");} obj.conn= new XMLHttpRequest(); } catch(e) { for (var i = 0; i < this.activeX.length; ++i) { try { obj.conn= new ActiveXObject(this.activeX[i]); break; } catch(e) { } } } finally { obj.status.isError = typeof(obj.conn) === undefined; } return obj; }, getHttpStatus: function(reqObj){ var statObj = { status:0 ,statusText:'' ,isError:false ,isLocal:false ,isOK:false ,error:null}; try { if(!reqObj)throw('noobj'); statObj.status = reqObj.status; statObj.isLocal = !reqObj.status && location.protocol == "file:" || Ext.isSafari && reqObj.status === undefined; statObj.isOK = (statObj.isLocal || (statObj.status > 199 && statObj.status < 300)); statObj.statusText = reqObj.statusText || ''; } catch(e){ //status may not avail/valid yet (or called too early). } return statObj; }, handleTransactionResponse:function(o, callback, isAbort) { callback = callback || {}; var responseObject=null; if(!o.status.isError){ o.status = this.getHttpStatus(o.conn); /* create and enhance the response with proper status and XMLDOM if necessary */ responseObject = this.createResponseObject(o, callback.argument); } if(o.status.isError){ /* checked again in case exception was raised - ActiveX was disabled during XML-DOM creation? */ // And mixin everything the XHR object had to offer as well responseObject = Ext.applyIf(responseObject||{},this.createExceptionObject(o.tId, callback.argument, (isAbort ? isAbort : false))); } responseObject.options = o.options; responseObject.stat = o.status; if (o.status.isOK && !o.status.isError) { if (callback.success) { if (!callback.scope) { callback.success(responseObject); } else { callback.success.apply(callback.scope, [responseObject]); } } } else { if (callback.failure) { if (!callback.scope) { callback.failure(responseObject); } else { callback.failure.apply(callback.scope, [responseObject]); } } } if(o.options.async){ this.releaseObject(o); responseObject = null; }else{ this.releaseObject(o); return responseObject; } }, createResponseObject:function(o, callbackArg) { var obj = {}; var headerObj = {},headerStr=''; try{ //to catch bad encoding problems here obj.responseText = o.conn.responseText; }catch(e){obj.responseText ='';} obj.responseXML = o.conn.responseXML; try{ headerStr = o.conn.getAllResponseHeaders()||''; } catch(e){} if(o.status.isLocal){ o.status.isOK = ((o.status.status = (!!obj.responseText.length)?200:404) == 200); if(o.status.isOK && (!obj.responseXML || obj.responseXML.childNodes.length == 0)){ var xdoc=null; try{ //ActiveX may be disabled if(typeof(DOMParser) == 'undefined'){ xdoc=new ActiveXObject("Microsoft.XMLDOM"); xdoc.async="false"; xdoc.loadXML(obj.responseText); }else{ try{ //Opera 9 will fail parsing non-XML content, so trap here. var domParser = new DOMParser(); xdoc = domParser.parseFromString(obj.responseText, 'application\/xml'); }catch(ex){} finally{domParser = null;} } } catch(ex){ o.status.isError = true; o.status.error = ex; } obj.responseXML = xdoc; } if(obj.responseXML){ var parseBad = (obj.responseXML.parseError || 0) != 0 || obj.responseXML.childNodes.length == 0; if(!parseBad){ headerStr = 'Content-Type: ' + (obj.responseXML.contentType || 'text\/xml') + '\n' + headerStr ; } } } var header = headerStr.split('\n'); for (var i = 0; i < header.length; i++) { var delimitPos = header[i].indexOf(':'); if (delimitPos != -1) { headerObj[header[i].substring(0, delimitPos)] = header[i].substring(delimitPos + 2); } } obj.tId = o.tId; obj.status = o.status.status; obj.statusText = o.status.statusText; obj.getResponseHeader = headerObj; obj.getAllResponseHeaders = headerStr; obj.stat = o.status if (typeof callbackArg !== undefined) { obj.argument = callbackArg; } return obj; }, request : function(method, uri, cb, data, options) { options = Ext.apply({async:true, headers:false, userId:null, password:null, xmlData:null }, options||{}); var hs = options.headers; if(hs){ for(var h in hs){ if(hs.hasOwnProperty(h)){ this.initHeader(h, hs[h], false); } } } if(options.xmlData){ this.initHeader('Content-Type', 'text/xml', false); method = 'POST'; data = options.xmlData; } return this.makeRequest(method, uri, cb, data, options); }, asyncRequest:function(method, uri, callback, postData) { var o = this.getConnectionObject(); if (!o || o.status.isError) { return null; } else { o.options = options; try{ o.conn.open(method, uri, true); } catch(ex){ o.status.isError = true; o.status.error = ex; return Ext.apply(o,this.handleTransactionResponse(o, callback)); } if (this.useDefaultXhrHeader) { if (!this.defaultHeaders['X-Requested-With']) { this.initHeader('X-Requested-With', this.defaultXhrHeader, true); } } if(postData && this.useDefaultHeader){ this.initHeader('Content-Type', this.defaultPostHeader); } if (this.hasDefaultHeaders || this.hasHeaders) { this.setHeader(o); } this.handleReadyState(o, callback); try{ o.conn.send(postData || null); } catch(ex){ o.status.isError=true; o.status.error = ex; return Ext.apply(o,this.handleTransactionResponse(o, callback)); } return o; } }, makeRequest:function(method, uri, callback, postData, options) { var o = this.getConnectionObject(); if (!o || o.status.isError) { return null; } else { o.options = options; try{ o.conn.open(method, uri, options.async, options.userId, options.password); } catch(ex){ o.status.isError = true; o.status.error = ex; var r=this.handleTransactionResponse(o, callback); return Ext.apply(o,r); } if (this.useDefaultXhrHeader) { if (!this.defaultHeaders['X-Requested-With']) { this.initHeader('X-Requested-With', this.defaultXhrHeader, true); } } if(postData && this.useDefaultHeader){ this.initHeader('Content-Type', this.defaultPostHeader); } if (this.hasDefaultHeaders || this.hasHeaders) { this.setHeader(o); } if(o.options.async){ //Timers won't work here as it's a blocking call this.handleReadyState(o, callback); } try{ o.conn.send(postData || null); } catch(ex){ //Ext.apply(o,this.handleTransactionResponse(o, callback)); } return options.async?o:Ext.apply(o,this.handleTransactionResponse(o, callback)); } }}); Ext.lib.Ajax.forceActiveX = (document.location.protocol == 'file:');/* or other true/false mechanism */