(function($) {
  /**
   * simpleSlider class
   * 
   * @param DomElement el slider wrapper element
   * @param Object settings
   */
  function SimpleSlider(el, settings) {
    var viewport = $('.slider-viewport', el),
        viewportWidth = $(viewport).width(),
        numElements = $('.slider-element-wrapper', el).length,
        currentIdx = 0,
        leftCtrl = $('.slider-ctrl.slider-left'),
        rightCtrl = $('.slider-ctrl.slider-right'),
        autoSlideInterval = null,
        blockAutoslide = false,
        reEnableAutoslideTimeout;

    /**
     * slide the elements
     * 
     * @param int newIdx
     * @return void
     */
    function slide(newIdx) {
      if (newIdx < 0) {
        newIdx = numElements - 1;
      }
      else if (newIdx > numElements - 1) {
        newIdx = 0;
      }
      
      $('.slider-elements-wrapper', el).animate({
        left: -viewportWidth * newIdx
      });
      
      currentIdx = newIdx;
    }
    
    /**
     * Autoslide helper
     * 
     * @return void
     */
    function autoSlide() {
      if (!blockAutoslide) {
        slide(currentIdx + 1);
      }
    }
    
    /**
     * disables autoslide
     * 
     * @return void
     */
    function disableAutoSlide() {
      blockAutoslide = true;
      if (reEnableAutoslideTimeout) {
        clearTimeout(reEnableAutoslideTimeout);
      }
      
      reEnableAutoslideTimeout = setTimeout(function () {
        blockAutoslide = false;
        autoSlide();
      }, settings.intervalLength);
    }
    
    // init slide
    $('.slider-elements-wrapper', el).css({
      position: 'absolute',
      left: 0,
      top: 0,
      width: numElements * viewportWidth
    });
    
    // align slider selements:
    $('.slider-element-wrapper', el).each(function (idx, sliderElement) {
      $(sliderElement).css({
        float: 'left',
        width: viewportWidth
      });
    });
    
    // init controls
    $(leftCtrl).bind('click', function (evt) {
      if (evt.target == leftCtrl[0]) {
        disableAutoSlide();
        slide(currentIdx - 1);
        return false;
      }
    });
    
    $(rightCtrl).bind('click', function (evt) {
      if (evt.target == rightCtrl[0]) {
        disableAutoSlide();
        slide(currentIdx + 1);
        return false;
      }
    });
    
    // block auto slide on mouseover
    $(viewport).bind('mouseenter', disableAutoSlide);
    
    // start autoslide
    if (settings.autoSlide) {
      autoSlideInterval = window.setInterval(autoSlide, settings.intervalLength);
    }
  }

  /**
   * plugin defaults
   */
  $.extend({
    simpleSlider: {
      defaults: {
        autoSlide: false,
        intervalLength: 10000
      }
    }
  });

  /**
   * jQuery hook
   */
  $.fn.extend( {
    simpleSlider : function(settings) {
	  var settings = $.extend($.simpleSlider.defaults, settings || {});
  
      return $(this).each(function() {
    	$(this).data('simpleSlider', new SimpleSlider(this, settings));
      });
    }
  });
})(jQuery);
