| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167 | <!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-picker-Date'>/**</span> * A date picker. This class is used by the Ext.form.field.Date field to allow browsing and selection of valid * dates in a popup next to the field, but may also be used with other components. * * Typically you will need to implement a handler function to be notified when the user chooses a date from the picker; * you can register the handler using the {@link #select} event, or by implementing the {@link #handler} method. * * By default the user will be allowed to pick any date; this can be changed by using the {@link #minDate}, * {@link #maxDate}, {@link #disabledDays}, {@link #disabledDatesRE}, and/or {@link #disabledDates} configs. * * All the string values documented below may be overridden by including an Ext locale file in your page. * *     @example *     Ext.create('Ext.panel.Panel', { *         title: 'Choose a future date:', *         width: 200, *         bodyPadding: 10, *         renderTo: Ext.getBody(), *         items: [{ *             xtype: 'datepicker', *             minDate: new Date(), *             handler: function(picker, date) { *                 // do something with the selected date *             } *         }] *     }); */Ext.define('Ext.picker.Date', {    extend: 'Ext.Component',    requires: [        'Ext.XTemplate',        'Ext.button.Button',        'Ext.button.Split',        'Ext.util.ClickRepeater',        'Ext.util.KeyNav',        'Ext.EventObject',        'Ext.fx.Manager',        'Ext.picker.Month'    ],    alias: 'widget.datepicker',    alternateClassName: 'Ext.DatePicker',    childEls: [        'innerEl', 'eventEl', 'prevEl', 'nextEl', 'middleBtnEl', 'footerEl'    ],        border: true,    renderTpl: [        '<div id="{id}-innerEl" role="grid">',            '<div role="presentation" class="{baseCls}-header">',                '<div class="{baseCls}-prev"><a id="{id}-prevEl" href="#" role="button" title="{prevText}"></a></div>',                '<div class="{baseCls}-month" id="{id}-middleBtnEl">{%this.renderMonthBtn(values, out)%}</div>',                '<div class="{baseCls}-next"><a id="{id}-nextEl" href="#" role="button" title="{nextText}"></a></div>',            '</div>',            '<table id="{id}-eventEl" class="{baseCls}-inner" cellspacing="0" role="presentation">',                '<thead role="presentation"><tr role="presentation">',                    '<tpl for="dayNames">',                        '<th role="columnheader" title="{.}"><span>{.:this.firstInitial}</span></th>',                    '</tpl>',                '</tr></thead>',                '<tbody role="presentation"><tr role="presentation">',                    '<tpl for="days">',                        '{#:this.isEndOfWeek}',                        '<td role="gridcell" id="{[Ext.id()]}">',                            '<a role="presentation" href="#" hidefocus="on" class="{parent.baseCls}-date" tabIndex="1">',                                '<em role="presentation"><span role="presentation"></span></em>',                            '</a>',                        '</td>',                    '</tpl>',                '</tr></tbody>',            '</table>',            '<tpl if="showToday">',                '<div id="{id}-footerEl" role="presentation" class="{baseCls}-footer">{%this.renderTodayBtn(values, out)%}</div>',            '</tpl>',        '</div>',        {            firstInitial: function(value) {                return Ext.picker.Date.prototype.getDayInitial(value);            },            isEndOfWeek: function(value) {                // convert from 1 based index to 0 based                // by decrementing value once.                value--;                var end = value % 7 === 0 && value !== 0;                return end ? '</tr><tr role="row">' : '';            },            renderTodayBtn: function(values, out) {                Ext.DomHelper.generateMarkup(values.$comp.todayBtn.getRenderTree(), out);            },            renderMonthBtn: function(values, out) {                Ext.DomHelper.generateMarkup(values.$comp.monthBtn.getRenderTree(), out);            }        }    ],    //<locale><span id='Ext-picker-Date-cfg-todayText'>    /**</span>     * @cfg {String} todayText     * The text to display on the button that selects the current date     */    todayText : 'Today',    //</locale>        //<locale><span id='Ext-picker-Date-cfg-ariaTitle'>    /**</span>     * @cfg {String} ariaTitle     * The text to display for the aria title     */    ariaTitle: 'Date Picker: {0}',    //</locale>        //<locale><span id='Ext-picker-Date-cfg-ariaTitleDateFormat'>    /**</span>     * @cfg {String} ariaTitleDateFormat     * The date format to display for the current value in the {@link #ariaTitle}     */    ariaTitleDateFormat: 'F d, Y',    //</locale><span id='Ext-picker-Date-cfg-handler'>    /**</span>     * @cfg {Function} handler     * Optional. A function that will handle the select event of this picker. The handler is passed the following     * parameters:     *     *   - `picker` : Ext.picker.Date     *     * This Date picker.     *     *   - `date` : Date     *     * The selected date.     */<span id='Ext-picker-Date-cfg-scope'>    /**</span>     * @cfg {Object} scope     * The scope (`this` reference) in which the `{@link #handler}` function will be called.     *     * Defaults to this DatePicker instance.     */    //<locale><span id='Ext-picker-Date-cfg-todayTip'>    /**</span>     * @cfg {String} todayTip     * A string used to format the message for displaying in a tooltip over the button that selects the current date.     * The `{0}` token in string is replaced by today's date.     */    todayTip : '{0} (Spacebar)',    //</locale>    //<locale><span id='Ext-picker-Date-cfg-minText'>    /**</span>     * @cfg {String} minText     * The error text to display if the minDate validation fails.     */    minText : 'This date is before the minimum date',    //</locale>    //<locale><span id='Ext-picker-Date-cfg-maxText'>    /**</span>     * @cfg {String} maxText     * The error text to display if the maxDate validation fails.     */    maxText : 'This date is after the maximum date',    //</locale><span id='Ext-picker-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} (defaults to {@link Ext.Date#defaultFormat}).     */    //<locale><span id='Ext-picker-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-picker-Date-cfg-disabledDatesText'>    /**</span>     * @cfg {String} disabledDatesText     * The tooltip text to display when the date falls on a disabled date.     */    disabledDatesText : 'Disabled',    //</locale><span id='Ext-picker-Date-cfg-monthNames'>    /**</span>     * @cfg {String[]} monthNames     * An array of textual month names which can be overriden for localization support (defaults to Ext.Date.monthNames)     */<span id='Ext-picker-Date-cfg-dayNames'>    /**</span>     * @cfg {String[]} dayNames     * An array of textual day names which can be overriden for localization support (defaults to Ext.Date.dayNames)     */    //<locale><span id='Ext-picker-Date-cfg-nextText'>    /**</span>     * @cfg {String} nextText     * The next month navigation button tooltip     */    nextText : 'Next Month (Control+Right)',    //</locale>    //<locale><span id='Ext-picker-Date-cfg-prevText'>    /**</span>     * @cfg {String} prevText     * The previous month navigation button tooltip     */    prevText : 'Previous Month (Control+Left)',    //</locale>    //<locale><span id='Ext-picker-Date-cfg-monthYearText'>    /**</span>     * @cfg {String} monthYearText     * The header month selector tooltip     */    monthYearText : 'Choose a month (Control+Up/Down to move years)',    //</locale>        //<locale><span id='Ext-picker-Date-cfg-monthYearFormat'>    /**</span>     * @cfg {String} monthYearFormat     * The date format for the header month     */    monthYearFormat: 'F Y',    //</locale>    //<locale><span id='Ext-picker-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>    //<locale><span id='Ext-picker-Date-cfg-showToday'>    /**</span>     * @cfg {Boolean} showToday     * False to hide the footer area containing the Today button and disable the keyboard handler for spacebar that     * selects the current date.     */    showToday : true,    //</locale><span id='Ext-picker-Date-cfg-minDate'>    /**</span>     * @cfg {Date} [minDate=null]     * Minimum allowable date (JavaScript date object)     */<span id='Ext-picker-Date-cfg-maxDate'>    /**</span>     * @cfg {Date} [maxDate=null]     * Maximum allowable date (JavaScript date object)     */<span id='Ext-picker-Date-cfg-disabledDays'>    /**</span>     * @cfg {Number[]} [disabledDays=null]     * An array of days to disable, 0-based. For example, [0, 6] disables Sunday and Saturday.     */<span id='Ext-picker-Date-cfg-disabledDatesRE'>    /**</span>     * @cfg {RegExp} [disabledDatesRE=null]     * JavaScript regular expression used to disable a pattern of dates. The {@link #disabledDates}     * config will generate this regex internally, but if you specify disabledDatesRE it will take precedence over the     * disabledDates value.     */<span id='Ext-picker-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:     *     *   - ['03/08/2003', '09/16/2003'] would disable those exact dates     *   - ['03/08', '09/16'] would disable those days for every year     *   - ['^03/08'] would only match the beginning (useful if you are using short years)     *   - ['03/../2006'] would disable every day in March 2006     *   - ['^03'] would disable every day in every March     *     * 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 date format that has '.' in it, you will have to escape the     * dot when restricting dates. For example: ['03\\.08\\.03'].     */<span id='Ext-picker-Date-cfg-disableAnim'>    /**</span>     * @cfg {Boolean} disableAnim     * True to disable animations when showing the month picker.     */    disableAnim: false,<span id='Ext-picker-Date-cfg-baseCls'>    /**</span>     * @cfg {String} [baseCls='x-datepicker']     * The base CSS class to apply to this components element.     */    baseCls: Ext.baseCSSPrefix + 'datepicker',<span id='Ext-picker-Date-cfg-selectedCls'>    /**</span>     * @cfg {String} [selectedCls='x-datepicker-selected']     * The class to apply to the selected cell.     */<span id='Ext-picker-Date-cfg-disabledCellCls'>    /**</span>     * @cfg {String} [disabledCellCls='x-datepicker-disabled']     * The class to apply to disabled cells.     */    //<locale><span id='Ext-picker-Date-cfg-longDayFormat'>    /**</span>     * @cfg {String} longDayFormat     * The format for displaying a date in a longer format.     */    longDayFormat: 'F d, Y',    //</locale><span id='Ext-picker-Date-cfg-keyNavConfig'>    /**</span>     * @cfg {Object} keyNavConfig     * Specifies optional custom key event handlers for the {@link Ext.util.KeyNav} attached to this date picker. Must     * conform to the config format recognized by the {@link Ext.util.KeyNav} constructor. Handlers specified in this     * object will replace default handlers of the same name.     */<span id='Ext-picker-Date-cfg-focusOnShow'>    /**</span>     * @cfg {Boolean} focusOnShow     * True to automatically focus the picker on show.     */    focusOnShow: false,    // private    // Set by other components to stop the picker focus being updated when the value changes.    focusOnSelect: true,    width: 178,    // default value used to initialise each date in the DatePicker    // (note: 12 noon was chosen because it steers well clear of all DST timezone changes)    initHour: 12, // 24-hour format    numDays: 42,    // private, inherit docs    initComponent : function() {        var me = this,            clearTime = Ext.Date.clearTime;        me.selectedCls = me.baseCls + '-selected';        me.disabledCellCls = me.baseCls + '-disabled';        me.prevCls = me.baseCls + '-prevday';        me.activeCls = me.baseCls + '-active';        me.nextCls = me.baseCls + '-prevday';        me.todayCls = me.baseCls + '-today';        me.dayNames = me.dayNames.slice(me.startDay).concat(me.dayNames.slice(0, me.startDay));        me.listeners = Ext.apply(me.listeners||{}, {            mousewheel: {                element: 'eventEl',                fn: me.handleMouseWheel,                scope: me            },            click: {                element: 'eventEl',                fn: me.handleDateClick,                 scope: me,                delegate: 'a.' + me.baseCls + '-date'            }        });        this.callParent();        me.value = me.value ?                 clearTime(me.value, true) : clearTime(new Date());        me.addEvents(<span id='Ext-picker-Date-event-select'>            /**</span>             * @event select             * Fires when a date is selected             * @param {Ext.picker.Date} this DatePicker             * @param {Date} date The selected date             */            'select'        );        me.initDisabledDays();    },    beforeRender: function () {        /*         * days array for looping through 6 full weeks (6 weeks * 7 days)         * Note that we explicitly force the size here so the template creates         * all the appropriate cells.         */        var me = this,            days = new Array(me.numDays),            today = Ext.Date.format(new Date(), me.format);        // If there's a Menu among our ancestors, then add the menu class.        // This is so that the MenuManager does not see a mousedown in this Component as a document mousedown, outside the Menu        if (me.up('menu')) {            me.addCls(Ext.baseCSSPrefix + 'menu');        }        me.monthBtn = new Ext.button.Split({            ownerCt: me,            ownerLayout: me.getComponentLayout(),            text: '',            tooltip: me.monthYearText,            listeners: {                click: me.showMonthPicker,                arrowclick: me.showMonthPicker,                scope: me            }        });        if (this.showToday) {            me.todayBtn = new Ext.button.Button({                ownerCt: me,                ownerLayout: me.getComponentLayout(),                text: Ext.String.format(me.todayText, today),                tooltip: Ext.String.format(me.todayTip, today),                tooltipType: 'title',                handler: me.selectToday,                scope: me            });        }        me.callParent();        Ext.applyIf(me, {            renderData: {}        });        Ext.apply(me.renderData, {            dayNames: me.dayNames,            showToday: me.showToday,            prevText: me.prevText,            nextText: me.nextText,            days: days        });    },    // Do the job of a container layout at this point even though we are not a Container.    // TODO: Refactor as a Container.    finishRenderChildren: function () {        var me = this;                me.callParent();        me.monthBtn.finishRender();        if (me.showToday) {            me.todayBtn.finishRender();        }    },    // private, inherit docs    onRender : function(container, position){        var me = this;        me.callParent(arguments);        me.el.unselectable();        me.cells = me.eventEl.select('tbody td');        me.textNodes = me.eventEl.query('tbody td span');    },    // private, inherit docs    initEvents: function(){        var me = this,            eDate = Ext.Date,            day = eDate.DAY;        me.callParent();        me.prevRepeater = new Ext.util.ClickRepeater(me.prevEl, {            handler: me.showPrevMonth,            scope: me,            preventDefault: true,            stopDefault: true        });        me.nextRepeater = new Ext.util.ClickRepeater(me.nextEl, {            handler: me.showNextMonth,            scope: me,            preventDefault:true,            stopDefault:true        });        me.keyNav = new Ext.util.KeyNav(me.eventEl, Ext.apply({            scope: me,            left : function(e){                if(e.ctrlKey){                    me.showPrevMonth();                }else{                    me.update(eDate.add(me.activeDate, day, -1));                }            },            right : function(e){                if(e.ctrlKey){                    me.showNextMonth();                }else{                    me.update(eDate.add(me.activeDate, day, 1));                }            },            up : function(e){                if(e.ctrlKey){                    me.showNextYear();                }else{                    me.update(eDate.add(me.activeDate, day, -7));                }            },            down : function(e){                if(e.ctrlKey){                    me.showPrevYear();                }else{                    me.update(eDate.add(me.activeDate, day, 7));                }            },            pageUp : me.showNextMonth,            pageDown : me.showPrevMonth,            enter : function(e){                e.stopPropagation();                return true;            }        }, me.keyNavConfig));        if (me.showToday) {            me.todayKeyListener = me.eventEl.addKeyListener(Ext.EventObject.SPACE, me.selectToday,  me);        }        me.update(me.value);    },<span id='Ext-picker-Date-method-initDisabledDays'>    /**</span>     * Setup the disabled dates regex based on config options     * @private     */    initDisabledDays : function(){        var me = this,            dd = me.disabledDates,            re = '(?:',            len,            d, dLen, dI;        if(!me.disabledDatesRE && dd){                len = dd.length - 1;            dLen = dd.length;            for (d = 0; d < dLen; d++) {                dI = dd[d];                re += Ext.isDate(dI) ? '^' + Ext.String.escapeRegex(Ext.Date.dateFormat(dI, me.format)) + '$' : dI;                if (d != len) {                    re += '|';                }            }            me.disabledDatesRE = new RegExp(re + ')');        }    },<span id='Ext-picker-Date-method-setDisabledDates'>    /**</span>     * Replaces any existing disabled dates with new values and refreshes the DatePicker.     * @param {String[]/RegExp} disabledDates An array of date strings (see the {@link #disabledDates} config for     * details on supported values), or a JavaScript regular expression used to disable a pattern of dates.     * @return {Ext.picker.Date} this     */    setDisabledDates : function(dd){        var me = this;        if(Ext.isArray(dd)){            me.disabledDates = dd;            me.disabledDatesRE = null;        }else{            me.disabledDatesRE = dd;        }        me.initDisabledDays();        me.update(me.value, true);        return me;    },<span id='Ext-picker-Date-method-setDisabledDays'>    /**</span>     * Replaces any existing disabled days (by index, 0-6) with new values and refreshes the DatePicker.     * @param {Number[]} disabledDays An array of disabled day indexes. See the {@link #disabledDays} config for details     * on supported values.     * @return {Ext.picker.Date} this     */    setDisabledDays : function(dd){        this.disabledDays = dd;        return this.update(this.value, true);    },<span id='Ext-picker-Date-method-setMinDate'>    /**</span>     * Replaces any existing {@link #minDate} with the new value and refreshes the DatePicker.     * @param {Date} value The minimum date that can be selected     * @return {Ext.picker.Date} this     */    setMinDate : function(dt){        this.minDate = dt;        return this.update(this.value, true);    },<span id='Ext-picker-Date-method-setMaxDate'>    /**</span>     * Replaces any existing {@link #maxDate} with the new value and refreshes the DatePicker.     * @param {Date} value The maximum date that can be selected     * @return {Ext.picker.Date} this     */    setMaxDate : function(dt){        this.maxDate = dt;        return this.update(this.value, true);    },<span id='Ext-picker-Date-method-setValue'>    /**</span>     * Sets the value of the date field     * @param {Date} value The date to set     * @return {Ext.picker.Date} this     */    setValue : function(value){        this.value = Ext.Date.clearTime(value, true);        return this.update(this.value);    },<span id='Ext-picker-Date-method-getValue'>    /**</span>     * Gets the current selected value of the date field     * @return {Date} The selected date     */    getValue : function(){        return this.value;    },    //<locale type="function"><span id='Ext-picker-Date-method-getDayInitial'>    /**</span>     * Gets a single character to represent the day of the week     * @return {String} The character     */    getDayInitial: function(value){        return value.substr(0,1);    },    //</locale>    // private    focus : function(){        this.update(this.activeDate);    },    // private, inherit docs    onEnable: function(){        this.callParent();        this.setDisabledStatus(false);        this.update(this.activeDate);    },    // private, inherit docs    onDisable : function(){        this.callParent();        this.setDisabledStatus(true);    },<span id='Ext-picker-Date-method-setDisabledStatus'>    /**</span>     * Set the disabled state of various internal components     * @private     * @param {Boolean} disabled     */    setDisabledStatus : function(disabled){        var me = this;        me.keyNav.setDisabled(disabled);        me.prevRepeater.setDisabled(disabled);        me.nextRepeater.setDisabled(disabled);        if (me.showToday) {            me.todayKeyListener.setDisabled(disabled);            me.todayBtn.setDisabled(disabled);        }    },<span id='Ext-picker-Date-method-getActive'>    /**</span>     * Get the current active date.     * @private     * @return {Date} The active date     */    getActive: function(){        return this.activeDate || this.value;    },<span id='Ext-picker-Date-method-runAnimation'>    /**</span>     * Run any animation required to hide/show the month picker.     * @private     * @param {Boolean} isHide True if it's a hide operation     */    runAnimation: function(isHide){        var picker = this.monthPicker,            options = {                duration: 200,                callback: function(){                    if (isHide) {                        picker.hide();                    } else {                        picker.show();                    }                }            };        if (isHide) {            picker.el.slideOut('t', options);        } else {            picker.el.slideIn('t', options);        }    },<span id='Ext-picker-Date-method-hideMonthPicker'>    /**</span>     * Hides the month picker, if it's visible.     * @param {Boolean} [animate] Indicates whether to animate this action. If the animate     * parameter is not specified, the behavior will use {@link #disableAnim} to determine     * whether to animate or not.     * @return {Ext.picker.Date} this     */    hideMonthPicker : function(animate){        var me = this,            picker = me.monthPicker;        if (picker) {            if (me.shouldAnimate(animate)) {                me.runAnimation(true);            } else {                picker.hide();            }        }        return me;    },<span id='Ext-picker-Date-method-showMonthPicker'>    /**</span>     * Show the month picker     * @param {Boolean} [animate] Indicates whether to animate this action. If the animate     * parameter is not specified, the behavior will use {@link #disableAnim} to determine     * whether to animate or not.     * @return {Ext.picker.Date} this     */    showMonthPicker : function(animate){        var me = this,            picker;                if (me.rendered && !me.disabled) {            picker = me.createMonthPicker();            picker.setValue(me.getActive());            picker.setSize(me.getSize());            picker.setPosition(-1, -1);            if (me.shouldAnimate(animate)) {                me.runAnimation(false);            } else {                picker.show();            }        }        return me;    },    <span id='Ext-picker-Date-method-shouldAnimate'>    /**</span>     * Checks whether a hide/show action should animate     * @private     * @param {Boolean} [animate] A possible animation value     * @return {Boolean} Whether to animate the action     */    shouldAnimate: function(animate){        return Ext.isDefined(animate) ? animate : !this.disableAnim;    },<span id='Ext-picker-Date-method-createMonthPicker'>    /**</span>     * Create the month picker instance     * @private     * @return {Ext.picker.Month} picker     */    createMonthPicker: function(){        var me = this,            picker = me.monthPicker;        if (!picker) {            me.monthPicker = picker = new Ext.picker.Month({                renderTo: me.el,                floating: true,                shadow: false,                small: me.showToday === false,                listeners: {                    scope: me,                    cancelclick: me.onCancelClick,                    okclick: me.onOkClick,                    yeardblclick: me.onOkClick,                    monthdblclick: me.onOkClick                }            });            if (!me.disableAnim) {                // hide the element if we're animating to prevent an initial flicker                picker.el.setStyle('display', 'none');            }            me.on('beforehide', Ext.Function.bind(me.hideMonthPicker, me, [false]));        }        return picker;    },<span id='Ext-picker-Date-method-onOkClick'>    /**</span>     * Respond to an ok click on the month picker     * @private     */    onOkClick: function(picker, value){        var me = this,            month = value[0],            year = value[1],            date = new Date(year, month, me.getActive().getDate());        if (date.getMonth() !== month) {            // 'fix' the JS rolling date conversion if needed            date = Ext.Date.getLastDateOfMonth(new Date(year, month, 1));        }        me.update(date);        me.hideMonthPicker();    },<span id='Ext-picker-Date-method-onCancelClick'>    /**</span>     * Respond to a cancel click on the month picker     * @private     */    onCancelClick: function(){        // update the selected value, also triggers a focus        this.selectedUpdate(this.activeDate);        this.hideMonthPicker();    },<span id='Ext-picker-Date-method-showPrevMonth'>    /**</span>     * Show the previous month.     * @param {Object} e     * @return {Ext.picker.Date} this     */    showPrevMonth : function(e){        return this.update(Ext.Date.add(this.activeDate, Ext.Date.MONTH, -1));    },<span id='Ext-picker-Date-method-showNextMonth'>    /**</span>     * Show the next month.     * @param {Object} e     * @return {Ext.picker.Date} this     */    showNextMonth : function(e){        return this.update(Ext.Date.add(this.activeDate, Ext.Date.MONTH, 1));    },<span id='Ext-picker-Date-method-showPrevYear'>    /**</span>     * Show the previous year.     * @return {Ext.picker.Date} this     */    showPrevYear : function(){        this.update(Ext.Date.add(this.activeDate, Ext.Date.YEAR, -1));    },<span id='Ext-picker-Date-method-showNextYear'>    /**</span>     * Show the next year.     * @return {Ext.picker.Date} this     */    showNextYear : function(){        this.update(Ext.Date.add(this.activeDate, Ext.Date.YEAR, 1));    },<span id='Ext-picker-Date-method-handleMouseWheel'>    /**</span>     * Respond to the mouse wheel event     * @private     * @param {Ext.EventObject} e     */    handleMouseWheel : function(e){        e.stopEvent();        if(!this.disabled){            var delta = e.getWheelDelta();            if(delta > 0){                this.showPrevMonth();            } else if(delta < 0){                this.showNextMonth();            }        }    },<span id='Ext-picker-Date-method-handleDateClick'>    /**</span>     * Respond to a date being clicked in the picker     * @private     * @param {Ext.EventObject} e     * @param {HTMLElement} t     */    handleDateClick : function(e, t){        var me = this,            handler = me.handler;        e.stopEvent();        if(!me.disabled && t.dateValue && !Ext.fly(t.parentNode).hasCls(me.disabledCellCls)){            me.doCancelFocus = me.focusOnSelect === false;            me.setValue(new Date(t.dateValue));            delete me.doCancelFocus;            me.fireEvent('select', me, me.value);            if (handler) {                handler.call(me.scope || me, me, me.value);            }            // event handling is turned off on hide            // when we are using the picker in a field            // therefore onSelect comes AFTER the select            // event.            me.onSelect();        }    },<span id='Ext-picker-Date-method-onSelect'>    /**</span>     * Perform any post-select actions     * @private     */    onSelect: function() {        if (this.hideOnSelect) {             this.hide();         }    },<span id='Ext-picker-Date-method-selectToday'>    /**</span>     * Sets the current value to today.     * @return {Ext.picker.Date} this     */    selectToday : function(){        var me = this,            btn = me.todayBtn,            handler = me.handler;        if(btn && !btn.disabled){            me.setValue(Ext.Date.clearTime(new Date()));            me.fireEvent('select', me, me.value);            if (handler) {                handler.call(me.scope || me, me, me.value);            }            me.onSelect();        }        return me;    },<span id='Ext-picker-Date-method-selectedUpdate'>    /**</span>     * Update the selected cell     * @private     * @param {Date} date The new date     */    selectedUpdate: function(date){        var me        = this,            t         = date.getTime(),            cells     = me.cells,            cls       = me.selectedCls,            cellItems = cells.elements,            c,            cLen      = cellItems.length,            cell;        cells.removeCls(cls);        for (c = 0; c < cLen; c++) {            cell = Ext.fly(cellItems[c]);            if (cell.dom.firstChild.dateValue == t) {                me.fireEvent('highlightitem', me, cell);                cell.addCls(cls);                if(me.isVisible() && !me.doCancelFocus){                    Ext.fly(cell.dom.firstChild).focus(50);                }                break;            }        }    },<span id='Ext-picker-Date-method-fullUpdate'>    /**</span>     * Update the contents of the picker for a new month     * @private     * @param {Date} date The new date     */    fullUpdate: function(date){        var me = this,            cells = me.cells.elements,            textNodes = me.textNodes,            disabledCls = me.disabledCellCls,            eDate = Ext.Date,            i = 0,            extraDays = 0,            visible = me.isVisible(),            sel = +eDate.clearTime(date, true),            today = +eDate.clearTime(new Date()),            min = me.minDate ? eDate.clearTime(me.minDate, true) : Number.NEGATIVE_INFINITY,            max = me.maxDate ? eDate.clearTime(me.maxDate, true) : Number.POSITIVE_INFINITY,            ddMatch = me.disabledDatesRE,            ddText = me.disabledDatesText,            ddays = me.disabledDays ? me.disabledDays.join('') : false,            ddaysText = me.disabledDaysText,            format = me.format,            days = eDate.getDaysInMonth(date),            firstOfMonth = eDate.getFirstDateOfMonth(date),            startingPos = firstOfMonth.getDay() - me.startDay,            previousMonth = eDate.add(date, eDate.MONTH, -1),            longDayFormat = me.longDayFormat,            prevStart,            current,            disableToday,            tempDate,            setCellClass,            html,            cls,            formatValue,            value;        if (startingPos < 0) {            startingPos += 7;        }        days += startingPos;        prevStart = eDate.getDaysInMonth(previousMonth) - startingPos;        current = new Date(previousMonth.getFullYear(), previousMonth.getMonth(), prevStart, me.initHour);        if (me.showToday) {            tempDate = eDate.clearTime(new Date());            disableToday = (tempDate < min || tempDate > max ||                (ddMatch && format && ddMatch.test(eDate.dateFormat(tempDate, format))) ||                (ddays && ddays.indexOf(tempDate.getDay()) != -1));            if (!me.disabled) {                me.todayBtn.setDisabled(disableToday);                me.todayKeyListener.setDisabled(disableToday);            }        }        setCellClass = function(cell){            value = +eDate.clearTime(current, true);            cell.title = eDate.format(current, longDayFormat);            // store dateValue number as an expando            cell.firstChild.dateValue = value;            if(value == today){                cell.className += ' ' + me.todayCls;                cell.title = me.todayText;            }            if(value == sel){                cell.className += ' ' + me.selectedCls;                me.fireEvent('highlightitem', me, cell);                if (visible && me.floating) {                    Ext.fly(cell.firstChild).focus(50);                }            }            // disabling            if(value < min) {                cell.className = disabledCls;                cell.title = me.minText;                return;            }            if(value > max) {                cell.className = disabledCls;                cell.title = me.maxText;                return;            }            if(ddays){                if(ddays.indexOf(current.getDay()) != -1){                    cell.title = ddaysText;                    cell.className = disabledCls;                }            }            if(ddMatch && format){                formatValue = eDate.dateFormat(current, format);                if(ddMatch.test(formatValue)){                    cell.title = ddText.replace('%0', formatValue);                    cell.className = disabledCls;                }            }        };        for(; i < me.numDays; ++i) {            if (i < startingPos) {                html = (++prevStart);                cls = me.prevCls;            } else if (i >= days) {                html = (++extraDays);                cls = me.nextCls;            } else {                html = i - startingPos + 1;                cls = me.activeCls;            }            textNodes[i].innerHTML = html;            cells[i].className = cls;            current.setDate(current.getDate() + 1);            setCellClass(cells[i]);        }        me.monthBtn.setText(Ext.Date.format(date, me.monthYearFormat));    },<span id='Ext-picker-Date-method-update'>    /**</span>     * Update the contents of the picker     * @private     * @param {Date} date The new date     * @param {Boolean} forceRefresh True to force a full refresh     */    update : function(date, forceRefresh){        var me = this,            active = me.activeDate;        if (me.rendered) {            me.activeDate = date;            if(!forceRefresh && active && me.el && active.getMonth() == date.getMonth() && active.getFullYear() == date.getFullYear()){                me.selectedUpdate(date, active);            } else {                me.fullUpdate(date, active);            }            me.innerEl.dom.title = Ext.String.format(me.ariaTitle, Ext.Date.format(me.activeDate, me.ariaTitleDateFormat));        }        return me;    },    // private, inherit docs    beforeDestroy : function() {        var me = this;        if (me.rendered) {            Ext.destroy(                me.todayKeyListener,                me.keyNav,                me.monthPicker,                me.monthBtn,                me.nextRepeater,                me.prevRepeater,                me.todayBtn            );            delete me.textNodes;            delete me.cells.elements;        }        me.callParent();    },    // private, inherit docs    onShow: function() {        this.callParent(arguments);        if (this.focusOnShow) {            this.focus();        }    }},// After dependencies have loaded:function() {    var proto = this.prototype,        date = Ext.Date;    proto.monthNames = date.monthNames;    proto.dayNames   = date.dayNames;    proto.format     = date.defaultFormat;});</pre></body></html>
 |