| /* |
| 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(' '), |
| firstDayOfWeek: parseInt(get_format('FIRST_DAY_OF_WEEK')), |
| 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 |
| var today = new Date(); |
| var todayDay = today.getDate(); |
| var todayMonth = today.getMonth()+1; |
| var todayYear = today.getFullYear(); |
| var todayClass = ''; |
| |
| 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 + CalendarNamespace.firstDayOfWeek) % 7]); |
| } |
| |
| var startingPos = new Date(year, month-1, 1 - CalendarNamespace.firstDayOfWeek).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); |
| } |
| if ((currentDay==todayDay) && (month==todayMonth) && (year==todayYear)) { |
| todayClass='today'; |
| } else { |
| todayClass=''; |
| } |
| var cell = quickElement('td', tableRow, '', 'class', todayClass); |
| |
| 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(); |
| } |
| } |