/*
 * jQuery Showcase Plugin 0.1
 * Copyright 2011, Interactive Things
 * Free to use under the MIT license.
 * http://www.opensource.org/licenses/mit-license.php
 */

 
(function($) {
  jQuery.fn.showcase = function(options) {
  /* SETTINGS
  /////////////////////////////////////////////////////////////////*/
  var settings = {
    timerIsOn:false,
    animationSpeed:400,
    animationIntervall:6000,
    startClockAfterMouseout:1000
  }
  $.extend(settings, options);
  
  return this.each(function() {
  /* VARIABLES
  /////////////////////////////////////////////////////////////////*/
  var showcase = $(this),
      slides = showcase.find('.slide'),
      activeSlide = 0,
      numberSlides = slides.length,
      locked,
      timerRunning,
      outTimer,
      clock,
      isOver = false;
      
  /* LOCKING
  /////////////////////////////////////////////////////////////////*/
  
  function unlock() {
    locked = false;
  }
  function lock() { 
    locked = true;
  }
  
  /* PAGINATION
  /////////////////////////////////////////////////////////////////*/
  
  var paginationHTML = '<ul class="pagination"></ul>';
  showcase.append(paginationHTML);
  var pagination = showcase.find('ul.pagination');
  var paginationPosition = {
    top: pagination.css('top'),
    bottom: pagination.css('bottom')
  }
  for(i=0; i<numberSlides; i++) {
    var bulletHTML = $('<li>'+(i+1)+'</li>');
    showcase.find('ul.pagination').append(bulletHTML);
    bulletHTML.data('index',i);
    bulletHTML.click(function() {
      stopClock();
      shift($(this).data('index'));
    });
  }
  setActiveBullet();
  
  function showPagination() {
    pagination.animate({
      opacity: 1,
      marginBottom: 0
    },{ 
      "duration": 100, 
      "easing": "linear" 
    });
  };
  function hidePagination() {
    pagination.animate({
      opacity: 0,
      marginBottom: -20
    },{ 
      "duration": 100, 
      "easing": "linear" 
    });
  };
  
  initialHidePagination();
  
  function initialHidePagination() {
    if(!isOver){
      outTimer = setTimeout(function() { hidePagination(); }, settings.animationIntervall - 1000);
    }else{
      clearTimeout(outTimer);
    }
  };
  
  $(this).mousemove(function(e){
    isOver = true;
    initialHidePagination();
  });
  /* TIMER
  /////////////////////////////////////////////////////////////////*/
  if(settings.timerIsOn){
    startClock();
  };
  function startClock() {
  clock = setInterval(function(e){
    shift("next");  
    }, settings.animationIntervall);
  };
  function stopClock() {
    timerRunning = false;
    clearInterval(clock);
  };
  
  /* HOVER
  /////////////////////////////////////////////////////////////////*/
  showcase.mouseleave(mouseOut);
  showcase.mouseenter(mouseEnter);
  function mouseOut() {
    isOver = false;
    outTimer = setTimeout(function() {
      if(!timerRunning){
        if(settings.timerIsOn){
          startClock();
        }
        hidePagination();
      }
    }, settings.startClockAfterMouseout)
  };
  function mouseEnter() {
    isOver = true;
    clearTimeout(outTimer);
    if(settings.timerIsOn){
      stopClock();
    }
    showPagination();
  };
  
  /* SHIFT
  /////////////////////////////////////////////////////////////////*/
  
  //Set initial front photo z-index and fades it in
  slides.eq(activeSlide)
        .css({"position": "relative"})
        .css({"z-index" : 3})
        .fadeIn(settings.animationSpeed, function(){
          slides
          .css({"display":"block"})
          .css({"cursor":"pointer"});
          slides.click(function() {
            stopClock();
            shift('next');
          });
          slides.find("a").click(function(e) {
            e.stopPropagation();
          })
        });
  
  //Bullet Nav Execution
  function setActiveBullet() { 
  	pagination.children('li').removeClass('active').eq(activeSlide).addClass('active');
  }
  
  //Animating the shift!
  function shift(direction) {
    //remember previous activeSlide
    var prevActiveSlide = activeSlide,
        slideDirection = direction;
    //exit function if bullet clicked is same as the current image
    if(prevActiveSlide == slideDirection) { return false; }
    //reset Z & Unlock
    function resetAndUnlock() {
      slides.eq(prevActiveSlide)
            .css({"z-index" : 1})
            .css({"position": "absolute"});
      unlock();
    }
    if(!locked) {
      lock();
      //deduce the proper activeImage
      if(direction == "next") {
        activeSlide++
        if(activeSlide == numberSlides) {
          activeSlide = 0;
        }
      } else if(direction == "prev") {
        activeSlide--
        if(activeSlide < 0) {
          activeSlide = numberSlides-1;
        }
      } else {
        activeSlide = direction;
        if (prevActiveSlide < activeSlide) { 
          slideDirection = "next";
        } else if (prevActiveSlide > activeSlide) { 
          slideDirection = "prev"
        }
      }
      //set to correct bullet
      setActiveBullet();
  
      //set previous slide z-index to one below what new activeSlide will be
      slides.eq(prevActiveSlide)
            .css({"position": "absolute"})
            .css({"z-index" : 2});
      
      slides.eq(activeSlide)
            .css({"position": "relative"})
            .css({"opacity" : 0})
            .css({"z-index" : 3})
            .animate({"opacity" : 1}, settings.animationSpeed, resetAndUnlock);
    }
  }
})
}
})(jQuery);

