define("dojox/calendar/CalendarBase", [
"dojo/_base/declare",
"dojo/_base/sniff",
"dojo/_base/event",
"dojo/_base/lang",
"dojo/_base/array",
"dojo/cldr/supplemental",
"dojo/dom",
"dojo/dom-class",
"dojo/dom-style",
"dojo/dom-construct",
"dojo/date",
"dojo/date/locale",
"dojo/_base/fx",
"dojo/fx",
"dojo/on",
"dijit/_WidgetBase",
"dijit/_TemplatedMixin",
"dijit/_WidgetsInTemplateMixin",
"./StoreMixin",
"dojox/widget/_Invalidating",
"dojox/widget/Selection",
"dojox/calendar/time",
"dojo/i18n!./nls/buttons"],
function(
declare,
has,
event,
lang,
arr,
cldr,
dom,
domClass,
domStyle,
domConstruct,
date,
locale,
coreFx,
fx,
on,
_WidgetBase,
_TemplatedMixin,
_WidgetsInTemplateMixin,
StoreMixin,
_Invalidating,
Selection,
timeUtil,
_nls){
/*=====
var __HeaderClickEventArgs = {
// summary:
// A column click event.
// index: Integer
// The column index.
// date: Date
// The date displayed by the column.
// triggerEvent: Event
// The origin event.
};
=====*/
/*=====
var __TimeIntervalChangeArgs = {
// summary:
// An time interval change event, dispatched when the calendar displayed time range has changed.
// oldStartTime: Date
// The start of the previously displayed time interval, if any.
// startTime: Date
// The new start of the displayed time interval.
// oldEndTime: Date
// The end of the previously displayed time interval, if any.
// endTime: Date
// The new end of the displayed time interval.
};
=====*/
/*=====
var __GridClickEventArgs = {
// summary:
// The event dispatched when the grid is clicked or double-clicked.
// date: Date
// The start of the previously displayed time interval, if any.
// triggerEvent: Event
// The event at the origin of this event.
};
=====*/
/*=====
var __ItemMouseEventArgs = {
// summary:
// The event dispatched when an item is clicked, double-clicked or context-clicked.
// item: Object
// The item clicked.
// renderer: dojox/calendar/_RendererMixin
// The item renderer clicked.
// triggerEvent: Event
// The event at the origin of this event.
};
=====*/
/*=====
var __itemEditingEventArgs = {
// summary:
// An item editing event.
// item: Object
// The date item that is being edited.
// editKind: String
// Kind of edit: "resizeBoth", "resizeStart", "resizeEnd" or "move".
// dates: Date[]
// The computed date/time of the during the event editing. One entry per edited date (touch use case).
// startTime: Date?
// The start time of data item.
// endTime: Date?
// The end time of data item.
// sheet: String
// For views with several sheets (columns view for example), the sheet when the event occured.
// source: dojox/calendar/ViewBase
// The view where the event occurred.
// eventSource: String
// The device that triggered the event. This property can take the following values:
//
// - "mouse",
// - "keyboard",
// - "touch"
// triggerEvent: Event
// The event at the origin of this event.
};
=====*/
return declare("dojox.calendar.CalendarBase", [_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, StoreMixin, _Invalidating, Selection], {
// summary:
// This class defines a generic calendar widget that manages several views to display event in time.
baseClass: "dojoxCalendar",
// datePackage: Object
// JavaScript namespace to find Calendar routines. Uses Gregorian Calendar routines at dojo.date by default.
datePackage: date,
// startDate: Date
// The start date of the displayed time interval.
startDate: null,
// endDate: Date
// The end date of the displayed time interval (included).
endDate: null,
// date:Date
// The reference date used to determine along with the dateInterval
// and dateIntervalSteps
properties the time interval to display.
date: null,
// dateInterval:String
// The date interval used to compute along with the date
and
// dateIntervalSteps
the time interval to display.
// Valid values are "day", "week" (default value) and "month".
dateInterval: "week",
// dateInterval:Integer
// The number of date intervals used to compute along with the date
and
// dateInterval
the time interval to display.
// Default value is 1.
dateIntervalSteps: 1,
// viewContainer: Node
// The DOM node that will contains the views.
viewContainer: null,
// firstDayOfWeek: Integer
// (Optional) The first day of week override. By default the first day of week is determined
// for the current locale (extracted from the CLDR).
// Special value -1 (default value), means use locale dependent value.
firstDayOfWeek: -1,
// formatItemTimeFunc: Function?
// Optional function to format the time of day of the item renderers.
// The function takes the date and render data object as arguments and returns a String.
formatItemTimeFunc: null,
// editable: Boolean
// A flag that indicates whether or not the user can edit
// items in the data provider.
// If true
, the item renderers in the control are editable.
// The user can click on an item renderer, or use the keyboard or touch devices, to move or resize the associated event.
editable: true,
// moveEnabled: Boolean
// A flag that indicates whether the user can move items displayed.
// If true
, the user can move the items.
moveEnabled: true,
// resizeEnabled: Boolean
// A flag that indicates whether the items can be resized.
// If true
, the control supports resizing of items.
resizeEnabled: true,
// columnView: dojox/calendar/ColumnView
// The column view is displaying one day to seven days time intervals.
columnView: null,
// matrixView: dojox/calendar/MatrixView
// The column view is displaying time intervals that lasts more than seven days.
matrixView: null,
// columnViewProps: Object
// Map of property/value passed to the constructor of the column view.
columnViewProps: null,
// matrixViewProps: Object
// Map of property/value passed to the constructor of the matrix view.
matrixViewProps: null,
// createOnGridClick: Boolean
// Indicates whether the user can create new event by clicking and dragging the grid.
// A createItem function must be defined on the view or the calendar object.
createOnGridClick: false,
// createItemFunc: Function
// A user supplied function that creates a new event.
// This function is used when createOnGridClick is set to true and the user is clicking and dragging on the grid.
// This view takes two parameters:
//
// - view: the current view,
// - d: the date at the clicked location.
createItemFunc: null,
_currentViewIndex: -1,
views: null,
_calendar: "gregorian",
constructor: function(/*Object*/args){
this.views = [];
this.invalidatingProperties = ["store", "items", "startDate", "endDate", "views",
"date", "dateInterval", "dateIntervalSteps", "firstDayOfWeek"];
args = args || {};
this._calendar = args.datePackage ? args.datePackage.substr(args.datePackage.lastIndexOf(".")+1) : this._calendar;
this.dateModule = args.datePackage ? lang.getObject(args.datePackage, false) : date;
this.dateClassObj = this.dateModule.Date || Date;
this.dateLocaleModule = args.datePackage ? lang.getObject(args.datePackage+".locale", false) : locale;
this.invalidateRendering();
},
destroy: function(preserveDom){
arr.forEach(this._buttonHandles, function(h){
h.remove();
});
this.inherited(arguments);
},
buildRendering: function(){
this.inherited(arguments);
if(this.views == null || this.views.length == 0){
this.set("views", this._createDefaultViews());
}
},
_applyAttributes: function(){
this._applyAttr = true;
this.inherited(arguments);
delete this._applyAttr;
},
////////////////////////////////////////////////////
//
// Getter / setters
//
////////////////////////////////////////////////////
_setStartDateAttr: function(value){
this._set("startDate", value);
this._timeRangeInvalidated = true;
},
_setEndDateAttr: function(value){
this._set("endDate", value);
this._timeRangeInvalidated = true;
},
_setDateAttr: function(value){
this._set("date", value);
this._timeRangeInvalidated = true;
},
_setDateIntervalAttr: function(value){
this._set("dateInterval", value);
this._timeRangeInvalidated = true;
},
_setDateIntervalStepsAttr: function(value){
this._set("dateIntervalSteps", value);
this._timeRangeInvalidated = true;
},
_setFirstDayOfWeekAttr: function(value){
this._set("firstDayOfWeek", value);
if(this.get("date") != null && this.get("dateInterval") == "week"){
this._timeRangeInvalidated = true;
}
},
_setTextDirAttr: function(value){
arr.forEach(this.views, function(view){
view.set("textDir", value);
});
},
///////////////////////////////////////////////////
//
// Validating
//
///////////////////////////////////////////////////
refreshRendering: function(){
// summary:
// Refreshes all the visual rendering of the calendar.
// tags:
// protected
this.inherited(arguments);
this._validateProperties();
},
_refreshItemsRendering: function(){
if(this.currentView){
this.currentView._refreshItemsRendering();
}
},
_validateProperties: function(){
// tags:
// private
var cal = this.dateModule;
var startDate = this.get("startDate");
var endDate = this.get("endDate");
var date = this.get("date");
if(this.firstDayOfWeek < -1 || this.firstDayOfWeek > 6){
this._set("firstDayOfWeek", 0);
}
if(date == null && (startDate != null || endDate != null)){
if(startDate == null){
startDate = new this.dateClassObj();
this._set("startDate", startDate);
this._timeRangeInvalidated = true;
}
if(endDate == null){
endDate = new this.dateClassObj();
this._set("endDate", endDate);
this._timeRangeInvalidated = true;
}
if(cal.compare(startDate, endDate) >= 0){
endDate = cal.add(startDate, "day", 1);
this._set("endDate", endDate);
this._timeRangeInvalidated = true;
}
}else{
if(this.date == null){
this._set("date", new this.dateClassObj());
this._timeRangeInvalidated = true;
}
var dint = this.get("dateInterval");
if(dint != "day" && dint != "week" && dint != "month"){
this._set("dateInterval", "day");
this._timeRangeInvalidated = true;
}
var dis = this.get("dateIntervalSteps");
if(lang.isString(dis)){
dis = parseInt(dis);
this._set("dateIntervalSteps", dis);
}
if(dis <= 0) {
this.set("dateIntervalSteps", 1);
this._timeRangeInvalidated = true;
}
}
if(this._timeRangeInvalidated){
this._timeRangeInvalidated = false;
var timeInterval = this.computeTimeInterval();
if(this._timeInterval == null ||
cal.compare(this._timeInterval[0], timeInterval[0] != 0) ||
cal.compare(this._timeInterval[1], timeInterval[1] != 0)){
this.onTimeIntervalChange({
oldStartTime: this._timeInterval == null ? null : this._timeInterval[0],
oldEndTime: this._timeInterval == null ? null : this._timeInterval[1],
startTime: timeInterval[0],
endTime: timeInterval[1]
});
}
this._timeInterval = timeInterval;
var duration = this.dateModule.difference(this._timeInterval[0], this._timeInterval[1], "day");
var view = this._computeCurrentView(timeInterval[0], timeInterval[1], duration);
var index = arr.indexOf(this.views, view);
if(view == null || index == -1){
return;
}
if(this.animateRange && (!has("ie") || has("ie")>8) ){
if(this.currentView){ // there's a view to animate
var ltr = this.isLeftToRight();
var inLeft = this._animRangeInDir=="left" || this._animRangeInDir == null;
var outLeft = this._animRangeOutDir=="left" || this._animRangeOutDir == null;
this._animateRange(this.currentView.domNode, outLeft && ltr, false, 0, outLeft ? -100 : 100,
lang.hitch(this, function(){
this.animateRangeTimer = setTimeout(lang.hitch(this, function(){
this._applyViewChange(view, index, timeInterval, duration);
this._animateRange(this.currentView.domNode, inLeft && ltr, true, inLeft ? -100 : 100, 0);
this._animRangeInDir = null;
this._animRangeOutDir = null;
}), 100); // setTimeout give time for layout of view.
}));
}else{
this._applyViewChange(view, index, timeInterval, duration);
}
}else{
this._applyViewChange(view, index, timeInterval, duration);
}
}
},
_applyViewChange: function(view, index, timeInterval, duration){
// summary:
// Applies the changes of a view time and changes the currently visible view if needed.
// view: ViewBase
// The view that is configured and is or will be shown.
// index: Integer
// The view index in the internal structure.
// timeInterval: Date[]
// The time interval displayed by the calendar.
// duration: Integer
// The duration in days of the time interval.
// tags:
// protected
this._configureView(view, index, timeInterval, duration);
if(index != this._currentViewIndex){
if(this.currentView == null){
view.set("items", this.items);
this.set("currentView", view);
}else{
if(this.items == null || this.items.length == 0){
this.set("currentView", view);
if(this.animateRange && (!has("ie") || has("ie")>8) ){
domStyle.set(this.currentView.domNode, "opacity", 0);
}
view.set("items", this.items);
}else{
this.currentView = view;
view.set("items", this.items);
this.set("currentView", view);
if(this.animateRange && (!has("ie") || has("ie")>8) ){
domStyle.set(this.currentView.domNode, "opacity", 0);
}
}
}
}
},
_timeInterval: null,
computeTimeInterval: function(){
// summary:
// Computes the displayed time interval according to the date, dateInterval and
// dateIntervalSteps if date is not null or startDate and endDate properties otherwise.
// tags:
// protected
var cal = this.dateModule;
var d = this.get("date");
if(d == null){
return [ this.floorToDay(this.get("startDate")), cal.add(this.get("endDate"), "day", 1) ];
}else{
var s = this.floorToDay(d);
var di = this.get("dateInterval");
var dis = this.get("dateIntervalSteps");
var e;
switch(di){
case "day":
e = cal.add(s, "day", dis);
break;
case "week":
s = this.floorToWeek(s);
e = cal.add(s, "week", dis);
break;
case "month":
s.setDate(1);
e = cal.add(s, "month", dis);
break;
}
return [s, e];
}
},
onTimeIntervalChange: function(e){
// summary:
// Event dispatched when the displayed time interval has changed.
// e: __TimeIntervalChangeArgs
// The time interval change event.
// tags:
// callback
},
/////////////////////////////////////////////////////
//
// View Management
//
/////////////////////////////////////////////////////
// views: dojox.calendar.ViewBase[]
// The views displayed by the widget.
// To add/remove only one view, prefer, respectively, the addView() or removeView() methods.
views: null,
_setViewsAttr: function(views){
if(!this._applyAttr){
// 1/ in create() the constructor parameters are mixed in the widget
// 2/ in _applyAttributes(), every property with a setter is called.
// So no need to call on view removed for a non added view....
for(var i=0;i this.views.length){
index = this.views.length;
}
this.views.splice(index, view);
this._onViewAdded(view);
},
removeView: function(view){
// summary:
// Removes a view from the calendar's view list.
// view: dojox/calendar/ViewBase
// The view to remove from the calendar.
// tags:
// protected
if(index < 0 || index >= this.views.length){
return;
}
this._onViewRemoved(this.views[index]);
this.views.splice(index, 1);
},
_onViewAdded: function(view){
view.owner = this;
view.buttonContainer = this.buttonContainer;
view._calendar = this._calendar;
view.datePackage = this.datePackage;
view.dateModule = this.dateModule;
view.dateClassObj = this.dateClassObj;
view.dateLocaleModule = this.dateLocaleModule;
domStyle.set(view.domNode, "display", "none");
domClass.add(view.domNode, "view");
domConstruct.place(view.domNode, this.viewContainer);
this.onViewAdded(view);
},
onViewAdded: function(view){
// summary:
// Event dispatched when a view is added from the calendar.
// view: dojox/calendar/ViewBase
// The view that has been added to the calendar.
// tags:
// callback
},
_onViewRemoved: function(view){
view.owner = null;
view.buttonContainer = null;
domClass.remove(view.domNode, "view");
this.viewContainer.removeChild(view.domNode);
this.onViewRemoved(view);
},
onViewRemoved: function(view){
// summary:
// Event dispatched when a view is removed from the calendar.
// view: dojox/calendar/ViewBase
// The view that has been removed from the calendar.
// tags:
// callback
},
_setCurrentViewAttr: function(view){
var index = arr.indexOf(this.views, view);
if(index != -1){
var oldView = this.get("currentView");
this._currentViewIndex = index;
this._set("currentView", view);
this._showView(oldView, view);
this.onCurrentViewChange({
oldView: oldView,
newView: view
});
}
},
_getCurrentViewAttr: function(){
return this.views[this._currentViewIndex];
},
onCurrentViewChange: function(e){
// summary:
// Event dispatched when the current view has changed.
// e: Event
// Object that contains the oldView and newView properties.
// tags:
// callback
},
_configureView: function(view, index, timeInterval, duration){
// summary:
// Configures the view to show the specified time interval.
// This method is computing and setting the following properties:
// - "startDate", "columnCount" for a column view,
// - "startDate", "columnCount", "rowCount", "refStartTime" and "refEndTime" for a matrix view.
// This method can be extended to configure other properties like layout properties for example.
// view: dojox/calendar/ViewBase
// The view to configure.
// index: Integer
// The index of the view in the Calendar view list.
// timeInterval: Date[]
// The time interval that will be displayed by the view.
// duration: Integer
// The duration, in days, of the displayed time interval.
// tags:
// protected
var cal = this.dateModule;
if(view.viewKind == "columns"){
view.set("startDate", timeInterval[0]);
view.set("columnCount", duration);
}else if(view.viewKind == "matrix"){
if(duration > 7){ // show only full weeks.
var s = this.floorToWeek(timeInterval[0]);
var e = this.floorToWeek(timeInterval[1]);
if(cal.compare(e, timeInterval[1]) != 0){
e = this.dateModule.add(e, "week", 1);
}
duration = this.dateModule.difference(s, e, "day");
view.set("startDate", s);
view.set("columnCount", 7);
view.set("rowCount", Math.ceil(duration/7));
view.set("refStartTime", timeInterval[0]);
view.set("refEndTime", timeInterval[1]);
}else{
view.set("startDate", timeInterval[0]);
view.set("columnCount", duration);
view.set("rowCount", 1);
view.set("refStartTime", null);
view.set("refEndTime", null);
}
}
},
_computeCurrentView: function(startDate, endDate, duration){
// summary:
// If the time range is lasting less than seven days returns the column view or the matrix view otherwise.
// startDate: Date
// The start date of the displayed time interval
// endDate: Date
// The end date of the displayed time interval
// duration: Integer
// Duration of the
// returns: dojox/calendar/ViewBase
// The view to display.
// tags:
// protected
return duration <= 7 ? this.columnView : this.matrixView;
},
matrixViewRowHeaderClick: function(e){
// summary:
// Function called when the cell of a row header of the matrix view is clicked.
// The implementation is doing the foolowing actions:
// - If another row is already expanded, collapse it and then expand the clicked row.
// - If the clicked row is already expadned, collapse it.
// - If no row is expanded, expand the click row.
// e: Object
// The row header click event.
// tags:
// protected
var expIndex = this.matrixView.getExpandedRowIndex();
if(expIndex == e.index){
this.matrixView.collapseRow();
}else if(expIndex == -1){
this.matrixView.expandRow(e.index);
}else{
var h = this.matrixView.on("expandAnimationEnd", lang.hitch(this, function(){
h.remove();
this.matrixView.expandRow(e.index);
}));
this.matrixView.collapseRow();
}
},
columnViewColumnHeaderClick: function(e){
// summary:
// Function called when the cell of a column header of the column view is clicked.
// Show the time range defined by the clicked date.
// e: Object
// The column header click event.
// tags:
// protected
var cal = this.dateModule;
if(cal.compare(e.date, this._timeInterval[0]) == 0 && this.dateInterval == "day" && this.dateIntervalSteps == 1){
this.set("dateInterval", "week");
}else{
this.set("date", e.date);
this.set("dateInterval", "day");
this.set("dateIntervalSteps", 1);
}
},
// viewFadeDuration: Integer
// The duration in milliseconds of the fade animation when the current view is changing.
viewChangeDuration: 0,
_showView: function(oldView, newView){
// summary:
// Displays the current view.
// oldView: dojox/calendar/ViewBase
// The previously displayed view or null.
// newView: dojox/calendar/ViewBase
// The view to display.
// tags:
// protected
if(oldView != null){
domStyle.set(oldView.domNode, "display", "none");
}
if(newView != null){
domStyle.set(newView.domNode, "display", "block");
newView.resize();
if(!has("ie") || has("ie") > 7){
domStyle.set(newView.domNode, "opacity", "1");
}
}
},
////////////////////////////////////////////////////
//
// Store & data
//
////////////////////////////////////////////////////
_setItemsAttr: function(value){
this._set("items", value);
if(this.currentView){
this.currentView.set("items", value);
this.currentView.invalidateRendering();
}
},
/////////////////////////////////////////////////////
//
// Time utilities
//
////////////////////////////////////////////////////
floorToDay: function(date, reuse){
// summary:
// Floors the specified date to the start of day.
// date: Date
// The date to floor.
// reuse: Boolean
// Whether use the specified instance or create a new one. Default is false.
// returns: Date
return timeUtil.floorToDay(date, reuse, this.dateClassObj);
},
floorToWeek: function(d){
// summary:
// Floors the specified date to the beginning of week.
// date: Date
// Date to floor.
return timeUtil.floorToWeek(d, this.dateClassObj, this.dateModule, this.firstDayOfWeek, this.locale);
},
newDate: function(obj){
// summary:
// Creates a new Date object.
// obj: Object
// This object can have several values:
// - the time in milliseconds since gregorian epoch.
// - a Date instance
// returns: Date
return timeUtil.newDate(obj, this.dateClassObj);
},
isToday: function(date){
// summary:
// Returns whether the specified date is in the current day.
// date: Date
// The date to test.
// renderData: Object
// The current renderData
// returns: Boolean
return timeUtil.isToday(date, this.dateClassObj);
},
isStartOfDay: function(d){
// summary:
// Tests if the specified date represents the starts of day.
// d:Date
// The date to test.
// returns: Boolean
return timeUtil.isStartOfDay(d, this.dateClassObj, this.dateModule);
},
floorDate: function(date, unit, steps, reuse){
// summary:
// floors the date to the unit.
// date: Date
// The date/time to floor.
// unit: String
// The unit. Valid values are "minute", "hour", "day".
// steps: Integer
// For "day" only 1 is valid.
// reuse: Boolean
// Whether use the specified instance or create a new one. Default is false.
// returns: Date
return timeUtil.floor(date, unit, steps, reuse, this.classFuncObj);
},
/////////////////////////////////////////////////////
//
// Time navigation
//
////////////////////////////////////////////////////
// animateRange: Boolean
// Indicates that the previous/next range method will be animated.
animateRange: true,
// animationRangeDuration: Integer
// The duration of the next/previous range animation.
animationRangeDuration: 400,
_animateRange : function(node, toLeft, fadeIn, xFrom, xTo, onEnd){
// summary:
// Animates the current view using a synchronous fade and horizontal translation.
// toLeft: Boolean
// Whether the view is moved to the left or to the right.
// fadeIn: Boolean
// Whether the view is faded in or out.
// xFrom: Integer
// Position before the animation
// xTo: Integer
// Position after the animation
// onEnd: Function
// Function called when the animation is finished.
// tags:
// protected
if(this.animateRangeTimer){ // cleanup previous call not finished
clearTimeout(this.animateRangeTimer);
delete this.animateRangeTimer;
}
var fadeFunc = fadeIn ? coreFx.fadeIn : coreFx.fadeOut;
domStyle.set(node, {left: xFrom + "px", right: (-xFrom) + "px"});
fx.combine([
coreFx.animateProperty({
node: node,
properties: {left: xTo, right: -xTo},
duration: this.animationRangeDuration/2,
onEnd: onEnd
}),
fadeFunc({node: node, duration: this.animationRangeDuration/2})
]).play();
},
// _animRangeOutDir: Boolean
// Direction of the range animation when the view 'leaving' the screen.
// Valid values are:
// - null: auto value,
// - "left": hides to left side (right in right to left).
// - "right": hides to right side (left in right to left).
_animRangeOutDir: null,
// _animRangeInDir: Boolean
// Direction of the range animation when the view 'entering' the screen.
// Valid values are:
// - null: auto value,
// - "left": shows from left side (right in right to left).
// - "right": shows from right side (left in right to left).
_animRangeOutDir: null,
nextRange: function(){
this._animRangeOutDir = "left";
this._animRangeInDir = "right";
this._navigate(1);
},
previousRange: function(){
this._animRangeOutDir = "right";
this._animRangeInDir = "left";
this._navigate(-1);
},
_navigate: function(dir){
// tags:
// private
var d = this.get("date");
var cal = this.dateModule;
if(d == null){
var s = this.get("startDate");
var e = this.get("endDate");
var dur = cal.difference(s, e, "day");
if(dir == 1){
e = cal.add(e, "day", 1);
this.set("startDate", e);
this.set("endDate", cal.add(e, "day", dur));
}else{
s = cal.add(s, "day", -1);
this.set("startDate", cal.add(s, "day", -dur));
this.set("endDate", s);
}
}else{
var di = this.get("dateInterval");
var dis = this.get("dateIntervalSteps");
this.set("date", cal.add(d, di, dir * dis));
}
},
goToday: function(){
// summary:
// Changes the displayed time interval to show the current day.
// Sets the date property to the current day, the dateInterval property to "day" and
// the "dateIntervalSteps" to 1.
this.set("date", this.floorToDay(new this.dateClassObj(), true));
this.set("dateInterval", "day");
this.set("dateIntervalSteps", 1);
},
////////////////////////////////////////////////////
//
// Buttons
//
////////////////////////////////////////////////////
postCreate: function(){
this.inherited(arguments);
this.configureButtons();
},
configureButtons: function(){
// summary:
// Set the localized labels of the buttons and the event handlers.
// tags:
// protected
var h = [];
var rtl = !this.isLeftToRight();
if(this.previousButton){
this.previousButton.set("label", _nls[rtl?"nextButton":"previousButton"]);
h.push(
on(this.previousButton, "click", lang.hitch(this, rtl?this.nextRange:this.previousRange))
);
}
if(this.nextButton){
this.nextButton.set("label", _nls[rtl?"previousButton":"nextButton"]);
h.push(
on(this.nextButton, "click", lang.hitch(this, rtl?this.previousRange:this.nextRange))
);
}
if(rtl && this.previousButton && this.nextButton){
var t = this.previousButton;
this.previousButton = this.nextButton;
this.nextButton = t;
}
if(this.todayButton){
this.todayButton.set("label", _nls.todayButton);
h.push(
on(this.todayButton, "click", lang.hitch(this, this.todayButtonClick))
);
}
if(this.dayButton){
this.dayButton.set("label", _nls.dayButton);
h.push(
on(this.dayButton, "click", lang.hitch(this, this.dayButtonClick))
);
}
if(this.weekButton){
this.weekButton.set("label", _nls.weekButton);
h.push(
on(this.weekButton, "click", lang.hitch(this, this.weekButtonClick))
);
}
if(this.fourDaysButton){
this.fourDaysButton.set("label", _nls.fourDaysButton);
h.push(
on(this.fourDaysButton, "click", lang.hitch(this, this.fourDaysButtonClick))
);
}
if(this.monthButton){
this.monthButton.set("label", _nls.monthButton);
h.push(
on(this.monthButton, "click", lang.hitch(this, this.monthButtonClick))
);
}
this._buttonHandles = h;
},
todayButtonClick: function(e){
// summary:
// The action triggered when the today button is clicked.
// By default, calls the goToday() method.
this.goToday();
},
dayButtonClick: function(e){
// summary:
// The action triggerred when the day button is clicked.
// By default, sets the dateInterval property to "day" and
// the "dateIntervalSteps" to 1.
if(this.get("date") == null){
this.set("date", this.floorToDay(new this.dateClassObj(), true));
}
this.set("dateInterval", "day");
this.set("dateIntervalSteps", 1);
},
weekButtonClick: function(e){
// summary:
// The action triggered when the week button is clicked.
// By default, sets the dateInterval property to "week" and
// the "dateIntervalSteps" to 1.
this.set("dateInterval", "week");
this.set("dateIntervalSteps", 1);
},
fourDaysButtonClick: function(e){
// summary:
// The action triggerred when the 4 days button is clicked.
// By default, sets the dateInterval property to "day" and
// the "dateIntervalSteps" to 4.
this.set("dateInterval", "day");
this.set("dateIntervalSteps", 4);
},
monthButtonClick: function(e){
// summary:
// The action triggered when the month button is clicked.
// By default, sets the dateInterval property to "month" and
// the "dateIntervalSteps" to 1.
this.set("dateInterval", "month");
this.set("dateIntervalSteps", 1);
},
/////////////////////////////////////////////////////
//
// States item
//
////////////////////////////////////////////////////
updateRenderers: function(obj, stateOnly){
if(this.currentView){
this.currentView.updateRenderers(obj, stateOnly);
}
},
getIdentity: function(item){
return item ? item.id : null;
},
_setHoveredItem: function(item, renderer){
if(this.hoveredItem && item && this.hoveredItem.id != item.id ||
item == null || this.hoveredItem == null){
var old = this.hoveredItem;
this.hoveredItem = item;
this.updateRenderers([old, this.hoveredItem], true);
if(item && renderer){
this.currentView._updateEditingCapabilities(item, renderer);
}
}
},
hoveredItem: null,
isItemHovered: function(item){
// summary:
// Returns whether the specified item is hovered or not.
// item: Object
// The item.
// returns: Boolean
return this.hoveredItem != null && this.hoveredItem.id == item.id;
},
////////////////////////////////////////////////////////////////////////
//
// Editing
//
////////////////////////////////////////////////////////////////////////
isItemEditable: function(item, rendererKind){
// summary:
// Computes whether particular item renderer can be edited.
// By default it is using the editable property value.
// item: Object
// The item represented by the renderer.
// rendererKind: String
// The kind of renderer.
// returns: Boolean
return this.editable;
},
isItemMoveEnabled: function(item, rendererKind){
// summary:
// Computes whether particular item renderer can be moved.
// By default it is using the moveEnabled property value.
// item: Object
// The item represented by the renderer.
// rendererKind: String
// The kind of renderer.
// returns: Boolean
return this.isItemEditable() && this.moveEnabled;
},
isItemResizeEnabled: function(item, rendererKind){
// summary:
// Computes whether particular item renderer can be resized.
// By default it is using the resizedEnabled property value.
// item: Object
// The item represented by the renderer.
// rendererKind: String
// The kind of renderer.
// returns: Boolean
return this.isItemEditable() && this.resizeEnabled;
},
////////////////////////////////////////////////////////////////////////
//
// Widget events
//
////////////////////////////////////////////////////////////////////////
onGridClick: function(e){
// summary:
// Event dispatched when the grid has been clicked.
// e: __GridClickEventArgs
// The event dispatched when the grid is clicked.
// tags:
// callback
},
onGridDoubleClick: function(e){
// summary:
// Event dispatched when the grid has been double-clicked.
// e: __GridClickEventArgs
// The event dispatched when the grid is double-clicked.
// tags:
// callback
},
onItemClick: function(e){
// summary:
// Event dispatched when an item renderer has been clicked.
// e: __ItemMouseEventArgs
// The event dispatched when an item is clicked.
// tags:
// callback
},
onItemDoubleClick: function(e){
// summary:
// Event dispatched when an item renderer has been double-clicked.
// e: __ItemMouseEventArgs
// The event dispatched when an item is double-clicked.
// tags:
// callback
},
onItemContextMenu: function(e){
// summary:
// Event dispatched when an item renderer has been context-clicked.
// e: __ItemMouseEventArgs
// The event dispatched when an item is context-clicked.
// tags:
// callback
},
onItemEditBegin: function(e){
// summary:
// Event dispatched when the item is entering the editing mode.
// e: __itemEditingEventArgs
// The editing event.
// tags:
// callback
},
onItemEditEnd: function(e){
// summary:
// Event dispatched when the item is leaving the editing mode.
// e: __itemEditingEventArgs
// The editing event.
// tags:
// callback
},
onItemEditBeginGesture: function(e){
// summary:
// Event dispatched when an editing gesture is beginning.
// e: __itemEditingEventArgs
// The editing event.
// tags:
// callback
},
onItemEditMoveGesture: function(e){
// summary:
// Event dispatched during a move editing gesture.
// e: __itemEditingEventArgs
// The editing event.
// tags:
// callback
},
onItemEditResizeGesture: function(e){
// summary:
// Event dispatched during a resize editing gesture.
// e: __itemEditingEventArgs
// The editing event.
// tags:
// callback
},
onItemEditEndGesture: function(e){
// summary:
// Event dispatched at the end of an editing gesture.
// e: __itemEditingEventArgs
// The editing event.
// tags:
// callback
},
onItemRollOver: function(e){
// Summary:
// Event dispatched when the mouse cursor in going over an item renderer.
// e: __ItemMouseEventArgs
// The event dispatched when the mouse cursor enters in the item renderer.
// tags:
// callback
},
onItemRollOut: function(e){
// Summary:
// Event dispatched when the mouse cursor in leaving an item renderer.
// e: __ItemMouseEventArgs
// The event dispatched when the mouse cursor enters in the item renderer.
// tags:
// callback
},
onColumnHeaderClick: function(e){
// summary:
// Event dispatched when a column header cell is dispatched.
// e: __HeaderClickEventArgs
// Header click event.
// tags:
// callback
},
onRowHeaderClick: function(e){
// summary:
// Event dispatched when a row header cell is clicked.
// e: __HeaderClickEventArgs
// Header click event.
// tags:
// callback
},
onRendererCreated: function(renderer){
// summary:
// Event dispatched when an item renderer has been created.
// renderer: dojox/calendar/_RendererMixin
// The renderer created.
// tags:
// callback
},
onRendererRecycled: function(renderer){
// summary:
// Event dispatched when an item renderer has been recycled.
// renderer: dojox/calendar/_RendererMixin
// The renderer created.
// tags:
// callback
},
onRendererReused: function(renderer){
// summary:
// Event dispatched when an item renderer that was recycled is reused.
// renderer: dojox/calendar/_RendererMixin
// The renderer created.
// tags:
// callback
},
onRendererDestroyed: function(renderer){
// summary:
// Event dispatched when an item renderer is destroyed.
// renderer: dojox/calendar/_RendererMixin
// The renderer created.
// tags:
// callback
},
onRenderersLayoutDone: function(view){
// summary:
// Event triggered when item renderers layout has been done.
// view: dojox/calendar/ViewBase
// The view that has been laid-out.
// tags:
// callback
}
})
});