/*  Copyright 2008 October 5, Brendan Falkowski
	Don't steal. I know Batman.
	
	API Reference:	http://code.google.com/apis/calendar/reference.html
	JS Guide:		http://code.google.com/apis/calendar/developers_guide_js.html
	gCal Classes:	http://code.google.com/apis/gdata/jsdoc/
	Sample:			http://gdata-javascript-client.googlecode.com/svn/trunk/samples/calendar/simple_sample/simple_sample.html
	Savoir Feed:	http://www.google.com/calendar/feeds/admin@savoirfaireacappella.com/public/full?singleevents=true&futureevents=true&orderby=starttime&sortorder=ascending&max-results=10
	
	JS Object Traversal Examples
	- result -- object returned by service.getEventsFeed()
	- result.feed.title.$t;									// text node v1
	- result.feed.title.getText();							// text node v2
	- result.feed.title.type;								// attribute of element
	- result.feed.getLink('alternate', 'text/html').type;	// method with attributes
	- result.feed.getAuthors().length);						// object length
	- result.feed.getAuthors()[0].name.$t);					// text node of n objects via method
*/

google.load('gdata', '1');
google.setOnLoadCallback(loadCalendar);

var gdService;
var gdQuery;
var gdFeedURL = "http://www.google.com/calendar/feeds/admin@savoirfaireacappella.com/public/full";



//-- Google Data Functions

function loadCalendar () {
	google.gdata.client.init(handleInitError);
	gdService = new google.gdata.calendar.CalendarService('SFCalendar');
	gdQuery = new google.gdata.calendar.CalendarEventQuery(gdFeedURL);
	gdQuery.setSingleEvents(true);
	gdQuery.setFutureEvents(true);
	gdQuery.setOrderBy('starttime');
	gdQuery.setSortOrder('ascending');
	gdQuery.setMaxResults(10);
	gdService.getEventsFeed(gdQuery, handleFeed, handleGDError);
}

function handleFeed (result) {
	var feed = result.feed;
	var numEvents = feed.entry.length;
	
	if(numEvents > 0)
	{
		var html = "";
		
		/*-- where bodyID=events */
		if(get('events'))
		{
			html += "<table cellspacing='0'>";
			html += "<thead><tr><th>Date</th><th>Event Info</th></tr></thead>";
			html += "<tfoot><tr><td colspan='2'>"+ numEvents +" upcoming ";
				html += (numEvents == 1) ? ('event') : ('events');
				html += "</td></tr></tfoot>";
			html += "<tbody>";
			
			for (var i=0; i<numEvents; i++)
			{
				var entry = feed.entry[i];
				var allDay = entry.getTimes()[0].getStartTime().isDateOnly();
				var dateStart = strToDate(entry.getTimes()[0].startTime, allDay);
				var dateEnd = strToDate(entry.getTimes()[0].endTime, allDay);
				
				//-- Simpler insertion, but converts to client's timezone automatically
				// var dateStart = new Date(entry.getTimes()[0].getStartTime().getDate());
				
				html += "<tr>";
				html += "<td class='date'>"+ formatMonth(dateStart.getMonth()) +" "+ dateStart.getDate() +"</td>";
				html += "<td class='entry'><h2>"+ entry.title.$t +"</h2>";
					html += "<em>"+ formatDay(dateStart.getDay()) +", ";
					if(allDay == true) html += "all day, ";
					else html += formatTime(dateStart)+" - "+ formatTime(dateEnd) +", ";
					if(entry.getLocations()[0].valueString == "") html += "location TBD";
					else html += entry.getLocations()[0].valueString;
					html += "</em>";
					html += "<p>"+ entry.content.$t +"</p></td>";
				html += "</tr>";				
			}
					
			html += "</tbody></table>";
		}

		/*-- where bodyID=home */
		if(get('home'))
		{
			var entry = feed.entry[0];
			var allDay = entry.getTimes()[0].getStartTime().isDateOnly();
			var dateStart = strToDate(entry.getTimes()[0].startTime, allDay);
			var dateEnd = strToDate(entry.getTimes()[0].endTime, allDay);
			
			html += "<h3>"+ entry.title.$t +"</h3>";
			html += "<p>"+ entry.content.$t +"</p>";
			html += "<p>"+ formatMonth(dateStart.getMonth()) +" "+ dateStart.getDate() +"<br />";
				if(allDay == true) html += "All day";
				else html += formatTime(dateStart)+" - "+ formatTime(dateEnd);
				html += "<br />";
				if(entry.getLocations()[0].valueString == "") html += "Location TBD";
				else html += entry.getLocations()[0].valueString;
				html += "</p>";
		}
		
		setHTML("gcal", html);
	}
	else setHTML('gcal', '<p>Sorry, no upcoming events.</p>');
}



//-- Error Handling

function handleGDError (e) {
	append('gcal', 'p', e.message);
	// alert (e.cause ? e.cause.statusText : e.message);
}

function handleInitError (e) {
	get('loading').style.display = 'none';
	append('gcal', 'p', e.message);
	// alert ("Error: " + e.message + "\n" + "File: " + e.fileName + "\n" + "Line: " + e.lineNumber);
}



//-- Date/Time Functions

function strToDate (str, allDay)
{
	var date = new Date();
	date.setFullYear(str.substr(0,4), str.substr(5,2)-1, str.substr(8,2));
	if(allDay==false) date.setHours(str.substr(11,2), str.substr(14,2), str.substr(17,2), str.substr(20,3));
	return date;
}

function formatDay (num)
{
	var days = new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");
	return days[num];
}

function formatMonth (num)
{
	var months = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
	return months[num];
}

function formatTime (obj)
{
	var time = "";
	var hours = obj.getHours();
	var mins = obj.getMinutes();

	if(hours==0) time += "12";
	else if(hours>12) time += hours-12;
	else time += hours;
	time += ":";
	
	if(mins<10) time += "0" + mins;
	else time += mins;
	
	if(hours<12) time += "am";
	else time += "pm";
	
	return time;
}



//-- Helper Functions

function append (id, myNode, myText) {
	var node = document.createElement(myNode);
	var text = document.createTextNode(myText);
	node.appendChild(text);
	get(id).appendChild(node);
}

function get (el) {
	return document.getElementById(el);
}

function setHTML (id, str) {
	get(id).innerHTML = str;
}