/**
 * CJ Innerscroll - simple inner element scrolling using up/down arrows
 *
 * Copyright (c) 2011 Creative Jar
 *
 * Version 0.1
 *
 */

(function ($) {

	jQuery.fn.cjInnerScroll = function (options) {
	    options = $.extend({
	    	minHeight: '200', 
	    	transitionSpeed: '200', 
	    	movementInterval: '50'
	    }, options || {});
	
	    return this.each(function () {
	    	var oElement = $(this), 
	    	elementHeight = $(this).innerHeight(), 
	    	elementWidth = $(this).width(), 
	    	elementTitleHeight = $(this).children("h1").innerHeight(), 
	    	elementPaddingLeft = $(this).css('padding-left'), 
	    	oAnimating = false;
			
			if(elementHeight > options.minHeight) {
				$(oElement).css({ "height": options.minHeight + "px", "overflow": "hidden" });
				$(oElement).children(":not('h1')").wrapAll("<div class='inner' />");
				$(oElement).children(".inner").before("<a class='scroll-up'>Scroll up</a>").after("<a class='scroll-down'>Scroll down</a>");
				$("a.scroll-up", oElement).css({ "top" : elementTitleHeight + "px" }).fadeTo(options.transitionSpeed, .5).addClass("disabled");
				
				var innerHeight = $(".inner", oElement).height();
				var buttonHeight = $("a.scroll-down", oElement).height();
				
				$(oElement).children(".inner").css({ "position": "absolute", "left": elementPaddingLeft + "px", "top": (elementTitleHeight + buttonHeight) + "px", "width" : elementWidth + "px" });
				$("a.scroll-down, a.scroll-up", oElement).click(function() {
					if(!$(this).hasClass("disabled")) {
						var direction = $(this).attr("class").split("-");
						moveScroll(direction[1]);
					}
				});
			}
			
			function moveScroll(direction) {
				if(!oAnimating) {
					var currentTopPosition = parseInt($(".inner", oElement).css("top").replace("px", "")) * -1, 
					maxBottomPosition = options.minHeight - (buttonHeight * 2) - innerHeight + elementTitleHeight, 
					movementInterval = parseInt(options.movementInterval), 
					buttonUpDisabled = true, 
					buttonDownDisabled = false;
					oAnimating = true;

					if(direction == "up" && currentTopPosition <= elementTitleHeight) {
						var result = (elementTitleHeight + buttonHeight) + "px";
						buttonUpDisabled = true;
						buttonDownDisabled = false;
					}
					else if (direction == "up") {
						var result = "+=" + options.movementInterval;
						buttonUpDisabled = false;
						buttonDownDisabled = false;
					}
					if (direction == "down" && currentTopPosition < ((maxBottomPosition + movementInterval) * -1)) {
						var result = "-=" + options.movementInterval;
						buttonUpDisabled = false;
						buttonDownDisabled = false;
					}
					else if (direction == "down") {
						var result = maxBottomPosition + "px";
						buttonUpDisabled = false;
						buttonDownDisabled = true;
					}
					$(".inner", oElement).animate({
						top: result
					}, options.transitionSpeed, 'linear', function() {
						oAnimating = false;
						currentTopPosition = parseInt($(".inner", oElement).css("top").replace("px", ""));
						if(buttonUpDisabled == false) {
							$("a.scroll-up", oElement).fadeTo(options.transitionSpeed, 1).removeClass("disabled");
						}
						else {
							$("a.scroll-up", oElement).fadeTo(options.transitionSpeed, .5).addClass("disabled");
						}
						if(buttonDownDisabled == false) {
							$("a.scroll-down", oElement).fadeTo(options.transitionSpeed, 1).removeClass("disabled");
						}
						else {
							$("a.scroll-down", oElement).fadeTo(options.transitionSpeed, .5).addClass("disabled");
						}
					});
				}
			}
	    });
	};

})(jQuery);
