/*
 * jQuery Plus Slider Beta 1
 * By Jamy Golden
 * http://css-plus.com
 *
 * Copyright 2010, Jamy Golden
 * Free to use under the MIT license.
 * http://www.opensource.org/licenses/mit-license.php
 */
(function($) {
  $.fn.plusSlider = function(options) {
    
    var settings = $.extend({}, $.fn.plusSlider.defaults, options),
      slider = this,
      slides = slider.children(),
      totalSlides = slides.length;
        
    // Injected HTML elements 
    slider.wrap('<div class="plusSlider" />');
    slides.addClass('child');
    slides.eq(0).addClass('current');
    
    // Slider/Fader Settings
    if(settings.sliderType == 'slider'){
    
      var slideWidth = slider.find(':first').outerWidth(true),
        sliderWidth = slideWidth * totalSlides,
        stopPosition = sliderWidth - slideWidth;
        
      slider.width(sliderWidth);
      slider.children().show();
            
    }
    else{
      slider.parent().addClass('fader');
      slider.children(':first').show();
    }

    if (totalSlides === 1){
      settings.autoPlay = false;
      settings.createArrows = false;
      setting.createPagination = false;
    }
    
    // Begin settings.pagination
    if(settings.createPagination){
      // #slider-controls
      slider.after('<div class="plusSlider-controls" />');
      var sliderControls = slider.next('.plusSlider-controls');
      sliderControls.wrap('<div class="plusSlider-controls-wrapper" />');
      // Pagination
      for(var i = 0; i < totalSlides; i++){
        sliderControls.append('<a href="#" rel="' + i + '">' + (i + 1) + '</a>');
      }
      
      sliderControls.width(sliderControls.find('a').outerWidth(true) * totalSlides);

      if(settings.sliderType == 'slider'){
        sliderControls.find('a').click(function(){
          // Don't animate while animated
          if(!slides.is(':animated')){
            var $this = $(this),
              rel = $this.attr('rel');
            $this.addClass('current').siblings().removeClass('current');
            slider.animate({left : slideWidth * rel * -1 + "px"}, settings.speed, settings.sliderEasing);              
            if(settings.autoPlay){
              clearTimer();
              beginTimer();
            }
          }
          return false;
        });
      }
      else{
        sliderControls.find('a').click(function(){
          // Don't animate while animated
          if(!slides.is(':animated')){
            var $this = $(this);
            $this.addClass('current').siblings().removeClass('current');
            slides.eq($this.attr('rel')).siblings().css('zIndex', 50).removeClass('current');
            slides.eq($this.attr('rel')).css('zIndex', 100).addClass('current').fadeIn(settings.speed, function(){
              slides.not('.current').hide();
            });
              
            if(settings.autoPlay){
              clearTimer(); 
              beginTimer();
            }
          }
          return false;
        });
      }
      sliderControls.find('a').eq(0).addClass('current');
    } // End settings.pagination
            
    // Auto Play Begins
    if(settings.autoPlay){
      clearTimer = function(){
        // Clear the timer only if it is set
        if(timer){
          window.clearInterval(timer);
        }
      }
      beginTimer = function(){
        timer = window.setInterval(function() {
          slider.nextSlide();
        }, settings.displayTime);
      }
      beginTimer();

      // Pause on hover
      if(settings.pauseOnHover){
        slider.hover(function(){
          clearTimer();
        }, function(){
          beginTimer();  
        });
      }
    } // Auto Play Ends
    
    // Create Arrows
    if(settings.createArrows){
      slider.before('<a class="arrow prev" href="#">prev</a><a class="arrow next" href="#">next</a>');
      slider.siblings('.next').click(function(){
        $(this).nextSlide();
        if(settings.autoPlay){
          clearTimer(); 
          beginTimer();
        }
          return false;
      });
      
      slider.siblings('.prev').click(function(){
        $(this).nextSlide(false);
        if(settings.autoPlay){
          clearTimer(); 
          beginTimer();
        }
        
        return false;
      });
    } // End Arrow Creation
    
    // Keyboard navigation
    if(settings.keyboardNavigation){
      $(window).keyup(function(e){
        if(e.keyCode == 39){
          slider.nextSlide();
          
          if(settings.autoPlay){
            clearTimer(); 
            beginTimer();
          }
          return false;
          
        }
        else if(e.keyCode == 37){
          slider.nextSlide(false);
            
          if(settings.autoPlay){
            clearTimer(); 
            beginTimer();
          }
          return false;

        }
      });
    }
    
    // Begin Functions
    if(settings.sliderType == 'slider'){
      jQuery.fn.nextSlide = function(direction) {
        var $this = this;
        if (direction !== false){
          direction = true;
        }
        if(direction == true && !slider.is(':animated')){
          /* stop position -1 to fix IE8 inconsistancy*/
          if(slider.position().left > (stopPosition - 1) * -1){
            if(settings.createPagination){
              sliderControls.find('a.current').removeClass('current').next().addClass('current');
            }
            slider.animate({left : "-=" + slideWidth + "px"}, settings.speed, settings.sliderEasing);
          }
          else{
            if(settings.createPagination){
              sliderControls.find('a:last').removeClass('current').siblings('a:first').addClass('current');
            }
            slider.animate({left : 0}, settings.speed, settings.sliderEasing);
          }
          
        } else if(direction == false && !slider.is(':animated')){
        
          if(slider.position().left < 0 && !slider.is(":animated")){
            if(settings.createPagination){
              sliderControls.find('a.current').removeClass('current').prev().addClass('current');
            }
            slider.animate({left : "+=" + slideWidth + "px"}, settings.speed, settings.sliderEasing);
          }
          else{
            if(settings.createPagination){
              sliderControls.find('a:first').removeClass('current').siblings('a:last').addClass('current');
            }
            slider.animate({left : "-=" + stopPosition + "px"}, settings.speed, settings.sliderEasing);
          }
          
        }
      }
    }
    else{
      jQuery.fn.nextSlide = function(direction) {
        var $this = this;
        if (direction !== false){
          direction = true;
        }
        if(direction == true && !slider.children().is(':animated')){
          if(slider.children(':last').is(":visible")){
            if(settings.createPagination){
              sliderControls.find('a:last').removeClass('current').siblings('a:first').addClass('current');
            }
            slider.children(':visible').removeClass('current').css('zIndex', 60).siblings().css('zIndex', 50);
            slider.children(':first').css('zIndex', 100).addClass('current').fadeIn(settings.speed, function(){
              slides.not('.current').hide();
            });
          } else{
            if(settings.createPagination){
              sliderControls.find('a.current').removeClass('current').next().addClass('current');
            }
            slider.children(':visible').removeClass('current').css('zIndex', 60).siblings().css('zIndex', 50);
            slider.children(':visible').next().css('zIndex', 100).addClass('current').fadeIn(settings.speed, function(){
              slides.not('.current').hide();
            });
          }
        }
        else if(direction == false && !slider.children().is(':animated')){
          if(slider.children(':first').is(":visible")){
            if(settings.createPagination){
              sliderControls.find('a:first').removeClass('current').siblings('a:last').addClass('current');
            }
            slider.children(':visible').removeClass('current').css('zIndex', 60).siblings().css('zIndex', 50);
            slider.children(':last').css('zIndex', 100).addClass('current').fadeIn(settings.speed, function(){
              slides.not('.current').hide();
            });
          } else if(!slider.children().is(':animated')){
            if(settings.createPagination){
              sliderControls.find('a.current').removeClass('current').prev().addClass('current');
            }
            slider.children(':visible').removeClass('current').siblings().css('zIndex', 50);
            slider.children(':visible').css('zIndex', 60).prev().css('zIndex', 100).addClass('current').fadeIn(settings.speed, function(){
              slides.not('.current').hide();
            });
          }
        }
      }
      
    }
  };
  //Default settings
  $.fn.plusSlider.defaults = {
    sliderType: 'fader', // Choose whether the carousel is a 'slider' or a 'fader'
    autoPlay: true, // Creats a times, looped 'slide-show'
    createArrows: true,  // Creates forward and backward navigation
    createPagination: true, // Creates Numbered pagination
    displayTime: 5000, // The amount of time the slide waits before automatically moving on to the next one. This requires 'autoPlay: true'
    keyboardNavigation: true, // The keyboard's directional left and right arrows function as next and previous buttons
    sliderEasing: 'easeInOutExpo', // Anything other than 'linear' and 'swing' requires the easing plugin
    speed: 500, // The amount of time it takes for a slide to fade into another slide
    pauseOnHover: true // Autoplay does not continue if someone hovers over Plus Slider.
  };  

})(jQuery);
