mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
initial dojo generator. moving to dojo nightly build and checking in the widget libraries as well.
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@3488 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
346
source/web/scripts/ajax/src/widget/html/DatePicker.js
Normal file
346
source/web/scripts/ajax/src/widget/html/DatePicker.js
Normal file
@@ -0,0 +1,346 @@
|
||||
/*
|
||||
Copyright (c) 2004-2006, The Dojo Foundation
|
||||
All Rights Reserved.
|
||||
|
||||
Licensed under the Academic Free License version 2.1 or above OR the
|
||||
modified BSD license. For more information on Dojo licensing, see:
|
||||
|
||||
http://dojotoolkit.org/community/licensing.shtml
|
||||
*/
|
||||
|
||||
dojo.provide("dojo.widget.html.DatePicker");
|
||||
dojo.require("dojo.widget.*");
|
||||
dojo.require("dojo.widget.HtmlWidget");
|
||||
dojo.require("dojo.widget.DatePicker");
|
||||
dojo.require("dojo.event.*");
|
||||
dojo.require("dojo.html");
|
||||
dojo.require("dojo.date");
|
||||
|
||||
/*
|
||||
Some assumptions:
|
||||
- I'm planning on always showing 42 days at a time, and we can scroll by week,
|
||||
not just by month or year
|
||||
- To get a sense of what month to highlight, I basically initialize on the
|
||||
first Saturday of each month, since that will be either the first of two or
|
||||
the second of three months being partially displayed, and then I work forwards
|
||||
and backwards from that point.
|
||||
Currently, I assume that dates are stored in the RFC 3339 format,
|
||||
because I find it to be most human readable and easy to parse
|
||||
http://www.faqs.org/rfcs/rfc3339.html: 2005-06-30T08:05:00-07:00
|
||||
*/
|
||||
|
||||
dojo.widget.defineWidget(
|
||||
"dojo.widget.html.DatePicker",
|
||||
dojo.widget.HtmlWidget,
|
||||
{
|
||||
classConstructor: function() {
|
||||
// mixin dojo.widget.DatePicker non-demoninational code
|
||||
dojo.widget.DatePicker.call(this);
|
||||
// today's date, JS Date object
|
||||
this.today = "";
|
||||
// selected date, JS Date object
|
||||
this.date = "";
|
||||
// rfc 3339 date
|
||||
this.storedDate = "";
|
||||
// date currently selected in the UI, stored in year, month, date in the format that will be actually displayed
|
||||
this.currentDate = {};
|
||||
// stored in year, month, date in the format that will be actually displayed
|
||||
this.firstSaturday = {};
|
||||
},
|
||||
classNames: {
|
||||
previous: "previousMonth",
|
||||
current: "currentMonth",
|
||||
next: "nextMonth",
|
||||
currentDate: "currentDate",
|
||||
selectedDate: "selectedItem"
|
||||
},
|
||||
templatePath: dojo.uri.dojoUri("src/widget/templates/HtmlDatePicker.html"),
|
||||
templateCssPath: dojo.uri.dojoUri("src/widget/templates/HtmlDatePicker.css"),
|
||||
|
||||
fillInTemplate: function(){
|
||||
dojo.widget.DatePicker.call(this);
|
||||
this.initData();
|
||||
this.initUI();
|
||||
},
|
||||
initData: function() {
|
||||
this.today = new Date();
|
||||
if(this.storedDate && (this.storedDate.split("-").length > 2)) {
|
||||
this.date = dojo.widget.DatePicker.util.fromRfcDate(this.storedDate);
|
||||
} else {
|
||||
this.date = this.today;
|
||||
}
|
||||
// calendar math is simplified if time is set to 0
|
||||
this.today.setHours(0);
|
||||
this.date.setHours(0);
|
||||
var month = this.date.getMonth();
|
||||
var tempSaturday = dojo.widget.DatePicker.util.initFirstSaturday(this.date.getMonth().toString(), this.date.getFullYear());
|
||||
this.firstSaturday.year = tempSaturday.year;
|
||||
this.firstSaturday.month = tempSaturday.month;
|
||||
this.firstSaturday.date = tempSaturday.date;
|
||||
},
|
||||
|
||||
setDate: function(rfcDate) {
|
||||
this.storedDate = rfcDate;
|
||||
},
|
||||
|
||||
initUI: function() {
|
||||
this.selectedIsUsed = false;
|
||||
this.currentIsUsed = false;
|
||||
var currentClassName = "";
|
||||
var previousDate = new Date();
|
||||
var calendarNodes = this.calendarDatesContainerNode.getElementsByTagName("td");
|
||||
var currentCalendarNode;
|
||||
// set hours of date such that there is no chance of rounding error due to
|
||||
// time change in local time zones
|
||||
previousDate.setHours(8);
|
||||
var nextDate = new Date(this.firstSaturday.year, this.firstSaturday.month, this.firstSaturday.date, 8);
|
||||
|
||||
if(this.firstSaturday.date < 7) {
|
||||
// this means there are days to show from the previous month
|
||||
var dayInWeek = 6;
|
||||
for (var i=this.firstSaturday.date; i>0; i--) {
|
||||
currentCalendarNode = calendarNodes.item(dayInWeek);
|
||||
currentCalendarNode.innerHTML = nextDate.getDate();
|
||||
dojo.html.setClass(currentCalendarNode, this.getDateClassName(nextDate, "current"));
|
||||
dayInWeek--;
|
||||
previousDate = nextDate;
|
||||
nextDate = this.incrementDate(nextDate, false);
|
||||
}
|
||||
for(var i=dayInWeek; i>-1; i--) {
|
||||
currentCalendarNode = calendarNodes.item(i);
|
||||
currentCalendarNode.innerHTML = nextDate.getDate();
|
||||
dojo.html.setClass(currentCalendarNode, this.getDateClassName(nextDate, "previous"));
|
||||
previousDate = nextDate;
|
||||
nextDate = this.incrementDate(nextDate, false);
|
||||
}
|
||||
} else {
|
||||
nextDate.setDate(this.firstSaturday.date-6);
|
||||
for(var i=0; i<7; i++) {
|
||||
currentCalendarNode = calendarNodes.item(i);
|
||||
currentCalendarNode.innerHTML = nextDate.getDate();
|
||||
dojo.html.setClass(currentCalendarNode, this.getDateClassName(nextDate, "current"));
|
||||
previousDate = nextDate;
|
||||
nextDate = this.incrementDate(nextDate, true);
|
||||
}
|
||||
}
|
||||
previousDate.setDate(this.firstSaturday.date);
|
||||
previousDate.setMonth(this.firstSaturday.month);
|
||||
previousDate.setFullYear(this.firstSaturday.year);
|
||||
nextDate = this.incrementDate(previousDate, true);
|
||||
var count = 7;
|
||||
currentCalendarNode = calendarNodes.item(count);
|
||||
while((nextDate.getMonth() == previousDate.getMonth()) && (count<42)) {
|
||||
currentCalendarNode.innerHTML = nextDate.getDate();
|
||||
dojo.html.setClass(currentCalendarNode, this.getDateClassName(nextDate, "current"));
|
||||
currentCalendarNode = calendarNodes.item(++count);
|
||||
previousDate = nextDate;
|
||||
nextDate = this.incrementDate(nextDate, true);
|
||||
}
|
||||
|
||||
while(count < 42) {
|
||||
currentCalendarNode.innerHTML = nextDate.getDate();
|
||||
dojo.html.setClass(currentCalendarNode, this.getDateClassName(nextDate, "next"));
|
||||
currentCalendarNode = calendarNodes.item(++count);
|
||||
previousDate = nextDate;
|
||||
nextDate = this.incrementDate(nextDate, true);
|
||||
}
|
||||
this.setMonthLabel(this.firstSaturday.month);
|
||||
this.setYearLabels(this.firstSaturday.year);
|
||||
},
|
||||
|
||||
incrementDate: function(date, bool) {
|
||||
// bool: true to increase, false to decrease
|
||||
var time = date.getTime();
|
||||
var increment = 1000 * 60 * 60 * 24;
|
||||
time = (bool) ? (time + increment) : (time - increment);
|
||||
var returnDate = new Date();
|
||||
returnDate.setTime(time);
|
||||
return returnDate;
|
||||
},
|
||||
|
||||
incrementWeek: function(evt) {
|
||||
var date = this.firstSaturday.date;
|
||||
var month = this.firstSaturday.month;
|
||||
var year = this.firstSaturday.year;
|
||||
switch(evt.target) {
|
||||
case this.increaseWeekNode.getElementsByTagName("img").item(0):
|
||||
case this.increaseWeekNode:
|
||||
date = date + 7;
|
||||
if (date>this._daysIn(month,year)) {
|
||||
date = date - this._daysIn(month,year);
|
||||
if (month < 11) {
|
||||
month++;
|
||||
} else {
|
||||
month=0;
|
||||
year++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case this.decreaseWeekNode.getElementsByTagName("img").item(0):
|
||||
case this.decreaseWeekNode:
|
||||
if (date > 7) {
|
||||
date = date - 7;
|
||||
} else {
|
||||
var diff = 7 - date;
|
||||
if (month > 0) {
|
||||
month--;
|
||||
date = this._daysIn(month,year) - diff;
|
||||
}else {
|
||||
year--;
|
||||
month=11;
|
||||
date = 31 - diff;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
this.firstSaturday.date=date;
|
||||
this.firstSaturday.month=month;
|
||||
this.firstSaturday.year=year;
|
||||
this.initUI();
|
||||
},
|
||||
|
||||
incrementMonth: function(evt) {
|
||||
var month = this.firstSaturday.month;
|
||||
var year = this.firstSaturday.year;
|
||||
switch(evt.currentTarget) {
|
||||
case this.increaseMonthNode:
|
||||
if(month < 11) {
|
||||
month++;
|
||||
} else {
|
||||
month = 0;
|
||||
year++;
|
||||
|
||||
this.setYearLabels(year);
|
||||
}
|
||||
break;
|
||||
case this.decreaseMonthNode:
|
||||
if(month > 0) {
|
||||
month--;
|
||||
} else {
|
||||
month = 11;
|
||||
year--;
|
||||
this.setYearLabels(year);
|
||||
}
|
||||
break;
|
||||
case this.increaseMonthNode.getElementsByTagName("img").item(0):
|
||||
if(month < 11) {
|
||||
month++;
|
||||
} else {
|
||||
month = 0;
|
||||
year++;
|
||||
this.setYearLabels(year);
|
||||
}
|
||||
break;
|
||||
case this.decreaseMonthNode.getElementsByTagName("img").item(0):
|
||||
if(month > 0) {
|
||||
month--;
|
||||
} else {
|
||||
month = 11;
|
||||
year--;
|
||||
this.setYearLabels(year);
|
||||
}
|
||||
break;
|
||||
}
|
||||
var tempSaturday = dojo.widget.DatePicker.util.initFirstSaturday(month.toString(), year);
|
||||
this.firstSaturday.year = tempSaturday.year;
|
||||
this.firstSaturday.month = tempSaturday.month;
|
||||
this.firstSaturday.date = tempSaturday.date;
|
||||
this.initUI();
|
||||
},
|
||||
|
||||
incrementYear: function(evt) {
|
||||
var year = this.firstSaturday.year;
|
||||
switch(evt.target) {
|
||||
case this.nextYearLabelNode:
|
||||
year++;
|
||||
break;
|
||||
case this.previousYearLabelNode:
|
||||
year--;
|
||||
break;
|
||||
}
|
||||
var tempSaturday = dojo.widget.DatePicker.util.initFirstSaturday(this.firstSaturday.month.toString(), year);
|
||||
this.firstSaturday.year = tempSaturday.year;
|
||||
this.firstSaturday.month = tempSaturday.month;
|
||||
this.firstSaturday.date = tempSaturday.date;
|
||||
this.initUI();
|
||||
},
|
||||
|
||||
_daysIn: function(month,year) {
|
||||
var daysIn = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
||||
|
||||
if (month==1) {
|
||||
return (year%400 == 0) ? 29: (year%100 == 0) ? 28: (year%4 == 0) ? 29: 28;
|
||||
} else {
|
||||
return daysIn[month];
|
||||
}
|
||||
},
|
||||
|
||||
onIncrementDate: function(evt) {
|
||||
dojo.unimplemented('dojo.widget.html.DatePicker.onIncrementDate');
|
||||
},
|
||||
|
||||
onIncrementWeek: function(evt) {
|
||||
evt.stopPropagation();
|
||||
this.incrementWeek(evt);
|
||||
},
|
||||
|
||||
onIncrementMonth: function(evt) {
|
||||
evt.stopPropagation();
|
||||
this.incrementMonth(evt);
|
||||
},
|
||||
|
||||
onIncrementYear: function(evt) {
|
||||
evt.stopPropagation();
|
||||
this.incrementYear(evt);
|
||||
},
|
||||
|
||||
setMonthLabel: function(monthIndex) {
|
||||
this.monthLabelNode.innerHTML = dojo.date.months[monthIndex];
|
||||
},
|
||||
|
||||
setYearLabels: function(year) {
|
||||
this.previousYearLabelNode.innerHTML = year - 1;
|
||||
this.currentYearLabelNode.innerHTML = year;
|
||||
this.nextYearLabelNode.innerHTML = year + 1;
|
||||
},
|
||||
|
||||
getDateClassName: function(date, monthState) {
|
||||
var currentClassName = this.classNames[monthState];
|
||||
if ((!this.selectedIsUsed) && (date.getDate() == this.date.getDate()) && (date.getMonth() == this.date.getMonth()) && (date.getFullYear() == this.date.getFullYear())) {
|
||||
currentClassName = this.classNames.selectedDate + " " + currentClassName;
|
||||
this.selectedIsUsed = 1;
|
||||
}
|
||||
if((!this.currentIsUsed) && (date.getDate() == this.today.getDate()) && (date.getMonth() == this.today.getMonth()) && (date.getFullYear() == this.today.getFullYear())) {
|
||||
currentClassName = currentClassName + " " + this.classNames.currentDate;
|
||||
this.currentIsUsed = 1;
|
||||
}
|
||||
return currentClassName;
|
||||
},
|
||||
|
||||
onClick: function(evt) {
|
||||
dojo.event.browser.stopEvent(evt)
|
||||
},
|
||||
|
||||
onSetDate: function(evt) {
|
||||
dojo.event.browser.stopEvent(evt);
|
||||
this.selectedIsUsed = 0;
|
||||
this.todayIsUsed = 0;
|
||||
var month = this.firstSaturday.month;
|
||||
var year = this.firstSaturday.year;
|
||||
if (dojo.html.hasClass(evt.target, this.classNames["next"])) {
|
||||
month = ++month % 12;
|
||||
// if month is now == 0, add a year
|
||||
year = (month==0) ? ++year : year;
|
||||
} else if (dojo.html.hasClass(evt.target, this.classNames["previous"])) {
|
||||
month = --month % 12;
|
||||
// if month is now == 0, add a year
|
||||
year = (month==11) ? --year : year;
|
||||
}
|
||||
this.date = new Date(year, month, evt.target.innerHTML);
|
||||
this.setDate(dojo.widget.DatePicker.util.toRfcDate(this.date));
|
||||
this.initUI();
|
||||
}
|
||||
}
|
||||
);
|
Reference in New Issue
Block a user