(function($) {

  $.fn.rotator = function(options)
  {
    var opts = $.extend({}, $.fn.rotator.defaults, options);

    return this.each(function()
    {
      var $container = $(this);

      $container.find('ul').each(function() {$(this).add($(this).prev('h4')).wrapAll('<div></div>');});

      if($container.find('> div').length == 3)
      {
        // resize based on scenario
        var _listLength = new Array();

        $container.find('ul').each(function(i)
        {
          _listLength[i] = $(this).find('li').length;
        });

        if(_listLength[2] == 0)
        {
          if(_listLength[0] == 0)
          {
            $container.find('div:first,div:last').remove();
            $container.find('div:eq(0)').css({width:711}).find('ul').css({width:647}).find('li').css({width:216}).find('a,span').css({width:149});
          }

          if(_listLength[0] == 1)
          {
            $container.find('div:last').remove();
            $container.find('div:eq(1)').css({width:474}).find('ul').css({width:412}).find('li').css({width:206}).find('a,span').css({width:139});
          }

          if(_listLength[0] > 1)
          {
            $container.find('div:last').remove();
            $container.find('div:eq(0)').css({width:474}).find('ul').css({width:412}).find('li').css({width:206}).find('a,span').css({width:139});
          }
        }
        else
        {
          if(_listLength[0] == 0)
          {
            $container.find('div:eq(0)').remove();
            $container.find('div:eq(0)').css({width:474}).find('ul').css({width:412}).find('li').css({width:206}).find('a,span').css({width:139});
          }
        }
      }
      else
      {
        switch($container.find('> div').length)
        {
          case 1:
            $container.find('> div').css({width:711}).find('ul').css({width:647}).find('li').css({width:216}).find('a,span').css({width:149});
            break;
          case 2:
            $container.find('> div:eq(1)').css({width:474}).find('ul').css({width:412}).find('li').css({width:206}).find('a,span').css({width:139});
            break;
        }
      }

      $container.find('> div:last').css({borderRight:'none'});

      $container.find('div').each(function()
      {
        var _div = $(this);

        if(_div.find('li').length > (_div.width()/237))
        {
          _div.append('<span class="button-left">&nbsp;</span>').append('<span class="button-right">&nbsp;</span>');
        }

        switch(_div.width()/237)
        {
          case 1:
            _div.find('li:eq(0)').css({left:0}).attr('isvisible','true');
            break;
          case 2:
            _div.find('li:eq(0)').css({left:0}).attr('isvisible','true');
            _div.find('li:eq(1)').css({left:206}).attr('isvisible','true');
            _div.find('li:gt(1)').css({left:-206});
            break;
          case 3:
            _div.find('li:eq(0)').css({left:0}).attr('isvisible','true');
            _div.find('li:eq(1)').css({left:216}).attr('isvisible','true');
            _div.find('li:eq(2)').css({left:432}).attr('isvisible','true');
            _div.find('li:gt(2)').css({left:-216});
            break;
        }
      });

      // bind left buttons
      $('div.additional-products div span.button-left').click(function()
      {
        var _button = $(this);

        if(_button.attr('locked') != 'true')
        {
          var _list = _button.attr('locked','true').siblings('ul').eq(0);
          var _current = _list.find('li[isvisible=true]');
          var _next = null;

          _current.each(function()
          {
            if(parseInt($(this).css('left')) == 0)
            {
              $(this).attr('isvisible','');
            }

            if(parseInt($(this).css('left')) == (_list.width() - $(this).width()) && $(this).next('li').length != 0)
            {
              _next = $(this).next('li');
            }
          });

          (_next == null) ? _next = _list.find('li:first') : null;

          _next.css({left:_list.width()});
          _current.animate({left:'-='+_current.width()},opts.slideTiming,opts.slideEasing);
          _next.animate({left:_list.width() - _current.width()},opts.slideTiming,opts.slideEasing, function() {_button.attr('locked','')}).attr('isvisible','true');
        }
      });

      // bind right buttons
      $('div.additional-products div span.button-right').click(function()
      {
        var _button = $(this);

        if(_button.attr('locked') != 'true')
        {
          var _list = _button.attr('locked','true').siblings('ul').eq(0);
          var _current = _list.find('li[isvisible=true]');
          var _next = null;

          _current.each(function()
          {
            if(parseInt($(this).css('left')) + $(this).width() > _list.width())
            {
              $(this).attr('isvisible','');
            }

            if(parseInt($(this).css('left')) == 0 && $(this).prev('li').length != 0)
            {
              _next = $(this).prev('li');
            }
          });

          (_next == null) ? _next = _list.find('li:last') : null;

          _next.css({left:-_next.width()});
          _current.animate({left:'+='+_current.width()},opts.slideTiming,opts.slideEasing);
          _next.animate({left:0},opts.slideTiming,opts.slideEasing, function() {_button.attr('locked','')}).attr('isvisible','true');
        }
      });

      $container.find('span.button-left,span.button-right').hover(
        function()
        {
          $(this).css({backgroundPosition:"0px -12px"});
        },
        function()
        {
          $(this).css({backgroundPosition:"0px 0px"});
        }
      );

      $container.find('li > img').click(function()
      {
        $(this).siblings('a').trigger('click');
      });
    });
  };

  $.fn.rotator.defaults =
  {
    slideTiming: 700,
    slideEasing: "easeOutCubic"
  };

})(jQuery);

