/*
	NikeOS News Feed
	Author: Alex Heyd
*/

(function($){
		
	$.NewsFeed = function(options){
		options = $.extend({
			limit: 3
		}, options);
		
		var position = options.limit - 1;
		var animating = false;
	
		function getFirstVisible(last){
			var $elem = last;
			for (var i = 1; i < options.limit; i++) $elem = $elem.prev();
			return $elem;
		}
	
		function arrowToggle(arrow, state){
			var oldState = (state == 'on') ? 'off' : 'on';
			$('#' + arrow).removeClass(oldState).addClass(state);
		}

		// disable down arrow if nothing there to scroll to
		if(options.newsItems.length <= options.limit) {
			arrowToggle('down', 'off');
		}
		
		options.newsItems.eq(position).addClass('lastVisibleItem');
		var $firstVisible = getFirstVisible($('.lastVisibleItem'));
		$firstVisible.addClass('firstVisibleItem');

		options.container.find('.arrow').click(function(e){
			if (!animating && $(this).is('.on')) {
				var $last = $('.lastVisibleItem');
				var $first = $('.firstVisibleItem');
				var direction = ($(this).attr('id') == 'up') ? '+' : '-';

				// if at top or bottom of the list
				if ((options.newsItems.index($first) == 0 && direction == '+') ||
					(options.newsItems.index($last) == options.newsItems.size() - 1 && direction == '-')) {
					return false;
				}

				var remaining = (direction == '+') ? $first.prevAll().size() : $last.nextAll().size();
				var factor = (remaining > options.limit) ? options.limit : remaining;
				position = (direction == '+') ? position - factor : position + factor;
				var top = factor * 91;

				animating = true;
				options.list.animate(
					{
						top: direction + '=' + top + 'px'
					},
					'slow',
					'easeOutCubic',
					function(){
						$last.removeClass('lastVisibleItem');
						$first.removeClass('firstVisibleItem');
						options.newsItems.eq(position).addClass('lastVisibleItem');

						var $f = getFirstVisible($('.lastVisibleItem'));
						$f.addClass('firstVisibleItem');

						if (options.newsItems.index($f.get(0)) == 0) arrowToggle('up', 'off');
						else arrowToggle('up', 'on');
						if (position == options.newsItems.size() - 1) arrowToggle('down', 'off');
						else arrowToggle('down', 'on');

						animating = false;
					}
				);
			}
		});
	};
	
	$.extend($.easing, {
		easeOutCubic: function (x, t, b, c, d){
			return c*((t=t/d-1)*t*t + 1) + b;
		}
	});
	
})(jQuery);

