/***** 
 *	Create by Debondt "Phenix" Didier 
 *	http://www.phenix-factory.net/
 **/

(function($) {
	
    // here it goes!
    $.fn.scrollControl = function(options) {
		
		var getUniqueId = function () {
			 var dateObject = new Date();
			 var uniqueId =
				  dateObject.getFullYear() + '' +
				  dateObject.getMonth() + '' +
				  dateObject.getDate() + '' +
				  dateObject.getTime();

			 return uniqueId;
		}
		
		var defaults = {
			ths: this,
            divWidth: $(this).width(),
			divHeight: $(this).height(),
			
			UID: getUniqueId(),
			
			cssCursor: {
							background: "#000",
							width: "15px",
							height: "20px"
			},
			
			drag: false,
			
			mousewheel: false,
			scrollSpeed: 3,
			
			autoScrollSystem: false,
			
			cssAutoCursor: {
				width: "10px",
				height: "5px",
				background: "#CCC"
			},
			
			showTitle: false,
			fadeShowTitleSpeed: "normal"
        };
		
		var opts = $.extend(defaults, options);
		
		//configuration indispensable au fonctionnement
		
		defaults.cssCursor.left = $(this).outerWidth() - parseInt(defaults.cssCursor.width);
		defaults.cssCursor.top = 0; //$(this).offset().top+"px";
		defaults.cssCursor.position = "absolute";
		defaults.cssCursor.zIndex = 4;
		
		//Css indispensable:
		defaults.cssAutoCursor.position = "absolute";
		defaults.cssAutoCursor.zIndex = 5;
		defaults.cssAutoCursor.left = $(this).outerWidth() - parseInt(defaults.cssAutoCursor.width);
		defaults.cssAutoCursor.cursor = "pointer";
		
		//End config
		
		//Initialisation du CSS de base
		var init = function (ths) {
			
			$(ths).css("height", "auto");
			//On récupère la hauteur max pour pouvoir faire des comparaisons par la suite.
			defaults.maxH = $(ths).outerHeight(true);
			$(ths).height(defaults.divHeight);
			
			
			//On force le overflow hidden, ou cas ou.
			$(ths).css("overflow", "hidden");
			
			//Création du curseur
			$(ths).append('<div class="scrollBar'+defaults.UID+'"><div class="cursorScrollControle'+defaults.UID+'"></div></div>');
			
			$(".scrollBar"+defaults.UID).css({
				position: "absolute",
				top: 0,
				left: 0
			});
			
			$(".cursorScrollControle"+defaults.UID,defaults.ths).css(defaults.cssCursor);
			
			defaults.limitUp = 0;
			defaults.limitDown = defaults.divHeight;
		}
		
		//Change la position dub scroll dans l'overFlow
		var scrollTheOverflow = function (ths, position) {
			
			$(ths).scrollTop(position);
		}
		
		var scrollBarreSystem = function (cursorPosTop) {
			//Verrouillage des limites.
			if (cursorPosTop < defaults.limitUp) cursorPosTop = defaults.limitUp;
			if (cursorPosTop > defaults.limitDown) cursorPosTop = defaults.limitDown;

			var pourcentageCursor = ((cursorPosTop)*100)/defaults.divHeight;

			//Convertion de ce pourcentage en position pour l'overflow !
			var overFlowPos = (defaults.maxH * pourcentageCursor)/100;

			//On place le curseur
			$(".cursorScrollControle"+defaults.UID,defaults.ths).css("top", cursorPosTop);

			//On fait suivre la scrollBar
			$(".scrollBar"+defaults.UID,defaults.ths).css("top", overFlowPos);

			scrollTheOverflow(defaults.ths, overFlowPos);
		}
		
		
		var moveCursor = function () {
			
			//Selecteur rapide
			var cursor = $(".cursorScrollControle"+defaults.UID,defaults.ths);
			
			//On drag le curseur
			cursor.live("mousedown", function (e) {
				
				
				//On autorise le mouvement du curseur
				defaults.drag = true;
				
				//Sur le mouvement de la souris 
				$(document).mousemove(function (e) {
					//déplacement du curseur
					if (defaults.drag) {
						
						//récupération de ma position réel du curseur, la position de la souris n'est pas fiable a 100%
						var cursorPosTop = cursor.position().top;
						
						var pourcentageCursor = ((cursorPosTop)*100)/defaults.divHeight;
						
						//Convertion de ce pourcentage en position pour l'overflow !
						var overFlowPos = (defaults.maxH * pourcentageCursor)/100;
						
						//Position du cursur
						var topCursor = e.pageY - $(defaults.ths).offset().top;
						
						scrollBarreSystem(topCursor);
					}
					
					
				});
				
				return false;
			});
			
			//on relache le curseur
			$("html").live("mouseup", function () {
				
				defaults.drag = false;
				return false;
			});
		}
		
		//support de mousewheel
		var scrollOnMouse = function () {
			
			//Selecteur rapide
			var cursor = $(".cursorScrollControle"+defaults.UID,defaults.ths);
			
			if (defaults.mousewheel) {
				
				$(defaults.ths).mousewheel(function(event, delta) {
					
					//récupération de la position réel du curseur, la position de la souris n'est pas fiable a 100%
					var cursorPosTop = cursor.position().top;
					
					if (delta > 0) {
						//on ajoute une valeur pour déplacer le curseur au scroll qui lui même déplacera la div
						cursorPosTop -= defaults.scrollSpeed;
					}
					else if (delta < 0) {
						//on ajoute une valeur pour déplacer le curseur au scroll qui lui même déplacera la div
						cursorPosTop += defaults.scrollSpeed;
					}
					
					scrollBarreSystem(cursorPosTop);

					return false;
				});
				
				
			}
			
			
		}
		
		var autoScroll = function () {
			if (defaults.autoScrollSystem) {
				
				var createAutoCursor = function (tab) {
					
					//Calcule du %tage de la position
					var pourcent = (tab[0]*100)/defaults.maxH;

					//convertion de ce pourcentage en px pour le positionnement de l'autoCurseur
					var posAutoCursor = (defaults.divHeight * pourcent) /100;
					
					//On ajoute l'autoCursor'
					$(defaults.ths).children(".scrollBar"+defaults.UID).append('<div class="autoCursor'+defaults.UID+'" style="top: '+posAutoCursor+'px;position:absolute;" scroll="'+(tab[0])+'" title="'+ tab[1] +'"></div>');
				}
				
				
				//tableau qui contiendra la position de chaque élément.
				var posOfAll = [];
				
				//detection de tout les élément qui sont dans 
				$(defaults.ths).children().not(".cursorScrollControle"+defaults.UID+", .scrollBar"+defaults.UID).each(function () {
					
					//push !
					posOfAll[posOfAll.length] = [$(this).position().top, $(this).attr("title")];
				});
				
				//On crée les auto Crusor au moyen de la fonction
				posOfAll.forEach(createAutoCursor);
				
				//On créer un CSS pour les auto Cursor
				$(".autoCursor"+defaults.UID,defaults.ths).css(defaults.cssAutoCursor);
				
				//Lorsque l'on clique sur un auto Cursor
				$(".autoCursor"+defaults.UID,defaults.ths).live("click", function () {
					
					var scrollToPos = $(this).attr("scroll");
					var t = $(this).position().top;
					$(defaults.ths).animate({
						scrollTop: scrollToPos
					}, 1000);
					
					
					//On fait suivre la scrollBar
					$(".cursorScrollControle"+defaults.UID,defaults.ths).animate({
						top: t
					}, 1000);
					
					$(".scrollBar"+defaults.UID,defaults.ths).animate({
						top: scrollToPos
					}, 1000);
					
				});
			}	
		}
		
		var showTitleSystem = function ()  {
			if (defaults.showTitle && defaults.autoScrollSystem) {
				
				//On ajoute la boite pour afficher le titre
				$(defaults.ths).children(".scrollBar"+defaults.UID).append('<div class="showTitleBox'+defaults.UID+'" title="titleBox"></div>');
				
				$(".showTitleBox"+defaults.UID).css({
					display: "none",
					padding: "10px 10px 10px 10px",
					background: "#000",
					color: "#FFF",
					position: "absolute",
					width: "200px"
				});
				
				$(".autoCursor"+defaults.UID,defaults.ths).live("hover", function () {
					var ths = this;
					//Récupération des positions:
					var pos = $(ths).position();
					
					var box = $(".showTitleBox"+defaults.UID)
					
					var msg = $(ths).attr("title");
					
					
					if (msg != "undefined") {
						//on insert le title dans la box
						box.html(msg);

						box.stop(true, true).fadeToggle(defaults.fadeShowTitleSpeed);

						// on place la div
						box.css({
							top: pos.top,
							left: pos.left - 220
						});
					}
				})
			}
		}
		
		init(this);
		moveCursor();
		scrollOnMouse();
		
		
		autoScroll();
		showTitleSystem();
		
		//Pour réduire le risque d'erreur on place d'office le scroll à 0 de base
		scrollTheOverflow(this, 0);
		
	}
})(jQuery);
// JavaScript Document
