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