| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756 | <!DOCTYPE html><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>  <style type="text/css">    .highlight { display: block; background-color: #ddd; }  </style>  <script type="text/javascript">    function highlight() {      document.getElementById(location.hash.replace(/#/, "")).className = "highlight";    }  </script></head><body onload="prettyPrint(); highlight();">  <pre class="prettyprint lang-js"><span id='Ext'>/**</span> * @class Ext * @singleton */var Ext = Ext || {};Ext._startTime = new Date().getTime();(function() {    var global = this,        objectPrototype = Object.prototype,        toString = objectPrototype.toString,        enumerables = true,        enumerablesTest = { toString: 1 },        emptyFn = function () {},        // This is the "$previous" method of a hook function on an instance. When called, it        // calls through the class prototype by the name of the called method.        callOverrideParent = function () {            var method = callOverrideParent.caller.caller; // skip callParent (our caller)            return method.$owner.prototype[method.$name].apply(this, arguments);        },        i;    Ext.global = global;    for (i in enumerablesTest) {        enumerables = null;    }    if (enumerables) {        enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable',                       'toLocaleString', 'toString', 'constructor'];    }<span id='Ext-property-enumerables'>    /**</span>     * An array containing extra enumerables for old browsers     * @property {String[]}     */    Ext.enumerables = enumerables;<span id='Ext-method-apply'>    /**</span>     * Copies all the properties of config to the specified object.     * Note that if recursive merging and cloning without referencing the original objects / arrays is needed, use     * {@link Ext.Object#merge} instead.     * @param {Object} object The receiver of the properties     * @param {Object} config The source of the properties     * @param {Object} [defaults] A different object that will also be applied for default values     * @return {Object} returns obj     */    Ext.apply = function(object, config, defaults) {        if (defaults) {            Ext.apply(object, defaults);        }        if (object && config && typeof config === 'object') {            var i, j, k;            for (i in config) {                object[i] = config[i];            }            if (enumerables) {                for (j = enumerables.length; j--;) {                    k = enumerables[j];                    if (config.hasOwnProperty(k)) {                        object[k] = config[k];                    }                }            }        }        return object;    };    Ext.buildSettings = Ext.apply({        baseCSSPrefix: 'x-',        scopeResetCSS: false    }, Ext.buildSettings || {});    Ext.apply(Ext, {<span id='Ext-property-name'>        /**</span>         * @property {String} [name='Ext']         * <p>The name of the property in the global namespace (The <code>window</code> in browser environments) which refers to the current instance of Ext.</p>         * <p>This is usually <code>"Ext"</code>, but if a sandboxed build of ExtJS is being used, this will be an alternative name.</p>         * <p>If code is being generated for use by <code>eval</code> or to create a <code>new Function</code>, and the global instance         * of Ext must be referenced, this is the name that should be built into the code.</p>         */        name: Ext.sandboxName || 'Ext',<span id='Ext-property-emptyFn'>        /**</span>         * A reusable empty function         */        emptyFn: emptyFn,<span id='Ext-property-emptyString'>        /**</span>         * A zero length string which will pass a truth test. Useful for passing to methods         * which use a truth test to reject <i>falsy</i> values where a string value must be cleared.         */        emptyString: new String(),        baseCSSPrefix: Ext.buildSettings.baseCSSPrefix,<span id='Ext-method-applyIf'>        /**</span>         * Copies all the properties of config to object if they don't already exist.         * @param {Object} object The receiver of the properties         * @param {Object} config The source of the properties         * @return {Object} returns obj         */        applyIf: function(object, config) {            var property;            if (object) {                for (property in config) {                    if (object[property] === undefined) {                        object[property] = config[property];                    }                }            }            return object;        },<span id='Ext-method-iterate'>        /**</span>         * Iterates either an array or an object. This method delegates to         * {@link Ext.Array#each Ext.Array.each} if the given value is iterable, and {@link Ext.Object#each Ext.Object.each} otherwise.         *         * @param {Object/Array} object The object or array to be iterated.         * @param {Function} fn The function to be called for each iteration. See and {@link Ext.Array#each Ext.Array.each} and         * {@link Ext.Object#each Ext.Object.each} for detailed lists of arguments passed to this function depending on the given object         * type that is being iterated.         * @param {Object} scope (Optional) The scope (`this` reference) in which the specified function is executed.         * Defaults to the object being iterated itself.         * @markdown         */        iterate: function(object, fn, scope) {            if (Ext.isEmpty(object)) {                return;            }            if (scope === undefined) {                scope = object;            }            if (Ext.isIterable(object)) {                Ext.Array.each.call(Ext.Array, object, fn, scope);            }            else {                Ext.Object.each.call(Ext.Object, object, fn, scope);            }        }    });    Ext.apply(Ext, {<span id='Ext-method-extend'>        /**</span>         * This method deprecated. Use {@link Ext#define Ext.define} instead.         * @method         * @param {Function} superclass         * @param {Object} overrides         * @return {Function} The subclass constructor from the <tt>overrides</tt> parameter, or a generated one if not provided.         * @deprecated 4.0.0 Use {@link Ext#define Ext.define} instead         */        extend: (function() {            // inline overrides            var objectConstructor = objectPrototype.constructor,                inlineOverrides = function(o) {                for (var m in o) {                    if (!o.hasOwnProperty(m)) {                        continue;                    }                    this[m] = o[m];                }            };            return function(subclass, superclass, overrides) {                // First we check if the user passed in just the superClass with overrides                if (Ext.isObject(superclass)) {                    overrides = superclass;                    superclass = subclass;                    subclass = overrides.constructor !== objectConstructor ? overrides.constructor : function() {                        superclass.apply(this, arguments);                    };                }                //<debug>                if (!superclass) {                    Ext.Error.raise({                        sourceClass: 'Ext',                        sourceMethod: 'extend',                        msg: 'Attempting to extend from a class which has not been loaded on the page.'                    });                }                //</debug>                // We create a new temporary class                var F = function() {},                    subclassProto, superclassProto = superclass.prototype;                F.prototype = superclassProto;                subclassProto = subclass.prototype = new F();                subclassProto.constructor = subclass;                subclass.superclass = superclassProto;                if (superclassProto.constructor === objectConstructor) {                    superclassProto.constructor = superclass;                }                subclass.override = function(overrides) {                    Ext.override(subclass, overrides);                };                subclassProto.override = inlineOverrides;                subclassProto.proto = subclassProto;                subclass.override(overrides);                subclass.extend = function(o) {                    return Ext.extend(subclass, o);                };                return subclass;            };        }()),<span id='Ext-method-override'>        /**</span>         * Overrides members of the specified `target` with the given values.         *          * If the `target` is a class declared using {@link Ext#define Ext.define}, the         * `override` method of that class is called (see {@link Ext.Base#override}) given         * the `overrides`.         *         * If the `target` is a function, it is assumed to be a constructor and the contents         * of `overrides` are applied to its `prototype` using {@link Ext#apply Ext.apply}.         *          * If the `target` is an instance of a class declared using {@link Ext#define Ext.define},         * the `overrides` are applied to only that instance. In this case, methods are         * specially processed to allow them to use {@link Ext.Base#callParent}.         *          *      var panel = new Ext.Panel({ ... });         *               *      Ext.override(panel, {         *          initComponent: function () {         *              // extra processing...         *                       *              this.callParent();         *          }         *      });         *         * If the `target` is none of these, the `overrides` are applied to the `target`         * using {@link Ext#apply Ext.apply}.         *         * Please refer to {@link Ext#define Ext.define} and {@link Ext.Base#override} for         * further details.         *         * @param {Object} target The target to override.         * @param {Object} overrides The properties to add or replace on `target`.          * @method override         */        override: function (target, overrides) {            if (target.$isClass) {                target.override(overrides);            } else if (typeof target == 'function') {                Ext.apply(target.prototype, overrides);            } else {                var owner = target.self,                    name, value;                if (owner && owner.$isClass) { // if (instance of Ext.define'd class)                    for (name in overrides) {                        if (overrides.hasOwnProperty(name)) {                            value = overrides[name];                            if (typeof value == 'function') {                                //<debug>                                if (owner.$className) {                                    value.displayName = owner.$className + '#' + name;                                }                                //</debug>                                value.$name = name;                                value.$owner = owner;                                value.$previous = target.hasOwnProperty(name)                                    ? target[name] // already hooked, so call previous hook                                    : callOverrideParent; // calls by name on prototype                            }                            target[name] = value;                        }                    }                } else {                    Ext.apply(target, overrides);                }            }            return target;        }    });    // A full set of static methods to do type checking    Ext.apply(Ext, {<span id='Ext-method-valueFrom'>        /**</span>         * Returns the given value itself if it's not empty, as described in {@link Ext#isEmpty}; returns the default         * value (second argument) otherwise.         *         * @param {Object} value The value to test         * @param {Object} defaultValue The value to return if the original value is empty         * @param {Boolean} allowBlank (optional) true to allow zero length strings to qualify as non-empty (defaults to false)         * @return {Object} value, if non-empty, else defaultValue         */        valueFrom: function(value, defaultValue, allowBlank){            return Ext.isEmpty(value, allowBlank) ? defaultValue : value;        },<span id='Ext-method-typeOf'>        /**</span>         * Returns the type of the given variable in string format. List of possible values are:         *         * - `undefined`: If the given value is `undefined`         * - `null`: If the given value is `null`         * - `string`: If the given value is a string         * - `number`: If the given value is a number         * - `boolean`: If the given value is a boolean value         * - `date`: If the given value is a `Date` object         * - `function`: If the given value is a function reference         * - `object`: If the given value is an object         * - `array`: If the given value is an array         * - `regexp`: If the given value is a regular expression         * - `element`: If the given value is a DOM Element         * - `textnode`: If the given value is a DOM text node and contains something other than whitespace         * - `whitespace`: If the given value is a DOM text node and contains only whitespace         *         * @param {Object} value         * @return {String}         * @markdown         */        typeOf: function(value) {            var type,                typeToString;                        if (value === null) {                return 'null';            }            type = typeof value;            if (type === 'undefined' || type === 'string' || type === 'number' || type === 'boolean') {                return type;            }            typeToString = toString.call(value);            switch(typeToString) {                case '[object Array]':                    return 'array';                case '[object Date]':                    return 'date';                case '[object Boolean]':                    return 'boolean';                case '[object Number]':                    return 'number';                case '[object RegExp]':                    return 'regexp';            }            if (type === 'function') {                return 'function';            }            if (type === 'object') {                if (value.nodeType !== undefined) {                    if (value.nodeType === 3) {                        return (/\S/).test(value.nodeValue) ? 'textnode' : 'whitespace';                    }                    else {                        return 'element';                    }                }                return 'object';            }            //<debug error>            Ext.Error.raise({                sourceClass: 'Ext',                sourceMethod: 'typeOf',                msg: 'Failed to determine the type of the specified value "' + value + '". This is most likely a bug.'            });            //</debug>        },<span id='Ext-method-isEmpty'>        /**</span>         * Returns true if the passed value is empty, false otherwise. The value is deemed to be empty if it is either:         *         * - `null`         * - `undefined`         * - a zero-length array         * - a zero-length string (Unless the `allowEmptyString` parameter is set to `true`)         *         * @param {Object} value The value to test         * @param {Boolean} allowEmptyString (optional) true to allow empty strings (defaults to false)         * @return {Boolean}         * @markdown         */        isEmpty: function(value, allowEmptyString) {            return (value === null) || (value === undefined) || (!allowEmptyString ? value === '' : false) || (Ext.isArray(value) && value.length === 0);        },<span id='Ext-method-isArray'>        /**</span>         * Returns true if the passed value is a JavaScript Array, false otherwise.         *         * @param {Object} target The target to test         * @return {Boolean}         * @method         */        isArray: ('isArray' in Array) ? Array.isArray : function(value) {            return toString.call(value) === '[object Array]';        },<span id='Ext-method-isDate'>        /**</span>         * Returns true if the passed value is a JavaScript Date object, false otherwise.         * @param {Object} object The object to test         * @return {Boolean}         */        isDate: function(value) {            return toString.call(value) === '[object Date]';        },<span id='Ext-method-isObject'>        /**</span>         * Returns true if the passed value is a JavaScript Object, false otherwise.         * @param {Object} value The value to test         * @return {Boolean}         * @method         */        isObject: (toString.call(null) === '[object Object]') ?        function(value) {            // check ownerDocument here as well to exclude DOM nodes            return value !== null && value !== undefined && toString.call(value) === '[object Object]' && value.ownerDocument === undefined;        } :        function(value) {            return toString.call(value) === '[object Object]';        },<span id='Ext-method-isSimpleObject'>        /**</span>         * @private         */        isSimpleObject: function(value) {            return value instanceof Object && value.constructor === Object;        },<span id='Ext-method-isPrimitive'>        /**</span>         * Returns true if the passed value is a JavaScript 'primitive', a string, number or boolean.         * @param {Object} value The value to test         * @return {Boolean}         */        isPrimitive: function(value) {            var type = typeof value;            return type === 'string' || type === 'number' || type === 'boolean';        },<span id='Ext-method-isFunction'>        /**</span>         * Returns true if the passed value is a JavaScript Function, false otherwise.         * @param {Object} value The value to test         * @return {Boolean}         * @method         */        isFunction:        // Safari 3.x and 4.x returns 'function' for typeof <NodeList>, hence we need to fall back to using        // Object.prototype.toString (slower)        (typeof document !== 'undefined' && typeof document.getElementsByTagName('body') === 'function') ? function(value) {            return toString.call(value) === '[object Function]';        } : function(value) {            return typeof value === 'function';        },<span id='Ext-method-isNumber'>        /**</span>         * Returns true if the passed value is a number. Returns false for non-finite numbers.         * @param {Object} value The value to test         * @return {Boolean}         */        isNumber: function(value) {            return typeof value === 'number' && isFinite(value);        },<span id='Ext-method-isNumeric'>        /**</span>         * Validates that a value is numeric.         * @param {Object} value Examples: 1, '1', '2.34'         * @return {Boolean} True if numeric, false otherwise         */        isNumeric: function(value) {            return !isNaN(parseFloat(value)) && isFinite(value);        },<span id='Ext-method-isString'>        /**</span>         * Returns true if the passed value is a string.         * @param {Object} value The value to test         * @return {Boolean}         */        isString: function(value) {            return typeof value === 'string';        },<span id='Ext-method-isBoolean'>        /**</span>         * Returns true if the passed value is a boolean.         *         * @param {Object} value The value to test         * @return {Boolean}         */        isBoolean: function(value) {            return typeof value === 'boolean';        },<span id='Ext-method-isElement'>        /**</span>         * Returns true if the passed value is an HTMLElement         * @param {Object} value The value to test         * @return {Boolean}         */        isElement: function(value) {            return value ? value.nodeType === 1 : false;        },<span id='Ext-method-isTextNode'>        /**</span>         * Returns true if the passed value is a TextNode         * @param {Object} value The value to test         * @return {Boolean}         */        isTextNode: function(value) {            return value ? value.nodeName === "#text" : false;        },<span id='Ext-method-isDefined'>        /**</span>         * Returns true if the passed value is defined.         * @param {Object} value The value to test         * @return {Boolean}         */        isDefined: function(value) {            return typeof value !== 'undefined';        },<span id='Ext-method-isIterable'>        /**</span>         * Returns true if the passed value is iterable, false otherwise         * @param {Object} value The value to test         * @return {Boolean}         */        isIterable: function(value) {            var type = typeof value,                checkLength = false;            if (value && type != 'string') {                // Functions have a length property, so we need to filter them out                if (type == 'function') {                    // In Safari, NodeList/HTMLCollection both return "function" when using typeof, so we need                    // to explicitly check them here.                    if (Ext.isSafari) {                        checkLength = value instanceof NodeList || value instanceof HTMLCollection;                    }                } else {                    checkLength = true;                }            }            return checkLength ? value.length !== undefined : false;        }    });    Ext.apply(Ext, {<span id='Ext-method-clone'>        /**</span>         * Clone simple variables including array, {}-like objects, DOM nodes and Date without keeping the old reference.         * A reference for the object itself is returned if it's not a direct decendant of Object. For model cloning,         * see {@link Ext.data.Model#copy Model.copy}.         *          * @param {Object} item The variable to clone         * @return {Object} clone         */        clone: function(item) {            var type,                i,                j,                k,                clone,                key;                        if (item === null || item === undefined) {                return item;            }            // DOM nodes            // TODO proxy this to Ext.Element.clone to handle automatic id attribute changing            // recursively            if (item.nodeType && item.cloneNode) {                return item.cloneNode(true);            }            type = toString.call(item);            // Date            if (type === '[object Date]') {                return new Date(item.getTime());            }            // Array            if (type === '[object Array]') {                i = item.length;                clone = [];                while (i--) {                    clone[i] = Ext.clone(item[i]);                }            }            // Object            else if (type === '[object Object]' && item.constructor === Object) {                clone = {};                for (key in item) {                    clone[key] = Ext.clone(item[key]);                }                if (enumerables) {                    for (j = enumerables.length; j--;) {                        k = enumerables[j];                        clone[k] = item[k];                    }                }            }            return clone || item;        },<span id='Ext-method-getUniqueGlobalNamespace'>        /**</span>         * @private         * Generate a unique reference of Ext in the global scope, useful for sandboxing         */        getUniqueGlobalNamespace: function() {            var uniqueGlobalNamespace = this.uniqueGlobalNamespace,                i;            if (uniqueGlobalNamespace === undefined) {                i = 0;                do {                    uniqueGlobalNamespace = 'ExtBox' + (++i);                } while (Ext.global[uniqueGlobalNamespace] !== undefined);                Ext.global[uniqueGlobalNamespace] = Ext;                this.uniqueGlobalNamespace = uniqueGlobalNamespace;            }            return uniqueGlobalNamespace;        },        <span id='Ext-property-functionFactoryCache'>        /**</span>         * @private         */        functionFactoryCache: {},                cacheableFunctionFactory: function() {            var me = this,                args = Array.prototype.slice.call(arguments),                cache = me.functionFactoryCache,                idx, fn, ln;                             if (Ext.isSandboxed) {                ln = args.length;                if (ln > 0) {                    ln--;                    args[ln] = 'var Ext=window.' + Ext.name + ';' + args[ln];                }            }            idx = args.join('');            fn = cache[idx];            if (!fn) {                fn = Function.prototype.constructor.apply(Function.prototype, args);                                cache[idx] = fn;            }            return fn;        },                functionFactory: function() {            var me = this,                args = Array.prototype.slice.call(arguments),                ln;                            if (Ext.isSandboxed) {                ln = args.length;                if (ln > 0) {                    ln--;                    args[ln] = 'var Ext=window.' + Ext.name + ';' + args[ln];                }            }                 return Function.prototype.constructor.apply(Function.prototype, args);        },<span id='Ext-property-Logger'>        /**</span>         * @private         * @property         */        Logger: {            verbose: emptyFn,            log: emptyFn,            info: emptyFn,            warn: emptyFn,            error: function(message) {                throw new Error(message);            },            deprecate: emptyFn        }    });<span id='Ext-method-type'>    /**</span>     * Old alias to {@link Ext#typeOf}     * @deprecated 4.0.0 Use {@link Ext#typeOf} instead     * @method     * @inheritdoc Ext#typeOf     */    Ext.type = Ext.typeOf;}());/* * This method evaluates the given code free of any local variable. In some browsers this * will be at global scope, in others it will be in a function. * @parma {String} code The code to evaluate. * @private * @method */Ext.globalEval = Ext.global.execScript    ? function(code) {        execScript(code);    }    : function($$code) {        // IMPORTANT: because we use eval we cannot place this in the above function or it        // will break the compressor's ability to rename local variables...        (function(){            eval($$code);        }());    };</pre></body></html>
 |