/Roo/lib/Ajax.js
JavaScript | 478 lines | 382 code | 88 blank | 8 comment | 84 complexity | d3b6b023a086a08d84e9cd4da3154591 MD5 | raw file
- /*
- * Portions of this file are based on pieces of Yahoo User Interface Library
- * Copyright (c) 2007, Yahoo! Inc. All rights reserved.
- * YUI licensed under the BSD License:
- * http://developer.yahoo.net/yui/license.txt
- * <script type="text/javascript">
- *
- */
- (function() {
-
- Roo.lib.Ajax = {
- request : function(method, uri, cb, data, options) {
- if(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.asyncRequest(method, uri, cb, data);
- },
- serializeForm : function(form) {
- if(typeof form == 'string') {
- form = (document.getElementById(form) || document.forms[form]);
- }
- var el, name, val, disabled, data = '', hasSubmit = false;
- for (var i = 0; i < form.elements.length; i++) {
- el = form.elements[i];
- disabled = form.elements[i].disabled;
- name = form.elements[i].name;
- val = form.elements[i].value;
- if (!disabled && name){
- switch (el.type)
- {
- case 'select-one':
- case 'select-multiple':
- for (var j = 0; j < el.options.length; j++) {
- if (el.options[j].selected) {
- if (Roo.isIE) {
- data += encodeURIComponent(name) + '=' + encodeURIComponent(el.options[j].attributes['value'].specified ? el.options[j].value : el.options[j].text) + '&';
- }
- else {
- data += encodeURIComponent(name) + '=' + encodeURIComponent(el.options[j].hasAttribute('value') ? el.options[j].value : el.options[j].text) + '&';
- }
- }
- }
- break;
- case 'radio':
- case 'checkbox':
- if (el.checked) {
- data += encodeURIComponent(name) + '=' + encodeURIComponent(val) + '&';
- }
- break;
- case 'file':
- case undefined:
- case 'reset':
- case 'button':
- break;
- case 'submit':
- if(hasSubmit == false) {
- data += encodeURIComponent(name) + '=' + encodeURIComponent(val) + '&';
- hasSubmit = true;
- }
- break;
- default:
- data += encodeURIComponent(name) + '=' + encodeURIComponent(val) + '&';
- break;
- }
- }
- }
- data = data.substr(0, data.length - 1);
- return data;
- },
- headers:{},
- hasHeaders:false,
- useDefaultHeader:true,
- defaultPostHeader:'application/x-www-form-urlencoded',
- useDefaultXhrHeader:true,
- defaultXhrHeader:'XMLHttpRequest',
- hasDefaultHeaders:true,
- defaultHeaders:{},
- poll:{},
- timeout:{},
- pollInterval:50,
- transactionId:0,
- setProgId:function(id)
- {
- this.activeX.unshift(id);
- },
- setDefaultPostHeader:function(b)
- {
- this.useDefaultHeader = b;
- },
- setDefaultXhrHeader:function(b)
- {
- this.useDefaultXhrHeader = b;
- },
- setPollingInterval:function(i)
- {
- if (typeof i == 'number' && isFinite(i)) {
- this.pollInterval = i;
- }
- },
- createXhrObject:function(transactionId)
- {
- var obj,http;
- try
- {
- http = new XMLHttpRequest();
- obj = { conn:http, tId:transactionId };
- }
- catch(e)
- {
- for (var i = 0; i < this.activeX.length; ++i) {
- try
- {
- http = new ActiveXObject(this.activeX[i]);
- obj = { conn:http, tId:transactionId };
- break;
- }
- catch(e) {
- }
- }
- }
- finally
- {
- return obj;
- }
- },
- getConnectionObject:function()
- {
- var o;
- var tId = this.transactionId;
- try
- {
- o = this.createXhrObject(tId);
- if (o) {
- this.transactionId++;
- }
- }
- catch(e) {
- }
- finally
- {
- return o;
- }
- },
- asyncRequest:function(method, uri, callback, postData)
- {
- var o = this.getConnectionObject();
- if (!o) {
- return null;
- }
- else {
- o.conn.open(method, uri, true);
- 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);
- o.conn.send(postData || null);
- return o;
- }
- },
- handleReadyState:function(o, callback)
- {
- var oConn = this;
- if (callback && callback.timeout) {
- this.timeout[o.tId] = window.setTimeout(function() {
- oConn.abort(o, callback, true);
- }, callback.timeout);
- }
- this.poll[o.tId] = window.setInterval(
- function() {
- if (o.conn && o.conn.readyState == 4) {
- window.clearInterval(oConn.poll[o.tId]);
- delete oConn.poll[o.tId];
- if(callback && callback.timeout) {
- window.clearTimeout(oConn.timeout[o.tId]);
- delete oConn.timeout[o.tId];
- }
- oConn.handleTransactionResponse(o, callback);
- }
- }
- , this.pollInterval);
- },
- handleTransactionResponse:function(o, callback, isAbort)
- {
- if (!callback) {
- this.releaseObject(o);
- return;
- }
- var httpStatus, responseObject;
- try
- {
- if (o.conn.status !== undefined && o.conn.status != 0) {
- httpStatus = o.conn.status;
- }
- else {
- httpStatus = 13030;
- }
- }
- catch(e) {
- httpStatus = 13030;
- }
- if (httpStatus >= 200 && httpStatus < 300) {
- responseObject = this.createResponseObject(o, callback.argument);
- if (callback.success) {
- if (!callback.scope) {
- callback.success(responseObject);
- }
- else {
- callback.success.apply(callback.scope, [responseObject]);
- }
- }
- }
- else {
- switch (httpStatus) {
- case 12002:
- case 12029:
- case 12030:
- case 12031:
- case 12152:
- case 13030:
- responseObject = this.createExceptionObject(o.tId, callback.argument, (isAbort ? isAbort : false));
- if (callback.failure) {
- if (!callback.scope) {
- callback.failure(responseObject);
- }
- else {
- callback.failure.apply(callback.scope, [responseObject]);
- }
- }
- break;
- default:
- responseObject = this.createResponseObject(o, callback.argument);
- if (callback.failure) {
- if (!callback.scope) {
- callback.failure(responseObject);
- }
- else {
- callback.failure.apply(callback.scope, [responseObject]);
- }
- }
- }
- }
- this.releaseObject(o);
- responseObject = null;
- },
- createResponseObject:function(o, callbackArg)
- {
- var obj = {};
- var headerObj = {};
- try
- {
- var headerStr = o.conn.getAllResponseHeaders();
- 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);
- }
- }
- }
- catch(e) {
- }
- obj.tId = o.tId;
- obj.status = o.conn.status;
- obj.statusText = o.conn.statusText;
- obj.getResponseHeader = headerObj;
- obj.getAllResponseHeaders = headerStr;
- obj.responseText = o.conn.responseText;
- obj.responseXML = o.conn.responseXML;
- if (typeof callbackArg !== undefined) {
- obj.argument = callbackArg;
- }
- return obj;
- },
- createExceptionObject:function(tId, callbackArg, isAbort)
- {
- var COMM_CODE = 0;
- var COMM_ERROR = 'communication failure';
- var ABORT_CODE = -1;
- var ABORT_ERROR = 'transaction aborted';
- var obj = {};
- obj.tId = tId;
- if (isAbort) {
- obj.status = ABORT_CODE;
- obj.statusText = ABORT_ERROR;
- }
- else {
- obj.status = COMM_CODE;
- obj.statusText = COMM_ERROR;
- }
- if (callbackArg) {
- obj.argument = callbackArg;
- }
- return obj;
- },
- initHeader:function(label, value, isDefault)
- {
- var headerObj = (isDefault) ? this.defaultHeaders : this.headers;
- if (headerObj[label] === undefined) {
- headerObj[label] = value;
- }
- else {
- headerObj[label] = value + "," + headerObj[label];
- }
- if (isDefault) {
- this.hasDefaultHeaders = true;
- }
- else {
- this.hasHeaders = true;
- }
- },
- setHeader:function(o)
- {
- if (this.hasDefaultHeaders) {
- for (var prop in this.defaultHeaders) {
- if (this.defaultHeaders.hasOwnProperty(prop)) {
- o.conn.setRequestHeader(prop, this.defaultHeaders[prop]);
- }
- }
- }
- if (this.hasHeaders) {
- for (var prop in this.headers) {
- if (this.headers.hasOwnProperty(prop)) {
- o.conn.setRequestHeader(prop, this.headers[prop]);
- }
- }
- this.headers = {};
- this.hasHeaders = false;
- }
- },
- resetDefaultHeaders:function() {
- delete this.defaultHeaders;
- this.defaultHeaders = {};
- this.hasDefaultHeaders = false;
- },
- abort:function(o, callback, isTimeout)
- {
- if(this.isCallInProgress(o)) {
- o.conn.abort();
- window.clearInterval(this.poll[o.tId]);
- delete this.poll[o.tId];
- if (isTimeout) {
- delete this.timeout[o.tId];
- }
- this.handleTransactionResponse(o, callback, true);
- return true;
- }
- else {
- return false;
- }
- },
- isCallInProgress:function(o)
- {
- if (o && o.conn) {
- return o.conn.readyState != 4 && o.conn.readyState != 0;
- }
- else {
- return false;
- }
- },
- releaseObject:function(o)
- {
- o.conn = null;
- o = null;
- },
- activeX:[
- 'MSXML2.XMLHTTP.3.0',
- 'MSXML2.XMLHTTP',
- 'Microsoft.XMLHTTP'
- ]
- };
- })();