// Copyright © 2008-2009 Robert L. Crawford

// Global constants
var HourMsec = 3600000;
var DayMsec = 24*HourMsec;
var WeekMsec = 7*DayMsec;
var SlotMsec = Math.floor(2.5*HourMsec);
var BaseHour = 8*HourMsec;

var MonthNames = ['January','February','March','April','May','June','July','August','September','October','November','December'];
var MonthAbbrs = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];

var DayNames = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];

var SlotTimes = ['?','0800a','1030a','0100p','0330p','0600p']

// Holiday entry constants
var HNI = 0;	// Holiday name
var HDT = 1;	// Holiday date

var HolidayDates = new Array();

// Meeting time entry constants
var MNI = 0;	// Meeting name
var MDT = 1; 	// Starting date/time
var MLN = 2;	// Meeting length in minutes

var MeetTimes = new Array();

// Course entry constants
var RTI = 0;	// Course title
var RNM = 1;	// Course nickname (for monthly calendar)
var RNS = 2;	// Number of sessions
var RSL = 3;	// Session length in minutes
var RTY = 4;	// Course type (pc or mac)
var RST = 5;	// Course status

var Courses = new Array();

// Instructor entry constants
var INM = 0;	// Instructor full name
var ILN = 1;	// Instructor last name
var ICT = 2;	// Array of courses taught

var Instructors = new Array();

// Class entry constants
var CCN	= 0;	// Course number
var CIN = 1;	// Instructor

var Classes = new Array();

// Session type constants
var InProcess = 1;
var Tentative = 2;
var Fixed = 3;

// Session entry constants
var SCN = 0;	// Class number
var SDT = 1;	// Session date/time
var SLN = 2;	// Session length in minutes
var STY = 3;	// Type (see above)

var Sessions = new Array();

function DisplayCalendar()
{
	var cd = new Date(CurrentDate.valueOf());
	var m = cd.getMonth();
	var mon = MonthAbbrs[m]+' ';

	if (cd.getDate() == 1)
		var monyr = MonthNames[m]+' '+cd.getFullYear();
	else if (m < 11)
		var monyr = MonthNames[m+1]+' '+cd.getFullYear();
	else
		var monyr = MonthNames[0]+' '+(cd.getFullYear()+1);

	document.getElementById('ThisMonth').innerHTML = monyr;

	for (var w = 0; w < 6; w++)
	{
		for (var d = 0; d < 7; d++)
		{
			var box = document.getElementById('w'+w+'d'+d+'s0');
			box.innerHTML = mon + cd.getDate();
			var cd = new Date(cd.getFullYear(), cd.getMonth(), cd.getDate()+1);
			var tm = cd.getMonth();
			if (tm == m)
				mon = '';
			else
			{
				m = cd.getMonth();
				mon = MonthAbbrs[m]+' ';
			}
			if (d > 0) // Mon-Sat have time slots
			{
				for (var s = 1; s < 6; s++)
				{
					var slot = document.getElementById('w'+w+'d'+d+'s'+s);
					slot.className = '';
					slot.innerHTML = SlotTimes[s];
					slot.itemCode = 'o';
					slot.style.background = '';
					slot.title = '';
					slot.onclick = '';
//					slot.removeEventListener('click', DisplayClassDetails, false);
				}
			}
		}
	}
	ShowHolidays();
	ShowMeetings();
	ShowClasses();
}

function ShowHolidays()
{
	var begin = CurrentDate.valueOf();
	var end = CurrentDate.valueOf() + 6*WeekMsec;

	for (var h = 0; h < HolidayDates.length; h++)
	{
		var dt = HolidayDates[h][HDT].valueOf();
		if (dt >= begin && dt < end)
		{
			var day = Math.floor((dt-begin)/DayMsec);
			var w = Math.floor(day/7);
			var d = day % 7;
			document.getElementById('w'+w+'d'+d+'s1').innerHTML = HolidayDates[h][HNI];
			document.getElementById('w'+w+'d'+d+'s1').itemCode = 'h';
			document.getElementById('w'+w+'d'+d+'s2').innerHTML = '&nbsp;';
			document.getElementById('w'+w+'d'+d+'s3').innerHTML = 'Club closed today';
			document.getElementById('w'+w+'d'+d+'s3').itemCode = 'h';
			document.getElementById('w'+w+'d'+d+'s4').innerHTML = '&nbsp;';
			document.getElementById('w'+w+'d'+d+'s5').innerHTML = '&nbsp;';
		}
	}
}

function ShowMeetings()
{
	var begin = CurrentDate.valueOf();
	var end = CurrentDate.valueOf() + 6*WeekMsec;

	for (var m = 0; m < MeetTimes.length; m++)
	{
		var dt = MeetTimes[m][MDT].valueOf();
		if (dt >= begin && dt < end)
		{
			var day = Math.floor((dt-begin)/DayMsec);
			var w = Math.floor(day/7);
			var d = day % 7;
			var s = Math.floor(((dt - begin - DayMsec*day) - BaseHour) / (SlotMsec)) + 1;
			var slot = document.getElementById('w'+w+'d'+d+'s'+s);
			var cTime = tmf(MeetTimes[m][MDT]);
			if (cTime.substr(1,1) == ':')
				var sTime = '0' + cTime.substr(0,1) + cTime.substr(2,2) + cTime.substr(5,1);
			else
				var sTime = cTime.substr(0,2) + cTime.substr(3,2) + cTime.substr(6,1);
			slot.innerHTML = sTime + ' ' + MeetTimes[m][MNI];
			slot.itemCode = 'm';
		}
	}
}

function ShowClasses()
{
	var begin = CurrentDate.valueOf();
	var end = begin + 6*WeekMsec;

	for (var c = 0; c < Sessions.length; c++)
	{
		var dt = Sessions[c][SDT].valueOf();
		if (dt >= begin && dt < end)
		{
			var day = Math.floor((dt-begin)/DayMsec);
			var w = Math.floor(day/7);
			var d = day % 7;
			var s = Math.floor(((dt - begin - DayMsec*day) - BaseHour) / (SlotMsec)) + 1;
			var slot = document.getElementById('w'+w+'d'+d+'s'+s);
			var cTime = tmf(Sessions[c][SDT]);
			if (cTime.substr(1,1) == ':')
				var sTime = '0' + cTime.substr(0,1) + cTime.substr(2,2) + cTime.substr(5,1);
			else
				var sTime = cTime.substr(0,2) + cTime.substr(3,2) + cTime.substr(6,1);

			slot.className = (Courses[Classes[Sessions[c][SCN]][CCN]][RTY] == 'Mac')? 'MacClass': 'PCclass';
			slot.innerHTML = sTime + ' ' + Courses[Classes[Sessions[c][SCN]][CCN]][RNM] + ' ' + Instructors[Classes[Sessions[c][SCN]][CIN]][ILN];
			slot.itemCode = (Sessions[c][STY] == Fixed)? 'f': 'c';
			var tip = cTime + ' - ' +tmf(new Date(Sessions[c][SDT].valueOf()+60000*Sessions[c][SLN]));
			tip += ', ' + Instructors[Classes[Sessions[c][SCN]][CIN]][INM] + ', [' + Courses[Classes[Sessions[c][SCN]][CCN]][RTY] + '] ';
			tip += Courses[Classes[Sessions[c][SCN]][CCN]][RTI];
			slot.title = tip;
			slot.onclick = DisplayClassDetails;
			slot.clsNum = Sessions[c][SCN];
		}
	}
}

function tmf(dt)
{
	var ap = ' am';
	var hr = dt.getHours();

	if (hr >= 12)
	{
		if (hr > 12) hr -= 12;
		ap = ' pm';
	}
	var min = dt.getMinutes();
	if (min < 10) min = '0'+min;
	return hr + ':' + min + ap;
}

// Called by LastMonth (a = -1) and NextMonth (a = +1) buttons
function ChangeDate(a)
{
	var firstDate = BaseDate.valueOf();
	var lastDate = LastDate.valueOf();
	var newDate = AdjustCurrentDate(a);
	var newValue = newDate.valueOf();
	if (newValue < firstDate || newValue >= lastDate)
	{
		var msg = (newValue < firstDate)? 'You cannot move back any more.': 'You cannot move forward any more.';
		alert(msg);
		return;
	}
	CurrentDate = newDate;
	CurrentEnd = new Date(CurrentDate.valueOf() + 6*WeekMsec);
	DisplayCalendar();
}

function AdjustCurrentDate(a)
{
	var y = CurrentDate.getFullYear();
	var m = CurrentDate.getMonth() + a;
	if (CurrentDate.getDate() != 1) m++;

	if (m >= 12)
	{
		m -= 12;
		y++;
	}
	if (m < 0)
	{
		m += 12;
		y--;
	}
	var cd = new Date(y,m,1);
	return new Date(cd.getFullYear(), cd.getMonth(), cd.getDate() - cd.getDay());
}

function DisplayClassDetails()
{
	var course = Classes[this.clsNum][CCN];
	var type = (Courses[course][RTY] == 'Mac')? 'Mac Class': 'PC Class';
	var title = Courses[course][RTI];
	var instructor = Instructors[Classes[this.clsNum][CIN]][INM];
	var sess = new Array();

	for (var s = 0; s < Sessions.length; s++)
		if (Sessions[s][SCN] == this.clsNum) sess.push(Sessions[s][SDT]);

	var details = type + "\n";
	details += title + "\n";
	details += 'Instructor: ' + instructor + "\n";
	details += 'Class times: ' + FormatSessions(sess);
	alert(details);
}

function FormatSessions(sessList)
{
	var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
	var weekDays = ['S','M','T','W','Th','F','Sa'];
	var result = '';
	var comma = '';
	var lastMonth = '';
	var lastTime = '';
	for (var s = 0; s < sessList.length; s++)
	{
		var month = months[sessList[s].getMonth()];
		var time = tmf(sessList[s]);
		
		if (lastTime != '' && time != lastTime)
		{
			result += ' at ' + lastTime;
			lastMonth = '';
		}
		if (month != lastMonth)
		{
			result += comma + month + ' ';
			lastMonth = month;
			comma = '';
		}
		result += comma + sessList[s].getDate();	// + weekDays[sessList[s].getDay()];
		comma = ', ';
		lastTime = time;
	}
	return result + ' at ' + lastTime;
}

