(function($){
	/**
	 * $('#exemple').slideObject({
	 * 		height				:300,
	 * 		width				:400,
	 * 		autoSlide			:5000,
	 * 		animateTime			:500,
	 * 		currentSlide		:0,
	 * 		numberListe			:true,
	 * 		arrow				:false,
	 * 		controlsContainer	:'inside',
	 * 		animType			:'fade',
	 * });
	 * 
	 * <div id="exemple" class="slideObject">
	 * 		<div><p>super coool <br /></p></div>
	 * 		<div>
	 * 			<img/>
	 * 			<p class="contentOver">Text qui s'affichera au survole</p>
	 * 		</div>
	 * 		etc...
	 *</div>
	 *
	 * <div id="exemple" class="slideObject">
	 * 		<ul>
	 * 			<li>erterter</li>
	 * 			<li>erterter</li>
	 * 			etc...
	 * 		</ul>
	 *</div>
	 * 
	 * 
	 */
	// définition du plugin jQuery
	$.fn.slideObject = function(params) {
		// Fusionner les paramètres par défaut et ceux de l'utilisateur
		params=$.extend( {
			height				:300,
			width				:400,
			autoSlide			:5000,
			animateTime			:500,
			currentSlide		:0,
			numberListe			:true,
			arrow				:false,
			controlsContainer	:'inside',
			animType			:'fade',
			noLoop				:false
		},params);
		
		var slidePause=false;
		var slideName=$(this).attr('id');
		//Animation changement de slide
		function animateSlider(contentSlider,controlsSlider,i,viewWidth){
			var contentLength=Math.ceil(contentSlider.width()/viewWidth);
			params.currentSlide=((i)%contentLength);
			if(params.numberListe)controlsSlider.find('a').removeClass('currentSlide');
			switch(params.animType){
				case 'slide':
					var isRight=(i==contentLength&&params.currentSlide==0)?true:false;
					var isLeft=(controlsSlider.hasClass('lastClick-left')&&i==contentLength-1&&params.currentSlide==contentLength-1)?true:false;
					if(isRight||isLeft){
						var duplicatedSlide1=$('<div class="slides duclicated1"></div>');
						var duplicatedSlide2=$('<div class="slides duclicated2"></div>');
						duplicatedSlide1.attr({'style':contentSlider.attr('style')}).css({left:0});
						duplicatedSlide2.attr({'style':contentSlider.attr('style')}).css({left:0});
						$(contentSlider.html()).appendTo(duplicatedSlide1);
						$(contentSlider.html()).appendTo(duplicatedSlide2);
						var wrapper=$('<div class="wrapper"></div>');
						$(duplicatedSlide1).css({'width':(viewWidth*contentLength)+'px','float':'left'}).appendTo(wrapper);
						$(duplicatedSlide2).css({'float':'left'}).appendTo(wrapper);
						wrapper.appendTo(contentSlider.parent());
						contentSlider.hide().css({left:-(params.currentSlide*viewWidth)+'px'});
						var init=(isRight)?(duplicatedSlide1.width()-viewWidth):duplicatedSlide1.width();
						var goTo=(isRight)?duplicatedSlide1.width():(duplicatedSlide1.width()-viewWidth);
						wrapper.css({left:-init+'px','position':'relative','width':duplicatedSlide1.width()+duplicatedSlide2.width()}).animate(
								{left:-goTo+'px'},
								{ queue:false, duration:params.animateTime,complete:function(){
									wrapper.remove();
									contentSlider.show();
								}}
						);
					}else{
						contentSlider.animate(
								{left:-(params.currentSlide*viewWidth)+'px'},
								{ queue:false, duration:params.animateTime}
						);
					}
					if(params.numberListe)controlsSlider.find('#slide-'+params.currentSlide).addClass('currentSlide');
				break;
				default:
				case 'fade':
					contentSlider.fadeOut('slow',function(){
						//deplace le slider pour aller au prochain slide
						contentSlider.css({left:-(params.currentSlide*viewWidth)+'px'});
						contentSlider.fadeIn('slow');
						//Ajout de la class currentSlide sur le bon bouton
						if(params.numberListe)controlsSlider.find('#slide-'+params.currentSlide).addClass('currentSlide');
					});
				break;
			}
		}
		
		//creation du slide object
		function createSlider() {
			
			var interval;
			$(this).css({
				height:params.height,
				width:params.width,
				overflow:'hidden'
				})
			var viewWidth = $(this).width();
			var widthTmp=0;
			var hasSlidesContent=($('.slides',this).length>0)?true:false;
			var contentSlide = (hasSlidesContent)?$($('.slides',this)[0]):$('<div class="slides"></div>');
			$(this).children().each(function(){
				if(!hasSlidesContent)$(this).appendTo(contentSlide);
				$(this).mouseenter(function(){
					$('.contentOver',this).show();
				}).mouseleave(function(){
					$('.contentOver',this).hide();
				});
				$(this).mouseleave();
			});
			if(!hasSlidesContent)$(contentSlide).appendTo($(this));
			if($('.slides ul',this)[0]){
				$('.slides ul li',this).each(function(){
					widthTmp+=$(this).outerWidth(true);
				});
			}else{
				$('.slides',this).children().each(function(){
					widthTmp+=$(this).outerWidth(true);
				});
			}
			contentSlide.css({
				width:widthTmp+'px'
			});
			var numPage=Math.ceil(contentSlide.width()/viewWidth);
			if(numPage<=1)params.numberListe=false;
			if(params.numberListe){
				var controls = $('<div class="controls"></div>');
				var num = 1;
				for(var j=1; j<=numPage; j++){
					$('<a id="slide-'+(num-1)+'" href="#" >'+num+'</a>').appendTo(controls).click(function(){
						var i = $(this).attr('id').split('-')[1];
						animateSlider(contentSlide,controls,i,viewWidth);
						return false;
					});
					num++;
				}
				if(params.controlsContainer=='inside'){
					$(controls).appendTo($(this));
				}else if(params.controlsContainer=='outside'){
					$(controls).addClass($(this).attr('id'));
					$(this).after(controls);
				}
			}
			if(params.arrow){
				var controls = $('<div class="controls"></div>');
				var arrowLeft=$('<a class="prev" href="#"><</a>');
				var arrowRight=$('<a class="next" href="#">></a>');
				if(numPage>1){
					if(params.currentSlide==0)arrowLeft.addClass('desabled');
					arrowLeft.click(function(){
						if(params.noLoop)if($(this).hasClass('desabled'))return false;
						$('.desabled',controls).removeClass('desabled');
						if(params.currentSlide==1)$(this).addClass('desabled');
						if(params.currentSlide<=0){
							controls.addClass('lastClick-left');
							params.currentSlide=numPage;
						}
						animateSlider(contentSlide,controls,(params.currentSlide-1),viewWidth);
						return false;
					});
					arrowRight.click(function(){
						if(params.noLoop)if($(this).hasClass('desabled'))return false;
						$('.desabled',controls).removeClass('desabled');
						if(params.currentSlide==(numPage-2))$(this).addClass('desabled');
						animateSlider(contentSlide,controls,(params.currentSlide+1),viewWidth);
						return false;
					});
				}else{
					arrowLeft.addClass('desabled');
					arrowRight.addClass('desabled');
					arrowLeft.click(function(){return false;});
					arrowRight.click(function(){return false;});
				}
				$(arrowLeft).appendTo(controls);
				$(arrowRight).appendTo(controls);
				if(params.controlsContainer=='inside'){
					$(controls).appendTo($(this));
				}else if(params.controlsContainer=='outside'){
					$(controls).addClass($(this).attr('id')).appendTo($(this).parent());
				}
			}
			contentSlide.css({left:-((params.currentSlide)*viewWidth)+'px'});
			if(params.numberListe)controls.find('#slide-'+(params.currentSlide)).addClass('currentSlide');
			
			if(params.autoSlide!=0&&numPage>1){
				$(this).mouseenter(function(){
					if(slidePause)return false;
					clearInterval(interval);
				}).mouseleave(function(){
					if(slidePause)return false;
					interval = setInterval(function(){
						animateSlider(contentSlide,controls,(params.currentSlide+1),viewWidth);
					}, params.autoSlide);
				});
				$(this).mouseleave();
			}
			$('video',this).bind('play',function(){
				if(params.autoSlide!=0&&numPage>1){
					clearInterval(interval);
					slidePause = true;
				}
			});
			
			$('video',this).bind('pause', function() {
				if(params.autoSlide!=0&&numPage>1){
					interval = setInterval(function(){
						animateSlider(contentSlide,controls,(params.currentSlide+1),viewWidth);
					}, params.autoSlide);
					slidePause = false;
				}
			});

			$('video',this).bind('ended', function() {
				if(params.autoSlide!=0&&numPage>1){
					interval = setInterval(function(){
						animateSlider(contentSlide,controls,(params.currentSlide+1),viewWidth);
					}, params.autoSlide);
					slidePause = false;
				}
			});
		}
		
		$(this).each(createSlider);
		// Permettre le chaînage par jQuery
		return this;
	};
})(jQuery);
