| |
| |
| |
| |
| |
| 'use strict'; |
| { |
| |
| const CalendarNamespace = { |
| monthsOfYear: [ |
| gettext('January'), |
| gettext('February'), |
| gettext('March'), |
| gettext('April'), |
| gettext('May'), |
| gettext('June'), |
| gettext('July'), |
| gettext('August'), |
| gettext('September'), |
| gettext('October'), |
| gettext('November'), |
| gettext('December') |
| ], |
| monthsOfYearAbbrev: [ |
| pgettext('abbrev. month January', 'Jan'), |
| pgettext('abbrev. month February', 'Feb'), |
| pgettext('abbrev. month March', 'Mar'), |
| pgettext('abbrev. month April', 'Apr'), |
| pgettext('abbrev. month May', 'May'), |
| pgettext('abbrev. month June', 'Jun'), |
| pgettext('abbrev. month July', 'Jul'), |
| pgettext('abbrev. month August', 'Aug'), |
| pgettext('abbrev. month September', 'Sep'), |
| pgettext('abbrev. month October', 'Oct'), |
| pgettext('abbrev. month November', 'Nov'), |
| pgettext('abbrev. month December', 'Dec') |
| ], |
| daysOfWeek: [ |
| gettext('Sunday'), |
| gettext('Monday'), |
| gettext('Tuesday'), |
| gettext('Wednesday'), |
| gettext('Thursday'), |
| gettext('Friday'), |
| gettext('Saturday') |
| ], |
| daysOfWeekAbbrev: [ |
| pgettext('abbrev. day Sunday', 'Sun'), |
| pgettext('abbrev. day Monday', 'Mon'), |
| pgettext('abbrev. day Tuesday', 'Tue'), |
| pgettext('abbrev. day Wednesday', 'Wed'), |
| pgettext('abbrev. day Thursday', 'Thur'), |
| pgettext('abbrev. day Friday', 'Fri'), |
| pgettext('abbrev. day Saturday', 'Sat') |
| ], |
| daysOfWeekInitial: [ |
| pgettext('one letter Sunday', 'S'), |
| pgettext('one letter Monday', 'M'), |
| pgettext('one letter Tuesday', 'T'), |
| pgettext('one letter Wednesday', 'W'), |
| pgettext('one letter Thursday', 'T'), |
| pgettext('one letter Friday', 'F'), |
| pgettext('one letter Saturday', 'S') |
| ], |
| 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) { |
| let 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, selected) { |
| const today = new Date(); |
| const todayDay = today.getDate(); |
| const todayMonth = today.getMonth() + 1; |
| const todayYear = today.getFullYear(); |
| let todayClass = ''; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| let isSelectedMonth = false; |
| if (typeof selected !== 'undefined') { |
| isSelectedMonth = (selected.getUTCFullYear() === year && (selected.getUTCMonth() + 1) === month); |
| } |
|
|
| month = parseInt(month); |
| year = parseInt(year); |
| const calDiv = document.getElementById(div_id); |
| removeChildren(calDiv); |
| const calTable = document.createElement('table'); |
| quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month - 1] + ' ' + year); |
| const tableBody = quickElement('tbody', calTable); |
|
|
| |
| let tableRow = quickElement('tr', tableBody); |
| for (let i = 0; i < 7; i++) { |
| quickElement('th', tableRow, CalendarNamespace.daysOfWeekInitial[(i + CalendarNamespace.firstDayOfWeek) % 7]); |
| } |
|
|
| const startingPos = new Date(year, month - 1, 1 - CalendarNamespace.firstDayOfWeek).getDay(); |
| const days = CalendarNamespace.getDaysInMonth(month, year); |
|
|
| let nonDayCell; |
|
|
| |
| tableRow = quickElement('tr', tableBody); |
| for (let i = 0; i < startingPos; i++) { |
| nonDayCell = quickElement('td', tableRow, ' '); |
| nonDayCell.className = "nonday"; |
| } |
|
|
| function calendarMonth(y, m) { |
| function onClick(e) { |
| e.preventDefault(); |
| callback(y, m, this.textContent); |
| } |
| return onClick; |
| } |
|
|
| |
| let currentDay = 1; |
| for (let 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 = ''; |
| } |
|
|
| |
| if (isSelectedMonth && currentDay === selected.getUTCDate()) { |
| if (todayClass !== '') { |
| todayClass += " "; |
| } |
| todayClass += "selected"; |
| } |
|
|
| const cell = quickElement('td', tableRow, '', 'class', todayClass); |
| const link = quickElement('a', cell, currentDay, 'href', '#'); |
| link.addEventListener('click', calendarMonth(year, month)); |
| currentDay++; |
| } |
|
|
| |
| while (tableRow.childNodes.length < 7) { |
| nonDayCell = quickElement('td', tableRow, ' '); |
| nonDayCell.className = "nonday"; |
| } |
|
|
| calDiv.appendChild(calTable); |
| } |
| }; |
|
|
| |
| function Calendar(div_id, callback, selected) { |
| |
| |
| |
| |
| |
| this.div_id = div_id; |
| this.callback = callback; |
| this.today = new Date(); |
| this.currentMonth = this.today.getMonth() + 1; |
| this.currentYear = this.today.getFullYear(); |
| if (typeof selected !== 'undefined') { |
| this.selected = selected; |
| } |
| } |
| Calendar.prototype = { |
| drawCurrent: function() { |
| CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback, this.selected); |
| }, |
| drawDate: function(month, year, selected) { |
| this.currentMonth = month; |
| this.currentYear = year; |
|
|
| if(selected) { |
| this.selected = selected; |
| } |
|
|
| 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(); |
| } |
| }; |
| window.Calendar = Calendar; |
| window.CalendarNamespace = CalendarNamespace; |
| } |
|
|