pkg-forms-debug.js
上传用户:shuoshiled
上传日期:2018-01-28
资源大小:10124k
文件大小:264k
源码类别:

中间件编程

开发平台:

JavaScript

  1.                 var r = s.getRangeAt(0);
  2.                 r.selectNodeContents(this.getEditorBody());
  3.                 r.collapse(true);
  4.                 this.deferFocus();
  5.             }
  6.             try{
  7.                 this.execCmd('useCSS', true);
  8.                 this.execCmd('styleWithCSS', false);
  9.             }catch(e){}
  10.         }
  11.         this.fireEvent('activate', this);
  12.     },
  13.     // private
  14.     adjustFont: function(btn){
  15.         var adjust = btn.itemId == 'increasefontsize' ? 1 : -1;
  16.         var v = parseInt(this.doc.queryCommandValue('FontSize') || 2, 10);
  17.         if((Ext.isSafari && !Ext.isSafari2) || Ext.isChrome || Ext.isAir){
  18.             // Safari 3 values
  19.             // 1 = 10px, 2 = 13px, 3 = 16px, 4 = 18px, 5 = 24px, 6 = 32px
  20.             if(v <= 10){
  21.                 v = 1 + adjust;
  22.             }else if(v <= 13){
  23.                 v = 2 + adjust;
  24.             }else if(v <= 16){
  25.                 v = 3 + adjust;
  26.             }else if(v <= 18){
  27.                 v = 4 + adjust;
  28.             }else if(v <= 24){
  29.                 v = 5 + adjust;
  30.             }else {
  31.                 v = 6 + adjust;
  32.             }
  33.             v = v.constrain(1, 6);
  34.         }else{
  35.             if(Ext.isSafari){ // safari
  36.                 adjust *= 2;
  37.             }
  38.             v = Math.max(1, v+adjust) + (Ext.isSafari ? 'px' : 0);
  39.         }
  40.         this.execCmd('FontSize', v);
  41.     },
  42.     // private
  43.     onEditorEvent : function(e){
  44.         this.updateToolbar();
  45.     },
  46.     /**
  47.      * Protected method that will not generally be called directly. It triggers
  48.      * a toolbar update by reading the markup state of the current selection in the editor.
  49.      */
  50.     updateToolbar: function(){
  51.         if(!this.activated){
  52.             this.onFirstFocus();
  53.             return;
  54.         }
  55.         var btns = this.tb.items.map, doc = this.doc;
  56.         if(this.enableFont && !Ext.isSafari2){
  57.             var name = (this.doc.queryCommandValue('FontName')||this.defaultFont).toLowerCase();
  58.             if(name != this.fontSelect.dom.value){
  59.                 this.fontSelect.dom.value = name;
  60.             }
  61.         }
  62.         if(this.enableFormat){
  63.             btns.bold.toggle(doc.queryCommandState('bold'));
  64.             btns.italic.toggle(doc.queryCommandState('italic'));
  65.             btns.underline.toggle(doc.queryCommandState('underline'));
  66.         }
  67.         if(this.enableAlignments){
  68.             btns.justifyleft.toggle(doc.queryCommandState('justifyleft'));
  69.             btns.justifycenter.toggle(doc.queryCommandState('justifycenter'));
  70.             btns.justifyright.toggle(doc.queryCommandState('justifyright'));
  71.         }
  72.         if(!Ext.isSafari2 && this.enableLists){
  73.             btns.insertorderedlist.toggle(doc.queryCommandState('insertorderedlist'));
  74.             btns.insertunorderedlist.toggle(doc.queryCommandState('insertunorderedlist'));
  75.         }
  76.         
  77.         Ext.menu.MenuMgr.hideAll();
  78.         this.syncValue();
  79.     },
  80.     // private
  81.     relayBtnCmd : function(btn){
  82.         this.relayCmd(btn.itemId);
  83.     },
  84.     /**
  85.      * Executes a Midas editor command on the editor document and performs necessary focus and
  86.      * toolbar updates. <b>This should only be called after the editor is initialized.</b>
  87.      * @param {String} cmd The Midas command
  88.      * @param {String/Boolean} value (optional) The value to pass to the command (defaults to null)
  89.      */
  90.     relayCmd : function(cmd, value){
  91.         (function(){
  92.             this.focus();
  93.             this.execCmd(cmd, value);
  94.             this.updateToolbar();
  95.         }).defer(10, this);
  96.     },
  97.     /**
  98.      * Executes a Midas editor command directly on the editor document.
  99.      * For visual commands, you should use {@link #relayCmd} instead.
  100.      * <b>This should only be called after the editor is initialized.</b>
  101.      * @param {String} cmd The Midas command
  102.      * @param {String/Boolean} value (optional) The value to pass to the command (defaults to null)
  103.      */
  104.     execCmd : function(cmd, value){
  105.         this.doc.execCommand(cmd, false, value === undefined ? null : value);
  106.         this.syncValue();
  107.     },
  108.     // private
  109.     applyCommand : function(e){
  110.         if(e.ctrlKey){
  111.             var c = e.getCharCode(), cmd;
  112.             if(c > 0){
  113.                 c = String.fromCharCode(c);
  114.                 switch(c){
  115.                     case 'b':
  116.                         cmd = 'bold';
  117.                     break;
  118.                     case 'i':
  119.                         cmd = 'italic';
  120.                     break;
  121.                     case 'u':
  122.                         cmd = 'underline';
  123.                     break;
  124.                 }
  125.                 if(cmd){
  126.                     this.win.focus();
  127.                     this.execCmd(cmd);
  128.                     this.deferFocus();
  129.                     e.preventDefault();
  130.                 }
  131.             }
  132.         }
  133.     },
  134.     /**
  135.      * Inserts the passed text at the current cursor position. Note: the editor must be initialized and activated
  136.      * to insert text.
  137.      * @param {String} text
  138.      */
  139.     insertAtCursor : function(text){
  140.         if(!this.activated){
  141.             return;
  142.         }
  143.         if(Ext.isIE){
  144.             this.win.focus();
  145.             var r = this.doc.selection.createRange();
  146.             if(r){
  147.                 r.collapse(true);
  148.                 r.pasteHTML(text);
  149.                 this.syncValue();
  150.                 this.deferFocus();
  151.             }
  152.         }else if(Ext.isGecko || Ext.isOpera){
  153.             this.win.focus();
  154.             this.execCmd('InsertHTML', text);
  155.             this.deferFocus();
  156.         }else if(Ext.isWebKit){
  157.             this.execCmd('InsertText', text);
  158.             this.deferFocus();
  159.         }
  160.     },
  161.     // private
  162.     fixKeys : function(){ // load time branching for fastest keydown performance
  163.         if(Ext.isIE){
  164.             return function(e){
  165.                 var k = e.getKey(), r;
  166.                 if(k == e.TAB){
  167.                     e.stopEvent();
  168.                     r = this.doc.selection.createRange();
  169.                     if(r){
  170.                         r.collapse(true);
  171.                         r.pasteHTML('&nbsp;&nbsp;&nbsp;&nbsp;');
  172.                         this.deferFocus();
  173.                     }
  174.                 }else if(k == e.ENTER){
  175.                     r = this.doc.selection.createRange();
  176.                     if(r){
  177.                         var target = r.parentElement();
  178.                         if(!target || target.tagName.toLowerCase() != 'li'){
  179.                             e.stopEvent();
  180.                             r.pasteHTML('<br />');
  181.                             r.collapse(false);
  182.                             r.select();
  183.                         }
  184.                     }
  185.                 }
  186.             };
  187.         }else if(Ext.isOpera){
  188.             return function(e){
  189.                 var k = e.getKey();
  190.                 if(k == e.TAB){
  191.                     e.stopEvent();
  192.                     this.win.focus();
  193.                     this.execCmd('InsertHTML','&nbsp;&nbsp;&nbsp;&nbsp;');
  194.                     this.deferFocus();
  195.                 }
  196.             };
  197.         }else if(Ext.isWebKit){
  198.             return function(e){
  199.                 var k = e.getKey();
  200.                 if(k == e.TAB){
  201.                     e.stopEvent();
  202.                     this.execCmd('InsertText','t');
  203.                     this.deferFocus();
  204.                 }
  205.              };
  206.         }
  207.     }(),
  208.     /**
  209.      * Returns the editor's toolbar. <b>This is only available after the editor has been rendered.</b>
  210.      * @return {Ext.Toolbar}
  211.      */
  212.     getToolbar : function(){
  213.         return this.tb;
  214.     },
  215.     /**
  216.      * Object collection of toolbar tooltips for the buttons in the editor. The key
  217.      * is the command id associated with that button and the value is a valid QuickTips object.
  218.      * For example:
  219. <pre><code>
  220. {
  221.     bold : {
  222.         title: 'Bold (Ctrl+B)',
  223.         text: 'Make the selected text bold.',
  224.         cls: 'x-html-editor-tip'
  225.     },
  226.     italic : {
  227.         title: 'Italic (Ctrl+I)',
  228.         text: 'Make the selected text italic.',
  229.         cls: 'x-html-editor-tip'
  230.     },
  231.     ...
  232. </code></pre>
  233.     * @type Object
  234.      */
  235.     buttonTips : {
  236.         bold : {
  237.             title: 'Bold (Ctrl+B)',
  238.             text: 'Make the selected text bold.',
  239.             cls: 'x-html-editor-tip'
  240.         },
  241.         italic : {
  242.             title: 'Italic (Ctrl+I)',
  243.             text: 'Make the selected text italic.',
  244.             cls: 'x-html-editor-tip'
  245.         },
  246.         underline : {
  247.             title: 'Underline (Ctrl+U)',
  248.             text: 'Underline the selected text.',
  249.             cls: 'x-html-editor-tip'
  250.         },
  251.         increasefontsize : {
  252.             title: 'Grow Text',
  253.             text: 'Increase the font size.',
  254.             cls: 'x-html-editor-tip'
  255.         },
  256.         decreasefontsize : {
  257.             title: 'Shrink Text',
  258.             text: 'Decrease the font size.',
  259.             cls: 'x-html-editor-tip'
  260.         },
  261.         backcolor : {
  262.             title: 'Text Highlight Color',
  263.             text: 'Change the background color of the selected text.',
  264.             cls: 'x-html-editor-tip'
  265.         },
  266.         forecolor : {
  267.             title: 'Font Color',
  268.             text: 'Change the color of the selected text.',
  269.             cls: 'x-html-editor-tip'
  270.         },
  271.         justifyleft : {
  272.             title: 'Align Text Left',
  273.             text: 'Align text to the left.',
  274.             cls: 'x-html-editor-tip'
  275.         },
  276.         justifycenter : {
  277.             title: 'Center Text',
  278.             text: 'Center text in the editor.',
  279.             cls: 'x-html-editor-tip'
  280.         },
  281.         justifyright : {
  282.             title: 'Align Text Right',
  283.             text: 'Align text to the right.',
  284.             cls: 'x-html-editor-tip'
  285.         },
  286.         insertunorderedlist : {
  287.             title: 'Bullet List',
  288.             text: 'Start a bulleted list.',
  289.             cls: 'x-html-editor-tip'
  290.         },
  291.         insertorderedlist : {
  292.             title: 'Numbered List',
  293.             text: 'Start a numbered list.',
  294.             cls: 'x-html-editor-tip'
  295.         },
  296.         createlink : {
  297.             title: 'Hyperlink',
  298.             text: 'Make the selected text a hyperlink.',
  299.             cls: 'x-html-editor-tip'
  300.         },
  301.         sourceedit : {
  302.             title: 'Source Edit',
  303.             text: 'Switch to source editing mode.',
  304.             cls: 'x-html-editor-tip'
  305.         }
  306.     }
  307.     // hide stuff that is not compatible
  308.     /**
  309.      * @event blur
  310.      * @hide
  311.      */
  312.     /**
  313.      * @event change
  314.      * @hide
  315.      */
  316.     /**
  317.      * @event focus
  318.      * @hide
  319.      */
  320.     /**
  321.      * @event specialkey
  322.      * @hide
  323.      */
  324.     /**
  325.      * @cfg {String} fieldClass @hide
  326.      */
  327.     /**
  328.      * @cfg {String} focusClass @hide
  329.      */
  330.     /**
  331.      * @cfg {String} autoCreate @hide
  332.      */
  333.     /**
  334.      * @cfg {String} inputType @hide
  335.      */
  336.     /**
  337.      * @cfg {String} invalidClass @hide
  338.      */
  339.     /**
  340.      * @cfg {String} invalidText @hide
  341.      */
  342.     /**
  343.      * @cfg {String} msgFx @hide
  344.      */
  345.     /**
  346.      * @cfg {String} validateOnBlur @hide
  347.      */
  348.     /**
  349.      * @cfg {Boolean} allowDomMove  @hide
  350.      */
  351.     /**
  352.      * @cfg {String} applyTo @hide
  353.      */
  354.     /**
  355.      * @cfg {String} autoHeight  @hide
  356.      */
  357.     /**
  358.      * @cfg {String} autoWidth  @hide
  359.      */
  360.     /**
  361.      * @cfg {String} cls  @hide
  362.      */
  363.     /**
  364.      * @cfg {String} disabled  @hide
  365.      */
  366.     /**
  367.      * @cfg {String} disabledClass  @hide
  368.      */
  369.     /**
  370.      * @cfg {String} msgTarget  @hide
  371.      */
  372.     /**
  373.      * @cfg {String} readOnly  @hide
  374.      */
  375.     /**
  376.      * @cfg {String} style  @hide
  377.      */
  378.     /**
  379.      * @cfg {String} validationDelay  @hide
  380.      */
  381.     /**
  382.      * @cfg {String} validationEvent  @hide
  383.      */
  384.     /**
  385.      * @cfg {String} tabIndex  @hide
  386.      */
  387.     /**
  388.      * @property disabled
  389.      * @hide
  390.      */
  391.     /**
  392.      * @method applyToMarkup
  393.      * @hide
  394.      */
  395.     /**
  396.      * @method disable
  397.      * @hide
  398.      */
  399.     /**
  400.      * @method enable
  401.      * @hide
  402.      */
  403.     /**
  404.      * @method validate
  405.      * @hide
  406.      */
  407.     /**
  408.      * @event valid
  409.      * @hide
  410.      */
  411.     /**
  412.      * @method setDisabled
  413.      * @hide
  414.      */
  415.     /**
  416.      * @cfg keys
  417.      * @hide
  418.      */
  419. });
  420. Ext.reg('htmleditor', Ext.form.HtmlEditor);/**
  421.  * @class Ext.form.TimeField
  422.  * @extends Ext.form.ComboBox
  423.  * Provides a time input field with a time dropdown and automatic time validation.  Example usage:
  424.  * <pre><code>
  425. new Ext.form.TimeField({
  426.     minValue: '9:00 AM',
  427.     maxValue: '6:00 PM',
  428.     increment: 30
  429. });
  430. </code></pre>
  431.  * @constructor
  432.  * Create a new TimeField
  433.  * @param {Object} config
  434.  * @xtype timefield
  435.  */
  436. Ext.form.TimeField = Ext.extend(Ext.form.ComboBox, {
  437.     /**
  438.      * @cfg {Date/String} minValue
  439.      * The minimum allowed time. Can be either a Javascript date object with a valid time value or a string 
  440.      * time in a valid format -- see {@link #format} and {@link #altFormats} (defaults to null).
  441.      */
  442.     minValue : null,
  443.     /**
  444.      * @cfg {Date/String} maxValue
  445.      * The maximum allowed time. Can be either a Javascript date object with a valid time value or a string 
  446.      * time in a valid format -- see {@link #format} and {@link #altFormats} (defaults to null).
  447.      */
  448.     maxValue : null,
  449.     /**
  450.      * @cfg {String} minText
  451.      * The error text to display when the date in the cell is before minValue (defaults to
  452.      * 'The time in this field must be equal to or after {0}').
  453.      */
  454.     minText : "The time in this field must be equal to or after {0}",
  455.     /**
  456.      * @cfg {String} maxText
  457.      * The error text to display when the time is after maxValue (defaults to
  458.      * 'The time in this field must be equal to or before {0}').
  459.      */
  460.     maxText : "The time in this field must be equal to or before {0}",
  461.     /**
  462.      * @cfg {String} invalidText
  463.      * The error text to display when the time in the field is invalid (defaults to
  464.      * '{value} is not a valid time').
  465.      */
  466.     invalidText : "{0} is not a valid time",
  467.     /**
  468.      * @cfg {String} format
  469.      * The default time format string which can be overriden for localization support.  The format must be
  470.      * valid according to {@link Date#parseDate} (defaults to 'g:i A', e.g., '3:15 PM').  For 24-hour time
  471.      * format try 'H:i' instead.
  472.      */
  473.     format : "g:i A",
  474.     /**
  475.      * @cfg {String} altFormats
  476.      * Multiple date formats separated by "|" to try when parsing a user input value and it doesn't match the defined
  477.      * format (defaults to 'g:ia|g:iA|g:i a|g:i A|h:i|g:i|H:i|ga|ha|gA|h a|g a|g A|gi|hi|gia|hia|g|H').
  478.      */
  479.     altFormats : "g:ia|g:iA|g:i a|g:i A|h:i|g:i|H:i|ga|ha|gA|h a|g a|g A|gi|hi|gia|hia|g|H",
  480.     /**
  481.      * @cfg {Number} increment
  482.      * The number of minutes between each time value in the list (defaults to 15).
  483.      */
  484.     increment: 15,
  485.     // private override
  486.     mode: 'local',
  487.     // private override
  488.     triggerAction: 'all',
  489.     // private override
  490.     typeAhead: false,
  491.     
  492.     // private - This is the date to use when generating time values in the absence of either minValue
  493.     // or maxValue.  Using the current date causes DST issues on DST boundary dates, so this is an 
  494.     // arbitrary "safe" date that can be any date aside from DST boundary dates.
  495.     initDate: '1/1/2008',
  496.     // private
  497.     initComponent : function(){
  498.         if(typeof this.minValue == "string"){
  499.             this.minValue = this.parseDate(this.minValue);
  500.         }
  501.         if(typeof this.maxValue == "string"){
  502.             this.maxValue = this.parseDate(this.maxValue);
  503.         }
  504.         if(!this.store){
  505.             var min = this.parseDate(this.minValue) || new Date(this.initDate).clearTime();
  506.             var max = this.parseDate(this.maxValue) || new Date(this.initDate).clearTime().add('mi', (24 * 60) - 1);
  507.             var times = [];
  508.             while(min <= max){
  509.                 times.push(min.dateFormat(this.format));
  510.                 min = min.add('mi', this.increment);
  511.             }
  512.             this.store = times;
  513.         }
  514.         Ext.form.TimeField.superclass.initComponent.call(this);
  515.     },
  516.     // inherited docs
  517.     getValue : function(){
  518.         var v = Ext.form.TimeField.superclass.getValue.call(this);
  519.         return this.formatDate(this.parseDate(v)) || '';
  520.     },
  521.     // inherited docs
  522.     setValue : function(value){
  523.         return Ext.form.TimeField.superclass.setValue.call(this, this.formatDate(this.parseDate(value)));
  524.     },
  525.     // private overrides
  526.     validateValue : Ext.form.DateField.prototype.validateValue,
  527.     parseDate : Ext.form.DateField.prototype.parseDate,
  528.     formatDate : Ext.form.DateField.prototype.formatDate,
  529.     // private
  530.     beforeBlur : function(){
  531.         var v = this.parseDate(this.getRawValue());
  532.         if(v){
  533.             this.setValue(v.dateFormat(this.format));
  534.         }
  535.         Ext.form.TimeField.superclass.beforeBlur.call(this);
  536.     }
  537.     /**
  538.      * @cfg {Boolean} grow @hide
  539.      */
  540.     /**
  541.      * @cfg {Number} growMin @hide
  542.      */
  543.     /**
  544.      * @cfg {Number} growMax @hide
  545.      */
  546.     /**
  547.      * @hide
  548.      * @method autoSize
  549.      */
  550. });
  551. Ext.reg('timefield', Ext.form.TimeField);/**  * @class Ext.form.Label  * @extends Ext.BoxComponent  * Basic Label field.  * @constructor  * Creates a new Label  * @param {Ext.Element/String/Object} config The configuration options.  If an element is passed, it is set as the internal  * element and its id used as the component id.  If a string is passed, it is assumed to be the id of an existing element  * and is used as the component id.  Otherwise, it is assumed to be a standard config object and is applied to the component.  * @xtype label  */ Ext.form.Label = Ext.extend(Ext.BoxComponent, {     /**      * @cfg {String} text The plain text to display within the label (defaults to ''). If you need to include HTML      * tags within the label's innerHTML, use the {@link #html} config instead.      */     /**      * @cfg {String} forId The id of the input element to which this label will be bound via the standard HTML 'for'      * attribute. If not specified, the attribute will not be added to the label.      */     /**      * @cfg {String} html An HTML fragment that will be used as the label's innerHTML (defaults to '').      * Note that if {@link #text} is specified it will take precedence and this value will be ignored.      */     // private     onRender : function(ct, position){         if(!this.el){             this.el = document.createElement('label');             this.el.id = this.getId();             this.el.innerHTML = this.text ? Ext.util.Format.htmlEncode(this.text) : (this.html || '');             if(this.forId){                 this.el.setAttribute('for', this.forId);             }         }         Ext.form.Label.superclass.onRender.call(this, ct, position);     },     /**      * Updates the label's innerHTML with the specified string.      * @param {String} text The new label text      * @param {Boolean} encode (optional) False to skip HTML-encoding the text when rendering it      * to the label (defaults to true which encodes the value). This might be useful if you want to include      * tags in the label's innerHTML rather than rendering them as string literals per the default logic.      * @return {Label} this      */     setText : function(t, encode){         var e = encode === false;         this[!e ? 'text' : 'html'] = t;         delete this[e ? 'text' : 'html'];         if(this.rendered){             this.el.dom.innerHTML = encode !== false ? Ext.util.Format.htmlEncode(t) : t;         }         return this;     } }); Ext.reg('label', Ext.form.Label);/**  * @class Ext.form.Action  * <p>The subclasses of this class provide actions to perform upon {@link Ext.form.BasicForm Form}s.</p>  * <p>Instances of this class are only created by a {@link Ext.form.BasicForm Form} when  * the Form needs to perform an action such as submit or load. The Configuration options  * listed for this class are set through the Form's action methods: {@link Ext.form.BasicForm#submit submit},  * {@link Ext.form.BasicForm#load load} and {@link Ext.form.BasicForm#doAction doAction}</p>  * <p>The instance of Action which performed the action is passed to the success  * and failure callbacks of the Form's action methods ({@link Ext.form.BasicForm#submit submit},  * {@link Ext.form.BasicForm#load load} and {@link Ext.form.BasicForm#doAction doAction}),  * and to the {@link Ext.form.BasicForm#actioncomplete actioncomplete} and  * {@link Ext.form.BasicForm#actionfailed actionfailed} event handlers.</p>  */ Ext.form.Action = function(form, options){     this.form = form;     this.options = options || {}; }; /**  * Failure type returned when client side validation of the Form fails  * thus aborting a submit action. Client side validation is performed unless  * {@link #clientValidation} is explicitly set to <tt>false</tt>.  * @type {String}  * @static  */ Ext.form.Action.CLIENT_INVALID = 'client'; /**  * <p>Failure type returned when server side processing fails and the {@link #result}'s  * <tt style="font-weight:bold">success</tt> property is set to <tt>false</tt>.</p>  * <p>In the case of a form submission, field-specific error messages may be returned in the  * {@link #result}'s <tt style="font-weight:bold">errors</tt> property.</p>  * @type {String}  * @static  */ Ext.form.Action.SERVER_INVALID = 'server'; /**  * Failure type returned when a communication error happens when attempting  * to send a request to the remote server. The {@link #response} may be examined to  * provide further information.  * @type {String}  * @static  */ Ext.form.Action.CONNECT_FAILURE = 'connect'; /**  * Failure type returned when the response's <tt style="font-weight:bold">success</tt>  * property is set to <tt>false</tt>, or no field values are returned in the response's  * <tt style="font-weight:bold">data</tt> property.  * @type {String}  * @static  */ Ext.form.Action.LOAD_FAILURE = 'load'; Ext.form.Action.prototype = { /**  * @cfg {String} url The URL that the Action is to invoke.  */ /**  * @cfg {Boolean} reset When set to <tt><b>true</b></tt>, causes the Form to be  * {@link Ext.form.BasicForm.reset reset} on Action success. If specified, this happens  * <b>before</b> the {@link #success} callback is called and before the Form's  * {@link Ext.form.BasicForm.actioncomplete actioncomplete} event fires.  */ /**  * @cfg {String} method The HTTP method to use to access the requested URL. Defaults to the  * {@link Ext.form.BasicForm}'s method, or if that is not specified, the underlying DOM form's method.  */ /**  * @cfg {Mixed} params <p>Extra parameter values to pass. These are added to the Form's  * {@link Ext.form.BasicForm#baseParams} and passed to the specified URL along with the Form's  * input fields.</p>  * <p>Parameters are encoded as standard HTTP parameters using {@link Ext#urlEncode}.</p>  */ /**  * @cfg {Number} timeout The number of seconds to wait for a server response before  * failing with the {@link #failureType} as {@link #Action.CONNECT_FAILURE}. If not specified,  * defaults to the configured <tt>{@link Ext.form.BasicForm#timeout timeout}</tt> of the  * {@link Ext.form.BasicForm form}.  */ /**  * @cfg {Function} success The function to call when a valid success return packet is recieved.  * The function is passed the following parameters:<ul class="mdetail-params">  * <li><b>form</b> : Ext.form.BasicForm<div class="sub-desc">The form that requested the action</div></li>  * <li><b>action</b> : Ext.form.Action<div class="sub-desc">The Action class. The {@link #result}  * property of this object may be examined to perform custom postprocessing.</div></li>  * </ul>  */ /**  * @cfg {Function} failure The function to call when a failure packet was recieved, or when an  * error ocurred in the Ajax communication.  * The function is passed the following parameters:<ul class="mdetail-params">  * <li><b>form</b> : Ext.form.BasicForm<div class="sub-desc">The form that requested the action</div></li>  * <li><b>action</b> : Ext.form.Action<div class="sub-desc">The Action class. If an Ajax  * error ocurred, the failure type will be in {@link #failureType}. The {@link #result}  * property of this object may be examined to perform custom postprocessing.</div></li>  * </ul>  */ /**  * @cfg {Object} scope The scope in which to call the callback functions (The <tt>this</tt> reference  * for the callback functions).  */ /**  * @cfg {String} waitMsg The message to be displayed by a call to {@link Ext.MessageBox#wait}  * during the time the action is being processed.  */ /**  * @cfg {String} waitTitle The title to be displayed by a call to {@link Ext.MessageBox#wait}  * during the time the action is being processed.  */ /**  * The type of action this Action instance performs.  * Currently only "submit" and "load" are supported.  * @type {String}  */     type : 'default', /**  * The type of failure detected will be one of these: {@link #CLIENT_INVALID},  * {@link #SERVER_INVALID}, {@link #CONNECT_FAILURE}, or {@link #LOAD_FAILURE}.  Usage:  * <pre><code> var fp = new Ext.form.FormPanel({ ... buttons: [{     text: 'Save',     formBind: true,     handler: function(){         if(fp.getForm().isValid()){             fp.getForm().submit({                 url: 'form-submit.php',                 waitMsg: 'Submitting your data...',                 success: function(form, action){                     // server responded with success = true                     var result = action.{@link #result};                 },                 failure: function(form, action){                     if (action.{@link #failureType} === Ext.form.Action.{@link #CONNECT_FAILURE}) {                         Ext.Msg.alert('Error',                             'Status:'+action.{@link #response}.status+': '+                             action.{@link #response}.statusText);                     }                     if (action.failureType === Ext.form.Action.{@link #SERVER_INVALID}){                         // server responded with success = false                         Ext.Msg.alert('Invalid', action.{@link #result}.errormsg);                     }                 }             });         }     } },{     text: 'Reset',     handler: function(){         fp.getForm().reset();     } }]  * </code></pre>  * @property failureType  * @type {String}  */  /**  * The XMLHttpRequest object used to perform the action.  * @property response  * @type {Object}  */  /**  * The decoded response object containing a boolean <tt style="font-weight:bold">success</tt> property and  * other, action-specific properties.  * @property result  * @type {Object}  */     // interface method     run : function(options){     },     // interface method     success : function(response){     },     // interface method     handleResponse : function(response){     },     // default connection failure     failure : function(response){         this.response = response;         this.failureType = Ext.form.Action.CONNECT_FAILURE;         this.form.afterAction(this, false);     },     // private     // shared code among all Actions to validate that there was a response     // with either responseText or responseXml     processResponse : function(response){         this.response = response;         if(!response.responseText && !response.responseXML){             return true;         }         this.result = this.handleResponse(response);         return this.result;     },     // utility functions used internally     getUrl : function(appendParams){         var url = this.options.url || this.form.url || this.form.el.dom.action;         if(appendParams){             var p = this.getParams();             if(p){                 url = Ext.urlAppend(url, p);             }         }         return url;     },     // private     getMethod : function(){         return (this.options.method || this.form.method || this.form.el.dom.method || 'POST').toUpperCase();     },     // private     getParams : function(){         var bp = this.form.baseParams;         var p = this.options.params;         if(p){             if(typeof p == "object"){                 p = Ext.urlEncode(Ext.applyIf(p, bp));             }else if(typeof p == 'string' && bp){                 p += '&' + Ext.urlEncode(bp);             }         }else if(bp){             p = Ext.urlEncode(bp);         }         return p;     },     // private     createCallback : function(opts){         var opts = opts || {};         return {             success: this.success,             failure: this.failure,             scope: this,             timeout: (opts.timeout*1000) || (this.form.timeout*1000),             upload: this.form.fileUpload ? this.success : undefined         };     } }; /**  * @class Ext.form.Action.Submit  * @extends Ext.form.Action  * <p>A class which handles submission of data from {@link Ext.form.BasicForm Form}s  * and processes the returned response.</p>  * <p>Instances of this class are only created by a {@link Ext.form.BasicForm Form} when  * {@link Ext.form.BasicForm#submit submit}ting.</p>  * <p><u><b>Response Packet Criteria</b></u></p>  * <p>A response packet may contain:  * <div class="mdetail-params"><ul>  * <li><b><code>success</code></b> property : Boolean  * <div class="sub-desc">The <code>success</code> property is required.</div></li>  * <li><b><code>errors</code></b> property : Object  * <div class="sub-desc"><div class="sub-desc">The <code>errors</code> property,  * which is optional, contains error messages for invalid fields.</div></li>  * </ul></div>  * <p><u><b>JSON Packets</b></u></p>  * <p>By default, response packets are assumed to be JSON, so a typical response  * packet may look like this:</p><pre><code> {     success: false,     errors: {         clientCode: "Client not found",         portOfLoading: "This field must not be null"     } }</code></pre>  * <p>Other data may be placed into the response for processing by the {@link Ext.form.BasicForm}'s callback  * or event handler methods. The object decoded from this JSON is available in the  * {@link Ext.form.Action#result result} property.</p>  * <p>Alternatively, if an {@link #errorReader} is specified as an {@link Ext.data.XmlReader XmlReader}:</p><pre><code>     errorReader: new Ext.data.XmlReader({             record : 'field',             success: '@success'         }, [             'id', 'msg'         ]     ) </code></pre>  * <p>then the results may be sent back in XML format:</p><pre><code> &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;message success="false"&gt; &lt;errors&gt;     &lt;field&gt;         &lt;id&gt;clientCode&lt;/id&gt;         &lt;msg&gt;&lt;![CDATA[Code not found. &lt;br /&gt;&lt;i&gt;This is a test validation message from the server &lt;/i&gt;]]&gt;&lt;/msg&gt;     &lt;/field&gt;     &lt;field&gt;         &lt;id&gt;portOfLoading&lt;/id&gt;         &lt;msg&gt;&lt;![CDATA[Port not found. &lt;br /&gt;&lt;i&gt;This is a test validation message from the server &lt;/i&gt;]]&gt;&lt;/msg&gt;     &lt;/field&gt; &lt;/errors&gt; &lt;/message&gt; </code></pre>  * <p>Other elements may be placed into the response XML for processing by the {@link Ext.form.BasicForm}'s callback  * or event handler methods. The XML document is available in the {@link #errorReader}'s {@link Ext.data.XmlReader#xmlData xmlData} property.</p>  */ Ext.form.Action.Submit = function(form, options){     Ext.form.Action.Submit.superclass.constructor.call(this, form, options); }; Ext.extend(Ext.form.Action.Submit, Ext.form.Action, {     /**      * @cfg {Ext.data.DataReader} errorReader <p><b>Optional. JSON is interpreted with      * no need for an errorReader.</b></p>      * <p>A Reader which reads a single record from the returned data. The DataReader's      * <b>success</b> property specifies how submission success is determined. The Record's      * data provides the error messages to apply to any invalid form Fields.</p>      */     /**      * @cfg {boolean} clientValidation Determines whether a Form's fields are validated      * in a final call to {@link Ext.form.BasicForm#isValid isValid} prior to submission.      * Pass <tt>false</tt> in the Form's submit options to prevent this. If not defined, pre-submission field validation      * is performed.      */     type : 'submit',     // private     run : function(){         var o = this.options;         var method = this.getMethod();         var isGet = method == 'GET';         if(o.clientValidation === false || this.form.isValid()){             Ext.Ajax.request(Ext.apply(this.createCallback(o), {                 form:this.form.el.dom,                 url:this.getUrl(isGet),                 method: method,                 headers: o.headers,                 params:!isGet ? this.getParams() : null,                 isUpload: this.form.fileUpload             }));         }else if (o.clientValidation !== false){ // client validation failed             this.failureType = Ext.form.Action.CLIENT_INVALID;             this.form.afterAction(this, false);         }     },     // private     success : function(response){         var result = this.processResponse(response);         if(result === true || result.success){             this.form.afterAction(this, true);             return;         }         if(result.errors){             this.form.markInvalid(result.errors);             this.failureType = Ext.form.Action.SERVER_INVALID;         }         this.form.afterAction(this, false);     },     // private     handleResponse : function(response){         if(this.form.errorReader){             var rs = this.form.errorReader.read(response);             var errors = [];             if(rs.records){                 for(var i = 0, len = rs.records.length; i < len; i++) {                     var r = rs.records[i];                     errors[i] = r.data;                 }             }             if(errors.length < 1){                 errors = null;             }             return {                 success : rs.success,                 errors : errors             };         }         return Ext.decode(response.responseText);     } }); /**  * @class Ext.form.Action.Load  * @extends Ext.form.Action  * <p>A class which handles loading of data from a server into the Fields of an {@link Ext.form.BasicForm}.</p>  * <p>Instances of this class are only created by a {@link Ext.form.BasicForm Form} when  * {@link Ext.form.BasicForm#load load}ing.</p>  * <p><u><b>Response Packet Criteria</b></u></p>  * <p>A response packet <b>must</b> contain:  * <div class="mdetail-params"><ul>  * <li><b><code>success</code></b> property : Boolean</li>  * <li><b><code>data</code></b> property : Object</li>  * <div class="sub-desc">The <code>data</code> property contains the values of Fields to load.  * The individual value object for each Field is passed to the Field's  * {@link Ext.form.Field#setValue setValue} method.</div></li>  * </ul></div>  * <p><u><b>JSON Packets</b></u></p>  * <p>By default, response packets are assumed to be JSON, so for the following form load call:<pre><code> var myFormPanel = new Ext.form.FormPanel({     title: 'Client and routing info',     items: [{         fieldLabel: 'Client',         name: 'clientName'     }, {         fieldLabel: 'Port of loading',         name: 'portOfLoading'     }, {         fieldLabel: 'Port of discharge',         name: 'portOfDischarge'     }] }); myFormPanel.{@link Ext.form.FormPanel#getForm getForm}().{@link Ext.form.BasicForm#load load}({     url: '/getRoutingInfo.php',     params: {         consignmentRef: myConsignmentRef     },     failure: function(form, action() {         Ext.Msg.alert("Load failed", action.result.errorMessage);     } }); </code></pre>  * a <b>success response</b> packet may look like this:</p><pre><code> {     success: true,     data: {         clientName: "Fred. Olsen Lines",         portOfLoading: "FXT",         portOfDischarge: "OSL"     } }</code></pre>  * while a <b>failure response</b> packet may look like this:</p><pre><code> {     success: false,     errorMessage: "Consignment reference not found" }</code></pre>  * <p>Other data may be placed into the response for processing the {@link Ext.form.BasicForm Form}'s  * callback or event handler methods. The object decoded from this JSON is available in the  * {@link Ext.form.Action#result result} property.</p>  */ Ext.form.Action.Load = function(form, options){     Ext.form.Action.Load.superclass.constructor.call(this, form, options);     this.reader = this.form.reader; }; Ext.extend(Ext.form.Action.Load, Ext.form.Action, {     // private     type : 'load',     // private     run : function(){         Ext.Ajax.request(Ext.apply(                 this.createCallback(this.options), {                     method:this.getMethod(),                     url:this.getUrl(false),                     headers: this.options.headers,                     params:this.getParams()         }));     },     // private     success : function(response){         var result = this.processResponse(response);         if(result === true || !result.success || !result.data){             this.failureType = Ext.form.Action.LOAD_FAILURE;             this.form.afterAction(this, false);             return;         }         this.form.clearInvalid();         this.form.setValues(result.data);         this.form.afterAction(this, true);     },     // private     handleResponse : function(response){         if(this.form.reader){             var rs = this.form.reader.read(response);             var data = rs.records && rs.records[0] ? rs.records[0].data : null;             return {                 success : rs.success,                 data : data             };         }         return Ext.decode(response.responseText);     } }); /**  * @class Ext.form.Action.DirectLoad  * @extends Ext.form.Action.Load  * Provides Ext.direct support for loading form data. This example illustrates usage  * of Ext.Direct to load a submit a form through Ext.Direct.  * <pre><code> var myFormPanel = new Ext.form.FormPanel({     // configs for FormPanel     title: 'Basic Information',     border: false,     padding: 10,     buttons:[{         text: 'Submit',         handler: function(){             basicInfo.getForm().submit({                 params: {                     uid: 5                 }             });         }     }],          // configs apply to child items     defaults: {anchor: '100%'},     defaultType: 'textfield',     items: [         // form fields go here     ],          // configs for BasicForm     api: {         load: Profile.getBasicInfo,         // The server-side must mark the submit handler as a 'formHandler'         submit: Profile.updateBasicInfo     },         paramOrder: ['uid'] }); // load the form myFormPanel.getForm().load({     params: {         uid: 5     } });  * </code></pre>  */ Ext.form.Action.DirectLoad = Ext.extend(Ext.form.Action.Load, {     constructor: function(form, opts) {                 Ext.form.Action.DirectLoad.superclass.constructor.call(this, form, opts);     },     type: 'directload',          run : function(){         var args = this.getParams();         args.push(this.success, this);                         this.form.api.load.apply(window, args);     },          getParams: function() {         var buf = [], o = {};         var bp = this.form.baseParams;         var p = this.options.params;         Ext.apply(o, p, bp);         var paramOrder = this.form.paramOrder;         if(paramOrder){             for(var i = 0, len = paramOrder.length; i < len; i++){                 buf.push(o[paramOrder[i]]);             }         }else if(this.form.paramsAsHash){             buf.push(o);         }         return buf;     },     // Direct actions have already been processed and therefore     // we can directly set the result; Direct Actions do not have     // a this.response property.     processResponse: function(result) {         this.result = result;         return result;               } }); /**  * @class Ext.form.Action.DirectSubmit  * @extends Ext.form.Action.Submit  * Provides Ext.direct support for submitting form data.  * See {@link Ext.form.Action.DirectLoad}.  */ Ext.form.Action.DirectSubmit = Ext.extend(Ext.form.Action.Submit, {     constructor: function(form, opts) {         Ext.form.Action.DirectSubmit.superclass.constructor.call(this, form, opts);     },     type: 'directsubmit',     // override of Submit     run : function(){         var o = this.options;         if(o.clientValidation === false || this.form.isValid()){             // tag on any additional params to be posted in the             // form scope             this.success.params = this.getParams();             this.form.api.submit(this.form.el.dom, this.success, this);         }else if (o.clientValidation !== false){ // client validation failed             this.failureType = Ext.form.Action.CLIENT_INVALID;             this.form.afterAction(this, false);         }     },          getParams: function() {         var o = {};         var bp = this.form.baseParams;         var p = this.options.params;         Ext.apply(o, p, bp);         return o;     },         // Direct actions have already been processed and therefore     // we can directly set the result; Direct Actions do not have     // a this.response property.     processResponse: function(result) {         this.result = result;         return result;               } }); Ext.form.Action.ACTION_TYPES = {     'load' : Ext.form.Action.Load,     'submit' : Ext.form.Action.Submit,     'directload': Ext.form.Action.DirectLoad,     'directsubmit': Ext.form.Action.DirectSubmit }; /**  * @class Ext.form.VTypes  * <p>This is a singleton object which contains a set of commonly used field validation functions.  * The validations provided are basic and intended to be easily customizable and extended.</p>  * <p>To add custom VTypes specify the <code>{@link Ext.form.TextField#vtype vtype}</code> validation  * test function, and optionally specify any corresponding error text to display and any keystroke  * filtering mask to apply. For example:</p>  * <pre><code> // custom Vtype for vtype:'time' var timeTest = /^([1-9]|1[0-9]):([0-5][0-9])(s[a|p]m)$/i; Ext.apply(Ext.form.VTypes, {     //  vtype validation function     time: function(val, field) {         return timeTest.test(val);     },     // vtype Text property: The error text to display when the validation function returns false     timeText: 'Not a valid time.  Must be in the format "12:34 PM".',     // vtype Mask property: The keystroke filter mask     timeMask: /[ds:amp]/i });  * </code></pre>  * Another example:   * <pre><code> // custom Vtype for vtype:'IPAddress' Ext.apply(Ext.form.VTypes, {     IPAddress:  function(v) {         return /^d{1,3}.d{1,3}.d{1,3}.d{1,3}$/.test(v);     },     IPAddressText: 'Must be a numeric IP address',     IPAddressMask: /[d.]/i });  * </code></pre>  * @singleton  */ Ext.form.VTypes = function(){     // closure these in so they are only created once.     var alpha = /^[a-zA-Z_]+$/;     var alphanum = /^[a-zA-Z0-9_]+$/;     var email = /^(w+)([-+.][w]+)*@(w[-w]*.){1,5}([A-Za-z]){2,4}$/;     var url = /(((https?)|(ftp))://([-w]+.)+w{2,3}(/[%-w]+(.w{2,})?)*(([w-.?\/+@&#;`~=%!]*)(.w{2,})?)*/?)/i;     // All these messages and functions are configurable     return {         /**          * The function used to validate email addresses.  Note that this is a very basic validation -- complete          * validation per the email RFC specifications is very complex and beyond the scope of this class, although          * this function can be overridden if a more comprehensive validation scheme is desired.  See the validation          * section of the <a href="http://en.wikipedia.org/wiki/E-mail_address">Wikipedia article on email addresses</a>           * for additional information.  This implementation is intended to validate the following emails:<tt>          * 'barney@example.de', 'barney.rubble@example.com', 'barney-rubble@example.coop', 'barney+rubble@example.com'          * </tt>.          * @param {String} value The email address          * @return {Boolean} true if the RegExp test passed, and false if not.          */         'email' : function(v){             return email.test(v);         },         /**          * The error text to display when the email validation function returns false.  Defaults to:          * <tt>'This field should be an e-mail address in the format "user@example.com"'</tt>          * @type String          */         'emailText' : 'This field should be an e-mail address in the format "user@example.com"',         /**          * The keystroke filter mask to be applied on email input.  See the {@link #email} method for           * information about more complex email validation. Defaults to:          * <tt>/[a-z0-9_.-@]/i</tt>          * @type RegExp          */         'emailMask' : /[a-z0-9_.-@]/i,         /**          * The function used to validate URLs          * @param {String} value The URL          * @return {Boolean} true if the RegExp test passed, and false if not.          */         'url' : function(v){             return url.test(v);         },         /**          * The error text to display when the url validation function returns false.  Defaults to:          * <tt>'This field should be a URL in the format "http:/'+'/www.example.com"'</tt>          * @type String          */         'urlText' : 'This field should be a URL in the format "http:/'+'/www.example.com"',                  /**          * The function used to validate alpha values          * @param {String} value The value          * @return {Boolean} true if the RegExp test passed, and false if not.          */         'alpha' : function(v){             return alpha.test(v);         },         /**          * The error text to display when the alpha validation function returns false.  Defaults to:          * <tt>'This field should only contain letters and _'</tt>          * @type String          */         'alphaText' : 'This field should only contain letters and _',         /**          * The keystroke filter mask to be applied on alpha input.  Defaults to:          * <tt>/[a-z_]/i</tt>          * @type RegExp          */         'alphaMask' : /[a-z_]/i,         /**          * The function used to validate alphanumeric values          * @param {String} value The value          * @return {Boolean} true if the RegExp test passed, and false if not.          */         'alphanum' : function(v){             return alphanum.test(v);         },         /**          * The error text to display when the alphanumeric validation function returns false.  Defaults to:          * <tt>'This field should only contain letters, numbers and _'</tt>          * @type String          */         'alphanumText' : 'This field should only contain letters, numbers and _',         /**          * The keystroke filter mask to be applied on alphanumeric input.  Defaults to:          * <tt>/[a-z0-9_]/i</tt>          * @type RegExp          */         'alphanumMask' : /[a-z0-9_]/i     }; }();