1
1
/*
2
2
* Experimental datepicker rewrite to evaluate jquery-tmpl.
3
- *
3
+ *
4
4
* Based on Marc Grabanski's https://github.com/1Marc/jquery-ui-datepicker-lite
5
5
*/
6
6
( function ( $ , undefined ) {
7
7
8
+ var idIncrement = 0 ;
8
9
$ . widget ( "ui.datepicker" , {
9
10
options : {
10
11
eachDay : $ . noop ,
@@ -18,6 +19,8 @@ $.widget( "ui.datepicker", {
18
19
var self = this ;
19
20
this . date = $ . date ( ) ;
20
21
this . date . eachDay = this . options . eachDay ;
22
+ this . id = "ui-datepicker-" + idIncrement ;
23
+ idIncrement ++ ;
21
24
if ( this . element . is ( "input" ) ) {
22
25
self . _bind ( {
23
26
click : "open" ,
@@ -39,7 +42,7 @@ $.widget( "ui.datepicker", {
39
42
} ) ;
40
43
this . picker . delegate ( ".ui-datepicker-next" , "click" , function ( event ) {
41
44
event . preventDefault ( ) ;
42
- self . date . adjust ( "M" , + 1 )
45
+ self . date . adjust ( "M" , 1 ) ;
43
46
self . refresh ( ) ;
44
47
} ) ;
45
48
this . picker . delegate ( ".ui-datepicker-calendar a" , "click" , function ( event ) {
@@ -54,31 +57,100 @@ $.widget( "ui.datepicker", {
54
57
self . refresh ( ) ;
55
58
}
56
59
self . _trigger ( "select" , event , {
57
- date : self . date . format ( ) ,
60
+ date : self . date . format ( )
58
61
} ) ;
59
62
} ) ;
60
-
63
+
61
64
this . picker . delegate ( ".ui-datepicker-header a, .ui-datepicker-calendar a" , "mouseenter.datepicker mouseleave.datepicker" , function ( ) {
62
65
$ ( this ) . toggleClass ( "ui-state-hover" ) ;
63
66
} ) ;
64
-
67
+
68
+
69
+ this . picker . delegate ( ".ui-datepicker-calendar" , "keydown" , function ( event ) {
70
+ if ( jQuery . inArray ( event . keyCode , [ 13 , 33 , 34 , 35 , 36 , 37 , 38 , 39 , 40 ] ) == - 1 ) {
71
+ return ; //only interested navigation keys
72
+ }
73
+ var noDateChange = false ,
74
+ activeCell = $ ( "#" + self . grid . attr ( "aria-activedescendant" ) )
75
+ oldMonth = self . date . myMonth ( ) ;
76
+ oldYear = self . date . year ( ) ;
77
+
78
+ switch ( event . keyCode ) {
79
+ case 13 : // Enter
80
+ activeCell . children ( "a" ) . first ( ) . click ( ) ;
81
+ self . grid . focus ( 1 ) ;
82
+ return ;
83
+ break ;
84
+ case 33 : //PgUp
85
+ self . date . adjust ( event . ctrlKey || event . metaKey ? "Y" : "M" , 1 ) ;
86
+ break ;
87
+ case 34 : //PgDn
88
+ self . date . adjust ( event . ctrlKey || event . metaKey ? "Y" : "M" , - 1 ) ;
89
+ break ;
90
+ case 35 : //End
91
+ self . date . setDay ( self . date . daysInMonth ( ) ) ;
92
+ break ;
93
+ case 36 : //Home
94
+ self . date . setDay ( 1 ) ;
95
+ break ;
96
+ case 37 : //Left
97
+ self . date . adjust ( "D" , - 1 ) ;
98
+ break ;
99
+ case 38 : //Up
100
+ self . date . adjust ( "D" , - 7 ) ;
101
+ break ;
102
+ case 39 : //Right
103
+ self . date . adjust ( "D" , 1 ) ;
104
+ break ;
105
+ case 40 : //Down
106
+ self . date . adjust ( "D" , 7 ) ;
107
+ break ;
108
+ }
109
+
110
+ if ( self . date . myMonth ( ) != oldMonth || self . date . year ( ) != oldYear ) {
111
+ self . refresh ( ) ;
112
+ self . grid . focus ( 1 ) ;
113
+ }
114
+ else {
115
+ var newId = self . id + "-" + self . date . day ( ) ,
116
+
117
+ newCell = $ ( "#" + newId ) ;
118
+
119
+ if ( ! newCell . length ) {
120
+ return ;
121
+ }
122
+ self . grid . attr ( "aria-activedescendant" , newId ) ;
123
+
124
+ activeCell . children ( "a" ) . removeClass ( "ui-state-focus" ) ;
125
+ newCell . children ( "a" ) . addClass ( "ui-state-focus" ) ;
126
+ }
127
+ event . stopPropagation ( ) ;
128
+ event . preventDefault ( ) ;
129
+ } ) ;
130
+
65
131
this . refresh ( ) ;
66
132
} ,
67
133
refresh : function ( ) {
68
134
this . date . refresh ( ) ;
69
135
this . picker . empty ( ) ;
70
136
137
+ //determine which day gridcell to focus after refresh
138
+ //TODO: Prevent disabled cells from being focused
139
+ var focusedDay = this . date . day ( ) ;
140
+
71
141
$ ( this . options . tmpl ) . tmpl ( {
72
142
date : this . date ,
73
- labels : $ . global . localize ( "datepicker" )
143
+ labels : $ . global . localize ( "datepicker" ) ,
144
+ instance : { id : this . id , focusedDay : focusedDay }
74
145
} ) . appendTo ( this . picker )
75
146
. find ( "button" ) . button ( ) . end ( )
76
147
77
148
if ( this . inline ) {
78
149
this . picker . children ( ) . addClass ( "ui-datepicker-inline" ) ;
79
- }
150
+ }
80
151
// against display:none in datepicker.css
81
152
this . picker . find ( ".ui-datepicker" ) . css ( "display" , "block" ) ;
153
+ this . grid = this . picker . find ( ".ui-datepicker-calendar" ) ;
82
154
} ,
83
155
open : function ( event ) {
84
156
this . picker . fadeIn ( "fast" ) ;
0 commit comments