﻿/* 2009 Hubsoft.com && SebringCreative.com (written by Jason Sebring, mail@jasonsebring.com) - Dual licensed under the MIT and GPL licenses. */
(function($) {
    $.fn.dumbCrossFade = function(settings) {
        var publicAccessorLabel = 'dumbCrossFade.publicAccessor'; var configLabel = 'dumbCrossFade.config'; if (typeof (this.data(publicAccessorLabel)) !== 'undefined') {
            var pa = this.data(publicAccessorLabel); var cg = this.data(configLabel); var args = Array.prototype.slice.apply(arguments); if (args.length > 0) {
                if (typeof (args[0]) === 'object') { if (settings) $.extend(cg, settings); var args = Array.prototype.slice.apply(arguments); if (args.length > 1) { args = args.slice(1, args.length); } else { pa.start(); return this; } }
                if (arguments.length === 1) { pa[arguments[0]](); } else if (arguments.length > 1) { var args = Array.prototype.slice.apply(arguments); args = args.slice(1, args.length); pa[arguments[0]].apply(this, args); }
            }
            return this;
        }
        var config = { 'slideType': 'slidehorizontal', 'index': 0, 'showTime': 5000, 'transitionTime': 1000, 'doHoverPause': true, 'maxZIndex': 100, 'slideChange': null, 'direction': 'forward', 'fadeInOut': false }, timeOut = null, itemArray = [], blockAnimation = false, lastIndexRequest = -1, $self = this
        $window = $(window), $body = $('body'); if (settings) $.extend(config, settings); function cancelSlideShow() { if (timeOut !== null) { window.clearTimeout(timeOut); timeOut = null; } }
        function doSlideShowNow() {
            if (blockAnimation) {
                if (arguments.length > 0) { lastIndexRequest = arguments[0]; }
                return;
            }
            var currentIndex = config.index; var nextIndex = (arguments.length > 0) ? arguments[0] : (config.index >= itemArray.length - 1) ? 0 : config.index + 1; if (config.direction === 'backward') { if (currentIndex === 0) { nextIndex = itemArray.length - 1; } else { nextIndex = currentIndex - 1; } }
            if (currentIndex == nextIndex) { return; }
            var $f = itemArray[currentIndex].show(), $n = itemArray[nextIndex]; blockAnimation = true; doneF = function() {
                $f.hide(); if (config.fadeInOut) { $f.css({ 'opacity': '1.0' }); $n.css({ 'opacity': '1.0' }); }
                blockAnimation = false; if (lastIndexRequest != -1) { doSlideShowNow(lastIndexRequest); lastIndexRequest = -1; }
            }; $f.css('z-index', (config.maxZIndex - 1) + ''); $n.css('z-index', config.maxZIndex + ''); switch (config.slideType) {
                case 'slidehorizontal': var pos = $f.position(), width = $f.width(), adjustX = '-=' + width; if (config.direction === 'forward') { $n.css({ 'left': (parseInt(pos.left) + width) + 'px' }); } else { $n.css({ 'left': (parseInt(pos.left) - width) + 'px' }); adjustX = '+=' + width; }
                    if (config.fadeInOut) { $n.css({ 'opacity': '0', 'display': 'block' }); $f.animate({ 'left': adjustX, 'opacity': '0' }, config.transitionTime, 'swing'); $n.animate({ 'left': adjustX, 'opacity': '1.0' }, config.transitionTime, 'swing', doneF); } else { $n.show(); $f.animate({ 'left': adjustX }, config.transitionTime, 'swing'); $n.animate({ 'left': adjustX }, config.transitionTime, 'swing', doneF); }
                    break; case 'slidevertical': var pos = $f.position(), height = $f.height(), adjustY = '-=' + height; if (config.direction === 'forward') { $n.css({ 'top': (parseInt(pos.top) + height) + 'px', 'display': 'block' }); } else { $n.css({ 'top': (parseInt(pos.top) - height) + 'px', 'display': 'block' }); adjustY = '+=' + height; }
                    if (config.fadeInOut) { $n.css({ 'opacity': '0', 'display': 'block' }); $f.animate({ 'top': adjustY, 'opacity': '0' }, config.transitionTime, 'swing'); $n.animate({ 'top': adjustY, 'opacity': '1.0' }, config.transitionTime, 'swing', doneF); }
                    else { $n.show(); $f.animate({ 'top': adjustY }, config.transitionTime); $n.animate({ 'top': adjustY }, config.transitionTime, doneF); }
                    break; case 'fade': $n.fadeIn(config.transitionTime, doneF); break;
            }
            if (config.slideChange !== null) { config.slideChange(nextIndex); }
            config.index = nextIndex;
        }
        function doSlideShow() { cancelSlideShow(); timeOut = window.setTimeout(function() { doSlideShowNow(); doSlideShow(); }, config.showTime); }
        $self.each(function() {
            (itemArray.length === config.index) ? $(this).show() : $(this).hide(); if (itemArray.length === 0) { if (config.doHoverPause) { $(this).parent().hover(function() { cancelSlideShow(); }, function() { cancelSlideShow(); doSlideShow(); }); } }
            itemArray[itemArray.length] = $(this);
        }); var publicAccessor = { 'jump': function(index) { cancelSlideShow(); doSlideShowNow(index); return publicAccessor; }, 'start': function() { $self.children().hide(); itemArray[config.index].show(); config.direction = 'forward'; doSlideShow(); return publicAccessor; }, 'stop': function() { cancelSlideShow(); return publicAccessor; }, 'next': function() { config.direction = 'forward'; cancelSlideShow(); doSlideShowNow(); config.direction = 'forward'; cancelSlideShow(); doSlideShow() }, 'previous': function() { config.direction = 'backward'; cancelSlideShow(); doSlideShowNow(); config.direction = 'forward'; cancelSlideShow(); doSlideShow() } }; this.data(publicAccessorLabel, publicAccessor); this.data(configLabel, config); doSlideShow(); return this;
    };
})(jQuery);
