$(document).ready(function() {
	//GLOBAL VARIABLES
	EventDetailsObj = {
		shareSlideLock: false,
		shareSlideOpen: false,
		allPosts: [],
		postFadeInTimer: null		
	};
	
	//EVENT LISTENERS
	
	/*
	 * Accordions
	 */	
	// Handlers for level 1 accordion buttons, level 2 section anchors, and level 3 plus/minus buttons: 
	$("div.accordionButton, .detailAnchor, div.detailItemTitle").live("click", function(event) {
		var $clickedElement = $(this);
		var timeDelay = 0;
				
		// Level 1 and level 3 buttons are handled similarly (by directly being clicked):
		if ($clickedElement.hasClass("accordionButton") || $clickedElement.hasClass("detailItemTitle")) {
			timeDelay += 400;
			accordionClickHandler($clickedElement);

			// Only if the accordion is an event details accordion (not the right side accordion) and it is being opened, go to the target:
			if (($clickedElement.parents("#eventDetailContents").length) && (
				($clickedElement.hasClass("accordionButton") && $("#eventDetailContents .accordionButton.active").length) ||
				($clickedElement.hasClass("detailItemTitle") && $clickedElement.hasClass("active"))
				)) {
				setTimeout(function() {
					//goToAnchor($clickedElement.attr("id"));
				}, timeDelay);
			}
		}
		// Level 2 buttons can take users to any level (by being linked to it):
		else if ($clickedElement.hasClass("detailAnchor")) {
			event.preventDefault();
			var targetAnchorPath = $clickedElement.attr("data-target-anchor");
			findAnchor(targetAnchorPath);
		}
	});
		
	/*
	 * Print 
	 */
	$("div.printAll").live("click", function(event) {
		event.stopPropagation();
		window.print();
	});
	
	/*
	 * Sharing this event 
	 */
	$("a.shareEvent").mouseenter(function(){
		// Adjust position of share box:
		$("#shareEventContainer").css({
			top: $("a.shareEvent").offset().top - 48
		});
		
		if (!EventDetailsObj.shareSlideLock) {
			EventDetailsObj.shareSlideLock = true;
			$("#shareEventContainer").slideDown(300, function() {
				EventDetailsObj.shareSlideLock = false;
				EventDetailsObj.shareSlideOpen = true;
			});
		}				
	});	
	// Ensure that the share container does not inadvertedly stay open:
	$(".breadCrumbs, .headerTitle, .bgDiv, #event-right-col-wrapper").mousemove(function(){
		if (!EventDetailsObj.shareSlideLock) {
			EventDetailsObj.shareSlideLock = true;
			$("#shareEventContainer").slideUp(300, function() {
				EventDetailsObj.shareSlideLock = false;
				EventDetailsObj.shareSlideOpen = false;
			});
		}
	});
	// Select share link on click:
	$("#shareField").click(function() {
		this.select();
	});
	
	/*
	 * Downloads overlay
	 */
	$("#connect-with-us .connectWithUs-downloads").click(function(event) {
		event.preventDefault();
		hideAllDownloadContainers();
		setFirstDownloadContainerActive();
		$("#detailDownloadOverlay").center();
		$("#detailSiteMask").css("opacity", 0.50);
		$("#detailSiteMask").fadeIn("fast");
		$("#detailDownloadOverlay").fadeIn(800, function() {
			// Initialize scrollbar:
			if ($("#downloadsContainer").length) {
				$("#downloadsContainer").mCustomScrollbar("vertical",0,"easeOutCirc",1.25,"fixed","yes","no",0);
			}
		});		
	});
	
	// Closing of downloads overlay:
	$("#detailDownloadOverlay .closeDownloadsOverlay").click(function(event) {
		$("#detailSiteMask").fadeOut("fast");
		$("#detailDownloadOverlay").slideUp("fast");
	});
	
	// For switching between download headers:
	$("#detailDownloadOverlay .downloadHeaderItem").click(function(event) {
		if (!$(this).hasClass("active")) {
			event.preventDefault();
			hideAllDownloadContainers();
			containerId = "#detailDownloadOverlay #" + this.name + "Container";
			$(this).addClass("active");
			$(containerId).show("normal", function(){
				// Initialize scrollbar:
				if ($("#downloadsContainer").length) {
					$("#downloadsContainer").mCustomScrollbar("vertical",0,"easeOutCirc",1.25,"fixed","yes","no",0);
				}
			});
		}
	});
	
	// Centering of downloads box on scroll and resize:
	if ($("#detailDownloadOverlay").length) {
		$(window).bind("resize scroll", function() {
			$("#detailDownloadOverlay").center();
		});
	}
	
	/*
	 * Mailing sign up overlay
	 */	
	// Needed for the "styled" select box:
	$("#connect-with-us .connectWithUs-signup").click(function(event) {
		event.preventDefault();
		$('#detailSiteMask').css('opacity', 0.50);
		$('#detailSiteMask').fadeIn("fast");
		$("#detailSignUpOverlay").slideDown('300');
	});

	var close1 = $("#detailSignUpOverlay #mailingSignUpOverlay-header-close");
	var close2 = $("#detailSignUpOverlay #mailingSignUpOverlay-form-cancel");
	var closeElements = close1.add(close2);
	
	$(closeElements).click(function(event) {
		event.preventDefault();
		$("#detailSiteMask").fadeOut("fast");
		$("#detailSignUpOverlay").slideUp("300");
	});
	
	$("#detailSignUpOverlay .detailMailingSignUpSelectOptions").click(function() {
		if ($("select#detailMailingListSport").length) {
			$("select#detailMailingListSport").attr("size", 8);
			$("select#detailMailingListSport").addClass("optionOpen");
		}
	});
	
	// Hide the mailing list dropdown if clicking anywhere outside the mailingSignUpSelectOptions div:
	$("body").click(function(event) {
		var $target = $(event.target);
		if (!$target.hasClass("detailMailingSignUpSelectOptions")) {
			$("select#detailMailingListSport").removeClass("optionOpen");
			$("select#detailMailingListSport").attr("size", 1);	
		}
    });
	
	$("#detailSignUpOverlay #id").click(function() {
		if ($(this).val() == "Enter Email") {
			$(this).attr("value", "");
			$(this).addClass("active");
		}
	});
	
	// Fix for dual signup forms sharing the same ID:
	$("#sportsFooter #footerMailingListSignUpForm #mailingListEmailAddress-element input").bind("keyup blur", function() {		
		// Copy over E-mail value:
		$("#mailingSignUpOverlay-form #id").val($("#sportsFooter #mailingListEmailAddress-element input").val());		
	});
	$("#sportsFooter #footerMailingListSignUpForm #mailingListEmailAddress-element input").keypress(function(event) {
		if (event != undefined && event.keyCode == "13") {
			event.preventDefault ? event.preventDefault() : event.returnValue = false;			
		}
	});
	$("#sportsFooter #footerMailingListSignUpForm #footerMailingListSport").change(function() {		
		// Copy over Sport value:
		$("#mailingSignUpOverlay-form #detailMailingSignUpSelectValue").text($("#sportsFooter #footerMailingSignUpSelectValue").text());
		$("#mailingSignUpOverlay-form #detailMailingListSport").val($("#sportsFooter #footerMailingListSignUpForm #footerMailingListSport").val());
	});		
		
	// Validation and submission if no errors:
	$("#detailSignUpOverlay #detailMailingListSubmitButton").click(function(event) {
		event.preventDefault();
		
		var hasError = false;
		$("#detailSignUpOverlay ul.errors").remove();
		
		$("#detailSignUpOverlay .detailMailingRequired").each(function() {
			if ($(this).hasClass("detailMailingEmail")){
				if (($(this).val() == '') || ($(this).val() == "Enter Email") || !validateEmail($(this).val())) {
					$(this).after('<ul class="errors"><li>Please enter a valid email address</li></ul>');
					hasError = true;
				} 		
			} else {
				if ($(this).val() == '') {
					$(this).after('<ul class="errors"><li>Please choose a mailing list</li></ul>');
					hasError = true;
				}
			}	
		});
		
		if (!hasError) {
			 var email = $("#detailSignUpOverlay #id").val();
 			 var sport = $("#detailSignUpOverlay #detailMailingListSport").val();
 			 
 			 var minutes = 0.5;
 			 var date = new Date();
 	         date.setTime(date.getTime()+(minutes*60*1000));
 	         var expires = "; expires="+date.toGMTString();
 	         var domain = "; domain = .go.com ";
 	         var path = "; path=/ ";

 	         // Using cookies to pass data for mailing sign up selection as ELM uses success URL redirect, no POST data:
 			document.cookie = "MailingEmail = " + email + expires + path + domain;
 			document.cookie = "MailingSport = " + sport + expires + path + domain;
 
 			$("#detailSignUpOverlay #detailMailingListSignUpForm").submit();
		}
	});
	
	// ELM configuration based on the sport chosen:
	$("#detailSignUpOverlay #detailMailingListSport").change(function(event) {
		configureForElm($(this).val());
	});
	
	/*
	 * Analytics
	 */	
	// Overview, planning tools, and results general links:
	$("#shareEventContainer a, #event-left-col-left-promos a, #event-right-col-right a, .printAll:eq(0), #event-year-buttons a, .event-promo-cta").live("click", function(event) {		
		var sport = s_wdpro.hier1.split("/")[6];
		var eventName = s_wdpro.hier1.split("/")[7];
		var pageType = s_wdpro.pageName.split("/")[8];
		var description = $(this).hasClass("printAll") ? $.trim($(".printText").eq(0).text()).replace(/ /g,"_")
													   : $.trim($(this).text()).replace(/ /g,"_");		
		var identifier = "ESPNWWOS_Events_" + sport + "_" + eventName + "_" + pageType + "_" + description;

		s_wdpro.trackClick(this, identifier);
		//alert("1: " + identifier);
		
		// Sign up and downloads link are special cases which shall do a redirect (since it links to a modal box):
		if ($(this).is("a") && !$(this).is("a[target=_blank]") && !$(this).hasClass("connectWithUs-signup") && !$(this).hasClass("connectWithUs-downloads") && !$(this).hasClass("left-promo-link")) {
			event.preventDefault();
			window.location.href = $(this).attr("href");
		}		
	});
	
	// Overview, planning tools, and results "shutter" tabs:
	$("#event-right-col-right .moduleHeader.accordionButton").click(function() {
		var sport = s_wdpro.hier1.split("/")[6];
		var eventName = s_wdpro.hier1.split("/")[7];
		var pageType = s_wdpro.pageName.split("/")[8];		
		var description = $(this).parent().attr("id").replace(/ /g,"_");		
		
		// Extra conditional assures that only user clicks are tracked (not programmatically triggered clicks):
		if (($(this).hasClass("active") && $(this).next().is(":visible")) || !$(this).hasClass("active")) {
			$(this).hasClass("active") ? description += "_close" : description += "_open";
			
			var identifier = "ESPNWWOS_Events_" + sport + "_" + eventName + "_" + pageType + "_" + description;
			
			s_wdpro.trackClick(this, identifier);
			//alert("2: " + identifier);	
		}
	});
	
	// Planning tools roles and search tracking (radio buttons):
	$("#contentFilterContainer input").click(function() {
		var sport = s_wdpro.hier1.split("/")[6];
		var eventName = s_wdpro.hier1.split("/")[7];
		var category = "";
		var description = $(this).next().text().replace(/ /g,"_");
		var radioButtonGroup = $(this).parent().attr("id"); // Either filterCriteriaHolder1, ...2, or ...3		
		
		switch (radioButtonGroup) {
			case "filterCriteriaHolder1":
				category = "Roles";
				break;
			case "filterCriteriaHolder2":
				category = "Search";
				break;
			case "filterCriteriaHolder3":
				category = "Show_All";
				break;				
		}
		
		var identifier = "ESPNWWOS_Events_" + sport + "_" + eventName + "_Tools_" + category + "_" + description;
		
		s_wdpro.trackClick(this, identifier);
		//alert("3: " + identifier);
	});
	
	// Planning tools tabs tracking:	
	$("#eventDetailContents .accordionButton").live("click", function() {
		var sport = s_wdpro.hier1.split("/")[6];
		var eventName = s_wdpro.hier1.split("/")[7];
		var description = $(this).text().replace(/ /g,"_");
		
		$(this).hasClass("active") ? description += "_open" : description += "_close";
		
		var identifier = "ESPNWWOS_Events_" + sport + "_" + eventName + "_Tools_Tabs_" + description;		
		s_wdpro.trackClick(this, identifier);
		
		var pageId = $(this).text().replace(/detail-/gi,"").replace(/-/gi,"").replace(/ /g,"");
		
		// Only fire trackpage on open
		$(this).hasClass("active") ? s_wdpro.trackPage("planningtools/" + pageId, "", identifier) : "";
		
		//alert("4: " + identifier);
	});
		
	//INITIALIZATION
	
	// Mailing sign up overlay:
	if ($("#detailMailingSignUpSelectValue").length) {	
		$("#detailMailingSignUpSelectValue").html("Choose a sport");
	}

	/*
	 * Accordions
	 */
	// Check if the URL has a hash value specified requesting to be taken to a specific section of the page: 
	if (window.location.hash) {
		findAnchor(window.location.hash.substr(1));
	}
	
	// Open up the active shutter tab (on the right):
	$("#event-right-col-right .accordionButton.active").next().slideDown(400);
	
	/*
	 * Chatter
	 */	
	//Pull content from Facebook and Twitter feeds:
	loadFBTwitterFeeds();
	
	// IE8 and below fixes:
	if ($.browser.msie && parseInt($.browser.version) <= 8) {
		//Negative margin fix for promo carousel:
		$("#event-promos").attr("style", "margin-top: 3px !important;");
	}	
	
	// IE7 only fixes:
	if ($.browser.msie && parseInt($.browser.version) == 7) {
		$("#mailingSignUpOverlay-form #id").attr("style", "top: -4px;");
	}   
	
	/* 
	 * Replacing date found between square brackets e.g. [1/1/2012] with 
	 * the difference between date found and date today in days. If zero, 
	 * hide reminder bar.
	 */
	if ($(".event-reminder-bars .reminderBarTitle").length){
		$(".event-reminder-bars .reminderBarTitle").each(function() {
			var $reminderBar = $(this);
			var reminderBar = $reminderBar.html();			
	
			if (reminderBar != "") {	
				var matches = reminderBar.match(/\[(.*?)\]/);
			}		
	
			if (matches) {
			    var submatch = matches[1];	
			    var dateArray = submatch.split("/");	
				var compareDate = new Date();	
				compareDate.setFullYear(dateArray[2], dateArray[0] - 1, dateArray[1]);	
				var today = new Date();
				var diff = new Date(compareDate - today);	
				var numberOfDays = Math.round(diff/1000/60/60/24);
	
				if (numberOfDays > 0) {	
					reminderBar = reminderBar.replace(matches[0], numberOfDays);
					
					if (numberOfDays == 1) {
						reminderBar = reminderBar.replace("1 days", "1 day");
					}
					
					$reminderBar.html(reminderBar);					
				} else {	
					$reminderBar.parents(".event-reminder-bars").hide();	
				}
			}	
		});
	}
	
	//Vertically center reminder bar buttons:
	$(".reminderBarContent").each(function() {
		$(".reminderBarButtons", $(this)).css("top",($(this).height()/2)-13);
	});
	
	//For the share module, set the e-mail subject based on the current event's name:
	var shareEmailSubject = "ESPNWWOS: " + unescape(escape($("h1").text().replace(" & ", " and ")).replace("%AE", ""));
	var shareEmailValue = "mailto: ?subject=" + shareEmailSubject + $("#shareEmailLogo").attr("href");
	$("#shareEmailLogo").attr("href", shareEmailValue);
});

// FUNCTIONS

function accordionClickHandler($element) {
	var accordionType = "";
	
	// Determine if the clicked element is level 1 or level 3:
	if ($element.next().hasClass("accordionContent")) {
		accordionType = "accordionContent";
	}
	else if ($element.next().hasClass("detailItemContent")) {
		accordionType = "detailItemContent";
	}
	
	var $currentEl = $element;
	var $nextEl = $element.next();
	var $grandParentEl = $currentEl.parent().parent();
	
	if ($currentEl.hasClass("active")){
		$currentEl.removeClass("active");
		$nextEl.removeClass("active");
		$nextEl.slideUp(400);
	}
	else {
		var $currentlyActiveEl = $("." + accordionType + ".active", $grandParentEl);
		
		if ($currentlyActiveEl.length && accordionType == "accordionContent") {
			$currentlyActiveEl.removeClass("active");
			$currentlyActiveEl.prev().removeClass("active");
			$currentEl.addClass("active");
			$nextEl.addClass("active");		
			$currentlyActiveEl.slideUp(400, function() {		
				$nextEl.slideDown(400);
			});
		}
		else {
			$currentEl.addClass("active");
			$nextEl.addClass("active");				
			$nextEl.slideDown(400);
		}
	}
}

function findAnchor(targetAnchorPath) {
	var targetAnchorPath = targetAnchorPath;
	var targetAnchorLevels = targetAnchorPath.split("_");
	var targetAnchorDepth = targetAnchorLevels.length;
	var level1ID = "#" + targetAnchorLevels[0];
	var $level1Element = $("#eventDetailContents " + level1ID + ".accordionButton");
	var level3ID = "#" + targetAnchorPath;
	var $level3Element = $("#eventDetailContents " + level3ID + ".detailItemTitle");
	var timeDelay = 0;
	
	if (targetAnchorDepth == 1) {
		timeDelay += 400;
		accordionClickHandler($level1Element);
		
		// Go to the target:
		setTimeout(function() {
			goToAnchor(targetAnchorPath);
		}, timeDelay);
	}
	else {
		if (targetAnchorDepth == 2) {
			// If the proper level 1 accordion isn't already open, open it:
			if (!$level1Element.hasClass("active")) {
				timeDelay += 500;
				accordionClickHandler($level1Element);									
			}
			
			// Go to the target (which should now be visible):
			setTimeout(function() {
				goToAnchor(targetAnchorPath);
			}, timeDelay);
		}
		else if (targetAnchorDepth == 3) {
			// If the proper level 1 accordion isn't already open, open it:
			if (!$level1Element.hasClass("active")) {
				timeDelay += 400;
				accordionClickHandler($level1Element);					
			}					
			
			// If the proper level 3 accordion isn't already open, open it:
			if (!$level3Element.hasClass("active")) {
				timeDelay += 400;
				setTimeout(function() {
					accordionClickHandler($level3Element);
				}, timeDelay);
			}
			
			// Go to the target (which should now be visible):
			timeDelay += 400;
			setTimeout(function() {
				goToAnchor(targetAnchorPath);
			}, timeDelay);
		}
	}
}

function goToAnchor(targetAnchorPath) {		
	$targetElement = $("#" + targetAnchorPath);
	
	// Do scroll animation
	if ($targetElement.length) {
		$("html, body").animate({
			scrollTop: $targetElement.offset().top
		}, 400);
	}
}

/*
 * Email validation
 */
function validateEmail(email) { 
	var emailRegEx = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
    return emailRegEx.test(email);
}

/*
 * ELM confguration, used for mailing sign up
 */
function configureForElm(value) {
	 switch(value) {
 		case "Baseball":
 			$("#detailSignUpOverlay #detailMailingSignUpSelectValue").html("Disney Baseball");
 			$("#detailSignUpOverlay #list").val("3491");
 			break;
 		case "FieldHockey":
 			$("#detailSignUpOverlay #detailMailingSignUpSelectValue").html("Disney Field Hockey");
 			$("#detailSignUpOverlay #list").val("2941");
 			break;
 		case "SpringTraining":
 			$("#detailSignUpOverlay #detailMailingSignUpSelectValue").html("Disney Spring Training");
 			$("#detailSignUpOverlay #list").val("2271");
 			break;
 		case "SlowpitchSoftball":
 			$("#detailSignUpOverlay #detailMailingSignUpSelectValue").html("Disney Slowpitch Softball");
 			$("#detailSignUpOverlay #list").val("3688");
 			break;
 		case "Soccer":
 			$("#detailSignUpOverlay #detailMailingSignUpSelectValue").html("Disney Soccer");
 			$("#detailSignUpOverlay #list").val("4212");
 			break;
 		case "TrackAndField":
 			$("#detailSignUpOverlay #detailMailingSignUpSelectValue").html("Disney Track & Field");
 			$("#detailSignUpOverlay #list").val("3536");
 			break;
 		case "CrossCountry":
 			$("#detailSignUpOverlay #detailMailingSignUpSelectValue").html("Disney Cross Country");
 			$("#detailSignUpOverlay #list").val("3872");
 			break;
 		case "BravesSpringTraining":
 			$("#detailSignUpOverlay #detailMailingSignUpSelectValue").html("Atlanta Braves Spring Training");
 			$("#detailSignUpOverlay #list").val("6031");
 			break;
 		case "Volunteer":
 			$("#detailSignUpOverlay #detailMailingSignUpSelectValue").html("Volunteer");
 			$("#detailSignUpOverlay #list").val("2933");
 			break;
 		case "runDisney":
 			$("#detailSignUpOverlay #detailMailingSignUpSelectValue").html("runDisney");
 			$("#detailSignUpOverlay #list").val("2692");
 			break;	   
 		default:
 			$("#detailSignUpOverlay #detailMailingSignUpSelectValue").html("Choose a sport");
			$("#detailSignUpOverlay #list").val("");
			$("#detailSignUpOverlay #folder").val("");
	 }
}

function loadFBTwitterFeeds() {
	//Grab Facebook posts, then internal callback will grab Twitter posts:
	fetchFacebookFeed();
}

function fetchFacebookFeed() {
	//Get Facebook page set for the current event from the CMS:
	var cmsFacebookPage = $("#facebookPage").text();
    var url = "https://graph.facebook.com/" + cmsFacebookPage + "/feed?access_token=AAACEdEose0cBAGwI1svLv6As1qUREkvCUeuYlcKbOASQZCY5SWwwiqHaBl9KnpLjYOVoVZCqOE6FRXZBKO8e6kH48GeZB3UZD&callback=?";
    
	$.getJSON(url, function(json) {
		var postIndex = 0;

		if (json.data != undefined) {
			$.each(json.data, function(i, fb) {			
				if (fb.message != undefined) {
					var message = fb.message;
					var fromUser = fb.from.name;
					var fromUserID = fb.from.id;
					var created = fb.created_time;				
					var createdDate = created.split("T")[0];
						var createdYear = createdDate.split("-")[0];
						var createdMonth = createdDate.split("-")[1];
						var createdDay = createdDate.split("-")[2];
					var createdTime = created.split("T")[1].substr(0,8);
						var createdHour = createdTime.split(":")[0];
						var createdMinute = createdTime.split(":")[1];
						var createdSecond = createdTime.split(":")[2];
					var dateObject = new Date(createdYear, createdMonth - 1, createdDay, createdHour, createdMinute, createdSecond);
	
					EventDetailsObj.allPosts[postIndex] = Number(dateObject) + "*_*Facebook*_*" + message + "*_*" + fromUser + "*_*" + fromUserID;				
					postIndex++;
				}
			});
		}
		
		//Grab Twitter posts:
		fetchTwitterFeed();
	}).error(function() {
		//If for some reason Facebook posts could not be retrieved, carry on to grabbing Twitter posts:
		fetchTwitterFeed();		
	});
}

function fetchTwitterFeed() {
	//Get hash tag set for the current event from the CMS:
	var cmsHash = $("#hashtag").text();
	var url = "http://search.twitter.com/search.json?q=" + escape(cmsHash) + "&include_entities=true?callback=?";

	var monthsList = {"Jan":"01","Feb":"02","Mar":"03","Apr":"04","May":"05","Jun":"06","Jul":"07","Aug":"08","Sep":"09","Oct":"10","Nov":"11","Dec":"12"};

	$.getJSON(url, function(json) {
		var postIndex = EventDetailsObj.allPosts.length;
		
		if (json.results != undefined) {
			$.each(json.results, function(i, tw) {
				var message = tw.text;
				var fromUser = tw.from_user;
				var created = tw.created_at;
				var createdYear = created.split(" ")[3];
				var createdMonth = monthsList[created.split(" ")[2]];
				var createdDay = created.split(" ")[1];
				var createdTime = created.split(" ")[4];
					var createdHour = createdTime.split(":")[0];
					var createdMinute = createdTime.split(":")[1];
					var createdSecond = createdTime.split(":")[2];
				var dateObject = new Date(createdYear, createdMonth - 1, createdDay, createdHour, createdMinute, createdSecond);
				
				if (isClean(message) && isClean(fromUser)) {
					EventDetailsObj.allPosts[postIndex] = Number(dateObject) + "*_*Twitter*_*" + message + "*_*" + fromUser;
					postIndex++;
				}
			});
		}
		//Load all post HTML:
		loadPosts();
	}).error(function() {
		//If for some reason Twitter posts could not be retrieved, carry on to loading all previously grabbed posts (if any):
		loadPosts();		
	});
}

function loadPosts() {
	//Remove the preloader:
	$("#chatterLoadingImage").hide();
	
	if (EventDetailsObj.allPosts.length > 0) {		
		//Sort the posts by date/time (latest first):
		EventDetailsObj.allPosts.sort();
		EventDetailsObj.allPosts.reverse();		
		
		for (var post in EventDetailsObj.allPosts) {
			var postPieces = EventDetailsObj.allPosts[post].split("*_*");
			var postDate = new Date(Number(postPieces[0]));
			var postType = postPieces[1];
			var postHeader = "";
			var postMessage = postPieces[2];
			var fromUser = postPieces[3];
			var fromUserID = postPieces[4];
			
			if (postType == "Facebook") {
				postType = '<a href="http://www.facebook.com/events/' + $("#facebookPage").text() + '/">Facebook</a>';
				postHeader = '<a href="http://www.facebook.com/' + fromUserID + '">' + fromUser + '</a>';
			}
			else if (postType == "Twitter") {
				postType = '<a href="https://twitter.com/#!/search?q=' + escape($("#hashtag").text()) + '">Twitter</a>';
				postHeader = '<a href="https://twitter.com/#!/' + fromUser + '">' + fromUser + '</a>';
			}		
			
			var postHTML = '<div class="moduleItem">';
			postHTML += '<div class="itemHeader">' + postHeader + '</div>';
			postHTML += '<div class="itemPost">' + postMessage + '</div>';
			postHTML += '<div class="itemTime">' + prettyDate(ISODateString(postDate), postDate) + ' via ' + postType + '</div>';
			postHTML += '</div>';
					
			$("#facebookTwitterPosts").append(postHTML);
		}
		
		//Animate posts:
		animatePosts();	
	}
	else {
		//Display CMS-based default chatter text:
		$(".defaultChatterText").fadeIn(600);
	}
}

function animatePosts() {
	var postCount = EventDetailsObj.allPosts.length;
	
	//Display 5 of the latest posts:
	if (postCount >= 5) {
		$("#facebookTwitterPosts .moduleItem").slice(5).remove();
	}
	
	//Prepare the posts to be animated:
	$("#facebookTwitterPosts .moduleItem").last().addClass("last");	
	$("#facebookTwitterPosts .moduleItem").hide().addClass("hiddenPost");	
	
	if ($("#facebookTwitterPosts .moduleItem").length) {
		fadeInPosts(5);
	}
}

function fadeInPosts(numberOfPosts) {
	if (!$("#facebookTwitterPosts .moduleItem.hiddenPost").length) {
		clearInterval(EventDetailsObj.postFadeInTimer);
	}
	else {
		var startPositionOffset = ($("#facebookTwitterPosts .moduleItem.hiddenPost").length - numberOfPosts < 0) ? 0 
								: $("#facebookTwitterPosts .moduleItem.hiddenPost").length - numberOfPosts;
		$("#facebookTwitterPosts .moduleItem.hiddenPost").slice(startPositionOffset).fadeIn(1200).removeClass("hiddenPost");
	}
}

// Converts a date object to ISO-8601 format:
function ISODateString(d) {
	//Adjust timezone offset:
	var localOffset = d.getTimezoneOffset() / 60;
	d.setUTCHours(d.getUTCHours() - localOffset);
	
    function pad(n){
        return n < 10 ? '0' + n : n;
    }
    
    return d.getUTCFullYear()+'-'
    + pad(d.getUTCMonth()+1)+'-'
    + pad(d.getUTCDate())+'T'
    + pad(d.getUTCHours())+':'
    + pad(d.getUTCMinutes())+':'
    + pad(d.getUTCSeconds())+'Z'
}

// Takes an ISO time and returns a string representing how long ago the date occured:
function prettyDate(time, d){
	//Adjust timezone offset:
	var localOffset = d.getTimezoneOffset() / 60;
	var date = new Date((time || "").replace(/-/g,"/").replace(/[TZ]/g," "));	
	date.setUTCHours(date.getUTCHours() - localOffset);

	var diff = (((new Date()).getTime() - date.getTime()) / 1000),
		day_diff = Math.floor(diff / 86400);
			
	if ( isNaN(day_diff) || day_diff < 0 || day_diff >= 31 )
		return;
			
	return day_diff == 0 && (
			diff < 60 && "Just now" ||
			diff < 120 && "1 minute ago" ||
			diff < 3600 && Math.floor( diff / 60 ) + " minutes ago" ||
			diff < 7200 && "1 hour ago" ||
			diff < 86400 && Math.floor( diff / 3600 ) + " hours ago") ||
		day_diff == 1 && "Yesterday" ||
		day_diff < 7 && day_diff + " days ago" ||
		day_diff < 31 && Math.ceil( day_diff / 7 ) + " weeks ago";
}

// Set first download container to active:
function setFirstDownloadContainerActive() {
	if ($("#detailDownloadOverlay .content").length) {
		var numDownloadContainers = $("#detailDownloadOverlay .content").children("div");
		
		if (numDownloadContainers.length) {
			numDownloadContainers.first().show();
			if (numDownloadContainers.first().attr("id") !== undefined) {
				var downloadItem = (numDownloadContainers.first().attr("id")).replace("Container","");
				
				// Set first header active
				if ($('a.downloadHeaderItem[name=\"' + downloadItem + '\"]').length) {
					$('a.downloadHeaderItem[name=\"' + downloadItem + '\"]').addClass("active");
				};
			}
		}
	}
}

// Hide all download containers
function hideAllDownloadContainers() {
	if ($("#detailDownloadOverlay .content").length) {
		var numDownloadContainers = $("#detailDownloadOverlay .content").children("div");
		
		if (numDownloadContainers.length) {
			$("#detailDownloadOverlay .downloadHeaderItem").removeClass("active");
			numDownloadContainers.hide();
		}
	}
}

// Centers a DIV (horizontally and vertically)
jQuery.fn.center = function () {
	this.css("position","absolute");
	this.css("top", ((($(window).height() - this.outerHeight()) / 2) + $(window).scrollTop()) - 45 + "px");
	
	return this;
}

