

(function($) {
    $.fn.extend({
        textScroller: function(options) {
			
			var defaults = {
    			 direction :      'vertical',
				 duration :       1000,			
    			 scrollId :       'scrollPane', 
    			 backButtonId :   'backButton',    
    			 nextButtonId :   'nextButton', 
    			 scrollValue :    100,
    			 easingType :     'easeOutElastic',
    			 auto:            'false',      
    			 autoBuffer:      0,            
    			 stopAutoOnClick: 'true',       
    			 resetOnEnd:      'false',
    			 interSlide:      0,
    			 rollBackTime:    0
    		};

			
			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 (op.auto == 'true') {
					obj.loadHiddenButtons(obj, op);
				}
				
				if (op.direction == 'vertical') {
					if (scrollInfo.heightVal <= parentInfo.heightVal) {
						$('#' + op.nextButtonId).hide();
					} 
					
					$('#' + op.nextButtonId + ', #hidden' + op.nextButtonId).click(function() {
						obj.scrollForward(op, obj, $(this).attr('id'));
					});
					
					$('#' + op.backButtonId + ', #hidden' + op.backButtonId).click(function() {
						obj.scrollBack(op, obj, $(this).attr('id'));
					});
				} else {
					$('#' + op.scrollId).height(obj.height);
					
					if (scrollInfo.widthVal <= parentInfo.widthVal) {
						$('#' + op.nextButtonId).hide();
					} 
					
					$('#' + op.nextButtonId + ', #hidden' + op.nextButtonId).click(function() {
						obj.scrollRight(op, obj, $(this).attr('id'));
					});
					
					$('#' + op.backButtonId + ', #hidden' + op.backButtonId).click(function() {
						obj.scrollLeft(op, obj, $(this).attr('id'));
					});
				}
				
				if (op.auto == 'true') {
					obj.loadAutoSlide(obj, op);
				}
			})
        }
    });
    
    /**
     * load the auto animation
     */
    $.fn.loadAutoSlide = function(object, options)
    {
    	options.interSlide = setInterval(function() {
    		$('#hidden' + options.nextButtonId).click();
    	}, options.autoBuffer + options.duration);
    }
    
    /**
     * load the hidden buttons for the slideshow
     */
    $.fn.loadHiddenButtons = function(object, options) {
    	var buttons = '<a href="javascript: void(0);" style="display:none;" id="hidden' + options.backButtonId + '">&nbsp;</a><a href="javascript: void(0);" style="display:none;" id="hidden' + options.nextButtonId + '">&nbsp;</a>';
    	object.append(buttons);
    }
    
    /**
     * scroll forward
     */
    $.fn.scrollForward = function(op, obj, trigger) 
    {
    	clearInterval(op.interSlide);
		
		if (op.stopAutoOnClick == 'false' || op.stopAutoOnClick == 'true' && trigger == 'hidden' + op.nextButtonId) {
			obj.loadAutoSlide(obj, op);
		}
		
    	$('#' + 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();
    		
    		if (op.auto == 'true') {
    			clearInterval(op.interSlide);

    			if (op.resetOnEnd == 'true') {
    				obj.resetSlider(obj, op);
    			}
    		}
    	}
    }
    
    /**
     * scroll back
     */
    $.fn.scrollBack = function(op, obj, trigger) 
    {
    	clearInterval(op.interSlide);
		
		if (op.stopAutoOnClick == 'false' || op.stopAutoOnClick == 'true' && trigger == 'hidden' + op.backButtonId) {
			obj.loadAutoSlide(obj, op);
		}
		
    	$('#' + 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();
    	}
    }
    
    /**
     * scroll right
     */
    $.fn.scrollRight = function(op, obj, trigger) 
    {
    	clearInterval(op.interSlide);
		
		if (op.stopAutoOnClick == 'false' || op.stopAutoOnClick == 'true' && trigger == 'hidden' + op.nextButtonId) {
			obj.loadAutoSlide(obj, op);
		}
		
    	$('#' + op.scrollId).stop();
    	$('#' + op.backButtonId).show();
    	var parentOffset = obj.offset();
    	var scrollOffset = $('#' + op.scrollId).offset();
    	var scrollValue  = op.scrollValue;
    	var hideButton   = false;
    	
    	if (scrollOffset.left - op.scrollValue < (parentOffset.left - $('#' + op.scrollId).width()) + obj.width()) {
    		scrollValue = scrollOffset.left - ((parentOffset.left - $('#' + op.scrollId).width()) + obj.width());
    		hideButton = true;
    	}
    	
    	$('#' + op.scrollId).animate({
    		left: '-=' + scrollValue
    	}, {
			duration: op.duration,
			easing: op.easingType
		});
    	
    	if (hideButton) {
    		$('#' + op.nextButtonId).hide();
    		
    		if (op.auto == 'true') {
    			clearInterval(op.interSlide);
    			
    			if (op.resetOnEnd == 'true') {
    				obj.resetSlider(obj, op);
    			}
    		}
    	}
    }
    
    /**
     * scroll left
     */
    $.fn.scrollLeft = function(op, obj, trigger) 
    {
    	clearInterval(op.interSlide);
		
		if (op.stopAutoOnClick == 'false' || op.stopAutoOnClick == 'true' && trigger == 'hidden' + op.backButtonId) {
			obj.loadAutoSlide(obj, op);
		}
		
    	$('#' + op.scrollId).stop();
    	$('#' + op.nextButtonId).show();
    	var parentOffset = obj.offset();
    	var scrollOffset = $('#' + op.scrollId).offset();
    	var scrollValue  = op.scrollValue;
    	var hideButton   = false;
    	
    	if (scrollOffset.left + op.scrollValue > parentOffset.left) {
    		scrollValue = parentOffset.left - scrollOffset.left;
    		hideButton = true;
    	} else if (scrollOffset.left + op.scrollValue == parentOffset.left) {
    		hideButton = true;
    	}
    	
    	
    	$('#' + op.scrollId).animate({
    		left: '+=' + scrollValue
    	}, {
			duration: op.duration,
			easing: op.easingType
		});
    	
    	if (hideButton) {
    		$('#' + op.backButtonId).hide();
    	}
    }
    
    /**
	 * function to reset the slider
	 */
	$.fn.resetSlider = function(object, options)
	{
		var parentOffset = object.offset();
    	var scrollOffset = $('#' + options.scrollId).offset();
    	
		if (options.direction == 'horizontal') {
			var rollBack     = (options.rollBackTime > 0) ? options.rollBackTime : options.duration * ($('#' + options.scrollId).width() / object.width());
			
			setTimeout(function() {
				$('#' + options.nextButtonId).show();
				$('#' + options.backButtonId).hide();
				
				$('#' + options.scrollId).animate({
					left: '0px'
				}, {
					duration: Math.round(rollBack),
					easing: options.easingType,
					complete: function() {
						object.loadAutoSlide(object, options);
					}
				});
			}, options.autoBuffer + options.duration);
		} else if (options.direction == 'vertical') { 
			var rollBack     = (options.rollBackTime > 0) ? options.rollBackTime : options.duration * ($('#' + options.scrollId).height() / object.height());
			
			setTimeout(function() {
				$('#' + options.nextButtonId).show();
				$('#' + options.backButtonId).hide();
				
				$('#' + options.scrollId).animate({
					top: '0px'
				}, {
					duration: Math.round(rollBack),
					easing: options.easingType,
					complete: function() {
						object.loadAutoSlide(object, options);
					}
				});
			}, options.autoBuffer + options.duration);
		}
	}
	
})(jQuery);



