/*
 * jQuery ImageFader v0.1
 *
 * Copyright (c) 2009 Kiwi Creation
 * http://www.kiwicreation.ca/
 *
 * Author: David Arpin
 * Date: 2009-09-26
 */
 
(function($) {

    $.fn.imagefader = function(options) {
        var settings = {
        	'animationtype':    'fade',
            'speed':            'normal',
            'type':             'sequence',
            'timeout':          2000,
            'containerheight':  'auto',
            'runningclass':     'kiwi-imagefader',
            'children':         null,
			'control':			'',
			'controlactive':	'',
			'controlclass':		'kiwi-imagefader-control',
			'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).append('<div class="'+settings.controlclass+'s" style="z-index:' + (elements.length+1) + '"></div>');
		}
       
	   if (elements.length > 1) {
            $(container).css('position', 'relative').css('height', settings.containerheight).addClass(settings.runningclass);
			
			for (var i = 0; i < elements.length; i++) {
                $(elements[i]).css('z-index', String(elements.length-i)).css('position', 'absolute').hide();
				if(settings.control) {
					var control = $('<img src="' + settings.control + '" alt="" class="' + settings.controlclass + '" />');
					control.click(function() {
						$.imagefader.next(container, elements, settings, $(this).parent().children().index(this), $(this).parent().children().index($(container).children("." + settings.controlclass + "s").children(".kiwi-imagefader-currentslide")));
					});
					$(container).children("." + settings.controlclass + "s").append(control);
				}
            };
			
			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);
			}
		}
	};

	$.imagefader.next = function(container, elements, settings, current, last) {
		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");
				if(settings.controlactive) {
					$(container).children("." + settings.controlclass + "s").children("." + settings.controlclass).eq(last).attr("src", settings.control);
					$(container).children("." + settings.controlclass + "s").children("." + settings.controlclass).eq(current).attr("src", settings.controlactive);
				}
			}
		}
		
		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);
			}
		}
		clearTimeout(settings.timer);
		settings.timer=setTimeout((function() {
			$.imagefader.next(container, elements, settings, current, last);
		}), settings.timeout);
	};
})(jQuery);