$(function(){
    var fadeDelay = 3000;    
    var fadeSpeed = 1800;
    
    var timeout = null;
    var timeoutStart = null;
    var timeoutRemaining = null;
    var bannerData = null;
    var firstImage = null;
    var currentSlide = 0;
    var preloadAll = true;
    
    
    var slider = $('#slider');
    var customBtns = $('.slider-nav', slider);
    
   $.getJSON('/modules/banners/get_banner_data.php', function(data){
        bannerData = data;

        $(['/modules/banners/images/learnMoreSprite.png']).preload();
        $(['/modules/banners/images/dotsSprite.png']).preload();
        $(['/modules/banners/images/prevArrow.png']).preload();
        $(['/modules/banners/images/nextArrow.png']).preload();
        
        
        var callback = function(){
            $('.slide:first img').hide();
                
            if(bannerData.length > 1){
                //custom slide buttons
                customBtns.show();
                $('.slide-prev, .slide-next', slider).show();
                
                $('a:first', customBtns).addClass('current');
                $('a', customBtns).click(function(){
                    var idx = $('a', customBtns).index(this);
                    nextImage(idx, true);
                    timeoutRemaining = null;
                    return false;
                });
                
                $('.slide-next', slider).click(function(){
                    var idx = (currentSlide == bannerData.length-1) ? 0 : currentSlide+1;
                    nextImage(idx, true);
                    timeoutRemaining = null;
                    return false;
                });
                
                $('.slide-prev', slider).click(function(){
                    var idx = (currentSlide == 0) ?  bannerData.length-1 : currentSlide-1;
                    nextImage(idx, true);
                    timeoutRemaining = null;
                    return false;
                });
                //end custom buttons
                
                nextImage();
            }
        };
        
        currentSlide = bannerData.length-1;
        preloadNext(currentSlide, callback);
        
    });

    
    function buildSlideLink(idx){
        if(bannerData[idx].link)
            $('.slide:last', slider).append(bannerData[idx].link).find('a:last').addClass('slide-link').fadeIn(fadeSpeed);
    }  
    
    function preloadNext(idx, callback){
        if(!idx) idx = currentSlide;
        var nextSlide = (idx == bannerData.length-1) ? 0 : idx+1;
        $([bannerData[nextSlide].image]).preload({
            onFinish: function(){
                if(preloadAll){
                    nextSlide = (idx == bannerData.length-1) ? 0 : idx+1;
                    if(nextSlide != 0) setTimeout( function(){ preloadNext(nextSlide); }, 2000);
                    else preloadAll = false;
                }
                if(callback) callback.call(this);
            }    
        });
    }
    
    function nextImage(idx, pause){
        $('.slide:eq(1):animated').stop().css('opacity', 1);
        $('.slide:eq(0):animated').stop().remove();
        
        clearTimeout(timeout);
        timeout = null;
        
        if(idx == null){
            var nextSlide = (currentSlide == bannerData.length-1) ? 0 : currentSlide+1;
        }
        else{
            var nextSlide = idx;
        }
        
        if(!bannerData[nextSlide]) return null;
        
        currentSlide = nextSlide;
        
        //custom slide buttons
        $('a', customBtns).removeClass('current').eq(currentSlide).addClass('current');
        
        var slide = $('.slide:first', slider);
        var newSlide = $('<div/>').hide().addClass('slide').insertAfter(slide);
        $('<img/>').attr('src', bannerData[currentSlide].image).appendTo(newSlide);
        buildSlideLink(currentSlide);
        
        slide.fadeOut(fadeSpeed, function(){ $(this).remove(); });
        newSlide.fadeIn(fadeSpeed, function(){
            if(!pause){
                doTimeout();              
                preloadNext();
            }
        });
        
    }
    
    function doTimeout(delay){
        if(isNaN(delay)) delay = fadeDelay;
        
        clearTimeout(timeout);
        timeout = setTimeout(function(){nextImage(null)}, delay);
        timeoutStart = (new Date()).getTime();
    }
    
    
    $(slider).hover(
        function(){
            if(timeout == null) return;
            
            clearTimeout(timeout);
            timeout = null;
            
            var curTime = (new Date()).getTime();
            timeoutRemaining = fadeDelay - (curTime - timeoutStart);
        },
        function(){
            if(timeout == null && timeoutRemaining)            
                doTimeout(timeoutRemaining);
        }
    );
});








/**
 * jQuery.Preload - Multifunctional preloader
 * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com
 * Dual licensed under MIT and GPL.
 * Date: 3/25/2009
 * @author Ariel Flesler
 * @version 1.0.8
 */
;(function($){var h=$.preload=function(c,d){if(c.split)c=$(c);d=$.extend({},h.defaults,d);var f=$.map(c,function(a){if(!a)return;if(a.split)return d.base+a+d.ext;var b=a.src||a.href;if(typeof d.placeholder=='string'&&a.src)a.src=d.placeholder;if(b&&d.find)b=b.replace(d.find,d.replace);return b||null}),data={loaded:0,failed:0,next:0,done:0,total:f.length};if(!data.total)return finish();var g=$(Array(d.threshold+1).join('<img/>')).load(handler).error(handler).bind('abort',handler).each(fetch);function handler(e){data.element=this;data.found=e.type=='load';data.image=this.src;data.index=this.index;var a=data.original=c[this.index];data[data.found?'loaded':'failed']++;data.done++;if(d.enforceCache)h.cache.push($('<img/>').attr('src',data.image)[0]);if(d.placeholder&&a.src)a.src=data.found?data.image:d.notFound||a.src;if(d.onComplete)d.onComplete(data);if(data.done<data.total)fetch(0,this);else{if(g&&g.unbind)g.unbind('load').unbind('error').unbind('abort');g=null;finish()}};function fetch(i,a,b){if(a.attachEvent&&data.next&&data.next%h.gap==0&&!b){setTimeout(function(){fetch(i,a,1)},0);return!1}if(data.next==data.total)return!1;a.index=data.next;a.src=f[data.next++];if(d.onRequest){data.index=a.index;data.element=a;data.image=a.src;data.original=c[data.next-1];d.onRequest(data)}};function finish(){if(d.onFinish)d.onFinish(data)}};h.gap=14;h.cache=[];h.defaults={threshold:2,base:'',ext:'',replace:''};$.fn.preload=function(a){h(this,a);return this}})(jQuery);

