/* consuming and formatting a Google Calendar feed for the News-Events page */

/* the Google Javascript API is loaded from Google servers via a script tag in the HTML head of the page */

/* 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 public Advent School Calendar
 */
function loadDeveloperCalendar() {
  loadCalendarByAddress('adventschool@gmail.com');
}

/**
 * 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.setFutureEvents(true);
  query.setSingleEvents(true);
  query.setMaxResults(13);

  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 'eventDiv' etc.  The title for the calendar is
 * placed in a div called 'calendarTitle' (Advent listings don't use Calendar title -- RL)
 *
 * @param {json} feedRoot is the root of the feed, containing all entries 
 */ 
	function listEvents(feedRoot) {
		var entries = feedRoot.feed.getEntries();
		var eventDiv = document.getElementById('home-events');
		
		/* empty the div if necessary */
		if (eventDiv.childNodes.length > 0) {
		eventDiv.removeChild(eventDiv.childNodes[0]);
		}	  		
		var entry = "";
		var title = "";
		var startDateTime = "";
		var startJSDate = "";
		var times = "";	
		var a_p = "";
		var description = "";
		var content = ""; // content is "description" in Google's Calendar web form interface
		var m_names = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
		var dt = "";
		var ddDate = "";
		var ddDescription = "";
		
		/* create a new dictionary list */
		var dl = document.createElement('dl');
		
		var len = entries.length; // number of event entries from Google Calendar feed
				
		/* Home news sidebar column - 3 event items */
		for (var i = 0; i < 3; i++) {
			entry = entries[i];
		    title = entry.getTitle().getText();
			startDateTime = null;
			startJSDate = null;
			times = entry.getTimes();
			if (times.length > 0) {
			  startDateTime = times[0].getStartTime();
			  startJSDate = startDateTime.getDate();
			}
			
			var monthName = m_names[startJSDate.getMonth()];
			var year = startJSDate.getFullYear(); //probably won't use it due to space limitations
			var dateString = monthName + " " + startJSDate.getDate(); // date number
			
			/* format time */
			var hour = startJSDate.getHours();
			if (hour < 12) {
			   a_p = "AM";
			}
			else {
			   a_p = "PM";
			}
			if (hour == 0) {
				hour = 12;
			}
			if (hour > 12) {
			   hour = hour - 12;
			}
			
			if (!startDateTime.isDateOnly()) { //if there is time data
			  dateString += " - " + hour + ":" + padNumber(startJSDate.getMinutes()) + " " + a_p;
			} else {
				dateString += " - all day";
			}
			dt = document.createElement('dt');
			ddDate = document.createElement('dd');
			ddDescription = document.createElement('dd');
					    
			description = entry.getContent().getText();
				    	
			dt.appendChild(document.createTextNode(title)); 
			ddDate.appendChild(document.createTextNode(dateString));
			ddDescription.appendChild(document.createTextNode(description));
			
			dl.appendChild(dt);
			dl.appendChild(ddDate);
			dl.appendChild(ddDescription);
		}
		eventDiv.appendChild(dl);
								
	} // end listEvents()

google.setOnLoadCallback(init);
loadCalendar('http://www.google.com/calendar/feeds/adventschool@gmail.com/public/full');