/*
MooSlideList - a list that slides. In MooTools.

License:
  MIT-style license.

Credits:
  posttoast ( <http://posttoast.nl> ) 2011-01-26
*/

var mooSlideList = new Class({

  Implements: [Options, Events],
  options: {
    listElement: '', // The list
    maskClass: 'slidelist-mask', // The maskclass
    wrapperClass: 'slidelist-wrapper', // The wrapperclass
    nextClass: 'button-next button',
    previousClass: 'button-previous button',
    nextText: 'Next',
    previousText: 'Previous',
    slideSpeed: 1000,
    interval: 1000, // Sets the automatic slideshow interval
    hoverStop: false // "true" will freeze the slideshow while hovering over it
  },

  initialize: function(options){

    this.setOptions(options);

    // Wait until all images are loaded
    window.addEvent('load', function(){
      this.engage();
    }.bind(this));
  },
  
  engage: function(){
    // Set current slide
    this.options.currentSlide = 0;

    // Set slide effect
    this.options.slideNow = new Fx.Tween(this.options.listElement, {
      duration: this.options.slideSpeed,
      link: 'cancel'
    });

    // Create mask
    var maskDiv = new Element('div', {
      'class': this.options.maskClass
    });

    maskDiv.wraps(this.options.listElement);

    // get mask width
    this.options.totalWidth = maskDiv.getSize().x;
    
    // Create wrapper
    var wrapperDiv = new Element('div', {
      'class': this.options.wrapperClass
    });

    wrapperDiv.wraps(maskDiv);

    // Divide into slides
    var slidesWidth = 0;
    this.options.listElement.getElements('li').each(function(el){
      slidesWidth = slidesWidth + el.getSize().x;
    });
    this.options.listElement.setStyle('width', slidesWidth * 4);
    this.options.slideQuantity = slidesWidth / maskDiv.getSize().x;

    if (this.options.slideQuantity <= 1){
      wrapperDiv.addClass('noslide');
    }

    // Create next-button
    this.options.buttonNext = new Element('a', {
      'class': this.options.nextClass,
      'text': this.options.nextText
    });
    
    if (this.options.currentSlide + 1 >= this.options.slideQuantity){
      this.options.buttonNext.addClass('inactive');
    }

    this.options.buttonNext.addEvent('click', function(){
      this.goNext();
    }.bind(this));

    this.options.buttonNext.inject(wrapperDiv, 'bottom');

    // Create previous-button
    this.options.buttonPrevious = new Element('a', {
      'class': 'inactive '+this.options.previousClass,
      'text': this.options.previousText
    });

    this.options.buttonPrevious.addEvent('click', function(){
      this.goPrevious();
    }.bind(this));

    this.options.buttonPrevious.inject(wrapperDiv, 'bottom');

    // Add active-class
    this.options.listElement.addClass('active');

    if (this.options.timed == true){
      this.start();

      if (this.options.hoverStop){
        $$(this.options.listElement).addEvents({
           mouseenter: function() { this.stop(); }.bind(this),
           mouseleave: function() { this.start(); }.bind(this)
        });
      }
    }

  },

  start: function(){
    var slideIt = function(){
      this.goNext();
    };
    this.timer = slideIt.periodical(this.options.interval, this);
  },

  stop: function(){
    clearInterval(this.timer);
  },

  goNext: function(){
    if (this.options.currentSlide + 1 < this.options.slideQuantity){
      this.options.currentSlide++;
      var x = this.options.currentSlide * (this.options.totalWidth * -1);
      if (this.options.currentSlide == 1){
        this.options.slideNow.start('left', 0, x);
      }else {
        this.options.slideNow.start('left', x);
      }
    }else if (this.options.currentSlide + 1 >= this.options.slideQuantity){
      this.options.slideNow.start('left', 0);
      this.options.currentSlide = 0;
    }
  },

  goPrevious: function(){
    if (this.options.currentSlide -1 >= 0){
      this.options.currentSlide--;
      var x = this.options.currentSlide * (this.options.totalWidth * -1);
      this.options.slideNow.start('left', x);
    }else if (this.options.currentSlide - 1 <= 0){
      this.options.currentSlide = this.options.slideQuantity - 1;
      this.options.slideNow.start('left', 0, (this.options.totalWidth * (this.options.slideQuantity - 1) * -1));
    }
  }

});
