/*
        bamFader Plugin for jQuery
        By Anthony Bennett, Blind Acre Media
        Based on http://www.authenticsociety.com/blog/jQueryPluginTutorial_Beginner

        7 December 2010: created


        Sample Usage

                <div class="slides">
                        <div class="slide1">
                        </div>
                        <div class="slide2">
                        </div>
                        <div class="slide3">
                        </div>
                </div>

                $('.slides').bamFader(
                {
                        fadeTime:     3000,
                        holdTime:     6000,
                        pauseOnHover: true
                });
*/

(function($)
{
        $.fn.bamFader = function(userOptions)
        {       // define methods and variables
                var bamFaderObject =
                {
                        initialize: function(wrapper, userOptions)
                        {       // define default options
                                var defaultOptions =
                                {
                                        fadeTime:     3000,
                                        holdTime:     6000,
                                        zIndexA:      100,
                                        zIndexB:      200,
                                        pauseOnHover: false
                                };
                                bamFaderObject.options = $.extend(defaultOptions, userOptions || {});
                                // add tracker for current index, interval, stopped
                                bamFaderObject.curIndex = 0;
                                bamFaderObject.interval = null;
                                bamFaderObject.stopped  = false;
                                // get wrapper and its children (slides)
                                bamFaderObject.wrapper = $(wrapper);
                                bamFaderObject.slides  = bamFaderObject.wrapper.children();
                                // if less than two slides, we're done
                                if (bamFaderObject.slides.length < 2) return;
                                // set styling on wrapper, slides
                                bamFaderObject.wrapper.css(
                                {
                                        position: 'relative'
                                });
                                bamFaderObject.slides.hide().css(
                                {
                                        left:     0,
                                        position: 'absolute',
                                        top:      0
                                });
                                // show the first slide
                                $(bamFaderObject.slides.get(0)).show();
                                // set alternating z-indeces for each slide
                                bamFaderObject.slides.each(function(j, slide)
                                {
                                        $(slide).css(
                                        {
                                                zIndex: ((j % 2) ? bamFaderObject.options.zIndexA :
                                                                   bamFaderObject.options.zIndexB)
                                        });
                                });
                                // bind hover functions if pause-on-hover is true
                                if (bamFaderObject.options.pauseOnHover)
                                {
                                        bamFaderObject.wrapper.hover(function()
                                                                     {       // stop it on mouse-enter
                                                                             bamFaderObject.stopped = true;
                                                                             bamFaderObject.stop();
                                                                     },
                                                                     function()
                                                                     {       // start it on mouse-leave
                                                                             bamFaderObject.stopped = false;
                                                                             bamFaderObject.start();
                                                                     });
                                }
                                // start it up
                                bamFaderObject.start();
                        },
                        swapper: function()
                        {	// define new index
                                var newIndex = ((bamFaderObject.curIndex + 1) % bamFaderObject.slides.length);
                                // get current slide
                                var curSlide = $(bamFaderObject.slides.get(bamFaderObject.curIndex));
                                // get next slide
                                var newSlide = $(bamFaderObject.slides.get(newIndex));
                                // fade in/out appropriately depending on the current index
                                if (bamFaderObject.curIndex % 2)
                                {
                                        newSlide.fadeIn(bamFaderObject.options.fadeTime, function()
                                        {
                                                curSlide.hide();
                                                bamFaderObject.start();
                                        });
                                }
                                else
                                {
                                        newSlide.show();
                                        curSlide.fadeOut(bamFaderObject.options.fadeTime,
                                                         bamFaderObject.start);
                                }
                                // reset current index
                                bamFaderObject.curIndex = newIndex;
                        },
                        start: function()
                        {       // if stopped, do nothing
                                if (bamFaderObject.stopped) return;
                                // set interval; run swapper after holdTime miliseconds
                                bamFaderObject.interval = setTimeout(bamFaderObject.swapper,
                                                                     bamFaderObject.options.holdTime);
                        },
                        stop: function()
                        {       // clear interval
                                clearInterval(bamFaderObject.interval);
                        }
                };
                // run for each incoming object
                return this.each(function(i, wrapper)
                {
                        bamFaderObject.initialize(wrapper, userOptions);
                });
        };
})(jQuery);

