// 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 */