//******************************************************************************
//******************************************************************************
// To use this script, write a css using the classes below, include the google 
// functions script like follows in the <HEAD></HEAD>:
// <SCRIPT type="text/javascript" src="googleFunctions.js"></SCRIPT>
// then set up the script variables:
//<script type="text/javascript">
//gCalendarFeedUsernames = new Array;
//gCalendarFeedUsernames[0] = "XXXXXX";
//gCalendarFeedUsernames[1] = "XXXXXX";
//gBloggerFeedUsernames = new Array;
//gBloggerFeedUsernames[0] = "XXXXXX";
//</script>
// and then to display them in the page
//<script type="text/javascript">generateBlogIndex()</script>
//<script type="text/javascript">generateCalendarIndex()</script>
var _GET = readGet();
var googleFeeds = new Array;

// user definateble params
var gCalendarPageLink;
var gCalendarPrintTitle;
var gCalendarNumEvents;
var gBloggerNumPerPage;
var gBloggerNumEvents;
var gBloggerArchiveEnabled;
var gBloggerPrintTitle;
var gFeedRequests = new Array;
var gCalendarFeedUsernames;
var gBloggerFeedUsernames;
var gPicasaFeedUsernames;


/**********************************************************/
/* Build the defaults																			*/
if (!gCalendarNumEvents) { gCalendarNumEvents = 6; }
if (!gBloggerNumPerPage) { gBloggerNumPerPage=5; gBloggerArchiveEnabled=false; }



buildFeedRequests();
generateFeedRequests();

function buildFeedRequests() {
	if (gCalendarFeedUsernames) {
		for(i=0;i<gCalendarFeedUsernames.length;i++) {
			gFeedRequests.push("http://www.google.com/calendar/feeds/" + gCalendarFeedUsernames[i] + "/public/full?alt=json-in-script&callback=populateFeeds&orderby=starttime&max-results="+ gCalendarNumEvents + "&singleevents=true&sortorder=ascending&futureevents=true");
		}
	}
	if (gBloggerFeedUsernames) {
		for(i=0;i<gBloggerFeedUsernames.length;i++) {
			gFeedRequests.push("http://" + gBloggerFeedUsernames[i] + ".blogspot.com/feeds/posts/default?alt=json-in-script&callback=populateFeeds&max-results="+gBloggerNumEvents+"");
		}
	}
	if (gPicasaFeedUsernames) {
		for(i=0;i<gPicasaFeedUsernames.length;i++) {
			gFeedRequests.push("http://picasaweb.google.com/data/feed/api/user/"+gPicasaFeedUsernames[i]+"?category=album&alt=json-in-script&callback=populateFeeds&access=public");
		}
	}
}	


function generateFeedRequests() {
	for(i=0;i<gFeedRequests.length;i++) {
		$('<script type="text/javascript" src="' + gFeedRequests[i] + '"></script>');
	}
}

/*******************************************************************/
/* populate the googleFeed - use this as the callback of all feeds */
/*******************************************************************/
function populateFeeds(j) {
	if(j.feed.entry!=null) {
		googleFeeds.push(j);
	}
}

/*******************************************************************/
/* generate a calendar index
/*******************************************************************/
function generateCalendarIndex(feedID) {
	tmpEntryArray = new Array;

	//loop through all the feeds (or filter by feed ID) to build an array of calendar entries 
	for(i=0;i<googleFeeds.length;i++){
		//if this feed isn't a calendar feed, move to next
		if (googleFeeds[i].feed.generator.$t != "Google Calendar") {
			continue;
		}

		//if a feed ID was passed in, only grab entries from the proper feed
		if ((feedID) && (feedID != googleFeeds[i].feed.title.$t)) {
				continue;
		}
		for(j=0;j<googleFeeds[i].feed.entry.length;j++){
			googleFeeds[i].feed.entry[j].feedTitle = googleFeeds[i].feed.title.$t;
			tmpEntryArray.push(googleFeeds[i].feed.entry[j]);
		}
	}

	//sort the array by date (only if multiple feeds, if one feed, it was sorted by the request
	if (!(feedID)) {
		tmpEntryArray.sort(function sortfunction(a, b) { 
				var aDate = new Date(getUTCDateFromGoogleDate(a.gd$when[0].startTime));
				var bDate = new Date(getUTCDateFromGoogleDate(b.gd$when[0].endTime));
				
				return aDate.getTime() - bDate.getTime();
			})
	}

	//print the calendar index
	$("<DIV class='gcalEventList'>");
	for(i=0;i<tmpEntryArray.length;i++){
		if (i!=0) { $("<BR>"); }
		googleCalendarEventIndex(tmpEntryArray[i]); 
		if ((gCalendarNumEvents) && (gCalendarNumEvents-1 <= i)) { break; }
	}
	$("</DIV>");

}	


function googleCalendarEventIndex(calEntry){
	if (calEntry) {
		$("<SPAN class='gcalEventEntry'>");
		// title, description, startdate, enddate, description
		var eventTitle = calEntry.title.$t;
		var eventDescription = calEntry.content.$t;
		var eventStartDate = new Date(getUTCDateFromGoogleDate(calEntry.gd$when[0].startTime));
		var eventEndDate = new Date(getUTCDateFromGoogleDate(calEntry.gd$when[0].endTime));
		var tmpEndDate = new Date(eventEndDate.valueOf()-(1000*60*60*24));
		var eventString;
		
			
		if (eventStartDate.getYear()==eventEndDate.getYear() &&
			eventStartDate.getMonth()==eventEndDate.getMonth() &&
			eventStartDate.getDate()==eventEndDate.getDate()) {
				eventString = generateDateObjectDay(eventStartDate) + " " + generateDateObjectTime(eventStartDate) + " - " + generateDateObjectTime(eventEndDate);
		} else if (eventStartDate.getHours()==0 && eventStartDate.getMinutes()==0) {
				//if they are one day apart it is a one day event, else multiday no time event
				if (eventStartDate.valueOf()+(1000*60*60*24)==eventEndDate.valueOf()) {
					eventString = generateDateObjectDay(eventStartDate);
				} else {
				// else they are multple days no span time
					eventString = generateDateObjectDay(eventStartDate) + " - " + generateDateObjectDay(tmpEndDate);
				}						
		} else {
				// else they span day and time
				eventString = generateDateObjectDay(eventStartDate) + " " + generateDateObjectTime(eventStartDate) + " - " + generateDateObjectDay(eventEndDate) + " " + generateDateObjectTime(eventEndDate);
			}
		var eventLocation = linkLocation(calEntry.gd$where[0].valueString);

		$("<span class='gcalStartDate'>" + eventString + "</SPAN>")
		if (eventTitle) { 
			$("<span class='gcalEventTitle'>");
			if (gCalendarPageLink) { $("<A HREF='" + gCalendarPageLink + "' CLASS='gcalEventTitle'>"); }
			$(eventTitle);
			if (gCalendarPageLink) { $("</A>"); }
			$("</span>");
		}
		if (calEntry.feedTitle && gCalendarPrintTitle) { $("<span class='gcalFeedTitle'>Calendar: " + calEntry.feedTitle + "</span>"); }
		if (eventLocation) { $("<span class='gcalEventLocation'>Location: " + eventLocation + "</span>"); }
		if (eventDescription) { $("<span class='gcalEventDescription'>" + eventDescription + "</span>"); }
		$("</SPAN>");
	}	
}

/*******************************************************************/
/* generate a blog index
/*******************************************************************/
function generateBlogIndex(feedID) {
	tmpEntryArray = new Array;

	//loop through all the feeds (or filter by feed ID) to build an array of calendar entries 
	for(i=0;i<googleFeeds.length;i++){
		//if this feed isn't a calendar feed, move to next
		if (googleFeeds[i].feed.generator.$t != "Blogger") {
			continue;
		}

		//if a feed ID was passed in, only grab entries from the proper feed
		if ((feedID) && (feedID != googleFeeds[i].feed.title.$t)) {
				continue;
		}
		for(j=0;j<googleFeeds[i].feed.entry.length;j++){
			googleFeeds[i].feed.entry[j].feedTitle = googleFeeds[i].feed.title.$t;
			tmpEntryArray.push(googleFeeds[i].feed.entry[j]);
		}
	}

	//sort the array by date (only if multiple feeds, if one feed, it was sorted by the request
	if (!(feedID)) {
		tmpEntryArray.sort(function sortfunction(a, b) { 
				var aDate = new Date(getUTCDateFromGoogleDate(a.published.$t));
				var bDate = new Date(getUTCDateFromGoogleDate(b.published.$t));
				
				return bDate.getTime() - aDate.getTime();
			})
	}

	//if the archive is enabled build the variabled for the more link
	if (gBloggerArchiveEnabled) {
		var currentBloggerPage = 1;
		if (_GET['page']) {
			currentBloggerPage = _GET['page'];
		}
		
		var endBlog = gBloggerNumPerPage * currentBloggerPage;
		var startBlog = endBlog-gBloggerNumPerPage;	
		if (endBlog > tmpEntryArray.length) { endBlog = tmpEntryArray.length; }
	} else {
		startBlog = 0;
		endBlog = tmpEntryArray.length;
	}
			
	$("<SPAN class='gbloggerList'>");
	for(i=startBlog;i<endBlog;i++){
		$("\n\n<span class='gbloggerEntry'>");
			
		var blogTitle = tmpEntryArray[i].title.$t;
		var blogDate = new Date(getUTCDateFromGoogleDate(tmpEntryArray[i].published.$t));
		var blogContent = tmpEntryArray[i].content.$t;
		var blogAuthor = tmpEntryArray[i].author[0].name.$t;
			
		$("<span class='gbloggerDate'>" + formatDate(blogDate)  + "</span>");
		if (blogTitle != "(null)") { $("<span class='gbloggerTitle'>" + blogTitle + "</span>"); }
		if (tmpEntryArray[i].feedTitle && gBloggerPrintTitle) { $("<span class='gbloggerFeedTitle'>Blog: " + tmpEntryArray[i].feedTitle + "</span>"); }
		$("<span class='gbloggerContent'>" + blogContent + "</span>");
		if (blogAuthor) { $("<span class='gbloggerAuthor'>Author: " + blogAuthor  + "</span>"); }
		if (i+1<endBlog) 
			{ $("<DIV CLASS='dividerLine'> </DIV>"); }
		else if (i+1<tmpEntryArray.length) { 
			$("<DIV class='gbloggerMoreLink'><A class='gbloggerMoreLink' HREF='?page=" + ((currentBloggerPage * 1) + 1) + "'>More ...</A></DIV>"); 
		}
		if ((gBloggerNumEvents) && (gBloggerNumEvents-1 <= i)) { break; }
		
		$("</span>\n\n");
	}		
	$("</SPAN>");
}

/*******************************************************************/
/* generate a calendar index
/*******************************************************************/
function generatePicasaThumbIndex(feedID) {
	tmpEntryArray = new Array;

	//loop through all the feeds (or filter by feed ID) to build an array of calendar entries 
	for(i=0;i<googleFeeds.length;i++){
		//if this feed isn't a calendar feed, move to next
		if (googleFeeds[i].feed.generator.$t != "Picasaweb") {
			continue;
		}

		//if a feed ID was passed in, only grab entries from the proper feed
		if ((feedID) && (feedID != googleFeeds[i].feed.title.$t)) {
				continue;
		}
		for(j=0;j<googleFeeds[i].feed.entry.length;j++){
			googleFeeds[i].feed.entry[j].feedTitle = googleFeeds[i].feed.title.$t;
			tmpEntryArray.push(googleFeeds[i].feed.entry[j]);
		}
	}

	//sort the array by date (only if multiple feeds, if one feed, it was sorted by the request
	if (!(feedID)) {
		tmpEntryArray.sort(function sortfunction(a, b) { 
				return (Math.round(Math.random())-0.5);
			})
	}

	for(i=0;i<tmpEntryArray.length;i++){
			var image = tmpEntryArray[i].media$group.media$content[0].url;

			$("<a href='" + gPicasaPageLink + "'><img class='webalbumElementThumbs' src='" + image + "?imgmax=" + gPicasaIndexThumbPhotoSize + "' hspace=20 align=center /></a>");
	}

}	

/*******************************************************************/
/* generate a calendar index
/*******************************************************************/
function generatePicasaGalleryIndex(feedID) {
	tmpEntryArray = new Array;

	//loop through all the feeds (or filter by feed ID) to build an array of calendar entries 
	for(i=0;i<googleFeeds.length;i++){
		//if this feed isn't a calendar feed, move to next
		if (googleFeeds[i].feed.generator.$t != "Picasaweb") {
			continue;
		}

		//if a feed ID was passed in, only grab entries from the proper feed
		if ((feedID) && (feedID != googleFeeds[i].feed.title.$t)) {
				continue;
		}
		for(j=0;j<googleFeeds[i].feed.entry.length;j++){
			googleFeeds[i].feed.entry[j].feedTitle = googleFeeds[i].feed.title.$t;
			tmpEntryArray.push(googleFeeds[i].feed.entry[j]);
		}
	}

	//sort the array by date (only if multiple feeds, if one feed, it was sorted by the request
	if (!(feedID)) {
		tmpEntryArray.sort(function sortfunction(a, b) { 
				var aDate = new Date(getUTCDateFromGoogleDate(a.published.$t));
				var bDate = new Date(getUTCDateFromGoogleDate(b.published.$t));
				
				return bDate.getTime() - aDate.getTime();
			})
	}

	function getPicasaAlbumName(album) {
		var deletableCharacters = / |\$|,|@|#|~|`|\%|\*|\^|\&|\(|\)|\+|\=|\-|\[|\]|\{|\}|\;|\:|\'|\"|\<|\>|\?|\||\\|\!|\./g;
		return album.replace(deletableCharacters, "");
	}

	for(i=0;i<tmpEntryArray.length;i++){
			var album_name = tmpEntryArray[i].title.$t;
			var album_name_picasa = getPicasaAlbumName(tmpEntryArray[i].gphoto$name.$t);
			var image = tmpEntryArray[i].media$group.media$content[0].url;
			var description = tmpEntryArray[i].media$group.media$description.$t;
			var published = tmpEntryArray[i].published.$t.slice(0,10);			// only get the date, not the time			
			var photos_in_album = tmpEntryArray[i].gphoto$numphotos.$t;
			var albumlocation = tmpEntryArray[i].gphoto$location.$t;
	
			$("<p class='webalbumElement'>");
			$("<a href='gallery.html?gPicasaUsername=" + tmpEntryArray[i].feedTitle + "&album=" + album_name_picasa + "'><img src='" + image + "?imgmax=" + gPicasaCoverThumbSize + "' hspace=20 align=left class='webalbumElement' /></a>");
			$("<span class='album_name'><a class='album_name' href='?gPicasaUsername=" + tmpEntryArray[i].feedTitle + "&album=" + album_name_picasa + "'>" + album_name + "</a></span><br>");
			if(photos_in_album) $("<span class='photos_in_album'>" + photos_in_album + " photos</span><br>");
			if(albumlocation) $("<span class='albumlocation'>Location: " + albumlocation + "</span><br>");
			$("<span class='published'>Date Created: " + published + "</span><br>");
			if(description) $("<span class='description'>" + description + "</span>");
			$("</P>");
	}

}	


