7604 |
25 Feb 19 |
nicklas |
/* $Id $ |
7604 |
25 Feb 19 |
nicklas |
2 |
------------------------------------------------------------------ |
7604 |
25 Feb 19 |
nicklas |
Copyright (C) 2012 Nicklas Nordborg |
7604 |
25 Feb 19 |
nicklas |
4 |
|
7604 |
25 Feb 19 |
nicklas |
This file is part of BASE - BioArray Software Environment. |
7604 |
25 Feb 19 |
nicklas |
Available at http://base.thep.lu.se/ |
7604 |
25 Feb 19 |
nicklas |
7 |
|
7604 |
25 Feb 19 |
nicklas |
BASE is free software; you can redistribute it and/or |
7604 |
25 Feb 19 |
nicklas |
modify it under the terms of the GNU General Public License |
7604 |
25 Feb 19 |
nicklas |
as published by the Free Software Foundation; either version 3 |
7604 |
25 Feb 19 |
nicklas |
of the License, or (at your option) any later version. |
7604 |
25 Feb 19 |
nicklas |
12 |
|
7604 |
25 Feb 19 |
nicklas |
BASE is distributed in the hope that it will be useful, |
7604 |
25 Feb 19 |
nicklas |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
7604 |
25 Feb 19 |
nicklas |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
7604 |
25 Feb 19 |
nicklas |
GNU General Public License for more details. |
7604 |
25 Feb 19 |
nicklas |
17 |
|
7604 |
25 Feb 19 |
nicklas |
You should have received a copy of the GNU General Public License |
7604 |
25 Feb 19 |
nicklas |
along with BASE. If not, see <http://www.gnu.org/licenses/>. |
7604 |
25 Feb 19 |
nicklas |
20 |
------------------------------------------------------------------ |
7604 |
25 Feb 19 |
nicklas |
21 |
|
7604 |
25 Feb 19 |
nicklas |
@author Nicklas |
7604 |
25 Feb 19 |
nicklas |
23 |
*/ |
7604 |
25 Feb 19 |
nicklas |
'use strict'; |
7604 |
25 Feb 19 |
nicklas |
25 |
|
7604 |
25 Feb 19 |
nicklas |
var Calendar = function() |
7604 |
25 Feb 19 |
nicklas |
27 |
{ |
7604 |
25 Feb 19 |
nicklas |
var dateField; |
7604 |
25 Feb 19 |
nicklas |
var dateFormat; |
7604 |
25 Feb 19 |
nicklas |
var useTime; |
7604 |
25 Feb 19 |
nicklas |
var currentDate; |
7604 |
25 Feb 19 |
nicklas |
var calendarYear; |
7604 |
25 Feb 19 |
nicklas |
var calendarMonth; |
7604 |
25 Feb 19 |
nicklas |
34 |
|
7604 |
25 Feb 19 |
nicklas |
var calendar = {}; |
7604 |
25 Feb 19 |
nicklas |
calendar.MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', |
7604 |
25 Feb 19 |
nicklas |
'July', 'August', 'September', 'October', 'November', 'December']; |
7604 |
25 Feb 19 |
nicklas |
38 |
|
7604 |
25 Feb 19 |
nicklas |
calendar.initPage = function() |
7604 |
25 Feb 19 |
nicklas |
40 |
{ |
7604 |
25 Feb 19 |
nicklas |
// Dialog buttons |
7604 |
25 Feb 19 |
nicklas |
Buttons.addClickHandler('close', App.closeWindow); |
7604 |
25 Feb 19 |
nicklas |
Buttons.addClickHandler('btnSave', Calendar.save); |
7604 |
25 Feb 19 |
nicklas |
Buttons.addClickHandler('btnToday', Calendar.setToday); |
7604 |
25 Feb 19 |
nicklas |
45 |
|
7604 |
25 Feb 19 |
nicklas |
// Next and previous month |
7604 |
25 Feb 19 |
nicklas |
Buttons.addClickHandler('nextMonth', calendar.nextMonth); |
7604 |
25 Feb 19 |
nicklas |
Buttons.addClickHandler('prevMonth', calendar.prevMonth); |
7604 |
25 Feb 19 |
nicklas |
49 |
|
7604 |
25 Feb 19 |
nicklas |
// Time controls |
7604 |
25 Feb 19 |
nicklas |
Events.addEventHandler('hours', 'keypress', Events.integerOnly); |
7604 |
25 Feb 19 |
nicklas |
Events.addEventHandler('minutes', 'keypress', Events.integerOnly); |
7604 |
25 Feb 19 |
nicklas |
Events.addEventHandler('seconds', 'keypress', Events.integerOnly); |
7604 |
25 Feb 19 |
nicklas |
54 |
|
7604 |
25 Feb 19 |
nicklas |
// Each day in the calendar; 6 weeks max |
7604 |
25 Feb 19 |
nicklas |
// Add a normal click handler and an extra for moving focus with arrow keys |
7604 |
25 Feb 19 |
nicklas |
for (var week = 1; week < 7; week++) |
7604 |
25 Feb 19 |
nicklas |
58 |
{ |
7604 |
25 Feb 19 |
nicklas |
for (var day = 0; day < 7; day++) |
7604 |
25 Feb 19 |
nicklas |
60 |
{ |
7604 |
25 Feb 19 |
nicklas |
var e = 'w'+week+'d'+day; |
7604 |
25 Feb 19 |
nicklas |
Buttons.addClickHandler(e, calendar.dayOnClick); |
7604 |
25 Feb 19 |
nicklas |
Events.addEventHandler(e, 'keypress', calendar.handleArrowKeys); |
7604 |
25 Feb 19 |
nicklas |
64 |
} |
7604 |
25 Feb 19 |
nicklas |
65 |
} |
7604 |
25 Feb 19 |
nicklas |
66 |
|
7604 |
25 Feb 19 |
nicklas |
// Get the field that holds the date value in the parent form |
7604 |
25 Feb 19 |
nicklas |
dateField = window.opener.document.getElementById(Data.get('page-data', 'textarea')); |
7604 |
25 Feb 19 |
nicklas |
dateFormat = Data.get('page-data', 'date-format'); |
7604 |
25 Feb 19 |
nicklas |
useTime = Data.int('page-data', 'use-time'); |
7604 |
25 Feb 19 |
nicklas |
currentDate = Dates.parseString(dateField.value, dateFormat); |
7604 |
25 Feb 19 |
nicklas |
if (!currentDate) currentDate = new Date(); |
7604 |
25 Feb 19 |
nicklas |
73 |
|
7604 |
25 Feb 19 |
nicklas |
// Display the current month and time |
7604 |
25 Feb 19 |
nicklas |
calendar.displayMonth(currentDate.getFullYear(), currentDate.getMonth()); |
7604 |
25 Feb 19 |
nicklas |
if (useTime) |
7604 |
25 Feb 19 |
nicklas |
77 |
{ |
7604 |
25 Feb 19 |
nicklas |
var frm = document.forms['calendar']; |
7604 |
25 Feb 19 |
nicklas |
frm.hours.value = calendar.zeroPad(currentDate.getHours()); |
7604 |
25 Feb 19 |
nicklas |
frm.minutes.value = calendar.zeroPad(currentDate.getMinutes()); |
7604 |
25 Feb 19 |
nicklas |
frm.seconds.value = calendar.zeroPad(currentDate.getSeconds()); |
7604 |
25 Feb 19 |
nicklas |
82 |
} |
7604 |
25 Feb 19 |
nicklas |
83 |
} |
7604 |
25 Feb 19 |
nicklas |
84 |
|
7604 |
25 Feb 19 |
nicklas |
85 |
/** |
7604 |
25 Feb 19 |
nicklas |
Display a calendar for the given year and month. |
7604 |
25 Feb 19 |
nicklas |
87 |
*/ |
7604 |
25 Feb 19 |
nicklas |
calendar.displayMonth = function(year, month) |
7604 |
25 Feb 19 |
nicklas |
89 |
{ |
7604 |
25 Feb 19 |
nicklas |
// Normalize month and year |
7604 |
25 Feb 19 |
nicklas |
if (month > 11) |
7604 |
25 Feb 19 |
nicklas |
92 |
{ |
7604 |
25 Feb 19 |
nicklas |
month -= 12; |
7604 |
25 Feb 19 |
nicklas |
year++; |
7604 |
25 Feb 19 |
nicklas |
95 |
} |
7604 |
25 Feb 19 |
nicklas |
else if (month < 0) |
7604 |
25 Feb 19 |
nicklas |
97 |
{ |
7604 |
25 Feb 19 |
nicklas |
month += 12; |
7604 |
25 Feb 19 |
nicklas |
year--; |
7604 |
25 Feb 19 |
nicklas |
100 |
} |
7604 |
25 Feb 19 |
nicklas |
calendarMonth = month; |
7604 |
25 Feb 19 |
nicklas |
calendarYear = year; |
7604 |
25 Feb 19 |
nicklas |
103 |
|
7604 |
25 Feb 19 |
nicklas |
// Display the year and month |
7604 |
25 Feb 19 |
nicklas |
Doc.element('year').innerHTML = year; |
7604 |
25 Feb 19 |
nicklas |
Doc.element('month').innerHTML = calendar.MONTHS[month]; |
7604 |
25 Feb 19 |
nicklas |
107 |
|
7604 |
25 Feb 19 |
nicklas |
// The day of week of the first day in month |
7604 |
25 Feb 19 |
nicklas |
// 1=mon, 2=tue, ...7=sun |
7604 |
25 Feb 19 |
nicklas |
var firstDayInMonth = new Date(year, month, 1).getDay() || 7; |
7604 |
25 Feb 19 |
nicklas |
// Number of day in this month |
7604 |
25 Feb 19 |
nicklas |
var daysInMonth = Dates.daysInMonth(year, month+1); |
7604 |
25 Feb 19 |
nicklas |
var dayNum = 2-firstDayInMonth; |
7604 |
25 Feb 19 |
nicklas |
var today = new Date(); |
7604 |
25 Feb 19 |
nicklas |
for (var week = 1; week <= 6; week++) |
7604 |
25 Feb 19 |
nicklas |
116 |
{ |
7604 |
25 Feb 19 |
nicklas |
for (var day = 0; day <= 6; day++) |
7604 |
25 Feb 19 |
nicklas |
118 |
{ |
7604 |
25 Feb 19 |
nicklas |
var cell = Doc.element('w'+week+'d'+day); |
7604 |
25 Feb 19 |
nicklas |
120 |
{ |
7604 |
25 Feb 19 |
nicklas |
if (dayNum < 1 || dayNum > daysInMonth) |
7604 |
25 Feb 19 |
nicklas |
122 |
{ |
7604 |
25 Feb 19 |
nicklas |
cell.firstChild.nodeValue = ''; |
7604 |
25 Feb 19 |
nicklas |
cell.tabIndex = -1; |
7604 |
25 Feb 19 |
nicklas |
cell.theDate = null; |
7604 |
25 Feb 19 |
nicklas |
Doc.removeClass(cell, 'interactable'); |
7604 |
25 Feb 19 |
nicklas |
if (day == 0 && week > 4) Doc.hide('w' + week); |
7604 |
25 Feb 19 |
nicklas |
128 |
} |
7604 |
25 Feb 19 |
nicklas |
else |
7604 |
25 Feb 19 |
nicklas |
130 |
{ |
7604 |
25 Feb 19 |
nicklas |
cell.firstChild.nodeValue = dayNum; |
7604 |
25 Feb 19 |
nicklas |
cell.tabIndex = 0; |
7604 |
25 Feb 19 |
nicklas |
cell.theDate = new Date(year, month, dayNum); |
7604 |
25 Feb 19 |
nicklas |
Doc.addClass(cell, 'interactable'); |
7604 |
25 Feb 19 |
nicklas |
if (day == 0) Doc.show('w' + week); |
7604 |
25 Feb 19 |
nicklas |
136 |
} |
7604 |
25 Feb 19 |
nicklas |
137 |
} |
7604 |
25 Feb 19 |
nicklas |
// Mark today's date |
7604 |
25 Feb 19 |
nicklas |
if (year == today.getFullYear() && month == today.getMonth() && dayNum == today.getDate()) |
7604 |
25 Feb 19 |
nicklas |
140 |
{ |
7604 |
25 Feb 19 |
nicklas |
Doc.addClass(cell, 'today'); |
7604 |
25 Feb 19 |
nicklas |
142 |
} |
7604 |
25 Feb 19 |
nicklas |
else |
7604 |
25 Feb 19 |
nicklas |
144 |
{ |
7604 |
25 Feb 19 |
nicklas |
Doc.removeClass(cell, 'today'); |
7604 |
25 Feb 19 |
nicklas |
146 |
} |
7604 |
25 Feb 19 |
nicklas |
// Mark the currently selected date |
7604 |
25 Feb 19 |
nicklas |
if (year == currentDate.getFullYear() && month == currentDate.getMonth() && dayNum == currentDate.getDate()) |
7604 |
25 Feb 19 |
nicklas |
149 |
{ |
7604 |
25 Feb 19 |
nicklas |
Doc.addClass(cell, 'active'); |
7604 |
25 Feb 19 |
nicklas |
cell.focus(); |
7604 |
25 Feb 19 |
nicklas |
152 |
} |
7604 |
25 Feb 19 |
nicklas |
else |
7604 |
25 Feb 19 |
nicklas |
154 |
{ |
7604 |
25 Feb 19 |
nicklas |
Doc.removeClass(cell, 'active'); |
7604 |
25 Feb 19 |
nicklas |
156 |
} |
7604 |
25 Feb 19 |
nicklas |
dayNum++; |
7604 |
25 Feb 19 |
nicklas |
158 |
} |
7604 |
25 Feb 19 |
nicklas |
159 |
} |
7604 |
25 Feb 19 |
nicklas |
160 |
|
7604 |
25 Feb 19 |
nicklas |
161 |
} |
7604 |
25 Feb 19 |
nicklas |
162 |
|
7604 |
25 Feb 19 |
nicklas |
// Add an extra '0' to all values below 10. |
7604 |
25 Feb 19 |
nicklas |
calendar.zeroPad = function(value) |
7604 |
25 Feb 19 |
nicklas |
165 |
{ |
7604 |
25 Feb 19 |
nicklas |
return value <= 9 ? '0' + value : value; |
7604 |
25 Feb 19 |
nicklas |
167 |
} |
7604 |
25 Feb 19 |
nicklas |
168 |
|
7604 |
25 Feb 19 |
nicklas |
169 |
/** |
7604 |
25 Feb 19 |
nicklas |
Display the next month in the calendar. |
7604 |
25 Feb 19 |
nicklas |
171 |
*/ |
7604 |
25 Feb 19 |
nicklas |
calendar.nextMonth = function() |
7604 |
25 Feb 19 |
nicklas |
173 |
{ |
7604 |
25 Feb 19 |
nicklas |
calendar.displayMonth(calendarYear, calendarMonth+1); |
7604 |
25 Feb 19 |
nicklas |
175 |
} |
7604 |
25 Feb 19 |
nicklas |
176 |
|
7604 |
25 Feb 19 |
nicklas |
177 |
/** |
7604 |
25 Feb 19 |
nicklas |
Display the previous month in the calendar. |
7604 |
25 Feb 19 |
nicklas |
179 |
*/ |
7604 |
25 Feb 19 |
nicklas |
calendar.prevMonth = function() |
7604 |
25 Feb 19 |
nicklas |
181 |
{ |
7604 |
25 Feb 19 |
nicklas |
calendar.displayMonth(calendarYear, calendarMonth-1); |
7604 |
25 Feb 19 |
nicklas |
183 |
} |
7604 |
25 Feb 19 |
nicklas |
184 |
|
7604 |
25 Feb 19 |
nicklas |
185 |
/** |
7604 |
25 Feb 19 |
nicklas |
Set the current date as the date and close the |
7604 |
25 Feb 19 |
nicklas |
calendar. |
7604 |
25 Feb 19 |
nicklas |
188 |
*/ |
7604 |
25 Feb 19 |
nicklas |
calendar.setToday = function() |
7604 |
25 Feb 19 |
nicklas |
190 |
{ |
7604 |
25 Feb 19 |
nicklas |
currentDate = new Date(); |
7604 |
25 Feb 19 |
nicklas |
if (useTime) |
7604 |
25 Feb 19 |
nicklas |
193 |
{ |
7604 |
25 Feb 19 |
nicklas |
calendar.displayMonth(currentDate.getFullYear(), currentDate.getMonth()); |
7604 |
25 Feb 19 |
nicklas |
195 |
} |
7604 |
25 Feb 19 |
nicklas |
else |
7604 |
25 Feb 19 |
nicklas |
197 |
{ |
7604 |
25 Feb 19 |
nicklas |
calendar.save(); |
7604 |
25 Feb 19 |
nicklas |
199 |
} |
7604 |
25 Feb 19 |
nicklas |
200 |
} |
7604 |
25 Feb 19 |
nicklas |
201 |
|
7604 |
25 Feb 19 |
nicklas |
202 |
/** |
7604 |
25 Feb 19 |
nicklas |
Check that a valid date (and time) has been set. |
7604 |
25 Feb 19 |
nicklas |
204 |
*/ |
7604 |
25 Feb 19 |
nicklas |
calendar.validate = function() |
7604 |
25 Feb 19 |
nicklas |
206 |
{ |
7604 |
25 Feb 19 |
nicklas |
var frm = document.forms['calendar']; |
7604 |
25 Feb 19 |
nicklas |
if (useTime) |
7604 |
25 Feb 19 |
nicklas |
209 |
{ |
7604 |
25 Feb 19 |
nicklas |
var hours = parseInt(frm.hours.value, 10); |
7604 |
25 Feb 19 |
nicklas |
if (hours < 0 || hours > 23) |
7604 |
25 Feb 19 |
nicklas |
212 |
{ |
7604 |
25 Feb 19 |
nicklas |
Forms.showNotification(frm.hours, 'Hours must be a value between 0 and 23', 'small'); |
7604 |
25 Feb 19 |
nicklas |
return false; |
7604 |
25 Feb 19 |
nicklas |
215 |
} |
7604 |
25 Feb 19 |
nicklas |
var minutes = parseInt(frm.minutes.value, 10); |
7604 |
25 Feb 19 |
nicklas |
if (minutes < 0 || minutes > 59) |
7604 |
25 Feb 19 |
nicklas |
218 |
{ |
7604 |
25 Feb 19 |
nicklas |
Forms.showNotification(frm.minutes, 'Minutes must be a value between 0 and 59', 'small'); |
7604 |
25 Feb 19 |
nicklas |
return false; |
7604 |
25 Feb 19 |
nicklas |
221 |
} |
7604 |
25 Feb 19 |
nicklas |
var seconds = parseInt(frm.seconds.value, 10); |
7604 |
25 Feb 19 |
nicklas |
if (seconds < 0 || seconds > 59) |
7604 |
25 Feb 19 |
nicklas |
224 |
{ |
7604 |
25 Feb 19 |
nicklas |
Forms.showNotification(frm.seconds, 'Seconds must be a value between 0 and 59', 'small'); |
7604 |
25 Feb 19 |
nicklas |
return false; |
7604 |
25 Feb 19 |
nicklas |
227 |
} |
7604 |
25 Feb 19 |
nicklas |
228 |
} |
7604 |
25 Feb 19 |
nicklas |
return true; |
7604 |
25 Feb 19 |
nicklas |
230 |
} |
7604 |
25 Feb 19 |
nicklas |
231 |
|
7604 |
25 Feb 19 |
nicklas |
calendar.save = function() |
7604 |
25 Feb 19 |
nicklas |
233 |
{ |
7604 |
25 Feb 19 |
nicklas |
// Validate form |
7604 |
25 Feb 19 |
nicklas |
if (!calendar.validate()) return; |
7604 |
25 Feb 19 |
nicklas |
236 |
|
7604 |
25 Feb 19 |
nicklas |
// Copy current time values |
7604 |
25 Feb 19 |
nicklas |
if (useTime) |
7604 |
25 Feb 19 |
nicklas |
239 |
{ |
7604 |
25 Feb 19 |
nicklas |
var frm = document.forms['calendar']; |
7604 |
25 Feb 19 |
nicklas |
currentDate.setHours(frm.hours.value); |
7604 |
25 Feb 19 |
nicklas |
currentDate.setMinutes(frm.minutes.value); |
7604 |
25 Feb 19 |
nicklas |
currentDate.setSeconds(frm.seconds.value); |
7604 |
25 Feb 19 |
nicklas |
244 |
} |
7604 |
25 Feb 19 |
nicklas |
245 |
|
7604 |
25 Feb 19 |
nicklas |
// Save the value to the date field |
7604 |
25 Feb 19 |
nicklas |
dateField.value = Dates.formatDate(currentDate, dateFormat); |
7604 |
25 Feb 19 |
nicklas |
// Fire an 'onchange' event |
7604 |
25 Feb 19 |
nicklas |
Events.sendChangeEvent(dateField); |
7604 |
25 Feb 19 |
nicklas |
// Set the focus... |
7604 |
25 Feb 19 |
nicklas |
dateField.focus(); |
7604 |
25 Feb 19 |
nicklas |
// ...and close the calendar |
7604 |
25 Feb 19 |
nicklas |
window.close(); |
7604 |
25 Feb 19 |
nicklas |
254 |
} |
7604 |
25 Feb 19 |
nicklas |
255 |
|
7604 |
25 Feb 19 |
nicklas |
256 |
/** |
7604 |
25 Feb 19 |
nicklas |
Event handler for 'click' events on a day in the calendar. |
7604 |
25 Feb 19 |
nicklas |
Saves the clicked date and closes the calendar (if no time |
7604 |
25 Feb 19 |
nicklas |
is used). |
7604 |
25 Feb 19 |
nicklas |
260 |
*/ |
7604 |
25 Feb 19 |
nicklas |
calendar.dayOnClick = function(event) |
7604 |
25 Feb 19 |
nicklas |
262 |
{ |
7604 |
25 Feb 19 |
nicklas |
if (!event.currentTarget.theDate) return; |
7604 |
25 Feb 19 |
nicklas |
currentDate = event.currentTarget.theDate; |
7604 |
25 Feb 19 |
nicklas |
if (useTime) |
7604 |
25 Feb 19 |
nicklas |
266 |
{ |
7604 |
25 Feb 19 |
nicklas |
calendar.displayMonth(currentDate.getFullYear(), currentDate.getMonth()); |
7604 |
25 Feb 19 |
nicklas |
268 |
} |
7604 |
25 Feb 19 |
nicklas |
else |
7604 |
25 Feb 19 |
nicklas |
270 |
{ |
7604 |
25 Feb 19 |
nicklas |
calendar.save(); |
7604 |
25 Feb 19 |
nicklas |
272 |
} |
7604 |
25 Feb 19 |
nicklas |
273 |
} |
7604 |
25 Feb 19 |
nicklas |
274 |
|
7604 |
25 Feb 19 |
nicklas |
275 |
/** |
7604 |
25 Feb 19 |
nicklas |
Set focus to 'next' day when arrow keys are pressed. |
7604 |
25 Feb 19 |
nicklas |
277 |
*/ |
7604 |
25 Feb 19 |
nicklas |
calendar.handleArrowKeys = function(event) |
7604 |
25 Feb 19 |
nicklas |
279 |
{ |
7604 |
25 Feb 19 |
nicklas |
var keyCode = event.keyCode; |
7604 |
25 Feb 19 |
nicklas |
if (keyCode >= 37 && keyCode <= 40) |
7604 |
25 Feb 19 |
nicklas |
282 |
{ |
7604 |
25 Feb 19 |
nicklas |
var week = Data.int(event.currentTarget, 'week'); |
7604 |
25 Feb 19 |
nicklas |
var day = Data.int(event.currentTarget, 'day'); |
7604 |
25 Feb 19 |
nicklas |
// 37 - left, 38 - up, 39 - right, 40 - down |
7604 |
25 Feb 19 |
nicklas |
if (keyCode == 37) day--; |
7604 |
25 Feb 19 |
nicklas |
if (keyCode == 38) week--; |
7604 |
25 Feb 19 |
nicklas |
if (keyCode == 39) day++; |
7604 |
25 Feb 19 |
nicklas |
if (keyCode == 40) week++; |
7604 |
25 Feb 19 |
nicklas |
var next = Doc.element('w'+week+'d'+day); |
7604 |
25 Feb 19 |
nicklas |
if (next && next.tabIndex != -1) |
7604 |
25 Feb 19 |
nicklas |
292 |
{ |
7604 |
25 Feb 19 |
nicklas |
next.focus(); |
7604 |
25 Feb 19 |
nicklas |
294 |
} |
7604 |
25 Feb 19 |
nicklas |
295 |
} |
7604 |
25 Feb 19 |
nicklas |
296 |
} |
7604 |
25 Feb 19 |
nicklas |
297 |
|
7604 |
25 Feb 19 |
nicklas |
return calendar; |
7604 |
25 Feb 19 |
nicklas |
299 |
}(); |
7604 |
25 Feb 19 |
nicklas |
300 |
|
7604 |
25 Feb 19 |
nicklas |
Doc.onLoad(Calendar.initPage); |
7604 |
25 Feb 19 |
nicklas |
302 |
|
7604 |
25 Feb 19 |
nicklas |
303 |
|