/*
* @author deleteme
*/
var SlideShow = Class.create({
  
  initialize: function(root, options){
    this.root = $(root);
    this.fresh = true;
    
    /* Setup default option values */
    this.options = $H();
    this.options['slides'] = this.root.immediateDescendants();
    this.options['fadeTime'] = 1;
    this.options['interval'] = 5;
    this.options['delay'] = 0;
    this.options['afterFinish'] = function(){};
    this.options['afterSlideFinish'] = function(){};
    
    Object.extend(this.options, $H(options));
    
    this.slides = this.options['slides'];
    this.fadeTime = this.options['fadeTime'];
    this.interval = this.options['interval'];
    this.delay = this.options['delay'];
    this.afterFinish = this.options['afterFinish'];
    this.afterSlideFinish = this.options['afterSlideFinish'];
    this.baseZ = new Number(this.slides[0].getStyle('z-index'));

    this.resetCount();
    this.setup();
  },
  setup: function(){
    this.root.makePositioned();
    this.slides.invoke('hide').invoke('setStyle', { position: 'absolute' });
    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(){
    var t = setTimeout(
       this.cycle.bindAsEventListener(this), this.delay * 1000
    );
  },
  cycle: function(){
    this.nextSlide.setStyle({
      'zIndex': new Number(this.nextSlide.getStyle('zIndex')) + 1
    });
    new Effect.Appear(
      this.nextSlide,
      {
        duration: (this.fadeTime/2),
        afterFinish: function(){
          if (this.fresh) this.update();
          if (!this.fresh){
            new Effect.Fade(this.currentSlide, {
              duration: (this.fadeTime/2),
              afterFinish: function(){ this.update(); }.bindAsEventListener(this)
            });
          }
          this.afterSlideFinish();
          if ((this.currentSlideCount == 0) && (!this.fresh)) this.afterFinish();
          if (this.fresh) this.fresh = false;
          var c = setTimeout(this.cycle.bindAsEventListener(this), this.interval * 1000);
        }.bindAsEventListener(this)
      }
    );
  }

});