1(function ($, w, undefined) { 2 if (w.footable === undefined || w.footable === null) 3 throw new Error('Please check and make sure footable.js is included in the page and is loaded prior to this script.'); 4 5 var defaults = { 6 paginate: true, 7 pageSize: 10, 8 pageNavigation: '.pagination', 9 firstText: '«', 10 previousText: '‹', 11 nextText: '›', 12 lastText: '»', 13 limitNavigation: 0, 14 limitPreviousText: '...', 15 limitNextText: '...' 16 }; 17 18 function pageInfo(ft) { 19 var $table = $(ft.table), data = $table.data(); 20 this.pageNavigation = data.pageNavigation || ft.options.pageNavigation; 21 this.pageSize = data.pageSize || ft.options.pageSize; 22 this.firstText = data.firstText || ft.options.firstText; 23 this.previousText = data.previousText || ft.options.previousText; 24 this.nextText = data.nextText || ft.options.nextText; 25 this.lastText = data.lastText || ft.options.lastText; 26 this.limitNavigation = parseInt(data.limitNavigation || ft.options.limitNavigation || defaults.limitNavigation, 10); 27 this.limitPreviousText = data.limitPreviousText || ft.options.limitPreviousText; 28 this.limitNextText = data.limitNextText || ft.options.limitNextText; 29 this.limit = this.limitNavigation > 0; 30 this.currentPage = data.currentPage || 0; 31 this.pages = []; 32 this.control = false; 33 } 34 35 function Paginate() { 36 var p = this; 37 p.name = 'Footable Paginate'; 38 39 p.init = function (ft) { 40 if (ft.options.paginate === true) { 41 if ($(ft.table).data('page') === false) return; 42 p.footable = ft; 43 $(ft.table) 44 .unbind('.paging') 45 .bind({ 46 'footable_initialized.paging footable_row_removed.paging footable_redrawn.paging footable_sorted.paging footable_filtered.paging': function () { 47 p.setupPaging(); 48 } 49 }) 50 //save the filter object onto the table so we can access it later 51 .data('footable-paging', p); 52 } 53 }; 54 55 p.setupPaging = function () { 56 var ft = p.footable, 57 $tbody = $(ft.table).find('> tbody'); 58 59 ft.pageInfo = new pageInfo(ft); 60 61 p.createPages(ft, $tbody); 62 p.createNavigation(ft, $tbody); 63 p.fillPage(ft, $tbody, ft.pageInfo.currentPage); 64 }; 65 66 p.createPages = function (ft, tbody) { 67 var pages = 1; 68 var info = ft.pageInfo; 69 var pageCount = pages * info.pageSize; 70 var page = []; 71 var lastPage = []; 72 info.pages = []; 73 var rows = tbody.find('> tr:not(.footable-filtered,.footable-row-detail)'); 74 rows.each(function (i, row) { 75 page.push(row); 76 if (i === pageCount - 1) { 77 info.pages.push(page); 78 pages++; 79 pageCount = pages * info.pageSize; 80 page = []; 81 } else if (i >= rows.length - (rows.length % info.pageSize)) { 82 lastPage.push(row); 83 } 84 }); 85 if (lastPage.length > 0) info.pages.push(lastPage); 86 if (info.currentPage >= info.pages.length) info.currentPage = info.pages.length - 1; 87 if (info.currentPage < 0) info.currentPage = 0; 88 if (info.pages.length === 1) { 89 //we only have a single page 90 $(ft.table).addClass('no-paging'); 91 } else { 92 $(ft.table).removeClass('no-paging'); 93 } 94 }; 95 96 p.createNavigation = function (ft, tbody) { 97 var $nav = $(ft.table).find(ft.pageInfo.pageNavigation); 98 //if we cannot find the navigation control within the table, then try find it outside 99 if ($nav.length === 0) { 100 $nav = $(ft.pageInfo.pageNavigation); 101 //if the navigation control is inside another table, then get out 102 if ($nav.parents('table:first').length > 0 && $nav.parents('table:first') !== $(ft.table)) return; 103 //if we found more than one navigation control, write error to console 104 if ($nav.length > 1 && ft.options.debug === true) console.error('More than one pagination control was found!'); 105 } 106 //if we still cannot find the control, then don't do anything 107 if ($nav.length === 0) return; 108 //if the nav is not a UL, then find or create a UL 109 if (!$nav.is('ul')) { 110 if ($nav.find('ul:first').length === 0) { 111 $nav.append('<ul />'); 112 } 113 $nav = $nav.find('ul'); 114 } 115 $nav.find('li').remove(); 116 var info = ft.pageInfo; 117 info.control = $nav; 118 if (info.pages.length > 0) { 119 $nav.append('<li class="footable-page-arrow"><a data-page="first" href="#first">' + ft.pageInfo.firstText + '</a>'); 120 $nav.append('<li class="footable-page-arrow"><a data-page="prev" href="#prev">' + ft.pageInfo.previousText + '</a></li>'); 121 if (info.limit){ 122 $nav.append('<li class="footable-page-arrow"><a data-page="limit-prev" href="#limit-prev">' + ft.pageInfo.limitPreviousText + '</a></li>'); 123 } 124 if (!info.limit){ 125 $.each(info.pages, function (i, page) { 126 if (page.length > 0) { 127 $nav.append('<li class="footable-page"><a data-page="' + i + '" href="#">
127' + (i + 1) + '</a></li>'); 128 } 129 }); 130 } 131 if (info.limit){ 132 $nav.append('<li class="footable-page-arrow"><a data-page="limit-next" href="#limit-next">' + ft.pageInfo.limitNextText + '</a></li>'); 133 p.createLimited($nav, info, 0); 134 } 135 $nav.append('<li class="footable-page-arrow"><a data-page="next" href="#next">' + ft.pageInfo.nextText + '</a></li>'); 136 $nav.append('<li class="footable-page-arrow"><a data-page="last" href="#last">' + ft.pageInfo.lastText + '</a></li>'); 137 } 138 $nav.off('click', 'a[data-page]').on('click', 'a[data-page]', function (e) { 139 e.preventDefault(); 140 var page = $(this).data('page'); 141 var newPage = info.currentPage; 142 if (page === 'first') { 143 newPage = 0; 144 } else if (page === 'prev') { 145 if (newPage > 0) newPage--; 146 } else if (page === 'next') { 147 if (newPage < info.pages.length - 1) newPage++; 148 } else if (page === 'last') { 149 newPage = info.pages.length - 1; 150 } else if (page === 'limit-prev') { 151 newPage = -1; 152 var first = $nav.find('.footable-page:first a').data('page'); 153 p.createLimited($nav, info, first - info.limitNavigation); 154 p.setPagingClasses($nav, info.currentPage, info.pages.length); 155 } else if (page === 'limit-next') { 156 newPage = -1; 157 var last = $nav.find('.footable-page:last a').data('page'); 158 p.createLimited($nav, info, last + 1); 159 p.setPagingClasses($nav, info.currentPage, info.pages.length); 160 } else { 161 newPage = page; 162 } 163 if (newPage >= 0){ 164 if (info.limit && info.currentPage != newPage){ 165 var start = newPage; 166 while (start % info.limitNavigation !== 0){ start -= 1; } 167 p.createLimited($nav, info, start); 168 } 169 p.paginate(ft, newPage); 170 } 171 }); 172 p.setPagingClasses($nav, info.currentPage, info.pages.length); 173 }; 174 175 p.createLimited = function(nav, info, start){ 176 start = start || 0; 177 nav.find('li.footable-page').remove(); 178 var i, page, 179 $prev = nav.find('li.footable-page-arrow > a[data-page="limit-prev"]').parent(), 180 $next = nav.find('li.footable-page-arrow > a[data-page="limit-next"]').parent(); 181 for (i = info.pages.length - 1; i >=0 ; i--){ 182 page = info.pages[i]; 183 if (i >= start && i < start + info.limitNavigation && page.length > 0) { 184 $prev.after('<li class="footable-page"><a data-page="' + i + '" href="#">' + (i + 1) + '</a></li>'); 185 } 186 } 187 if (start === 0){ $prev.hide(); } 188 else { $prev.show(); } 189 if (start + info.limitNavigation >= info.pages.length){ $next.hide(); } 190 else { $next.show(); } 191 }; 192 193 p.paginate = function (ft, newPage) { 194 var info = ft.pageInfo; 195 if (info.currentPage !== newPage) { 196 var $tbody = $(ft.table).find('> tbody'); 197 198 //raise a pre-pagin event so that we can cancel the paging if needed 199 var event = ft.raise('footable_paging', { page: newPage, size: info.pageSize }); 200 if (event && event.result === false) return; 201 202 p.fillPage(ft, $tbody, newPage); 203 info.control.find('li').removeClass('active disabled'); 204 p.setPagingClasses(info.control, info.currentPage, info.pages.length); 205 } 206 }; 207 208 p.setPagingClasses = function (nav, currentPage, pageCount) { 209 nav.find('li.footable-page > a[data-page=' + currentPage + ']').parent().addClass('active'); 210 if (currentPage >= pageCount - 1) { 211 nav.find('li.footable-page-arrow > a[data-page="next"]').parent().addClass('disabled'); 212 nav.find('li.footable-page-arrow > a[data-page="last"]').parent().addClass('disabled'); 213 } 214 if (currentPage < 1) { 215 nav.find('li.footable-page-arrow > a[data-page="first"]').parent().addClass('disabled'); 216 nav.find('li.footable-page-arrow > a[data-page="prev"]').parent().addClass('disabled'); 217 } 218 }; 219 220 p.fillPage = function (ft, tbody, pageNumber) { 221 ft.pageInfo.currentPage = pageNumber; 222 $(ft.table).data('currentPage', pageNumber); 223 tbody.find('> tr').hide(); 224 $(ft.pageInfo.pages[pageNumber]).each(function () { 225 p.showRow(this, ft); 226 }); 227 }; 228 229 p.showRow = function (row, ft) { 230 var $row = $(row), $next = $row.next(), $table = $(ft.table); 231 if ($table.hasClass('breakpoint') && $row.hasClass('footable-detail-show') && $next.hasClass('footable-row-detail')) { 232 $row.add($next).show(); 233 ft.createOrUpdateDetailRow(row); 234 } 235 else $row.show(); 236 }; 237 } 238 239 w.footable.plugins.register(Paginate, defaults); 240 241}
241)(jQuery, window);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.