/*
*  PLUGIN JQUERY SLIDER - FNAC
*  Writted by Guillaume DIAS | PARIS - FRANCE
*  10/03/2009
*  Version 1.2
*/
(function($) {
    $.fn.slider = function(params){
		
		var params = $.extend({
				tempo: 800,
				widthImg: 110,
				heightSlide: 110,
				nbShow: 2,
				nbMove: 2,
				mrgTop: 75,
				autoAlign: true
		},params);
		
		displayOff = false;
		
		function resizeSlide(Elmt) {
			// Déclaration des variables
			nbView = params.nbShow;
			widthImage = params.widthImg;
			widthUl = $("ul",Elmt).width();
			marginLi = $("li",Elmt).css("margin-right");
			heightSubTitle = new Array();
			//console.log("widthImage: "+widthImage);
			// Gestion de la hauteur du slider
			$("li",Elmt).each(function(i){
				heightSubTitle[i] = $("dd",this).height();
			});
			
			if (heightSubTitle.length <= 0) {
			    displayOff = true;
			} else if (heightSubTitle.length <= params.nbShow) { // Suppression des boutons
			    $(".bouton",Elmt).css("display","none");
			}
			
			// Conditionnement de l'affichage du slider
			if (!displayOff) {
			    
			    sortTab = heightSubTitle.sort();
			    invTab = sortTab.reverse();
			    
			    heigthSlider = params.heightSlide;
			    //console.log(heigthSlider);
                $(Elmt).height(heigthSlider);
                
			    // Gestion de la largeur du slider
			        //- Recherche des angles arrondis FNAC
			    var testArrBr = $(Elmt).prev('b').hasClass('br');
			    var testArrBl = $(Elmt).prev('b').hasClass('bl');
			    var testArrTr = $(Elmt).prev('b').hasClass('tr');
			    var testArrTl = $(Elmt).prev('b').hasClass('tl');
			    var largeButton = $(Elmt).children("span").children("a").children("img").width();

		        le = marginLi.length;
		        su = parseInt(marginLi.substr(0, le-2));
		        stepOne = (widthImage+su);
		        widthSlider = (stepOne*nbView);
                step2 = parseInt(widthSlider+largeButton);
                step3 = parseInt(step2+su);

		        if (testArrBr != false || testArrBl != false || testArrTr != false || testArrTl != false) {
	                // Il existe des bords arrondis : on contraint la taille du slider par le conteneur supérieur (celui qui englobe le slider)
	                $(Elmt).parent('div').parent('div').parent('div').width(step3);
		        } else {// Pas de bords arrondis, on conditionne le conteneur du slider
		            $(Elmt).width(step3);
		        }
                // Dans tous les cas, on ajuste la div qui encadre le bouton "voir tous les produits" en fonction de la largeur du slider
                $(".TousProduitsSliders").parent("div").width(step3);
                
		        // Gestion de la hauteur des caches boutons
		        $(".bouton",Elmt).height(heigthSlider);
    			
		        // Gestion de l'alignement des éléments // DT > IMG
		        maxHeight = invTab[0]; // recup de la plus haute hauteur 
		        
		        
		        
		        $('ul li dl dt',Elmt).each(function(){
			        // Alignement des cellules DT
			        $(this).width(params.widthImg);
			        $(this).css({
				        "position":"relative",
				        "text-align":"center"
			        });
		        });

			    // Gestion de la longueur du UL > Effet de bord (retour à la ligne)
			    var margLi = $("li",Elmt).css("margin-right");
    			
			    len = margLi.length;
			    subb = parseInt(margLi.substr(0, len-2));
    			
			    nbArt = invTab.length;
			    lenUl = (subb*nbArt)+(nbArt*widthImage);
			    retourLenUl = lenUl+"px";
			    $("ul",Elmt).css("width",retourLenUl);
    			
			    // Gestion du placement des boutons en hauteur au lancement
			    heightButton = $(Elmt).children("span.bouton").children("a").children("img").height();
			    recupHeightElmt = (heigthSlider/2)-(heightButton/2);
			    heightElmt = recupHeightElmt+"px";
			    //console.log("heightElmt : "+heightElmt);
			    $(Elmt).children("span.bouton").children("a").css({
				    'margin-top':heightElmt,
				    'display':'block'
			    });
			    // Gestion de la restriction d'affichage des boutons
			    testBtnView = true;
    			
                // Restriction de la taille des LI (ne pas fausser le calcul du UL)
                $("ul li dl",Elmt).each(function(){
                    $(this).width(widthImage);
                });
                
			    // Rectification Internet Explorer7 (no condition !)
			    $(Elmt).children("span.bouton").eq(1).children("a").children("img").css("margin-left","1px");
    			
			    // Gestion de la restriction du déplacement du slider
			    nbElmt = invTab.length; // Compensation tableau
			    cibleUl = $("ul",Elmt);
    			
			    posUl = $("ul",Elmt).position();
    			
			    var max = limitMax(cibleUl,posUl.left,nbElmt);
			    var min = 0;//limitMin(cibleUl);
			    var cible = $("ul",Elmt);
			    var posStart = cible.css('left');
			    var lenS = posStart.length;
			    var realPosStart = posStart.substr(0,lenS-2);
			    posSlider (cible,max,min,realPosStart);
    			
			    return subb;
			
			} else {
			    // on cache le slider sans produit
			    $(Elmt).parent("div").parent("div").parent("div").css("display","none");
			}
		}
                    

        // Gestion du css String to number
        function stringToNumber(val) {
        	len = val.length;
			realVal = parseInt(val.substr(0, len-2)); // on enleve les px
			return realVal;
        }

		// Gestion du comportement des boutons
		function posSlider(jElt,max,min,now) {
		    //console.log("max : "+max+" | min : "+min+" | now : "+now);
			var btnGauche, btnDroit, maxX;
			btnGauche = $(jElt).prev("span.bouton").children("a");
			btnDroit = $(jElt).next("span.bouton").children("a");
			maxX = "-"+parseInt(max);
			
			if (now >= min) {// Affichage du bouton Droit
				btnGauche.css("display","none"); // BTN GAUCHE
				btnDroit.css("display","block"); // BTN DROIT
			} else if (now < min && now > maxX){// Affichage des 2 boutons
				btnGauche.css("display","block");
				btnDroit.css("display","block");	 
			} else if (now <= maxX) {// Affichage du bouton gauche
				btnGauche.css("display","block"); 
				btnDroit.css("display","none");
			}		
			
		}
		

		// Calcul de la limite max à ne pas dépasser
		function limitMax(jElm,position,nb) {
			// declaration des variables
			startUl = $(jElm).position();
			mrgItem = $("li",jElm).css("margin-right");

			mrgItemR = stringToNumber(mrgItem);
            largeImg = parseInt(params.widthImg);
            NbShow = parseInt(params.nbShow);
            NbMove = parseInt(params.nbMove);
            realLargeItem = (largeImg+mrgItemR)*NbShow;
            // Nombre de slides (nb action)
            nbSlide = nb/NbShow;
            
            Calcul = parseInt(realLargeItem*nbSlide);
            CalculR = Calcul-position;
            halfMargin = parseInt(mrgItemR/2);
            backAdjust = parseInt(position+halfMargin);
            MaxLimit = (CalculR-backAdjust);
            
            // Calcul de la limite max avec le nombre réel de slide
            realMaxLimit = parseInt( MaxLimit-(MaxLimit/nbSlide) );

			return realMaxLimit;
		}
		
		function limitMin(jElm) {
			recupPosMin = 0;
			return recupPosMin;
		}
		
		function moveSize (Elmt,Mrg) {
			nbMove = params.nbMove;
			widthImg = params.widthImg;
			
			moveWidth = nbMove*(widthImg+Mrg);
			moveWidth = moveWidth;

			return moveWidth;
		}
		
		function findMove(startDom) {

			sup = startDom.parent('span');
			direction = sup.hasClass('dButton');
			
			if (direction != false) {
				sign = "-=";
			} else {
				sign = "+=";	
			}
			return sign;
		}
		
		// Methode de déplacement horizontale
		function moveHoriz(jElt,done,posSlide) {
		
		 	jElt.animate({
			left:done
			}, params.tempo,function(){// call back
					function recupMax(jElt){
						var nbImage = new Array;
						var returnVal = new Array;
						$("li",jElt).each(function(i){
							nbImage[i] = $("img",jElt).height();
						});
						nbElmt = nbImage.length;
						max1 = limitMax(jElt,posSlide,nbElmt); // ?
						min1 = limitMin(jElt);
						
                        // remplissage du tableau de retour
						returnVal[0] = nbElmt;
						returnVal[2] = max1;
						returnVal[3] = min1;
						
						return returnVal;
					}
				// restriction du deplacement
				now = $(this).css("left");
				lenNow = now.length;
				subNow = parseInt(now.substr(0, lenNow-2));
				
				// Récupération des infos du callBack
				recupVal = recupMax(jElt);
				recupMax = recupVal[2];
				recupMin = recupVal[3];
				
				posSlider(jElt,recupMax,recupMin,subNow);
				
			});
		}

		return this.each(function(){
			// déclaration des variables
			var obj = $(this);
			var btnRight = $("span.dButton a",obj);
			var btnLeft = $("span.gButton a",obj);
			var list = $("ul",obj);
			var dist;
			var posUl = $("ul",obj).position();
			var posUlLeft = posUl.left;
			
			// Start function
			var res = resizeSlide(obj);
			var move = moveSize (obj,res);
			var stateMove = true;
			// Evenements sur l'objet $(this)
			btnRight.click(function(){
				var targetLink = $(this);					
				direction = findMove(targetLink);
				var t = direction+move+"px";
				if (stateMove != false) {
				    moveHoriz(list,t,posUlLeft);
				}
				return false;
			});
			btnLeft.click(function(){
				var targetLink = $(this);					
				var direction = findMove(targetLink);
				var t = direction+move+"px";
				moveHoriz(list,t,posUlLeft);
				return false;				
			});
		});
	};
}) (jQuery)