﻿/**

    jQuery Fader Plugin v1.0
    (c) 2011 DBG Technologies
    Developed by Rhys Lloyd
    <Rhys@dbgtechnologies.com>

*/
(function ($) {
    
    $.fader = function (element, options) {

        this.options = { };
        element.data('fader', this);

        this.init = function(element, options) {
            
            this.options = $.extend({ }, $.fader.defaultOptions, options);
            //If Metadata plugin exists, add any metadata information from element to options
            this.options = $.metadata ? 
                $.extend({}, this.options, element.metadata()) : 
                this.options;
            
            // Fader plugin code here
            var zIndex = 4900;
            var setHeight = 0;
            var itemList = new Array();
            var currentIndex = 0;

            // Set up child elements for fading
            element.children().each(function () {
                $(this).css({
                    'z-index': zIndex,
                    'position': 'absolute'
                });
                zIndex += 1;
                itemList.push(this);
                if ($(this).outerHeight() > setHeight) setHeight = $(this).outerHeight();
            }).hide();
            element.children(':last-child').show();

            // Set up parent element
            element.css({
                'position': 'relative',
                'height': setHeight
            });

            // Realign values
            currentIndex = itemList.length - 1;
            options.fadeSpeed = options.fadeSpeed * 1000;
            options.intervalTime = options.intervalTime * 1000;
            this.currentIndex = currentIndex;
            this.itemList = itemList;
            
        };

        this.init(element, options);

        this.faderStart = function() {
            if (this.itemList.length > 1) nextItem(this, options);
        };
    };


    $.fn.fader = function(options) {
        return this.each(function() {
            (new $.fader($(this), options));
        });
    };

    function nextItem(element, options) {
        if (element.currentIndex == 0) {
            element.currentIndex = element.itemList.length - 1;
            $(element.itemList[element.currentIndex]).delay(options.intervalTime).fadeIn(options.fadeSpeed, function () {
                nextItem(element, options);
                if (options.crossFade) $(element.itemList[0]).hide();
            });
            $(element.itemList[0]).delay(options.intervalTime).fadeOut(options.fadeSpeed);

        } else {
            $(element.itemList[element.currentIndex]).delay(options.intervalTime).fadeOut(options.fadeSpeed).prev().delay(options.intervalTime).fadeIn((options.crossFade ? options.fadeSpeed : 1), function () {
                element.currentIndex -= 1;
                $(this).queue(function () {
                    nextItem(element, options);
                });
                $(this).dequeue();
            });
        }
    };

    $.fader.defaultOptions = {
        switchOn: true,
        intervalTime: 4,
        fadeSpeed: 1,
        crossFade: false
    };
    
})(jQuery);
