(function($){
	function getStops(outer, inner) {
		total = Math.ceil(outer/inner);
		s = [0];
		for (var i = total - 1; i >= 0; i--){
	 		s[s.length] = s[s.length - 1] - inner;
		};
		return s;
	};

	function downTo(currentPos, stopsArray) {
		for (var i=0; i < stopsArray.length - 1; i++) {
			if ((stopsArray[i] >= currentPos) && (stopsArray[i+1] < currentPos)) {
				if	( i + 1 != stopsArray.length - 1 ) {
					return stopsArray[i+1];
				} else {
					return false;
				};
			};
		};
	};

	function upTo(currentPos, stopsArray) {
		for (var i=0; i < stopsArray.length - 1; i++) {
			if ((stopsArray[i] >= currentPos) && (stopsArray[i+1] < currentPos)) {
				if	( i != 0 ) {
					return stopsArray[i-1];
				} else {
					return 0
				};
			};
		};
	};

	$.fn.scrollerish = function(options) {
		var defaults = {
			"upText" : "up",
			"downText" : "down",
			"gutterWidth" : "20px"
		}
		var settings = $.extend({}, defaults, options);

		return this.each(function(){
			var $this = $(this);
			$this.addClass("scrollerish-outer");
			
			thisContent = $this.html();

			var $inner = $("<div></div>");
			$inner
				.addClass("scrollerish-inner")
				.css({
					"position" : "absolute",
					"left" : "0",
					"top" : "0",
					"width" : parseInt($this.css("width")) - parseInt(settings.gutterWidth) + "px"
				})
				.html(thisContent);

			$this.html($inner);
			thisHeight = parseInt($this.css("height"));
			innerHeight = parseInt($inner.outerHeight());

			if (innerHeight > thisHeight) {
				var $upLink = $("<div></div>").addClass("scrollerish-up").html(settings.upText).wrapInner("<span></span");
				var $downLink = $("<div></div>").addClass("scrollerish-down").html(settings.downText).wrapInner("<span></span");
				var stops = getStops(innerHeight, thisHeight);

				$upLink
					.css({
					    "padding" : "0",
						"overflow" : "hidden",
						"position" : "absolute",
						"left" : "0",
						"top" : "0"
					})
					.click(function(){
						object = $(this).parent("div");
						inner = object.children(".inner");
						yPosition = upTo(parseInt($inner.css("top")), stops);
						$inner.animate({ "top" : yPosition + "px" }, "slow");
					});

				$downLink
					.css({
						"padding" : "0",
						"overflow" : "hidden",
						"position" : "absolute",
						"left" : "0",
						"bottom" : "0"
					})
					.click(function(){
						object = $(this).parent("div");
						inner = object.children(".inner");
						yPosition = downTo(parseInt($inner.css("top")), stops);
						if (yPosition) {
							$inner.animate({ "top" : yPosition + "px" }, "slow");
						};
					});

				$inner
					.css({ 
						"margin-left" : settings.gutterWidth,
						"position" : "absolute",
						"left" : "0px",
						"top" : "0px"
					})
					.before($upLink)
					.before($downLink);
			} else {
				$this.html(thisContent);
			};
		});
	};
})(jQuery);