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