/**
 * @author Aurélien MANCA
 * @addon duration params added by RG - 20100501
 * @extends infinite carousel from Stéphane Roucheray
 * @see docs.jquery.com
 */

var plemiCarousel = {
  _settings : new Array(),
  val : function(k,v) {
    var t = this;
    if (!v){
      return t._settings[k];
    }
    else {
      return t._settings[k] = v;
    }
  },
  removeVal : function(k) {
    var t = this;
      return delete t._settings[k];
  },
  getSettings : function(e) {
    var t = this, a = 'ALL SETTINGS :\n';
    for (k in t._settings){
      a += '- '+k+' = '+t._settings[k]+'\n';
    }
    alert(a);
  },
  deleteWithHash : function(s) {
    var t = this, a = 'ALL SETTINGS :\n', r = new RegExp(s), w;
    for (k in t._settings){
      if (r.test(k)){
        t.removeVal(k);
      }
    }
  },
  init : function(element, options){
    var t = this, carousel = jQuery('.carousel',jQuery(element)),
    sliderList = carousel.children()[0];

    if (sliderList) {
      var elmnts = jQuery(sliderList).children(),
      previous = jQuery('.prev',jQuery(element)),
      next = jQuery('.next',jQuery(element)),
      pause = jQuery('.pause',jQuery(element)),
      play = jQuery('.play',jQuery(element)),
      stop = jQuery('.stop',jQuery(element));

      // Override if exists
      t.stop(element, play, pause, previous, next);

      t.val('numElmts['+element+']', elmnts.length)
      if (elmnts.length > 1){
        // Set params and check options
    	if (options['duration']){
          t.val('duration['+element+']', options['duration']);
        }
        else {
          t.val('duration['+element+']', 500);
        }
    	if (options['effect']){
          t.val('effect['+element+']', options['effect']);
        }
        else {
          t.val('effect['+element+']', 'swing');
        }
        if (options['layout'] == 'vertical'){
          t.val('layout['+element+']', 'vertical');
          t.val('layout_dim['+element+']', 'height');
          t.val('layout_dir['+element+']', 'top');
          t.val('increment['+element+']', jQuery(sliderList).children().outerHeight("true"));
          t.val('sliderSize['+element+']', carousel.height());
        }
        else {
          t.val('layout['+element+']', 'horizontal');
          t.val('layout_dim['+element+']', 'width');
          t.val('layout_dir['+element+']', 'left');
          t.val('increment['+element+']', jQuery(sliderList).children().outerWidth("true"));
          t.val('sliderSize['+element+']', carousel.width());
        }

        // Objects
        t.val('shownInViewport['+element+']', Math.round(t.val('sliderSize['+element+']') / t.val('increment['+element+']')));
        t.val('firstElementOnViewPort['+element+']', 1);
        t.val('isAnimating['+element+']', 'false');
        t.val('autoScroll['+element+']', 'false');

        // Infinite trick
        for (i = 0; i < t.val('numElmts['+element+']'); i++) {
          jQuery(elmnts[i]).attr('rel','carouselItem'+i);
          if ((i < t.val('shownInViewport['+element+']')) && (t.val('numElmts['+element+']') > t.val('shownInViewport['+element+']'))){
            jQuery(sliderList).css(t.val('layout_dim['+element+']'), (t.val('numElmts['+element+']')+t.val('shownInViewport['+element+']'))*t.val('increment['+element+']') + t.val('increment['+element+']') + "px");
            jQuery(sliderList).append(jQuery(elmnts[i]).clone());
          }
        }

        // Button PREVIOUS
        previous.show().unbind('click').click(function(event){
          t.previous(element, sliderList);
          return false;
        });

        // Button NEXT
        next.show().unbind('click').click(function(event){
          t.next(element, sliderList);
          return false;
        });

        // AutoScroll
        if (options['autoscroll'] > 0){
          t.val('autoScroll['+element+']', 'true');
          t.val('autoScrollDelay['+element+']', options['autoscroll']);
          t.val('autoScrollPause['+element+']', 'false');
          
          // Launch the scroll with delay
          t.start(element, sliderList, play, pause);

          // Pause the scroll on mouse over
          jQuery(element).hover(
            function(){
              t.mouseIn(element);
            },
            function(){
              t.mouseOut(element);
            }
          );
          // Or on pause button
          pause.unbind('click').click(function(){
            t.pause(element, play, pause);
            return false;
          });

          // And Play again
          play.unbind('click').click(function(){
            t.play(element, play, pause);
            return false;
          });

          // Deactivate the scroll on stop button
          stop.unbind('click').click(function(){
            t.stop(element, play, pause, previous, next);
            return false;
          });
        }
      }
    }
    return true;
  },
  previous : function(element, sliderList){
    var t = this, i = t.val('firstElementOnViewPort['+element+']');
    if (t.val('isAnimating['+element+']') == 'false') {
      if (i == 1) {
        jQuery(sliderList, jQuery(element)).css(t.val('layout_dir['+element+']'), "-" + t.val('numElmts['+element+']') * t.val('increment['+element+']') + "px");
        t.val('firstElementOnViewPort['+element+']', t.val('numElmts['+element+']'));
      }
      else {
        t.val('firstElementOnViewPort['+element+']', --i);
      }
      
      if (t.val('layout['+element+']') == 'horizontal'){
        jQuery(sliderList, jQuery(element)).animate({
          "left" : "+=" + t.val('increment['+element+']') + "px",
          y: 0,
          queue: true
        }, t.val('duration['+element+']'), t.val('effect['+element+']'), function(){
          t.val('isAnimating['+element+']', 'false');
        });
      }
      else if (t.val('layout['+element+']') == 'vertical'){
        jQuery(sliderList, jQuery(element)).animate({
          "top" : "+=" + t.val('increment['+element+']') + "px",
          x: 0,
          queue: true
        }, t.val('effect['+element+']'), function(){
          t.val('isAnimating['+element+']', 'false');
        });
      }
      t.val('isAnimating['+element+']', 'true');
    }
    return true;
  },
  next : function(element, sliderList){
    var t = this, i = t.val('firstElementOnViewPort['+element+']');
    if (t.val('isAnimating['+element+']') == 'false') {
      if (i == t.val('numElmts['+element+']')) {
        t.val('firstElementOnViewPort['+element+']', 1);
        jQuery(sliderList, jQuery(element)).css(t.val('layout_dir['+element+']'), "0px");
      }
      else {
        t.val('firstElementOnViewPort['+element+']', ++i);
      }

      if (t.val('layout['+element+']') == 'horizontal'){
        jQuery(sliderList, jQuery(element)).animate({
          "left" : "-=" + t.val('increment['+element+']') + "px",
          y: 0,
          queue: true
        }, t.val('duration['+element+']'), t.val('effect['+element+']'), function(){
          t.val('isAnimating['+element+']', 'false');
        });
      }
      else if (t.val('layout['+element+']') == 'vertical'){
        jQuery(sliderList, jQuery(element)).animate({
          "top" : "-=" + t.val('increment['+element+']') + "px",
          x: 0,
          queue: true
        }, t.val('effect['+element+']'), function(){
          t.val('isAnimating['+element+']', 'false');
        });
      }
      t.val('isAnimating['+element+']', 'true');
    }
    return true;
  },
  mouseIn : function(element){
    var t = this;
    t.val('autoScroll['+element+']', 'false');
    return true;
  },
  mouseOut : function(element){
    var t = this;
    if (t.val('autoScrollPause['+element+']') == 'false'){
      t.val('autoScroll['+element+']', 'true');
    }
    return true;
  },
  start : function(element, sliderList, play, pause){
    var t = this;
    t.val('intervalId['+element+']', window.setInterval(
      function(){
        if ((t.val('autoScroll['+element+']') != 'false') && (t.val('autoScrollPause['+element+']') != 'true')){
          t.next(element, sliderList);
        }
      },
      t.val('autoScrollDelay['+element+']')
    ));
    play.hide();
    pause.show();
    return true;
  },
  play : function(element, play, pause){
    var t = this;
    t.val('autoScroll['+element+']', 'true');
    t.val('autoScrollPause['+element+']', 'false');
    play.hide();
    pause.show();
    return true;
  },
  pause : function(element, play, pause){
    var t = this;
    t.val('autoScroll['+element+']', 'false');
    t.val('autoScrollPause['+element+']', 'true');
    play.show();
    pause.hide();
    return true;
  },
  stop : function(element, play, pause, previous, next){
    var t = this;
    // Stop autoScroll
    window.clearInterval(t.val('intervalId['+element+']'));
    // Remove all variables
    t.deleteWithHash(element);
    // Unactivate carousel
    jQuery(element).unbind();
    play.hide();
    pause.hide();
    previous.hide();
    next.hide();
    return true;
  }
}
