/* Made by marcus.olovsson@adeprimo.se */

(function($){
  $.fn.slideshow = function(options, value) {
    var defaults = {
      items: '.item',
      navigation: false,
      pagination: false,
      transition: 'slide',
      interval: 5000,
      speed: "slow",
      height: "auto"
    };    
    var options = $.extend(defaults, options);
    
    return this.each(function() {
      var slideshow = $(this);
      var current = 4;
      var animating = false;
      var items = slideshow.find(options.items);
      var timer = null;
      
      slideshow.find(options.items+':gt(0)').hide();
      var previous = function() {
        if (current == 1) {
          slideTo(items.length);
        } else {
          slideTo(current-1);
        }
      }
      
      var next = function() {
        if (current == items.length) {
          slideTo(1);
        } else {
          slideTo(current+1);
        }
      }
      
      var slideTo = function(to) {
        
        if (animating == true) {
          return false;
        }
        
        animating = true;
        
        clearTimeout(timer);
        
        var currentSlide = items.eq(current-1);
        var nextSlide = items.eq(to-1);
        
        if (options.pagination == true) {
          slideshow.find(".slide:eq("+(current-1)+")").removeClass("current");
          slideshow.find(".slide:eq("+(to-1)+")").addClass("current");
        }

        // Transitions
        
        if (options.transition == "slideleft") {
        
          nextSlide.css("left", currentSlide.outerWidth());
          nextSlide.show();

          currentSlide.animate({
            "left": (0-currentSlide.outerWidth())
          }, options.speed);

          nextSlide.css("left", currentSlide.outerWidth());

          nextSlide.animate({
            "left": 0
          }, options.speed, function() {
            currentSlide.hide();
            current = to;
            animating = false;
            timer = setTimeout(function(){ next(); }, options.interval);
          });
        
        } else if (options.transition == "slideright") {
          
          nextSlide.css("left", 0-currentSlide.outerWidth());
          nextSlide.show();

          currentSlide.animate({
            "left": (currentSlide.outerWidth())
          }, options.speed);

          nextSlide.animate({
            "left": 0
          }, options.speed, function() {
            currentSlide.hide();
            current = to;
            animating = false;
            timer = setTimeout(function(){ next(); }, options.interval);
          });

        } else if (options.transition == "slide") {
      
          if (to < current) {
            nextSlide.css("left", 0-currentSlide.outerWidth());
          } else {
            nextSlide.css("left", currentSlide.outerWidth());
          }
          nextSlide.show();

          if (to < current) {
            currentSlide.animate({
              "left": (currentSlide.outerWidth())
            }, options.speed);
          } else {
            currentSlide.animate({
              "left": (0-currentSlide.outerWidth())
            }, options.speed);

            nextSlide.css("left", currentSlide.outerWidth());
          }

        
          nextSlide.animate({
            "left": 0
          }, options.speed, function() {
            currentSlide.hide();
            current = to;
            animating = false;
            timer = setTimeout(function(){ next(); }, options.interval);
          });
        
        } else if (options.transition == "crossfade") {

          currentSlide.fadeOut(options.speed);
          nextSlide.fadeIn(options.speed, function() {
            current = to;
            animating = false;
            timer = setTimeout(function(){ next(); }, options.interval);
          });

        } else {

          nextSlide.css("z-index", 1);
          nextSlide.fadeIn(options.speed, function() {
            currentSlide.hide();
            nextSlide.css("z-index", 0);
            current = to;
            animating = false;
            timer = setTimeout(function(){ next(); }, options.interval);
          });

        }

      }

      if (options.height == "auto") {
        slideshow.css("height", items.eq(0).outerHeight());
      }

      if (options.navigation == true && items.length > 1) {
        slideshow.append("<ul class=\"navigation\"><li class=\"previous\"><a href=\"#\">Previous</a></li><li class=\"next\"><a href=\"#\">Next</a></li></ul>");
        slideshow.find(".previous a").click(function(e) { previous(); e.preventDefault(); });
        slideshow.find(".next a").click(function(e) { next(); e.preventDefault(); });
      }
      
      if (options.pagination == true && items.length > 1) {
        var html = $("<ul class=\"pagination\"></ul>");
        
        for (i = 0; i<items.length; i++) {
          html.append("<li class=\"slide\"><a href=\"#\">"+(i+1)+"</a></li>");
        }
        
        html.find(".slide a").click(function (e) { slideTo(parseInt($(this).text())); e.preventDefault(); });
        html.find(".slide:eq(0)").addClass("current");
        slideshow.append(html);
      }
    
      if (options.interval > 0 && items.length > 1) {
        timer = setTimeout(function(){ next(); }, options.interval);
      }
    
    });
    
  }
})(jQuery);
