
// Load the latest version of the Google Data JavaScript Client
google.load('gdata', '2.x');

// Load google-hosted jQuery library
// google.load('jquery', '1.4.2');

function onGoogleDataLoad() {
	// init the Google data JS client library with an error handler
	google.gdata.client.init(handleGDError);
	loadCalendarByAddress('10i5ceq2vppomn6gtdialihe68@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 = '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('upcomingevents.misslindasongs.com');
	var query = new google.gdata.calendar.CalendarEventQuery(calendarUrl);
	query.setOrderBy('starttime');
	query.setSortOrder('ascending');
	query.setFutureEvents(true);
	query.setSingleEvents(true);
	query.setMaxResults(10);

	//service.getEventsFeed(query, listEvents, handleGDError);
	
	service.getEventsFeed(query, consumeEventQueryResult, handleGDError);
	//alert('service.applicationName=' + service.applicationName);
}

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

function consumeEventQueryResult(queryResult) {
//list-events-upcoming
	var parsedEventList = [];
	var feedEntries = queryResult.feed.getEntries();
	var feedEntriesLength = feedEntries.length;
	var itemEntry;
	var itemTitle;
	var itemContent;
	var itemTitleIndex;
	var itemInstanceIndex;
	var itemTimeInterval;
	var instanceDateString;
	var instanceDateStringFull;
	var instanceStartDateTime;
	var instanceStartJsDate;
	var instanceEndDateTime;
	var instanceEndJsDate;
	var instanceLinkHref;
	var copyToMyCalendarLinkHref;
	var copyToMyCalendarDateString;
	var instanceLocation;
	
	window._dev_eventDetails = [];
	
	for (var i = 0; i < feedEntriesLength; i++) {
		itemEntry = feedEntries[i];
		itemTitle = itemEntry.getTitle().getText();
		for (itemTitleIndex = parsedEventList.length - 1; itemTitleIndex > -1; itemTitleIndex--) {
			if (itemTitle.toLowerCase() == parsedEventList[itemTitleIndex].text.toLowerCase()) {
				break;
			}
		}
		if (itemTitleIndex == -1) {
			itemTitleIndex = parsedEventList.length;
			parsedEventList[itemTitleIndex] = {text: itemTitle, instances: []};
			itemInstanceIndex = 0;
		} else {
			itemInstanceIndex = parsedEventList[itemTitleIndex].instances.length;
		}

		if (itemEntry.getContent() != null) {
			itemContent = itemEntry.getContent().getText();
		} else {
			itemContent = '';
		}
		
		if (itemEntry.getLocations().length > 0) {
			instanceLocation = 	itemEntry.getLocations()[0].valueString;
		} else {
			instanceLocation = '';
		}
		

		itemTimeInterval = itemEntry.getTimes();
		if (itemTimeInterval.length > 0) {
			instanceStartDateTime = itemTimeInterval[0].getStartTime();
			instanceStartJsDate = instanceStartDateTime.getDate();
			instanceEndDateTime = itemTimeInterval[0].getEndTime();
			instanceEndJsDate = instanceEndDateTime.getDate();
			instanceDateString = instanceStartJsDate.format('dddd, mmmm d');
			instanceDateStringBeginTime = instanceStartJsDate.format('mmmm d');
			if (! instanceStartDateTime.isDateOnly()) {
				instanceDateStringBeginTime += ', ' + instanceStartJsDate.format('h:MM TT');
			}
			instanceDateStringFull = instanceStartJsDate.format('dddd, mmmm d, yyyy');
			if (! instanceStartDateTime.isDateOnly()) {
				instanceDateStringFull += ', ' + instanceStartJsDate.format('h:MM TT');
				instanceDateStringFull += ' - ' + instanceEndJsDate.format('h:MM TT');
			}
			
		} else {
			instanceDateString = '(To be announced)';
			instanceDateStringFull = '(To be announced)';
		}
		
		instanceLinkHref = null;
		if (itemEntry.getHtmlLink() != null) {
			instanceLinkHref = itemEntry.getHtmlLink().getHref() + '&ctz=' + queryResult.feed.getTimeZone().getValue();
		}
		
		copyToMyCalendarLinkHref = null;
		if (itemEntry.getHtmlLink() != null) {
			
			copyToMyCalendarLinkHref  = '<a href="http://www.google.com/calendar/event?action=TEMPLATE&' 
			itemEntry.getHtmlLink().getHref() + '&ctz=' + queryResult.feed.getTimeZone().getValue();
			
			
		}
		
		/*
		window._dev_eventDetails[window._dev_eventDetails.length] = {
			when: instanceDateStringFull
			, where: instanceLocation
			, description: itemContent
			, moreDetailsA: (instanceLinkHref == null) ? null : {href: instanceLinkHref, target: '_BLANK'}
			, copyToMyCalendarA: (copyToMyCalendarLinkHref == null) ? null : {href: copyToMyCalendarLinkHref, target: '_BLANK'}
		};
		*/

		parsedEventList[itemTitleIndex].instances[itemInstanceIndex] = {
			text: instanceDateStringBeginTime
			, a: ((instanceLinkHref == null) ? null : {href: instanceLinkHref, 'class': 'event-instance', target: '_BLANK'})
			, eventDetails: {
				what: itemTitle
				, when: instanceDateStringFull
				, where: instanceLocation
				, description: itemContent
				, moreDetailsHref: instanceLinkHref
				, copyToMyCalendarHref: null //copyToMyCalendarLinkHref
			}
		}
		
	}
	insertEventList(parsedEventList);
}

function insertEventList(parsedEventList)
{
	var itemTitleIndex;
	var itemInstanceIndex;
	var appendTo = jQuery('.list-events-upcoming');
	var content = [];
	var contentLength = 0;
	jQuery('.list-events-upcoming > .loading').remove();
	if (parsedEventList.length > 0) {
		var eventList = document.createElement('ul');
		jQuery.each(parsedEventList, function(itemTitleIndex, itemTitle) {
			var eventListItem = document.createElement('li');
			var eventItemTitle = document.createElement('h3');
			eventItemTitle.appendChild(document.createTextNode(itemTitle.text));
			eventListItem.appendChild(eventItemTitle);
			if (itemTitle.instances.length > 0) {
				var instanceList = document.createElement('ul');
				jQuery.each(itemTitle.instances, function(itemInstanceIndex, itemInstance) {
					var instanceItem = document.createElement('li');
					
					var instanceId = 'upcoming-event-' + itemTitleIndex + '-' + itemInstanceIndex;
					jQuery(instanceItem).append(buildEventPopupContent(instanceId, itemInstance.eventDetails));
					
					var instanceAnchor = document.createElement('a');

					jQuery(instanceAnchor).attr(itemInstance.a).attr('id', instanceId);
					jQuery(instanceAnchor).text(itemInstance.text);
					jQuery(instanceAnchor).bt({
						//
						contentSelector: "$('#" + instanceId + '-details' + "')",
						trigger: 'click',
						closeWhenOthersOpen: true,
						width: 400,
						padding: 15,
						positions: 'right',
						cornerRadius: 20,
						fill: '#F3F9FF',
						strokeStyle: '#3A5E8B',
						strokeWidth: 1
						//
					});
					jQuery(instanceAnchor).click(function () { return false; });
					
					instanceItem.appendChild(instanceAnchor);
					instanceList.appendChild(instanceItem);
				});
				eventListItem.appendChild(instanceList);
			}
			eventList.appendChild(eventListItem);
		});
		appendTo.append(eventList);
	} else {
		appendTo.append('<p>No uncoming events</p>');		
	}
}

function buildEventPopupContent(instanceId, eventDetails)
{
	
		var defaults = {
			what: 'Upcoming event'
			, when: '(To be disclosed)'
			, where: ''
			, description: ''
			, moreDetailsHref: null
			, copyToMyCalendarHref: null
		};
		var eventDetails = $.extend(true, defaults, eventDetails);
		var content = $('<div class="event-popup" style="display: none;"></div>').append(
				'<a href="#" class="close-x"></a>'
			).append(
				$('<div class="details"></div>').append(
					$('<span class="title" style="color: rgb(6, 13, 94);"></span>').text(eventDetails.what)
				).append(
					$('<div class="detail-content"></div>').append(
						$('<div class="detail-item"></div>').append(
							$('<span class="event-details-label">When</span>')
						).append(
							$('<span class="event-when"></span>').text(eventDetails.when)
						)
					).append(
						(eventDetails.where != '')
						?	$('<div class="detail-item"></div>').append(
									$('<span class="event-details-label">Where</span>')
								).append(
									$('<span class="event-where"></span>').text(eventDetails.where)
								)
						: null
					).append(
						(eventDetails.description != '')
						?	$('<div class="detail-item"></div>').append(
								$('<span class="event-details-label">Description</span>')
							).append(
								$('<span class="event-description"></span>').text(eventDetails.description)
							)
						: null
					)
				).append(
					'<div style="background-color: rgb(6, 13, 94);" class="separator"></div>'
				).append(
					(eventDetails.moreDetailsHref !== null || eventDetails.copyToMyCalendarHref !== null)
					? 	(
							$('<span class="links"></span>').append(
								(eventDetails.moreDetailsHref !== null)
								?	$('<a></a>').attr({ href: eventDetails.moreDetailsHref, target: '_BLANK' }).text('More details »')
								:	null
							).append(
								(eventDetails.moreDetailsHref !== null) ? '&nbsp;&nbsp;' : null
							).append(
								(eventDetails.copyToMyCalendarHref !== null)
								?	$('<a></a>').attr({ href: eventDetails.copyToMyCalendarHref, target: '_BLANK' }).text('Copy to my Google calendar »')
								:	null
							)
						)
					: null
				)
			);
		
	$('.close-x', content).click(function () {
		$('#' + instanceId).btOff();
		return false;
	});
	content.attr('id', instanceId + '-details');
	return content;
	
}

function insertEventList_qTip(parsedEventList)
{
	var outer_scope = 'OUTER SCOPE';
	var itemTitleIndex;
	var itemInstanceIndex;
	var appendTo = jQuery('.list-events-upcoming');
	var content = [];
	var contentLength = 0;
	
	if (parsedEventList.length > 0) {
		var eventList = document.createElement('ul');
		jQuery.each(parsedEventList, function(itemTitleIndex, itemTitle) {
			var eventListItem = document.createElement('li');
			var eventItemTitle = document.createElement('h3');
			eventItemTitle.appendChild(document.createTextNode(itemTitle.text));
			eventListItem.appendChild(eventItemTitle);
			if (itemTitle.instances.length > 0) {
				var instanceList = document.createElement('ul');
				jQuery.each(itemTitle.instances, function(itemInstanceIndex, itemInstance) {
					var instanceItem = document.createElement('li');
					var instanceAnchor = document.createElement('a');
					jQuery(instanceAnchor).attr(itemInstance.a);
					jQuery(instanceAnchor).text(itemInstance.text);
					jQuery(instanceAnchor).click(function () {
						$(this).qtip({
							content: {
								text: 'Content text',
								title: {
									text: 'Upcoming Event',
									button: '<span class="close-x"></span>'
								}
							},
							show: {
								when: false, // Don't specify a show event
								ready: true, // Show the tooltip when ready
								solo: true
							},
							position: {
								corner: {
									target: 'topRight',
									tooltip: 'bottomLeft'
								},
								adjust: {
									x: 0,
									y: 0
								}
							},
							hide: false,
							style: {
								width: {
									min: 200,
									max: 200
								},
								padding: '5px',
								title: {
									padding: '5px'
								},
								name: 'blue',
								border: {
									radius: 5
								},
								tip: {
									corner: 'bottomLeft',
									color: false,
									size: {
										x: 12,
										y: 12
									}
								}
							}
						});
						return false;
					});
					instanceItem.appendChild(instanceAnchor);
					instanceList.appendChild(instanceItem);
				});
				eventListItem.appendChild(instanceList);
			}
			eventList.appendChild(eventListItem);
		});
		appendTo.append(eventList);
	} else {
		appendTo.append('<p>No uncoming events</p>');		
	}
}


function listEventsUpcoming(feedRoot) {
//list-events-upcoming

	var renderTo = jQuery('.list-events-upcoming');
	
	var entries = feedRoot.feed.getEntries();
	
	if (entries.length == 0) {
		renderTo.append('<p>No upcoming events.</p>');
	} else {
		var entryList = jQuery(document.createElement('ul'));
		for (var i = 0; i < entries.length; i++) {
			var entry = entries[i];
			
			var entryListItemTitle = jQuery(document.createElement('h3'));
			
			entryListItemTitle.append(
				document.createTextNode(entry.getTitle().getText())
			);

			var times = entry.getTimes();
			var dateString = '(To be announced)';
			if (times.length > 0) {
				startDateTime = times[0].getStartTime();
				startJSDate = startDateTime.getDate();
				dateString = (startDateTime.isDateOnly() ? startJSDate.format('dddd, mmmm d') : startJSDate.format('dddd, mmmm d at h:MM TT'));
				if (! startDateTime.isDateOnly()) {
					dateString += ' at ' + startJSDate.format('h:MM TT');
				}
			}
			
			
			var entryLinkHref = null;
			if (entry.getHtmlLink() != null) {
				entryLinkHref = entry.getHtmlLink().getHref() + '&ctz=' + feedRoot.feed.getTimeZone().getValue();
			}

			var entryListItemDate = jQuery(document.createElement('a'));
			
			entryListItemDate.text(dateString);
			if (entryLinkHref != null) {
				entryListItemDate.attr('href', entryLinkHref);
			}
			
			var entryListItem = jQuery(document.createElement('li'));
			entryListItem.append(entryListItemTitle);
			entryListItem.append(entryListItemDate);
			
			entryList.append(entryListItem);
			
		}
		//jQuery('.loading', renderTo).remove();
		//renderTo.append(entryList);
	}
	
}


function listEvents(feedRoot) {
	window.dev_feed = 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('ul'); /* set the calendarTitle div with the name of the calendar */
	document.getElementById('calendarTitle').innerHTML = "Calendar: " + feedRoot.feed.title.$t + ', Timezone: ' + feedRoot.feed.getTimeZone().getValue();
	/* loop through each event in the feed */
	var entriesGroupedByTitle = [];
	
	var len = entries.length;
	for (var i = 0; i < len; i++) {
		
	}

	var len = entries.length;
	for (var i = 0; i < len; i++) {
		var entry = entries[i];
		var title = 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 dateString = (startJSDate.getMonth() + 1) + "/" + startJSDate.getDate();
		
		var dateString = (startDateTime.isDateOnly() ? startJSDate.format('dddd, mmmm d, yyyy') : startJSDate.format('dddd, mmmm d, yyyy h:MM TT'));
		/*
		if (!startDateTime.isDateOnly()) {
			dateString += " " + startJSDate.getHours() + ":" + padNumber(startJSDate.getMinutes());
		}
		*/
		
		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('href', entryLinkHref + '&ctz=America/Chicago');
			//entryLink.setAttribute('style', 'display: none;');
			entryLink.appendChild(document.createTextNode(title));
			li.appendChild(entryLink);
			li.appendChild(document.createTextNode(' - ' + dateString));
		} else {
			li.appendChild(document.createTextNode(title + ' - ' + dateString));
		}
		fiLi = jQuery(li);
		//fiLi.fadeIn('slow');

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

google.setOnLoadCallback(onGoogleDataLoad);


