/**
 * @author deleteme
 */
var SlideShow = Class.create();

SlideShow.prototype = {
  
  initialize: function(root, options){
    this.root = $(root);
    // console.log(this.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({
      "z-index": 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({
      "z-index": new Number(this.nextSlide.getStyle("z-index")) + 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)
      }
    );
  }
};