// modules.imgslider.lib.js.carousel-fr-fr 
;(function($){

	// IMAGES PRELOADER
	$.fn.carousel = function(params)
	{
		var params = $.extend({
			direction: "horizontal",
			loop: false,
			dispItems: 1,
			pagination: false,
			miniatures: false,
			miniaturesMargin: 0,
			page: 0,
			paginationPosition: "inside",
			pagiminiatures: false,
			rolloverpagination: false,
			rolloverbackgroundcolor: '#CCCCCC',
			rolloverbordercolor: '#000000',
			rolloverbordersize: 1,
			nextBtn: '<span role="button"></span>',
			prevBtn: '<span role="button"></span>',
			btnsPosition: "outside",
			nextBtnInsert: "appendTo",
			prevBtnInsert: "prependTo",
			nextBtnInsertFn: false,
			prevBtnInsertFn: false,
			autoSlide: false,
			autoSlideInterval: 3000,
			activeRelativePageMiniatures: true,
			btnAutoSlide: false,
			btnAutoSlidePosition: "top-right",
			visualbtnscarrousel: false,
			btnMargin: 0,
			combinedClasses: false,
			effect: "slide",
			slideEasing: "swing",
			animSpeed: "normal",
			equalWidths: "true",
			callback: function(){},
			useAddress: false,
			adressIdentifier: "carousel",
			useBtNav: true,
			carouselWidth: 0,
			carouselHeight: 0,
			miniatureWidth: 0,
			miniatureHeight: 0
		}, params);

		// Preload images
		var carousel = $(this);
		var carouselParams = params;

		return this.each(function(){
			var carousel_preload_count = $(this).children().children().length;
			var miniatures_preload_count = 0;
			var carousel_preload_ready = 0;

			var images = {};

			// Preload Carrousel Img
			$(this).children().children().each(function(index){

				// Image with link
				if($(this).children().children().length > 0) {
					var image=$(this).children().children().get(0);
				}

				// Image without link
				else {
					var image=$(this).children().get(0);
				}

				$(this).addClass('hidden'); // Hide li
				images[index] = ({'type':'display', 'url':$(image).attr('src')});
			});

			// Preload Miniature Img
			if(params.miniatures){
				// Count items
				var miniatures_location = $('.mini-' + carouselParams.carouselId).children().children();
				miniatures_preload_count = miniatures_location.children().length;
				miniatures_location.children().each(function(index){
					var miniature = $(this).children().get(0);
					$(this).addClass('hidden');
					images[(index+carousel_preload_count)] = ({'type':'miniature', 'url':$(miniature).attr('src')});
				});
			}
			
			if(!params.miniatures && params.rolloverpagination)
			{
				for (var a in params.pagiminiatures)
				{			
					miniatures_preload_count++;
					images[(carousel_preload_count + parseInt(a))] = ({'type':'miniature', 'url':params.pagiminiatures[a]});
				}

			}
			
			for (var i in images){
				// Image Object
				var preloadImage = new Image();
				preloadImage.type = images[i].type;
				preloadImage.onload = function()
				{
					if(this.type == "display"){
						// Set Display's Max-Width
						if(this.width > carouselParams.carouselWidth) {
							carouselParams.carouselWidth = this.width;
						}

						// Set Display's Max-Height
						if(this.height > carouselParams.carouselHeight) {
							carouselParams.carouselHeight = this.height;
						}
					}

					else {
						// Set Miniature's Max-Width
						if(this.width > carouselParams.miniatureWidth) {
							carouselParams.miniatureWidth = this.width;
						}

						// Set Miniature's Max-Height
						if(this.height > carouselParams.miniatureHeight) {
							carouselParams.miniatureHeight = this.height;
						}
					}

					if (++carousel_preload_ready == (carousel_preload_count + miniatures_preload_count)) {
						carousel.carouselrun(carouselParams);
					}

				}
				preloadImage.src = images[i].url;
			}

		});
	}

	$.fn.carouselrun = function(params){
		// Buttons position
		if (params.direction == "vertical"){
			params.prevBtnInsert = "insertBefore";
			params.nextBtnInsert = "insertAfter";
		}

		return this.each(function(){

			// Env object
			var env = {
				$elts: {},
				params: params,
				launchOnLoad: []
			};

			// Carousel main container
			env.$elts.carousel = $(this).addClass("js"); // correspond à div class="carousel big js"

			// Carousel content
			env.$elts.content = $(this).children().css({position: "absolute", "top": 0}); // correspond à ul

			// Content wrapper
			env.$elts.wrap = env.$elts.content.wrap('<div class="carousel-wrap"></div>').parent().css({overflow: "hidden", position: "relative"});
			env.$elts.carrouselnavigation = env.$elts.wrap.wrap('<div class="carrousel-navigation"></div>');


			// env.steps object
			env.steps = {
				first: 0,
				count: env.$elts.content.children().length
			};

			// Last visible step
			env.steps.last = env.steps.count - 1;

			// Prev Button
			if ($.isFunction(env.params.prevBtnInsertFn)) {
				env.$elts.prevBtn = env.params.prevBtnInsertFn(env.$elts);
			}

			else {
				env.$elts.prevBtn = $(params.prevBtn)[params.prevBtnInsert](env.$elts.carousel);
			}

			// Next Button
			if ($.isFunction(env.params.nextBtnInsertFn)) {
				env.$elts.nextBtn = env.params.nextBtnInsertFn(env.$elts);
			}

			else {
				env.$elts.nextBtn = $(params.nextBtn)[params.nextBtnInsert](env.$elts.carousel);
			}

			// Add buttons classes / data
			env.$elts.nextBtn.addClass("carousel-control next carousel-next" + " " + env.params.direction);
			env.$elts.prevBtn.addClass("carousel-control previous carousel-previous" + " " + env.params.direction);

			if(!env.params.useBtNav) {
				env.$elts.nextBtn.addClass("hidden");
				env.$elts.prevBtn.addClass("hidden");
			}


			// Bind events on next / prev buttons
			initButtonsEvents(env);

			// Address plugin
			initAddress(env);

			// On document load...
			$(function(){

				// First item
				var $firstItem = env.$elts.content.children(":first");

				// Width 1/3 : Get default item width
				var maxW = env.params.carouselWidth;
				env.itemWidth = maxW;

				var maxH = env.params.carouselHeight;
				env.itemHeight = maxH;

				// Width 2/3 : Define content width
				env.$elts.content.children().each(function(){
					$(this).width(maxW);
						$(this).height(maxH);
						$(this).removeClass('hidden');
				});

				if (params.direction == "vertical"){
					env.$elts.nextBtn.css('width', maxW).css('margin-top', env.params.btnMargin);
					env.$elts.prevBtn.css('width', maxW).css('margin-bottom', env.params.btnMargin);
					env.contentWidth = env.itemWidth;
					env.$elts.content.parent().css('width', maxW).css('height', maxH * env.params.dispItems);
					env.$elts.carrouselnavigation.parent().css('width', maxW);
				}

				else {
					env.$elts.carrouselnavigation.parent().addClass('horizontal');
					env.$elts.nextBtn.css('height', maxH).css('margin-left', env.params.btnMargin);
					env.$elts.prevBtn.css('height', maxH).css('margin-right', env.params.btnMargin);;
					env.contentWidth = env.itemWidth * env.steps.count;
					env.$elts.content.parent().css('width', maxW * env.params.dispItems).css('height', maxH);
					env.$elts.carrouselnavigation.parent().css('width', (maxW * env.params.dispItems));
				}

				// Width 3/3 : Set content width to container
				env.$elts.content.width( env.contentWidth );

				// Height 1/2 : Get default item height
				env.itemHeight = $firstItem.outerHeight();

				// Height 2/2 : Set content height to container
				if (params.direction == "vertical"){
					env.$elts.content.css({height:env.itemHeight * env.steps.count + "px"});
					env.$elts.content.parent().css({height:env.itemHeight * env.params.dispItems + "px"});

				} else {
					env.$elts.content.parent().css({height:env.itemHeight + "px"});
				}

				// Launch function added to "document ready" event
				$.each(env.launchOnLoad, function(i,fn){
					fn();
				});

				// Miniatures
				if(env.params.miniatures) {
					initMiniatures(env)
				}

				// Pagination
				if (env.params.pagination) {
					initPagination(env);
				}

				// Update Next / Prev buttons state
				updateButtonsState(env);


				// Bouton AutoSlide
				if(env.params.btnAutoSlide) {
					initBtnAutoSlide(env);
					getPositionOfAutoSlideBtn(env, env.params.btnAutoSlidePosition);
				}

				// Load customs buttons
				if(env.params.visualbtnscarrousel)
				{
					switch (env.params.direction)
					{
						case 'horizontal':
							// Carousel buttons
							if(env.params.visualbtnscarrousel["next"] != "null") {
								env.$elts.nextBtn.css('background-image', 'url('+ env.params.visualbtnscarrousel["next"]["url"] + ')').css('width', env.params.visualbtnscarrousel["next"]["width"]);
							}
							if(env.params.visualbtnscarrousel["prev"] != "null") {
								env.$elts.prevBtn.css('background-image', 'url('+ env.params.visualbtnscarrousel["prev"]["url"] + ')').css('width', env.params.visualbtnscarrousel["prev"]["width"]);
							}

							// Miniatures buttons
							if(env.params.visualbtnscarrousel["next-mini"] != "null" && env.params.miniatures){
								env.$elts.miniBtnNext.css('background-image', 'url('+ env.params.visualbtnscarrousel["next-mini"]["url"] + ')');
							}
							if(env.params.visualbtnscarrousel["prev-mini"] != "null" && env.params.miniatures){
								env.$elts.miniBtnPreced.css('background-image', 'url('+ env.params.visualbtnscarrousel["prev-mini"]["url"] + ')');
							}

						break;

						case 'vertical':
							// Carousel buttons
							if(env.params.visualbtnscarrousel["next"] != "null") {
								env.$elts.nextBtn.css('background-image', 'url('+ env.params.visualbtnscarrousel["next"]["url"] + ')').css('height', env.params.visualbtnscarrousel["next"]["height"]);
							}

							if(env.params.visualbtnscarrousel["prev"] != "null") {
								env.$elts.prevBtn.css('background-image', 'url('+ env.params.visualbtnscarrousel["prev"]["url"] + ')').css('height', env.params.visualbtnscarrousel["prev"]["height"]);
							}

							// Miniatures buttons
							if(env.params.visualbtnscarrousel["next-mini"] != "null" && env.params.miniatures){
								env.$elts.miniBtnNext.css('background-image', 'url('+ env.params.visualbtnscarrousel["next-mini"]["url"] + ')');
							}
							if(env.params.visualbtnscarrousel["prev-mini"] != "null" && env.params.miniatures){
								env.$elts.miniBtnPreced.css('background-image', 'url('+ env.params.visualbtnscarrousel["prev-mini"]["url"] + ')');
							}

						break;
					}
				}

				// Launch autoslide
				if (env.params.autoSlide){
					playAutoSlide(env);
				}
			});

		});

	};

	// Next / Prev buttons events only
	function initButtonsEvents(env){

		env.$elts.nextBtn.add(env.$elts.prevBtn)

			.bind("enable", function(){

				var $this = $(this)
					.unbind("click")
					.bind("click", function(){
						goToStep( env, getRelativeStep(env, ($this.is(".next")? "next" : "prev" )) );
						stopAutoSlide(env);

						// Get relative page of miniatures
						getRelativePageOfMiniatures(env);

					})
					.removeClass("disabled");

				// Combined classes (IE6 compatibility)
				if (env.params.combinedClasses) {
					$this.removeClass("next-disabled previous-disabled");
				}
			})
			.bind("disable", function(){

				var $this = $(this).unbind("click").addClass("disabled");

				// Combined classes (IE6 compatibility)
				if (env.params.combinedClasses) {

					if ($this.is(".next")) {
						$this.addClass("next-disabled");

					} else if ($this.is(".previous")) {
						$this.addClass("previous-disabled");

					}
				}
			})
			.hover(function(){
				$(this).toggleClass("hover");
			});
	};

	// Pagination
	function initPagination(env){
		env.$elts.pagination = $('<div class="center-wrap"><div class="carousel-pagination"><ul class="pagi"></ul></div></div>').insertAfter(env.$elts.nextBtn).find("ul");
		if(env.params.direction == "vertical"){
			env.$elts.pagination.parent().parent().css('width', env.$elts.carrouselnavigation.outerWidth());
			env.$elts.pagination.parent().addClass('vertical');
		}
		else{
			env.$elts.pagination.parent().addClass('horizontal');
			env.$elts.pagination.parent().parent().appendTo(env.$elts.content.parents('.carrousel-navigation'));
		}
		env.$elts.paginationBtns = $([]);

		env.$elts.content.find("li").each(function(i){
			if (i % env.params.dispItems == 0) {
				if(env.params.rolloverpagination){
					env.$elts.paginationBtns = env.$elts.paginationBtns.add( $('<li><a role="button"><span>'+( env.$elts.paginationBtns.length + 1 )+'</span></a><div class="block-mini"><ul class="ul-pagi-mini"></ul></div></li>').data("firstStep", i) );
				}

				else {
					env.$elts.paginationBtns = env.$elts.paginationBtns.add ( $('<li><a role="button"><span>'+( env.$elts.paginationBtns.length + 1 )+'</span></a></li>').data("firstStep", i) );
				}
			}
		});
		
		if(env.params.rolloverpagination){
			env.$elts.paginationBtns.each(function(i){
				for(z=i*env.params.dispItems;z<((i*env.params.dispItems)+parseInt(env.params.dispItems));z++)
				{
					if(z < env.steps.count) {
						$(this).children('div').children('ul').append('<li class="pagi-mini"><img src="'+ env.params.pagiminiatures[z] +'"/></li>');
					}
				}
			});
		}

		env.$elts.paginationBtns.appendTo(env.$elts.pagination);

		env.$elts.paginationBtns.slice(0,1).addClass("active");

		// Events (click pagination)
		env.$elts.paginationBtns.each(function(i){
			$(this).click(function(){
				if(env.params.rolloverpagination){
					$(this).children('div').fadeOut('fast');
				}
				goToStep(env, $(this).data("firstStep"));
				stopAutoSlide(env);
				getRelativePageOfMiniatures(env);
			});
		});

		if(env.params.rolloverpagination)
		{
			// Events (hover pagination)
			env.$elts.paginationBtns.each(function(i){
				
				// Fix margin-top
				var fixmargin = 0;
				
				if($.browser.msie){
					fixmargin = env.params.miniatureHeight + (env.params.rolloverbordersize*2);
				}
				
				else{
					fixmargin = $(this).children('div').outerHeight();
				}
				
				$(this).children('div').css('margin-top', -(fixmargin + 30 + (env.params.rolloverbordersize*2))).css('background', env.params.rolloverbackgroundcolor).css('border-color', env.params.rolloverbordercolor).css('border-width', env.params.rolloverbordersize);
		        $(this).hover(function(){
		        	$(this).children('div').stop(true, true).fadeIn().css('display', 'block');
				 },function(){
					$(this).children('div').fadeOut('fast').css('display', '');
				});
		    });
		}
	};

	// Miniatures
	function initMiniatures(env){

		// Initialize
		var maxMiniatureWidth = 0;
		var maxMiniatureHeight = 0;

		// Define elements
		env.$elts.miniwrap = env.$elts.content.parents('.js').nextAll('.mini-' + env.params.carouselId);
		env.$elts.miniatures = env.$elts.miniwrap.children();
		env.$elts.minicarrousel = env.$elts.miniatures.find('.mini-carrousel');


		// AppendTo
		env.$elts.miniwrap.appendTo(env.$elts.content.parents('.carrousel-navigation'));

		// Get Max-width and Max-height of miniatures
		maxMiniatureWidth = env.params.miniatureWidth;
		maxMiniatureHeight = env.params.miniatureHeight;

		// Define max-width and max-height + margin of miniatures
		env.miniatureWidth = (maxMiniatureWidth + env.params.miniaturesMargin);
		env.miniatureHeight = (maxMiniatureHeight + env.params.miniaturesMargin);

		// Get minicarousel options
		env.minioptions = miniCarouselOptions(env);

		// Active or not btns previous and next
		env.minioptions.btnPosition.before('<span class="mini-preced"></span>').after('<span class="mini-next"></span>');

		// Define Btns
		env.$elts.miniBtnPreced = env.$elts.miniwrap.find('.mini-preced');
		env.$elts.miniBtnNext = env.$elts.miniwrap.find('.mini-next');

		// Custom buttons
		var tmaxMiniWidth = 10;
		var tmaxMiniHeight = 10;
		var zmaxMiniWidth = maxMiniatureWidth;
		var zmaxMiniHeight = maxMiniatureHeight;

		if(env.minioptions.nbPages <= 1) {
			env.$elts.miniBtnPreced.addClass('hidden');
			env.$elts.miniBtnNext.addClass('hidden');
		}

		else {
			if(env.params.visualbtnscarrousel["next-mini"] != "null"){

				// Width
				if(env.params.visualbtnscarrousel["next-mini"]["width"] > tmaxMiniWidth){
					tmaxMiniWidth = env.params.visualbtnscarrousel["next-mini"]["width"];
				}
				if(env.params.visualbtnscarrousel["next-mini"]["width"] > zmaxMiniWidth){
					zmaxMiniWidth = env.params.visualbtnscarrousel["next-mini"]["width"];
				}


				// Height
				if(env.params.visualbtnscarrousel["next-mini"]["height"] > zmaxMiniHeight){
					zmaxMiniHeight = env.params.visualbtnscarrousel["next-mini"]["height"];
				}
				if(env.params.visualbtnscarrousel["next-mini"]["height"] > tmaxMiniHeight){
					tmaxMiniHeight = env.params.visualbtnscarrousel["next-mini"]["height"];
				}
			}

			if(env.params.visualbtnscarrousel["prev-mini"] != "null"){

				// Width
				if((env.params.visualbtnscarrousel["prev-mini"]["width"]) > tmaxMiniWidth){
					tmaxMiniWidth = env.params.visualbtnscarrousel["prev-mini"]["width"];
				}
				if(env.params.visualbtnscarrousel["prev-mini"]["width"] > zmaxMiniWidth){
					zmaxMiniWidth = env.params.visualbtnscarrousel["prev-mini"]["width"];
				}

				// Height
				if(env.params.visualbtnscarrousel["prev-mini"]["height"] > zmaxMiniHeight){
					zmaxMiniHeight = env.params.visualbtnscarrousel["prev-mini"]["height"];
				}
				if(env.params.visualbtnscarrousel["prev-mini"]["height"] > tmaxMiniHeight){
					tmaxMiniHeight = env.params.visualbtnscarrousel["prev-mini"]["height"];
				}
			}
		}


		// Resize all li.mini (our miniatures)
		env.$elts.miniwrap.find('.mini-carrousel').children().each(function(index){
			$(this).removeClass('hidden');
			$(this).css('width', (maxMiniatureWidth)).css('height', (maxMiniatureHeight));
		});

		// Generate our CSS for Horizontal or Vertical display
		switch(env.params.direction)
		{
			// Horizontal display
			case 'horizontal':

				// Block's styles
				env.$elts.miniwrap.css('height', zmaxMiniHeight).addClass('horizontal');

				// Horizontal class
				env.$elts.wrap.css('margin-bottom', '4px');
				env.$elts.carrouselnavigation.parent().css('width',(env.params.carouselWidth * env.params.dispItems) + (tmaxMiniWidth*2));				
				env.$elts.miniatures.css('width', env.minioptions.nbVisuelsPerPage * env.miniatureWidth).css('height', maxMiniatureHeight).css('overflow', 'hidden');
				env.$elts.minicarrousel.css('width', env.steps.count * env.miniatureWidth).css('height', maxMiniatureHeight);
				env.$elts.minicarrousel.children().css('margin-right', (env.params.miniaturesMargin/2)).css('margin-left', (env.params.miniaturesMargin/2));

				// Button's Styles
				env.$elts.miniBtnPreced.addClass('horizontal').css('height', zmaxMiniHeight).css('width', tmaxMiniWidth).css('background-position', 'right center');
				env.$elts.miniBtnNext.addClass('horizontal').css('height', zmaxMiniHeight).css('width', tmaxMiniWidth).css('background-position', 'left center');

				// Adjust marge to center miniatures with our buttons
				if(env.minioptions.nbPages > 1) {
					newMarge = (((env.$elts.miniwrap.outerWidth() - (tmaxMiniWidth*2)) - (env.$elts.miniwrap.find('.miniatures').outerWidth()))/2 );
					newMargeTop = (zmaxMiniHeight - maxMiniatureHeight) / 2
				}
				else {
					newMarge = (((env.$elts.miniwrap.outerWidth()) - (env.$elts.minicarrousel.outerWidth()))/2);
					newMargeTop = 0;
				}

				env.$elts.miniatures.css('margin-left', newMarge).css('margin-top', newMargeTop);

			break;


			// Vertical display
			case 'vertical':
				// Load good styles
				env.$elts.miniwrap.addClass('vertical');

				// Block's styles
				env.$elts.wrap.addClass('vertical').css('margin-top', tmaxMiniHeight);
				env.$elts.miniwrap.css('width', zmaxMiniWidth);
				env.$elts.carrouselnavigation.parent().css('height', (env.params.carouselHeight * env.params.dispItems) + (tmaxMiniHeight*2));
				env.$elts.miniwrap.css('height', env.$elts.wrap.outerHeight());

				// Vertical class
				env.$elts.wrap.css('margin-right', '4px');
				env.$elts.carrouselnavigation.parent().css('width',(env.params.carouselWidth +4) + zmaxMiniWidth);
				env.$elts.miniatures.css('width', maxMiniatureWidth).css('height', env.miniatureHeight * env.minioptions.nbVisuelsPerPage).css('overflow', 'hidden');
				env.$elts.minicarrousel.css('width', maxMiniatureWidth).css('height', maxMiniatureHeight * env.steps.count);
				env.$elts.minicarrousel.children().css('margin-bottom', (env.params.miniaturesMargin/2)).css('margin-top', (env.params.miniaturesMargin/2));

				// Button's Styles
				env.$elts.miniBtnPreced.css('width',zmaxMiniWidth).addClass('vertical').css('height', tmaxMiniHeight).css('background-position', 'center bottom');
				env.$elts.miniBtnNext.css('width',zmaxMiniWidth).addClass('vertical').css('height', tmaxMiniHeight).css('background-position', 'center top');

				if (env.minioptions.nbPages <= 1) {
					env.$elts.miniwrap.css('margin-top', '10px');
				}

				// Adjust marge to center miniatures with our buttons
				newMarge = (env.$elts.carrouselnavigation.outerHeight() - env.$elts.miniatures.outerHeight())/2;
				newMargeLeft = ((zmaxMiniWidth - maxMiniatureWidth)/2);
				env.$elts.miniatures.css('margin-top', newMarge).css('margin-bottom', newMarge).css('margin-left', newMargeLeft);

			break;

		}


		// EVENTS LIST:

		// Init
		env.params.page = 0;

		// Btn Next
		env.$elts.miniBtnNext.bind('click', function(){
			if(env.params.page < env.minioptions.nbPages-1) {
				env.params.page++;
				env.params.activeRelativePageMiniatures = false;
		        miniAnimate(env, env.params.page, env.params.direction);
			}
		});

		// Btn Preced
		env.$elts.miniBtnPreced.bind('click', function(){
			if(env.params.page > 0){
				env.params.page--;
				env.params.activeRelativePageMiniatures = false;
				miniAnimate(env, env.params.page, env.params.direction);
			}
		});

		// Events (click miniatures)
		env.$elts.miniwrap.find('.mini-carrousel').children().each(function(i){
	        $(this).click(function(){
				goToStep(env, i);
				stopAutoSlide(env);
	        });
	    });


	}

	// Miniatures animations
	function miniAnimate(env, mPAGE, mORIENTATION)
	{
		
		switch(mORIENTATION)
		{
			case 'vertical':
				env.$elts.minicarrousel.animate({ 
		            marginTop : - (env.miniatureHeight * mPAGE * env.minioptions.nbVisuelsPerPage) 
		        }); 
			break;
		
			
			case 'horizontal':
				env.$elts.minicarrousel.animate({ 
		            marginLeft : - (env.miniatureWidth * mPAGE * env.minioptions.nbVisuelsPerPage) 
		        }); 
			break;
		}

	}



	// Address plugin
	function initAddress(env) {

		if (env.params.useAddress && $.isFunction($.fn.address)) {

			$.address
				.init(function(e) {
					var pathNames = $.address.pathNames();
					if (pathNames[0] === env.params.adressIdentifier && !!pathNames[1]) {
						goToStep(env, pathNames[1]-1);
					} else {
						$.address.value('/'+ env.params.adressIdentifier +'/1');
					}
				})
				.change(function(e) {
					var pathNames = $.address.pathNames();
					if (pathNames[0] === env.params.adressIdentifier && !!pathNames[1]) {
						goToStep(env, pathNames[1]-1);
					}
				});
		} else {
			env.params.useAddress = false;
		}
	};

	function goToStep(env, step) {

		// Callback
		env.params.callback(step);

		// Launch animation
		transition(env, step);

		// Update first step
		env.steps.first = step;

		// Update buttons status
		updateButtonsState(env);

		// Update address (jQuery Address plugin)
		if ( env.params.useAddress ) {
			$.address.value('/'+ env.params.adressIdentifier +'/' + (step + 1));
		}

	};

	// Get next/prev step, useful for autoSlide
	function getRelativeStep(env, position) {
		if (position == "prev") {

			if ( (env.steps.first - env.params.dispItems) >= 0 ) {
				return env.steps.first - env.params.dispItems;

			} else {

				if(env.steps.first > 0)
				{
					return 0;
				}
				else {
					return ( (env.params.loop)? (env.steps.count - env.params.dispItems) : false );
				}
			}

		} else if (position == "next") {

			if ( (env.steps.first - -env.params.dispItems) < env.steps.count ) {
				return env.steps.first - -env.params.dispItems;

			} else {
				return ( (env.params.loop)? 0 : false );
			}
		}
	};

	// Animation
	function transition(env, step) {
			// Effect
			switch (env.params.effect){

				// No effect
				case "no":
					if (env.params.direction == "vertical"){
						env.$elts.content.css("top", -(env.itemHeight * step) + "px");
					} else {
						env.$elts.content.css("left", -(env.itemWidth * step) + "px");
					}
				break;

				// Fade effect
				case "fade":
					if (env.params.direction == "vertical"){
						env.$elts.content.stop(true, true).fadeOut('slow', function () {
							env.$elts.content.css("top", -(env.itemHeight * step) + "px")}).fadeIn('slow');
					} else {
						env.$elts.content.stop(true, true).fadeOut('slow', function () {
							env.$elts.content.css("left", -(env.itemWidth * step) + "px")}).fadeIn('slow');

					}
				break;

				// Flash
				case "flash":
					if (env.params.direction == "vertical"){
						env.$elts.content.hide().css("top", -(env.itemHeight * step) + "px").fadeIn(env.params.animSpeed);
					} else {
						env.$elts.content.hide().css("left", -(env.itemWidth * step) + "px").fadeIn(env.params.animSpeed);
					}
				break;


				// Easing effect
				default:

					// Define parameters
					if(env.params.effect != "slide"){
						env.params.slideEasing = env.params.effect;
						env.params.animSpeed = 1000;
					}

					// Animation
					if (env.params.direction == "vertical"){
						if(step < env.steps.first){
							env.$elts.content.stop().animate({top : -(env.itemHeight * step)}, {duration:env.params.animSpeed, easing:env.params.slideEasing});
						}
						else {
							env.$elts.content.stop().animate({top : -(env.itemHeight * step)}, {duration:env.params.animSpeed, easing:env.params.slideEasing});
						}
					} else {
						if(step < env.steps.first){
							env.$elts.content.stop().animate({left : -(env.itemWidth * step)}, {duration:env.params.animSpeed, easing:env.params.slideEasing});
						}
						else {
							env.$elts.content.stop().animate({left : -(env.itemWidth * step)}, {duration:env.params.animSpeed, easing:env.params.slideEasing});
						}
					}
				break;
			}
	};

	// Update all buttons state : disabled or not
	function updateButtonsState(env){

		if (getRelativeStep(env, "prev") !== false) {
			env.$elts.prevBtn.trigger("enable");

		} else {
				env.$elts.prevBtn.trigger("disable");
		}

		if (getRelativeStep(env, "next") !== false) {
			env.$elts.nextBtn.trigger("enable");

		} else {
			env.$elts.nextBtn.trigger("disable");
		}

		if (env.params.pagination){
			env.$elts.paginationBtns.removeClass("active")
			.filter(function(){ return ($(this).data("firstStep") == env.steps.first) }).addClass("active");
		}
	};

	// Play autoslide
	function playAutoSlide(env) {

		env.interval = window.setInterval(function(){

			// AutoStop
			if(!env.params.loop){
				if((getRelativeStep(env, "next") +parseInt(env.params.dispItems)) >= env.steps.count){
					stopAutoSlide(env);
				}
			}

			// Go to next pellicule
			goToStep( env, getRelativeStep(env, "next") );

			// Update Miniatures Page
			if(env.params.activeRelativePageMiniatures == true){
				getRelativePageOfMiniatures(env);
			}

		}, env.params.autoSlideInterval);

		// load custom buttons
		if(env.params.btnAutoSlide) {
			env.$elts.btnAutoSlide.addClass('playing');
			loadCustomControlBtns(env, 'playing');
		}
	}

	// Stop autoslide
	function stopAutoSlide(env) {

		// ClearInterval
		if (!!env.interval){
			window.clearInterval(env.interval);
		}

		// load custom buttons
		if(env.params.btnAutoSlide) {
			env.$elts.btnAutoSlide.removeClass('playing');
			loadCustomControlBtns(env, 'stop');
		}
	}


	function miniCarouselOptions(env)
	{
		// Calcul
		if (env.params.direction == "vertical")
		{
			var nbvisuels = Math.round((env.$elts.wrap.outerHeight()/(env.$elts.miniwrap.find(".mini-carrousel").children().length*env.miniatureHeight)) * env.$elts.miniwrap.find(".mini-carrousel").children().length);
		}
		else
		{
			var nbvisuels = Math.round((env.$elts.wrap.outerWidth()/(env.$elts.miniwrap.find(".mini-carrousel").children().length*env.miniatureWidth)) * env.$elts.miniwrap.find(".mini-carrousel").children().length);
		}

		nbvisuels--;
		if(nbvisuels < 1)
		{
			nbvisuels = 1;
		}
		if(nbvisuels > env.steps.count)
		{
			nbvisuels = env.steps.count;
		}

		var pages = Math.ceil(env.steps.count/nbvisuels);
		var position = env.$elts.miniwrap.find(".miniatures");


		// Get data
		var optionsObject = {
			nbVisuelsPerPage: nbvisuels,
			nbPages: pages,
			btnPosition: position
		};

		// Return
		return optionsObject;

	}

	function getPositionOfAutoSlideBtn(env, AutoSlidePosition)
	{
		// Define
		var K_IMGWIDTH = env.$elts.btnAutoSlide.outerWidth();
		var K_IMGHEIGHT = env.$elts.btnAutoSlide.outerHeight();
		var K_SPACE = 5;

		switch (AutoSlidePosition)
		{
			case 'top-right':
				var vLeft = (env.$elts.wrap.outerWidth() - (K_IMGWIDTH + K_SPACE));
				var vTop = K_SPACE;
			break;

			case 'top-left':
				var vLeft = K_SPACE;
				var vTop = K_SPACE;
			break;

			case 'bottom-right':
				var vLeft = (env.$elts.wrap.outerWidth() - (K_IMGWIDTH + K_SPACE));
				var vTop = (env.$elts.wrap.outerHeight() - (K_IMGHEIGHT + K_SPACE));
			break;

			case 'bottom-left':
				var vLeft = K_SPACE;
				var vTop = (env.$elts.wrap.outerHeight() - (K_IMGHEIGHT + K_SPACE));
			break;

		}

		// apply
		env.$elts.btnAutoSlide.css('left', vLeft).css('top', vTop);

	}

	function initBtnAutoSlide(env)
	{
		// Init
		env.$elts.btnAutoSlide = env.$elts.wrap.append('<span class="btnAutoSlide"> </span>');
		env.$elts.btnAutoSlide = env.$elts.wrap.find('.btnAutoSlide');

		// addClass
		if(env.params.autoSlide) {
			env.$elts.btnAutoSlide.addClass('playing');
		}

		loadCustomControlBtns(env);

		// Events click
		env.$elts.btnAutoSlide.bind('click', function(){

			// Small effect
			env.$elts.btnAutoSlide.stop(true, true).fadeOut(400);

			// Desactive
			if(env.$elts.btnAutoSlide.hasClass('playing')) {
				stopAutoSlide(env);
			}

			// Active
			else {
				env.params.activeRelativePageMiniatures = true;
				playAutoSlide(env);
			}

			env.$elts.btnAutoSlide.fadeIn(400);
		});
	}



	function getRelativePageOfMiniatures(env)
	{
		// Get relative page of miniatures
		if(env.params.miniatures)
		{
			if(env.minioptions.nbPages > 1)
			{
				actualPage = env.steps.first +1;
				if(actualPage <= ((env.params.page+1) * env.minioptions.nbVisuelsPerPage) && actualPage > ((env.params.page) * env.minioptions.nbVisuelsPerPage))
				{
					PageBoolean = true;
				}
				else
				{
					PageBoolean = false;
					pageToGo = 1;
					while(PageBoolean == false)
					{
						if(((env.minioptions.nbVisuelsPerPage * pageToGo) / actualPage) >= 1) {
							env.params.page = pageToGo-1;
							miniAnimate(env, pageToGo-1, env.params.direction);
							pageToGo = 1;
							PageBoolean = true;
						}

						else {
							pageToGo++;
						}
					}
				}
			}
		}
	}

	function loadCustomControlBtns(env, btnType)
	{
		if(!btnType){
			className = env.$elts.btnAutoSlide.attr('class').split(' ');
			 btnType = className[1];
		}

		switch(btnType)
		{
			case 'playing':
				if(env.params.visualbtnscarrousel["stop"] != "null") {
					env.$elts.btnAutoSlide.css('background-image', 'url('+ env.params.visualbtnscarrousel["stop"]["url"] + ')').css('width', env.params.visualbtnscarrousel["stop"]["width"]).css('height', env.params.visualbtnscarrousel["stop"]["height"]);
				}
				else {
					removeCssOfElement(env, env.$elts.btnAutoSlide, ['background-image', 'width', 'height']);
				}
			break;


			default:
				if(env.params.visualbtnscarrousel["play"] != "null") {
					env.$elts.btnAutoSlide.css('background-image', 'url('+ env.params.visualbtnscarrousel["play"]["url"] + ')').css('width', env.params.visualbtnscarrousel["play"]["width"]).css('height', env.params.visualbtnscarrousel["play"]["height"]);
				}
				else {
					removeCssOfElement(env, env.$elts.btnAutoSlide, ['background-image', 'width', 'height']);
				}
			break;

		}

		// Apply position
		getPositionOfAutoSlideBtn(env, env.params.btnAutoSlidePosition);

	}


	function removeCssOfElement(env, element, css)
	{
		for (var i in css){
			element.css(css[i], '');
		}
	}


})(jQuery);


