/* =========================================================

// jquery.verticalScroll.js

// Datum: 2009-08-11
// Agence: Kryzalid
// Auteur: Matthieu Cardin
// Courriel: mcardin@kryzalid.net
// Web: http://www.kryzalid.net

 *
 *  <div id="up">Up</div>
 *  <div id="down">Down</div>
 *
 *	<div id="scrollableText" style="position:absolute; top:50px; left:0; width:150px; height:80px; overflow:hidden;">
 *      Ce DIV doit avoir une position relative à son parent et donc, postionné avec top et left, ainsi
 *  	qu'une largeur et hauteur (width, height)
 *  </div>
 *  
 *  $("#scrollableText").verticalScroll({
 *  		upBtn: "#up", 		// Le sélecteur correspodant au bouton UP
 *  		downBtn: "#down", 	// Le sélecteur correspodant au bouton DOWN
 *  		frameRate: 30,		// Le nombre de déplacement par secondes (min : 12, max : 60)
 *  		stepPixels: 8,		// Le nombre de pixels à chaque déplacement (min : 1);  
 *  		mouseWheel: true	// Support mousewheel, nécessite le plugin jquery.mousewheel
 *  });
 *

// ========================================================= */
(function($){  
			$.fn.verticalScroll = function(options) { 
			
				var defaults = {
				   upBtn: null,
				   downBtn: null,
				   frameRate:  24,
				   stepPixels: 2,
				   mouseWheel: false
				  };
	  			
				// Defaults
				options.frameRate = Math.max(options.frameRate, 12); options.frameRate = Math.min(options.frameRate, 60);
				options.stepPixels = Math.max(options.stepPixels, 1);
				var options = $.extend(defaults, options);
				
				return this.each(function() {
					var obj = $(this);
					
					var containerW = obj.width();
					var containerH = obj.height();
					var containerPos = obj.position();
					var contentHtml = obj.html();
					var contentH;
					var interval;
					var scrollTop;
					var scrollBottom;
					var way = 0;
					var mouseScrolling = false;
					
					// Création du container
					var container = $('<div id="vertical-scroll-ctnr"></div>');
					container.css({
						'top' : containerPos.top+'px', 
						'left' : containerPos.left+'px', 
						'width' : containerW+'px', 
						'height' : containerH+'px', 
						'overflow' : 'hidden',
						'position' : 'relative'
					});
					obj.replaceWith(container);
					
					// Création du contenu
					var container = $("#vertical-scroll-ctnr");
					var content = $('<div id="vertical-scroll-content"></div>');
					content.css({
						'position' : 'relative',
						'width' : containerW+'px', 
						'height' : 'auto', 
						'overflow' : 'visible'
					});
					content.html(contentHtml);
					container.append(content);
					var container = $("#vertical-scroll-content");
					
					contentH = content.height();
	
					scrollTop = containerH-contentH;
					scrollBottom = 0;
					
					// A t-on besoin de scroller ? 
					if (contentH <= containerW) { 
						$(options.upBtn+", "+options.downBtn).css('opacity', 0.5);
						return false;
					}
					// Controls
					$(options.upBtn).mousedown(function(){
						way = 1;
					}).mouseup(function(){
						way = 0;
					}).css('cursor','pointer');
					
					$(options.downBtn).mousedown(function(){
						way = -1;
					}).mouseup(function(){
						way = 0;
					}).css('cursor','pointer');
					
					//Mousewheel Support
					if (options.mouseWheel) {
						$("#vertical-scroll-content").mousewheel(function(event, delta) {
									mouseScrolling = true; way = delta;
									return false;
								});
					}
					
					var ms = Math.round(1000/options.frameRate);
					interval =  window.setInterval(function(){initMove.apply(obj, []);}, ms);
					
					var newYpos = scrollBottom;
					var initMove = function() {
						if (way != 0) {
							var yPos = content.position().top;
							// Monte
							if (way > 0) {
								newYpos = yPos+=options.stepPixels;
								if (newYpos > scrollBottom) {
									newYpos = scrollBottom;
								}
							// Descend
							} else {
								newYpos = yPos-=options.stepPixels;
								if (newYpos < scrollTop) {
									newYpos = scrollTop;
								}
							}
							move(newYpos);
						}
						
						if (newYpos == scrollTop) { $(options.downBtn).css('opacity', 0.5); }else{ $(options.downBtn).css('opacity', 1)};
						if (newYpos == scrollBottom) { $(options.upBtn).css('opacity', 0.5); }else{ $(options.upBtn).css('opacity', 1)};
					}
					
					var move = function(y) {
						content.css('top', y+'px');
						if (mouseScrolling) {
							mouseScrolling = false;
							way = 0;
						}
					}
					
					// FIN
				
				});  
			};  
})(jQuery); 
