/*
 * Copyrighted by Paul Saunders, 2008.
 *
 * Redistribution and use of any content in source and/or binary forms,
 * with or without modification, are permitted provided that the following
 * conditions are met:
 *
 * Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * The name of Paul Saunders and the names of my contributors may not be used to
 * endorse or promote products derived from this software without specific
 * prior written permission.
 *
 * The content of this web site and the software herein is provided by the
 * copyright holders and contributors "as is" and any express or implied
 * warranties, including, but not limited to, the implied warranties of
 * merchantability and fitness for a particular purpose are disclaimed.
 * In no event shall the copyright owner or contributors be liable for any
 * direct, indirect, incidental, special, exemplary, or consequential damages
 * (including, but not limited to, procurement of substitute goods or services;
 * loss of use, data, or profits; or business interruption) however caused and
 * on any theory of liability, whether in contract, strict liability, or tort
 * (including negligence or otherwise) arising in any way out of the use of
 * this software, even if advised of the possibility of such damage.
*/
var pageLoaded = 0;
var noEventMsg =  'No event for ';
var eventMsg = 'Event for ';
var months = ['January','February','March','April','May','June','July','August','September','October','November','December'];
var days = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'];
var todaysDate = new Date();
var calArray = new Array();
var calId = 'calendar';
var calEventId = 'calendar_event';
var startDiv = '<div>';
var endDiv = '<\/div>';
var startUl = '<ul>';
var endUl = '<\/ul>'
var startLi = '<li>';
var endLi = '<\/li>'
var endSpan = '<\/span>';
var nbsp = '&nbsp;'
var brTag = '<br \/>';
var endAnchor = '</a>';
var brX3 = brTag+nbsp+brTag+nbsp+brTag+nbsp;
var calBodyStart = '<div id="calendar_body">';
var calEventStart = '<div id="calendar_event">';
var calHeaderStart = '<div id="calendar_header">';
var calDaysStart = '<span class="calendar_day">';
var startCalRow = '<div class="calendar_row">';
var endCalRow = endDiv + brTag;
var calNumStart = '<span class="calendar_num">';
var emptyCalBox = '<span class="calendar_box empty_box">' + brX3 + endSpan;
var calInEventStart = '<span class="calendar_inevt">';
var startCalNav = '<div id="calendar_nav">';
var calNavClickStart = '<a href="#" onclick="return navigateCalendar(';
var calNavClickEnd = ');">';
var calNavToday = '<a href="#" onclick="start(); return false;">Today</a>';
var calBodyId = 'calendar_body';
var calBoxClass = 'calendar_box';
var calTodayClass = 'calendar_today';
function start() {
    document.getElementById(calId).innerHTML = 
    	calBodyStart + renderCalendarHTML(0,0) + endDiv + calEventStart + endDiv;
    showEvents(todaysDate.getDate(), todaysDate.getMonth(), todaysDate.getFullYear());
}
function navigateCalendar(yy, mm) {
	if (cala = renderCalendarHTML(yy,mm)) {
		document.getElementById(calBodyId).innerHTML = cala;
	}
	return false;
}
function AddEvent(dateString, dayString, eventString, description) {
	var CalEvent = {
		date : dateString || "",
		day : dayString || "",
		eventText : eventString || "",
		desc : description || ""
	}
	calArray[calArray.length] = CalEvent;
}
function renderCalendarHTML(yy, mm) {
	var calendar = new Date();
    if (yy > 0 || mm > 0) {
	    calendar.setFullYear(yy);
	    calendar.setMonth(mm);
    }
    if (calendar.getTime() < todaysDate.getTime()
		|| (calendar.getFullYear() - 4  + 3) > todaysDate.getFullYear() || todaysDate.getFullYear() > 2010) {
        alert("Sorry, but you cannot view events in the past.");
        return;
    }
    calendar.setDate(1);
    var curYear = calendar.getFullYear();
    var curMonth = calendar.getMonth();
    var weekday = calendar.getDay();
    var calHTML = startDiv + calHeaderStart + months[curMonth]  + ' ' + curYear + endDiv;
    calHTML += startCalRow;
    for (dayCntr=0; dayCntr < 7; dayCntr++) {
    	calHTML += calDaysStart + days[dayCntr] + endSpan;
    }
    calHTML += endCalRow;
    var dayOfWeek = calendar.getDay();
    var daysInMonth = new Date(curYear, curMonth + 1, 0).getDate();
    calHTML += startCalRow;
    for (dayCntr=0; dayCntr < weekday; dayCntr++) {
    	calHTML += emptyCalBox;
    }
    var monthsDate = new Date(curYear, curMonth, 1);
    var rowCount = 1;
    for (dayCntr=1; dayCntr <= daysInMonth; dayCntr++) {
        if (weekday == 7) {
        	calHTML += endCalRow + startCalRow;
            weekday = 0;
            rowCount++;
        }
        monthsDate.setDate(dayCntr);
        var isToday = false;
        if (todaysDate.getFullYear() == monthsDate.getFullYear()
       	 && todaysDate.getMonth() == monthsDate.getMonth()
       	 && todaysDate.getDate() == monthsDate.getDate()) {
        	isToday = true;
        }
        calHTML += '<span ' 
        	+ renderDateLinks(monthsDate.getDate(), monthsDate.getMonth(), monthsDate.getFullYear(), isToday) 
        	+ '>'
            + calNumStart + dayCntr  + endSpan 
            + getCalEvents(monthsDate.getDate(), monthsDate.getMonth(), monthsDate.getFullYear()) 
            + endSpan;
        weekday++;
    }
    for (dayCntr=weekday; dayCntr < 7; dayCntr++) {
    	calHTML += emptyCalBox;
    }
    calHTML += endDiv + brTag;
    calHTML += createCalNav(calendar) + endDiv;
    return calHTML;
}
function createCalNav(calendar) {
    var curYear = calendar.getFullYear();
    var curMonth = calendar.getMonth();
	var prevYear = curYear - 1;
	var prevMonth;
	var nextYear = curYear + 1;
	var nextMonth;
	var prevYearCurMonthLink = prevYear + ',' + curMonth;
	var nextYearCurMonthLink = nextYear + ',' + curMonth;
	if (calendar.getMonth() == 0) {
		prevMonth = 11;
		curYear--;
	}else { 
		prevMonth = calendar.getMonth() - 1;
	}
	var curYearPrevMonth = curYear + ',' + prevMonth;
	curYear = calendar.getFullYear();
	if (calendar.getMonth() == 11) {
		nextMonth = 0;
		curYear++;
	}else {
		nextMonth = calendar.getMonth() + 1;
	}
	var curYearNextMonth = curYear + ',' + nextMonth;
    return startCalNav 
    + calNavClickStart + prevYearCurMonthLink + calNavClickEnd +'<<' + endAnchor 
    + nbsp + nbsp + nbsp + nbsp  
    + calNavClickStart + curYearPrevMonth + calNavClickEnd + '<' + endAnchor 
    + nbsp + nbsp + nbsp + nbsp 
    + calNavToday 
    + nbsp + nbsp + nbsp + nbsp 
    + calNavClickStart + curYearNextMonth + calNavClickEnd + '>' + endAnchor 
    + nbsp + nbsp + nbsp + nbsp 
    + calNavClickStart + nextYearCurMonthLink + calNavClickEnd + '>>' + endAnchor 
    + endDiv;
}
function renderDateLinks(day, month, year, isToday) {
    var className = calBoxClass;
    if (isToday) {
        className += ' ' + calTodayClass;
    }
    return 'class="' + className 
         + '" onclick="showEvents(' + day + ',' + month + ',' + year 
         + '); return false;"';
}
function showEvents(day, month, year) {
    var eventMessage = '';
    var date = new Date(year, month, day);
    var dayOfWeek = days[date.getDay()];
    var eventString = getEventDescriptions(day, (month+1), year, dayOfWeek);
    var dateString = months[month] + ' ' + day + ', ' + year;
    if (eventString == '') {
        eventMessage += noEventMsg + dateString;
    }else {
        eventMessage += eventMsg + dateString + ':' + startUl + eventString + endUl;
    }
    if (document.getElementById(calEventId)) {
        document.getElementById(calEventId).innerHTML = eventMessage;
    }
    return eventMessage;
}
function getCalEvents(day, month, year) {
    var eventMessage = '';
    var date = new Date(year, month, day);
    var dayOfWeek = days[date.getDay()];
    var eventString = getEventsForDate(day, (month+1), year, dayOfWeek);
    if (eventString == '') {
        eventMessage = brX3;
    }else {
        eventMessage = calInEventStart + eventString + endSpan;
    }
    return eventMessage;
}
function getEventsForDate(dayVal, monthVal, yearVal, dayOfWeek) {
	var eventString = ''; 
	monthVal = (monthVal > 9 ? monthVal + '' : '0' + monthVal);
	dayVal = (dayVal > 9 ? dayVal + '' : '0' + dayVal);
    for (x = 0; x < calArray.length; x++) {
    	if (calArray[x].date == (yearVal + monthVal + dayVal)
    	 || calArray[x].date == ('0000' + monthVal + dayVal)) {
    			eventString += brTag + calArray[x].eventText;
    	}else if (calArray[x].day == dayOfWeek) {
    		eventString += brTag + calArray[x].eventText;
    	}
    }
    return eventString;
}
function getEventDescriptions(dayVal, monthVal, yearVal, dayOfWeek) {
	var eventString = ''; 
	monthVal = (monthVal > 9 ? monthVal + '' : '0' + monthVal);
	dayVal = (dayVal > 9 ? dayVal + '' : '0' + dayVal);
    for (x = 0; x < calArray.length; x++) {
    	if (calArray[x].date == (yearVal + monthVal + dayVal)
    	 || calArray[x].date == ('0000' + monthVal + dayVal)) {
    			eventString += startLi + calArray[x].desc + endLi + brTag;
    	}else if (calArray[x].day == dayOfWeek) {
    		eventString += startLi + calArray[x].desc + endLi + brTag;
    	}
    }
    return eventString;
}