// global variables

var oneDay = 1000 * 60 * 60 * 24;
var calendarList = new Object();

// common methods

function draw() {
this.containerElement.appendChild(this.body);
}

function getDayAbbreviation(weekDay) {
var str = '';
switch (weekDay) {
case 0:
str = 'SUN';
break;
case 1:
str = 'MON';
break;
case 2:
str = 'TUE';
break;
case 3:
str = 'WED';
break;
case 4:
str = 'THU';
break;
case 5:
str = 'FRI';
break;
case 6:
str = 'SAT';
break;
}
return str;
}


function getMonthName(monthIndex) {
var str = '';
switch (monthIndex) {
case 0:
str = 'January';
break;
case 1:
str = 'February';
break;
case 2:
str = 'March';
break;
case 3:
str = 'April';
break;
case 4:
str = 'May';
break;
case 5:
str = 'June';
break;
case 6:
str = 'July';
break;
case 7:
str = 'August';
break;
case 8:
str = 'September';
break;
case 9:
str = 'October';
break;
case 10:
str = 'November';
break;
case 11:
str = 'December';
break;
}
return str;
}

// object constructors

function calendarDate(containerElement, newDate, calendarWeek) {
this.events = new Array();
this.containerElement = containerElement;
this.calendarWeek = calendarWeek;
this.calendar = this.calendarWeek.calendar;
this.date = newDate;
this.draw = draw;
this.event = this.calendar.eventList.getEvent(this.date)
this.hasEvent = hasEvent;
var elmt = this.calendarWeek.body.insertCell(this.calendarWeek.body.cells.length);
var txt;
if (this.calendar.month == this.date.getMonth()) {
if (this.hasEvent()) {
elmt.className = "calendar_sm_on";
elmt.id = "calendar_cell_on";
try {
elmt.style.setAttribute("cursor", "hand");
}
catch(e) {
elmt.setAttribute("style", "cursor: hand; cursor: pointer;");
}
txt = document.createTextNode(this.date.getDate());
}
else {
elmt.className = "calendar_sm";
elmt.id = "calendar_cell";
txt = document.createTextNode(this.date.getDate());
}
elmt.onclick = new Function("calendarList['" + this.calendar.id + "'].showEvent(new Date(" + this.date.getFullYear() + ", " + this.date.getMonth() + ", " + this.date.getDate() + "))");
}
else {
elmt.className = "calendar_sm_off";
elmt.id = "calendar_cell_off";
txt = document.createTextNode(this.date.getDate());
}
this.body = elmt;
this.body.appendChild(txt);
}

// calendarDate methods

function hasEvent() {
return (this.event != void(0));
}

// calendarWeek constructor

function calendarWeek(containerElement, startDate, calendar) {

this.containerElement = containerElement;
this.calendar = calendar;
this.draw = draw;
var elmt = this.calendar.tbody.insertRow(this.calendar.tbody.rows.length);
elmt.className = "calendar_md";
elmt.id = "calendar_row";
this.body = elmt;
this.startDate = startDate;
this.addDate = addDate;
this.dates = new Array();
for (i = 0; i < 7; i++) {
this.addDate(this.body, i);
//                        this.dates[i].draw();
}
//				this.calendar.tbody.appendChild(this.body);
}

// calendarWeek object methods

function addDate(containerElement, dayNumber) {
var startDate = new Date(this.startDate.getFullYear(), this.startDate.getMonth(), this.startDate.getDate() + dayNumber);
this.dates[dayNumber] = new calendarDate(containerElement, startDate, this);
}

// calendar object constructor

function calendar(eventList, containerElement, eventContainerElement, startyear, startmonth) {

this.id = containerElement.id;
calendarList[this.id] = this;
this.eventList = eventList;
this.containerElement = containerElement;
this.eventContainerElement = eventContainerElement;
this.draw = draw;
this.addWeek = addWeek;
this.setMonth = setMonth;
this.goNextMonth = goNextMonth;
this.goPreviousMonth = goPreviousMonth;
this.showEvent = showEvent;
this.startmonth = startmonth;
this.startyear = startyear;
this.setMonth(startyear, startmonth);
}

// calendar object methods

function showEvent(eventDate) {
var strHTML = '<hr style="border:1px solid #dfaa8c"><span class="text_lg_bk">Events for ';
strHTML += getMonthName(eventDate.getMonth()) + ' ' + eventDate.getDate() + ', ' + eventDate.getFullYear() + '</span>';
strHTML += '<hr style="border:1px solid #dfaa8c">';
var eventArray = this.eventList.getEvent(eventDate);
if (eventArray == void(0)) {
strHTML += 'There are no events scheduled on this date.';
}
else {
strHTML += this.eventContainerElement.innerHTML = eventArray.join('<hr>');
}
this.eventContainerElement.innerHTML = strHTML;
}

function goNextMonth() {
var dt = new Date(this.year, this.month, 1);
while(dt.getMonth() == this.month) {
dt = new Date(dt - 1 + 1 + (oneDay * 7));
}
var newMonth = dt.getMonth();
var newYear = dt.getFullYear();
if (newYear >= this.tofarfutureloadmoredatayear) {
window.location="http://www.arcse-mn.org/events.php?&date=" + this.tofarfutureloadmoredatayear + "-1-1";
}
if (    (    ((this.startmonth + 2) > 11) 
          && ((newYear > (this.startyear + 1)) || ((newYear == (this.startyear +1)) && (newMonth > (this.startmonth + 2 - 12)))))
    ||  (     ((this.startmonth +2) <= 11)
          &&  ((newYear > this.startyear) || ((newYear == this.startyear) && (newMonth > (this.startmonth + 2)))))) {
window.location="http://www.arcse-mn.org/events.php?&date=" + newYear + "-" + (newMonth+1) + "-1";
}
this.setMonth(newYear, newMonth);
this.draw();
}

function goPreviousMonth() {
var dt = new Date(this.year, this.month, 1);
while(dt.getMonth() == this.month) {
dt = new Date(dt - (oneDay * 7));
}
var newMonth = dt.getMonth();
var newYear = dt.getFullYear();
if (    (    ((this.startmonth - 2) < 0) 
          && ((newYear < (this.startyear - 1)) || ((newYear == (this.startyear -1)) && (newMonth < (this.startmonth - 2 + 12)))))
    ||  (     ((this.startmonth -2) >= 0)
          &&  ((newYear < this.startyear) || ((newYear == this.startyear) && (newMonth < (this.startmonth - 2)))))) {
window.location="http://www.arcse-mn.org/events.php?&date=" + newYear + "-" + (newMonth+1) + "-1";
}
this.setMonth(newYear, newMonth);
this.draw();
}

function setMonth(year, month) {
this.month = month;
this.year = year;
var dt = new Date(year, month, 1);
dt = new Date(dt - dt.getDay() * oneDay)
this.startDate = dt;
try {
this.containerElement.removeChild(this.body);
}
catch(e) {
}
var elmt = document.createElement('TABLE')
elmt.className = "calendar_lg";
elmt.id = "calendar_table";
this.body = elmt;

elmt = document.createElement('TBODY');
elmt.className = "calendar_lg";
elmt.id = "calendar_tbody";
this.tbody = elmt;

elmt = this.body.createTHead();
elmt.className = "calendar_lg";
elmt.id = "calendar_thead";
this.thead = elmt;
this.body.appendChild(this.thead);

// add a heading for the month names
//                elmt = document.createElement('TR');
elmt = this.thead.insertRow(0);
elmt.className = "calendar_md";
elmt.id = "calendar_top_row";
this.topRow = elmt;

// add the "previous month" button to the top row
elmt = document.createElement('TH');
elmt.className = "calendar_sm";
elmt.id = "calendar_previous_cell";
var txt = document.createElement('A');
txt.className = "text_md_bk"
txt.href = "javaScript: calendarList['" + this.id + "'].goPreviousMonth();"
txt.innerHTML = '&lt;&lt;';
elmt.appendChild(txt);
this.topRow.appendChild(elmt);

// add the month heading to the top row
elmt = document.createElement('TH');
elmt.className = "calendar_sm";
elmt.id = "calendar_monthname_cell";
elmt.colSpan = "5";
txt = document.createTextNode(getMonthName(month) + ', ' + year);
elmt.appendChild(txt);
this.topRow.appendChild(elmt);

// add the "next month" button to the top row
elmt = document.createElement('TH');
elmt.className = "calendar_sm";
elmt.id = "calendar_next_cell";
var txt = document.createElement('A');
txt.className = "text_md_bk"
txt.href = "javaScript: calendarList['" + this.id + "'].goNextMonth();"
txt.innerHTML = '&gt;&gt;';
elmt.appendChild(txt);
this.topRow.appendChild(elmt);

// add a heading for the week names
elmt = this.thead.insertRow(1);
elmt.className = "calendar_md";
elmt.id = "calendar_heading_row";
this.headingRow = elmt;

// insert calendar rows
this.body.appendChild(this.tbody);
for (i = 0; i < 7; i++) {
elmt = document.createElement('TH');
elmt.className = "calendar_sm";
elmt.id = "calendar_heading_cell";
var txt = document.createTextNode(getDayAbbreviation(i));
elmt.appendChild(txt);
this.headingRow.appendChild(elmt);
}
//                this.body.appendChild(this.headingRow);

// create an array of calendarWeek objects
this.weeks = new Array();
//                for(var i = 0; i < 6; i++) {
//                        this.addWeek(this.body, month, year, i);
//                }
for(var i = 0; i < 6; i++) {
this.addWeek(this.body, month, year, i);
var dt = new Date(this.startDate - 1 + 1 + ((i + 1) * 7 * oneDay));
if (dt.getMonth() != month) break;
}


}


function addWeek(containerElement, month, year, weekNumber) {
var startDate = new Date(this.startDate.getFullYear(), this.startDate.getMonth(), this.startDate.getDate() + (weekNumber * 7));
this.weeks[weekNumber] = new calendarWeek(containerElement, startDate, this);
}

// constructor for event-list object

function eventList() {
this.eventList = new Object();
this.addEvent = addEvent;
this.getEvent = getEvent;
}

// event-list methods

function addEvent(eventDate, eventDescription) {
var dt = new Date(eventDate.getFullYear(), eventDate.getMonth(), eventDate.getDate());
var evnt = this.eventList[dt];
if(evnt == void(0)) {
evnt = new Array(eventDescription);
this.eventList[dt] = evnt;
}
else {
evnt[evnt.length] = eventDescription;
}
}

function getEvent(eventDate) {
var dt = new Date(eventDate.getFullYear(), eventDate.getMonth(), eventDate.getDate());
var evnt = this.eventList[dt];
if (evnt == void(0)) {
return void(0);
}
else {
return evnt;
}
}


