/**
 * Scroller
 **/

(function($){

	var config;

	$.fn.scroller = function(options) {

		// Build config
		config = $.extend({}, $.fn.scroller.defaults, options);

		$(this).data('scrollerPaused', false);

		$(this).hover(
			function() {
				$(this).data('scrollerPaused', true);
			},
			function() {
				$(this).data('scrollerPaused', false);
				$(this).scroller.gracefulStart(this);
			}
		);

		// Start scroller
		return this.each(function() {
			$(this).scroller.initialize(this);
			$(this).scroller.start(this);
		});
	};

	$.fn.scroller.gracefulStart = function(target) {
		if ($(target).data('scrollerIntervalID') == undefined) {
			$(target).scroller.start(target);
			$(target).scroller.scroll(target);
		}
	}

	$.fn.scroller.start = function(target) {
		scrollerIntervalID = setInterval(function(){ $(target).scroller.scroll(target); }, config.delay);
		$(target).data('scrollerIntervalID', scrollerIntervalID);
	}

	$.fn.scroller.stop = function(target) {
		clearInterval($(target).data('scrollerIntervalID'));
		$(target).removeData('scrollerIntervalID');
	}

	$.fn.scroller.initialize = function(target) {
		$(target).css('overflow-y', 'hidden');
		$(target).css('position', 'relative');
		$(target).children().css('position', 'absolute');
		var count = $.fn.scroller.getSet(target, 0);
		$.fn.scroller.hide(target, count);
		$.fn.scroller.order(target, count, 0);
	};

	$.fn.scroller.scroll = function(target) {
		if ($(target).data('scrollerPaused') == true) {
			$.fn.scroller.stop(target);
			return false;
		}
		var scrollAreaHeight = $(target).height();
		var count = $(target).children().size();
		var current = $.fn.scroller.getSet(target, 0);
		var next = $.fn.scroller.getSet(target, current);
		$.fn.scroller.order(target, next, current);
		var total = current + next;
		$(target).children().slice(0, current).animate(
			{ top: "-=" + $(target).height() + "px"},
			"slow",
			'',
			function() {
				$(this).css('top', $(target).height()).appendTo(target);
			}
		);
		$(target).children().slice(current, current + next).animate(
			{ top: "-=" + $(target).height() + "px"},
			"slow"
		);
	};

	$.fn.scroller.hide = function(target, offset) {
		for (var i = 0 + offset; i < $(target).children().size(); i++) {
			$(target).children().eq(i).css('top', $(target).height());
		}
	}

	$.fn.scroller.order = function(target, count, offset) {
		var position = $(target).children().eq(offset).position();
		var top = position.top;
		for (var i = 0 + offset; i < (count + offset); i++) {
			$(target).children().eq(i).css('top', top);
			top += $(target).children().eq(i).outerHeight(true);
		}
	}

	$.fn.scroller.reposition = function(target, count) {
		for (var i = 0; i < count; i++) {
			$(target).children().eq(i).appendTo(target);
		}
	}

	$.fn.scroller.getSet = function(target, offset) {
		var count = 0;
		var itemHeight = 0;
		for (var i = 0 + offset; i < $(target).children().size(); i++) {
			itemHeight = itemHeight + $(target).children().eq(i).outerHeight(true);
			if (itemHeight > $(target).height())
				break;
			count++;
		}
		return count;
	}

	$.fn.scroller.defaults = {
		delay: 6000
	};

})(jQuery);