var dim = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var firstCalendar = new Object;
var today = new Date();
var lastMin = -1;
var objHTTP = null;
var activeDate = null;
var userNode = null;

var m = 0;
var y = 0;

function ValidateEmail(str)
// returns if passed email is valid
{
	if (str.indexOf(',') != -1) return false;
	if (str.indexOf(';') != -1) return false;
	var parts = str.split('@');
	if (parts.length != 2) return false;
	if (parts[0] == '') return false;
	var parts2 = parts[1].split('.');
	if (parts2.length < 2) return false;
	for (var x = 0; x < parts2.length; x++) 
		if (parts2[x] == '') return false; 
	return true;
}


function GotoToday()
// Moves the calendars to today..
{
	var d = new Date();
	ViewDay(d);
	if (firstCalendar.month == d.getMonth() && firstCalendar.year == d.getFullYear()) return; // Already at today...
	
	var v1 = (d.getFullYear() * 12) + d.getMonth();
	var v2 = (firstCalendar.year * 12) + firstCalendar.month;
	var top = 538;
	if (v1 > v2) top = -247; 

	m = firstCalendar.month;
	y = firstCalendar.year;
	for (var x = 0; x < 3; x++) {
		animationCtrl.SetWanted('calendar_' + m + '_' + y, null, top, null, null, null, DestroyCalendar);	
		CalcMY(+1);
	}
	
	m = firstCalendar.month = d.getMonth();
	y = firstCalendar.year = d.getFullYear();
	
	var top = -247 - (3 * 137);
	if (v1 > v2) top = 538;
	for (var x = 0; x < 3; x++) { 
		var d = CreateCalendar(m, y, top);
		animationCtrl.SetWanted(d.id, null, (x * 137), null, null, null, null);
		top += 137;
		CalcMY(+1); 
	}	
	 
	animationCtrl.Start();
}

function ShowDateTime()
{
	var now = new Date();
	if (now.getMinutes() != lastMin) {
		lastMin = now.getMinutes();
		var nowSecs = now.getTime() / 1000;
		nowSecs -= now.getTimezoneOffset() * 60;
		document.getElementById('dateInfo').innerHTML = ConvertDate(nowSecs, LONG_DATETIME_FORMAT);
	}
	setTimeout(ShowDateTime, 1000); // Try again in a second
}

function Init()
{
	ShowDateTime();
	RefreshData(new Date());
	FixPNG();
}
	
function RefreshData(d)
{
	objHTTP = XMLReq('/cgi-bin/getEvents.pl', null, 'GET');
	
	// Remove any old data.
	var tbl = document.getElementById('eventListTbl');
	while (tbl.rows.length > 0) tbl.deleteRow(0);
	tbl = document.getElementById('pastEventListTbl');
	while (tbl.rows.length > 0) tbl.deleteRow(0);
	
	userNode = selectSingleNode(objHTTP.responseXML, '/OceanWard/User');
	if (userNode != null) document.getElementById('addEventBtn').style.display = 'block';
	else document.getElementById('loginBtn').style.display = 'block';
		
	m = firstCalendar.month = d.getMonth();
	y = firstCalendar.year = d.getFullYear();
	
	for (var x = 0; x < 3; x++) {
		var cal = document.getElementById('calendar_' + m + '_' + y);
		if (cal != null) cal.parentNode.removeChild(cal);
		 
		CreateCalendar(m, y, (x * 137));
		CalcMY(+1); 
	}
	ViewDay(d);
	WriteUpcomingEventList();	
}


function WriteUpcomingEventList()
{
	// Write the Upcoming Event List
	// The XML is formatted in chronical order
	var events = selectNodes(objHTTP.responseXML, '/OceanWard/Event');
	
	
	var tbl = document.getElementById('eventListTbl');
	for (var x = 0; x < events.length; x++) {
		var st = parseInt(getText(events[x], 'Start'));
		if (st < today.getTime() / 1000) continue;
		DisplayQEvent(tbl, events[x], x < events.length - 1); 
	}
	
	tbl = document.getElementById('pastEventListTbl');
	for (var x = events.length - 1; x >= 0; x--) {
		var st = parseInt(getText(events[x], 'Start'));
		if (st >= today.getTime() / 1000) continue;
		DisplayQEvent(tbl, events[x], x > 0); 
	}
}

function DisplayQEvent(tbl, eventNode, incSep)
{
	var row = tbl.insertRow(-1);
	row.vAlign = 'top';
	var cell = row.insertCell(-1);
	cell.className = 'eventHeading';
	cell.innerHTML = 'Event:';
	
	cell = row.insertCell(-1);
	cell.className = 'eventHeading';
	cell.innerHTML = '<a href="" onclick="ViewEvent(' + eventNode.getAttribute('ID') + '); return false;">' + getText(eventNode, 'Title') + '</a>';
	
	row = tbl.insertRow(-1);
	row.vAlign = 'top';
	cell = row.insertCell(-1);
	cell.className = 'eventHeading';
	cell.innerHTML = 'Start&nbsp;Date:&nbsp;';
	
	cell = row.insertCell(-1);
	cell.innerHTML = ConvertDate(parseInt(getText(eventNode, 'Start')), SHORT_DATETIME_FORMAT);
	cell.innerHTML = cell.innerHTML.replace(/ 00:00$/, ''); 
	 
	
	row = tbl.insertRow(-1);
	row.vAlign = 'top';
	cell = row.insertCell(-1);
	cell.className = 'eventHeading';
	cell.innerHTML = 'Location:';
	
	cell = row.insertCell(-1);
	var temp = getText(eventNode, 'Location').split('\n');
	cell.innerHTML = temp[0];
	if (temp.length > 1) cell.innerHTML += '...';
	
	if (incSep) {
		// Put a seperator in...
		cell = tbl.insertRow(-1).insertCell(-1);
		cell.colSpan = 2;
		cell.align = 'center';
		cell.innerHTML = '<img src="zLine.jpg" width=218 height=1 alt="" style="margin:5px 0px">';			
	}
} 

function CalcMY(d)
{
	m += d;
	while (m > 11) { y++; m -= 12; }
	while (m < 0) { y--; m += 12; }	
}

function ViewLastMonth()
{
	animationCtrl.std.numSteps = 8;
	animationCtrl.std.trans.top = 'linear';
	firstCalendar.month--;
	if (firstCalendar.month == -1) { firstCalendar.month = 11; firstCalendar.year--; }
	var d = CreateCalendar(firstCalendar.month, firstCalendar.year, -274);
	animationCtrl.SetWanted(d.id, null, 0, null, null, null, null);
	m = firstCalendar.month;
	y = firstCalendar.year;
	CalcMY(+1); animationCtrl.SetWanted('calendar_' + m + '_' + y, null, 137, null, null, null, null);
	CalcMY(+1); animationCtrl.SetWanted('calendar_' + m + '_' + y, null, 274, null, null, null, null);
	CalcMY(+1); animationCtrl.SetWanted('calendar_' + m + '_' + y, null, 548, null, null, null, DestroyCalendar);	
	animationCtrl.Start();
	return false;
}

function DestroyCalendar(obj)
{
	document.getElementById('calendarsArea').removeChild(obj);
}

function ViewNextMonth()
{
	animationCtrl.std.numSteps = 8;
	animationCtrl.std.trans.top = 'linear';
	firstCalendar.month++;
	if (firstCalendar.month == 12) { firstCalendar.month = 0; firstCalendar.year++; }
	
	m = firstCalendar.month;
	y = firstCalendar.year;
	CalcMY(+2);
	var d = CreateCalendar(m, y, 548);
	animationCtrl.SetWanted(d.id, null, 274, null, null, null, null);
	
	CalcMY(-1);	animationCtrl.SetWanted('calendar_' + m + '_' + y, null, 137, null, null, null, null);
	CalcMY(-1); animationCtrl.SetWanted('calendar_' + m + '_' + y, null, 0, null, null, null, null);
	CalcMY(-1); animationCtrl.SetWanted('calendar_' + m + '_' + y, null, -274, null, null, null, DestroyCalendar);	
	animationCtrl.Start();
	return false;
}

function CreateCalendar(month, year, top)
// Month 0 = Jan
// Year must be full (2009)
// Top in pixels
{
	var d = document.getElementById('calendar_' + month + '_' + year);
	if (d != null) return d; // This already exists...
	d = document.createElement('DIV');
	d.style.top = top + 'px';
	d.className = 'calendar';
	d.id = 'calendar_' + month + '_' + year;
	
	var p = document.createElement('P');
	p.className = 'BoxTop';
	p.innerHTML = longMonthNames[month] + ' ' + year;
	d.appendChild(p);
	
	document.getElementById('calendarsArea').appendChild(d);
	
	var dateObj = new Date(year, month , 1, 12, 0, 0, 0);
	var y = 0;
	var x = dateObj.getDay();
	
	var markToday = (month == today.getMonth()) && (year == today.getFullYear()); 
	var numDays = dim[month];
	if ((month == 1) && ((year % 4) == 0)) numDays++; // Allow for leap years
	
	
	var eventDays = new Array();
	for (var i = 0; i < numDays; i++) 
		eventDays[i] = false;
	var events = selectNodes(objHTTP.responseXML, '/OceanWard/Event');
	for (var i = 0; i < events.length; i++) {
		var eventDate = new Date(parseInt(getText(events[i], 'Start')) * 1000);
		if (eventDate.getFullYear() == year && eventDate.getMonth() == month) eventDays[eventDate.getDate() - 1] = true;
	}
	
	for (var i = 0; i < numDays; i++) {
		var p = document.createElement('P');
		p.className = 'DateNum';
		p.innerHTML = (i + 1);
		p.style.left = (2 + (x * 17)) + 'px';
		p.style.top = (36 + (y * 15)) + 'px';
		
		if (markToday && today.getDate() == i + 1) {
			p.style.border = '1px solid #000000';
			p.style.left = (1 + (x * 17)) + 'px';
			p.style.top = (35 + (y * 15)) + 'px';
			p.alt = p.title = 'Today';
		}
		if (eventDays[i]) {
			p.style.backgroundImage = 'url(event_day.jpg)';
			p.style.color = '#ffffff';
			p.alt = p.title = 'Event - click for more details';
			//p.style.cursor = 'hand';
			//if (p.attachEvent) p.attachEvent('onclick', ClickedDay);
			//else p.addEventListener('click', ClickedDay, false);
			// p.id = (i + 1) + '/' + (month + 1) + '/' + year;
		} 
		p.style.cursor = 'hand';
		p.id = (i + 1) + '/' + (month + 1) + '/' + year;
		if (p.attachEvent) p.attachEvent('onclick', ClickedDay);
		else p.addEventListener('click', ClickedDay, false);
		
		d.appendChild(p);
		if (++x == 7) {
			x = 0;
			y++;
		}
	}
	return d;
}

function ClickedDay(event)
{
	var target = (event.target) ? event.target : event.srcElement;
	while (target.tagName != 'P') target = target.parentNode;
	var parts = target.id.split('/');
	for (var x = 0; x < parts.length; x++) parts[x] = parseInt(parts[x]);
	var d = new Date(parts[2], parts[1] - 1, parts[0], 12, 0, 0, 0); // Mid day
	ViewDay(d);
}

function ViewEvent(eventID)
{
	var eventNode = selectSingleNode(objHTTP.responseXML, '/OceanWard/Event[@ID=' + eventID + ']');
	if (!eventNode) return;
	document.getElementById('dayTitle').innerHTML = 'Event: ' + getText(eventNode, 'Title');
	var postData = new Object;
	postData.eventIDs = eventNode.getAttribute('ID');
	var ret = XMLReq('/cgi-bin/getEventDetail.pl', postData);
	if (!ret) return;
	document.getElementById('dayList').innerHTML = '';
	WriteEventDetail(eventNode, getText(ret.responseXML, '/OceanWard/EventBody'));
}

function ViewDay(date)
// Pass date as a date object; 
{	
	activeDate = date;
	document.getElementById('dayTitle').innerHTML = ConvertDate(date, LONG_DATE_FORMAT);
	// Get all the events on this day..
	var events = selectNodes(objHTTP.responseXML, '/OceanWard/Event');
	
	var showEvents = new Array;
	var eventIDs = new Array;
	for (var i = 0; i < events.length; i++) {
		var eventDate = new Date(parseInt(getText(events[i], 'Start')) * 1000);
		if ((eventDate.getDate() == date.getDate()) && 
			  (eventDate.getMonth() == date.getMonth()) && 
				(eventDate.getFullYear() == date.getFullYear())) {
					showEvents[showEvents.length] = events[i];
					eventIDs[eventIDs.length] = events[i].getAttribute('ID');
				}		 
	}
	if (showEvents.length == 0) return document.getElementById('dayList').innerHTML = 'There are no events on this date';
	 
	document.getElementById('dayList').innerHTML = '';
	
	var postData = new Object;
	postData.eventIDs = eventIDs.join(',');
	var ret = XMLReq('/cgi-bin/getEventDetail.pl', postData);
	if (!ret) return;
	for (var x = 0; x < showEvents.length; x++) {
		WriteEventDetail(showEvents[x], getText(ret.responseXML, '/OceanWard/EventBody[@ID=' + eventIDs[x] + ']'));
		if (x < showEvents.length - 1) document.getElementById('dayList').innerHTML += '<img style="clear:all; margin:0px 0px 10px 0px" src="/family/events/zLine.jpg" width=368 height=1 alt=""><br>';	
	} 
}

function WriteEventDetail(eventNode, txt)
{
	var tbl = document.createElement('TABLE');
	tbl.cellPadding = 0;
	tbl.cellSpacing = 2;
	tbl.border = 0;
	tbl.width = 368;
	
	var row = tbl.insertRow(-1);
	row.insertCell(-1).innerHTML = '<img src="/s.gif" width=63 height=1 alt="">';
	row.insertCell(-1).innerHTML = '<img src="/s.gif" width=249 height=1 alt="">';
	row.insertCell(-1).innerHTML = '<img src="/s.gif" width=48 height=1 alt="">';
	
	// Event Title
	var row = tbl.insertRow(-1);
	row.vAlign = 'top';
	var cell = row.insertCell(-1);
	cell.className = 'eventHeading';
	cell.innerHTML = 'Event:';
	cell = row.insertCell(-1);
	cell.colSpan = 2;
	cell.className = 'eventHeading';
	cell.innerHTML = getText(eventNode, 'Title');
	
	// Start Date
	row = tbl.insertRow(-1);
	row.vAlign = 'top';
	cell = row.insertCell(-1);
	cell.className = 'eventHeading';
	cell.innerHTML = 'Start&nbsp;Date:&nbsp;';
	cell = row.insertCell(-1);
	cell.colSpan = 2;
	cell.innerHTML = ConvertDate(parseInt(getText(eventNode, 'Start')), LONG_DATETIME_FORMAT);
	cell.innerHTML = cell.innerHTML.replace(/ 00:00$/, '');
	
	// End Date
	if (getText(eventNode, 'End') != '') {
		row = tbl.insertRow(-1);
		row.vAlign = 'top';
		cell = row.insertCell(-1);
		cell.className = 'eventHeading';
		cell.innerHTML = 'End Date:';
		cell = row.insertCell(-1);
		cell.innerHTML = ConvertDate(parseInt(getText(eventNode, 'End')), LONG_DATETIME_FORMAT);
	}
	
	// Location
	row = tbl.insertRow(-1);
	row.vAlign = 'top';
	cell = row.insertCell(-1);
	cell.className = 'eventHeading';
	cell.innerHTML = 'Location:';
	cell = row.insertCell(-1);
	cell.innerHTML = getText(eventNode, 'Location');
	var mapURL = getText(eventNode, 'MapURL');
	if (mapURL == '') cell.colSpan = 2;
	else {
		cell = row.insertCell(-1);
		cell.align='right';
		cell.innerHTML = '<a target="_blank" href="' + mapURL + '">view map</a>';	
	}
	
	// Contact
	row = tbl.insertRow(-1);
	row.vAlign = 'top';
	cell = row.insertCell(-1);
	cell.className = 'eventHeading';
	cell.innerHTML = 'Contact:';
	cell = row.insertCell(-1);
	var n = getText(eventNode, 'ContactName');
	var email = getText(eventNode, 'ContactEmail'); 
	if (email != '') n = '<a href="mailto:' + email + '">' + n + '</a>';
	cell.innerHTML = n;
	
	// Phone
	var phone = getText(eventNode, 'ContactPhone');
	if (phone != '') {
		row = tbl.insertRow(-1);
		row.vAlign = 'top';
		cell = row.insertCell(-1);
		cell.className = 'eventHeading';
		cell.innerHTML = 'Phone:';
		cell = row.insertCell(-1);
		cell.innerHTML = phone;
	}
	
	var cell = tbl.insertRow(-1).insertCell(-1);
	cell.style.paddingTop = '5px';
	cell.colSpan = 3;
	cell.innerHTML = txt; 
	
	if ((userNode != null) && ((getText(userNode, 'SuperUser') == '1') || (eventNode.getAttribute('AuthorID') == userNode.getAttribute('ID'))))
		cell.innerHTML += '<a href="#" onclick="EditEvent(' + eventNode.getAttribute('ID') + '); return false"><img align=right src="/images/editBtn.jpg" width=54 height=37 alt="" border=0><br clear=both></a>';
	
	var cell = tbl.insertRow(-1).insertCell(-1);
	cell.colSpan = 3;
	cell.paddingBottom = '10px';
	cell.align = 'right';

//	var str = '<a href="" onclick="RegisterInterest(' + eventNode.getAttribute('ID') + '); return false;">Register my Interest</a>';
//	if (eventNode.getAttribute('ThreadID') != '0') str += '<br><a title="A Forum Thread has been created for this event. Click the hyperlink to view/contibute to the thread." href="/family/forum/view.asp?threadID=' + eventNode.getAttribute('ThreadID') + '">Forum Thread</a>';  
//	cell.innerHTML = str; 

	document.getElementById('dayList').appendChild(tbl);  
}

function RegisterInterest(eventID)
{
	var eventNode = selectSingleNode(objHTTP.responseXML, '/OceanWard/Event[@ID=' + eventID + ']');
	document.getElementById('riEventCell').innerHTML = '<nobr>' + getText(eventNode,'Title') + '</nobr>';
	document.getElementById('riEventID').value = eventID;
	var userNode = selectSingleNode(objHTTP.responseXML, '/OceanWard/User');
	if (userNode != null) {
		document.getElementById('riName').value = getText(userNode, 'Nickname');
		document.getElementById('riEmail').value = getText(userNode, 'Email');	
	}
	document.getElementById('regInterestDiv').style.display = 'block';
	animationCtrl.SetWanted('regInterestDiv', null, 114, null, 249, null, null).numSteps = 15;
	animationCtrl.Start();
}

function RegInterestCancel()
{
	animationCtrl.Revert('regInterestDiv', RegClosed).numSteps = 15;
	animationCtrl.Start();
	//document.getElementById('regInterestDiv').style.display = 'none';	
}

function RegClosed(obj)
{
	obj.style.display = 'none';
}

function DoError(msg, objID)
{
	if (msg != '') alert(msg);
	if (objID != '') document.getElementById(objID).focus();
	return false;
}

function RegInterestOK()
{
	var postData = new Object;
	postData.EventID = document.getElementById('riEventID').value;
	postData.UserID = 0;
	var userNode = selectSingleNode(objHTTP.responseXML, '/OceanWard/User');
	if (userNode != null) postData.UserID = userNode.getAttribute('UserID');
	 
	postData.msg = document.getElementById('riMsg').value;
	postData.name = document.getElementById('riName').value;
	postData.email = document.getElementById('riEmail').value;
	if (!ValidateEmail(postData.email)) return DoError('Your email does not appear to be written correctly.\nPlease correct and try again', 'riEmail');
	var ret = XMLReq('/cgi-bin/registerInterest.pl', postData);
	if (!ret) return;
	RegInterestCancel();
	//document.getElementById('regInterestDiv').style.display = 'none';
}

function EditEvent(id)
{
	var info = new Object;
	info.eventID = id;
	info.title = (id == 0) ? "Add Calendar Item" : "Edit Calendar Item";
	info.startDate = activeDate; 
	var ret = showModalDialog('/family/events/editor/dialog.html', info, 'center:1;width:200;height:100;resizable:no;status:no;scroll:no;help:no');
	if (ret == 'cancel') return;
	RefreshData(activeDate);	

}
