/************ Plugin JQuery ************* */
/* Réalisé par Creamama - Matthieu Léorat */
/* ************ juillet 2010 ************ */ 
/* ******** http://www.creamama.fr ****** */

/********** NECESSITE ************/
/* ******************************** 
jquery-1.4.2.min.js
ui.core-1.7.2.js
ui.draggable-1.7.2.js
jquery.mousewheel.min.js
******************************** */
var sitepath = 'http://www.galerie-lelong.com/';

(function($) {
	$.fn.scrollbar = function(params) {
		// Fusionner les paramètres par défaut et ceux de l'utilisateur
		params = $.extend( {
			id_elmt:'',
			taille_englobe: 430,			//Taille de l'espace visible - /!\ Doit être un nombre ou 'auto'
			taille_bar: 408,				//Taille de la bar - /!\ Doit être un nombre ou 'auto'
			taille_bouton: 8,				//Taille du bouton - /!\ Doit être un nombre
			pas:75,							//Pas du scroll molette - /!\ Doit être un nombre ou 'auto'
			pas_arrows:75,					//Pas du scroll click - /!\ Doit être un nombre ou 'auto'
			molette: true,					//Détection du scroll molette - /!\ true ou false
			arrows: true,					//Détection du click sur les flèches - /!\ true ou false
			drag: true,						//Bouton de la scrollbar déplacable à la souris - /!\ true ou false
			debug: false,					//Afficher la console de debug - /!\ true ou false
			style: 'basic',					//Choix des styles - /!\ Par défault, il n'y a que le style 'basic'
			position:'droite',				//Position de la scrollBar - /!\ 'gauche' ou 'droite'
			alignement_scrollbar:'middle',	//Alignement de la scrollBar. Utilisé uniquement si elle à une taille inférieur à celle de taille_englobe
			orientation: 'vertical',		//Orientation du contenu, 'vertical' ou 'horizontal'
			marge_scroll_contenu: 5,		//Marge entre la scrollBar et le contenu - /!\ Doit être un nombre
			largeur_bar:8,					//Largeur de la scrollbar
			largeur_scrollbar:20			//Largeur de la scrollbar
		}, params);
		
		return this.each(function() {
			var $$ = $(this);
			var taille_englobe_init = params.taille_englobe;
			var taille_bar_init = params.taille_bar;
			
			//Fonction de calcul de position top maximum du contenu
			function calcul_contenu_top_max(){
				return  params.taille_englobe - taille_contenu ;
			}
			
			//Fonction de calcul de position top maximum du bouton
			function calcul_bouton_top_max(){
				return params.taille_bar - params.taille_bouton;
			}
			
			//Fonction de calcul du déplacement du bouton
			function deplacement_bouton(info_top_contenu){
				//On calcul la nouvelle position du bouton
				var depl_bouton = (info_top_contenu/calcul_contenu_top_max())*(calcul_bouton_top_max());
				//On vérifie que ca déborde pas en haut
				if(depl_bouton < 0){depl_bouton = 0;}
				//On vérifie que ca déborde pas en bas
				if(depl_bouton > calcul_bouton_top_max()){depl_bouton = calcul_bouton_top_max();}
				$(params.id_elmt+' > .scrollbar > .bar > .bouton').css({'top':depl_bouton+"px"});
			}
			
			function deplacement_contenu(info_top_bouton){
				//On calcul la nouvelle position du contenu
				var depl_contenu = (info_top_bouton/calcul_bouton_top_max())*(calcul_contenu_top_max());
				//On vérifie que ca déborde pas en haut
				if (depl_contenu > 0){depl_contenu = 0}
				//On vérifie que ca déborde pas en bas
				if (depl_contenu < calcul_contenu_top_max()){depl_contenu = calcul_contenu_top_max()}
				$(params.id_elmt+' > .content_text > .text_scroll').css({'top':depl_contenu+"px"});
			}
			
			function styler_bar(position,orientation){
				var type_marge_position;
				var marge_position;
				var marge_orientation;
				$(params.id_elmt+' > .content_text').after('<div class="scrollbar"><div class="arrows up" ><img src="'+sitepath+'css/img/arrow_up.jpg" width="20px" /></div><div class="bar"><div class="bouton">&nbsp;</div></div><div class="arrows down" ><img src="'+sitepath+'css/img/arrow_down.jpg" width="20px" /></div></div>');
				$(params.id_elmt+' > .scrollbar > .arrows').css({'pointer':'cursor'});
				$(params.id_elmt+' > .scrollbar > div').css({'text-align':'center','margin':'auto'});
				switch (position){
					case 'droite':
						$(params.id_elmt+' > .scrollbar').css({'margin-left':params.marge_scroll_contenu+'px'});
					break;
					case 'gauche':
						$(params.id_elmt+' > .scrollbar').css({'margin-right':params.marge_scroll_contenu+'px'});
					break;
				}
				switch (orientation){
					case 'haut':
						$(params.id_elmt+' > .scrollbar > .bar').css({'margin-top':'0px'});
					break;
					case 'centre':
						var marge = (params.taille_englobe -params.taille_bar)/2;
						$(params.id_elmt+' > .scrollbar > .bar').css({'margin-top':marge+'px'});
					break;
					case 'bas':
						var marge = params.taille_englobe -params.taille_bar;
						$(params.id_elmt+' > .scrollbar > .bar').css({'margin-top':marge+'px'});
					break;
				}
			}
			var padTop=0;
			var padBot=0;
			//Hauteur du contenu
			$$.removeAttr("height");
            var taille_contenu = $$.height()+40;
			//alert(taille_contenu);
			
			function calcul_hauteur_auto(){
				if(params.taille_englobe == "auto"){
					padTop = $(params.id_elmt).css('padding-top');
					padTop = padTop.substring(0,padTop.length-2);
					
					padBot = $(params.id_elmt).css('padding-bottom');
					padBot = padBot.substring(0,padBot.length-2);
					
					params.taille_englobe = $(window).height()-40-padBot-padTop;
					
				}else{return false}
			}
			calcul_hauteur_auto();
			//La hauteur de l'espace visible est la hauteur de la fenetre du navigateur si taille_englobe="auto"
			
			
			function controle_donnee(){
				calcul_hauteur_auto();
				//La taille du contenu doit être supérieur à celle de l'espace visible (taille_englobe)
				if(taille_contenu > params.taille_englobe){
					//La hauteur de la scroll bar est égale à la hauteur de "text_scroll" si hauteur_srollbar="auto"
					if(params.taille_bar == "auto"){params.taille_bar = params.taille_englobe;}
					//La taille de la bar doit être inférieur ou égale à la taille de taille_englobe
					if(params.taille_bar > params.taille_englobe){						
						params.taille_bar = params.taille_englobe;	
					}
					return true;
				}else{return false;}		
			}
			
			//Si la hauteur du contenu est supérieur à la hauteur de l'espace visible
			if(controle_donnee()){
				//Au redimensionnement de la fenetre
				//N'est concerné par cette fonction que les éléments en 'auto'
				window.onresize = function() {
					if(taille_englobe_init == "auto"){
						params.taille_englobe = $(window).height()-40-padBot-padTop;
						$$.css({'height':params.taille_englobe+'px'});
						if(taille_bar_init == "auto"){
							params.taille_bar = params.taille_englobe;
							$(params.id_elmt+' > .scrollbar > .bar').css({'height':params.taille_bar+'px'});
							deplacement_bouton($(params.id_elmt+' > .content_text > .text_scroll').css('top').substring(0,$(params.id_elmt+' > .text_scroll').css('top').length-2));
							if(params.debug){affiche_position();}
						}
					}	
				};
				
				//calcul des largeurs
				var temp = $$.width();
				$$.css({'width':params.marge_scroll_contenu+params.largeur_scrollbar+temp+'px'});
				//On construit une div autour du contenu, mais à l'intérieur de la div
				$$.wrapInner('<div class="content_text"><div class="text_scroll"></div></div>');
				$$.css({'height':params.taille_englobe+'px'});
				$(params.id_elmt+' > .content_text > .text_scroll').css({'width':temp+'px','top':0+'px','position':'relative'});
				$(params.id_elmt+' > .content_text').css({'top':0+'px','width':temp+'px','height':(params.taille_englobe-2)+'px','float':'left','position':'relative','overflow':'hidden'});
				
				//On construit la bar
				styler_bar(params.position,params.alignement_bar);
				
				$$.append('<div class="clear"></div>');
				
				
				switch (params.style) {
					case 'basic':
						
						$(params.id_elmt+' > .scrollbar').css({'width':params.largeur_scrollbar+'px',
										 'float':'left'
						});
						
						//Style de la bar
						$(params.id_elmt+' > .scrollbar > .bar').css({'width':params.largeur_bar+'px',
											'height':params.taille_bar+'px',
											'background':'#EDEDEE'	
						});
								
						//Style du bouton de la bar
						$(params.id_elmt+' > .scrollbar > .bar > .bouton').css({'width':params.largeur_bar+'px',
										'height':params.taille_bouton+'px',
										'background':'#BDBEC0',
										'top':0+'px',
										'cursor':'pointer'
										});
					break;
				}

				
				
				//Si le drag du bouton est activé(true)
				if(params.drag){
					$(params.id_elmt+' > .scrollbar > .bar > .bouton').draggable({ 
						containment: 'parent',
						axis: 'y',
						start:function(){},
						drag: function(event, ui) {
							//ui.position.top est la valeur renvoyé par le plugin JQuery UI
							deplacement_contenu(ui.position.top);
							if(params.debug){affiche_position();}
						},
						stop: function(){}
					});
				}
				
				if(params.molette){
					$$.mousewheel(function(event, delta) {
						//On récupère la position du contenu
						var top_contenu = $(params.id_elmt+' > .content_text > .text_scroll').css('top');
						
						//On enlève le 'px' et on le convertit en entier pour pouvoir le manipuler
						top_contenu = parseInt( top_contenu.substring(0,(top_contenu.length-2)) );
						
						//On récupère la position du bouton
						var top_bouton = $(params.id_elmt+' > .scrollbar > .bar > .bouton').css('top');
						//On enlève le 'px' et on le convertit en entier pour pouvoir le manipuler
						top_bouton = parseInt( top_bouton.substring(0,(top_bouton.length-2)) );
						
						//Si le delta est positif, c'est à dire que l'on "pousse" la molette
						if (delta > 0) {							
							top_contenu = top_contenu + params.pas;
							//On vérifie que l'on n'a pas atteint le haut du contenu
							if(top_contenu > 0){top_contenu = 0}
							$(params.id_elmt+' > .content_text > .text_scroll').css({'top':top_contenu+"px"});
						//Si le delta est négatif, c'est à dire que l'on "ramène" la molette
						}else if (delta < 0){							
							top_contenu = top_contenu - params.pas;
							//On vérifie que l'on n'a pas atteint le bas du contenu
						//	alert(top_contenu+"-"+calcul_contenu_top_max());
							if(top_contenu < calcul_contenu_top_max()){top_contenu = calcul_contenu_top_max()}
							$(params.id_elmt+' > .content_text > .text_scroll').css({'top':top_contenu+"px"});							
						}
						
						//calcul de déplacement du bouton					
						deplacement_bouton(top_contenu);
						
						if(params.debug){affiche_position();}
					});
				}
				
				if(params.arrows){
					$(params.id_elmt+' > .scrollbar > .arrows').click(function() {
						//On récupère la position du contenu
						var top_contenu = $(params.id_elmt+' > .content_text > .text_scroll').css('top');
						
						//On enlève le 'px' et on le convertit en entier pour pouvoir le manipuler
						top_contenu = parseInt( top_contenu.substring(0,(top_contenu.length-2)) );
						
						//On récupère la position du bouton
						var top_bouton = $(params.id_elmt+' > .scrollbar > .bar > .bouton').css('top');
						//On enlève le 'px' et on le convertit en entier pour pouvoir le manipuler
						top_bouton = parseInt( top_bouton.substring(0,(top_bouton.length-2)) );
						
						//
						if ($(this).hasClass("up")) {							
							top_contenu = top_contenu + params.pas_arrows;
							//On vérifie que l'on n'a pas atteint le haut du contenu
							if(top_contenu > 0){top_contenu = 0}
							$(params.id_elmt+' > .content_text > .text_scroll').css({'top':top_contenu+"px"});
						//
						}else if ($(this).hasClass("down")){							
							top_contenu = top_contenu - params.pas_arrows;
							//On vérifie que l'on n'a pas atteint le bas du contenu
							if(top_contenu < calcul_contenu_top_max()){top_contenu = calcul_contenu_top_max()}
							$(params.id_elmt+' > .content_text > .text_scroll').css({'top':top_contenu+"px"});							
						}
						
						//calcul de déplacement du bouton					
						deplacement_bouton(top_contenu);
						
						if(params.debug){affiche_position();}
					});
				}
				
			}
        });
	}
})(jQuery);
