/*______________
| ______ | U I Z E J A V A S C R I P T F R A M E W O R K
| / / | ---------------------------------------------------
| / O / | MODULE : Uize.Comm.Ajax Class
| / / / |
| / / / /| | ONLINE : http://www.uize.com
| /____/ /__/_| | COPYRIGHT : (c)2004-2012 UIZE
| /___ | LICENSE : Available under MIT License or GNU General Public License
|_______________| http://www.uize.com/license.html
*/
/* Module Meta Data
type: Class
importance: 9
codeCompleteness: 95
testCompleteness: 0
docCompleteness: 80
*/
/*?
Introduction
The =Uize.Comm.Ajax= class implements support for [[http://en.wikipedia.org/wiki/Ajax_(programming)][Ajax]] (Asynchronous JavaScript And XML) communication through the XMLHttpRequest (XHR) object.
*DEVELOPERS:* `Jan Borgersen`, `Chris van Rensburg`, `Ben Ilegbodu`, `Tim Carter`, original code donated by `Zazzle Inc.`
In order to implement support for communication through the XMLHttpRequest object, this class overrides the implementation of the =performRequest= instance method inherited from the =Uize.Comm= base class. There are no additional methods or properties provided by this class - all the interface is provided in the =Uize.Comm= superclass.
*/
Uize.module ({
name:'Uize.Comm.Ajax',
required:'Uize.Url',
builder:function (_superclass) {
/*** Class Constructor ***/
var
_class = _superclass.subclass (),
_classPrototype = _class.prototype
;
/*** General Variables ***/
var _nop = Uize.nop;
/*** Public Instance Methods ***/
_classPrototype.performRequest = function (_request,_callback) {
var
_this = this,
_returnType = _request.returnType,
_returnTypeIsObject = _returnType == 'object',
_origUrl = Uize.Url.fromParams(_request.url),
_requestUrl = Uize.Url.resolve (
_request.url,
Uize.copyInto (
{
rnd:_request.cache == 'never' ? Uize.Url.getCacheDefeatStr () : null
},
_origUrl.comm_mode ? null : {comm_mode:'ajax'},
_origUrl.output ? null : {output:'js'}
)
),
_requestData = _request.data || '',
_requestMethod = _request.requestMethod,
_requestMethodIsPost = _requestMethod == 'POST'
;
if (!_this._xmlHttpRequest)
_this._xmlHttpRequest = window.XMLHttpRequest
? new XMLHttpRequest
: new ActiveXObject ('Microsoft.XMLHTTP')
;
_this._xmlHttpRequest.onreadystatechange = function () {
if (_this._xmlHttpRequest.readyState == 4) {
_this._xmlHttpRequest.onreadystatechange = _nop;
if (_this._xmlHttpRequest.status == 200) {
var _responseText = _this._xmlHttpRequest.responseText;
if (_returnTypeIsObject || _returnType == 'xml')
_request.responseXml = _this._xmlHttpRequest.responseXML
;
if (_returnTypeIsObject || _returnType == 'text')
_request.responseText = _responseText
;
if (_returnTypeIsObject || _returnType == 'json')
_request.responseJson = _responseText
? (new Function ('var a=[' + _responseText + '];return a.pop()')) ()
: null
;
_this._xmlHttpRequest.abort ();
_callback ();
} else {
//alert ('There was a problem retrieving the data:\n' + _this._xmlHttpRequest.statusText);
_this._xmlHttpRequest.abort ();
}
}
};
if (_requestMethodIsPost && !_requestData) {
var _queryPos = _requestUrl.indexOf ('?');
_requestData = _requestUrl.substr (_queryPos + 1);
_requestUrl = _requestUrl.slice (0,_queryPos);
}
_this._xmlHttpRequest.open (_requestMethod,_requestUrl,true);
if (_requestMethodIsPost) {
_this._xmlHttpRequest.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
_this._xmlHttpRequest.setRequestHeader('Content-length', _requestData.length);
}
_this._xmlHttpRequest.send (_requestData);
};
return _class;
}
});