
var MightySlide = Class.create();

MightySlide.prototype = {

    imageArray: [],     //array holding images
    interval: 5000,     //interval between image rotate in milliseconds.
    timeoutID: null,    //ID of current timeout. (used by stop())
    currentIndex: -1,    //current image index in array.
    targetContainer: null,   //container where slide will be rendered.
    fadeDuration: 1.5,  //the time it will take to swap images.

    //
    //  initialize(), required by the lib.
    //
    initialize: function(args) { 
    
        this.targetContainer = $(args.target);
        
        if( this.targetContainer )
        {
            this.targetContainer.appendChild(Builder.node("div", {id:"slideOverlayOne", style:"z-index:1003;position:absolute;"}, Builder.node("img", {id:"slideImageOne", src:""})));
            this.targetContainer.appendChild(Builder.node("div", {id:"slideOverlayTwo", style:"z-index:1002;position:absolute;"}, Builder.node("img", {id:"slideImageTwo", src:""})));
            this.targetContainer.appendChild(Builder.node("div", {id:"slideOverlayThree", style:"z-index:1004;position:absolute;"}, Builder.node("img", {id:"slideImageThree", src:""})));
            
            //hide until start is initiated.
            $('slideOverlayOne').hide();
            $('slideOverlayTwo').hide();
            $('slideOverlayThree').hide();
            
            //build shortcuts to objects
            var th = this;
            (function(){
                var ids = 
                    'slideOverlayOne slideOverlayTwo slideImageOne slideImageTwo slideOverlayThree slideImageThree';
                $w(ids).each(function(id){ th[id] = $(id); });
            }).defer();
        }
        
        if( args.images )
        {
            this.imageArray = args.images;
        }
        
        if( args.interval )
        {
            this.interval = args.interval;
        }
    },
    
    //
    //  start(), start/resume slide
    //
    start: function(){
    
        this.rotateImage();
    },
    
    //
    //  rotateImage(), does the rotation of images.
    //
    rotateImage: function(){
    
        var nextIndex = (this.currentIndex+1 < this.imageArray.length) ? this.currentIndex+1 : 0;
        var div1, div2, img1, img2;
        
        if( nextIndex % 2 == 0 )
        {
            div1 = this.slideOverlayTwo;
            div2 = this.slideOverlayOne;
            img1 = this.slideImageTwo;
            img2 = this.slideImageOne;
        }
        else
        {
            div1 = this.slideOverlayOne;
            div2 = this.slideOverlayTwo;
            img1 = this.slideImageOne;
            img2 = this.slideImageTwo;
        }
        
        //hide while reposition.
        div1.hide();
        img1.src = this.imageArray[nextIndex];
        
        //put hidden image infront of the current visible.
        var lowZ = div1.style.zIndex;
        div1.style.zIndex = div2.style.zIndex;
        div2.style.zIndex = lowZ;
        
        new Effect.Appear(div1, { duration: this.fadeDuration, from: 0.0, to: 1 });
        
        //move pointer.
        this.currentIndex = nextIndex;

        //restart timer.
        this.timeoutID = window.setTimeout("slide.rotateImage()", this.interval);
        
        this.preloadNextImage();

    },
    
    //
    // fastDisplayImage(), display a image over the slide show.
    //
    fastDisplayImage: function(url, fadetime) {
    
        this.slideImageThree.src = url;
        new Effect.Appear(this.slideOverlayThree, { duration: fadetime, from: 0.0, to: 1 });
    },
    
    //
    // fastHideDisplayImage(), hides the overlay image.
    //
    fastHideDisplayImage: function() {
    
        this.slideOverlayThree.hide();
    },
    
    //
    // preloadNextImage(), preload next image to cache.
    //
    preloadNextImage: function() {
    
        var nextIndex = (this.currentIndex+1 < this.imageArray.length) ? this.currentIndex+1 : 0;
        
        var preloadImage = new Image();
        preloadImage.src = this.imageArray[nextIndex];
    
    },
    
    //
    // addImage(), adds more images to slideshow.
    //
    addImage: function(url){
    
        this.imageArray[this.imageArray.length] = url;
    },
    
    //
    // removeImage(), removes image from slideshow array.
    //
    removeImage: function(index) {
    
        if( this.imageArray.length < index )
        {
            this.imageArray[index] = null;
        }
    },
    
    //
    //  stop(), stop/pause slide.
    //
    stop: function(){
    
        if( this.timeoutID )
        {
            window.clearTimeout(this.timeoutID);
        }
    }
}

var slide;
