(function($)
{
    $.fn.innerfade = function(options)
	{
        return this.each(function()
		{   
            $.innerfade(this, options);
        });
    };

    $.innerfade = function(container, options)
	{
        var settings = {
        	'animationtype':    'fade', 
            'speed':            'normal', 
            'type':             'sequence', 
            'timeout':          2000, 
            'containerheight':  'auto', 
			'width': 			'100%', 
			'height' : 			'auto', 
            'children':         null, 
			'auto_play':		1
        };
		
		var div_conteneur = $(container);
		var container = $(container).find("ul");
		
        if (settings.children === null)
            var elements = $(container).children();
        else
            var elements = $(container).children(settings.children);
		
		var panel_conteneur = $("div#panel_" + div_conteneur.attr("id"));
		
		var btn_prev = panel_conteneur.find(".prev");
		var btn_next = panel_conteneur.find(".next");
		var btn_action = panel_conteneur.find(".action");
		
		
		if (options) $.extend(settings, options);
		
		$.extend($.innerfade, 
		{
			settings : settings, 
			elements : elements, 
			div_conteneur : div_conteneur, 
			container : container, 
			panel_conteneur : panel_conteneur, 
			btn_prev : btn_prev, 
			btn_next : btn_next, 
			btn_action : btn_action,
			defil_en_cours : false
		});
		

		$.innerfade.switch_class_action();
		
        btn_action.click(function(){ $.innerfade.switch_action(); });
		btn_prev.click(function(){ $.innerfade.prev(); });
		btn_next.click(function(){ $.innerfade.next(); });
		
		
        if (elements.length > 1)
		{
            $(container).css('position', 'relative').css('height', settings.containerheight);
			
			$.innerfade.initPosition();
			
			//alert("last : " + $.innerfade.last + " | current : " + $.innerfade.current);
			//	Type d'animation
			switch(settings.animationtype)
			{
				case "fade":
				case "slide":
				
					for (var i = 0; i < elements.length; i++)
					{
						$(elements[i]).css('z-index', String(elements.length-i)).css('position', 'absolute').hide();
					};
					
					$(elements[$.innerfade.current]).show();
					
				break;
				case "defilement_horizontal" : 
					
					div_conteneur.css({position : "relative", overflow : "hidden"});
					
					var w_tot = 0;
					for (var i = 0; i < elements.length; i++)
					{
						$(elements[i]).css({display: 'block', float: 'left', width: settings.width});
						
						w_tot += $(elements[i]).outerWidth();
					};
					
					container.css("width", w_tot);
					
					var ecart = $.innerfade.container.position().left + $(elements[$.innerfade.current]).position().left;
					
					$(container).animate({left : '-=' + ecart + 'px'});
					
				break;
				case "defilement_vertical" : 
					
					div_conteneur.css({position : "relative", overflow : "hidden"});
					
					var ecart = $.innerfade.container.position().top + $(elements[$.innerfade.current]).position().top;
				
					$(container).animate({top : '-=' + ecart + 'px'});
					
				break;
				default : 
					
					alert("Type d'animation possible : 'fade', 'slide', 'defilement_horizontal' ou 'defilement_vertical'");
					
					return;
				break;
			}
			
			if( settings.height == "auto" )
			{
				div_conteneur.height($(elements[$.innerfade.current]).outerHeight() + "px");
			}
			
			if( $.innerfade.settings.auto_play == 1 )
			{
				$.innerfade.o_timeout = setTimeout(function()
				{
					$.innerfade.next();
				}
				, settings.timeout);
			}
		}
    };
	
	
	$.innerfade.prev = function()
	{
		if( !$.innerfade.defil_en_cours )
		{
			window.clearTimeout($.innerfade.o_timeout);
			
			$.innerfade.decrement("sequence");
			$.innerfade.defile();
		}
	};
	
	
	$.innerfade.next = function()
	{
		if( !$.innerfade.defil_en_cours )
		{
			window.clearTimeout($.innerfade.o_timeout);
			
			$.innerfade.increment("sequence");
			$.innerfade.defile();
			
			//alert("last : " + $.innerfade.last + " | current : " + $.innerfade.current);
		}
	};
	
	
	$.innerfade.initPosition = function()
	{
		//Type de démarage
		switch($.innerfade.settings.type)
		{
			case "sequence":
				
				$.innerfade.current = 0;
				$.innerfade.last = $.innerfade.elements.length - 1;
				
			break;
			case "random":
				
				var last = Math.floor ( Math.random () * ( $.innerfade.elements.length ) );
				
				do
				{
					current = Math.floor ( Math.random ( ) * ( $.innerfade.elements.length ) );
				}
				while (last == current );
				
				$.innerfade.current = current;
				$.innerfade.last = last;
				
			break;
			case "random_start":
				
				$.innerfade.settings.type = "sequence";
				
				$.innerfade.last = Math.floor ( Math.random () * ( $.innerfade.elements.length ) );
				
				$.innerfade.current = ($.innerfade.last + 1) %  $.innerfade.elements.length;
				
			break;
			default:
				
				alert("Type de défilement possible : 'sequence', 'random' ou 'random_start'");
				
				return;
				
			break;
		}
	};
	
	
	$.innerfade.decrement = function(type)
	{
		if (type == "sequence")
		{
			$.innerfade.last = $.innerfade.current;
			
			if (($.innerfade.current) > 0)
				$.innerfade.current = $.innerfade.current - 1;
			else
				$.innerfade.current = $.innerfade.elements.length - 1;
		}
		else if (type == "random")
		{
			$.innerfade.last = $.innerfade.current;
			while ($.innerfade.current == $.innerfade.last)
				$.innerfade.current = Math.floor(Math.random() * $.innerfade.elements.length);
		}
		else
		{
			alert("Type de défilement possible : 'sequence', 'random' ou 'random_start'");
		}
	};
	
	$.innerfade.increment = function(type)
	{
		if (type == "sequence")
		{
			$.innerfade.last = $.innerfade.current;
			
			if (($.innerfade.current + 1) < $.innerfade.elements.length)
				$.innerfade.current = $.innerfade.current + 1;
			else
				$.innerfade.current = 0;
		}
		else if (type == "random")
		{
			$.innerfade.last = $.innerfade.current;
			while ($.innerfade.current == $.innerfade.last)
				$.innerfade.current = Math.floor(Math.random() * $.innerfade.elements.length);
		}
		else
		{
			alert("Type de défilement possible : 'sequence', 'random' ou 'random_start'");
		}
	};
	
	$.innerfade.switch_action = function()
	{
		if( $.innerfade.settings.auto_play == 1 )
			$.innerfade.settings.auto_play = 0;
		else
			$.innerfade.settings.auto_play = 1;
		
		$.innerfade.switch_class_action();
		
		window.clearTimeout($.innerfade.o_timeout);
		
		$.innerfade.defile();
	};
	
	$.innerfade.switch_class_action = function()
	{
		if( $.innerfade.settings.auto_play == 1 )
			$.innerfade.btn_action.addClass("pause");
		else
			$.innerfade.btn_action.removeClass("pause").addClass("play");
	};

    $.innerfade.defile = function()
	{
		$.innerfade.defil_en_cours = true;
		
		//	Type d'animation
		switch($.innerfade.settings.animationtype)
		{
			case "slide" : 
				
				$($.innerfade.elements[$.innerfade.last]).slideUp($.innerfade.settings.speed, function(){ $($.innerfade.elements[$.innerfade.current]).slideDown($.innerfade.settings.speed, function(){ $.innerfade.defil_en_cours = false; }); });
				
			break;
			case "fade" : 
				
				$($.innerfade.elements[$.innerfade.last]).fadeOut($.innerfade.settings.speed, function(){ $($.innerfade.elements[$.innerfade.current]).fadeIn($.innerfade.settings.speed, function(){ $.innerfade.defil_en_cours = false; removeFilter($(this)[0]); }); });
				
			break;
			case "defilement_horizontal" : 
				
				var ecart = $.innerfade.container.position().left + $($.innerfade.elements[$.innerfade.current]).position().left;
				
				$.innerfade.container.animate({left : '-=' + ecart + 'px'}, $.innerfade.settings.speed, function(){ $.innerfade.defil_en_cours = false; });
				
			break;
			case "defilement_vertical" : 
			
				var ecart = $.innerfade.container.position().top + $($.innerfade.elements[$.innerfade.current]).position().top;
				
				$.innerfade.container.animate({top : '-=' + ecart + 'px'}, $.innerfade.settings.speed, function(){ $.innerfade.defil_en_cours = false; });
			
			break;
			default : 
				
				alert("Type d'animation possible : 'fade', 'slide', 'defilement_horizontal' ou 'defilement_vertical'");
				
				return;
			break;
		}
		
		if( $.innerfade.settings.height == "auto" )
		{
			$.innerfade.div_conteneur.height($($.innerfade.elements[$.innerfade.current]).outerHeight() + "px");
		}
		
		if( $.innerfade.settings.auto_play == 1 )
		{
			$.innerfade.o_timeout = setTimeout((function()
			{
				$.innerfade.increment($.innerfade.settings.type);
				$.innerfade.defile();
			}), $.innerfade.settings.timeout);
		}
    };

})(jQuery);

// **** remove Opacity-Filter in ie ****
function removeFilter(element)
{
	if(element.style.removeAttribute)
	{
		element.style.removeAttribute('filter');
	}
}

