/*
*
* Copyright (c) 2006 Millstream Web Software http://www.millstream.com.au
* 
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
* 
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
* 
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
* * 
*/

/*
* Class: Slideshow
* Written by: Andrew Tetlaw http://tetlaw.id.au
* Displays a cross-fading slideshow
* Option:default
* 	uri : [], // an array of image URIs
*		interval : 5, // seconds for each slide to be visible
*		duration : 1, // duration of fade efefct
*		fps : 50, // frames per second of slide effect; shouldn't need to adjust this
*		crossfade : true // if you don't want a cross-fade set this to false and it'll do a fade out - fade in , instead.
*/
var Slideshow = Class.create();

Slideshow.prototype = {
    initialize : function(elm, options) {
        this.elm = $(elm);
        this.counter = 0;
        this.loaded = false;
        this.options = Object.extend({
            photo : [],
            interval : 5,
            duration : 1,
            fps : 50,
            crossfade : true
        }, options || {})
        this.options.photo = $A(this.options.photo);
        //		if(FastInit) {
        //			FastInit.addOnLoad(this.start.bind(this));
        //		} else {
        Event.observe(window, 'load', this.start.bind(this));
        //		}
    },
    start: function() {
//        console.log('start... ' + this.options.photo.length + ' uris defined');
        var img = document.createElement('img');
        img.src = this.options.photo[0].uri;
        this.cycle();

        new PeriodicalExecuter(this.cycle.bind(this), this.options.interval);
    },
    cycle: function() {
        var elm = this.elm;
        var opt = this.options;
        if (this.counter++ == opt.photo.length) {
            this.counter = 1;
            this.loaded = true;
        }
        count = this.counter;
//        console.log(count + '/' + this.loaded);
        var next = document.createElement('img');
        next.src = this.options.photo[count - 1].uri;
        next.position = this.options.photo[count - 1].position;
        if (!this.loaded) {
            var preload = document.createElement('img');
            if (this.options.photo[count]) {
                preload.src = this.options.photo[count].uri;
            }
        }
//        console.log(next.src + ', position: ' + next.position);
        if (this.options.crossfade) {
            var currentSlide;
            if (elm.firstChild) {
                currentSlide = elm.firstChild;
            } else {
                currentSlide = document.createElement('div');
                elm.appendChild(currentSlide);
            }
            var nextSlide = $(document.createElement('div'));
            nextSlide.className = 'slide-image';
            nextSlide.style.backgroundImage = 'url(' + next.src + ')';
            nextSlide.style.backgroundPosition = next.position;
            nextSlide.setOpacity(0);
            elm.appendChild(nextSlide);
            new Effect.Parallel([new Effect.Fade(currentSlide, {sync:true}),
                    new Effect.Appear(nextSlide, {sync:true})],
            {duration: opt.duration, fps: opt.fps, afterFinish : function() {
                Element.remove(currentSlide)
            }}
                    );
        } else {
            new Effect.Fade(elm, {
                duration: opt.duration,
                fps: opt.fps,
                afterFinish: function() {
                    elm.style.backgroundImage = 'url(' + next.src + ')';
                    new Effect.Appear(elm, {
                        duration: opt.duration,
                        fps: opt.fps,
                        queue:'end'
                    });
                }
            })
        }
    }
};

