

// Serialize JSON 
(function($){
    $.fn.serializeJSON=function(){
        var json={};
        jQuery.map($(this).serializeArray(),function(n,i){
            
            if(n['name'].indexOf('[]')){
                n['name'] = n['name'].split('[')[0];
            }
            
            if (json[n['name']]) {
                if (!json[n['name']].push) {
                    json[n['name']] = [json[n['name']]];
                }
                json[n['name']].push(n['value'] || '');
            } else {
                json[n['name']] = n['value'] || '';
            }
        });
        return json;
    };
})(jQuery);


/**
 * hoverIntent is similar to jQuery's built-in "hover" function except that
 * instead of firing the onMouseOver event immediately, hoverIntent checks
 * to see if the user's mouse has slowed down (beneath the sensitivity
 * threshold) before firing the onMouseOver event.
 *
 * @param  f  onMouseOver function || An object with configuration options
 * @param  g  onMouseOut function  || Nothing (use configuration options object)
 * @author    Brian Cherne brian(at)cherne(dot)net
 */
$.fn.hoverIntent = function(f,g) {
    // default configuration options
    var cfg = {
        sensitivity: 7,
        interval: 80,
        timeout: 0
    };
    // override configuration options with user supplied object
    cfg = $.extend(cfg, g ? { over: f, out: g } : f );

    // instantiate variables
    // cX, cY = current X and Y position of mouse, updated by mousemove event
    // pX, pY = previous X and Y position of mouse, set by mouseover and polling interval
    var cX, cY, pX, pY;

    // A private function for getting mouse position
    var track = function(ev) {
        cX = ev.pageX;
        cY = ev.pageY;
    };

    // A private function for comparing current and previous mouse position
    var compare = function(ev,ob) {
        ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
        // compare mouse positions to see if they've crossed the threshold
        if ( ( Math.abs(pX-cX) + Math.abs(pY-cY) ) < cfg.sensitivity ) {
            $(ob).unbind("mousemove",track);
            // set hoverIntent state to true (so mouseOut can be called)
            ob.hoverIntent_s = 1;
            return cfg.over.apply(ob,[ev]);
        } else {
            // set previous coordinates for next time
            pX = cX; pY = cY;
            // use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs)
            ob.hoverIntent_t = setTimeout( function(){compare(ev, ob);} , cfg.interval );
        }
    };

    // A private function for delaying the mouseOut function
    var delay = function(ev,ob) {
        ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
        ob.hoverIntent_s = 0;
        return cfg.out.apply(ob,[ev]);
    };

    // A private function for handling mouse 'hovering'
    var handleHover = function(e) {
        // copy objects to be passed into t (required for event object to be passed in IE)
        var ev = jQuery.extend({},e);
        var ob = this;

        // cancel hoverIntent timer if it exists
        if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); }

        // if e.type == "mouseenter"
        if (e.type == "mouseenter") {
            // set "previous" X and Y position based on initial entry point
            pX = ev.pageX; pY = ev.pageY;
            // update "current" X and Y position based on mousemove
            $(ob).bind("mousemove",track);
            // start polling interval (self-calling timeout) to compare mouse coordinates over time
            if (ob.hoverIntent_s != 1) { ob.hoverIntent_t = setTimeout( function(){compare(ev,ob);} , cfg.interval );}

            // else e.type == "mouseleave"
        } else {
            // unbind expensive mousemove event
            $(ob).unbind("mousemove",track);
            // if hoverIntent state is true, then call the mouseOut function after the specified delay
            if (ob.hoverIntent_s == 1) { ob.hoverIntent_t = setTimeout( function(){delay(ev,ob);} , cfg.timeout );}
        }
    };

    // bind the function to the two event listeners
    return this.bind('mouseenter',handleHover).bind('mouseleave',handleHover);
};


/* background resizable */    
function redimensionnement(){ 
 
    var image_width = $('.img-resize').width(); 
    var image_height = $('.img-resize').height();     
     
    var over = image_width / image_height; 
    var under = image_height / image_width; 
     
    var body_width = $(window).width(); 
    var body_height = $(window).height(); 
     
    if (body_width / body_height >= over) { 
      $('.img-resize').css({ 
        'width': body_width + 'px', 
        'height': Math.ceil(under * body_width) + 'px', 
        'left': '0px', 
        'top': Math.abs((under * body_width) - body_height) / -2 + 'px' 
      }); 
    }  

    else { 
      $('.img-resize').css({ 
        'width': Math.ceil(over * body_height) + 'px', 
        'height': body_height + 'px', 
        'top': '0px', 
        'left': Math.abs((over * body_height) - body_width) / -2 + 'px' 
      }); 
    } 
} 


/* Scrollbar */
(function($) {
	$.fn.scrollbar = function(params) {
		// Fusionner les paramêtres par défaut et ceux de l'utilisateur
		params = $.extend( {
			taille_englobe: 'auto',			//Taille de l'espace visible - /!\ Doit être un nombre ou 'auto'
			taille_scrollbar: "auto",		//Taille de la scrollbar - /!\ Doit être un nombre ou 'auto'
			taille_bouton: 50,				//Taille du bouton - /!\ Doit être un nombre
			pas:75,							//Pas du scroll molette - /!\ Doit être un nombre ou 'auto'
			molette: true,					//Détection du scroll molette - /!\ 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:'haut',	//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: 15,		//Marge entre la scrollBar et le contenu - /!\ Doit être un nombre
			largeur_scrollbar:5,				//Largeur de la scrollbar
                        width : 0                         //Largeur sur laquelle le texte va être interprété si appliquer avant affichage - /!\ Doit être un nombre
		}, params);
		
		return this.each(function() {
			var $$ = $(this);
                        
			var taille_englobe_init = params.taille_englobe;
			var taille_scrollbar_init = params.taille_scrollbar;
			
			//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_scrollbar - 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();}
				$('.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()}
				$('.englobe',$$).css({'top':depl_contenu+"px"});
			}
			
			function styler_scrollbar(position,orientation){
				var type_marge_position;
				var marge_position;
				var marge_orientation;
                                var marge;
                                
				switch (position){
					case 'droite':
						$('.englobe',$$).after('<div class="scrollbar"><div class="bouton">&nbsp;</div></div>');
						$('.scrollbar',$$).css({'margin-left':params.marge_scroll_contenu+'px'});
					break;
					case 'gauche':
						$('.englobe',$$).before('<div class="scrollbar"><div class="bouton">&nbsp;</div></div>');
						$('.scrollbar',$$).css({'margin-right':params.marge_scroll_contenu+'px'});
					break;
				}
                                
				switch (orientation){
					case 'haut':
						$('.scrollbar',$$).css({'margin-top':'0px'});
					break;
					case 'centre':
						marge = (params.taille_englobe -params.taille_scrollbar)/2;
						$('.scrollbar',$$).css({'margin-top':marge+'px'});
					break;
					case 'bas':
						marge = params.taille_englobe -params.taille_scrollbar;
						$('.scrollbar',$$).css({'margin-top':marge+'px'});
					break;
				}
			}
                        
			var padTop=0;
			var padBot=0;
			//Hauteur du contenu
                        var taille_contenu = 0;
                        $$.children().each(function(){
                            var div   = $('<div id="temp"></div>').css({'top':'-3000px','position':'absolute','display':'block'});
                            if(params.width != 0){
                                div.css({'width':params.width});
                            }
                            var clone = $(this).clone();
                            div.append($(this).html()).appendTo('body').show();
                            taille_contenu += parseInt(div.height(),10);
                            div.remove();
                        });
                        
			function calcul_hauteur_auto(){
				if(params.taille_englobe == "auto"){
					padTop = $$.css('padding-top');
					padTop = padTop.substring(0,padTop.length-2);
					
					padBot = $$.css('padding-bottom');
					padBot = padBot.substring(0,padBot.length-2);
					params.taille_englobe = $(window).height()-40-padBot-padTop;
					return true;
				}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 "englobe" si hauteur_srollbar="auto"
					if(params.taille_scrollbar == "auto"){params.taille_scrollbar = params.taille_englobe;}
					//La taille de la scrollbar doit être infêrieur ou égale à la taille de taille_englobe
					if(params.taille_scrollbar > params.taille_englobe){						
						params.taille_scrollbar = 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_scrollbar_init == "auto"){
							params.taille_scrollbar = params.taille_englobe;
							$('.scrollbar',$$).css({'height':params.taille_scrollbar+'px'});
							deplacement_bouton($(".englobe",$$).css('top').substring(0,$(".englobe",$$).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
                                var html = $$.html();
                                
				$$.wrapInner('<div class="englobe"></div>');
				$$.css({'height':params.taille_englobe+'px','overflow':'hidden','position':'relative'});
				$(".englobe",$$).css({'top':0+'px','float':'left','position':'relative','width':temp+'px'});	
				
				//On construit la scrollBar
				styler_scrollbar(params.position,params.alignement_scrollbar);
				
				$$.append('<div class="clear"></div>');
				$(".clear",$$).css({'clear':'both'});
				
				switch (params.style) {
					case 'basic':
						//Style de la scrollBar
						$('.scrollbar',$$).css({'width':params.largeur_scrollbar+'px',
											'float':'left',
											'height':params.taille_scrollbar+'px',
											'background':'#ebd9b3'		
						});
				
						//Style du bouton de la scrollBar
						$(".bouton",$$).css({'width':params.largeur_scrollbar+'px',
										'height':params.taille_bouton+'px',
										'background':'#cda042',
										'top':0+'px',
										'cursor':'pointer'
										});
					break;
				}

				
				
				//Si le drag du bouton est activé(true)
				if(params.drag){
					$(".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 = $('.englobe',$$).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 = $('.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}
							$('.englobe',$$).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
							if(top_contenu < calcul_contenu_top_max()){top_contenu = calcul_contenu_top_max()}
							$('.englobe',$$).css({'top':top_contenu+"px"});							
						}
						
						//calcul de déplacement du bouton					
						deplacement_bouton(top_contenu);
						
						if(params.debug){affiche_position();}
					});
				}
				
				//Affiche la console de debug
				if(params.debug){
					$$.after('<div id="debug"></div>');
					$('#debug').css({'position':'fixed','top':'200px','right':'50px', 'border':'2px solid #EF9700','background':'#FFDC9F','padding':'0px'})				
					.append('<p id="hauteurcontenu">Hauteur du contenu:'+taille_contenu+'</p>')
					.append('<p id="hauteurenglobe">Hauteur de l\'espace visible:'+params.taille_englobe+'</p>')
					.append('<p id="hauteurscrollbar">Hauteur du srcoll:'+params.taille_scrollbar+'</p>')
					.append('<p id="hauteurbouton">Hauteur du bouton:'+params.taille_bouton+'</p>')
					.append('<p id="topcontenu">Top du contenu:'+$$.css('top')+'</p>')
					.append('<p id="topbouton">Top du bouton:'+$('.bouton').css('top')+'</p>')
					.append('<p id="topmaxbouton">Top max du bouton:'+calcul_contenu_top_max()+'</p>')
					.append('<p id="topmaxcontenu">Top max du contenu:'+calcul_bouton_top_max()+'</p>')
					.children().css({'margin':'0','padding':'5px'});
					
					//Fonction de mise à jour des infos de la console de debug
					function affiche_position(){
						$("#hauteurcontenu").html('Hauteur du contenu:'+taille_contenu);
						$("#hauteurenglobe").html('Hauteur de l\'espace visible:'+params.taille_englobe);
						$("#hauteurscrollbar").html('Hauteur du srcoll:'+params.taille_scrollbar);
						$("#hauteurbouton").html('Hauteur du bouton:'+params.taille_bouton);
						$("#topcontenu").html('Top du contenu:'+$('.englobe').css('top'));
						$("#topbouton").html('Top du bouton:'+$('.bouton').css('top'));
						$("#topmaxbouton").html('Top max du bouton:'+calcul_contenu_top_max());
						$("#topmaxcontenu").html('Top max du contenu:'+calcul_bouton_top_max());
					}
				}	
			}else{
//				alert('Pas de scrollbar');
			}
        });
	}
})(jQuery);


function t() {  
    var time = new Date();  
    return time.getTime();  
}  
