var Core = {};

Core.Slideshow = Class.create();

Core.Slideshow.prototype = {
  targetPanel: null,
  slides: null,
  currentPosition: 0,
  timer: null,
  settings: {},
  busy: false,
  defaultSettings: {
    interval: 10,
    pager: null      
  },

  initialize: function(targetPanel, options) {
    this.targetPanel = $(targetPanel);    
    this.slides = this.targetPanel.select('> div');      
    Object.extend(this.settings, Object.extend(this.defaultSettings, options || {}));

    for(var i = 0; i < this.slides.length;i++) {
      if(i > 0) this.slides[i].hide();
    }

    if(this.settings.pager && this.settings.pager.length > 0) {
      var $this = this;
      this.settings.pager.each(function(elm){
        for(var i = 0; i < $this.slides.length;i++) {
          elm.appendChild(new Element('a', {'href': 'javascript:void(0)', 'class': 'pager'+(i==0 ? ' active' : '')}));
        }
        elm.select('> a').invoke('observe', 'click', $this.navClickListener.bind($this));          
      });
    }

    this.startTimer();
  },

  navClickListener: function(e) {

    var el = e.element();    
    var i = el.up('div').select('a').indexOf(el);

    this.moveTo(i);
    window.clearInterval(this.timer);
    this.startTimer();      
  },

  moveTo: function(i) {
    if(i==this.currentPosition || this.busy) return;

    var $this = this;      
    this.busy = true;
    new Effect.Parallel([
      new Effect.Fade(this.slides[this.currentPosition], {sync: true}),    
      new Effect.Appear(this.slides[i], {sync: true})
    ], {afterFinish: function(){ $this.busy = false; }});
    this.currentPosition = i;         
    if(this.settings.pager && this.settings.pager.length > 0) {
      this.settings.pager.each(function(elm) {
        elm.select('a').invoke('removeClassName', 'active');
        elm.select('a')[$this.currentPosition].addClassName('active');
      });
    }
  },

  autoShow: function() {
    var i = this.currentPosition+1 > this.slides.length-1 ? 0 : this.currentPosition+1;
    this.moveTo(i);
  },

  startTimer: function() {
    this.timer = setInterval(this.autoShow.bind(this), this.settings.interval*1000);
  }
}
