﻿{
	var ugcFeed = {
		defaults: {
			feedIntervalTime: 5000,
			feedAnimationSpeed: 1000,
			featureArrowSpeed: 1000,
			featureSlideInSpeed: 1000,
			storyFadeSpeed: 1000,
			featureTimer: 18000,
			pillarIntervalTime: 18000,
			numberOfPillars: 6,
			numberOfVisibleFeeds: 5, // 1 queued + 3 showing + 1 below
			cycleIndex: 0
		},
		
		FeedItems: null,
		VisibleFeedItems: null,
		NumberOfAnimatingItems: null,
		QueuedItem: null,
		IsFeatureVisible: false,
		PillarIndex: 0,
		StoriesXML: null,
		FeedInterval: null,
		StoryInterval: null,
		
		init: function(options) {
			this.FeedItems = jQuery("#ugcScrollContainer > ul > li");
			this.defaults = jQuery.extend({}, this.defaults, options);

			// Position feed items
			this.initFeedItemPositions(this.FeedItems);

			// Set the queued item and the set of visible items to the first feed item
			var firstFeedItem = this.FeedItems.filter(":first");
			this.QueuedItem = this.VisibleFeedItems = firstFeedItem;

			// Start the feed and story intervals
			this.startFeedInterval();
			this.startStoryInterval();
		},
		
		initFeedItemPositions: function (feedItemElems)
		{
			feedItemElems.each(function(i)
			{
				var yPosition = -jQuery(this).height();
				jQuery(this).css({ top: yPosition + "px" }).data("position", 0);
			});
		},
		
		startFeedInterval: function() {
			this.cycleFeed();
			this.FeedInterval = setInterval(this.cycleFeed, this.defaults.feedIntervalTime + this.defaults.feedAnimationSpeed);
		},
		
		startStoryInterval: function() {
			this.StoryInterval = setInterval(this.cycleStory, this.defaults.pillarIntervalTime);
		},
		
		moveBottomToTop: function(lastItem) {
			// Moves bottom feed item to queue position above feed
			var lastItemHeight = lastItem.height();
			lastItem.css({ top: -lastItemHeight + "px" });
		},
		
		cycleFeed: function() {
			if (ugcFeed.defaults.cycleIndex >= ugcFeed.FeedItems.length - 1)
			{
				clearInterval(ugcFeed.FeedInterval);
				ugcFeed.pageFeed();
			} else
			{
				ugcFeed.defaults.cycleIndex++;
				var deltaYPosition = ugcFeed.QueuedItem.height();
				var isFeatured = ugcFeed.QueuedItem.find(".isFeature").text();
				if (isFeatured != "") {
					clearInterval(ugcFeed.StoryInterval);
				}

				// Sets the number of animating items to be the number of visible feed items
				ugcFeed.NumberOfAnimatingItems = ugcFeed.VisibleFeedItems.length;

				// Moves all feed items down based on the height of the queued item
				ugcFeed.VisibleFeedItems.animate({ top: "+=" + deltaYPosition }, ugcFeed.defaults.feedAnimationSpeed, function() { ugcFeed.feedAnimationCallback(this, isFeatured); });
			}
		},
		
		feedAnimationCallback: function(item, isFeatured) {
			// Track each item's new position within the "position" data key
			jQuery(item).data("position", jQuery(item).data("position") + 1);

			// Countdown the number of animating items until it reaches 0, then ALL animations are complete
			this.NumberOfAnimatingItems--;
			if (this.NumberOfAnimatingItems === 0) {
				if (isFeatured != "" && this.IsFeatureVisible == false)
				{
					ugcFeed.updateFeature(isFeatured, ugcFeed.QueuedItem);
				}
				
				// If there is a next feed item, set the queued item to the next feed item, else start feed over at the first item
				this.QueuedItem = (this.QueuedItem.next().length) ? this.QueuedItem.next().data("position", 0) : this.FeedItems.filter(":first");
				this.VisibleFeedItems = this.VisibleFeedItems.add(this.QueuedItem);

				// Remove last list item and move it back to the top
				if (this.VisibleFeedItems.length > this.defaults.numberOfVisibleFeeds - 1) {
					this.VisibleFeedItems.each(function() {
						if (jQuery(this).data("position") == ugcFeed.defaults.numberOfVisibleFeeds) {
							var lastFeedItem = jQuery(this);
							lastFeedItem.data("position", 0);
							ugcFeed.moveBottomToTop(lastFeedItem);
							// Remove lastItem from visible feed items object
							ugcFeed.VisibleFeedItems = ugcFeed.VisibleFeedItems.filter(function(i) {
								if (this == lastFeedItem[0]) return false;
								return true;
							});
						}
					});
				}
			}
		},
		
		cycleStory: function() {
			// If feature is showing, don't cycle the story
			if (this.IsFeatureVisible) {
				return;
			}

			ugcFeed.PillarIndex++;
			if (ugcFeed.PillarIndex > ugcFeed.defaults.numberOfPillars)
			{
				ugcFeed.PillarIndex = 1;
			}
			
			jQuery.ajax({
				type: "GET",
				url: "/windows/Framework/Services/SectionedContent.ashx?contentPath=" + ugcFeed.defaults.contentPath,
				data: { sectionName: "pillar-" + ugcFeed.PillarIndex, action: "feature_tooltip" },
				dataType: "text/xml",
				success: function(data) {
					setTimeout(function() { ugcFeed.showPillar(data); }, ugcFeed.defaults.storyFadeSpeed);
				}
			});
		},
		
		showPillar: function(data) {
			var storyFeature = jQuery("#ugcStoryContainer");
			storyFeature.html(data);
		},
		
		updateFeature: function(id, featuredItem) {
			this.IsFeatureVisible = true;

			jQuery.ajax({
				type: "GET",
				url: "/windows/Framework/Services/UgcFeedContent.ashx",
				data: { 
					action: "showFeature",
					flag: id, 
					contentPath: ugcFeed.defaults.contentPath,
					configPath: ugcFeed.defaults.configPath
				},
				dataType: "text/xml",
				success: function(data) {
					setTimeout(function() { ugcFeed.showFeature(data, featuredItem); }, ugcFeed.defaults.storyFadeSpeed);
				}
			});

		},

		showFeature: function(data, featuredItem)
		{
			var storyFeature = jQuery("#ugcStoryContainer");
			storyFeature.html(data);
			featuredItem.addClass("featured").animate({ backgroundPosition: "99% center" }, this.defaults.featureArrowSpeed);
			var storyWidth = storyFeature.width();

			storyFeature.stop().css({ left: -storyWidth }).animate({ left: 0 }, this.defaults.featureSlideInSpeed);
			setTimeout(function() { ugcFeed.endFeature(); }, ugcFeed.defaults.featureTimer);
		},
		
		endFeature: function()
		{
			this.IsFeatureVisible = false;
			this.FeedItems.filter(".featured").removeClass("featured").css({ backgroundPosition: "" });
			this.startStoryInterval();
		},

		pageFeed: function()
		{
			jQuery.ajax({
				type: "GET",
				url: "/windows/Framework/Services/UgcFeedContent.ashx",
				data: {
					action: "pageFeed",
					configPath: ugcFeed.defaults.configPath,
					cursor: this.defaults.cycleIndex + 1,
					rssUrl: this.defaults.rssUrl,
					key: this.defaults.cacheKey
				},
				dataType: "text/xml",
				success: function(data)
				{
					if (data == "")
					{
						ugcFeed.defaults.cycleIndex = 0;
					} else
					{
						jQuery("#ugcScrollContainer > ul").append(data);
						ugcFeed.FeedItems = jQuery("#ugcScrollContainer > ul > li");
						ugcFeed.initFeedItemPositions(jQuery("#ugcScrollContainer > ul > li:gt(" + (ugcFeed.defaults.cycleIndex) + ")"));
					}
					ugcFeed.startFeedInterval();
				}
			});
		}
	}
}