(function($){

  var methods = {
    init : function( options ) { 
    
        var defaults = {
         viewportShowItems: 3
         }; //default options.

        //inherit from provided configuration
        var options = $.extend(defaults, options);

        return this.each(function() {        

            var $this = $(this);

            // simpleSlider
            //init vars
            var elementWidth = $this.find('.elementContainer').outerWidth();
            var viewportShowItems = options.viewportShowItems;

            var viewportStart = 0;
            var viewportEnd = viewportShowItems -1;


            //determine and set slider width (depending on amount of movies)
            var elements = $this.find('.elementContainer');
            var elementsCount = elements.size();
            var sliderWidth = elements.size() * elementWidth;
            var slider = $this.find('.slider');
            slider.width(sliderWidth);

            //calculate and generate number of pages/slots
            var slotCount = Math.ceil( elementsCount / viewportShowItems );
            for(var i=1;i<=slotCount;i++) {
                $this.find('.slots').append('<a href="#" class="slot number_'+i+'"><!-- --></a>');
            }

            //more cached jQuery objects
            var prevButton = $this.find('.prev');
            var nextButton = $this.find('.next');
            var slots = $this.find('.slot');
            
            $(slots).each(function(index){
                $(this).bind('click', function(){
                    sliderGotoSlot(index+1);
                    return false;
                });
            })

            function scrollSlider(amount, speed) {
                if (!speed) {
                    var speed=500;
                }
                slider.animate({
                    left: '+='+amount
                }, speed, function() {
                    // Animation complete.
                    });       
            }

            //control buttons visibility
            function setSlots() {
                //find out current page/slot
                var currentSlot = Math.ceil( (viewportEnd+1) / viewportShowItems);
                //activate
                $this.find('.slot').removeClass('on');
                $this.find('.slot:nth-child('+currentSlot+')').addClass('on'); 
            }
            setSlots(); //call once on init



            //control buttons visibility
            function setControls() {     
                //remove controls if less than x elements
                if (elementsCount <= viewportShowItems) {          
                    $this.find('.controls').remove();
                   return false; 
                }          

                if (viewportStart > 0) {
                    prevButton.addClass('on');
                    prevButton.css('opacity', '1');
                } else {
                    prevButton.removeClass('on');
                    prevButton.css('opacity', '0.3');
                }   
                if (viewportEnd  < elementsCount-1) {
                    nextButton.addClass('on');
                    nextButton.css('opacity', '1');
                } else {
                    nextButton.removeClass('on');
                    nextButton.css('opacity', '0.3');
                }   

            }
            setControls(); //call once on init

            //goto (scroll if needed) to a certain movie 
            function sliderGotoElement(elementNumber) {
                var way = 0;
                var scrollingAmount = 0;

                if (elementNumber >= viewportEnd) {
                    way = elementNumber - viewportEnd;
                    scrollingAmount = way * elementWidth;
                    scrollSlider(-scrollingAmount);
                    //update viewport & controls
                    viewportStart += way;
                    viewportEnd += way;
                    setControls();
                    setSlots();
                } 
                if (elementNumber <= viewportStart) {
                    way = elementNumber - viewportStart;
                    scrollingAmount = way * elementWidth;
                    scrollSlider(-scrollingAmount);
                    //update viewport & controls
                    viewportStart += way;
                    viewportEnd += way;
                    setControls();
                    setSlots();
                } 
                var elementNumberNth = elementNumber+1;          
            }

            function sliderGotoSlot(slotNumber) {
                //find out viewportStart and End for the Slot
                var newViewportEnd = slotNumber * viewportShowItems;
                var elementNumber = newViewportEnd - viewportShowItems;
                
                sliderGotoElement(elementNumber);
            }

            //next function
            nextButton.live('click', function(){
                if (viewportEnd === elementsCount-1) {
                    return false;
                } else {
                    scrollSlider(-elementWidth);
                    //change viewport
                    viewportStart++;
                    viewportEnd++;
                    setControls();
                    setSlots();
                    return false;
                }
            });

            //previous function
            prevButton.live('click', function(){
                if(viewportStart === 0) {
                    return false;
                } else {
                    scrollSlider(elementWidth);
                    //change viewPort
                    viewportStart--;
                    viewportEnd--;
                    setControls();
                    setSlots();
                    return false;   
                }
            }); 
        });//.each end        
    
    }// init function end
  };//methods end


  $.fn.simpleSlider = function(method) {
    // Method calling logic
    if ( methods[method] ) {
      return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' || ! method ) {
      return methods.init.apply( this, arguments );
    } else {
      $.error( 'Method ' +  method + ' does not exist on jQuery.simpleSlider' );
    }    
  };

})(jQuery);
