/*! * custom pager controls (beta) for TableSorter 9/15/2014 (v2.17.8) initialize custom pager script BEFORE initializing tablesorter/tablesorter pager custom pager looks like this: 1 | 2 … 5 | 6 | 7 … 99 | 100 _ _ _ _ adjacentSpacer _ _ distanceSpacer _____ ________ ends (2 default) _________ aroundCurrent (1 default) */ /*jshint browser:true, jquery:true, unused:false, loopfunc:true */ /*global jQuery: false */ ;(function($){ "use strict"; $.tablesorter = $.tablesorter || {}; $.tablesorter.customPagerControls = function(settings) { var defaults = { table : 'table', pager : '.pager', pageSize : '.left a', currentPage : '.right a', ends : 2, // number of pages to show of either end aroundCurrent : 1, // number of pages surrounding the current page link : '{page}', // page element; use {page} to include the page number currentClass : 'current', // current page class name adjacentSpacer : ' | ', // spacer for page numbers next to each other distanceSpacer : ' ', // spacer for page numbers away from each other (ellipsis) addKeyboard : true // add left/right keyboard arrows to change current page }, options = $.extend({}, defaults, settings), $table = $(options.table), $pager = $(options.pager); $table .on('pagerInitialized pagerComplete', function (e, c) { var indx, p = c.pager ? c.pager : c, // using widget pages = $('
'), pageArray = [], cur = p.page + 1, start = cur > 1 ? (p.filteredPages - cur < options.aroundCurrent ? -(options.aroundCurrent + 1) + (p.filteredPages - cur) : -options.aroundCurrent) : 0, end = cur < options.aroundCurrent + 1 ? options.aroundCurrent + 3 - cur : options.aroundCurrent + 1; for (indx = start; indx < end; indx++) { if (cur + indx >= 1 && cur + indx < p.filteredPages) { pageArray.push( cur + indx ); } } if (pageArray.length) { // include first and last pages (ends) in the pagination for (indx = 0; indx < options.ends; indx++){ if ($.inArray(indx + 1, pageArray) === -1) { pageArray.push(indx + 1); } if ($.inArray(p.filteredPages - indx, pageArray) === -1) { pageArray.push(p.filteredPages - indx); } } // sort the list pageArray = pageArray.sort(function(a, b){ return a - b; }); // make links and spacers $.each(pageArray, function(indx, value){ pages .append( $(options.link.replace(/\{page\}/g, value)).toggleClass(options.currentClass, value === cur).attr('data-page', value) ) .append( '' + (indx < pageArray.length - 1 && ( pageArray[ indx + 1 ] - 1 !== value ) ? options.distanceSpacer : ( indx >= pageArray.length - 1 ? '' : options.adjacentSpacer )) + '' ); }); } $pager.find('.pagecount').html(pages.html()); }); // set up pager controls $pager.find(options.pageSize).on('click', function () { $(this) .addClass(options.currentClass) .siblings() .removeClass(options.currentClass); $table.trigger('pageSize', $(this).html()); return false; }).end() .on('click', options.currentPage, function(){ $(this) .addClass(options.currentClass) .siblings() .removeClass(options.currentClass); $table.trigger('pageSet', $(this).attr('data-page')); return false; }); // make right/left arrow keys work if (options.addKeyboard) { $(document).on('keydown', function(events){ // ignore arrows inside form elements if (/input|select|textarea/i.test(events.target.tagName)) { return; } if (events.which === 37) { // left $pager.find(options.currentPage).filter('.' + options.currentClass).prevAll(':not(span):first').click(); } else if (events.which === 39) { // right $pager.find(options.currentPage).filter('.' + options.currentClass).nextAll(':not(span):first').click(); } }); } }; })(jQuery);