﻿/**
* verticalScroll.jquery - Vertical element scrolling using jQuery.
* This plugin is for turning an HTML element with content overflow
* into a scrolling area.
* Copyright (c) 2010 J A Calder - j(at)powerspike(dot)co(dot)uk
*
* This plugin is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This plugin is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details. <http://www.gnu.org/licenses/>.
*
* Date: 2010-07-18
* @author J A Calder
* @version 0.5
*
* Changelog
* ---------------------------------------------
*
* 0.5   - First version.
*/

(function($) { 
	jQuery.fn.verticalScroll = function(parameters){
		var defaults = {
			scrollableElement:   '#innerContent',  // The srollable element
			hotSpotUp:           '.scrollUp',      // Hotspot to trigger scrolling up
			hotSpotDown:         '.scrollDown',    // Hotspot to trigger scrolling down
			scrollSpeed:         5000,           // Scroll speed. Any of the jQuery animate() speeds
			hideOverflow:        '',               // elements to hide scrollbars for (*should* only ever need to be calling wlement)
			visibleHotSpotClass: 'hotSpotVisible', // CSS class of visible hotspots. Remember to NOT precede class name with period
			hiddenHotSpotClass:  'hotSpotHidden'   // CSS class of hidden hotspots. Remember to NOT precede class name with period
		};
		
		parameters = $.extend(defaults, parameters);
		
		return this.each(function() {
			var $scrollable      = $(this);
			var hotSpots         = '';
			var overflowElements = new Array();
			$(this).css('overflow','hidden');
			overflowElements     = parameters.hideOverflow.split(', ');
			for(i in overflowElements) { // really should never need this
				$(overflowElements[i]).css('overflow','hidden');
			}

			$scrollable.scrollableElementYOffset  = $scrollable.find(parameters.scrollableElement).offset().top;
			$scrollable.scrollableElementHeight   = $scrollable.find(parameters.scrollableElement).outerHeight();
			$scrollable.scrollableMaxDisplacement = $scrollable.height() - $scrollable.scrollableElementHeight;

			if ($scrollable.height() < $scrollable.scrollableElementHeight) {
				$(parameters.hotSpotDown).removeClass(parameters.hiddenHotSpotClass).addClass(parameters.visibleHotSpotClass);
				$scrollable.find(parameters.scrollableElement).css("height", ($scrollable.scrollableElementHeight + "px"));
				$(parameters.hotSpotDown).live('mouseover',function(){
					$scrollable.direction = 'down';
					hotSpots = setInterval(showAndHideHotSpots,100);
					$(parameters.scrollableElement).animate({'top': ($scrollable.scrollableMaxDisplacement) + 'px'},parameters.scrollSpeed);
				});

				$(parameters.hotSpotDown +','+ parameters.hotSpotUp).live('mouseout',function(){
					clearInterval(hotSpots);
					$(parameters.scrollableElement).stop();
				});

				$(parameters.hotSpotUp).live('mouseover',function(){
					$scrollable.direction = 'up';
					hotSpots = setInterval(showAndHideHotSpots,100);
					$(parameters.scrollableElement).animate({'top': '0px'},parameters.scrollSpeed);
				});
			}

			var showAndHideHotSpots = function() {
				switch($scrollable.direction){
					case 'down':
						if($scrollable.scrollableMaxDisplacement < 0 && $scrollable.find(parameters.scrollableElement).position().top !== $scrollable.scrollableMaxDisplacement) {
							$(parameters.hotSpotUp).removeClass(parameters.hiddenHotSpotClass).addClass(parameters.visibleHotSpotClass);
						}
						if($scrollable.find(parameters.scrollableElement).position().top === $scrollable.scrollableMaxDisplacement) {
							$(parameters.hotSpotDown).removeClass(parameters.visibleHotSpotClass).addClass(parameters.hiddenHotSpotClass);
						}
					break;
					case 'up':
						if($scrollable.find(parameters.scrollableElement).offset().top === $scrollable.scrollableElementYOffset) {
							$(parameters.hotSpotUp).removeClass(parameters.visibleHotSpotClass).addClass(parameters.hiddenHotSpotClass);
						}
						if($scrollable.find(parameters.scrollableElement).offset().top < $scrollable.scrollableElementYOffset) {
							$(parameters.hotSpotDown).removeClass(parameters.hiddenHotSpotClass).addClass(parameters.visibleHotSpotClass);
						}
					break;
					default:
					break;
				}
				return false;
			}
		});
	};
})(jQuery);

