var BDS = {}

BDS.Slideshow = Class.create();
BDS.Slideshow.DefaultOptions = {
  duration: 0.6,
  seconds_per_slide: 10.0,
  pause_on_mouseover: true, // TODO: pause_on_mouseover
  onChange: function() {}
}
Object.extend(BDS.Slideshow.prototype, {
  initialize: function(container, slide_selector, options) {
    this.options = Object.extend(Object.extend({},BDS.Slideshow.DefaultOptions), options || {});
    this.container = $(container);
    this.slides = Selector.findChildElements(this.container, [slide_selector]);
    this.currentSlide = 0;
    this.paused = false;
    var self = this;
    
    this.slides.each(function(slide, idx) {
      if (idx > 0) Element.hide(slide);
      if (self.options.pause_on_mouseover) {
        // Event.observe(slide, 'mouseover', self.pause.bind(self))
        // Event.observe(slide, 'mouseout', self.unpause.bind(self))
      }
    })
    
    this.start();
    this.options.onChange(this);
  },
  
  forward: function() {
    var newSlideIdx = this.currentSlide+1;
    if (newSlideIdx >= this.slides.length) newSlideIdx = 0;
    this.transition(newSlideIdx);
  },
  
  backward: function() {
    var newSlideIdx = this.currentSlide-1;
    if (newSlideIdx <= 0) newSlideIdx = this.slides.length-1;
    this.transition(newSlideIdx);
  },
  
  jumpToSlide: function(idx) {
    if (idx < 0 || idx >= this.slides.length) return false;
    this.stop();
    this.transition(idx);
  },
  
  start: function() {
    if (this.interval) return;
    this.interval = setInterval(this.forward.bind(this), this.options.seconds_per_slide * 1000);
    this.container.addClassName('playing');
  },
  
  stop: function() {
    if (!this.interval) return;
    clearInterval(this.interval);
    this.interval = null;
    this.container.removeClassName('playing');
  },
  
  pausePlay: function() {
    if (this.interval)  this.stop();
    else                this.start();
  },
  
  /* ========== */
  
  transition: function(newSlideIdx) {
    var oldSlideIdx = this.currentSlide;
    if (newSlideIdx == oldSlideIdx) return;
    if (this.fadeIn && this.fadeIn.state != 'finished') this.fadeIn.cancel();
    if (this.fadeOut && this.fadeOut.state != 'finished') {
      this.fadeOut.cancel(); Element.hide(this.fadeOut.element);
    }
    this.fadeOut = new Effect.Fade(this.slides[oldSlideIdx], {duration: this.options.duration});
    this.fadeIn = new Effect.Appear(this.slides[newSlideIdx], {duration: this.options.duration});
    this.currentSlide = newSlideIdx;
    this.options.onChange(this);
  }
  
});

