(function($) {
	
	jQuery.fn.contentScroller = function(options) {
		
		var defaults = {
		  	container: this,
			scrollContent: null,
			controls: null,
			speed: 1,
			adjustHeight: false,
			action: 'click'
		},
		
		settings = $.extend({}, defaults, options);
		
		if (settings.scrollContent == null)
			alert("Content Scroller plugin error: You must specify a content div.");

		if (settings.controls == null)
			alert("Content Scroller plugin error: You must specify a controls div.");
		
		setDimensions(this,settings.scrollContent,settings.controls);

		$(settings.controls + ' a.scrollUp').click(function() {
			return false;
		});

		$(settings.controls + ' a.scrollDown').click(function() {
			return false;
		});
	
		if (settings.action == "click") {
			$(settings.controls + ' a.scrollDown').mousedown(
				function() {
					if (hidden > 0) {
						var current = isNaN(contentTop(settings.scrollContent)) ? 0 : contentTop(settings.scrollContent);
						$(settings.scrollContent).animate({ top: -hidden }, Math.abs(current - hidden) * settings.speed);
					}
				}).mouseup(
				function() {
					$(settings.scrollContent).stop();
				}
			);
		
			$(settings.controls + ' a.scrollUp').mousedown(
				function() {
					if (hidden > 0) {
						var current = contentTop(settings.scrollContent);
						$(settings.scrollContent).animate({ top: "0" }, Math.abs(current) * settings.speed);
					}
				}).mouseup(
				function() {
					$(settings.scrollContent).stop();
				}
			);
		}
	
		else if (settings.action == "hover") {
			$('a.scrollDown').hover(
				function() {
					if (hidden > 0) {
						var current = isNaN(contentTop(settings.scrollContent)) ? 0 : contentTop(settings.scrollContent);
						$(settings.scrollContent).animate({ top: -hidden }, Math.abs(current - hidden) * settings.speed);
					}
				},
				function() {
					$(settings.scrollContent).stop();
				}
			);

			$(settings.controls + ' a.scrollUp').hover(
				function() {
					if (hidden > 0) {
						var current = contentTop(settings.scrollContent);
						$(settings.scrollContent).animate({ top: "0" }, Math.abs(current) * settings.speed);
					}
				},
				function() {
					$(settings.scrollContent).stop();
				}
			);
		}
		
		var container;
		var content;
		var hidden;

		function contentTop(scrollContent) {
			var top = $(scrollContent).css('top');
			return removePx(top);
		}

		function elementHeight(id) {
			var height = $(id).height();
			var paddingTop = removePx($(id).css("padding-top"));
			var paddingBottom = removePx($(id).css("padding-bottom"));

			return height + paddingTop + paddingBottom;
		}

		function removePx(value) {
			var pos = value.indexOf("px");
			if (pos != 0)
				return parseInt(value.substring(0, pos));
			else
				return 0;
		}

		function setDimensions(scrollContainer,scrollContent,scrollControls) {
			container = elementHeight($(scrollContainer));
			content = elementHeight($(scrollContent));
			hidden = content - container;
			if (hidden < 0) {
				$(scrollControls).hide();
				if (settings.adjustHeight)
					$(scrollContainer).height(content);
			}
		}
		  
		return this;
	}
	
})(jQuery);

