// Community Calendar
// Copyright 2004 Chaska.net
// Author Dale Hughes

// This file builds the actual calendar by writing into the divs created by myDcal.cgi
// if the Global variable Admin="yes" then this file will create links 
// in the days of the month to open an editor. (currently set to protected/myDcalUpdate.cgi)
// The varaibles for which day is clicked are passed like this.....
// protected/myDcalUpdate.cgi?day="+digit+"&month="+perlmonth+"&year="+year;

//******************** Some Globals ***************************
if (Admin == "yes") {
	AdminVers = " <span style='color:yellow;'> -> EVENTS EDITOR v1.0</span>";
}
else {
	AdminVers = "";
}
// Start off with the first calendar being active
var activeCalendar = 1;

// The RealXXXX variables never change.
var Now = new Date();
var RealYear = Now.getYear();
if (RealYear < 1000) {
	RealYear += 1900;
}
var RealMonth = Now.getMonth();
var RealDate = Now.getDate();
Now = null;
// These curXXXXX are changed at will to draw different days, months, years.
// Start off with the current date (if the variables were not set before this file was read.)
if (typeof(curYear) == "undefined") {
	var curYear = RealYear;
}
if (typeof(curMonth) == "undefined") {
	var curMonth = RealMonth;
}
if (typeof(curDate) == "undefined") {
	var curDate = RealDate;
}
//***********************************************************

//********************* Start the events reading section ********************

// Create arrays of the dates, the start time, the end time, the short description, and the long description
var calEventDate = new Array();
var calEventShortDesc = new Array();
var calEventLongDesc = new Array();
var calEventStartTime = new Array();
var calEventEndTime = new Array();
var calEventStartTimeAmPm = new Array();
var calEventEndTimeAmPm = new Array();

// read the events
readEvents();

function calendarEventsReadError(which_event,vary) {
	// kill any values that were inserted into the array
	calEventDate.length = which_event;
	calEventStartTime.length = which_event;
	calEventEndTime.length = which_event;
	calEventShortDesc.length = which_event;
	calEventLongDesc.length = which_event;
	which_event += 1; // The error seeker will not remember to start at 0
	alert("Error reading Calendar Events. Bad name=value pair at event "+which_event+" "+vary);
	return 0;
}

function readEvents() {
	var nameval;
	var e = 0;
	var timestring;
	var minutestring;
	var hour;
	var minutes;
	var ampm;
	var nv;
	// The time stored in the calEvents is not in military time.
	//for (var ed = 0; ed < calEvents.length; ed += 5) {
	var have_end_time;
	for (var ed = 0; ed < calEvents.length; ) {
		have_end_time = 0;
		nv = 0;
		nameval = calEvents[ed].split("=");
		if (nameval[0] == "date") {
			calEventDate[e] = nameval[1];
			ed += 1;
		}
		else return calendarEventsReadError(e,"date");

		nameval = calEvents[ed].split("=");
		if (nameval[0] == "startTime") {
			calEventStartTimeAmPm[e] = nameval[1];
			// convert time string 'hh:mm pm' to minutes
			timestring = nameval[1].split(":");
			hour = timestring[0]*1;
			minutestring = timestring[1].split(" ");
			minutes = minutestring[0]*1;
			ampm = minutestring[1];
			// convert to military time
			if (ampm == "pm" || ampm == "PM" || ampm == "Pm") {
				if (hour < 12) 	
					hour += 12;
			}
			calEventStartTime[e] = hour*60 + minutes*1;
			ed += 1;
		}
		else return calendarEventsReadError(e,"startTime");

		nameval = calEvents[ed].split("=");
		if (nameval[0] == "endTime") {
			calEventEndTimeAmPm[e] = nameval[1];
			// convert time string 'hh:mm pm' to minutes
			timestring = nameval[1].split(":");
			hour = timestring[0]*1;
			minutestring = timestring[1].split(" ");
			minutes = minutestring[0]*1;
			ampm = minutestring[1];
			// convert to military time
			if (ampm == "pm" || ampm == "PM" || ampm == "Pm") {
				if (hour < 12) 	
					hour += 12;
			}
			calEventEndTime[e] = hour*60 + minutes*1;
			have_end_time = 1;
			ed += 1;
		}
		//else return calendarEventsReadError(e,"endTime");

		nameval = calEvents[ed].split("=");
		if (nameval[0] == "shortDesc") {
			calEventShortDesc[e] = nameval[1];
			ed += 1;
		}
		else return calendarEventsReadError(e,"shortDesc");

		nameval = calEvents[ed].split("=");
		if (nameval[0] == "longDesc") {
			calEventLongDesc[e] = nameval[1];
			ed += 1;
		}
		else return calendarEventsReadError(e,"longDesc");
		if (have_end_time == 0)
			calEventEndTime[e] = calEventStartTime[e] + 30;
		++e;
	}
}
var calEventIndex = new Array();
function buildEventsIndex(year,month,day) {
	// Make an index of the events available for today
	calEventIndex.length = 0;
	var timevars;
	var ei = 0;
	for (var e = 0; e < calEventDate.length; e += 1) {
		timevars = calEventDate[e].split("-");
		if (timevars[2] == year && timevars[0] == (month+1) && timevars[1] == day)
			calEventIndex[ei++] = e;
	}
}
function hasEventToday(year,month,day) {
	var timevars;
	for (var e = 0; e < calEventDate.length; e += 1) {
		timevars = calEventDate[e].split("-");
		if (timevars[2] == year && timevars[0] == (month+1) && timevars[1] == day) {
			return true;
		}
	}
}

//********************* End the events reading section ********************



//******************** Start some calendar building utilities **********

function leapYear(year) {
        if (year % 4 == 0) { // basic rule
                return true; // is leap year
	}
        else {
                return false; // is not leap year
	}
}

function getDays(month, year) {
        // create an array to hold number of days in each month
        var ar = new Array(12);
        ar[0] = 31; // January
        ar[1] = (leapYear(year)) ? 29 : 28; // February
        ar[2] = 31; // March
        ar[3] = 30; // April
        ar[4] = 31; // May
        ar[5] = 30; // June
        ar[6] = 31; // July
        ar[7] = 31; // August
        ar[8] = 30; // September
        ar[9] = 31; // October
        ar[10] = 30; // November
        ar[11] = 31; // December

        // return number of days in the specified month (parameter)
        return ar[month];
}

function getMonthName(month) {
        // create array to hold name of each month
        var ar = new Array(12);
        ar[0] = "January";
        ar[1] = "February";
        ar[2] = "March";
        ar[3] = "April";
        ar[4] = "May";
        ar[5] = "June";
        ar[6] = "July";
        ar[7] = "August";
        ar[8] = "September";
        ar[9] = "October";
        ar[10] = "November";
        ar[11] = "December";

        // return name of specified month (parameter)
        return ar[month];
}
function getDayName(date) {
        var dayInstance = new Date(curYear, curMonth, date);
        var thisDay = dayInstance.getDay();
        dayInstance = null;
        // Array of abbreviated day names
        var dayNames = new Array(7);
        dayNames[0] = "Sunday";
        dayNames[1] = "Monday";
        dayNames[2] = "Tuesday";
        dayNames[3] = "Wednesday";
        dayNames[4] = "Thursday";
        dayNames[5] = "Friday";
        dayNames[6] = "Saturday";
	return dayNames[thisDay];
}

//******************** End calendar building utilities **********


//********************** Build the header tool bar **********
function buildHeader() {
        var headerId = document.getElementById("calendarHeader");
        var monthName = getMonthName(curMonth);
	var dayName = getDayName(curDate);
        var text = "";
        text += "<table width=100% border=0 cellpadding=0 cellspacing=0>";
        text +=     "<tr>";
        text +=         "<td colspan=3 class='preTableHeader' align='left'><span class='preTableHeaderText'>COMMUNITY CALENDAR"+AdminVers+"</span></td>";
        text +=     "</tr>";
        text +=     "<tr>";
        text +=         "<td width='20%' class='tableHeader' align='center'>";
	text +=		    "<a href='#' class='monthArrows' onclick='changeMonth(-1);buildCalendar();'><<</a>"
	text +=             "<span class='changeLetters'>&nbsp;Month&nbsp;</span>";
	text +=		    "<a href='#' class='monthArrows' onclick='changeMonth(1);buildCalendar();'>>></a>"
        text +=         "</td>";
        text +=         "<td width='20%' class='tableHeader' align='left'>";
	text +=		    "<a href='#' class='monthArrows' onclick='changeDay(-1);buildCalendar();'><<</a>"
	text +=             "<span class='changeLetters'>&nbsp;Day&nbsp;</span>";
	text +=		    "<a href='#' class='monthArrows' onclick='changeDay(1);buildCalendar();'>>></a>"
        text +=         "</td>";
        text +=         "<td width='60%' class='tableHeader' align='center'>";
        text +=                 "<span class='activeDate'>&nbsp;&nbsp;" 
	text +=                     dayName+" "+monthName+" "+curDate+" "+curYear; 
	text +=                 "&nbsp;&nbsp;</span>";
        text +=         "</td>";
        text +=     "</tr>";
        text += "</table>";
	headerId.innerHTML = text;
}
//********************** End of header tool bar **********

// *************** Draw the calendar *******************

function drawCal(divId,whichCalendar) {

	// Set some local variables to the global values
	var date=curDate;
	var month=curMonth;
	var year=curYear;

	// Get the name of the month
        var monthName = getMonthName(month)

        // Find out what day of the week the 1st is on.
        var firstDayInstance = new Date(year, month, 1)
        var firstDay = firstDayInstance.getDay()
	firstDay += 1;
        firstDayInstance = null

        // number of days in current month
        var lastDate = getDays(month, year)

	// We should have every thing we need to know to build a calendar

        // build a calendar 
        var text = ""
        text += "<center>"
        text += "<table width=100% height=100% border=0 cellpadding=0 cellspacing=1>"
	text +=     "<tr>"
        text +=         "<td bgcolor='#ffffee' colspan=8 height='20' align='center'>"
        text +=                 "<span class='calendarMonthText'>"
        text +=                         monthName + " " + year 
        text +=                 "</span>"
        text +=         "</td>"
	text +=     "</tr>"

        // Array of abbreviated day names
        var weekDay = new Array(7)
        weekDay[0] = "Su"
        weekDay[1] = "Mo"
        weekDay[2] = "Tu"
        weekDay[3] = "We"
        weekDay[4] = "Th"
        weekDay[5] = "Fr"
        weekDay[6] = "Sa"

        // Do the names of the days of the week
        text += "<tr align='center' valign='center'>"
        text += "<td width='2%' height='16' class='dayNames'>&nbsp;</td>"
        for (var dayNum = 0; dayNum < 7; ++dayNum) {
                  //text += "<td bgcolor='#efefef' width='14%' height='25' class='dayNames'>" + weekDay[dayNum] + "</td>"
                  text += "<td width='14%' height='16' class='dayNames'>" + weekDay[dayNum] + "</td>"
        }
        text += "</tr>"

        // declaration and initialization of two variables to help with tables
        var digit = 1
        var curCell = 1

	var classDIVtype ='';
	var classTDtype ='';
	// Make the day boxes with the numbers in them.
        for (var row = 1; row <= Math.ceil((lastDate + firstDay - 1) / 7); ++row) {
                text += '<TR ALIGN="right" VALIGN="top">'
        	text += "<td width='2%'  class='dayNames'>></td>"
                for (var col = 1; col <= 7; ++col) {
                        if (digit > lastDate)
                                break
                        if (curCell < firstDay) {
                                text += '<TD></TD>';
                                curCell++
                        } else {
                                if (curYear == RealYear && curMonth == RealMonth && digit == RealDate) { 
				    // current cell represent today's date
				    classDIVtype = "class='calCellDivToday'";
				    classTDtype = "class='calCellTDToday'";
				}
                                else if (digit == curDate && whichCalendar == activeCalendar) { 
				    // current cell represent date we are displaying
				    classDIVtype = "class='calCellDivDisplay'";
				    classTDtype = "class='calCellTDDisplay'";
				}
				// set the class in the loop below thats looking for the eventstext
				//else if (hasEventToday(curYear,curMonth,digit) == true) {
				//    classtype = "class='calCellDivEvent'";
				//}
				else {
				    classDIVtype = "class='calCellDiv'";
				    classTDtype = "class='calCellTD'";
				}
				var eventstext = "";
			        var timevars;
				// Loop through all the events to see if there are any for today.
			        for (var e = 0; e < calEventDate.length; e += 1) {
					timevars = calEventDate[e].split("-");
			                if (timevars[0] == (month+1) && timevars[1] == digit  && timevars[2] == year) {
						classDIVtype = "class='calCellDivEvent'";
						classTDtype = "class='calCellTDEvent'";
						eventstext += calEventShortDesc[e];
						eventstext += "<br>";
			                }
			        }
				text += "<TD "+classTDtype+">";
				text += "<img align='left' src='../../images/spacer.gif' width=1 height=60>";
				if (Admin == "yes") {
				    text += "<div "+classDIVtype+" onclick='doAdmin("+curYear+','+curMonth+','+digit+")'>";
				    text += "+- ";
				}
				else {
				    text += "<div "+classDIVtype+" onclick='showEvent("+curYear+','+curMonth+','+digit+','+whichCalendar+")'>";
				}

				text += digit+"<br><span class='eventstext'>"+eventstext+"</span></div></TD>";
                                digit++
                        }
                }
                text += '</TR>'
        }

        text += "</table>"
        text += "</center>"

	divId.innerHTML = text;
}
function changetdover(thistd) {
	// it would be better if we could just change style name..
	thistd.style.backgroundColor="#00ffff";
}
function changetdout(thistd) {
	// it would be better if we could just change style name..
	thistd.style.backgroundColor="lightblue";
}
function changeMonth(howmuch) {
	curMonth += howmuch;
	if (curMonth > 11) {
		curMonth -= 12;
		curYear += 1;
	}
	else if (curMonth < 0) {
		curMonth += 12;
		curYear -= 1;
	}
}
function changeDay(howmuch) {
	curDate += howmuch;
	if (curDate > getDays(curMonth,curYear)) {
		curDate = 1;
		changeMonth(1);
	}
	else if (curDate < 1) {
		changeMonth(-1);
		curDate = getDays(curMonth,curYear);
	}
}
//*************** end of calendar *********

function showEvent(year,month,day,whichCalendar) {
	buildEventsIndex(year,month,day);
	longDescriptionId = document.getElementById("longDescription");
	var text = '';

	if (calEventIndex.length == 0) {
		text = "<p><span class='calEventShortDesc'>There are no events listed for "+getMonthName(month)+", "+day+" "+year+".</span></p>";
	}
	else {
		text = "<p><span class='calEventShortDesc'>Events for "+getMonthName(month)+", "+day+" "+year+".</span></p>";
	}
	for (var en = 0; en < calEventIndex.length; en++) {
		text += "<p><span class='calEventShortDesc'>"+calEventShortDesc[calEventIndex[en]]+"&nbsp; &nbsp;<span class='showtime'>"+calEventStartTimeAmPm[calEventIndex[en]];
		if (calEventEndTimeAmPm[calEventIndex[en]] != calEventStartTimeAmPm[calEventIndex[en]]) {
			text += " - "+calEventEndTimeAmPm[calEventIndex[en]];
		}
		text += "</span><br></span><span class='longDescText'>"+calEventLongDesc[calEventIndex[en]]+"</span></p>";
	}
	longDescriptionId.innerHTML = text;
}
function showLongDesc(en) {
	longDescriptionId = document.getElementById("longDescription");
	//var text = "<span class='longDescText'>"+calEventLongDesc[calEventIndex[en]]+"</span>";
	var text = "<span class='showtime'>"+calEventStartTimeAmPm[calEventIndex[en]]+"-"+calEventEndTimeAmPm[calEventIndex[en]]+"</span><br><span class='hourRowContentEventT'>"+calEventShortDesc[calEventIndex[en]]+"<p></span><span class='longDescText'>"+calEventLongDesc[calEventIndex[en]]+"</span>";
	longDescriptionId.innerHTML = text;
}
var ETWin = null;
function showEventsTodayWin(date) {
        if (ETWin == null || ETWin.closed) {
                var open_arg_str = "resizable=yes,scrollbars=yes,toolbar=no,status=no,width=400,height=500,left=300,top=30"
                ETWin = window.open("myDcalShowEvents.cgi?date","EventViewer",open_arg_str);
        }
        else { // the window is already open.
                ETWin.location = "myDcalShowEvents.cgi?date";
        }
        ETWin.focus();
}

function buildCalendar() {
        var calendarId;
	buildHeader();
	calendarId = document.getElementById("calendar1");
	drawCal(calendarId,1); // The 2nd arg tells which calendar to draw.
	showEvent(curYear,curMonth,curDate,"calendar1");

//	if (activeCalendar == 2)
//		changeMonth(-1);
//	calendarId = document.getElementById("calendar1");
//	drawCal(calendarId,1); // The 2nd arg tells which calendar to draw.
//
//        changeMonth(1);
//
//        calendarId = document.getElementById("calendar2");
//	drawCal(calendarId,2);
//	if (activeCalendar == 1)
//        	changeMonth(-1);
//	buildHeader();

}
function doAdmin (year,month,day) {
    	perlmonth = month + 1;
	var progquery = "protected/myDcalUpdate.cgi?day="+day+"&month="+perlmonth+"&year="+year;
	document.location = progquery;
}

