Upgrade to ExtJS 3.0.3 - Released 10/11/2009
[extjs.git] / src / widgets / DatePicker.js
index 86fbb5d..e3c3b3f 100644 (file)
@@ -1,5 +1,5 @@
 /*!
 /*!
- * Ext JS Library 3.0.0
+ * Ext JS Library 3.0.3
  * Copyright(c) 2006-2009 Ext JS, LLC
  * licensing@extjs.com
  * http://www.extjs.com/license
  * Copyright(c) 2006-2009 Ext JS, LLC
  * licensing@extjs.com
  * http://www.extjs.com/license
@@ -29,6 +29,19 @@ Ext.DatePicker = Ext.extend(Ext.BoxComponent, {
      * The text to display on the cancel button (defaults to <tt>'Cancel'</tt>)\r
      */\r
     cancelText : 'Cancel',\r
      * The text to display on the cancel button (defaults to <tt>'Cancel'</tt>)\r
      */\r
     cancelText : 'Cancel',\r
+    /**\r
+     * @cfg {Function} handler\r
+     * Optional. A function that will handle the select event of this picker.\r
+     * The handler is passed the following parameters:<div class="mdetail-params"><ul>\r
+     * <li><code>picker</code> : DatePicker<div class="sub-desc">The Ext.DatePicker.</div></li>\r
+     * <li><code>date</code> : Date<div class="sub-desc">The selected date.</div></li>\r
+     * </ul></div>\r
+     */\r
+    /**\r
+     * @cfg {Object} scope\r
+     * The scope (<tt><b>this</b></tt> reference) in which the <code>{@link #handler}</code>\r
+     * function will be called.  Defaults to this DatePicker instance.\r
+     */ \r
     /**\r
      * @cfg {String} todayTip\r
      * The tooltip to display for the button that selects the current date (defaults to <tt>'{current date} (Spacebar)'</tt>)\r
     /**\r
      * @cfg {String} todayTip\r
      * The tooltip to display for the button that selects the current date (defaults to <tt>'{current date} (Spacebar)'</tt>)\r
@@ -135,7 +148,7 @@ Ext.DatePicker = Ext.extend(Ext.BoxComponent, {
         Ext.DatePicker.superclass.initComponent.call(this);\r
 \r
         this.value = this.value ?\r
         Ext.DatePicker.superclass.initComponent.call(this);\r
 \r
         this.value = this.value ?\r
-                 this.value.clearTime() : new Date().clearTime();\r
+                 this.value.clearTime(true) : new Date().clearTime();\r
 \r
         this.addEvents(\r
             /**\r
 \r
         this.addEvents(\r
             /**\r
@@ -220,11 +233,8 @@ Ext.DatePicker = Ext.extend(Ext.BoxComponent, {
      * @param {Date} value The date to set\r
      */\r
     setValue : function(value){\r
      * @param {Date} value The date to set\r
      */\r
     setValue : function(value){\r
-        var old = this.value;\r
         this.value = value.clearTime(true);\r
         this.value = value.clearTime(true);\r
-        if(this.el){\r
-            this.update(this.value);\r
-        }\r
+        this.update(this.value);\r
     },\r
 \r
     /**\r
     },\r
 \r
     /**\r
@@ -237,9 +247,7 @@ Ext.DatePicker = Ext.extend(Ext.BoxComponent, {
 \r
     // private\r
     focus : function(){\r
 \r
     // private\r
     focus : function(){\r
-        if(this.el){\r
-            this.update(this.activeDate);\r
-        }\r
+        this.update(this.activeDate);\r
     },\r
     \r
     // private\r
     },\r
     \r
     // private\r
@@ -254,7 +262,7 @@ Ext.DatePicker = Ext.extend(Ext.BoxComponent, {
     },\r
     \r
     // private\r
     },\r
     \r
     // private\r
-    onDisable: function(){\r
+    onDisable : function(){\r
         Ext.DatePicker.superclass.onDisable.call(this);   \r
         this.doDisabled(true);\r
         if(Ext.isIE && !Ext.isIE8){\r
         Ext.DatePicker.superclass.onDisable.call(this);   \r
         this.doDisabled(true);\r
         if(Ext.isIE && !Ext.isIE8){\r
@@ -269,7 +277,7 @@ Ext.DatePicker = Ext.extend(Ext.BoxComponent, {
     },\r
     \r
     // private\r
     },\r
     \r
     // private\r
-    doDisabled: function(disabled){\r
+    doDisabled : function(disabled){\r
         this.keyNav.setDisabled(disabled);\r
         this.prevRepeater.setDisabled(disabled);\r
         this.nextRepeater.setDisabled(disabled);\r
         this.keyNav.setDisabled(disabled);\r
         this.prevRepeater.setDisabled(disabled);\r
         this.nextRepeater.setDisabled(disabled);\r
@@ -608,142 +616,142 @@ Ext.DatePicker = Ext.extend(Ext.BoxComponent, {
 \r
     // private\r
     update : function(date, forceRefresh){\r
 \r
     // private\r
     update : function(date, forceRefresh){\r
-        var vd = this.activeDate, vis = this.isVisible();\r
-        this.activeDate = date;\r
-        if(!forceRefresh && vd && this.el){\r
-            var t = date.getTime();\r
-            if(vd.getMonth() == date.getMonth() && vd.getFullYear() == date.getFullYear()){\r
-                this.cells.removeClass('x-date-selected');\r
-                this.cells.each(function(c){\r
-                   if(c.dom.firstChild.dateValue == t){\r
-                       c.addClass('x-date-selected');\r
-                       if(vis){\r
-                           Ext.fly(c.dom.firstChild).focus(50);\r
-                       }\r
-                       return false;\r
-                   }\r
-                });\r
-                return;\r
-            }\r
-        }\r
-        var days = date.getDaysInMonth();\r
-        var firstOfMonth = date.getFirstDateOfMonth();\r
-        var startingPos = firstOfMonth.getDay()-this.startDay;\r
-\r
-        if(startingPos <= this.startDay){\r
-            startingPos += 7;\r
-        }\r
-\r
-        var pm = date.add('mo', -1);\r
-        var prevStart = pm.getDaysInMonth()-startingPos;\r
-\r
-        var cells = this.cells.elements;\r
-        var textEls = this.textNodes;\r
-        days += startingPos;\r
-\r
-        // convert everything to numbers so it's fast\r
-        var day = 86400000;\r
-        var d = (new Date(pm.getFullYear(), pm.getMonth(), prevStart)).clearTime();\r
-        var today = new Date().clearTime().getTime();\r
-        var sel = date.clearTime().getTime();\r
-        var min = this.minDate ? this.minDate.clearTime() : Number.NEGATIVE_INFINITY;\r
-        var max = this.maxDate ? this.maxDate.clearTime() : Number.POSITIVE_INFINITY;\r
-        var ddMatch = this.disabledDatesRE;\r
-        var ddText = this.disabledDatesText;\r
-        var ddays = this.disabledDays ? this.disabledDays.join('') : false;\r
-        var ddaysText = this.disabledDaysText;\r
-        var format = this.format;\r
-\r
-        if(this.showToday){\r
-            var td = new Date().clearTime();\r
-            var disable = (td < min || td > max ||\r
-                (ddMatch && format && ddMatch.test(td.dateFormat(format))) ||\r
-                (ddays && ddays.indexOf(td.getDay()) != -1));\r
-\r
-            if(!this.disabled){\r
-                this.todayBtn.setDisabled(disable);\r
-                this.todayKeyListener[disable ? 'disable' : 'enable']();\r
-            }\r
-        }\r
-\r
-        var setCellClass = function(cal, cell){\r
-            cell.title = '';\r
-            var t = d.getTime();\r
-            cell.firstChild.dateValue = t;\r
-            if(t == today){\r
-                cell.className += ' x-date-today';\r
-                cell.title = cal.todayText;\r
-            }\r
-            if(t == sel){\r
-                cell.className += ' x-date-selected';\r
-                if(vis){\r
-                    Ext.fly(cell.firstChild).focus(50);\r
-                }\r
-            }\r
-            // disabling\r
-            if(t < min) {\r
-                cell.className = ' x-date-disabled';\r
-                cell.title = cal.minText;\r
-                return;\r
-            }\r
-            if(t > max) {\r
-                cell.className = ' x-date-disabled';\r
-                cell.title = cal.maxText;\r
-                return;\r
-            }\r
-            if(ddays){\r
-                if(ddays.indexOf(d.getDay()) != -1){\r
-                    cell.title = ddaysText;\r
-                    cell.className = ' x-date-disabled';\r
-                }\r
-            }\r
-            if(ddMatch && format){\r
-                var fvalue = d.dateFormat(format);\r
-                if(ddMatch.test(fvalue)){\r
-                    cell.title = ddText.replace('%0', fvalue);\r
-                    cell.className = ' x-date-disabled';\r
-                }\r
-            }\r
-        };\r
-\r
-        var i = 0;\r
-        for(; i < startingPos; i++) {\r
-            textEls[i].innerHTML = (++prevStart);\r
-            d.setDate(d.getDate()+1);\r
-            cells[i].className = 'x-date-prevday';\r
-            setCellClass(this, cells[i]);\r
-        }\r
-        for(; i < days; i++){\r
-            var intDay = i - startingPos + 1;\r
-            textEls[i].innerHTML = (intDay);\r
-            d.setDate(d.getDate()+1);\r
-            cells[i].className = 'x-date-active';\r
-            setCellClass(this, cells[i]);\r
-        }\r
-        var extraDays = 0;\r
-        for(; i < 42; i++) {\r
-             textEls[i].innerHTML = (++extraDays);\r
-             d.setDate(d.getDate()+1);\r
-             cells[i].className = 'x-date-nextday';\r
-             setCellClass(this, cells[i]);\r
-        }\r
-\r
-        this.mbtn.setText(this.monthNames[date.getMonth()] + ' ' + date.getFullYear());\r
-\r
-        if(!this.internalRender){\r
-            var main = this.el.dom.firstChild;\r
-            var w = main.offsetWidth;\r
-            this.el.setWidth(w + this.el.getBorderWidth('lr'));\r
-            Ext.fly(main).setWidth(w);\r
-            this.internalRender = true;\r
-            // opera does not respect the auto grow header center column\r
-            // then, after it gets a width opera refuses to recalculate\r
-            // without a second pass\r
-            if(Ext.isOpera && !this.secondPass){\r
-                main.rows[0].cells[1].style.width = (w - (main.rows[0].cells[0].offsetWidth+main.rows[0].cells[2].offsetWidth)) + 'px';\r
-                this.secondPass = true;\r
-                this.update.defer(10, this, [date]);\r
-            }\r
+        if(this.rendered){\r
+               var vd = this.activeDate, vis = this.isVisible();\r
+               this.activeDate = date;\r
+               if(!forceRefresh && vd && this.el){\r
+                   var t = date.getTime();\r
+                   if(vd.getMonth() == date.getMonth() && vd.getFullYear() == date.getFullYear()){\r
+                       this.cells.removeClass('x-date-selected');\r
+                       this.cells.each(function(c){\r
+                          if(c.dom.firstChild.dateValue == t){\r
+                              c.addClass('x-date-selected');\r
+                              if(vis){\r
+                                  Ext.fly(c.dom.firstChild).focus(50);\r
+                              }\r
+                              return false;\r
+                          }\r
+                       });\r
+                       return;\r
+                   }\r
+               }\r
+               var days = date.getDaysInMonth(),\r
+                   firstOfMonth = date.getFirstDateOfMonth(),\r
+                   startingPos = firstOfMonth.getDay()-this.startDay;\r
+       \r
+               if(startingPos < 0){\r
+                   startingPos += 7;\r
+               }\r
+               days += startingPos;\r
+       \r
+               var pm = date.add('mo', -1),\r
+                   prevStart = pm.getDaysInMonth()-startingPos,\r
+                   cells = this.cells.elements,\r
+                   textEls = this.textNodes,\r
+                   // convert everything to numbers so it's fast\r
+                   day = 86400000,\r
+                   d = (new Date(pm.getFullYear(), pm.getMonth(), prevStart)).clearTime(),\r
+                   today = new Date().clearTime().getTime(),\r
+                   sel = date.clearTime(true).getTime(),\r
+                   min = this.minDate ? this.minDate.clearTime(true) : Number.NEGATIVE_INFINITY,\r
+                   max = this.maxDate ? this.maxDate.clearTime(true) : Number.POSITIVE_INFINITY,\r
+                   ddMatch = this.disabledDatesRE,\r
+                   ddText = this.disabledDatesText,\r
+                   ddays = this.disabledDays ? this.disabledDays.join('') : false,\r
+                   ddaysText = this.disabledDaysText,\r
+                   format = this.format;\r
+       \r
+               if(this.showToday){\r
+                   var td = new Date().clearTime(),\r
+                       disable = (td < min || td > max ||\r
+                       (ddMatch && format && ddMatch.test(td.dateFormat(format))) ||\r
+                       (ddays && ddays.indexOf(td.getDay()) != -1));\r
+       \r
+                   if(!this.disabled){\r
+                       this.todayBtn.setDisabled(disable);\r
+                       this.todayKeyListener[disable ? 'disable' : 'enable']();\r
+                   }\r
+               }\r
+       \r
+               var setCellClass = function(cal, cell){\r
+                   cell.title = '';\r
+                   var t = d.getTime();\r
+                   cell.firstChild.dateValue = t;\r
+                   if(t == today){\r
+                       cell.className += ' x-date-today';\r
+                       cell.title = cal.todayText;\r
+                   }\r
+                   if(t == sel){\r
+                       cell.className += ' x-date-selected';\r
+                       if(vis){\r
+                           Ext.fly(cell.firstChild).focus(50);\r
+                       }\r
+                   }\r
+                   // disabling\r
+                   if(t < min) {\r
+                       cell.className = ' x-date-disabled';\r
+                       cell.title = cal.minText;\r
+                       return;\r
+                   }\r
+                   if(t > max) {\r
+                       cell.className = ' x-date-disabled';\r
+                       cell.title = cal.maxText;\r
+                       return;\r
+                   }\r
+                   if(ddays){\r
+                       if(ddays.indexOf(d.getDay()) != -1){\r
+                           cell.title = ddaysText;\r
+                           cell.className = ' x-date-disabled';\r
+                       }\r
+                   }\r
+                   if(ddMatch && format){\r
+                       var fvalue = d.dateFormat(format);\r
+                       if(ddMatch.test(fvalue)){\r
+                           cell.title = ddText.replace('%0', fvalue);\r
+                           cell.className = ' x-date-disabled';\r
+                       }\r
+                   }\r
+               };\r
+       \r
+               var i = 0;\r
+               for(; i < startingPos; i++) {\r
+                   textEls[i].innerHTML = (++prevStart);\r
+                   d.setDate(d.getDate()+1);\r
+                   cells[i].className = 'x-date-prevday';\r
+                   setCellClass(this, cells[i]);\r
+               }\r
+               for(; i < days; i++){\r
+                   var intDay = i - startingPos + 1;\r
+                   textEls[i].innerHTML = (intDay);\r
+                   d.setDate(d.getDate()+1);\r
+                   cells[i].className = 'x-date-active';\r
+                   setCellClass(this, cells[i]);\r
+               }\r
+               var extraDays = 0;\r
+               for(; i < 42; i++) {\r
+                    textEls[i].innerHTML = (++extraDays);\r
+                    d.setDate(d.getDate()+1);\r
+                    cells[i].className = 'x-date-nextday';\r
+                    setCellClass(this, cells[i]);\r
+               }\r
+       \r
+               this.mbtn.setText(this.monthNames[date.getMonth()] + ' ' + date.getFullYear());\r
+       \r
+               if(!this.internalRender){\r
+                   var main = this.el.dom.firstChild,\r
+                       w = main.offsetWidth;\r
+                   this.el.setWidth(w + this.el.getBorderWidth('lr'));\r
+                   Ext.fly(main).setWidth(w);\r
+                   this.internalRender = true;\r
+                   // opera does not respect the auto grow header center column\r
+                   // then, after it gets a width opera refuses to recalculate\r
+                   // without a second pass\r
+                   if(Ext.isOpera && !this.secondPass){\r
+                       main.rows[0].cells[1].style.width = (w - (main.rows[0].cells[0].offsetWidth+main.rows[0].cells[2].offsetWidth)) + 'px';\r
+                       this.secondPass = true;\r
+                       this.update.defer(10, this, [date]);\r
+                   }\r
+               }\r
         }\r
     },\r
 \r
         }\r
     },\r
 \r