/**
 * this is the vertical table scroll / pagination plugin
 *
 * it's called 'vts' for that reason and for the lack of a better naming
 *
 * @author Robin Mehner <robin@coding-robin.de>
 */
(function($) {
  $.fn.vts = function(options) {
    var defaults = {
      /**
       * number of shown elements
       *
       * @var {Number}
       */
      showElements: 3,
      /**
       * selector to find the element for the next page click event
       *
       * @var {String}
       */
      elementForNext: '.fc-next',
      /**
       * selector to find the element for the previous page click event
       *
       * @var {String}
       */
      elementForPrevious: '.fc-prev',
      /**
       * the CSS class for disabled pagination buttons
       *
       * @var {String}
       */
      disabledClass: 'pagination-disabled',
      /**
       * the CSS class used for hiding table cells
       *
       * @var {String}
       */
      hideClass: 'displayNone'
    },
    settings            = $.extend(defaults, options),
    lastVisibleIndex    = (+settings['showElements'] + 1),
    lastItemIndex       = this.find('tbody tr:first td').length + 1,
    firstItemIndex      = 1,
    $elementForNext     = $(settings['elementForNext']),
    $elementForPrevious = $(settings['elementForPrevious']),
    $compareTable       = this;

    /**
     * disable pagination buttons if needed (the given range has reached it's borders)
     *
     * @param {Number} beginning beginning of the range
     * @param {Number} end end of the range
     */
    function disableButtons(beginning, end) {
      if (beginning === firstItemIndex) {
        $elementForPrevious.addClass(settings['disabledClass']);
      } else {
        $elementForPrevious.removeClass(settings['disabledClass']);
      }

      if (end === lastItemIndex) {
        $elementForNext.addClass(settings['disabledClass']);
      } else {
        $elementForNext.removeClass(settings['disabledClass']);
      }
    }

    /**
     * show elements in a certain range
     *
     * @param {Number} beginning beginning of the range
     * @param {Number} end end of the range
     */
    function showElementsFromTo(beginning, end) {
      $compareTable.find(
        'tbody td:nth-child(n+' + (end + 1) + '),' +
        'tfoot td:nth-child(n+' + (end + 1) + '),' +
        'thead th:nth-child(n+' + (end + 1) + ')'
      ).addClass(settings['hideClass']);

      $compareTable.find(
        'tbody td:nth-child(-n+' + end + '),' +
        'tfoot td:nth-child(-n+' + end + '),' +
        'thead th:nth-child(-n+' + end + ')'
      ).removeClass(settings['hideClass']);

      $compareTable.find(
        'tbody td:nth-child(-n+' + beginning + '),' +
        'tfoot td:nth-child(-n+' + beginning + '),' +
        'thead th:nth-child(-n+' + beginning + ')'
      ).addClass(settings['hideClass']);

      $compareTable.find('thead th:first').removeClass(settings['hideClass']);
      $compareTable.find('tfoot td:first').removeClass(settings['hideClass']);

      disableButtons(beginning, end);
    }

    /**
     * scroll a product forward
     */
    $elementForNext.click(function(event) {
      event.preventDefault();

      if (lastVisibleIndex < lastItemIndex) {
        lastVisibleIndex += 1;
        showElementsFromTo(lastVisibleIndex - (+settings['showElements']), lastVisibleIndex);
      }
    });

    /**
     * scroll a product back
     */
    $elementForPrevious.click(function(event) {
      event.preventDefault();

      if ((lastVisibleIndex - firstItemIndex) > (+settings['showElements'])) {
        lastVisibleIndex -= 1;
        showElementsFromTo(lastVisibleIndex - (+settings['showElements']), lastVisibleIndex);
      }
    });

    // initial state
    showElementsFromTo(firstItemIndex, lastVisibleIndex);

    // allow chaining, because of the jQuery plugin convention
    return this;
  };
})(jQuery);

