| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054 | <!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-form-Basic'>/**</span> * Provides input field management, validation, submission, and form loading services for the collection * of {@link Ext.form.field.Field Field} instances within a {@link Ext.container.Container}. It is recommended * that you use a {@link Ext.form.Panel} as the form container, as that has logic to automatically * hook up an instance of {@link Ext.form.Basic} (plus other conveniences related to field configuration.) * * ## Form Actions * * The Basic class delegates the handling of form loads and submits to instances of {@link Ext.form.action.Action}. * See the various Action implementations for specific details of each one's functionality, as well as the * documentation for {@link #doAction} which details the configuration options that can be specified in * each action call. * * The default submit Action is {@link Ext.form.action.Submit}, which uses an Ajax request to submit the * form's values to a configured URL. To enable normal browser submission of an Ext form, use the * {@link #standardSubmit} config option. * * ## File uploads * * File uploads are not performed using normal 'Ajax' techniques; see the description for * {@link #hasUpload} for details. If you're using file uploads you should read the method description. * * ## Example usage: * *     @example *     Ext.create('Ext.form.Panel', { *         title: 'Basic Form', *         renderTo: Ext.getBody(), *         bodyPadding: 5, *         width: 350, * *         // Any configuration items here will be automatically passed along to *         // the Ext.form.Basic instance when it gets created. * *         // The form will submit an AJAX request to this URL when submitted *         url: 'save-form.php', * *         items: [{ *             xtype: 'textfield', *             fieldLabel: 'Field', *             name: 'theField' *         }], * *         buttons: [{ *             text: 'Submit', *             handler: function() { *                 // The getForm() method returns the Ext.form.Basic instance: *                 var form = this.up('form').getForm(); *                 if (form.isValid()) { *                     // Submit the Ajax request and handle the response *                     form.submit({ *                         success: function(form, action) { *                            Ext.Msg.alert('Success', action.result.message); *                         }, *                         failure: function(form, action) { *                             Ext.Msg.alert('Failed', action.result ? action.result.message : 'No response'); *                         } *                     }); *                 } *             } *         }] *     }); * * @docauthor Jason Johnston <jason@sencha.com> */Ext.define('Ext.form.Basic', {    extend: 'Ext.util.Observable',    alternateClassName: 'Ext.form.BasicForm',    requires: ['Ext.util.MixedCollection', 'Ext.form.action.Load', 'Ext.form.action.Submit',               'Ext.window.MessageBox', 'Ext.data.Errors', 'Ext.util.DelayedTask'],<span id='Ext-form-Basic-method-constructor'>    /**</span>     * Creates new form.     * @param {Ext.container.Container} owner The component that is the container for the form, usually a {@link Ext.form.Panel}     * @param {Object} config Configuration options. These are normally specified in the config to the     * {@link Ext.form.Panel} constructor, which passes them along to the BasicForm automatically.     */    constructor: function(owner, config) {        var me = this,            onItemAddOrRemove = me.onItemAddOrRemove,            api,            fn;<span id='Ext-form-Basic-property-owner'>        /**</span>         * @property {Ext.container.Container} owner         * The container component to which this BasicForm is attached.         */        me.owner = owner;        // Listen for addition/removal of fields in the owner container        me.mon(owner, {            add: onItemAddOrRemove,            remove: onItemAddOrRemove,            scope: me        });        Ext.apply(me, config);        // Normalize the paramOrder to an Array        if (Ext.isString(me.paramOrder)) {            me.paramOrder = me.paramOrder.split(/[\s,|]/);        }                if (me.api) {            api = me.api = Ext.apply({}, me.api);            for (fn in api) {                if (api.hasOwnProperty(fn)) {                    api[fn] = Ext.direct.Manager.parseMethod(api[fn]);                }            }        }        me.checkValidityTask = new Ext.util.DelayedTask(me.checkValidity, me);        me.addEvents(<span id='Ext-form-Basic-event-beforeaction'>            /**</span>             * @event beforeaction             * Fires before any action is performed. Return false to cancel the action.             * @param {Ext.form.Basic} this             * @param {Ext.form.action.Action} action The {@link Ext.form.action.Action} to be performed             */            'beforeaction',<span id='Ext-form-Basic-event-actionfailed'>            /**</span>             * @event actionfailed             * Fires when an action fails.             * @param {Ext.form.Basic} this             * @param {Ext.form.action.Action} action The {@link Ext.form.action.Action} that failed             */            'actionfailed',<span id='Ext-form-Basic-event-actioncomplete'>            /**</span>             * @event actioncomplete             * Fires when an action is completed.             * @param {Ext.form.Basic} this             * @param {Ext.form.action.Action} action The {@link Ext.form.action.Action} that completed             */            'actioncomplete',<span id='Ext-form-Basic-event-validitychange'>            /**</span>             * @event validitychange             * Fires when the validity of the entire form changes.             * @param {Ext.form.Basic} this             * @param {Boolean} valid `true` if the form is now valid, `false` if it is now invalid.             */            'validitychange',<span id='Ext-form-Basic-event-dirtychange'>            /**</span>             * @event dirtychange             * Fires when the dirty state of the entire form changes.             * @param {Ext.form.Basic} this             * @param {Boolean} dirty `true` if the form is now dirty, `false` if it is no longer dirty.             */            'dirtychange'        );        me.callParent();    },<span id='Ext-form-Basic-method-initialize'>    /**</span>     * Do any post layout initialization     * @private     */    initialize : function() {        var me = this;        me.initialized = true;        me.onValidityChange(!me.hasInvalidField());    },<span id='Ext-form-Basic-cfg-method'>    /**</span>     * @cfg {String} method     * The request method to use (GET or POST) for form actions if one isn't supplied in the action options.     */<span id='Ext-form-Basic-cfg-reader'>    /**</span>     * @cfg {Ext.data.reader.Reader} reader     * An Ext.data.DataReader (e.g. {@link Ext.data.reader.Xml}) to be used to read     * data when executing 'load' actions. This is optional as there is built-in     * support for processing JSON responses.     */<span id='Ext-form-Basic-cfg-errorReader'>    /**</span>     * @cfg {Ext.data.reader.Reader} errorReader     * An Ext.data.DataReader (e.g. {@link Ext.data.reader.Xml}) to be used to     * read field error messages returned from 'submit' actions. This is optional     * as there is built-in support for processing JSON responses.     *     * The Records which provide messages for the invalid Fields must use the     * Field name (or id) as the Record ID, and must contain a field called 'msg'     * which contains the error message.     *     * The errorReader does not have to be a full-blown implementation of a     * Reader. It simply needs to implement a `read(xhr)` function     * which returns an Array of Records in an object with the following     * structure:     *     *     {     *         records: recordArray     *     }     */<span id='Ext-form-Basic-cfg-url'>    /**</span>     * @cfg {String} url     * The URL to use for form actions if one isn't supplied in the     * {@link #doAction doAction} options.     */<span id='Ext-form-Basic-cfg-baseParams'>    /**</span>     * @cfg {Object} baseParams     * Parameters to pass with all requests. e.g. baseParams: `{id: '123', foo: 'bar'}`.     *     * Parameters are encoded as standard HTTP parameters using {@link Ext.Object#toQueryString}.     */<span id='Ext-form-Basic-cfg-timeout'>    /**</span>     * @cfg {Number} timeout     * Timeout for form actions in seconds.     */    timeout: 30,<span id='Ext-form-Basic-cfg-api'>    /**</span>     * @cfg {Object} api     * If specified, load and submit actions will be handled with {@link Ext.form.action.DirectLoad DirectLoad}     * and {@link Ext.form.action.DirectSubmit DirectSubmit}.  Methods which have been imported by     * {@link Ext.direct.Manager} can be specified here to load and submit forms. API methods may also be     * specified as strings. See {@link Ext.data.proxy.Direct#directFn}.  Such as the following:     *     *     api: {     *         load: App.ss.MyProfile.load,     *         submit: App.ss.MyProfile.submit     *     }     *     * Load actions can use {@link #paramOrder} or {@link #paramsAsHash} to customize how the load method     * is invoked.  Submit actions will always use a standard form submit. The `formHandler` configuration     * (see Ext.direct.RemotingProvider#action) must be set on the associated server-side method which has     * been imported by {@link Ext.direct.Manager}.     */<span id='Ext-form-Basic-cfg-paramOrder'>    /**</span>     * @cfg {String/String[]} paramOrder     * A list of params to be executed server side. Only used for the {@link #api} `load`     * configuration.     *     * Specify the params in the order in which they must be executed on the     * server-side as either (1) an Array of String values, or (2) a String of params     * delimited by either whitespace, comma, or pipe. For example,     * any of the following would be acceptable:     *     *     paramOrder: ['param1','param2','param3']     *     paramOrder: 'param1 param2 param3'     *     paramOrder: 'param1,param2,param3'     *     paramOrder: 'param1|param2|param'     */<span id='Ext-form-Basic-cfg-paramsAsHash'>    /**</span>     * @cfg {Boolean} paramsAsHash     * Only used for the {@link #api} `load` configuration. If true, parameters will be sent as a     * single hash collection of named arguments. Providing a {@link #paramOrder} nullifies this     * configuration.     */    paramsAsHash: false,    //<locale><span id='Ext-form-Basic-cfg-waitTitle'>    /**</span>     * @cfg {String} waitTitle     * The default title to show for the waiting message box     */    waitTitle: 'Please Wait...',    //</locale><span id='Ext-form-Basic-cfg-trackResetOnLoad'>    /**</span>     * @cfg {Boolean} trackResetOnLoad     * If set to true, {@link #reset}() resets to the last loaded or {@link #setValues}() data instead of     * when the form was first created.     */    trackResetOnLoad: false,<span id='Ext-form-Basic-cfg-standardSubmit'>    /**</span>     * @cfg {Boolean} standardSubmit     * If set to true, a standard HTML form submit is used instead of a XHR (Ajax) style form submission.     * All of the field values, plus any additional params configured via {@link #baseParams}     * and/or the `options` to {@link #submit}, will be included in the values submitted in the form.     */<span id='Ext-form-Basic-cfg-waitMsgTarget'>    /**</span>     * @cfg {String/HTMLElement/Ext.Element} waitMsgTarget     * By default wait messages are displayed with Ext.MessageBox.wait. You can target a specific     * element by passing it or its id or mask the form itself by passing in true.     */    // Private    wasDirty: false,<span id='Ext-form-Basic-method-destroy'>    /**</span>     * Destroys this object.     */    destroy: function() {        this.clearListeners();        this.checkValidityTask.cancel();    },<span id='Ext-form-Basic-method-onItemAddOrRemove'>    /**</span>     * @private     * Handle addition or removal of descendant items. Invalidates the cached list of fields     * so that {@link #getFields} will do a fresh query next time it is called. Also adds listeners     * for state change events on added fields, and tracks components with formBind=true.     */    onItemAddOrRemove: function(parent, child) {        var me = this,            isAdding = !!child.ownerCt,            isContainer = child.isContainer;        function handleField(field) {            // Listen for state change events on fields            me[isAdding ? 'mon' : 'mun'](field, {                validitychange: me.checkValidity,                dirtychange: me.checkDirty,                scope: me,                buffer: 100 //batch up sequential calls to avoid excessive full-form validation            });            // Flush the cached list of fields            delete me._fields;        }        if (child.isFormField) {            handleField(child);        } else if (isContainer) {            // Walk down            if (child.isDestroyed || child.destroying) {                // the container is destroyed, this means we may have child fields, so here                // we just invalidate all the fields to be sure.                delete me._fields;            } else {                Ext.Array.forEach(child.query('[isFormField]'), handleField);            }        }        // Flush the cached list of formBind components        delete this._boundItems;        // Check form bind, but only after initial add. Batch it to prevent excessive validation        // calls when many fields are being added at once.        if (me.initialized) {            me.checkValidityTask.delay(10);        }    },<span id='Ext-form-Basic-method-getFields'>    /**</span>     * Return all the {@link Ext.form.field.Field} components in the owner container.     * @return {Ext.util.MixedCollection} Collection of the Field objects     */    getFields: function() {        var fields = this._fields;        if (!fields) {            fields = this._fields = new Ext.util.MixedCollection();            fields.addAll(this.owner.query('[isFormField]'));        }        return fields;    },<span id='Ext-form-Basic-method-getBoundItems'>    /**</span>     * @private     * Finds and returns the set of all items bound to fields inside this form     * @return {Ext.util.MixedCollection} The set of all bound form field items     */    getBoundItems: function() {        var boundItems = this._boundItems;                if (!boundItems || boundItems.getCount() === 0) {            boundItems = this._boundItems = new Ext.util.MixedCollection();            boundItems.addAll(this.owner.query('[formBind]'));        }                return boundItems;    },<span id='Ext-form-Basic-method-hasInvalidField'>    /**</span>     * Returns true if the form contains any invalid fields. No fields will be marked as invalid     * as a result of calling this; to trigger marking of fields use {@link #isValid} instead.     */    hasInvalidField: function() {        return !!this.getFields().findBy(function(field) {            var preventMark = field.preventMark,                isValid;            field.preventMark = true;            isValid = field.isValid();            field.preventMark = preventMark;            return !isValid;        });    },<span id='Ext-form-Basic-method-isValid'>    /**</span>     * Returns true if client-side validation on the form is successful. Any invalid fields will be     * marked as invalid. If you only want to determine overall form validity without marking anything,     * use {@link #hasInvalidField} instead.     * @return Boolean     */    isValid: function() {        var me = this,            invalid;        Ext.suspendLayouts();        invalid = me.getFields().filterBy(function(field) {            return !field.validate();        });        Ext.resumeLayouts(true);        return invalid.length < 1;    },<span id='Ext-form-Basic-method-checkValidity'>    /**</span>     * Check whether the validity of the entire form has changed since it was last checked, and     * if so fire the {@link #validitychange validitychange} event. This is automatically invoked     * when an individual field's validity changes.     */    checkValidity: function() {        var me = this,            valid = !me.hasInvalidField();        if (valid !== me.wasValid) {            me.onValidityChange(valid);            me.fireEvent('validitychange', me, valid);            me.wasValid = valid;        }    },<span id='Ext-form-Basic-method-onValidityChange'>    /**</span>     * @private     * Handle changes in the form's validity. If there are any sub components with     * formBind=true then they are enabled/disabled based on the new validity.     * @param {Boolean} valid     */    onValidityChange: function(valid) {        var boundItems = this.getBoundItems(),            items, i, iLen, cmp;        if (boundItems) {            items = boundItems.items;            iLen  = items.length;            for (i = 0; i < iLen; i++) {                cmp = items[i];                if (cmp.disabled === valid) {                    cmp.setDisabled(!valid);                }            }        }    },<span id='Ext-form-Basic-method-isDirty'>    /**</span>     * Returns true if any fields in this form have changed from their original values.     *     * Note that if this BasicForm was configured with {@link #trackResetOnLoad} then the     * Fields' *original values* are updated when the values are loaded by {@link #setValues}     * or {@link #loadRecord}.     *     * @return Boolean     */    isDirty: function() {        return !!this.getFields().findBy(function(f) {            return f.isDirty();        });    },<span id='Ext-form-Basic-method-checkDirty'>    /**</span>     * Check whether the dirty state of the entire form has changed since it was last checked, and     * if so fire the {@link #dirtychange dirtychange} event. This is automatically invoked     * when an individual field's dirty state changes.     */    checkDirty: function() {        var dirty = this.isDirty();        if (dirty !== this.wasDirty) {            this.fireEvent('dirtychange', this, dirty);            this.wasDirty = dirty;        }    },<span id='Ext-form-Basic-method-hasUpload'>    /**</span>     * Returns true if the form contains a file upload field. This is used to determine the method for submitting the     * form: File uploads are not performed using normal 'Ajax' techniques, that is they are **not** performed using     * XMLHttpRequests. Instead a hidden `<form>` element containing all the fields is created temporarily and submitted     * with its [target][1] set to refer to a dynamically generated, hidden `<iframe>` which is inserted into the document     * but removed after the return data has been gathered.     *     * The server response is parsed by the browser to create the document for the IFRAME. If the server is using JSON     * to send the return object, then the [Content-Type][2] header must be set to "text/html" in order to tell the     * browser to insert the text unchanged into the document body.     *     * Characters which are significant to an HTML parser must be sent as HTML entities, so encode `"<"` as `"&lt;"`,     * `"&"` as `"&amp;"` etc.     *     * The response text is retrieved from the document, and a fake XMLHttpRequest object is created containing a     * responseText property in order to conform to the requirements of event handlers and callbacks.     *     * Be aware that file upload packets are sent with the content type [multipart/form][3] and some server technologies     * (notably JEE) may require some custom processing in order to retrieve parameter names and parameter values from     * the packet content.     *     * [1]: http://www.w3.org/TR/REC-html40/present/frames.html#adef-target     * [2]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.17     * [3]: http://www.faqs.org/rfcs/rfc2388.html     *     * @return Boolean     */    hasUpload: function() {        return !!this.getFields().findBy(function(f) {            return f.isFileUpload();        });    },<span id='Ext-form-Basic-method-doAction'>    /**</span>     * Performs a predefined action (an implementation of {@link Ext.form.action.Action}) to perform application-     * specific processing.     *     * @param {String/Ext.form.action.Action} action The name of the predefined action type, or instance of {@link     * Ext.form.action.Action} to perform.     *     * @param {Object} [options] The options to pass to the {@link Ext.form.action.Action} that will get created,     * if the action argument is a String.     *     * All of the config options listed below are supported by both the {@link Ext.form.action.Submit submit} and     * {@link Ext.form.action.Load load} actions unless otherwise noted (custom actions could also accept other     * config options):     *     * @param {String} options.url     * The url for the action (defaults to the form's {@link #url}.)     *     * @param {String} options.method     * The form method to use (defaults to the form's method, or POST if not defined)     *     * @param {String/Object} options.params     * The params to pass (defaults to the form's baseParams, or none if not defined)     *     * Parameters are encoded as standard HTTP parameters using {@link Ext#urlEncode Ext.Object.toQueryString}.     *     * @param {Object} options.headers     * Request headers to set for the action.     *     * @param {Function} options.success     * The callback that will be invoked after a successful response (see top of {@link Ext.form.action.Submit submit}     * and {@link Ext.form.action.Load load} for a description of what constitutes a successful response).     * @param {Ext.form.Basic} options.success.form The form that requested the action.     * @param {Ext.form.action.Action} options.success.action The Action object which performed the operation.     * The action object contains these properties of interest:     *     *  - {@link Ext.form.action.Action#response response}     *  - {@link Ext.form.action.Action#result result} - interrogate for custom postprocessing     *  - {@link Ext.form.action.Action#type type}     *     * @param {Function} options.failure     * The callback that will be invoked after a failed transaction attempt.     * @param {Ext.form.Basic} options.failure.form The form that requested the action.     * @param {Ext.form.action.Action} options.failure.action The Action object which performed the operation.     * The action object contains these properties of interest:     *     * - {@link Ext.form.action.Action#failureType failureType}     * - {@link Ext.form.action.Action#response response}     * - {@link Ext.form.action.Action#result result} - interrogate for custom postprocessing     * - {@link Ext.form.action.Action#type type}     *     * @param {Object} options.scope     * The scope in which to call the callback functions (The this reference for the callback functions).     *     * @param {Boolean} options.clientValidation     * Submit Action only. Determines whether a Form's fields are validated in a final call to {@link     * Ext.form.Basic#isValid isValid} prior to submission. Set to false to prevent this. If undefined, pre-submission     * field validation is performed.     *     * @return {Ext.form.Basic} this     */    doAction: function(action, options) {        if (Ext.isString(action)) {            action = Ext.ClassManager.instantiateByAlias('formaction.' + action, Ext.apply({}, options, {form: this}));        }        if (this.fireEvent('beforeaction', this, action) !== false) {            this.beforeAction(action);            Ext.defer(action.run, 100, action);        }        return this;    },<span id='Ext-form-Basic-method-submit'>    /**</span>     * Shortcut to {@link #doAction do} a {@link Ext.form.action.Submit submit action}. This will use the     * {@link Ext.form.action.Submit AJAX submit action} by default. If the {@link #standardSubmit} config     * is enabled it will use a standard form element to submit, or if the {@link #api} config is present     * it will use the {@link Ext.form.action.DirectLoad Ext.direct.Direct submit action}.     *     * The following code:     *     *     myFormPanel.getForm().submit({     *         clientValidation: true,     *         url: 'updateConsignment.php',     *         params: {     *             newStatus: 'delivered'     *         },     *         success: function(form, action) {     *            Ext.Msg.alert('Success', action.result.msg);     *         },     *         failure: function(form, action) {     *             switch (action.failureType) {     *                 case Ext.form.action.Action.CLIENT_INVALID:     *                     Ext.Msg.alert('Failure', 'Form fields may not be submitted with invalid values');     *                     break;     *                 case Ext.form.action.Action.CONNECT_FAILURE:     *                     Ext.Msg.alert('Failure', 'Ajax communication failed');     *                     break;     *                 case Ext.form.action.Action.SERVER_INVALID:     *                    Ext.Msg.alert('Failure', action.result.msg);     *            }     *         }     *     });     *     * would process the following server response for a successful submission:     *     *     {     *         "success":true, // note this is Boolean, not string     *         "msg":"Consignment updated"     *     }     *     * and the following server response for a failed submission:     *     *     {     *         "success":false, // note this is Boolean, not string     *         "msg":"You do not have permission to perform this operation"     *     }     *     * @param {Object} options The options to pass to the action (see {@link #doAction} for details).     * @return {Ext.form.Basic} this     */    submit: function(options) {        options = options || {};        var me = this,            action;                    if (options.standardSubmit || me.standardSubmit) {            action = 'standardsubmit';        } else {            action = me.api ? 'directsubmit' : 'submit';        }                    return me.doAction(action, options);    },<span id='Ext-form-Basic-method-load'>    /**</span>     * Shortcut to {@link #doAction do} a {@link Ext.form.action.Load load action}.     * @param {Object} options The options to pass to the action (see {@link #doAction} for details)     * @return {Ext.form.Basic} this     */    load: function(options) {        return this.doAction(this.api ? 'directload' : 'load', options);    },<span id='Ext-form-Basic-method-updateRecord'>    /**</span>     * Persists the values in this form into the passed {@link Ext.data.Model} object in a beginEdit/endEdit block.     * If the record is not specified, it will attempt to update (if it exists) the record provided to loadRecord.     * @param {Ext.data.Model} [record] The record to edit     * @return {Ext.form.Basic} this     */    updateRecord: function(record) {        record = record || this._record;        //<debug>        if (!record) {            Ext.Error.raise("A record is required.");        }        //</debug>        var fields = record.fields.items,            values = this.getFieldValues(),            obj = {},            i = 0,            len = fields.length,            name;        for (; i < len; ++i) {            name  = fields[i].name;            if (values.hasOwnProperty(name)) {                obj[name] = values[name];            }        }        record.beginEdit();        record.set(obj);        record.endEdit();        return this;    },<span id='Ext-form-Basic-method-loadRecord'>    /**</span>     * Loads an {@link Ext.data.Model} into this form by calling {@link #setValues} with the     * {@link Ext.data.Model#raw record data}.     * See also {@link #trackResetOnLoad}.     * @param {Ext.data.Model} record The record to load     * @return {Ext.form.Basic} this     */    loadRecord: function(record) {        this._record = record;        return this.setValues(record.data);    },<span id='Ext-form-Basic-method-getRecord'>    /**</span>     * Returns the last Ext.data.Model instance that was loaded via {@link #loadRecord}     * @return {Ext.data.Model} The record     */    getRecord: function() {        return this._record;    },<span id='Ext-form-Basic-method-beforeAction'>    /**</span>     * @private     * Called before an action is performed via {@link #doAction}.     * @param {Ext.form.action.Action} action The Action instance that was invoked     */    beforeAction: function(action) {        var waitMsg = action.waitMsg,            maskCls = Ext.baseCSSPrefix + 'mask-loading',            fields  = this.getFields().items,            f,            fLen    = fields.length,            field, waitMsgTarget;        // Call HtmlEditor's syncValue before actions        for (f = 0; f < fLen; f++) {            field = fields[f];            if (field.isFormField && field.syncValue) {                field.syncValue();            }        }        if (waitMsg) {            waitMsgTarget = this.waitMsgTarget;            if (waitMsgTarget === true) {                this.owner.el.mask(waitMsg, maskCls);            } else if (waitMsgTarget) {                waitMsgTarget = this.waitMsgTarget = Ext.get(waitMsgTarget);                waitMsgTarget.mask(waitMsg, maskCls);            } else {                Ext.MessageBox.wait(waitMsg, action.waitTitle || this.waitTitle);            }        }    },<span id='Ext-form-Basic-method-afterAction'>    /**</span>     * @private     * Called after an action is performed via {@link #doAction}.     * @param {Ext.form.action.Action} action The Action instance that was invoked     * @param {Boolean} success True if the action completed successfully, false, otherwise.     */    afterAction: function(action, success) {        if (action.waitMsg) {            var messageBox = Ext.MessageBox,                waitMsgTarget = this.waitMsgTarget;            if (waitMsgTarget === true) {                this.owner.el.unmask();            } else if (waitMsgTarget) {                waitMsgTarget.unmask();            } else {                // Do not fire the hide event because that triggers complex processing                // which is not necessary just for the wait window, and which may interfere with the app.                messageBox.suspendEvents();                messageBox.hide();                messageBox.resumeEvents();            }        }        if (success) {            if (action.reset) {                this.reset();            }            Ext.callback(action.success, action.scope || action, [this, action]);            this.fireEvent('actioncomplete', this, action);        } else {            Ext.callback(action.failure, action.scope || action, [this, action]);            this.fireEvent('actionfailed', this, action);        }    },<span id='Ext-form-Basic-method-findField'>    /**</span>     * Find a specific {@link Ext.form.field.Field} in this form by id or name.     * @param {String} id The value to search for (specify either a {@link Ext.Component#id id} or     * {@link Ext.form.field.Field#getName name or hiddenName}).     * @return {Ext.form.field.Field} The first matching field, or `null` if none was found.     */    findField: function(id) {        return this.getFields().findBy(function(f) {            return f.id === id || f.getName() === id;        });    },<span id='Ext-form-Basic-method-markInvalid'>    /**</span>     * Mark fields in this form invalid in bulk.     * @param {Object/Object[]/Ext.data.Errors} errors     * Either an array in the form `[{id:'fieldId', msg:'The message'}, ...]`,     * an object hash of `{id: msg, id2: msg2}`, or a {@link Ext.data.Errors} object.     * @return {Ext.form.Basic} this     */    markInvalid: function(errors) {        var me = this,            e, eLen, error, value,            key;        function mark(fieldId, msg) {            var field = me.findField(fieldId);            if (field) {                field.markInvalid(msg);            }        }        if (Ext.isArray(errors)) {            eLen = errors.length;            for (e = 0; e < eLen; e++) {                error = errors[e];                mark(error.id, error.msg);            }        } else if (errors instanceof Ext.data.Errors) {            eLen  = errors.items.length;            for (e = 0; e < eLen; e++) {                error = errors.items[e];                mark(error.field, error.message);            }        } else {            for (key in errors) {                if (errors.hasOwnProperty(key)) {                    value = errors[key];                    mark(key, value, errors);                }            }        }        return this;    },<span id='Ext-form-Basic-method-setValues'>    /**</span>     * Set values for fields in this form in bulk.     *     * @param {Object/Object[]} values Either an array in the form:     *     *     [{id:'clientName', value:'Fred. Olsen Lines'},     *      {id:'portOfLoading', value:'FXT'},     *      {id:'portOfDischarge', value:'OSL'} ]     *     * or an object hash of the form:     *     *     {     *         clientName: 'Fred. Olsen Lines',     *         portOfLoading: 'FXT',     *         portOfDischarge: 'OSL'     *     }     *     * @return {Ext.form.Basic} this     */    setValues: function(values) {        var me = this,            v, vLen, val, field;        function setVal(fieldId, val) {            var field = me.findField(fieldId);            if (field) {                field.setValue(val);                if (me.trackResetOnLoad) {                    field.resetOriginalValue();                }            }        }        if (Ext.isArray(values)) {            // array of objects            vLen = values.length;            for (v = 0; v < vLen; v++) {                val = values[v];                setVal(val.id, val.value);            }        } else {            // object hash            Ext.iterate(values, setVal);        }        return this;    },<span id='Ext-form-Basic-method-getValues'>    /**</span>     * Retrieves the fields in the form as a set of key/value pairs, using their     * {@link Ext.form.field.Field#getSubmitData getSubmitData()} method to collect the values.     * If multiple fields return values under the same name those values will be combined into an Array.     * This is similar to {@link Ext.form.Basic#getFieldValues getFieldValues} except that this method     * collects only String values for submission, while getFieldValues collects type-specific data     * values (e.g. Date objects for date fields.)     *     * @param {Boolean} [asString=false] If true, will return the key/value collection as a single     * URL-encoded param string.     * @param {Boolean} [dirtyOnly=false] If true, only fields that are dirty will be included in the result.     * @param {Boolean} [includeEmptyText=false] If true, the configured emptyText of empty fields will be used.     * @param {Boolean} [useDataValues=false] If true, the {@link Ext.form.field.Field#getModelData getModelData}     * method is used to retrieve values from fields, otherwise the {@link Ext.form.field.Field#getSubmitData getSubmitData}     * method is used.     * @return {String/Object}     */    getValues: function(asString, dirtyOnly, includeEmptyText, useDataValues) {        var values  = {},            fields  = this.getFields().items,            f,            fLen    = fields.length,            isArray = Ext.isArray,            field, data, val, bucket, name;        for (f = 0; f < fLen; f++) {            field = fields[f];            if (!dirtyOnly || field.isDirty()) {                data = field[useDataValues ? 'getModelData' : 'getSubmitData'](includeEmptyText);                if (Ext.isObject(data)) {                    for (name in data) {                        if (data.hasOwnProperty(name)) {                            val = data[name];                            if (includeEmptyText && val === '') {                                val = field.emptyText || '';                            }                            if (values.hasOwnProperty(name)) {                                bucket = values[name];                                if (!isArray(bucket)) {                                    bucket = values[name] = [bucket];                                }                                if (isArray(val)) {                                    values[name] = values[name] = bucket.concat(val);                                } else {                                    bucket.push(val);                                }                            } else {                                values[name] = val;                            }                        }                    }                }            }        }        if (asString) {            values = Ext.Object.toQueryString(values);        }        return values;    },<span id='Ext-form-Basic-method-getFieldValues'>    /**</span>     * Retrieves the fields in the form as a set of key/value pairs, using their     * {@link Ext.form.field.Field#getModelData getModelData()} method to collect the values.     * If multiple fields return values under the same name those values will be combined into an Array.     * This is similar to {@link #getValues} except that this method collects type-specific data values     * (e.g. Date objects for date fields) while getValues returns only String values for submission.     *     * @param {Boolean} [dirtyOnly=false] If true, only fields that are dirty will be included in the result.     * @return {Object}     */    getFieldValues: function(dirtyOnly) {        return this.getValues(false, dirtyOnly, false, true);    },<span id='Ext-form-Basic-method-clearInvalid'>    /**</span>     * Clears all invalid field messages in this form.     * @return {Ext.form.Basic} this     */    clearInvalid: function() {        Ext.suspendLayouts();        var me     = this,            fields = me.getFields().items,            f,            fLen   = fields.length;        for (f = 0; f < fLen; f++) {            fields[f].clearInvalid();        }        Ext.resumeLayouts(true);        return me;    },<span id='Ext-form-Basic-method-reset'>    /**</span>     * Resets all fields in this form.     * @return {Ext.form.Basic} this     */    reset: function() {        Ext.suspendLayouts();        var me     = this,            fields = me.getFields().items,            f,            fLen   = fields.length;        for (f = 0; f < fLen; f++) {            fields[f].reset();        }        Ext.resumeLayouts(true);        return me;    },<span id='Ext-form-Basic-method-applyToFields'>    /**</span>     * Calls {@link Ext#apply Ext.apply} for all fields in this form with the passed object.     * @param {Object} obj The object to be applied     * @return {Ext.form.Basic} this     */    applyToFields: function(obj) {        var fields = this.getFields().items,            f,            fLen   = fields.length;        for (f = 0; f < fLen; f++) {            Ext.apply(fields[f], obj);        }        return this;    },<span id='Ext-form-Basic-method-applyIfToFields'>    /**</span>     * Calls {@link Ext#applyIf Ext.applyIf} for all field in this form with the passed object.     * @param {Object} obj The object to be applied     * @return {Ext.form.Basic} this     */    applyIfToFields: function(obj) {        var fields = this.getFields().items,            f,            fLen   = fields.length;        for (f = 0; f < fLen; f++) {            Ext.applyIf(fields[f], obj);        }        return this;    }});</pre></body></html>
 |