/**
 * Ce fichier contient tous les scripts du site http://azurbicycle.fr
 * 
 * @author Nicolas Vergnes
 * @version 1.0
 * @date 31/12/2011
 */

/**
 * jQuery en mode "no conflicts"
 */
jQuery.noConflict();
var $j = jQuery;


//---------------------------------------------------------------------------------------------------------------------------------------

/**
 * Fonction de gestion du widget Tabs 
 * 
 * @param {String} tabNavigationItem Sélecteur CSS des items du menu de navigation
 * @param {String} tabNavigationLink Sélecteur CSS des liens des items du menu de navigation
 * @param {String} tabContent Sélecteur CSS du contenu des tabs
 * @param {String} activeTabCssClass Classe CSS pour styler la tab active
 * @param {String} style Style d'animation { 'simple' -> sans effets, 'slideUpSlideDown' -> avec effet glissant }
 */
function manageTabsWidget( tabNavigationItem,
		tabNavigationLink,
		tabContent,
		activeTabCssClass,
		style ) {
	
	/**
	 * Partie 0 : Initialisations
	 */
	var url = null; // Variable temporaire pour stocker des urls
	var i = 0; // Variable de comptage
	var anchor = null; // Pour stocker une ancre
	
	// Récupération de référence sur les objets jQuery, on fait cette opération coûteuse de parsing du DOM initialement, une seule fois
	var $tabNavigationItem = $j( tabNavigationItem );
	var $tabNavigationLink = $j( tabNavigationLink );
	var $tabContent = $j( tabContent );		
	
	/**
	 * Partie 1 : Ajout d'un comportement par le callback du click sur un lien de navigation du widget Tabs
	 */
	$tabNavigationLink.click( function( event ) {		
		
		// On récupère l'url du lien qui vient d'être cliqué
		url = this.href;
		
		// On parse et on ne récupère que la partie correspondant à l'ancre dans l'url (on récupère la partie de l'url située après le caractère "#" y compris)
		anchor = null;
		anchor = url.substring( url.lastIndexOf( "#" ) );
		
		// On recherche quelle tab était actuellement active
		i = 0;		
		while ( ( i < $tabNavigationItem.length ) // On vérifie de ne pas partir dans une boucle infinie 
				&& ( ! $tabNavigationItem.eq( i ).hasClass( activeTabCssClass ) ) ) { // On teste si le i-ème lien est actif, on connaitra ainsi l'index de la tab active
			i++;
		}
		
		// Stockage d'une référence sur le contenu actif actuel
		var $activeTabContent = $tabContent.eq( i );
		
		// Stockage d'une référence sur le prochain contenu actif
		var $newActiveTabContent = $j( tabContent + anchor );
		
		// On ne modifie l'état du widget que si :
		// - la tab demandée n'est pas déjà active (donc visible), sinon on n'a rien à faire!
		// - que si on a bien trouvé une ancre dans l'attribut href du lien, sinon on ne sait pas quoi faire, donc autant ne rien faire! Note : ce cas est théoriquement impossible...
		if ( ( anchor != null ) && ( ! $newActiveTabContent.is( ':visible' ) ) ) {
			// On teste le style d'effet choisi
			switch ( style ) {				
			case 'slideUpSlideDown':
				// On cache la tab active			
				$activeTabContent.slideUp( 'slow', function() {
					// Fonction de callback, on peut ainsi chainer les animations de manière séquentielles (par défaut elles seraient simultanées)
					// On sélectionne la tab qui porte le même id que l'ancre
					$newActiveTabContent.slideDown( 'slow' );
				} );
				break;
			
			default: // Le cas : 'simple' est englobé dans le cas par défaut
				$activeTabContent.hide();
				$newActiveTabContent.show();
				break;
			}										
		}
		
		// On actualise les classes pour indiquer quelle tab est active
		$tabNavigationItem.removeClass( activeTabCssClass );
		$j(this).parent().addClass( activeTabCssClass );
		
		// On interdit au navigateur de replacer la page juste au dessus de l'ancre ciblée par le bouton, le widget Tabs 
		// restera ainsi au même endroit même en changeant de tab
		event.preventDefault();
		
		return false;
	} );
	
	/**
	 * Partie 2 : Au chargement de la page, on analyse l'url. Si l'url comprend une ancre, on simule un click utilisateur sur la tab adéquate pour 
	 * afficher le bon contenu. Sinon on laisse la première tab active par défaut.
	 */
	// On récupère l'url de la page courante
	url = location.href;
	
	// On parse et on ne récupère que la partie correspondant à l'ancre dans l'url (on récupère la partie de l'url située après le caractère "#" y compris)	
	var anchorIndex = url.lastIndexOf( "#" );
	
	// On n'exécute le bloc d'instructions suivant que si on a bien trouvé la caractère "#" dans l'url, sinon on a une url standard sans 
	// ancre. Dans ce cas il n'y a donc rien à faire car la première tab est affichée par défaut.
	if ( anchorIndex != -1 ) {				
		// On extrait l'ancre de l'url
		anchor = null;
		anchor = url.substring( anchorIndex );
		
		// On cherche l'élément du tableau précédent qui pointe vers le lien qui a pour href l'ancre extraite de l'url courante
		i = 0;
		while ( ( i < $tabNavigationLink[ i ].length ) && ( $tabNavigationLink[ i ].hash != anchor ) )
			i++;
		
		// On simule le click utilisateur sur ce lien pour positionner la bonne tab au chargement de la page
		$tabNavigationLink.eq( i ).trigger( 'click' ); // On renvoi donc la balle à la partie 1 pour faire le travail...
	}
}

//---------------------------------------------------------------------------------------------------------------------------------------

function styleProductCategoriesList() {
	//--- Widget des catégories
	// Un peu de CSS pour améliorer les listes imbriquées
	$j( '#primary.catalog ul li a' ).not( '#primary.catalog ul.children li a' ).css( { 'font-weight': 'bold' } );
	$j( '#primary.catalog ul' ).not( '#primary.catalog ul.children' ).css( { 'margin-left': 10 } );
	$j( '#primary.catalog ul li' ).not( '#primary.catalog ul.children li' ).css( { 'padding-bottom': '2px' } );
	$j( '#primary.catalog ul.children, #primary.catalog ul li' ).css( {'margin-left' : 0} );
	
	// On indente avec des tirets pour marquer la hiérarchie des catégories
	$j( '#primary.catalog ul.children li a' ).prepend( '---' );
	$j( '#primary.catalog ul.children ul.children li a' ).prepend( '---' );
	$j( '#primary.catalog ul.children ul.children ul.children li a' ).prepend( '---' );
	$j( '#primary.catalog ul.children ul.children ul.children ul.children li a' ).prepend( '---' );
	$j( '#primary.catalog ul.children ul.children ul.children ul.children ul.children li a' ).prepend( '---' );
	$j( '#primary.catalog ul.children ul.children ul.children ul.children ul.children ul.children li a' ).prepend( '---' );
	
	
	//--- Page de présentation du catalogue
	// Un peu de CSS pour améliorer les listes imbriquées
	$j( '#content ul.product_categories li a' ).not( '#content ul.children li a' ).css( { 'font-weight': 'bold' } );	
	$j( '#content ul.product_categories li' ).not( '#content ul.children li' ).css( { 'padding-bottom': '2px' } );
	$j( '#content ul.children, #content ul.product_categories li' ).css( {'margin-left' : 0} );
	
	// On indente avec des tirets pour marquer la hiérarchie des catégories
	$j( '#content ul.children li a' ).prepend( '---' );
	$j( '#content ul.children ul.children li a' ).prepend( '---' );
	$j( '#content ul.children ul.children ul.children li a' ).prepend( '---' );
	$j( '#content ul.children ul.children ul.children ul.children li a' ).prepend( '---' );
	$j( '#content ul.children ul.children ul.children ul.children ul.children li a' ).prepend( '---' );
	$j( '#content ul.children ul.children ul.children ul.children ul.children ul.children li a' ).prepend( '---' );
}

//---------------------------------------------------------------------------------------------------------------------------------------

/**
 * @author VergnesDeveloppement.com
 * 
 * Automatic infinite carousel with sliding effect
 * 
 * Parameter to choose : delay between 2 slides
 * 
 * This script is VergnesDeveloppement's property.
 */
var adSlider = {
		/* Parameters to define */
		/**
		 * Width of each ad, including image width and right margins
		 */
		adWidth : 170,
		
		/**
		 * Delai between 2 slides in miliseconds
		 */
		tempo : 4000,

		/**
		 * Parameter to hide left first ad margin
		 */
		offset : -13,

		/**
		 * Timer to do an automatic slider
		 */
		timer : null,

		/**
		 * Initialization method
		 */
		init : function() {

			/* The scroll overflow property is replaced by hidden overflow */
			$j('#featuredAds').css({'overflow': 'hidden'});

			/* Ads collection is moved to the left */
			$j('#featuredAds .ads').css({'left': -this.adWidth + this.offset});


			/* Show control button (to force sliding) */
			$j('#leftSliderButton').css('display', 'block');
			$j('#rightSliderButton').css('display', 'block');

			/* Modify behavior of control buttons sliding on hover */
			// left button
			$j('#leftSliderButton').mouseover(function() { 
				$j(this).css({					
                         'background-position': '0 -80px',
                         'background-repeat': 'no-repeat',
					'z-index': '10',
					'cursor': 'pointer'
				});
				
				adSlider.stop();
			}).mouseout(function() {
				$j(this).css({
                         'background-position': '0 0',
                         'background-repeat': 'no-repeat',
                         'cursor': 'pointer'
				});
				
				adSlider.play();
			});
			// right button
			$j('#rightSliderButton').mouseover(function() { 
				$j(this).css({
                         'background-position': '-35px -80px',
                         'background-repeat': 'no-repeat',
					'z-index': '10',
					'cursor': 'pointer'
				});
				
				adSlider.stop();
			}).mouseout(function() {
				$j(this).css({
                         'background-position': '-35px 0',
                         'background-repeat': 'no-repeat',                      
                         'cursor': 'pointer'
				});
				
				adSlider.play();
			});

			// timer creation
			this.play();

			// stop on adSlider hover
			$j('#featuredAds .ad').mouseover(function() {
				adSlider.stop();
			}).mouseout(function() {
				adSlider.play();
			});
		},

		/**
		 * Next automatic slide (to the left)
		 */
		next : function() {
			this.slideToLeft();
		},

		/**
		 * Stop sliding
		 */
		stop : function() {
			window.clearInterval(this.timer);
		},

		/**
		 * Run again sliding
		 */
		play : function() {
			window.clearInterval(this.timer);
			this.timer = window.setInterval('adSlider.next()', this.tempo);
		},

		/**
		 * Slide all ads from the right to the left
		 */
		slideToLeft : function() {
			// Calculus of length to slide
			var leftIndent = parseInt($j('#featuredAds .ads').css('left')) - this.adWidth;

			// Make the sliding effect using jquery's animate with callback function
			$j('#featuredAds .ads:not(:animated)').animate({'left': leftIndent}, 500, function() {				
				
				/// Move the first ad after the last ad
				$j('#featuredAds .ad:last').after($j('#featuredAds .ad:first'));

				// Initialize again relative position
				$j('#featuredAds .ads').css({'left': -adSlider.adWidth + adSlider.offset});
			});		
		},

		/**
		 * Slide all ads from the left to the right
		 */
		slideToRight : function() {
			// Calculus of length to slide
			var leftIndent = parseInt($j('#featuredAds .ads').css('left')) + this.adWidth;

			// Make the sliding effect using jquery's animate with callback function
			$j('#featuredAds .ads:not(:animated)').animate({'left': leftIndent}, 500, function() {
				
				// Move the last ad before the first ad
				$j('#featuredAds .ad:first').before($j('#featuredAds .ad:last'));

				// Initialize again relative position
				$j('#featuredAds .ads').css({'left': -adSlider.adWidth + adSlider.offset});
			});        
		},

		/**
		 * Main function : play the infinite ads slider
		 */
		runAdSlider : function() {
			// Put all control sliding buttons in an array
			var $buttons = $j('.sliderButton');

			// Move the last ad before the first ad
			$j('#featuredAds .ad:first').before($j('#featuredAds .ad:last'));

			// Click on left button (sliding to the right side) 
			$buttons.eq(0).click(function() {
				adSlider.slideToRight();
			});

			// Click on right button (sliding to the left side)
			$buttons.eq(1).click(function() {
				adSlider.slideToLeft();
			});	
		}

} // end of "adSlider" class definition

//---------------------------------------------------------------------------------------------------------------------------------------


/**
 * Fonction principale lancée juste à la fin du chargement
 * de la page
 */
jQuery(document).ready(function() {	
	/**
	 * Activation du widget Tabs "produit" sur la page détaillée (widget jQuery UI) (s'il y en a un)
	 */
	if ( $j( '.ui-wigdet-tabs' ) ) {
		
		$j( '.ui-widget-tabs-content h2' ).hide();
		
		manageTabsWidget( '.ui-widget-tabs-nav li', // tabNavigationItem
				'.ui-widget-tabs-nav a', // tabNavigationLink
				'.ui-widget-tabs-content', // tabContent 
				'ui-widget-tab-active', // activeTabCssClass
				'simple' ); // pas d'effet pour changer de tab
	}

	
	/**
	 * Gestion du champ de recherche dans le header du site à droite
	 */
	$j('.s').val("Rechercher sur le site").css({'color': '#a7a9b6'});
	
	$j('.s').blur(function() {
		$j('.s').val("Rechercher sur le site").css({'color': '#a7a9b6'});
	});

	
	/**
	 * Stylisation javascript des archives du blog (ajout d'un tiret devant
	 * chaque élément et correction de la marge gauche)
	 */
	$j( '.widget_archive ul li' ).css( { 'margin-left': 10 } );
	$j( '.widget_archive ul li a' ).prepend( '- ' );


	/**
	 * Stylisation javascript des listes de catégories du catalogue
	 */
	styleProductCategoriesList();
	
	
	/**
	 * Gestion du carrousel des produits défilant, sous le header
	 */
	// If there is some ads to show
	if ($j('#featuredAds .ads').find('.ad').length > 0) {          
		adSlider.init();
		adSlider.runAdSlider();
	}
	// If ad slider is empty, we hide its
	else {
		$j('#adSlider').children().hide();
	}
});

