389 lines
No EOL
10 KiB
JavaScript
389 lines
No EOL
10 KiB
JavaScript
/*
|
|
This file is part of Ext JS 3.4
|
|
|
|
Copyright (c) 2011-2013 Sencha Inc
|
|
|
|
Contact: http://www.sencha.com/contact
|
|
|
|
GNU General Public License Usage
|
|
This file may be used under the terms of the GNU General Public License version 3.0 as
|
|
published by the Free Software Foundation and appearing in the file LICENSE included in the
|
|
packaging of this file.
|
|
|
|
Please review the following information to ensure the GNU General Public License version 3.0
|
|
requirements will be met: http://www.gnu.org/copyleft/gpl.html.
|
|
|
|
If you are unsure which license is appropriate for your use, please contact the sales department
|
|
at http://www.sencha.com/contact.
|
|
|
|
Build date: 2013-04-03 15:07:25
|
|
*/
|
|
// 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 */ |