/* Loads the Google data JavaScript client library */
google.load("gdata", "1");

function init()
{
	// init the Google data JS client library with an error handler
	google.gdata.client.init(handleGDError);
	// load the code.google.com developer calendar
	loadDeveloperCalendar();
}

/**
 * Loads the Google Developers Event Calendar
 */
function loadDeveloperCalendar()
{
  loadCalendarByAddress('fsit@uga.edu');
}

/**
 * Adds a leading zero to a single-digit number.  Used for displaying dates.
 */
function padNumber(num)
{
	if (num <= 9)
	{
    	return "0" + num;
	}
	return num;
}

/**
 * Determines the full calendarUrl based upon the calendarAddress
 * argument and calls loadCalendar with the calendarUrl value.
 *
 * @param {string} calendarAddress is the email-style address for the calendar
 */ 
function loadCalendarByAddress(calendarAddress)
{
  var calendarUrl = 'http://www.google.com/calendar/feeds/' + calendarAddress + '/public/full';
  loadCalendar(calendarUrl);
}

/**
 * Uses Google data JS client library to retrieve a calendar feed from the specified
 * URL.  The feed is controlled by several query parameters and a callback 
 * function is called to process the feed results.
 *
 * @param {string} calendarUrl is the URL for a public calendar feed
 */  
function loadCalendar(calendarUrl)
{
	var service = new google.gdata.calendar.CalendarService('gdata-js-client-samples-simple');
	var query = new google.gdata.calendar.CalendarEventQuery(calendarUrl);
	query.setOrderBy('starttime');
	query.setSortOrder('ascending');
	query.setSingleEvents(true);
	
	var queryStartDate = new Date();
	queryStartDate.setHours( 0 );
	queryStartDate.setMinutes( 0 );
	queryStartDate.setSeconds( 0 );
	
	var queryEndDate = new Date();
	queryEndDate.setHours( 23 );
	queryEndDate.setMinutes( 59 );
	queryEndDate.setSeconds( 59 );
	
	var startMin = new google.gdata.DateTime( queryStartDate, false );
	var startMax = new google.gdata.DateTime( queryEndDate, false );
	
	query.setMinimumStartTime(startMin);
	query.setMaximumStartTime(startMax);

	service.getEventsFeed(query, listEvents, handleGDError);
}

/**
 * Callback function for the Google data JS client library to call when an error
 * occurs during the retrieval of the feed.  Details available depend partly
 * on the web browser, but this shows a few basic examples. In the case of
 * a privileged environment using ClientLogin authentication, there may also
 * be an e.type attribute in some cases.
 *
 * @param {Error} e is an instance of an Error 
 */
function handleGDError(e)
{
	document.getElementById('jsSourceFinal').setAttribute('style', 'display:none');
	if (e instanceof Error)
	{
		/* alert with the error line number, file and message */
		alert('Error at line ' + e.lineNumber + ' in ' + e.fileName + '\n' + 'Message: ' + e.message);
		/* if available, output HTTP error code and status text */
		if (e.cause) 
		{
			var status = e.cause.status;
			var statusText = e.cause.statusText;
			alert('Root cause: HTTP error ' + status + ' with status text of: ' + statusText);
		}
	} 
	else
	{
		alert(e.toString());
	}
}

/**
 * Callback function for the Google data JS client library to call with a feed 
 * of events retrieved.
 *
 * Creates an unordered list of events in a human-readable form.  This list of
 * events is added into a div called 'events'.  The title for the calendar is
 * placed in a div called 'calendarTitle'
 *
 * @param {json} feedRoot is the root of the feed, containing all entries 
 */ 


var bolton = false;
var snelling = false;
var oglethorpe = false;
var summit = false;

 
function listEvents(feedRoot)
{
	var todayNow = new Date();
	var entries = feedRoot.feed.getEntries();
	var eventDiv = document.getElementById('events');
	
	var boltonOverridden = false;
	var snellingOverridden = false;
	var oglethorpeOverridden = false;
	var summitOverridden = false;
	
	/* loop through each event in the feed */
	// Should be four events, one for each dining hall (Bolton, Snelling, Oglethorpe, Summit)
	var len = entries.length;
	for (var i = 0; i < len; i++)
	{
    	var entry = entries[i];
    	var title = entry.getTitle().getText();
    	var startDateTime = null;
		var endDateTime = null;
    	var startJSDate = null;
		var endJSDate = null;
    	var times = entry.getTimes();
		
		// If the events we got have times associated with them, which they should
    	if (times.length >= 0 || true)
		{
			// Get the Google DateTime objects (startDateTime, endDateTime) and turn them into standard
			// JavaScript Date objects (startJSDate, endJSDate) so we can compare,
			// them to the current date/time (todayNow)
      		startDateTime = times[0].getStartTime();
			endDateTime = times[0].getEndTime();
      		startJSDate = startDateTime.getDate();
			endJSDate = endDateTime.getDate();
    	}
		
		// If the current date and time fall between the event's start time
		// and the event's end time, then this event is going on NOW (i.e. a dining hall is open)
		if( todayNow >= startJSDate && todayNow <= endJSDate )
		{
			switch( title )
			{
				case 'Bolton':
					if( !boltonOverridden )
						document.getElementById('bolton0').innerHTML = "Bolton is<br><img src='images/open.gif'>";
				break;

				case 'Snelling':
					if( !snellingOverridden )
						document.getElementById('snelling0').innerHTML = "Snelling is<br><img src='images/open.gif'>";
				break;

				case 'Oglethorpe':
					if( !oglethorpeOverridden )
						document.getElementById('oglethorpe').innerHTML = "Oglethorpe is<br><img src='images/open.gif'>";
				break;

				case 'Summit':
					if( !summitOverridden )
						document.getElementById('summit').innerHTML = "Summit is<br><img src='images/open.gif'>";
				break;

				case 'Bolton Override':
					document.getElementById('bolton0').innerHTML = "Bolton is<br><img src='images/open.gif'>";
					boltonOverridden = true;
				break;

				case 'Snelling Override':
					document.getElementById('snelling0').innerHTML = "Snelling is<br><img src='images/open.gif'>";
					snellingOverridden = true;
				break;

				case 'Oglethorpe Override':
					document.getElementById('oglethorpe').innerHTML = "Oglethorpe is<br><img src='images/open.gif'>";
					oglethorpeOverridden = true;
				break;

				case 'Summit Override':
					document.getElementById('summit').innerHTML = "Summit is<br><img src='images/open.gif'>";
					summitOverridden = true;
				break;
			}
		}
		else
		{
			//alert(title + " " + startDateTime.toString() + " " + endDateTime.toString() + " is closed");
			switch( title )
			{
				case 'Bolton':
					if( !boltonOverridden )
						document.getElementById('bolton0').innerHTML = "Bolton is<br><img src='images/closed.gif'>";
				break;

				case 'Snelling':
					if( !snellingOverridden )
						document.getElementById('snelling0').innerHTML = "Snelling is<br><img src='images/closed.gif'>";
				break;

				case 'Oglethorpe':
					if( !oglethorpeOverridden )
						document.getElementById('oglethorpe').innerHTML = "Oglethorpe is<br><img src='images/closed.gif'>";
				break;

				case 'Summit':
					if( !summitOverridden )
						document.getElementById('summit').innerHTML = "Summit is<br><img src='images/closed.gif'>";
				break;

				case 'Bolton Override':
					document.getElementById('bolton0').innerHTML = "Bolton is<br><img src='images/closed.gif'>";
					boltonOverridden = true;
				break;

				case 'Snelling Override':
					document.getElementById('snelling0').innerHTML = "Snelling is<br><img src='images/closed.gif'>";
					snellingOverridden = true;
				break;

				case 'Oglethorpe Override':
					document.getElementById('oglethorpe').innerHTML = "Oglethorpe is<br><img src='images/closed.gif'>";
					oglethorpeOverridden = true;
				break;

				case 'Summit Override':
					document.getElementById('summit').innerHTML = "Summit is<br><img src='images/closed.gif'>";
					summitOverridden = true;
				break;
			}
		}
		
		if (!document.getElementById('snelling0').innerHTML)
		{
			document.getElementById('snelling0').innerHTML = "Snelling is<br><img src='images/closed.gif'>";
		}
		if (!document.getElementById('bolton0').innerHTML)
		{
			document.getElementById('bolton0').innerHTML = "Bolton is<br><img src='images/closed.gif'>";
		}
		if (!document.getElementById('oglethorpe').innerHTML)
		{
			document.getElementById('oglethorpe').innerHTML = "Oglethorpe is<br><img src='images/closed.gif'>";
		}
		if (!document.getElementById('summit').innerHTML)
		{
			document.getElementById('summit').innerHTML = "Summit is<br><img src='images/closed.gif'>";
		}
		
	}
}

google.setOnLoadCallback(init);
