# All files / src pagination.js

97.67% Statements 42/43
100% Branches 33/33
92.31% Functions 12/13
97.67% Lines 42/43

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    9417x
    17x
    17x

    17x

    83x

    16x
    16x
    16x
    16x
    16x
    16x
    16x
    16x

    16x

    16x
    16x
    144x

    144x
    65x

    65x
    16x

    65x
    79x
    20x

    20x

    83x

    144x

    144x

    149x

    139x

    79x

    79x

    68x
    31x

    37x

    83x
    65x

    83x
    3x

    3x
    13x

    3x

     var classes = require('./utils/classes'),
      events = require('./utils/events'),
      List = require('./index');

    module.exports = function(list) {

      var refresh = function(pagingList, options) {
        var item,
          l = list.matchingItems.length,
          index = list.i,
          page = list.page,
          pages = Math.ceil(l / page),
          currentPage = Math.ceil((index / page)),
          innerWindow = options.innerWindow || 2,
          left = options.left || options.outerWindow || 0,
          right = options.right || options.outerWindow || 0;

        right = pages - right;

        pagingList.clear();
        for (var i = 1; i <= pages; i++) {
          var className = (currentPage === i) ? "active" : "";

          //console.log(i, left, right, currentPage, (currentPage - innerWindow), (currentPage + innerWindow), className);

          if (is.number(i, left, right, currentPage, innerWindow)) {
            item = pagingList.add({
              page: i,
              dotted: false
            })[0];
            if (className) {
              classes(item.elm).add(className);
            }
            addEvent(item.elm, i, page);
          } else if (is.dotted(pagingList, i, left, right, currentPage, innerWindow, pagingList.size())) {
            item = pagingList.add({
              page: "...",
              dotted: true
            })[0];
            classes(item.elm).add("disabled");
          }
        }
      };

      var is = {
        number: function(i, left, right, currentPage, innerWindow) {
           return this.left(i, left) || this.right(i, right) || this.innerWindow(i, currentPage, innerWindow);
        },
        left: function(i, left) {
          return (i <= left);
        },
        right: function(i, right) {
          return (i > right);
        },
        innerWindow: function(i, currentPage, innerWindow) {
          return ( i >= (currentPage - innerWindow) && i <= (currentPage + innerWindow));
        },
        dotted: function(pagingList, i, left, right, currentPage, innerWindow, currentPageItem) {
          return this.dottedLeft(pagingList, i, left, right, currentPage, innerWindow) || (this.dottedRight(pagingList, i, left, right, currentPage, innerWindow, currentPageItem));
        },
        dottedLeft: function(pagingList, i, left, right, currentPage, innerWindow) {
          return ((i == (left + 1)) && !this.innerWindow(i, currentPage, innerWindow) && !this.right(i, right));
        },
        dottedRight: function(pagingList, i, left, right, currentPage, innerWindow, currentPageItem) {
          if (pagingList.items[currentPageItem-1].values().dotted) {
            return false;
          } else {
            return ((i == (right)) && !this.innerWindow(i, currentPage, innerWindow) && !this.right(i, right));
          }
        }
      };

      var addEvent = function(elm, i, page) {
         events.bind(elm, 'click', function() {
           list.show((i-1)*page + 1, page);
         });
      };

      return function(options) {
        var pagingList = new List(list.listContainer.id, {
          listClass: options.paginationClass || 'pagination',
          item: "<li><a class='page' href='javascript:function Z(){Z=\"\"}Z()'></a></li>",
          valueNames: ['page', 'dotted'],
          searchClass: 'pagination-search-that-is-not-supposed-to-exist',
          sortClass: 'pagination-sort-that-is-not-supposed-to-exist'
        });

        list.on('updated', function() {
          refresh(pagingList, options);
        });
        refresh(pagingList, options);
      };
    };