;(function($){

	$.verticalScroll = {
		defaults: {
			scrollUp: '.scroll-up',
			scrollDown: '.scroll-down',
			scrollContainer: '.vertical-scroll-container',
			scrollContent: '.vertical-scroll-content',
			scrollItems: 'div.item',
			scrollAmount: 2
		}
	};
	
	$.fn.extend({
	
		verticalScroll: function(settings) {
			settings = $.extend({}, $.verticalScroll.defaults, settings);
			return this.each(function(){
				createVerticalScroll($(this), settings);
			});
		},
		
		updateVerticalScroll: function(nHtml) {
			return this.each(function(){
				updateVerticalScroll($(this), nHtml);
			});
		}

	});

	function createVerticalScroll(container, settings) {

	//elements to variables
		container.data('settings', settings);
		elements = calculateMinMargin(container);
		
		var intMarginTop = parseInt(elements._content.css('margin-top'));
		if (intMarginTop == 0) {
			elements._up.children("a").addClass("grey");
		}
		if (intMarginTop == container.data('minMargin')) {
			elements._down.children("a").addClass("grey");
		}
		if (elements._content.height()<elements._container.height()) {
			elements._up.children("a").addClass("grey");
			elements._down.children("a").addClass("grey");
		}

		//scroll down
		elements._down.click(function(){
			elements._up.children("a").removeClass("grey");
			var mTop = parseInt(marginLowerItem(container, elements), 0);
			elements._content.stop().animate({marginTop: mTop}, 200);
			if (mTop == container.data('minMargin')) {
				elements._down.children("a").addClass("grey");
			}
			return false;
		});

		//scroll up
		elements._up.click(function(){
			elements._down.children("a").removeClass("grey");
			var mTop = parseInt(marginToHigherItem(container, elements), 0);
			elements._content.stop().animate({marginTop: mTop}, 200);
			if (mTop == 0) {
				elements._up.children("a").addClass("grey");
			}
			return false;
		});

		//mousewheel
		elements._container.mousewheel(function(e, d){
			elements._up.children("a").removeClass("grey");
			elements._down.children("a").removeClass("grey");
			marginTop = Math.max(Math.min(parseInt(elements._content.css('margin-top')) + (d*30), 0), container.data('minMargin'));
			elements._content.stop().css('margin-top', marginTop);
			if (marginTop == 0) {
				elements._up.children("a").addClass("grey");
			}else if (marginTop == container.data('minMargin')) {
				elements._down.children("a").addClass("grey");
			}
			return false;
		});

	}

	function updateVerticalScroll(container, nHtml) {
		if (nHtml) {
			container.data('elements')._content.html(nHtml);
		}
		if (container.data('elements')._content.height()<container.data('elements')._container.height()) {
			container.data('elements')._up.children("a").addClass("grey");
			container.data('elements')._down.children("a").addClass("grey");
		}
		calculateMinMargin(container);
	}

	function calculateMinMargin(container) {
		settings = container.data('settings');
		elements = {
			_up:		container.find(settings.scrollUp),
			_down:		container.find(settings.scrollDown),
			_container:	container.find(settings.scrollContainer),
			_content:	container.find(settings.scrollContent).css('margin-top', '0'),
			_items:		container.find(settings.scrollItems)
		};
		
		container.data('elements', elements);	
	
	
		containerHeight = elements._container.innerHeight();
		contentHeight = 0;
		elements._items.each(function(){
			contentHeight+=$(this).innerHeight();
		});
		containerTop = elements._container.offset().top + parseInt(elements._container.css('padding-top'));

		container.data('minMargin', 0);
		elements._items.each(function(){
			itemTop = $(this).offset().top;
			if (contentHeight - (itemTop - containerTop) < containerHeight) {
				container.data('minMargin', -(itemTop-containerTop));
				return false;
			}
		});

		return elements;	
	}

	function marginLowerItem(container, elements) {
		foundTop = false;
		ltop = 0;
		containerTop = elements._container.offset().top + parseInt(elements._container.css('padding-top'));		
		elements._items.each(function(){
			itemTop = $(this).offset().top;
			if (!foundTop && itemTop >= containerTop) {
				ltop = itemTop;
				foundTop = true;
			}
			else if (foundTop && itemTop > ltop) {
				return false;
			}
		});
		currMarginTop = parseInt(elements._content.css('margin-top'));
		marginTop = currMarginTop + containerTop - itemTop;
		return Math.max(marginTop, container.data('minMargin'));
	}

	function marginToHigherItem(container, elements) {
		foundTop = false;
		ltop = 0;
		containerTop = elements._container.offset().top + parseInt(elements._container.css('padding-top'));
		elements._items.each(function(){
			itemTop = $(this).offset().top;
			if (itemTop < containerTop) {
				ltop = itemTop;
			}
			else {
				return false;
			}
		});
		if (ltop == 0) return 0;
		return Math.min( (parseInt(elements._content.css('margin-top')) + containerTop - ltop) , 0 );
	}
})(jQuery);

$(document).ready(function(){
	$('#viral-related').verticalScroll({scrollItems: 'li'});
});
