/**
 * 
 * jQuery vertical scroll content plugin
 * 
 * Scroll content vertically with user's custom up & down controlls - $('#upScrollSelector') &&  $('#downScrollSelector') 
 * 
 * Dependency: jQuery 1.2.2+, jQuery mousewheel plugin ( http://plugins.jquery.com/project/mousewheel )
 * 
 * @version 1.0 Beta
 * @copyright 2009 (c) Digitalus (http://www.digitalus.nl)
 * @author Momchil Vangelov
 * 
 */

/**********************************************

----------------------------------------------- 
Example usage with all plugin options
-----------------------------------------------
  
jQuery(function($) {
	$('div#toScroll').scroll ({
		event:					'mouseover' | 'click'  		Default: 'click'
		mousewheel:   			true | false				Default: true
		upSelector:   			$('#upScrollSelector')		Default: $('#up')
		downSelector: 			$('#downScrollSelector')	Default: $('#down')
		offsetClick				int							Default: 30
		offsetMouseover			int							Default: 5
		offsetMousewheel		int							Default: 30
		mouseoverScrollSpeed	int							Default: 100
	});
});
  
***********************************************/

(function($) {
	
	$.fn.scroll = function(options) {
	
		settings = $.extend({
			
			event:		      		'click',
			mousewheel:       		true,
		    upSelector:       		$('#up'),
		    downSelector: 	  		$('#down'),
		    offsetClick:  	  		30,
		    offsetMouseover:		5,
		    offsetMousewheel: 		30,
		    mouseoverScrollSpeed:	100
		
		}, options);
		
		var $upSelector      		= settings.upSelector;
		var $downSelector    		= settings.downSelector;
		var offsetClick        		= settings.offsetClick;
		var offsetMouseover		    = settings.offsetMouseover;
		var offsetMousewheel 		= settings.offsetMousewheel;
		var mouseoverScrollSpeed 	= settings.mouseoverScrollSpeed;
		
		function scrollUp($element, offset) {
			$element.scrollTop($element.scrollTop() - offset);
		}
		
		function scrollDown($element, offset) {
			$element.scrollTop($element.scrollTop() + offset);
		}
		
		function onClickListener($element)
		{
			// scroll up - on click
			$upSelector.bind('click', function(event) { 
				scrollUp($element, offsetClick);
				return false;
			});
			
			// scroll down - on click
			$downSelector.bind('click', function(event) {
				scrollDown($element, offsetClick);
				return false;
			});
		}
		
		function onMouseoverListener($element)
		{
			// scroll up - on mouseover
			$upSelector.bind('mouseover', function(event) { 
				intervalIdUp = setInterval(function() { 
					scrollUp($element, offsetMouseover); 
				}, mouseoverScrollSpeed);
				return false;
			});
			
			// scroll down - on mouseover
			$downSelector.bind('mouseover', function(event) {
				intervalIdDown = setInterval(function() { 
					scrollDown($element, offsetMouseover); 
				}, mouseoverScrollSpeed);
				return false;
			});
			
			// clear up interval
			$upSelector.bind('mouseout', function(event) { 
				clearInterval(intervalIdUp);
				return false;
			});
			
			// clear down interval
			$downSelector.bind('mouseout', function(event) {
				clearInterval(intervalIdDown);
				return false;
			});
		}
		
		function attachMousewheel($element)
		{
			$element.bind('mousewheel', function(event, delta) {
		        
				// wheel up
				if (delta > 0) {
					scrollUp($element, offsetMousewheel);
		        }
		        // wheel down
				else {
					scrollDown($element, offsetMousewheel);
		        }
		        
		        return false;
		    });
		}
		
		this.each(function() {
			
			var $elScrollable = $(this);
						
			switch(settings.event)
			{
				case 'click':
					onClickListener($elScrollable);
					break;
				
				case 'mouseover':
					onMouseoverListener($elScrollable);
					break;
				
				default:
					onClickListener($elScrollable);
			}
			
			if (settings.mousewheel == true) {
				attachMousewheel($elScrollable);
			}
		});
	};
	
})(jQuery);