(function($) {
  // CONTENT SLIDER | jQUERY PLUGIN
  // Can be used either as a simple image viewer,
  // or as a slideshow of html content
  $.fn.contentSlider = function(config) {
      // Configuration options
      config = config || {};
      config.maxCycles = config.maxCycles || 0; // 0 = no automatic advance of slides
      config.displayForSec = config.displayForSec || 5;
      config.imageViewer = config.imageViewer || false;
      // Create necessary variables
      var slideshow = this,
          slides,
          slideContents,
          ln = 0,
          counter = 0,
          cycles = 0,
          maxCycles = config.maxCycles,
          displayTime = config.displayForSec * 1000,
          isImageViewer = config.imageViewer,
          activeSlide,
          indicator,
          links,
          timer,
          zoomButton;
      
      function setup() {
        // Fetch necessary elements
        slides = slideshow.find(".slide");
        slideContents = slideshow.find(".slide-content");
        ln = slides.length;
        
        if (ln < 2) { return; };
        
        slides.hide();
        
        // Add indicator with links
        if (isImageViewer) {
          indicator = $('<div class="thumbs"></div>');
          slides.each(function(i) {
            var slideNr = i + 1,
                src = $(this).attr('src');
            indicator.append($('<a href="slide' + slideNr +'"><img src="' + src + '" class="thumb" /></a>'));
          });
        }
        else {
          indicator = $('<div class="slideIndicator"></div>');
          slides.each(function(i) {
            var slideNr = i + 1;
            indicator.append($('<a class="indicator" href="slide' + slideNr +'"></a>'));
          });
        }     

        links = indicator.children("a");
        $(links[0]).addClass("active");

        if (!isImageViewer) {
          indicator.css('left', function() {
        	  return ((slideshow.width() / 2) - ((indicator.width() / 2)) + 12) + "px";
          });
        }
        else {
          zoomButton = $('<a href="#" class="zoom-button">Zoom</a>');
          slideshow.append(zoomButton);
          zoomButton.bind('click', function() {
            zoomImage();
            return false;
          });
          slides.bind('click', function() {
            zoomImage();
            return false;
          });
        }
        
        isImageViewer ? slideshow.append(indicator) : slideshow.prepend(indicator);
        
        // Event handlers (click, arrow keys)
        links.bind('click', function() {
          clearInterval(timer);
        	hideSlide(counter);
          counter = $.inArray(this, links); // inArray return index of match
          showSlide(counter);
          run();
          return false;
        });
        
        slides.bind('mouseover', function() {
          stop();
        });
        slides.bind('mouseout', function() {
          run();
        });
        
        showSlide(0);
        
      };
      
      function hideSlide(nr) {
        slideContents.eq(nr).animate({bottom: '-100px'},1000);
        $(slides[nr]).hide();
        $(links[nr]).removeClass("active");
      };
      
      function showSlide(nr) {
        activeSlide = nr;
        $(slides[nr]).fadeIn("slow");
        $(links[nr]).addClass("active");
        slideContents.eq(nr).animate({bottom: '0px'},2000);
      };
      
      function zoomImage() {
        stop();
        $(slides).lightbox({clone: true, selectedSlide: activeSlide });
      };
      
      function run() {
        // Automatic loop
        if (maxCycles === 0) { return; };
        timer = setInterval(function() {
          hideSlide(counter);
          counter === ln-1 ? (counter = 0, cycles++) : counter++;
          showSlide(counter);
          if (cycles === maxCycles) { clearInterval(timer); cycles = 0; };
        }, displayTime);
      };
      
      function stop() {
        if (maxCycles === 0) { return; };
        clearInterval(timer);
        cycles = 0;
      }
      
      setup();
      run();
      
      return this;
  };
})(jQuery);

