(function($) {

	$.fn.carrou = function(options) {
		//debug(this);
		var opts = $.extend({}, $.fn.carrou.defaults, options);

		return this.each(function() {
			var $$ = $(this);
			var o = $.meta ? $.extend({}, opts, $$.data()) : opts;
			// verification existence du panorama dans les options
			var pano = o.hasOwnProperty("panorama") ? o.panorama.hasOwnProperty("itemSelector") ? true:false :false;
			// verification existence de l'autoScroll dans les options
			var autoScroll  = o.hasOwnProperty("autoscroll") ? o.autoscroll.hasOwnProperty("active") ? true:false : false;
			// si existence du panorama verification de l'existence d'une duree
			var durationScroll = o.hasOwnProperty("autoscroll") ? o.autoscroll.hasOwnProperty("duration") ? o.autoscroll.duration:2000 : false;
			// si existence du panorama verification de l'existence d'un evenement a la selection
			var selectScroll = o.hasOwnProperty("panorama") ? o.panorama.hasOwnProperty("onSelect") ? true:false : false;
			
			// si existence du panorama definition de ses options
			if(pano === true) {
				var contentSelector = o.panorama.itemSelector || ".carrou_pano";
				var itemToShow  = o.panorama.itemToShow || 0;
				var classActive = o.panorama.classActive || "carrou_on";
				
				// masquage des container du panorama
				$(contentSelector).hide();
				$(contentSelector+':eq('+itemToShow+')').show();
			}
			
			// contruction du container global, des fleches de navigation et du container de la liste
			$$.wrap('<div class="'+o.classEl+'">').before('<a href="#" class="prev"><span>&lt;</span></a>').after('<a href="#" class="next"><span>&gt;</span></a>').wrap('<div class="carrouContainer">');
			
			// si existence du panorama, ajout de la classe active sur le 1er element visible
			if(pano === true) {
				$('li:eq('+itemToShow+')', $$).addClass(classActive);
				if(selectScroll == true)
					o.panorama.onSelect($('li:eq('+itemToShow+')', $$));
			}
			
			// mise en cache des differents elements utiles du carrousel
			var $$$   = $$.parents('.'+o.classEl);
			var $prev = $$$.children('a.prev');
			var $next = $$$.children('a.next');
			
			var wContainer = $('div.carrouContainer', $$$).width();
			var itemsL     = ($('li', $$).length * o.itemW <= wContainer) ? false : true;
			
			if(itemsL !=false){
				// deplacement du 1er element en 1ere position afin de fluidifier le mouvement du carrousel
				$('li:last', $$).prependTo($$);
				
				// deplacement du carrousel vers la gauche de façons a masquer le 1er element de la liste (donc le dernier)
				$$.css('left', '-'+o.itemW+'px');
			}
			
			// si existence du panorama, au click sur les items, affichage du container correspondant
			if(pano === true) {
				$('li a', $$).click(function() {
					if(!$(this).parents('li').hasClass(classActive)) {
						var curEl = $(this).parents('li');
						$('li.'+classActive, $$).removeClass(classActive);
						curEl.addClass(classActive).children('a').animate({marginRight: '+=0'}, 0, function() {
										$(contentSelector).hide();
										$(this.hash).show();
										if(selectScroll == true)
											o.panorama.onSelect($(this).parent('li'));
									});
					}
					return false;
				});
			}
			
			// fonction de deplacement vers la gauche
			var prevDpl = function(){
				var $current = $('li.'+classActive, $$);
				if(itemsL !=false){
					$$.stop().animate({
								left: "0"
							}, 
							o.duration, 
							function() {
								$("li:last", $$).prependTo($$);
								$$.css({
									left: '-'+o.itemW+'px'
								});
								if(pano === true) {
									$current.removeClass(classActive).next().addClass(classActive).children('a').animate({marginRight: '+=0'}, 0, function() {
											$(contentSelector).hide();
											$(this.hash).show();
											if(selectScroll == true)
												o.panorama.onSelect($(this).parent('li'));
										});
								}
							});
				}else{
					if(pano === true) {
						if($current.prev()[0] != null) {
							$current.removeClass(classActive).prev().addClass(classActive).children('a').animate({marginRight: '+=0'}, 0, function() {
									$(contentSelector).hide();
									$(this.hash).show();
									if(selectScroll == true)
										o.panorama.onSelect($(this).parent('li'));
								});
						}else{
							$current.removeClass(classActive);
							$('li:last', $$).addClass(classActive).children('a').animate({marginRight: '+=0'}, 0, function() {
									$(contentSelector).hide();
									$(this.hash).show();
									if(selectScroll == true)
										o.panorama.onSelect($(this).parent('li'));
								});
						}
					}
				}
			}
			
			// fonction de deplacement vers la droite
			var nextDpl = function(){
				var $current = $('li.'+classActive, $$);
				if(itemsL !=false){
					$$.stop().animate({
								left: '-'+(o.itemW*2)+'px'
							}, 
							o.duration, 
							function() {
								$("li:first", $$).appendTo($$);
								$$.css({
									left: '-'+o.itemW+'px'
								});
								if(pano === true) {
									$current.removeClass(classActive).next().addClass(classActive).children('a').animate({marginRight: '+=0'}, 0, function() {
											$(contentSelector).hide();
											$(this.hash).show();
											if(selectScroll == true)
												o.panorama.onSelect($(this).parent('li'));
										});
								}
							});
				}else{
					if(pano === true) {
						if($current.next()[0] != null) {
							$current.removeClass(classActive).next().addClass(classActive).children('a').animate({marginRight: '+=0'}, 0, function() {
									$(contentSelector).hide();
									$(this.hash).show();
									if(selectScroll == true)
										o.panorama.onSelect($(this).parent('li'));
								});
						}else{
							$current.removeClass(classActive);
							$('li:first', $$).addClass(classActive).children('a').animate({marginRight: '+=0'}, 0, function() {
									$(contentSelector).hide();
									$(this.hash).show();
									if(selectScroll == true)
										o.panorama.onSelect($(this).parent('li'));
								});
						}
					}
				}
			}
			
			// detection du click sur la fleche de gauche
			$prev.click(function() {
				// si l'autoScroll est active, desactivation du timer au click sur la fleche de gauche
				if(autoScroll === true) {
					clearInterval (timmerScroll);
				}
				prevDpl();
				$(this).blur();
				return false;
			});
			
			// detection du click sur la fleche de droite
			$next.click(function() {
				// si l'autoScroll est active, desactivation du timer au click sur la fleche de droite
				if(autoScroll === true) {
					clearInterval (timmerScroll);
				}
				nextDpl();
				$(this).blur();
				return false;
			});
			
			// si l'autoScroll est active, mise en place du timer
			if(autoScroll === true) {
				var timmerScroll = setInterval ( nextDpl, durationScroll );
			}
			

		});
	};

	
	/*function debug($obj) {
		if (window.console && window.console.log)
		window.console.log('carrou selection count: ' + $obj.size());
	};*/

	
	$.fn.carrou.defaults = {
		classEl: 'my_carrou',
		duration: 'slow'
	};

	
})(jQuery);
