var SproutSlideShow = Class.create();



SproutSlideShow.prototype = {

 initialize: function(container,options) {

      this.container = container

        this.parent    = this.container+'_holder'

        this.pe        = null

        this.stoppedAt = null;

        if (!options || !options.height) {

            alert('You need to set a height for the slideshow!');

            return

        }

        this.options   = {

          seconds  : 5,

            fadeDuration : 1,

            height : 0,

            list : null

        }

        Object.extend(this.options, options || {});

        this.createParent();

    },

    

    start: function(withoutInit) { 

      if (this.options.list && !withoutInit) {

        this.addListClass(0);

          this.addListEvents();

        }

    this.pe = new PeriodicalExecuter(this.cycle.bind(this), this.duration())  

  }, 

    

    stop : function() {

        this.pe.stop()

    },

    

    cycle: function() { 

    new Effect.Fade(this.container, {  

      duration: this.options.fadeDuration, 

      fps: 50, 

      afterFinish: this.finish.bind(this)

        })

  },

    

    finish : function() {

        var imgs = this.elements();

      for(var i = 0;i<imgs.length;i++) {

                    if (Element.visible(imgs[i])) {

                        Element.hide(imgs[i])

                        Element.show(imgs[(i+1)%imgs.length])

                        this.addListClass((i+1)%imgs.length);

                        break

                    }

                }

    new Effect.Appear(this.container, {

       duration: this.options.fadeDuration,

       fps: 50

    })

    },

    

    addListClass : function(num) {

        //$('debug').update(num)

        if (this.options.list) {

            var listItems = $$('#' + this.options.list + ' a ');

            for(var i=0;i<listItems.length;i++) {

              if (i == num) {

              Element.addClassName(listItems[i],'current')

                } else {

                    Element.removeClassName(listItems[i],'current')

                }

            };

        }

    },

    addListEvents : function() {

        var listItems = $$('#' + this.options.list + ' a ');

        for(var i=0;i<listItems.length;i++) {

            listItems[i].onmouseover = this.listOver.bind(this)

            listItems[i].onmouseout  = this.listOut.bind(this)

        }

    },

    listOver : function(e) {

        var imgs = this.elements();

        var event = e || window.event;

      for(var i = 0;i<imgs.length;i++) {

          Element.hide(imgs[i]);

        }

        var listItems = $$('#' + this.options.list + ' a ');

        var target = Event.element(event);



      for(var i=0;i<listItems.length;i++) {

          if (listItems[i] == target) {

                this.stop();

                this.stoppedAt = i;

                Element.addClassName(listItems[i],'current')

                Element.show(imgs[i]);

            } else {

                Element.removeClassName(listItems[i],'current')

            }

        }

    },

    listOut : function(e) {

        this.start(true);

    },



    elements : function() {

      return $(this.container).immediateDescendants();

    },

    

    duration : function() {

        return this.options.fadeDuration * 2 + this.options.seconds;

    },

    

    //Create parent DIV to control height, when hiding/showing elements

    createParent : function() {

      new Insertion.Before(this.container,'<div id="'+this.parent+'" style="height:'+this.options.height+'px"></div>');

        var html = $(this.container).innerHTML

        Element.remove(this.container);

        $(this.parent).update('<div id="'+this.container+'">'+html+'</div>');

    }

    

}
