/**
 * @title "Ankama Japan Carousel"
 * @version "0.2 - 2010/5/21"
 *
 * @author "Matthieu Guillemot"
 * @url "http://www.ankama.jp/"
 *
 * Copyright 2010, Ankama Japan.
 */
(function($)
{
  $.fn.carousel = function(params)
  {
    // Check for required elements
    if (this.length != 1)
    {
      alert("Invalid carousel #" + $(this).attr('id'));
      return;
    }

    // "Global" carousel variables
    var carousel = this;
    var animating = false;
    var currentPage = 0;
    var carouselWidth = $(this).width();
    var panels = $('.panel', carousel);
    var pageLinks = $('.page', carousel);
    var initialMargin = parseInt($(panels[0]).css('left')) || 0;
    var initialTarget = $(panels[0]).attr('data-target');
    $('.frame', carousel).click(function()
    {
      window.location = initialTarget;
    });

    // Preparation of panels
    for (var i = 1; i < panels.length; i++)
    {
      $(panels[i]).css('display', 'block').detach();
    }

    function scroll(found)
    {
      if (animating || currentPage == found)
      {
        return;
      }

      currentPage = found;
      animating = true;

      for (i = 0; i < pageLinks.length; i++)
      {
        var node = $(pageLinks[i]);
        if (i == found)
        {
          node.addClass('selected');
        }
        else
        {
          node.removeClass('selected');
        }
      }

      var panelToSlide = panels[found];
      $('.image-container', carousel).append(panelToSlide);
      $(panelToSlide).css('left', carouselWidth + 'px');
      $('.panel', carousel).animate({
        left: '-=' + (carouselWidth - initialMargin) + 'px'
      }, 750, 'easeInOutExpo', function() {
        animating = false;
      });
      var target = $(panelToSlide).attr('data-target');
      $('.frame', carousel).click(function()
      {
        window.location = target;
      });
    }

    $('.page', carousel).click(function()
    {
      reinitAutoScroll();
      for (i = 0; i < pageLinks.length; i++)
      {
        if (pageLinks[i] == this)
        {
          scroll(i);
          break;
        }
      }
    });

    function reinitAutoScroll()
    {
      carousel.stopTime('firstAuto').stopTime('auto').oneTime(params.initialAutoTime, 'firstAuto', function()
      {
        carousel.everyTime(params.autoTime, 'auto', function()
        {
          scroll((currentPage + 1) % panels.length);
        });
      });
    }

    reinitAutoScroll();
  };
})(jQuery);
