/**
 * @author deleteme
 */
var SlideShow = Class.create({
  initialize: function(root, options){
    this.root = $(root);
    if (!this.root) return;
    this.fresh = true;
    this.options = $H({
      slides: this.root.immediateDescendants(),
      fadeTime: 1,
      interval: 5,
      delay: 0,
      afterFinish: function(){},
      afterSlideFinish: function(){}
    });
    this.applyOptions(options);
    this.baseZ = new Number(this.slides[0].getStyle('zIndex'));

    this.resetCount();
    this.setup();
  },
  applyOptions: function(options){
    this.options
      .update($H(options))
      .each(function(p){ this[p.key] = p.value; }.bind(this));
  },
  setup: function(){
    this.root.makePositioned();
    this.slides.invoke('setStyle', { position: 'absolute', display: 'none' });
    this.update();
    this.loop();
  },
  resetCount: function(){
    if (this.fresh){
      this.currentSlideCount = this.slides.length - 1;
      this.nextSlideCount = 0;
    } else {
      this.currentSlideCount = 0;
      this.nextSlideCount = 1;
    }
  },
  update: function(){
    this.currentSlide = this.slides[this.currentSlideCount];
    this.nextSlide = this.slides[this.nextSlideCount];
    this.currentSlide.setStyle({ 'zIndex': this.baseZ });
    this.currentSlideCount = this.nextSlideCount;
    if (this.currentSlideCount == this.slides.length - 1) 
      this.nextSlideCount = 0;
    else this.nextSlideCount++;
  },
  loop: function(){
    this.cycle.bind(this).delay(this.delay);
  },
  cycle: function(){
    this.nextSlide
      .setStyle({ 'zIndex': new Number(this.nextSlide.getStyle('zIndex')) + 1 })
      .appear({
        duration: (this.fadeTime/2),
        afterFinish: function(){
          if (this.fresh) this.update();
          if (!this.fresh)
            this.currentSlide.fade({
              duration: (this.fadeTime/2), afterFinish: this.update.bind(this)
            });
          this.afterSlideFinish();
          if ((this.currentSlideCount == 0) && (!this.fresh)) this.afterFinish();
          if (this.fresh) this.fresh = false;
          this.cycle.bind(this).delay(this.interval);
        }.bind(this)
      });
  }
});