﻿/*/==========================================================================\\
\\
//	(c)2011 JCriscione@4ORCEdigital.com
\\	LAST UPDATE: 20110225
//	DESCRIPTION: Google Calendar Functionality
\\	REQUIRES: jquery
//	TODO: allow multiple controls on a page
||		handle max-results parameter
||		implement templating?
//	USE: add a link to the iFramed Google Calendar page in a <noscript> block
\\		then add a link with a link to the JSON data feed and send the selector
//		to the GetGoogleCalendarFeed function.
\\		add max-results=N as query-string parameter to limit results to N
\\
//===========================================================================*/

//use jquery templates?
function BuildEventList(selector) {
	//make sure jQuery is loaded
	if (typeof jQuery == 'undefined') {
		alert("jQuery must be loaded before requesting the googleCalendarFeed.js/BuildEventList function.");
		return; //fail if no jQuery
	}

	//make sure date.js is loaded
	if (typeof LZ == 'undefined') {
		alert("Date.js must be loaded before requesting the googleCalendarFeed.js/BuildEventList function.");
		return; //fail if no jQuery
	}

	var url = selector.attr("href");

	var calendarIds = new Array();
	calendarIds = ExtractCalendarIds(url);

    var appointments = new Array();
	for (var i = 0; i < calendarIds.length; i++) {
		GetGoogleCalendarFeed(calendarIds[i], appointments, GetMaxResults(url));
	}

	var listContainer = $("<ul />", { "class": "FORCEdigital_CalendarFeed" });
	selector.replaceWith(listContainer);
}

function GetGoogleCalendarFeed(key, appointments, maxResults) {
	var onlyFutureEvents = true;
	var feedUrl = "http://www.google.com/calendar/feeds/" + key + "/public/full?alt=jsonc&futureevents=" + onlyFutureEvents + "&callback=?";

	var appts = new Array();
	$.getJSON(feedUrl,
		function (msg) {	//onSuccess
			if (msg.error == undefined) {	//...and no errors
				if (msg.data.items != undefined) {
					$.each(msg.data.items, function () {
						var appt = new Array();
						if (this.when.length > 0) {
							//title,details,location,start,end
							appt[0] = this.title;
							appt[1] = this.details;
							appt[2] = this.location;
							//alert("start: " + this.when[0].start + " | end: " + this.when[0].end);
							appt[3] = FormatDate(this.when[0].start);
							appt[4] = FormatDate(this.when[0].end);
							appt[5] = msg.data.title.replace(/ /g, ""); //class name
							appointments.push(appt);
						}
					});
					appointments.sort(CalendarSortFunc); //sort by date
					$(".FORCEdigital_CalendarFeed").empty();
                    for( x=0; x < maxResults; x++ ){
                        var event = "<span class='title'>" + appointments[x][0] + "</span>"
                            + "<span class='date'>" + formatDate(appointments[x][3], "EE, MMM d, yyyy") + "</span><hr />"
                            + "<span class='time'>" + formatDate(appointments[x][3], "h:mm a") + " - " + formatDate(appointments[x][4], "h:mm a") + "</span>"
                            + "<span class='location'>" + appointments[x][2] + "</span>";
                        $("<li />", { "html": event }).appendTo(".FORCEdigital_CalendarFeed");
                    }
				}
			}
		}
	);
}

function FormatDate(dateString) {
	var newDate;
	if (dateString.length > 12) {
		//date format: 2010-12-15T12:00:00.000-06:00
		var cleanRegex = /\..+$/;
		var datetime = dateString.replace(cleanRegex, "");
		newDate = new Date(getDateFromFormat(datetime, "y-M-dTH:m:s"));
	} else {
		var dateParts = dateString.split("-");
		var itemYear = dateParts[0];
		var itemMonth = dateParts[1] - 1;
		var itemDay = dateParts[2];
		newDate = new Date(itemYear, itemMonth, itemDay);
	}
	return newDate;
}

function CalendarSortFunc(a, b) {
	if(a[3] > b[3])
		return 1;
	if(a[3] < b[3])
		return -1;
	return 0;
}

//pull an array of calendar IDs from the URL
function ExtractCalendarIds(url) {
	var calendarIds = new Array();
	var idCounter = 0;
	var urlParts = new Array();
	urlParts = url.split("&");
	for (var i = 0; i < urlParts.length; i++) {
		var attVal = new Array();
		attVal = urlParts[i].split("=");
		if (attVal[0] == "src") {
			calendarIds[idCounter] = attVal[1];
			idCounter++;
		}
	}
	return calendarIds;
}

function GetMaxResults(url) {
	var maxResults = new Array();
	var idCounter = 0;
	var urlParts = new Array();
	urlParts = url.split("&");
	for (var i = 0; i < urlParts.length; i++) {
		var attVal = new Array();
		attVal = urlParts[i].split("=");
		if (attVal[0] == "max-results") {
			maxResults[idCounter] = attVal[1];
			idCounter++;
		}
	}
	return maxResults;
}

/*
function BuildCalendar(selector) {
	//make sure jQuery is loaded
	if (typeof jQuery == 'undefined') {
		alert("jQuery must be loaded before requesting the Flickr feed.");
		return; //fail if no jQuery
	}

	var url = selector.attr("href");
	var response = GetGoogleCalendarFeed(url)

	//do stuff here
}



//////main.js
/*
	//calendar specific vars
	var month, year, cal;
	var appts;

	if ($("#calendar").length) {
		setTimeout(function () { DoCalendar("#calendar"); }, 200);	//delay creation
	}


/-*Calendar Stuff*-/
function DoCalendar(element) {
	var now = new Date();
	year = now.getFullYear();
	month = now.getMonth();

	cal = new Calendar(year, month);
	cal.addNavigation = true;
	cal.MinimumDate = now;
	cal.generateHtml();
	$(element).html(cal.getHtml());
	setTimeout(function () { GetCalendarFeed(element) }, 550);

	//handle events
	$(element + " .prev").live("click", function (e) {
		e.preventDefault();
		$(element).empty();
		cal.PreviousMonth();
		cal.generateHtml();
		$(element).html(cal.getHtml());
		if (cal.Year() <= cal.MinimumDate.getFullYear()
					&& cal.Month() <= cal.MinimumDate.getMonth()) {
			$(element + " .prev").hide();
		}
		ShowApptsOnCalendar(element, appts);
	});
	$(element + " .next").live("click", function (e) {
		e.preventDefault();
		$(element).empty();
		cal.NextMonth();
		cal.generateHtml();
		$(element).html(cal.getHtml());
		ShowApptsOnCalendar(element, appts);
	});
}

function ShowApptsOnCalendar(element, appts) {
	//title,details,location,start,end,class
	for (var i = 0; i < appts.length; i++) {
		if (appts[i][0].length > 0) {
			PopulateCalendar(element, appts[i][0], appts[i][1], appts[i][2], appts[i][3], appts[i][4], appts[i][5]);
		}
	}
}

function GetCalendarFeed(element) {
	/-*IFrame: https://www.google.com/calendar/embed?showNav=0&showPrint=0&showTabs=0
		&showCalendars=0&height=600&wkst=1&bgcolor=%23FFFFFF&src=trailnet%40gmail.com&color=%2328754E
		&src=j1dd1egsbumjjbc5s7etrsibq8%40group.calendar.google.com&color=%23856508 //Community Engagement/Advocacy
		&src=08scnptl35b6hbsd482sr3bl3g%40group.calendar.google.com&color=%23691426 //Partner Rides and Events
		&src=cj8k1ie8k7cpbfip7okdi0dtuo%40group.calendar.google.com&color=%23182C57 //Trailnet Community Rides
		&src=7l274injsl2orsas2n1u23cur4%40group.calendar.google.com&color=%238C500B //Trailnet Special Events
		&src=1av06lgo93v8l521hqvn6tgcig%40group.calendar.google.com&color=%23125A12 //TravelGreen
		&ctz=America%2FChicago 
		//Bicycle Fun Club Rides?*-/
	var calendarKeys = new Array(5);
	calendarKeys[0] = ["cj8k1ie8k7cpbfip7okdi0dtuo", "Trailnet Community Rides", "Rides"];
	calendarKeys[1] = ["08scnptl35b6hbsd482sr3bl3g", "Partner Rides and Events", "PartnerEvents"];
	calendarKeys[2] = ["1av06lgo93v8l521hqvn6tgcig", "TravelGreen", "TravelGreen"];
	calendarKeys[3] = ["j1dd1egsbumjjbc5s7etrsibq8", "Community Engagement/Advocacy", "Advocacy"];
	calendarKeys[4] = ["7l274injsl2orsas2n1u23cur4", "Trailnet Special Events", "SpecialEvents"];
	calendarKeys[5] = ["trailnet%40gmail.com", "Trailnet Calendar", "TrailnetCalendar"];

	for(var i = 0; i < calendarKeys.length; i++)
	{
		$.getJSON("http://www.google.com/calendar/feeds/" + calendarKeys[i][0] + "%40group.calendar.google.com/public/full?alt=jsonc&futureevents=true&callback=?",
			function (msg) {	//onSuccess
				if (msg.error == undefined) {	//...and no errors
					if (msg.data.items != undefined) {
						appts = new Array(msg.data.items.length);
						for (var i = 0; i < appts.length; i++)
						{ appts[i] = new Array(5); }
						var i = 0;
						$.each(msg.data.items, function () {
							if (this.when) {
								//title,details,location,start,end
								appts[i][0] = this.title;
								appts[i][1] = this.details;
								appts[i][2] = this.location;
								appts[i][3] = this.when[0].start;
								appts[i][4] = this.when[0].end;
								appts[i][5] = calendarKeys[i][2];
								i++;
							}
						});
						ShowApptsOnCalendar(element, appts);
					}
				}
			}
		);
	}
}

function PopulateCalendar(element, title, details, location, start, end, classAttr) {
	//date format: 2010-12-15T12:00:00.000-06:00
	var cleanRegex = /\..+$/;
	var datetime = start.replace(cleanRegex, "");
	var newdate = new Date(getDateFromFormat(datetime, "y-M-dTH:m:s"));
	//get parts
	var itemMonth = newdate.getMonth();
	var itemDay = newdate.getDate();
	var itemYear = newdate.getFullYear();
	var itemMinute = newdate.getMinutes();
	var itemHour = newdate.getHours();
	//place on calendar
	if (itemYear == cal.Year() && itemMonth == cal.Month()) {
		//iterate through calendar days(cells)
		$(element + " td").each(function () {
			if ($(this).text() == itemDay) {
				//place calendar items
				var txt = "";
				if ($(this).text().length <= 2) {
					txt = "<br />"
				}
				//txt += '<a href="#" class="ride" title="' + title + '"></a>';
				$(this).append(txt);
				$(this).append($("<a/>").attr('href', '#').attr('class', classAttr).attr('title', title)
					//href: "#",
					//class: classAttr,
					//title: title
				.tooltip({
					onBeforeShow: function () {
						$(".tooltip").empty();
						//format minutes to 2 digits
						itemMinute += "";
						if (itemMinute.length == 1)
						{ itemMinute = "0" + itemMinute; }
						//update tooltip text
						$(".tooltip").append("<strong>" + title + "</strong><br />"
								+ "Location: " + location + "<br />"
								+ details + "<br />"
								+ "Time: " + itemHour + ":" + itemMinute);
					},
					onHide: function () { $(".tooltip").empty(); },
					click: function (e) { e.preventDefault(); }
				}));
			}
		});
	}
}






////calendar.js

/-*****************
* TODO
* ----
* add earliest navigable date
* add latest navigable date
* 
* 
******************-/

//constants
CAL_DAYS = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
CAL_MONTHS = ["January", "February", "March", "April", "May", "June", "July", 
			  "August", "September", "October", "November", "December"];

cal_current_date = new Date();	//today
//if no date passed, default to today
function Calendar(year, month) {
	this.month = (isNaN(month) || month == null) ? cal_current_date.getMonth() : month;
	this.year  = (isNaN(year) || year == null) ? cal_current_date.getFullYear() : year;
	this.html = "";
	this.addNavigation = false;
	this.minimumDate = null;
}

//utility functions
function GetDaysInMonth(year, month) {
	var dd = new Date(year, month + 1, 0);
	return dd.getDate();
}

function GetCalendarRows(monthLength, startingDay) {
	return(Math.ceil(monthLength + startingDay) / 7);
}

Calendar.prototype.NextMonth = function(){
	this.month = (this.month + 1) % 12;
	if (this.month == 0){
		this.year++;
	}
}

Calendar.prototype.PreviousMonth = function () {
	this.month = (this.month + 11) % 12;
	if (this.month == 11) {
		this.year--;
	}
}

Calendar.prototype.Month = function () {
	return this.month;
}

Calendar.prototype.Year = function () {
	return this.year;
}

Calendar.prototype.MinimumDate = function () {
	return this.minimumDate;
}

//do it.
Calendar.prototype.getHtml = function () {
	return this.html;
}

Calendar.prototype.generateHtml = function () {
	//member variables
	var firstDay = new Date(this.year, this.month, 1);
	var startingDay = firstDay.getDay();
	var monthLength = GetDaysInMonth(this.year, this.month);
	var monthName = CAL_MONTHS[this.month];

	//top row with month/year
	var html = "<table class='calendar'>"
		+ "<tr class='month'>";
	if (this.addNavigation) {	//add (previous / next) month links
		html += "<th><a href='#' class='prev'>&lt;</a></th>"
			+ "<th colspan='5'>" + monthName + " " + this.year + "</th>"
			+ "<th><a href='#' class='next'>&gt;</a></th>";
	} else {
		html += "<th colspan='7'>" + monthName + " " + this.year + "</th></tr>";
	}
	html += "</tr>";
	//row of day names
	html += "<tr class='days'>";
	for (var i = 0; i <= 6; i++) {
		html += '<th>' + CAL_DAYS[i].substr(0, 1) + "</th>";
	}
	html += "</tr>";
	//fill in the dates
	html += "<tr>";
	var day = 1;
	//loop the weeks (rows)
	for (var i = 0; i < 9; i++) {
		//loop the days (cells)
		for (var j = 0; j <= 6; j++) {
			html += "<td>";
			if (day <= monthLength && (i > 0 || j >= startingDay)) {
				html += day++;
			}
			html += "</td>";
		}
		if (day > monthLength) {
			break;
		} else {
			html += "</tr><tr>";
		}
	}

	html += "</tr>"
	html += "</table>"	//display complete

	this.html = html;
}

*/






