/*
 * jQuery ImageFader v0.1.1
 *
 * Copyright (c) 2009 Kiwi Creation
 * http://www.kiwicreation.ca/
 *
 * Author: David Arpin
 * Date: 2009-09-26
 * Modified by : Louis-Philip Audet
 * Date: 2011-02-23
 * 
 * Exemple des options
 * $('#slideshow').imagefader({
 * 		animationtype:    	'fade' (ou 'slide'),
 * 		speed: 				1000,
 * 		timeout: 			10000,
 * 		type: 				'sequence' (ou 'random'),
 * 		containerheight: 	'285px',
 * 		children: 			'div'
 * 		control:			true
 * });
 * 
 * 
 * Exemple de CSS pour les contrôleurs
 * .kiwi-imagefader-control {
 * 		display: block;
 * 		width: 10px;
 * 		height: 10px;
 * 		margin-top: 4px;
 * 		background: red;
 * }
 * 
 * .kiwi-imagefader-controls {
 * 		position: absolute;
 * 		z-index: 100;
 * 		bottom: 20px;
 * 		right: 20px;
 * }
 * 
 * .kiwi-imagefader-currentslide {
 * 		background: blue;
 * }
 * 
 */
 
(function($) {
    $.fn.imagefader = function(options) {
        var settings = {
        	'animationtype':    'fade',
            'speed':            'normal',
            'type':             'sequence',
            'timeout':          2000,
            'containerheight':  'auto',
            'runningclass':     'kiwi-imagefader',
            'children':         null,
            'control':			true,
			'controlclass':		'kiwi-imagefader-control',
			'controlactiveclass':'kiwi-imagefader-control-active',
			'timer':			''
        };
        
		$.extend(settings, options);
        return this.each(function() {   
            $.imagefader(this, settings);
			$(this).show();
        });
    };
    
    $.imagefader = function(container, settings) {
        var elements = settings.children === null ? $(container).children() : $(container).children(settings.children);	
		if (settings.control) {
			$(container).prepend('<div class="'+settings.controlclass+'s"></div>');
		}
		
		if (elements.length > 1) {
            $(container)
            	.css({
            		'position': 'relative',
            		'height': settings.containerheight
            	})
            	.addClass(settings.runningclass);
            
			for (var i = 0; i < elements.length; i++) {
                $(elements[i])
                	.css({
                		'z-index': String(elements.length-i),
                		'position': 'absolute'
                	})
                	.hide();
                
				if (settings.control) {
					var control = $('<a href="#" class="' + settings.controlclass + '" />');
					if (i == 0)
						control.addClass('first');
					else if (i == elements.length-1)
						control.addClass('last');
					
					$(container)
						.children("." + settings.controlclass + "s")
						.append(control);
				}
            };
			
			//Ajoute le click sur les controls
			if (settings.control) {
				$(container)
					.children("." + settings.controlclass + "s")
						.children("a")
							.bind({
								click : function(e) {
									e.preventDefault();
									$.imagefader
										.next(
											container,
											elements,
											settings,
											$(this)
												.parent()
													.children()
													.index(this),
											$(this)
												.parent()
													.children()
													.index(
														$(container)
															.children("." + settings.controlclass + "s")
																.children(".kiwi-imagefader-currentslide")
													)
										);
								}
							});	
			}
			
			if (settings.type == "random") {
				current = Math.floor(Math.random() * (elements.length));
                $.imagefader.next(container, elements, settings, current, 0);			
			}
			else { //settings.type == 'random_start'
				var current = settings.type == 'random_start' ? Math.floor(Math.random () * (elements.length)) : 0;
				settings.type = 'sequence';
				$.imagefader.next(container, elements, settings, current, 0);
			}
		}
		else {
			$(container)
				.children("img")
					.css('display', 'inline');
		}
	};
	
	$.imagefader.next = function(container, elements, settings, current, last) {
		clearTimeout(settings.timer);
		if (settings.animationtype == 'slide') {
			$(elements[last]).slideUp(settings.speed);
			$(elements[current]).slideDown(settings.speed);
		}
		else { //settings.animationtype == 'fade'
			$(elements[last]).fadeOut(settings.speed);
			$(elements[current]).fadeIn(settings.speed);
			
			if (settings.control) {
				$(container)
					.children("." + settings.controlclass + "s")
						.children("." + settings.controlclass)
						.eq(last)
						.removeClass("kiwi-imagefader-currentslide");
				
				$(container)
					.children("." + settings.controlclass + "s")
						.children("." + settings.controlclass)
						.eq(current)
						.addClass("kiwi-imagefader-currentslide");
				
				$(container)
					.children("." + settings.controlclass + "s")
						.children("." + settings.controlclass)
						.eq(last)
						.toggleClass(settings.controlactiveclass, false);
				
				$(container)
					.children("." + settings.controlclass + "s")
						.children("." + settings.controlclass)
						.eq(current)
						.toggleClass(settings.controlactiveclass, true);
			}
		}
		
		if (settings.type == "sequence") {
			if((current + 1) < elements.length) {
				current = current + 1;
				last = current - 1;
			} else {
				current = 0;
				last = elements.length - 1;
			}
		} else { //settings.type == "random"
			last = current;
			while (current == last) {
				current = Math.floor(Math.random() * elements.length);
			}
		}
		settings.timer=setTimeout(
			(function() {
				$.imagefader.next(container, elements, settings, current, last);
			}), 
			settings.timeout
		);
	};
})(jQuery);
