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('editor@discoverpolitics.org');
}

/**
 * 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(2);

  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 
 */ 

function listEvents(feedRoot) {
  var entries = feedRoot.feed.getEntries();
  var eventDiv = document.getElementById('events');

  if (eventDiv.childNodes.length > 0) {
    eventDiv.removeChild(eventDiv.childNodes[0]);
  }	  

  /* create a new unordered list */
  var ul = document.createElement('div');


  /* loop through each event in the feed */

  var len = entries.length;

  for (var i = 0; i < len; i++) {

    var entry = entries[i];

    var title = document.createElement('span');

	title.className = "title";

	title.appendChild(document.createTextNode(entry.getTitle().getText()));

    var startDateTime = null;

    var startJSDate = null;

    var times = entry.getTimes();

    if (times.length > 0) {

      startDateTime = times[0].getStartTime();

      startJSDate = startDateTime.getDate();

    }

    var entryLinkHref = null;
    if (entry.getHtmlLink() != null) {
      entryLinkHref = entry.getHtmlLink().getHref();
    }	

	var month = document.createElement('span');
	month.className = "month";
	month.appendChild(document.createTextNode(getMonthString(startJSDate.getMonth())));

	var date = document.createElement('span');
	var dateNum = parseInt(startJSDate.getDate());
	date.className = (dateNum < 10) ? "date single_digit" : "date";
	date.appendChild(document.createTextNode(startJSDate.getDate()));

	var timeLoc = document.createElement('span');
	timeLoc.className = "timeLoc";
	var str = "";

	if (!startDateTime.isDateOnly()) {
      str += formatTime(startJSDate.getHours(), startJSDate.getMinutes());
	  str += ":";
    } else {
	  str += "All Day:";
	}

	// try to find the location
	var location = entry.gd$where[0].valueString;
	if(location != undefined)
		str += " " + location;
	timeLoc.appendChild(document.createTextNode(str));		

    var a = document.createElement('a');

    /* if we have a link to the event, create an 'a' element */
    if (entryLinkHref != null) {
      a.setAttribute('href', entryLinkHref);
    } 

	a.appendChild(month);
	a.appendChild(date);
    a.appendChild(timeLoc);
	a.appendChild(title);	    

    /* append the list item onto the unordered list */
    ul.appendChild(a);
  }
  eventDiv.appendChild(ul);
}


/**
 * Adds a leading zero to a single-digit number.  Used for displaying dates.
 */
function padNumber(num) {
  if (num <= 9) {
    return "0" + num;
  }
  return num;
}

function formatTime(h, m) {
	var mer = "AM";
	if (h > 11) {
		h = h-12;
		mer = "PM";
	}
	return h + ((m > 0) ? ":"+padNumber(m) : "") + mer
}


var months = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];

function getMonthString(int) {
	return months[int];
}