

(function($) {
    $.fn.extend({
        textScroller: function(options) {
			
			var defaults = {
    			 duration :       1000,			
    			 scrollId :       'scrollPane', 
    			 backButtonId :   'backButton',    
    			 nextButtonId :   'nextButton', 
    			 scrollValue :    100,
    			 easingType :     'easeOutElastic'           
    		};

			
			var options = $.extend(defaults, options);
			
			return this.each(function() { 
				var obj = $(this);
				var op  = options;
				var parentOffset = obj.offset();
				var scrollOffset = $('#' + op.scrollId).offset();
				var parentInfo   = {widthVal: obj.width(), heightVal: obj.height(), leftVal: parentOffset.left, topVal: parentOffset.top};
				var scrollInfo   = {widthVal: $('#' + op.scrollId).width(), heightVal: $('#' + op.scrollId).height(), leftVal: scrollOffset.left, topVal: scrollOffset.top};
				
				$('#' + op.backButtonId).hide();
				
				if (scrollInfo.heightVal <= parentInfo.heightVal) {
					$('#' + op.nextButtonId).hide();
				} else {
					$('#' + op.nextButtonId).show();
				} 
				
				$('#' + op.nextButtonId).click(function() {
					obj.scrollForward(op, obj);
				});
				
				$('#' + op.backButtonId).click(function() {
					obj.scrollBack(op, obj);
				});
			})
        }
    });
    
    /**
     * scroll forward
     */
    $.fn.scrollForward = function(op, obj) 
    {
    	$('#' + op.scrollId).stop();
    	$('#' + op.backButtonId).show();
    	var parentOffset = obj.offset();
    	var scrollOffset = $('#' + op.scrollId).offset();
    	var scrollValue  = op.scrollValue;
    	var hideButton   = false;
    	
    	if (scrollOffset.top - op.scrollValue < (parentOffset.top - $('#' + op.scrollId).height()) + obj.height()) {
    		scrollValue = scrollOffset.top - ((parentOffset.top - $('#' + op.scrollId).height()) + obj.height());
    		hideButton = true;
    	}
    	
    	$('#' + op.scrollId).animate({
    		top: '-=' + scrollValue
    	}, {
			duration: op.duration,
			easing: op.easingType
		});
    	
    	if (hideButton) {
    		$('#' + op.nextButtonId).hide();
    	}
    }
    
    /**
     * scroll back
     */
    $.fn.scrollBack = function(op, obj) 
    {
    	$('#' + op.scrollId).stop();
    	$('#' + op.nextButtonId).show();
    	var parentOffset = obj.offset();
    	var scrollOffset = $('#' + op.scrollId).offset();
    	var scrollValue  = op.scrollValue;
    	var hideButton   = false;
    	
    	if (scrollOffset.top + op.scrollValue > parentOffset.top) {
    		scrollValue = parentOffset.top - scrollOffset.top;
    		hideButton = true;
    	} else if (scrollOffset.top + op.scrollValue == parentOffset.top) {
    		hideButton = true;
    	}
    	
    	
    	$('#' + op.scrollId).animate({
    		top: '+=' + scrollValue
    	}, {
			duration: op.duration,
			easing: op.easingType
		});
    	
    	if (hideButton) {
    		$('#' + op.backButtonId).hide();
    	}
    }
	
})(jQuery);



