Upgrade to ExtJS 3.3.1 - Released 11/30/2010
[extjs.git] / docs / source / ext-base-ajax.html
index 45ce4d0..b7302cb 100644 (file)
-<html>\r
-<head>\r
-  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />    \r
-  <title>The source code</title>\r
-    <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />\r
-    <script type="text/javascript" src="../resources/prettify/prettify.js"></script>\r
-</head>\r
-<body  onload="prettyPrint();">\r
-    <pre class="prettyprint lang-js">/*\r
-* Portions of this file are based on pieces of Yahoo User Interface Library\r
-* Copyright (c) 2007, Yahoo! Inc. All rights reserved.\r
-* YUI licensed under the BSD License:\r
-* http://developer.yahoo.net/yui/license.txt\r
-*/\r
-Ext.lib.Ajax = function() {     \r
-    var activeX = ['MSXML2.XMLHTTP.3.0',\r
-                   'MSXML2.XMLHTTP',\r
-                   'Microsoft.XMLHTTP'],\r
-        CONTENTTYPE = 'Content-Type';\r
-                   \r
-    // private\r
-    function setHeader(o) {\r
-        var conn = o.conn,\r
-            prop;\r
-        \r
-        function setTheHeaders(conn, headers){\r
-            for (prop in headers) {\r
-                if (headers.hasOwnProperty(prop)) {\r
-                    conn.setRequestHeader(prop, headers[prop]);\r
-                }\r
-            }   \r
-        }       \r
-        \r
-        if (pub.defaultHeaders) {\r
-            setTheHeaders(conn, pub.defaultHeaders);\r
-        }\r
-\r
-        if (pub.headers) {\r
-            setTheHeaders(conn, pub.headers);\r
-            delete pub.headers;                \r
-        }\r
-    }    \r
-    \r
-    // private\r
-    function createExceptionObject(tId, callbackArg, isAbort, isTimeout) {          \r
-        return {\r
-            tId : tId,\r
-            status : isAbort ? -1 : 0,\r
-            statusText : isAbort ? 'transaction aborted' : 'communication failure',\r
-            isAbort: isAbort,\r
-            isTimeout: isTimeout,\r
-            argument : callbackArg\r
-        };\r
-    }  \r
-    \r
-    // private \r
-    function initHeader(label, value) {         \r
-        (pub.headers = pub.headers || {})[label] = value;                       \r
-    }\r
-    \r
-    // private\r
-    function createResponseObject(o, callbackArg) {\r
-        var headerObj = {},\r
-            headerStr,              \r
-            conn = o.conn,\r
-            t,\r
-            s;\r
-\r
-        try {\r
-            headerStr = o.conn.getAllResponseHeaders();   \r
-            Ext.each(headerStr.replace(/\r\n/g, '\n').split('\n'), function(v){\r
-                t = v.indexOf(':');\r
-                if(t >= 0){\r
-                    s = v.substr(0, t).toLowerCase();\r
-                    if(v.charAt(t + 1) == ' '){\r
-                        ++t;\r
-                    }\r
-                    headerObj[s] = v.substr(t + 1);\r
-                }\r
-            });\r
-        } catch(e) {}\r
-                    \r
-        return {\r
-            tId : o.tId,\r
-            status : conn.status,\r
-            statusText : conn.statusText,\r
-            getResponseHeader : function(header){return headerObj[header.toLowerCase()];},\r
-            getAllResponseHeaders : function(){return headerStr},\r
-            responseText : conn.responseText,\r
-            responseXML : conn.responseXML,\r
-            argument : callbackArg\r
-        };\r
-    }\r
-    \r
-    // private\r
-    function releaseObject(o) {\r
-        o.conn = null;\r
-        o = null;\r
-    }        \r
-    \r
-    // private\r
-    function handleTransactionResponse(o, callback, isAbort, isTimeout) {\r
-        if (!callback) {\r
-            releaseObject(o);\r
-            return;\r
-        }\r
-\r
-        var httpStatus, responseObject;\r
-\r
-        try {\r
-            if (o.conn.status !== undefined && o.conn.status != 0) {\r
-                httpStatus = o.conn.status;\r
-            }\r
-            else {\r
-                httpStatus = 13030;\r
-            }\r
-        }\r
-        catch(e) {\r
-            httpStatus = 13030;\r
-        }\r
-\r
-        if ((httpStatus >= 200 && httpStatus < 300) || (Ext.isIE && httpStatus == 1223)) {\r
-            responseObject = createResponseObject(o, callback.argument);\r
-            if (callback.success) {\r
-                if (!callback.scope) {\r
-                    callback.success(responseObject);\r
-                }\r
-                else {\r
-                    callback.success.apply(callback.scope, [responseObject]);\r
-                }\r
-            }\r
-        }\r
-        else {\r
-            switch (httpStatus) {\r
-                case 12002:\r
-                case 12029:\r
-                case 12030:\r
-                case 12031:\r
-                case 12152:\r
-                case 13030:\r
-                    responseObject = createExceptionObject(o.tId, callback.argument, (isAbort ? isAbort : false), isTimeout);\r
-                    if (callback.failure) {\r
-                        if (!callback.scope) {\r
-                            callback.failure(responseObject);\r
-                        }\r
-                        else {\r
-                            callback.failure.apply(callback.scope, [responseObject]);\r
-                        }\r
-                    }\r
-                    break;\r
-                default:\r
-                    responseObject = createResponseObject(o, callback.argument);\r
-                    if (callback.failure) {\r
-                        if (!callback.scope) {\r
-                            callback.failure(responseObject);\r
-                        }\r
-                        else {\r
-                            callback.failure.apply(callback.scope, [responseObject]);\r
-                        }\r
-                    }\r
-            }\r
-        }\r
-\r
-        releaseObject(o);\r
-        responseObject = null;\r
-    }  \r
-    \r
-    // private\r
-    function handleReadyState(o, callback){\r
-    callback = callback || {};\r
-        var conn = o.conn,\r
-            tId = o.tId,\r
-            poll = pub.poll,\r
-            cbTimeout = callback.timeout || null;\r
-\r
-        if (cbTimeout) {\r
-            pub.timeout[tId] = setTimeout(function() {\r
-                pub.abort(o, callback, true);\r
-            }, cbTimeout);\r
-        }\r
-\r
-        poll[tId] = setInterval(\r
-            function() {\r
-                if (conn && conn.readyState == 4) {\r
-                    clearInterval(poll[tId]);\r
-                    poll[tId] = null;\r
-\r
-                    if (cbTimeout) {\r
-                        clearTimeout(pub.timeout[tId]);\r
-                        pub.timeout[tId] = null;\r
-                    }\r
-\r
-                    handleTransactionResponse(o, callback);\r
-                }\r
-            },\r
-            pub.pollInterval);\r
-    }\r
-    \r
-    // private\r
-    function asyncRequest(method, uri, callback, postData) {\r
-        var o = getConnectionObject() || null;\r
-\r
-        if (o) {\r
-            o.conn.open(method, uri, true);\r
-\r
-            if (pub.useDefaultXhrHeader) {                    \r
-                initHeader('X-Requested-With', pub.defaultXhrHeader);\r
-            }\r
-\r
-            if(postData && pub.useDefaultHeader && (!pub.headers || !pub.headers[CONTENTTYPE])){\r
-                initHeader(CONTENTTYPE, pub.defaultPostHeader);\r
-            }\r
-\r
-            if (pub.defaultHeaders || pub.headers) {\r
-                setHeader(o);\r
-            }\r
-\r
-            handleReadyState(o, callback);\r
-            o.conn.send(postData || null);\r
-        }\r
-        return o;\r
-    }\r
-    \r
-    // private\r
-    function getConnectionObject() {\r
-        var o;          \r
-\r
-        try {\r
-            if (o = createXhrObject(pub.transactionId)) {\r
-                pub.transactionId++;\r
-            }\r
-        } catch(e) {\r
-        } finally {\r
-            return o;\r
-        }\r
-    }\r
-       \r
-    // private\r
-    function createXhrObject(transactionId) {\r
-        var http;\r
-            \r
-        try {\r
-            http = new XMLHttpRequest();                \r
-        } catch(e) {\r
-            for (var i = 0; i < activeX.length; ++i) {              \r
-                try {\r
-                    http = new ActiveXObject(activeX[i]);                        \r
-                    break;\r
-                } catch(e) {}\r
-            }\r
-        } finally {\r
-            return {conn : http, tId : transactionId};\r
-        }\r
-    }\r
-         \r
-    var pub = {\r
-        request : function(method, uri, cb, data, options) {\r
-            if(options){\r
-                var me = this,              \r
-                    xmlData = options.xmlData,\r
-                    jsonData = options.jsonData,\r
-                    hs;\r
-                    \r
-                Ext.applyIf(me, options);           \r
-                \r
-                if(xmlData || jsonData){\r
-                    hs = me.headers;\r
-                    if(!hs || !hs[CONTENTTYPE]){\r
-                        initHeader(CONTENTTYPE, xmlData ? 'text/xml' : 'application/json');\r
-                    }\r
-                    data = xmlData || (!Ext.isPrimitive(jsonData) ? Ext.encode(jsonData) : jsonData);\r
-                }\r
-            }                       \r
-            return asyncRequest(method || options.method || "POST", uri, cb, data);\r
-        },\r
-\r
-        serializeForm : function(form) {\r
-            var fElements = form.elements || (document.forms[form] || Ext.getDom(form)).elements,\r
-                hasSubmit = false,\r
-                encoder = encodeURIComponent,\r
-                element,\r
-                options, \r
-                name, \r
-                val,                \r
-                data = '',\r
-                type;\r
-                \r
-            Ext.each(fElements, function(element) {                 \r
-                name = element.name;                 \r
-                type = element.type;\r
-                \r
-                if (!element.disabled && name){\r
-                    if(/select-(one|multiple)/i.test(type)) {\r
-                        Ext.each(element.options, function(opt) {\r
-                            if (opt.selected) {\r
-                                data += String.format("{0}={1}&", encoder(name), encoder((opt.hasAttribute ? opt.hasAttribute('value') : opt.getAttribute('value') !== null) ? opt.value : opt.text));\r
-                            }                               \r
-                        });\r
-                    } else if(!/file|undefined|reset|button/i.test(type)) {\r
-                            if(!(/radio|checkbox/i.test(type) && !element.checked) && !(type == 'submit' && hasSubmit)){\r
-                                \r
-                                data += encoder(name) + '=' + encoder(element.value) + '&';                     \r
-                                hasSubmit = /submit/i.test(type);    \r
-                            }                       \r
-                    } \r
-                }\r
-            });            \r
-            return data.substr(0, data.length - 1);\r
-        },\r
-        \r
-        useDefaultHeader : true,\r
-        defaultPostHeader : 'application/x-www-form-urlencoded; charset=UTF-8',\r
-        useDefaultXhrHeader : true,\r
-        defaultXhrHeader : 'XMLHttpRequest',        \r
-        poll : {},\r
-        timeout : {},\r
-        pollInterval : 50,\r
-        transactionId : 0,\r
-        \r
-//  This is never called - Is it worth exposing this?               \r
-//          setProgId : function(id) {\r
-//              activeX.unshift(id);\r
-//          },\r
-\r
-//  This is never called - Is it worth exposing this?   \r
-//          setDefaultPostHeader : function(b) {\r
-//              this.useDefaultHeader = b;\r
-//          },\r
-        \r
-//  This is never called - Is it worth exposing this?   \r
-//          setDefaultXhrHeader : function(b) {\r
-//              this.useDefaultXhrHeader = b;\r
-//          },\r
-\r
-//  This is never called - Is it worth exposing this?           \r
-//          setPollingInterval : function(i) {\r
-//              if (typeof i == 'number' && isFinite(i)) {\r
-//                  this.pollInterval = i;\r
-//              }\r
-//          },\r
-        \r
-//  This is never called - Is it worth exposing this?\r
-//          resetDefaultHeaders : function() {\r
-//              this.defaultHeaders = null;\r
-//          },\r
-    \r
-            abort : function(o, callback, isTimeout) {\r
-                var me = this,\r
-                    tId = o.tId,\r
-                    isAbort = false;\r
-                \r
-                if (me.isCallInProgress(o)) {\r
-                    o.conn.abort();\r
-                    clearInterval(me.poll[tId]);\r
-                    me.poll[tId] = null;\r
-                    clearTimeout(pub.timeout[tId]);\r
-                    me.timeout[tId] = null;\r
-                    \r
-                    handleTransactionResponse(o, callback, (isAbort = true), isTimeout);                \r
-                }\r
-                return isAbort;\r
-            },\r
-    \r
-            isCallInProgress : function(o) {\r
-                // if there is a connection and readyState is not 0 or 4\r
-                return o.conn && !{0:true,4:true}[o.conn.readyState];           \r
-            }\r
-        };\r
-        return pub;\r
-    }();</pre>    \r
-</body>\r
+<html>
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />    
+  <title>The source code</title>
+    <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
+    <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
+</head>
+<body  onload="prettyPrint();">
+    <pre class="prettyprint lang-js">/*!
+ * Ext JS Library 3.3.1
+ * Copyright(c) 2006-2010 Sencha Inc.
+ * licensing@sencha.com
+ * http://www.sencha.com/license
+ */
+/*
+* 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
+*/
+Ext.lib.Ajax = function() {
+    var activeX = ['Msxml2.XMLHTTP.6.0',
+                   'Msxml2.XMLHTTP.3.0',
+                   'Msxml2.XMLHTTP'],
+        CONTENTTYPE = 'Content-Type';
+
+    // private
+    function setHeader(o) {
+        var conn = o.conn,
+            prop,
+            headers = {};
+
+        function setTheHeaders(conn, headers){
+            for (prop in headers) {
+                if (headers.hasOwnProperty(prop)) {
+                    conn.setRequestHeader(prop, headers[prop]);
+                }
+            }
+        }
+
+        Ext.apply(headers, pub.headers, pub.defaultHeaders);
+        setTheHeaders(conn, headers);
+        delete pub.headers;
+    }
+
+    // private
+    function createExceptionObject(tId, callbackArg, isAbort, isTimeout) {
+        return {
+            tId : tId,
+            status : isAbort ? -1 : 0,
+            statusText : isAbort ? 'transaction aborted' : 'communication failure',
+            isAbort: isAbort,
+            isTimeout: isTimeout,
+            argument : callbackArg
+        };
+    }
+
+    // private
+    function initHeader(label, value) {
+        (pub.headers = pub.headers || {})[label] = value;
+    }
+
+    // private
+    function createResponseObject(o, callbackArg) {
+        var headerObj = {},
+            headerStr,
+            conn = o.conn,
+            t,
+            s,
+            // see: https://prototype.lighthouseapp.com/projects/8886/tickets/129-ie-mangles-http-response-status-code-204-to-1223
+            isBrokenStatus = conn.status == 1223;
+
+        try {
+            headerStr = o.conn.getAllResponseHeaders();
+            Ext.each(headerStr.replace(/\r\n/g, '\n').split('\n'), function(v){
+                t = v.indexOf(':');
+                if(t >= 0){
+                    s = v.substr(0, t).toLowerCase();
+                    if(v.charAt(t + 1) == ' '){
+                        ++t;
+                    }
+                    headerObj[s] = v.substr(t + 1);
+                }
+            });
+        } catch(e) {}
+
+        return {
+            tId : o.tId,
+            // Normalize the status and statusText when IE returns 1223, see the above link.
+            status : isBrokenStatus ? 204 : conn.status,
+            statusText : isBrokenStatus ? 'No Content' : conn.statusText,
+            getResponseHeader : function(header){return headerObj[header.toLowerCase()];},
+            getAllResponseHeaders : function(){return headerStr;},
+            responseText : conn.responseText,
+            responseXML : conn.responseXML,
+            argument : callbackArg
+        };
+    }
+
+    // private
+    function releaseObject(o) {
+        if (o.tId) {
+            pub.conn[o.tId] = null;
+        }
+        o.conn = null;
+        o = null;
+    }
+
+    // private
+    function handleTransactionResponse(o, callback, isAbort, isTimeout) {
+        if (!callback) {
+            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) || (Ext.isIE && httpStatus == 1223)) {
+            responseObject = 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 = createExceptionObject(o.tId, callback.argument, (isAbort ? isAbort : false), isTimeout);
+                    if (callback.failure) {
+                        if (!callback.scope) {
+                            callback.failure(responseObject);
+                        }
+                        else {
+                            callback.failure.apply(callback.scope, [responseObject]);
+                        }
+                    }
+                    break;
+                default:
+                    responseObject = createResponseObject(o, callback.argument);
+                    if (callback.failure) {
+                        if (!callback.scope) {
+                            callback.failure(responseObject);
+                        }
+                        else {
+                            callback.failure.apply(callback.scope, [responseObject]);
+                        }
+                    }
+            }
+        }
+
+        releaseObject(o);
+        responseObject = null;
+    }
+    
+    function checkResponse(o, callback, conn, tId, poll, cbTimeout){
+        if (conn && conn.readyState == 4) {
+            clearInterval(poll[tId]);
+            poll[tId] = null;
+
+            if (cbTimeout) {
+                clearTimeout(pub.timeout[tId]);
+                pub.timeout[tId] = null;
+            }
+            handleTransactionResponse(o, callback);
+        }
+    }
+    
+    function checkTimeout(o, callback){
+        pub.abort(o, callback, true);
+    }
+    
+
+    // private
+    function handleReadyState(o, callback){
+        callback = callback || {};
+        var conn = o.conn,
+            tId = o.tId,
+            poll = pub.poll,
+            cbTimeout = callback.timeout || null;
+
+        if (cbTimeout) {
+            pub.conn[tId] = conn;
+            pub.timeout[tId] = setTimeout(checkTimeout.createCallback(o, callback), cbTimeout);
+        }
+        poll[tId] = setInterval(checkResponse.createCallback(o, callback, conn, tId, poll, cbTimeout), pub.pollInterval);
+    }
+
+    // private
+    function asyncRequest(method, uri, callback, postData) {
+        var o = getConnectionObject() || null;
+
+        if (o) {
+            o.conn.open(method, uri, true);
+
+            if (pub.useDefaultXhrHeader) {
+                initHeader('X-Requested-With', pub.defaultXhrHeader);
+            }
+
+            if(postData && pub.useDefaultHeader && (!pub.headers || !pub.headers[CONTENTTYPE])){
+                initHeader(CONTENTTYPE, pub.defaultPostHeader);
+            }
+
+            if (pub.defaultHeaders || pub.headers) {
+                setHeader(o);
+            }
+
+            handleReadyState(o, callback);
+            o.conn.send(postData || null);
+        }
+        return o;
+    }
+
+    // private
+    function getConnectionObject() {
+        var o;
+
+        try {
+            if (o = createXhrObject(pub.transactionId)) {
+                pub.transactionId++;
+            }
+        } catch(e) {
+        } finally {
+            return o;
+        }
+    }
+
+    // private
+    function createXhrObject(transactionId) {
+        var http;
+
+        try {
+            http = new XMLHttpRequest();
+        } catch(e) {
+            for (var i = 0; i < activeX.length; ++i) {
+                try {
+                    http = new ActiveXObject(activeX[i]);
+                    break;
+                } catch(e) {}
+            }
+        } finally {
+            return {conn : http, tId : transactionId};
+        }
+    }
+
+    var pub = {
+        request : function(method, uri, cb, data, options) {
+            if(options){
+                var me = this,
+                    xmlData = options.xmlData,
+                    jsonData = options.jsonData,
+                    hs;
+
+                Ext.applyIf(me, options);
+
+                if(xmlData || jsonData){
+                    hs = me.headers;
+                    if(!hs || !hs[CONTENTTYPE]){
+                        initHeader(CONTENTTYPE, xmlData ? 'text/xml' : 'application/json');
+                    }
+                    data = xmlData || (!Ext.isPrimitive(jsonData) ? Ext.encode(jsonData) : jsonData);
+                }
+            }
+            return asyncRequest(method || options.method || "POST", uri, cb, data);
+        },
+
+        serializeForm : function(form) {
+            var fElements = form.elements || (document.forms[form] || Ext.getDom(form)).elements, 
+                hasSubmit = false, 
+                encoder = encodeURIComponent, 
+                name, 
+                data = '', 
+                type, 
+                hasValue;
+    
+            Ext.each(fElements, function(element){
+                name = element.name;
+                type = element.type;
+        
+                if (!element.disabled && name) {
+                    if (/select-(one|multiple)/i.test(type)) {
+                        Ext.each(element.options, function(opt){
+                            if (opt.selected) {
+                                hasValue = opt.hasAttribute ? opt.hasAttribute('value') : opt.getAttributeNode('value').specified;
+                                data += String.format("{0}={1}&", encoder(name), encoder(hasValue ? opt.value : opt.text));
+                            }
+                        });
+                    } else if (!(/file|undefined|reset|button/i.test(type))) {
+                        if (!(/radio|checkbox/i.test(type) && !element.checked) && !(type == 'submit' && hasSubmit)) {
+                            data += encoder(name) + '=' + encoder(element.value) + '&';
+                            hasSubmit = /submit/i.test(type);
+                        }
+                    }
+                }
+            });
+            return data.substr(0, data.length - 1);
+        },
+
+        useDefaultHeader : true,
+        defaultPostHeader : 'application/x-www-form-urlencoded; charset=UTF-8',
+        useDefaultXhrHeader : true,
+        defaultXhrHeader : 'XMLHttpRequest',
+        poll : {},
+        timeout : {},
+        conn: {},
+        pollInterval : 50,
+        transactionId : 0,
+
+//  This is never called - Is it worth exposing this?
+//          setProgId : function(id) {
+//              activeX.unshift(id);
+//          },
+
+//  This is never called - Is it worth exposing this?
+//          setDefaultPostHeader : function(b) {
+//              this.useDefaultHeader = b;
+//          },
+
+//  This is never called - Is it worth exposing this?
+//          setDefaultXhrHeader : function(b) {
+//              this.useDefaultXhrHeader = b;
+//          },
+
+//  This is never called - Is it worth exposing this?
+//          setPollingInterval : function(i) {
+//              if (typeof i == 'number' && isFinite(i)) {
+//                  this.pollInterval = i;
+//              }
+//          },
+
+//  This is never called - Is it worth exposing this?
+//          resetDefaultHeaders : function() {
+//              this.defaultHeaders = null;
+//          },
+
+        abort : function(o, callback, isTimeout) {
+            var me = this,
+                tId = o.tId,
+                isAbort = false;
+
+            if (me.isCallInProgress(o)) {
+                o.conn.abort();
+                clearInterval(me.poll[tId]);
+                me.poll[tId] = null;
+                clearTimeout(pub.timeout[tId]);
+                me.timeout[tId] = null;
+
+                handleTransactionResponse(o, callback, (isAbort = true), isTimeout);
+            }
+            return isAbort;
+        },
+
+        isCallInProgress : function(o) {
+            // if there is a connection and readyState is not 0 or 4
+            return o.conn && !{0:true,4:true}[o.conn.readyState];
+        }
+    };
+    return pub;
+}();</pre>    
+</body>
 </html>
\ No newline at end of file
 </html>
\ No newline at end of file