]> git.wh0rd.org - tt-rss.git/blob - lib/dijit/Calendar.js.uncompressed.js
update dojo to 1.7.3
[tt-rss.git] / lib / dijit / Calendar.js.uncompressed.js
1 define("dijit/Calendar", [
2 "dojo/_base/array", // array.map
3 "dojo/date",
4 "dojo/date/locale",
5 "dojo/_base/declare", // declare
6 "dojo/dom-attr", // domAttr.get
7 "dojo/dom-class", // domClass.add domClass.contains domClass.remove domClass.toggle
8 "dojo/_base/event", // event.stop
9 "dojo/_base/kernel", // kernel.deprecated
10 "dojo/keys", // keys
11 "dojo/_base/lang", // lang.hitch
12 "dojo/_base/sniff", // has("ie")
13 "./CalendarLite",
14 "./_Widget",
15 "./_CssStateMixin",
16 "./_TemplatedMixin",
17 "./form/DropDownButton",
18 "./hccss" // not used directly, but sets CSS class on <body>
19 ], function(array, date, local, declare, domAttr, domClass, event, kernel, keys, lang, has,
20 CalendarLite, _Widget, _CssStateMixin, _TemplatedMixin, DropDownButton){
21
22 /*=====
23 var CalendarLite = dijit.CalendarLite;
24 var _CssStateMixin = dijit._CssStateMixin;
25 var _Widget = dijit._Widget;
26 var _TemplatedMixin = dijit._TemplatedMixin;
27 var DropDownButton = dijit.form.DropDownButton;
28 =====*/
29
30 // module:
31 // dijit/Calendar
32 // summary:
33 // A simple GUI for choosing a date in the context of a monthly calendar.
34
35 var Calendar = declare("dijit.Calendar",
36 [CalendarLite, _Widget, _CssStateMixin], // _Widget for deprecated methods like setAttribute()
37 {
38 // summary:
39 // A simple GUI for choosing a date in the context of a monthly calendar.
40 //
41 // description:
42 // See CalendarLite for general description. Calendar extends CalendarLite, adding:
43 // - month drop down list
44 // - keyboard navigation
45 // - CSS classes for hover/mousepress on date, month, and year nodes
46 // - support of deprecated methods (will be removed in 2.0)
47
48 // Set node classes for various mouse events, see dijit._CssStateMixin for more details
49 cssStateNodes: {
50 "decrementMonth": "dijitCalendarArrow",
51 "incrementMonth": "dijitCalendarArrow",
52 "previousYearLabelNode": "dijitCalendarPreviousYear",
53 "nextYearLabelNode": "dijitCalendarNextYear"
54 },
55
56 setValue: function(/*Date*/ value){
57 // summary:
58 // Deprecated. Use set('value', ...) instead.
59 // tags:
60 // deprecated
61 kernel.deprecated("dijit.Calendar:setValue() is deprecated. Use set('value', ...) instead.", "", "2.0");
62 this.set('value', value);
63 },
64
65 _createMonthWidget: function(){
66 // summary:
67 // Creates the drop down button that displays the current month and lets user pick a new one
68
69 return new Calendar._MonthDropDownButton({
70 id: this.id + "_mddb",
71 tabIndex: -1,
72 onMonthSelect: lang.hitch(this, "_onMonthSelect"),
73 lang: this.lang,
74 dateLocaleModule: this.dateLocaleModule
75 }, this.monthNode);
76 },
77
78 buildRendering: function(){
79 this.inherited(arguments);
80
81 // Events specific to Calendar, not used in CalendarLite
82 this.connect(this.domNode, "onkeypress", "_onKeyPress");
83 this.connect(this.dateRowsNode, "onmouseover", "_onDayMouseOver");
84 this.connect(this.dateRowsNode, "onmouseout", "_onDayMouseOut");
85 this.connect(this.dateRowsNode, "onmousedown", "_onDayMouseDown");
86 this.connect(this.dateRowsNode, "onmouseup", "_onDayMouseUp");
87 },
88
89 _onMonthSelect: function(/*Number*/ newMonth){
90 // summary:
91 // Handler for when user selects a month from the drop down list
92 // tags:
93 // protected
94
95 // move to selected month, bounding by the number of days in the month
96 // (ex: dec 31 --> jan 28, not jan 31)
97 this._setCurrentFocusAttr(this.dateFuncObj.add(this.currentFocus, "month",
98 newMonth - this.currentFocus.getMonth()));
99 },
100
101 _onDayMouseOver: function(/*Event*/ evt){
102 // summary:
103 // Handler for mouse over events on days, sets hovered style
104 // tags:
105 // protected
106
107 // event can occur on <td> or the <span> inside the td,
108 // set node to the <td>.
109 var node =
110 domClass.contains(evt.target, "dijitCalendarDateLabel") ?
111 evt.target.parentNode :
112 evt.target;
113
114 if(node && (
115 (node.dijitDateValue && !domClass.contains(node, "dijitCalendarDisabledDate"))
116 || node == this.previousYearLabelNode || node == this.nextYearLabelNode
117 )){
118 domClass.add(node, "dijitCalendarHoveredDate");
119 this._currentNode = node;
120 }
121 },
122
123 _onDayMouseOut: function(/*Event*/ evt){
124 // summary:
125 // Handler for mouse out events on days, clears hovered style
126 // tags:
127 // protected
128
129 if(!this._currentNode){ return; }
130
131 // if mouse out occurs moving from <td> to <span> inside <td>, ignore it
132 if(evt.relatedTarget && evt.relatedTarget.parentNode == this._currentNode){ return; }
133 var cls = "dijitCalendarHoveredDate";
134 if(domClass.contains(this._currentNode, "dijitCalendarActiveDate")){
135 cls += " dijitCalendarActiveDate";
136 }
137 domClass.remove(this._currentNode, cls);
138 this._currentNode = null;
139 },
140
141 _onDayMouseDown: function(/*Event*/ evt){
142 var node = evt.target.parentNode;
143 if(node && node.dijitDateValue && !domClass.contains(node, "dijitCalendarDisabledDate")){
144 domClass.add(node, "dijitCalendarActiveDate");
145 this._currentNode = node;
146 }
147 },
148
149 _onDayMouseUp: function(/*Event*/ evt){
150 var node = evt.target.parentNode;
151 if(node && node.dijitDateValue){
152 domClass.remove(node, "dijitCalendarActiveDate");
153 }
154 },
155
156 handleKey: function(/*Event*/ evt){
157 // summary:
158 // Provides keyboard navigation of calendar.
159 // description:
160 // Called from _onKeyPress() to handle keypress on a stand alone Calendar,
161 // and also from `dijit.form._DateTimeTextBox` to pass a keypress event
162 // from the `dijit.form.DateTextBox` to be handled in this widget
163 // returns:
164 // False if the key was recognized as a navigation key,
165 // to indicate that the event was handled by Calendar and shouldn't be propogated
166 // tags:
167 // protected
168 var increment = -1,
169 interval,
170 newValue = this.currentFocus;
171 switch(evt.charOrCode){
172 case keys.RIGHT_ARROW:
173 increment = 1;
174 //fallthrough...
175 case keys.LEFT_ARROW:
176 interval = "day";
177 if(!this.isLeftToRight()){ increment *= -1; }
178 break;
179 case keys.DOWN_ARROW:
180 increment = 1;
181 //fallthrough...
182 case keys.UP_ARROW:
183 interval = "week";
184 break;
185 case keys.PAGE_DOWN:
186 increment = 1;
187 //fallthrough...
188 case keys.PAGE_UP:
189 interval = evt.ctrlKey || evt.altKey ? "year" : "month";
190 break;
191 case keys.END:
192 // go to the next month
193 newValue = this.dateFuncObj.add(newValue, "month", 1);
194 // subtract a day from the result when we're done
195 interval = "day";
196 //fallthrough...
197 case keys.HOME:
198 newValue = new this.dateClassObj(newValue);
199 newValue.setDate(1);
200 break;
201 case keys.ENTER:
202 case " ":
203 this.set("value", this.currentFocus);
204 break;
205 default:
206 return true;
207 }
208
209 if(interval){
210 newValue = this.dateFuncObj.add(newValue, interval, increment);
211 }
212
213 this._setCurrentFocusAttr(newValue);
214
215 return false;
216 },
217
218 _onKeyPress: function(/*Event*/ evt){
219 // summary:
220 // For handling keypress events on a stand alone calendar
221 if(!this.handleKey(evt)){
222 event.stop(evt);
223 }
224 },
225
226 onValueSelected: function(/*Date*/ /*===== date =====*/){
227 // summary:
228 // Deprecated. Notification that a date cell was selected. It may be the same as the previous value.
229 // description:
230 // Formerly used by `dijit.form._DateTimeTextBox` (and thus `dijit.form.DateTextBox`)
231 // to get notification when the user has clicked a date. Now onExecute() (above) is used.
232 // tags:
233 // protected
234 },
235
236 onChange: function(value){
237 this.onValueSelected(value); // remove in 2.0
238 },
239
240 getClassForDate: function(/*===== dateObject, locale =====*/){
241 // summary:
242 // May be overridden to return CSS classes to associate with the date entry for the given dateObject,
243 // for example to indicate a holiday in specified locale.
244 // dateObject: Date
245 // locale: String?
246 // tags:
247 // extension
248
249 /*=====
250 return ""; // String
251 =====*/
252 }
253 });
254
255 Calendar._MonthDropDownButton = declare("dijit.Calendar._MonthDropDownButton", DropDownButton, {
256 // summary:
257 // DropDownButton for the current month. Displays name of current month
258 // and a list of month names in the drop down
259
260 onMonthSelect: function(){ },
261
262 postCreate: function(){
263 this.inherited(arguments);
264 this.dropDown = new Calendar._MonthDropDown({
265 id: this.id + "_mdd", //do not change this id because it is referenced in the template
266 onChange: this.onMonthSelect
267 });
268 },
269 _setMonthAttr: function(month){
270 // summary:
271 // Set the current month to display as a label
272 var monthNames = this.dateLocaleModule.getNames('months', 'wide', 'standAlone', this.lang, month);
273 this.dropDown.set("months", monthNames);
274
275 // Set name of current month and also fill in spacer element with all the month names
276 // (invisible) so that the maximum width will affect layout. But not on IE6 because then
277 // the center <TH> overlaps the right <TH> (due to a browser bug).
278 this.containerNode.innerHTML =
279 (has("ie") == 6 ? "" : "<div class='dijitSpacer'>" + this.dropDown.domNode.innerHTML + "</div>") +
280 "<div class='dijitCalendarMonthLabel dijitCalendarCurrentMonthLabel'>" + monthNames[month.getMonth()] + "</div>";
281 }
282 });
283
284 Calendar._MonthDropDown = declare("dijit.Calendar._MonthDropDown", [_Widget, _TemplatedMixin], {
285 // summary:
286 // The list-of-months drop down from the MonthDropDownButton
287
288 // months: String[]
289 // List of names of months, possibly w/some undefined entries for Hebrew leap months
290 // (ex: ["January", "February", undefined, "April", ...])
291 months: [],
292
293 templateString: "<div class='dijitCalendarMonthMenu dijitMenu' " +
294 "data-dojo-attach-event='onclick:_onClick,onmouseover:_onMenuHover,onmouseout:_onMenuHover'></div>",
295
296 _setMonthsAttr: function(/*String[]*/ months){
297 this.domNode.innerHTML = array.map(months, function(month, idx){
298 return month ? "<div class='dijitCalendarMonthLabel' month='" + idx +"'>" + month + "</div>" : "";
299 }).join("");
300 },
301
302 _onClick: function(/*Event*/ evt){
303 this.onChange(domAttr.get(evt.target, "month"));
304 },
305
306 onChange: function(/*Number*/ /*===== month =====*/){
307 // summary:
308 // Callback when month is selected from drop down
309 },
310
311 _onMenuHover: function(evt){
312 domClass.toggle(evt.target, "dijitCalendarMonthLabelHover", evt.type == "mouseover");
313 }
314 });
315
316 return Calendar;
317 });