function slideshowBanner(bannerSelector, images, captionSelector){

    if(images == null || images[1] == null) return;

    $(function(){
    
        var pause = 4000;
        var duration = 2000;
        
        ///////////
        
        var loaders = [];
        var loaded = 0;
        var image = 0;
        var title = 0;
        var maxImage = images.length - 1;
        var interval = 0;
        
        var banner = $(bannerSelector);
        var fader = $('<div id="fader"/>').prependTo(banner);
        var controls = $('<ul/>').appendTo(banner);
        var links = [];

        var transition = false;
        
        for(var i = 0; i < images.length; i++)(function(){
            var imageId = i;
            links[i] = $('<li/>').appendTo(controls);
            $('<a href="#">' + i + '</a>').click(function(){return doPick(imageId)}).appendTo(links[i]);
        })();
        
        var allLinks = controls.children();
        
        var caption = false;
        if(captionSelector){
            caption = $(captionSelector);
            if(caption.length){
                var faderCaption = caption.clone().appendTo(fader);
                var title = caption.find('dt');
                var excerpt = caption.find('dd');
                var faderTitle = faderCaption.find('dt');
                var faderExcerpt = faderCaption.find('dd');
            }else{
                caption = false;
            }
        }
        
        preLoad(1);
        wait();
        
        function preLoad(i){
            loaders.push($('<img />').attr('src', images[i][0]).load(function(){
                loaded = i;
                if (loaded == image) 
                    beginFade();
                var next = i + 1;
                if (next <= maxImage) 
                    preLoad(next);
            }));
        }
        
        function wait(){
            setLoaded();
            interval = setInterval(doNext, pause);
        }
        
        function beginFade(){
            clearInterval(interval);
            fader.css('background-image', 'url(' + images[image][0] + ')');
            if(caption){
                faderTitle.html(images[image][1]);
                faderExcerpt.html(images[image][2]);
            }
            fader.fadeIn(duration, endFade);
        }
        
        function endFade(){
            banner.css('background-image', 'url(' + images[image][0] + ')');
            if(caption){
                title.html(images[image][1]);
                excerpt.html(images[image][2]);
            }
            fader.hide();
            wait();
        }
        
        function setLoading(){
            transition = true;
            controls.addClass('disabled');
        }
        
        function setLoaded(){
            transition = false;
            controls.removeClass('disabled');
            allLinks.removeClass('active');
            links[image].addClass('active');
        }
        
        function doNext(){
            if(++image > maxImage) image = 0;
            if(loaded >= image) beginFade();
            setLoading();
            return false;
        }
        
        function doPick(imgId){
            if(transition || imgId == image) return false;
            image = imgId;
            if(loaded >= image) beginFade();
            setLoading();
            return false;
        }
        
    });
}
