| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598 | 
							- <!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-field-Date'>/**
 
- </span> * @docauthor Jason Johnston <jason@sencha.com>
 
-  *
 
-  * Provides a date input field with a {@link Ext.picker.Date date picker} dropdown and automatic date
 
-  * validation.
 
-  *
 
-  * This field recognizes and uses the JavaScript Date object as its main {@link #value} type. In addition,
 
-  * it recognizes string values which are parsed according to the {@link #format} and/or {@link #altFormats}
 
-  * configs. These may be reconfigured to use date formats appropriate for the user's locale.
 
-  *
 
-  * The field may be limited to a certain range of dates by using the {@link #minValue}, {@link #maxValue},
 
-  * {@link #disabledDays}, and {@link #disabledDates} config parameters. These configurations will be used both
 
-  * in the field's validation, and in the date picker dropdown by preventing invalid dates from being selected.
 
-  *
 
-  * # Example usage
 
-  *
 
-  *     @example
 
-  *     Ext.create('Ext.form.Panel', {
 
-  *         renderTo: Ext.getBody(),
 
-  *         width: 300,
 
-  *         bodyPadding: 10,
 
-  *         title: 'Dates',
 
-  *         items: [{
 
-  *             xtype: 'datefield',
 
-  *             anchor: '100%',
 
-  *             fieldLabel: 'From',
 
-  *             name: 'from_date',
 
-  *             maxValue: new Date()  // limited to the current date or prior
 
-  *         }, {
 
-  *             xtype: 'datefield',
 
-  *             anchor: '100%',
 
-  *             fieldLabel: 'To',
 
-  *             name: 'to_date',
 
-  *             value: new Date()  // defaults to today
 
-  *         }]
 
-  *     });
 
-  *
 
-  * # Date Formats Examples
 
-  *
 
-  * This example shows a couple of different date format parsing scenarios. Both use custom date format
 
-  * configurations; the first one matches the configured `format` while the second matches the `altFormats`.
 
-  *
 
-  *     @example
 
-  *     Ext.create('Ext.form.Panel', {
 
-  *         renderTo: Ext.getBody(),
 
-  *         width: 300,
 
-  *         bodyPadding: 10,
 
-  *         title: 'Dates',
 
-  *         items: [{
 
-  *             xtype: 'datefield',
 
-  *             anchor: '100%',
 
-  *             fieldLabel: 'Date',
 
-  *             name: 'date',
 
-  *             // The value matches the format; will be parsed and displayed using that format.
 
-  *             format: 'm d Y',
 
-  *             value: '2 4 1978'
 
-  *         }, {
 
-  *             xtype: 'datefield',
 
-  *             anchor: '100%',
 
-  *             fieldLabel: 'Date',
 
-  *             name: 'date',
 
-  *             // The value does not match the format, but does match an altFormat; will be parsed
 
-  *             // using the altFormat and displayed using the format.
 
-  *             format: 'm d Y',
 
-  *             altFormats: 'm,d,Y|m.d.Y',
 
-  *             value: '2.4.1978'
 
-  *         }]
 
-  *     });
 
-  */
 
- Ext.define('Ext.form.field.Date', {
 
-     extend:'Ext.form.field.Picker',
 
-     alias: 'widget.datefield',
 
-     requires: ['Ext.picker.Date'],
 
-     alternateClassName: ['Ext.form.DateField', 'Ext.form.Date'],
 
-     //<locale>
 
- <span id='Ext-form-field-Date-cfg-format'>    /**
 
- </span>     * @cfg {String} format
 
-      * The default date format string which can be overriden for localization support. The format must be valid
 
-      * according to {@link Ext.Date#parse}.
 
-      */
 
-     format : "m/d/Y",
 
-     //</locale>
 
-     //<locale>
 
- <span id='Ext-form-field-Date-cfg-altFormats'>    /**
 
- </span>     * @cfg {String} altFormats
 
-      * Multiple date formats separated by "|" to try when parsing a user input value and it does not match the defined
 
-      * format.
 
-      */
 
-     altFormats : "m/d/Y|n/j/Y|n/j/y|m/j/y|n/d/y|m/j/Y|n/d/Y|m-d-y|m-d-Y|m/d|m-d|md|mdy|mdY|d|Y-m-d|n-j|n/j",
 
-     //</locale>
 
-     //<locale>
 
- <span id='Ext-form-field-Date-cfg-disabledDaysText'>    /**
 
- </span>     * @cfg {String} disabledDaysText
 
-      * The tooltip to display when the date falls on a disabled day.
 
-      */
 
-     disabledDaysText : "Disabled",
 
-     //</locale>
 
-     //<locale>
 
- <span id='Ext-form-field-Date-cfg-disabledDatesText'>    /**
 
- </span>     * @cfg {String} disabledDatesText
 
-      * The tooltip text to display when the date falls on a disabled date.
 
-      */
 
-     disabledDatesText : "Disabled",
 
-     //</locale>
 
-     //<locale>
 
- <span id='Ext-form-field-Date-cfg-minText'>    /**
 
- </span>     * @cfg {String} minText
 
-      * The error text to display when the date in the cell is before {@link #minValue}.
 
-      */
 
-     minText : "The date in this field must be equal to or after {0}",
 
-     //</locale>
 
-     //<locale>
 
- <span id='Ext-form-field-Date-cfg-maxText'>    /**
 
- </span>     * @cfg {String} maxText
 
-      * The error text to display when the date in the cell is after {@link #maxValue}.
 
-      */
 
-     maxText : "The date in this field must be equal to or before {0}",
 
-     //</locale>
 
-     //<locale>
 
- <span id='Ext-form-field-Date-cfg-invalidText'>    /**
 
- </span>     * @cfg {String} invalidText
 
-      * The error text to display when the date in the field is invalid.
 
-      */
 
-     invalidText : "{0} is not a valid date - it must be in the format {1}",
 
-     //</locale>
 
- <span id='Ext-form-field-Date-cfg-triggerCls'>    /**
 
- </span>     * @cfg {String} [triggerCls='x-form-date-trigger']
 
-      * An additional CSS class used to style the trigger button. The trigger will always get the class 'x-form-trigger'
 
-      * and triggerCls will be **appended** if specified (default class displays a calendar icon).
 
-      */
 
-     triggerCls : Ext.baseCSSPrefix + 'form-date-trigger',
 
- <span id='Ext-form-field-Date-cfg-showToday'>    /**
 
- </span>     * @cfg {Boolean} showToday
 
-      * false to hide the footer area of the Date picker containing the Today button and disable the keyboard handler for
 
-      * spacebar that selects the current date.
 
-      */
 
-     showToday : true,
 
- <span id='Ext-form-field-Date-cfg-minValue'>    /**
 
- </span>     * @cfg {Date/String} minValue
 
-      * The minimum allowed date. Can be either a Javascript date object or a string date in a valid format.
 
-      */
 
- <span id='Ext-form-field-Date-cfg-maxValue'>    /**
 
- </span>     * @cfg {Date/String} maxValue
 
-      * The maximum allowed date. Can be either a Javascript date object or a string date in a valid format.
 
-      */
 
- <span id='Ext-form-field-Date-cfg-disabledDays'>    /**
 
- </span>     * @cfg {Number[]} disabledDays
 
-      * An array of days to disable, 0 based. Some examples:
 
-      *
 
-      *     // disable Sunday and Saturday:
 
-      *     disabledDays:  [0, 6]
 
-      *     // disable weekdays:
 
-      *     disabledDays: [1,2,3,4,5]
 
-      */
 
- <span id='Ext-form-field-Date-cfg-disabledDates'>    /**
 
- </span>     * @cfg {String[]} disabledDates
 
-      * An array of "dates" to disable, as strings. These strings will be used to build a dynamic regular expression so
 
-      * they are very powerful. Some examples:
 
-      *
 
-      *     // disable these exact dates:
 
-      *     disabledDates: ["03/08/2003", "09/16/2003"]
 
-      *     // disable these days for every year:
 
-      *     disabledDates: ["03/08", "09/16"]
 
-      *     // only match the beginning (useful if you are using short years):
 
-      *     disabledDates: ["^03/08"]
 
-      *     // disable every day in March 2006:
 
-      *     disabledDates: ["03/../2006"]
 
-      *     // disable every day in every March:
 
-      *     disabledDates: ["^03"]
 
-      *
 
-      * Note that the format of the dates included in the array should exactly match the {@link #format} config. In order
 
-      * to support regular expressions, if you are using a {@link #format date format} that has "." in it, you will have
 
-      * to escape the dot when restricting dates. For example: `["03\\.08\\.03"]`.
 
-      */
 
- <span id='Ext-form-field-Date-cfg-submitFormat'>    /**
 
- </span>     * @cfg {String} submitFormat
 
-      * The date format string which will be submitted to the server. The format must be valid according to
 
-      * {@link Ext.Date#parse}.
 
-      *
 
-      * Defaults to {@link #format}.
 
-      */
 
-     
 
- <span id='Ext-form-field-Date-cfg-useStrict'>    /**
 
- </span>     * @cfg {Boolean} useStrict
 
-      * True to enforce strict date parsing to prevent the default Javascript "date rollover".
 
-      * Defaults to the useStrict parameter set on Ext.Date
 
-      * See {@link Ext.Date#parse}.
 
-      */
 
-     useStrict: undefined,
 
-     // in the absence of a time value, a default value of 12 noon will be used
 
-     // (note: 12 noon was chosen because it steers well clear of all DST timezone changes)
 
-     initTime: '12', // 24 hour format
 
-     initTimeFormat: 'H',
 
-     matchFieldWidth: false,
 
-     //<locale>
 
- <span id='Ext-form-field-Date-cfg-startDay'>    /**
 
- </span>     * @cfg {Number} [startDay=undefined]
 
-      * Day index at which the week should begin, 0-based.
 
-      *
 
-      * Defaults to `0` (Sunday).
 
-      */
 
-     startDay: 0,
 
-     //</locale>
 
-     initComponent : function(){
 
-         var me = this,
 
-             isString = Ext.isString,
 
-             min, max;
 
-         min = me.minValue;
 
-         max = me.maxValue;
 
-         if(isString(min)){
 
-             me.minValue = me.parseDate(min);
 
-         }
 
-         if(isString(max)){
 
-             me.maxValue = me.parseDate(max);
 
-         }
 
-         me.disabledDatesRE = null;
 
-         me.initDisabledDays();
 
-         me.callParent();
 
-     },
 
-     initValue: function() {
 
-         var me = this,
 
-             value = me.value;
 
-         // If a String value was supplied, try to convert it to a proper Date
 
-         if (Ext.isString(value)) {
 
-             me.value = me.rawToValue(value);
 
-         }
 
-         me.callParent();
 
-     },
 
-     // private
 
-     initDisabledDays : function(){
 
-         if(this.disabledDates){
 
-             var dd   = this.disabledDates,
 
-                 len  = dd.length - 1,
 
-                 re   = "(?:",
 
-                 d,
 
-                 dLen = dd.length,
 
-                 date;
 
-             for (d = 0; d < dLen; d++) {
 
-                 date = dd[d];
 
-                 re += Ext.isDate(date) ? '^' + Ext.String.escapeRegex(date.dateFormat(this.format)) + '$' : date;
 
-                 if (d !== len) {
 
-                     re += '|';
 
-                 }
 
-             }
 
-             this.disabledDatesRE = new RegExp(re + ')');
 
-         }
 
-     },
 
- <span id='Ext-form-field-Date-method-setDisabledDates'>    /**
 
- </span>     * Replaces any existing disabled dates with new values and refreshes the Date picker.
 
-      * @param {String[]} disabledDates An array of date strings (see the {@link #disabledDates} config for details on
 
-      * supported values) used to disable a pattern of dates.
 
-      */
 
-     setDisabledDates : function(dd){
 
-         var me = this,
 
-             picker = me.picker;
 
-         me.disabledDates = dd;
 
-         me.initDisabledDays();
 
-         if (picker) {
 
-             picker.setDisabledDates(me.disabledDatesRE);
 
-         }
 
-     },
 
- <span id='Ext-form-field-Date-method-setDisabledDays'>    /**
 
- </span>     * Replaces any existing disabled days (by index, 0-6) with new values and refreshes the Date picker.
 
-      * @param {Number[]} disabledDays An array of disabled day indexes. See the {@link #disabledDays} config for details on
 
-      * supported values.
 
-      */
 
-     setDisabledDays : function(dd){
 
-         var picker = this.picker;
 
-         this.disabledDays = dd;
 
-         if (picker) {
 
-             picker.setDisabledDays(dd);
 
-         }
 
-     },
 
- <span id='Ext-form-field-Date-method-setMinValue'>    /**
 
- </span>     * Replaces any existing {@link #minValue} with the new value and refreshes the Date picker.
 
-      * @param {Date} value The minimum date that can be selected
 
-      */
 
-     setMinValue : function(dt){
 
-         var me = this,
 
-             picker = me.picker,
 
-             minValue = (Ext.isString(dt) ? me.parseDate(dt) : dt);
 
-         me.minValue = minValue;
 
-         if (picker) {
 
-             picker.minText = Ext.String.format(me.minText, me.formatDate(me.minValue));
 
-             picker.setMinDate(minValue);
 
-         }
 
-     },
 
- <span id='Ext-form-field-Date-method-setMaxValue'>    /**
 
- </span>     * Replaces any existing {@link #maxValue} with the new value and refreshes the Date picker.
 
-      * @param {Date} value The maximum date that can be selected
 
-      */
 
-     setMaxValue : function(dt){
 
-         var me = this,
 
-             picker = me.picker,
 
-             maxValue = (Ext.isString(dt) ? me.parseDate(dt) : dt);
 
-         me.maxValue = maxValue;
 
-         if (picker) {
 
-             picker.maxText = Ext.String.format(me.maxText, me.formatDate(me.maxValue));
 
-             picker.setMaxDate(maxValue);
 
-         }
 
-     },
 
- <span id='Ext-form-field-Date-method-getErrors'>    /**
 
- </span>     * Runs all of Date's validations and returns an array of any errors. Note that this first runs Text's validations,
 
-      * so the returned array is an amalgamation of all field errors. The additional validation checks are testing that
 
-      * the date format is valid, that the chosen date is within the min and max date constraints set, that the date
 
-      * chosen is not in the disabledDates regex and that the day chosed is not one of the disabledDays.
 
-      * @param {Object} [value] The value to get errors for (defaults to the current field value)
 
-      * @return {String[]} All validation errors for this field
 
-      */
 
-     getErrors: function(value) {
 
-         var me = this,
 
-             format = Ext.String.format,
 
-             clearTime = Ext.Date.clearTime,
 
-             errors = me.callParent(arguments),
 
-             disabledDays = me.disabledDays,
 
-             disabledDatesRE = me.disabledDatesRE,
 
-             minValue = me.minValue,
 
-             maxValue = me.maxValue,
 
-             len = disabledDays ? disabledDays.length : 0,
 
-             i = 0,
 
-             svalue,
 
-             fvalue,
 
-             day,
 
-             time;
 
-         value = me.formatDate(value || me.processRawValue(me.getRawValue()));
 
-         if (value === null || value.length < 1) { // if it's blank and textfield didn't flag it then it's valid
 
-              return errors;
 
-         }
 
-         svalue = value;
 
-         value = me.parseDate(value);
 
-         if (!value) {
 
-             errors.push(format(me.invalidText, svalue, Ext.Date.unescapeFormat(me.format)));
 
-             return errors;
 
-         }
 
-         time = value.getTime();
 
-         if (minValue && time < clearTime(minValue).getTime()) {
 
-             errors.push(format(me.minText, me.formatDate(minValue)));
 
-         }
 
-         if (maxValue && time > clearTime(maxValue).getTime()) {
 
-             errors.push(format(me.maxText, me.formatDate(maxValue)));
 
-         }
 
-         if (disabledDays) {
 
-             day = value.getDay();
 
-             for(; i < len; i++) {
 
-                 if (day === disabledDays[i]) {
 
-                     errors.push(me.disabledDaysText);
 
-                     break;
 
-                 }
 
-             }
 
-         }
 
-         fvalue = me.formatDate(value);
 
-         if (disabledDatesRE && disabledDatesRE.test(fvalue)) {
 
-             errors.push(format(me.disabledDatesText, fvalue));
 
-         }
 
-         return errors;
 
-     },
 
-     rawToValue: function(rawValue) {
 
-         return this.parseDate(rawValue) || rawValue || null;
 
-     },
 
-     valueToRaw: function(value) {
 
-         return this.formatDate(this.parseDate(value));
 
-     },
 
- <span id='Ext-form-field-Date-method-setValue'>    /**
 
- </span>     * @method setValue
 
-      * Sets the value of the date field. You can pass a date object or any string that can be parsed into a valid date,
 
-      * using {@link #format} as the date format, according to the same rules as {@link Ext.Date#parse} (the default
 
-      * format used is "m/d/Y").
 
-      *
 
-      * Usage:
 
-      *
 
-      *     //All of these calls set the same date value (May 4, 2006)
 
-      *
 
-      *     //Pass a date object:
 
-      *     var dt = new Date('5/4/2006');
 
-      *     dateField.setValue(dt);
 
-      *
 
-      *     //Pass a date string (default format):
 
-      *     dateField.setValue('05/04/2006');
 
-      *
 
-      *     //Pass a date string (custom format):
 
-      *     dateField.format = 'Y-m-d';
 
-      *     dateField.setValue('2006-05-04');
 
-      *
 
-      * @param {String/Date} date The date or valid date string
 
-      * @return {Ext.form.field.Date} this
 
-      */
 
- <span id='Ext-form-field-Date-method-safeParse'>    /**
 
- </span>     * Attempts to parse a given string value using a given {@link Ext.Date#parse date format}.
 
-      * @param {String} value The value to attempt to parse
 
-      * @param {String} format A valid date format (see {@link Ext.Date#parse})
 
-      * @return {Date} The parsed Date object, or null if the value could not be successfully parsed.
 
-      */
 
-     safeParse : function(value, format) {
 
-         var me = this,
 
-             utilDate = Ext.Date,
 
-             result = null,
 
-             strict = me.useStrict,
 
-             parsedDate;
 
-         if (utilDate.formatContainsHourInfo(format)) {
 
-             // if parse format contains hour information, no DST adjustment is necessary
 
-             result = utilDate.parse(value, format, strict);
 
-         } else {
 
-             // set time to 12 noon, then clear the time
 
-             parsedDate = utilDate.parse(value + ' ' + me.initTime, format + ' ' + me.initTimeFormat, strict);
 
-             if (parsedDate) {
 
-                 result = utilDate.clearTime(parsedDate);
 
-             }
 
-         }
 
-         return result;
 
-     },
 
-     // @private
 
-     getSubmitValue: function() {
 
-         var format = this.submitFormat || this.format,
 
-             value = this.getValue();
 
-         return value ? Ext.Date.format(value, format) : '';
 
-     },
 
- <span id='Ext-form-field-Date-method-parseDate'>    /**
 
- </span>     * @private
 
-      */
 
-     parseDate : function(value) {
 
-         if(!value || Ext.isDate(value)){
 
-             return value;
 
-         }
 
-         var me = this,
 
-             val = me.safeParse(value, me.format),
 
-             altFormats = me.altFormats,
 
-             altFormatsArray = me.altFormatsArray,
 
-             i = 0,
 
-             len;
 
-         if (!val && altFormats) {
 
-             altFormatsArray = altFormatsArray || altFormats.split('|');
 
-             len = altFormatsArray.length;
 
-             for (; i < len && !val; ++i) {
 
-                 val = me.safeParse(value, altFormatsArray[i]);
 
-             }
 
-         }
 
-         return val;
 
-     },
 
-     // private
 
-     formatDate : function(date){
 
-         return Ext.isDate(date) ? Ext.Date.dateFormat(date, this.format) : date;
 
-     },
 
-     createPicker: function() {
 
-         var me = this,
 
-             format = Ext.String.format;
 
-         return new Ext.picker.Date({
 
-             pickerField: me,
 
-             ownerCt: me.ownerCt,
 
-             renderTo: document.body,
 
-             floating: true,
 
-             hidden: true,
 
-             focusOnShow: true,
 
-             minDate: me.minValue,
 
-             maxDate: me.maxValue,
 
-             disabledDatesRE: me.disabledDatesRE,
 
-             disabledDatesText: me.disabledDatesText,
 
-             disabledDays: me.disabledDays,
 
-             disabledDaysText: me.disabledDaysText,
 
-             format: me.format,
 
-             showToday: me.showToday,
 
-             startDay: me.startDay,
 
-             minText: format(me.minText, me.formatDate(me.minValue)),
 
-             maxText: format(me.maxText, me.formatDate(me.maxValue)),
 
-             listeners: {
 
-                 scope: me,
 
-                 select: me.onSelect
 
-             },
 
-             keyNavConfig: {
 
-                 esc: function() {
 
-                     me.collapse();
 
-                 }
 
-             }
 
-         });
 
-     },
 
-     onSelect: function(m, d) {
 
-         var me = this;
 
-         me.setValue(d);
 
-         me.fireEvent('select', me, d);
 
-         me.collapse();
 
-     },
 
- <span id='Ext-form-field-Date-method-onExpand'>    /**
 
- </span>     * @private
 
-      * Sets the Date picker's value to match the current field value when expanding.
 
-      */
 
-     onExpand: function() {
 
-         var value = this.getValue();
 
-         this.picker.setValue(Ext.isDate(value) ? value : new Date());
 
-     },
 
- <span id='Ext-form-field-Date-method-onCollapse'>    /**
 
- </span>     * @private
 
-      * Focuses the field when collapsing the Date picker.
 
-      */
 
-     onCollapse: function() {
 
-         this.focus(false, 60);
 
-     },
 
-     // private
 
-     beforeBlur : function(){
 
-         var me = this,
 
-             v = me.parseDate(me.getRawValue()),
 
-             focusTask = me.focusTask;
 
-         if (focusTask) {
 
-             focusTask.cancel();
 
-         }
 
-         if (v) {
 
-             me.setValue(v);
 
-         }
 
-     }
 
- <span id='Ext-form-field-Date-cfg-grow'>    /**
 
- </span>     * @cfg {Boolean} grow
 
-      * @private
 
-      */
 
- <span id='Ext-form-field-Date-cfg-growMin'>    /**
 
- </span>     * @cfg {Number} growMin
 
-      * @private
 
-      */
 
- <span id='Ext-form-field-Date-cfg-growMax'>    /**
 
- </span>     * @cfg {Number} growMax
 
-      * @private
 
-      */
 
- <span id='Ext-form-field-Date-method-autoSize'>    /**
 
- </span>     * @method autoSize
 
-      * @private
 
-      */
 
- });
 
- </pre>
 
- </body>
 
- </html>
 
 
  |