/* Loads the Google data JavaScript client library */
google.load("gdata", "2.x");

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('mi0fhnh5c54o1r6c82ibgtrin8@group.calendar.google.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 = 'https://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(1000);

  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());
  }
}

	
//for links:
function replaceURLWithHTMLLinks(text) {
    var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
    return text.replace(exp,"<a href='$1'>$1</a>"); 
}

/**
 * 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 weekday=new Array(7);
		weekday[0]="Sunday";
		weekday[1]="Monday";
		weekday[2]="Tuesday";
		weekday[3]="Wednesday";
		weekday[4]="Thursday";
		weekday[5]="Friday";
		weekday[6]="Saturday";
	var monthNames = [ "January", "February", "March", "April", "May", "June",
    "July", "August", "September", "October", "November", "December" ];
		
  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('ul');
  /* set the calendarTitle div with the name of the calendar */
 /* document.getElementById('calendarTitle').innerHTML = 
	"Calendar: " + feedRoot.feed.title.$t;*/
  /* loop through each event in the feed */
  var len = entries.length;
  if (len) {
	  for (var i = 0; i < len; i++) {
		var entry = entries[i];
		var title = entry.getTitle().getText();
		var summary = entry.getContent().getText();
		var location = entry.getLocations()[0].getValueString();
		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 dateString = weekday[startJSDate.getDay()] + ", " + monthNames[(startJSDate.getMonth())] + " " + startJSDate.getDate() + ", " + (startJSDate.getYear() + 1900);
		if (!startDateTime.isDateOnly()) {
			var hour = startJSDate.getHours();
			var ap = "AM";
			if (hour   > 11) { ap = "PM";        }
			if (hour   > 12) { hour = hour - 12; }
			if (hour   == 0) { hour = 12;        }
		  dateString += " - " + hour + ":" + 
			  padNumber(startJSDate.getMinutes()) + " " + ap;
		}
		var li = document.createElement('li');
	
		/* if we have a link to the event, create an 'a' element */
		if (entryLinkHref != null) {
		  entryLink = document.createElement('a');
		  entryLink.setAttribute('class', 'eventTitle');
		  entryLink.setAttribute('href', entryLinkHref);
		  entryLink.appendChild(document.createTextNode(title));
		  li.appendChild(entryLink);
		  dateDisp = document.createElement('span');
		  dateDisp.setAttribute('class', 'eventDate');
		  dateDisp.appendChild(document.createTextNode( dateString +  ' :|: ' ));
		  li.appendChild(dateDisp);
		} else {
		  li.appendChild(document.createTextNode(title + ' | ' + dateString));
		}
		locationDisp = document.createElement('a');
		locationDisp.setAttribute('class', 'eventLocation');
		locationDisp.setAttribute('href', 'http://maps.google.com/maps?q=' + location);
		locationDisp.setAttribute('target', '_blank');
		locationDisp.appendChild(document.createTextNode(location));
		li.appendChild(locationDisp);
		li.appendChild(document.createElement('br'));
		summarySpan = document.createElement('p');
		summarySpan.setAttribute('class', 'eventSummary');
		
		summarySpan.innerHTML = replaceURLWithHTMLLinks(summary);
		li.appendChild(summarySpan);
	
		/* append the list item onto the unordered list */
		ul.appendChild(li);
	  }
	} else {
		var li = document.createElement('li');
		li.appendChild(document.createTextNode('Nothing scheduled right now. Check back later though!'));
		ul.appendChild(li);
	}
  eventDiv.appendChild(ul);
}

// google.setOnLoadCallback(init); //removed by atp
