var Carousel = Class.create({
    initialize: function(slide_prefix, snippet_prefix, slides, slide_duration, default_ignore_counter) {
        this.initialized = false
        this.slide_prefix = slide_prefix
        this.snippet_prefix = snippet_prefix
        this.slides = slides
        this.current_slide = null
        this.current_effects = []
        this.slide_duration = typeof(slide_duration) == 'undefined' ? 5 : slide_duration
        this.ignore_counter = 0
        this.default_ignore_counter = typeof(default_ignore_counter) == 'undefined' ? 2 : default_ignore_counter
        
        // add event handlers and locators to slides
        var i = 0
        this.slides.each(function(o) {
            /* -- don't need event handlers for now
            this.slide(o).observe('click', function(e) {
                window.location = this.current_slide.url
            }.bind(this))
            */
            o.index = i
            i++
        }.bind(this))
        
        setInterval(this.auto_swap.bind(this), this.slide_duration * 1000)
    },
    
    start: function(pre_initialized) {
        if(pre_initialized) {
            this.current_slide = this.slides[0]
            this.initialized = true
        }
        this.swap(0, true)
        this.initialized = true
    },
    
    auto_swap: function() {
        if(this.current_effects.size()) return
        if(this.ignore_counter) {
            --this.ignore_counter
            return
        }
        
        if(this.slides.size()) {
            var index = this.current_slide.index + 1 < this.slides.size() ? this.current_slide.index + 1 : 0
            this.swap(index, true)
        }
    },
    
    swap: function(num, auto) {
        if(this.current_effects.size()) return
        if(this.slides.size() <= 1 && this.initialized) return
        if(this.current_slide && this.current_slide.index == num) return
    
        this.ignore_counter = auto ? 0 : this.default_ignore_counter;
    
        var effects = []
        var slide = this.slides[num]
        
        if(this.current_slide) {
            effects.push(new Effect.Fade(this.slide(this.current_slide), {sync: true}))
        }
        effects.push(new Effect.Appear(this.slide(slide), {sync: true}))
    
        var e = new Effect.Parallel(effects, {
            duration: 0.9,
            beforeStart: function(event) {
                if(this.current_slide) {
                    var e1 = new Effect.Fade(this.snippet(this.current_slide), {
                        queue: {position: 'end', scope: 'carousel_snippet'},
                        duration: 0.45
                    })
                    this.current_effects.push(e1)
                }
                var e2 = new Effect.Appear(this.snippet(slide), {
                    queue: {position: 'end', scope: 'carousel_snippet'},
                    duration: 0.45
                })
                this.current_effects.push(e2)
            }.bind(this),
            afterFinish: function(event) {
                this.current_effects = []
            }.bind(this)
        })
        this.current_effects.push(e)
        this.current_slide = slide
    },
    
    slide: function(slide) {
        return $(this.slide_prefix + slide.id)
    },
    
    snippet: function(slide) {
        return $(this.snippet_prefix + slide.id)
    }
})