/* Author: Simon Gilhooly */
/* Date: 2009-09-15 */
/* This script retrieves forthcoming calendar events from a Google calendar and inserts them into the specified <div> */

var uk = {
	co: {
		atom14: {

			calId: null,
			targetDiv: null,

			googleCal: function () {
				if ((this.calId != null) && (this.targetDiv != null)) {
					// must set the id of the calendar and specify a DIV before calling this function ....
					var script = document.createElement("script");
					script.type = "text/javascript";
					script.src = "http://www.google.com/calendar/feeds/" + this.calId + "/public/full?alt=json-in-script&callback=atom14.listEvents&orderby=starttime&sortorder=ascending&max-results=6&singleevents=false&futureevents=true";
					
					//add this newly created script element to the head section of our document, where it will immediately be executed
					document.getElementsByTagName("head")[0].appendChild(script);
				}
			},
						
			listEvents: function (jsonFeed) {
				var feed = jsonFeed.feed;
				var entries = feed.entry || [];
				var eventsDiv = window.document.getElementById(this.targetDiv);
				var shortMonths = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
				
				// remove any content from the target DIV
				/*if (eventsDiv.childNodes.length > 0) {
					eventsDiv.removeChild(events.childNodes[0]);
				}*/	  
			
				var eventList = document.createElement("ul");
				
				for (var i = 0; i < entries.length; i++) {
					var entry = entries[i];
					var title = entry.title.$t;
					var venue = entry.gd$where[0].valueString;
					var start = this.formatGCalTime(entry['gd$when'][0].startTime);
			
				    for (var linki = 0; linki < entry['link'].length; linki++) {
						if (entry['link'][linki]['type'] == 'text/html' &&
				    		entry['link'][linki]['rel'] == 'alternate') {
							var entryLinkHref = entry['link'][linki]['href'];
						}
					}

					var eventDesc = document.createElement("li");
					eventDesc.appendChild(document.createTextNode(start.getDate() + "-" + shortMonths[start.getMonth()] + ": "));

				    // if we have a link to the event, create an 'a' element
				    if (typeof entryLinkHref != 'undefined') {
						entryLink = document.createElement('a');
						entryLink.setAttribute('href', entryLinkHref);
						entryLink.appendChild(document.createTextNode(title));
						eventDesc.appendChild(entryLink);
						eventDesc.appendChild(document.createTextNode(', ' + venue));
				    } else {
						eventDesc.appendChild(document.createTextNode(title + ',  ' + venue));
				    }
					eventList.appendChild(eventDesc);
				}
				eventsDiv.appendChild(eventList);
			},

			formatGCalTime: function (gCalTime) { 
				// text for regex matches
				var remtxt = gCalTime;
			
				function consume(retxt) {
					var match = remtxt.match(new RegExp('^' + retxt));
					if (match) {
						remtxt = remtxt.substring(match[0].length);
						return match[0];
					}
					return '';
				}
			
				// minutes of correction between gCalTime (2009-09-21T21:00:00.000Z) and GMT
				var totalCorrMins = 0;
			
				var year = consume('\\d{4}');		//match first four numeric characters
				consume('-?');
				var month = consume('\\d{2}');
				consume('-?');
				var dateMonth = consume('\\d{2}');
				var timeOrNot = consume('T');
			
				// if a DATE-TIME was matched in the regex 
				if (timeOrNot == 'T') {
					var hours = consume('\\d{2}');
					consume(':?');
					var mins = consume('\\d{2}');
					consume('(:\\d{2})?(\\.\\d{3})?');
					var zuluOrNot = consume('Z');
			
					// if time from server is not already in GMT, calculate offset
					if (zuluOrNot != 'Z') {
						var corrPlusMinus = consume('[\\+\\-]');
						if (corrPlusMinus != '') {
							var corrHours = consume('\\d{2}');
							consume(':?');
							var corrMins = consume('\\d{2}');
							totalCorrMins = (corrPlusMinus=='-' ? 1 : -1) * 
							(Number(corrHours) * 60 + 
							(corrMins=='' ? 0 : Number(corrMins)));
						}
					} 
				} else {
					// if only a DATE was matched
					var hours = 0;
					var mins = 0;
				}
			
				// get time since epoch and apply correction, if necessary
				// relies upon Date object to convert the GMT time to the local
				// timezone
				var originalDateEpoch = Date.UTC(year, month - 1, dateMonth, hours, mins);
				var gmtDateEpoch = originalDateEpoch + totalCorrMins * 1000 * 60;
				var ld = new Date(gmtDateEpoch);
			
				return ld;
			}
		}
	}
}


