Only meaningful when used
* with the form option.
*
True if the form object is a file upload (will be set automatically if the form was
* configured with enctype "multipart/form-data").
@@ -360,77 +231,77 @@ Ext.Ajax.request({
me.indicatorText = '
'+o.indicatorText+"
";
}
if(me.indicatorText) {
- Ext.getDom(o.el).innerHTML = me.indicatorText;
+ Ext.getDom(o.el).innerHTML = me.indicatorText;
}
o.success = (Ext.isFunction(o.success) ? o.success : function(){}).createInterceptor(function(response) {
Ext.getDom(o.el).innerHTML = response.responseText;
});
}
-
+
var p = o.params,
- url = o.url || me.url,
+ url = o.url || me.url,
method,
- cb = {success: handleResponse,
- failure: handleFailure,
+ cb = {success: me.handleResponse,
+ failure: me.handleFailure,
scope: me,
argument: {options: o},
timeout : o.timeout || me.timeout
},
- form,
- serForm;
-
-
+ form,
+ serForm;
+
+
if (Ext.isFunction(p)) {
p = p.call(o.scope||WINDOW, o);
}
-
- p = Ext.urlEncode(me.extraParams, Ext.isObject(p) ? Ext.urlEncode(p) : p);
-
+
+ p = Ext.urlEncode(me.extraParams, Ext.isObject(p) ? Ext.urlEncode(p) : p);
+
if (Ext.isFunction(url)) {
url = url.call(o.scope || WINDOW, o);
}
-
+
if((form = Ext.getDom(o.form))){
url = url || form.action;
- if(o.isUpload || /multipart\/form-data/i.test(form.getAttribute("enctype"))) {
- return doFormUpload.call(me, o, p, url);
+ if(o.isUpload || /multipart\/form-data/i.test(form.getAttribute("enctype"))) {
+ return me.doFormUpload.call(me, o, p, url);
}
- serForm = Ext.lib.Ajax.serializeForm(form);
+ serForm = Ext.lib.Ajax.serializeForm(form);
p = p ? (p + '&' + serForm) : serForm;
}
-
+
method = o.method || me.method || ((p || o.xmlData || o.jsonData) ? POST : GET);
-
+
if(method === GET && (me.disableCaching && o.disableCaching !== false) || o.disableCaching === true){
var dcp = o.disableCachingParam || me.disableCachingParam;
url = Ext.urlAppend(url, dcp + '=' + (new Date().getTime()));
}
-
+
o.headers = Ext.apply(o.headers || {}, me.defaultHeaders || {});
-
+
if(o.autoAbort === true || me.autoAbort) {
me.abort();
}
-
+
if((method == GET || o.xmlData || o.jsonData) && p){
- url = Ext.urlAppend(url, p);
+ url = Ext.urlAppend(url, p);
p = '';
}
return (me.transId = Ext.lib.Ajax.request(method, url, cb, p, o));
- }else{
+ }else{
return o.callback ? o.callback.apply(o.scope, [o,UNDEFINED,UNDEFINED]) : null;
}
},
-
+
/**
* Determine whether this object has a request outstanding.
* @param {Number} transactionId (Optional) defaults to the last transaction
* @return {Boolean} True if there is an outstanding request.
*/
isLoading : function(transId){
- return transId ? Ext.lib.Ajax.isCallInProgress(transId) : !! this.transId;
+ return transId ? Ext.lib.Ajax.isCallInProgress(transId) : !! this.transId;
},
-
+
/**
* Aborts any outstanding request.
* @param {Number} transactionId (Optional) defaults to the last transaction
@@ -439,6 +310,143 @@ Ext.Ajax.request({
if(transId || this.isLoading()){
Ext.lib.Ajax.abort(transId || this.transId);
}
+ },
+
+ // private
+ handleResponse : function(response){
+ this.transId = false;
+ var options = response.argument.options;
+ response.argument = options ? options.argument : null;
+ this.fireEvent(REQUESTCOMPLETE, this, response, options);
+ if(options.success){
+ options.success.call(options.scope, response, options);
+ }
+ if(options.callback){
+ options.callback.call(options.scope, options, true, response);
+ }
+ },
+
+ // private
+ handleFailure : function(response, e){
+ this.transId = false;
+ var options = response.argument.options;
+ response.argument = options ? options.argument : null;
+ this.fireEvent(REQUESTEXCEPTION, this, response, options, e);
+ if(options.failure){
+ options.failure.call(options.scope, response, options);
+ }
+ if(options.callback){
+ options.callback.call(options.scope, options, false, response);
+ }
+ },
+
+ // private
+ doFormUpload : function(o, ps, url){
+ var id = Ext.id(),
+ doc = document,
+ frame = doc.createElement('iframe'),
+ form = Ext.getDom(o.form),
+ hiddens = [],
+ hd,
+ encoding = 'multipart/form-data',
+ buf = {
+ target: form.target,
+ method: form.method,
+ encoding: form.encoding,
+ enctype: form.enctype,
+ action: form.action
+ };
+
+ Ext.fly(frame).set({
+ id: id,
+ name: id,
+ cls: 'x-hidden'
+
+ });
+
+ doc.body.appendChild(frame);
+
+ //Reset the Frame to neutral domain
+ Ext.fly(frame).set({
+ src : Ext.SSL_SECURE_URL
+ });
+
+ // This is required so that IE doesn't pop the response up in a new window.
+ if(Ext.isIE){
+ document.frames[id].name = id;
+ }
+
+
+ Ext.fly(form).set({
+ target: id,
+ method: POST,
+ enctype: encoding,
+ encoding: encoding,
+ action: url || buf.action
+ });
+
+ // add dynamic params
+ Ext.iterate(Ext.urlDecode(ps, false), function(k, v){
+ hd = doc.createElement('input');
+ Ext.fly(hd).set({
+ type: 'hidden',
+ value: v,
+ name: k
+ });
+ form.appendChild(hd);
+ hiddens.push(hd);
+ });
+
+ function cb(){
+ var me = this,
+ // bogus response object
+ r = {responseText : '',
+ responseXML : null,
+ argument : o.argument},
+ doc,
+ firstChild;
+
+ try{
+ doc = frame.contentWindow.document || frame.contentDocument || WINDOW.frames[id].document;
+ if(doc){
+ if(doc.body){
+ if(/textarea/i.test((firstChild = doc.body.firstChild || {}).tagName)){ // json response wrapped in textarea
+ r.responseText = firstChild.value;
+ }else{
+ r.responseText = doc.body.innerHTML;
+ }
+ }
+ //in IE the document may still have a body even if returns XML.
+ r.responseXML = doc.XMLDocument || doc;
+ }
+ }
+ catch(e) {}
+
+ Ext.EventManager.removeListener(frame, LOAD, cb, me);
+
+ me.fireEvent(REQUESTCOMPLETE, me, r, o);
+
+ function runCallback(fn, scope, args){
+ if(Ext.isFunction(fn)){
+ fn.apply(scope, args);
+ }
+ }
+
+ runCallback(o.success, o.scope, [r, o]);
+ runCallback(o.callback, o.scope, [o, true, r]);
+
+ if(!me.debugUploads){
+ setTimeout(function(){Ext.removeNode(frame);}, 100);
+ }
+ }
+
+ Ext.EventManager.on(frame, LOAD, cb, this);
+ form.submit();
+
+ Ext.fly(form).set(buf);
+ Ext.each(hiddens, function(h) {
+ Ext.removeNode(h);
+ });
}
});
})();
@@ -460,7 +468,7 @@ Ext.Ajax.request({
Ext.Ajax.defaultHeaders = {
'Powered-By': 'Ext'
};
- *
+ *
*
*
Common Events you may want to set are:
* - {@link Ext.data.Connection#beforerequest beforerequest}
@@ -472,7 +480,7 @@ Ext.Ajax.defaultHeaders = {
Ext.Ajax.on('beforerequest', this.showSpinner, this);
Ext.Ajax.on('requestcomplete', this.hideSpinner, this);
Ext.Ajax.on('requestexception', this.hideSpinner, this);
- *
+ *
*
* An example request:
*
@@ -492,7 +500,7 @@ Ext.Ajax.{@link Ext.data.Connection#request request}({
form: 'some-form',
params: 'foo=bar'
});
- *
+ *
*
* @singleton
*/