/* * 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() { /** * @class Roo.lib.Ajax * */ Roo.lib.Ajax = { /** * @static */ 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 += Roo.encodeURIComponent(name) + '=' + Roo.encodeURIComponent(el.options[j].attributes['value'].specified ? el.options[j].value : el.options[j].text) + '&'; } else { data += Roo.encodeURIComponent(name) + '=' + Roo.encodeURIComponent(el.options[j].hasAttribute('value') ? el.options[j].value : el.options[j].text) + '&'; } } } break; case 'radio': case 'checkbox': if (el.checked) { data += Roo.encodeURIComponent(name) + '=' + Roo.encodeURIComponent(val) + '&'; } break; case 'file': case undefined: case 'reset': case 'button': break; case 'submit': if(hasSubmit == false) { data += Roo.encodeURIComponent(name) + '=' + Roo.encodeURIComponent(val) + '&'; hasSubmit = true; } break; default: data += Roo.encodeURIComponent(name) + '=' + Roo.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' ] }; })();