$(function() {
  if(document.getElementById('homeslide')) {
    $('#homeslide').homeslide();
  }
});

$.fn.homeslide = function(options) {
  var opts = $.extend({}, $.fn.homeslide.defaults, options);
  
  return this.each(function() {
    var $home = $(this);
    var $images = $home.find(opts.images);
    if($images.length < 2) {
      return;
    }
    var $content = $home.find(opts.content);
    var current = 0;
    var timer;
    var isAnimating = -1;
    var queue = -1;
    var clicked = false;
    var hover = false;
    var switchDirection = false;
    
    var width = $images.width();
    
    var $bullets = '<div class="'+opts.leftButtonClass+'"></div><span id="'+opts.bulletsId+'">';
    $images.each(function(i) {
      if(i == 0) {
        $bullets += '<span class="active"></span>';
      }
      else {
        $bullets += '<span></span>';
      }
    });
    $bullets += '</span><div class="'+opts.rightButtonClass+'"></div>';
    if(opts.bulletsAppend) {
      $home.find(opts.bulletsAppend).append($bullets);
    }
    else {
      $home.append($bullets);
    }
    $bullets = $('#'+opts.bulletsId+' span');
    
    function slideTo(num) {
      queue = -1;
      clearTimeout(timer);
      if(num >= $images.length) { num = 0; switchDirection = true; }
      if(num < 0) { num = $images.length - 1; switchDirection = true; }
      if(isAnimating == -1) {
        if(num != current) {
          isAnimating = num;
          $bullets.eq(current).removeClass('active');
          $bullets.eq(num).addClass('active');
          if((num > current && !switchDirection) || (num < current && switchDirection)) {
            switchDirection = false;
            slideDirection(num,-width,width);
          }
          else {
            switchDirection = false;
            slideDirection(num,width,-width);
          }
        }
        else {
          queue = -1;
        }
      }
      else {
        queue = num;
      }
    }
    function slideDirection(num,to,from) {
      $images.eq(current).animate({left:to},opts.animSpeed,opts.ease, function() {
        $(this).hide();
      });
      $images.eq(num).css({display:'block',left:from}).animate({left:0},opts.animSpeed,opts.ease,function() {
        current = num;
        isAnimating = -1;
        if(queue > -1) {
          slideTo(queue);
        }
        else if(!clicked && !hover) {
          startRotate(opts.delay);
        }
      });
      $content.eq(current).fadeOut(opts.animSpeed - 200);
      $content.eq(num).fadeIn(opts.animSpeed - 200);
    }
    function startRotate(delay) {
      clearTimeout(timer);
      timer = setTimeout(function() { slideTo(current + 1); },delay);
    }
    
    $bullets.each(function(i) {
      $(this).click(function() {
        clicked = true;
        slideTo(i);
      });
    });
    $home.find('div.'+opts.leftButtonClass).show().click(function() {
      clicked = true;
      if(isAnimating > -1) {
        slideTo(isAnimating - 1);
      }
      else {
        slideTo(current - 1);
      }
    });
    $home.find('div.'+opts.rightButtonClass).show().click(function() {
      clicked = true;
      if(isAnimating > -1) {
        slideTo(isAnimating + 1);
      }
      else {
        slideTo(current + 1);
      }
    });
    $home.hover(function() {
      hover = true;
      clearTimeout(timer);
    },function() {
      hover = false;
      if(!clicked) {
        startRotate(opts.delay - 2000);
      }
    });
    startRotate(opts.delay);
  });
};
$.fn.homeslide.defaults = {
  images: "ul.images li",
  content: "ul.details>li",
  leftButtonClass: "leftArrow",
  rightButtonClass: "rightArrow",
  bulletsId: "homeslide-bullets",
  bulletsAppend: null,
  animSpeed: 1200,
  delay: 6000,
  ease: 'easeInOutQuart'
};

