(function($) {

	
	// plugin definition
	$.fn.nansGallery = function(options)
	{
		__warn("Plugin 'nansGallery'\n---------------------------------");
		debug(this);
		// build main options before element iteration
		var opts = $.extend({}, $.fn.nansGallery.defaults, options);
		
		var o_length = 0;
		var widthMask = 0;
		var $num = 0;
		var $this = {};
		var currentNum = 0;
		var count = 0;
		var $current = 0;
		var $prev = 0;
		var $next = 0;
		// public methods 
		this.kill = function()
		{
			__log("kill !");
			$this.find(opts.conteneur).removeClass("masqueNansGallery_"+$num);
			$this.find(".navNansGallery").remove();
			$this.find("li").css({display:"none",position:"absolute",left:0,top:0});
		};
		this.changeListe = function(pListe)
		{
			if(pListe != opts.conteneur)
			{
				this.kill();
				__log(opts.conteneur);
				opts.conteneur = pListe;
				__log(opts.conteneur);
				_construct();
				_nav("first");
			}
		};
		return this.each(function(num)
		{
			$this = $(this);
			$num = num;
			// build element specific options
			var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
			_construct();
			_nav("first");
		});
		function _construct()
		{
			$this.find(">*").css("display","none");
			o_length = $this.find(opts.conteneur).find("li").length;
			$current = opts.depart-1;
			$this.find(opts.conteneur).addClass("masqueNansGallery_"+$num).css({ 	width:widthMask+"px",height:$this.height(),position:"absolute",left:0+"px" });
			$this.find("li").css({display:"none",position:"absolute",left:0,top:0});
			$this.find(opts.conteneur).find("li:eq("+ verifPos($current,'current') +")").css("display","block");
			/*
			 * if no description is find, dont't make navigation controller. 
			 */
			var boolNav = $this.find(opts.conteneur).find(".description").length;
			if(boolNav)
			{
				$this.append("<div class='navNansGallery navNansGallery_"+$num+"'><div class='fleche next'></div><div class='fleche prev'></div><div class='title'></div><span class='fond'></span></div>")
				$this.find(opts.conteneur).find(".description").css("display","none");
				
			}
			$this.find(opts.conteneur).fadeIn(1000,function()
				{
					if(boolNav)
					{
						$this.find(".navNansGallery").fadeOut("slow");
					}
				});
			
			if(opts.widthVignette == 0)
				opts.widthVignette = $this.width();
			widthMask = o_length*opts.widthVignette;
			
			
			if(boolNav)
			{
				$this.hover(function()
				{
					$(this).find(".navNansGallery").fadeIn("normal");
				},function()
				{
					$(this).find(".navNansGallery").fadeOut("normal");
				});
				$(".navNansGallery_"+$num).find(".next").click(function()
				{
					$current = $next;
					_nav('next');
				});
				$(".navNansGallery_"+$num).find(".prev").click(function()
				{
					$current = $prev;
					_nav('prev');
				});
			}
		}
		function _nav(sens)
		{
			$prev = verifPos($current-1,'prev');
			$next = verifPos($current+1,'next');
			__log("prev : "+$prev+" next : "+$next);
			$(".navNansGallery_"+$num).find(".title").html($this.find(opts.conteneur).find("li:eq("+ verifPos($current,'current') +") .description").html());
			
			var nextDisplay = "block";
			var prevDisplay = "block";
			
			if($next == 0 && opts.boucle == false) nextDisplay = "none";
			else nextDisplay = "block";
			
			if($prev == o_length-1 && opts.boucle == false)	prevDisplay = "none";
			else prevDisplay = "block";
			
			$(".navNansGallery_"+$num).find(".next").css("display",nextDisplay);
			$(".navNansGallery_"+$num).find(".prev").css("display",prevDisplay);
			if(sens != "first")
				_effect(sens);
			
		}
		function _effect(sens)
		{
			if(opts.effect == "slide")
			{
				$this.find(opts.conteneur).find("li:lt("+ $prev +")").css({display:"none"});
				$this.find(opts.conteneur).find("li:gt("+ $current +")").css({display:"none"});
				if(sens == 'next')
				{
					$this.find(opts.conteneur).find("li:eq("+ $prev +")").css({display:"block"}).animate({left:-opts.widthVignette+"px"},300);
					$this.find(opts.conteneur).find("li:eq("+ $current +")").css({display:"block",left:opts.widthVignette+"px"}).animate({left:"0px"},300);
				}
				else
				{
					$this.find(opts.conteneur).find("li:eq("+ $next +")").css({display:"block"}).animate({left:opts.widthVignette+"px"},300);
					$this.find(opts.conteneur).find("li:eq("+ $current +")").css({display:"block",left:-opts.widthVignette+"px"}).animate({left:"0px"},300);
				}	
			}
			else if(opts.effect == "fade")
			{
				if(sens == 'next')
				{
					$this.find(opts.conteneur).find("li:eq("+ $prev +")").css({display:"block",zIndex:2}).fadeOut(300,function(){$(this).css({display:"none"});});
					$this.find(opts.conteneur).find("li:eq("+ $current +")").css({display:"none",left:"0px",zIndex:1}).fadeIn(300);
				}
				else
				{
					$this.find(opts.conteneur).find("li:eq("+ $next +")").css({display:"block",zIndex:2}).fadeOut(300,function(){$(this).css({display:"none"});});
					$this.find(opts.conteneur).find("li:eq("+ $current +")").css({display:"none",left:"0px",zIndex:1}).fadeIn(300);
				}
			}
		}
		function verifPos(pNum,pEtat)
		{
			if( pNum > o_length-1 && pEtat == 'next')
				return 0;
			if(pNum < 0 && pEtat == 'prev')
				return o_length-1;
			return pNum;
		}
		
	};
	// private function for debugging
	function debug($obj) 
	{
		__log('DEBUGG :: nansGallery selection count: ' + $obj.size());
	}
	$.fn.nansGallery.defaults = 
	{
		boucle:				false,
		effect :			"fade",
		depart:				1,
		conteneur:			"ul",
		vignette:			'li',
		widthVignette:		0,
		heightVignette:		0
	};
	// end of closure
})(jQuery);

