You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
4.8 KiB
143 lines
4.8 KiB
/* |
|
calendar.js - Calendar functions by Adrian Holovaty |
|
*/ |
|
|
|
function removeChildren(a) { // "a" is reference to an object |
|
while (a.hasChildNodes()) a.removeChild(a.lastChild); |
|
} |
|
|
|
// quickElement(tagType, parentReference, textInChildNode, [, attribute, attributeValue ...]); |
|
function quickElement() { |
|
var obj = document.createElement(arguments[0]); |
|
if (arguments[2] != '' && arguments[2] != null) { |
|
var textNode = document.createTextNode(arguments[2]); |
|
obj.appendChild(textNode); |
|
} |
|
var len = arguments.length; |
|
for (var i = 3; i < len; i += 2) { |
|
obj.setAttribute(arguments[i], arguments[i+1]); |
|
} |
|
arguments[1].appendChild(obj); |
|
return obj; |
|
} |
|
|
|
// CalendarNamespace -- Provides a collection of HTML calendar-related helper functions |
|
var CalendarNamespace = { |
|
monthsOfYear: gettext('January February March April May June July August September October November December').split(' '), |
|
daysOfWeek: gettext('S M T W T F S').split(' '), |
|
isLeapYear: function(year) { |
|
return (((year % 4)==0) && ((year % 100)!=0) || ((year % 400)==0)); |
|
}, |
|
getDaysInMonth: function(month,year) { |
|
var days; |
|
if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12) { |
|
days = 31; |
|
} |
|
else if (month==4 || month==6 || month==9 || month==11) { |
|
days = 30; |
|
} |
|
else if (month==2 && CalendarNamespace.isLeapYear(year)) { |
|
days = 29; |
|
} |
|
else { |
|
days = 28; |
|
} |
|
return days; |
|
}, |
|
draw: function(month, year, div_id, callback) { // month = 1-12, year = 1-9999 |
|
month = parseInt(month); |
|
year = parseInt(year); |
|
var calDiv = document.getElementById(div_id); |
|
removeChildren(calDiv); |
|
var calTable = document.createElement('table'); |
|
quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month-1] + ' ' + year); |
|
var tableBody = quickElement('tbody', calTable); |
|
|
|
// Draw days-of-week header |
|
var tableRow = quickElement('tr', tableBody); |
|
for (var i = 0; i < 7; i++) { |
|
quickElement('th', tableRow, CalendarNamespace.daysOfWeek[i]); |
|
} |
|
|
|
var startingPos = new Date(year, month-1, 1).getDay(); |
|
var days = CalendarNamespace.getDaysInMonth(month, year); |
|
|
|
// Draw blanks before first of month |
|
tableRow = quickElement('tr', tableBody); |
|
for (var i = 0; i < startingPos; i++) { |
|
var _cell = quickElement('td', tableRow, ' '); |
|
_cell.style.backgroundColor = '#f3f3f3'; |
|
} |
|
|
|
// Draw days of month |
|
var currentDay = 1; |
|
for (var i = startingPos; currentDay <= days; i++) { |
|
if (i%7 == 0 && currentDay != 1) { |
|
tableRow = quickElement('tr', tableBody); |
|
} |
|
var cell = quickElement('td', tableRow, ''); |
|
quickElement('a', cell, currentDay, 'href', 'javascript:void(' + callback + '('+year+','+month+','+currentDay+'));'); |
|
currentDay++; |
|
} |
|
|
|
// Draw blanks after end of month (optional, but makes for valid code) |
|
while (tableRow.childNodes.length < 7) { |
|
var _cell = quickElement('td', tableRow, ' '); |
|
_cell.style.backgroundColor = '#f3f3f3'; |
|
} |
|
|
|
calDiv.appendChild(calTable); |
|
} |
|
} |
|
|
|
// Calendar -- A calendar instance |
|
function Calendar(div_id, callback) { |
|
// div_id (string) is the ID of the element in which the calendar will |
|
// be displayed |
|
// callback (string) is the name of a JavaScript function that will be |
|
// called with the parameters (year, month, day) when a day in the |
|
// calendar is clicked |
|
this.div_id = div_id; |
|
this.callback = callback; |
|
this.today = new Date(); |
|
this.currentMonth = this.today.getMonth() + 1; |
|
this.currentYear = this.today.getFullYear(); |
|
} |
|
Calendar.prototype = { |
|
drawCurrent: function() { |
|
CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback); |
|
}, |
|
drawDate: function(month, year) { |
|
this.currentMonth = month; |
|
this.currentYear = year; |
|
this.drawCurrent(); |
|
}, |
|
drawPreviousMonth: function() { |
|
if (this.currentMonth == 1) { |
|
this.currentMonth = 12; |
|
this.currentYear--; |
|
} |
|
else { |
|
this.currentMonth--; |
|
} |
|
this.drawCurrent(); |
|
}, |
|
drawNextMonth: function() { |
|
if (this.currentMonth == 12) { |
|
this.currentMonth = 1; |
|
this.currentYear++; |
|
} |
|
else { |
|
this.currentMonth++; |
|
} |
|
this.drawCurrent(); |
|
}, |
|
drawPreviousYear: function() { |
|
this.currentYear--; |
|
this.drawCurrent(); |
|
}, |
|
drawNextYear: function() { |
|
this.currentYear++; |
|
this.drawCurrent(); |
|
} |
|
}
|
|
|