summaryrefslogtreecommitdiffstats
path: root/widgets
diff options
context:
space:
mode:
authorTed Trask <ttrask01@yahoo.com>2019-09-18 22:16:10 +0000
committerTed Trask <ttrask01@yahoo.com>2019-09-18 22:16:10 +0000
commitfe202584bb9045e6e008e037656da196a9045f13 (patch)
treea0add5f78fc85101cb1e6512a697f9c8c59ae429 /widgets
parentd3b95ba6d0b69f9d23caa1e665425931835b582b (diff)
downloadacf-jquery-fe202584bb9045e6e008e037656da196a9045f13.tar.bz2
acf-jquery-fe202584bb9045e6e008e037656da196a9045f13.tar.xz
Minify the tablesorter js files
Diffstat (limited to 'widgets')
-rw-r--r--widgets/widget-pager.js1371
1 files changed, 1 insertions, 1370 deletions
diff --git a/widgets/widget-pager.js b/widgets/widget-pager.js
index 362e77b..b596d6d 100644
--- a/widgets/widget-pager.js
+++ b/widgets/widget-pager.js
@@ -3,1373 +3,4 @@
* by Rob Garrison
*/
/*jshint browser:true, jquery:true, unused:false */
-;(function($) {
- 'use strict';
- var tsp,
- ts = $.tablesorter;
-
- ts.addWidget({
- id: 'pager',
- priority: 55, // load pager after filter widget
- options: {
- // output default: '{page}/{totalPages}'
- // possible variables: {size}, {page}, {totalPages}, {filteredPages}, {startRow},
- // {endRow}, {filteredRows} and {totalRows}
- pager_output: '{startRow} to {endRow} of {totalRows} rows', // '{page}/{totalPages}'
-
- // apply disabled classname to the pager arrows when the rows at either extreme is visible
- pager_updateArrows: true,
-
- // starting page of the pager (zero based index)
- pager_startPage: 0,
-
- // reset pager after filtering; set to desired page #
- // set to false to not change page at filter start
- pager_pageReset: 0,
-
- // Number of visible rows
- pager_size: 10,
-
- // Number of options to include in the pager number selector
- pager_maxOptionSize: 20,
-
- // Save pager page & size if the storage script is loaded (requires $.tablesorter.storage
- // in jquery.tablesorter.widgets.js)
- pager_savePages: true,
-
- // defines custom storage key
- pager_storageKey: 'tablesorter-pager',
-
- // if true, the table will remain the same height no matter how many records are displayed.
- // The space is made up by an empty table row set to a height to compensate; default is false
- pager_fixedHeight: false,
-
- // count child rows towards the set page size? (set true if it is a visible table row within the pager)
- // if true, child row(s) may not appear to be attached to its parent row, may be split across pages or
- // may distort the table if rowspan or cellspans are included.
- pager_countChildRows: false,
-
- // remove rows from the table to speed up the sort of large tables.
- // setting this to false, only hides the non-visible rows; needed if you plan to add/remove rows with
- // the pager enabled.
- pager_removeRows: false, // removing rows in larger tables speeds up the sort
-
- // use this format: 'http://mydatabase.com?page={page}&size={size}&{sortList:col}&{filterList:fcol}'
- // where {page} is replaced by the page number, {size} is replaced by the number of records to show,
- // {sortList:col} adds the sortList to the url into a 'col' array, and {filterList:fcol} adds
- // the filterList to the url into an 'fcol' array.
- // So a sortList = [[2,0],[3,0]] becomes '&col[2]=0&col[3]=0' in the url
- // and a filterList = [[2,Blue],[3,13]] becomes '&fcol[2]=Blue&fcol[3]=13' in the url
- pager_ajaxUrl: null,
-
- // modify the url after all processing has been applied
- pager_customAjaxUrl: function( table, url ) { return url; },
-
- // ajax error callback from $.tablesorter.showError function
- // pager_ajaxError: function( config, xhr, settings, exception ) { return exception; };
- // returning false will abort the error message
- pager_ajaxError: null,
-
- // modify the $.ajax object to allow complete control over your ajax requests
- pager_ajaxObject: {
- dataType: 'json'
- },
-
- // set this to false if you want to block ajax loading on init
- pager_processAjaxOnInit: true,
-
- // process ajax so that the following information is returned:
- // [ total_rows (number), rows (array of arrays), headers (array; optional) ]
- // example:
- // [
- // 100, // total rows
- // [
- // [ "row1cell1", "row1cell2", ... "row1cellN" ],
- // [ "row2cell1", "row2cell2", ... "row2cellN" ],
- // ...
- // [ "rowNcell1", "rowNcell2", ... "rowNcellN" ]
- // ],
- // [ "header1", "header2", ... "headerN" ] // optional
- // ]
- pager_ajaxProcessing: function( data ) { return data; },
-
- // css class names of pager arrows
- pager_css: {
- container : 'tablesorter-pager',
- // error information row (don't include period at beginning)
- errorRow : 'tablesorter-errorRow',
- // class added to arrows @ extremes (i.e. prev/first arrows 'disabled' on first page)
- disabled : 'disabled'
- },
-
- // jQuery selectors
- pager_selectors: {
- container : '.pager', // target the pager markup
- first : '.first', // go to first page arrow
- prev : '.prev', // previous page arrow
- next : '.next', // next page arrow
- last : '.last', // go to last page arrow
- // goto is a reserved word #657
- gotoPage : '.gotoPage', // go to page selector - select dropdown that sets the current page
- pageDisplay : '.pagedisplay', // location of where the 'output' is displayed
- pageSize : '.pagesize' // page size selector - select dropdown that sets the 'size' option
- }
- },
- init: function( table ) {
- tsp.init( table );
- },
- // only update to complete sorter initialization
- format: function( table, c ) {
- if ( !( c.pager && c.pager.initialized ) ) {
- return tsp.initComplete( c );
- }
- tsp.moveToPage( c, c.pager, false );
- },
- remove: function( table, c, wo, refreshing ) {
- tsp.destroyPager( c, refreshing );
- }
- });
-
- /* pager widget functions */
- tsp = ts.pager = {
-
- init: function( table ) {
- // check if tablesorter has initialized
- if ( table.hasInitialized && table.config.pager && table.config.pager.initialized ) { return; }
- var t,
- c = table.config,
- wo = c.widgetOptions,
- s = wo.pager_selectors,
-
- // save pager variables
- p = c.pager = $.extend({
- totalPages: 0,
- filteredRows: 0,
- filteredPages: 0,
- currentFilters: [],
- page: wo.pager_startPage,
- startRow: 0,
- endRow: 0,
- ajaxCounter: 0,
- $size: null,
- last: {},
- // save original pager size
- setSize: wo.pager_size,
- setPage: wo.pager_startPage
- }, c.pager );
-
- // Used by core appendCache; !undefined is always true
- p.removeRows = wo.pager_removeRows;
-
- // pager initializes multiple times before table has completed initialization
- if ( p.isInitializing ) { return; }
-
- p.isInitializing = true;
- if ( ts.debug(c, 'pager') ) {
- console.log( 'Pager >> Initializing' );
- }
-
- p.size = $.data( table, 'pagerLastSize' ) || wo.pager_size;
- // added in case the pager is reinitialized after being destroyed.
- p.$container = $( s.container ).addClass( wo.pager_css.container ).show();
- p.totalRows = c.$tbodies.eq( 0 )
- .children( 'tr' )
- .not( wo.pager_countChildRows ? '' : '.' + c.cssChildRow )
- .length;
- p.oldAjaxSuccess = p.oldAjaxSuccess || wo.pager_ajaxObject.success;
- c.appender = tsp.appender;
- p.initializing = true;
- if ( wo.pager_savePages && ts.storage ) {
- t = ts.storage( table, wo.pager_storageKey ) || {}; // fixes #387
- p.page = ( isNaN( t.page ) ? p.page : t.page ) || p.setPage || 0;
- p.size = t.size === 'all' ? t.size : ( isNaN( t.size ) ? p.size : t.size ) || p.setSize || 10;
- tsp.setPageSize( c, p.size );
- }
-
- // skipped rows
- p.regexRows = new RegExp( '(' + ( wo.filter_filteredRow || 'filtered' ) + '|' +
- c.selectorRemove.slice( 1 ) + '|' + c.cssChildRow + ')' );
- p.regexFiltered = new RegExp( wo.filter_filteredRow || 'filtered' );
-
- // clear initialized flag
- p.initialized = false;
- // before initialization event
- c.$table.triggerHandler( 'pagerBeforeInitialized', c );
-
- tsp.enablePager( c, false );
-
- // p must have ajaxObject
- p.ajaxObject = wo.pager_ajaxObject;
- p.ajaxObject.url = wo.pager_ajaxUrl;
-
- if ( typeof wo.pager_ajaxUrl === 'string' ) {
- // ajax pager; interact with database
- p.ajax = true;
- // When filtering with ajax, allow only custom filtering function, disable default filtering
- // since it will be done server side.
- wo.filter_serversideFiltering = true;
- c.serverSideSorting = true;
- tsp.moveToPage( c, p );
- } else {
- p.ajax = false;
- // Regular pager; all rows stored in memory
- ts.appendCache( c, true ); // true = don't apply widgets
- }
-
- },
-
- initComplete: function( c ) {
- var p = c.pager;
- tsp.bindEvents( c );
- if ( !p.ajax ) {
- tsp.hideRowsSetup( c );
- }
-
- // pager initialized
- p.initialized = true;
- p.initializing = false;
- p.isInitializing = false;
- tsp.setPageSize( c, p.size ); // page size 0 is ignored
- if ( ts.debug(c, 'pager') ) {
- console.log( 'Pager >> Triggering pagerInitialized' );
- }
- c.$table.triggerHandler( 'pagerInitialized', c );
- // filter widget not initialized; it will update the output display & fire off the pagerComplete event
- if ( !( c.widgetOptions.filter_initialized && ts.hasWidget( c.table, 'filter' ) ) ) {
- // if ajax, then don't fire off pagerComplete
- tsp.updatePageDisplay( c, !p.ajax );
- }
- },
-
- bindEvents: function( c ) {
- var ctrls, fxn, tmp,
- p = c.pager,
- wo = c.widgetOptions,
- namespace = c.namespace + 'pager',
- s = wo.pager_selectors,
- debug = ts.debug(c, 'pager');
- c.$table
- .off( namespace )
- .on( 'filterInit filterStart '.split( ' ' ).join( namespace + ' ' ), function( e, filters ) {
- p.currentFilters = $.isArray( filters ) ? filters : c.$table.data( 'lastSearch' );
- var filtersEqual;
- if (p.ajax && e.type === 'filterInit') {
- // ensure pager ajax is called after filter widget has initialized
- return tsp.moveToPage( c, p, false );
- }
- if (ts.filter.equalFilters) {
- filtersEqual = ts.filter.equalFilters(c, c.lastSearch, p.currentFilters);
- } else {
- // will miss filter changes of the same value in a different column, see #1363
- filtersEqual = ( c.lastSearch || [] ).join( '' ) !== ( p.currentFilters || [] ).join( '' );
- }
- // don't change page if filters are the same (pager updating, etc)
- if ( e.type === 'filterStart' && wo.pager_pageReset !== false && !filtersEqual ) {
- p.page = wo.pager_pageReset; // fixes #456 & #565
- }
- })
- // update pager after filter widget completes
- .on( 'filterEnd sortEnd '.split( ' ' ).join( namespace + ' ' ), function() {
- p.currentFilters = c.$table.data( 'lastSearch' );
- if ( p.initialized || p.initializing ) {
- if ( c.delayInit && c.rowsCopy && c.rowsCopy.length === 0 ) {
- // make sure we have a copy of all table rows once the cache has been built
- tsp.updateCache( c );
- }
- tsp.updatePageDisplay( c, false );
- ts.applyWidget( c.table );
- }
- })
- .on( 'disablePager' + namespace, function( e ) {
- e.stopPropagation();
- tsp.showAllRows( c );
- })
- .on( 'enablePager' + namespace, function( e ) {
- e.stopPropagation();
- tsp.enablePager( c, true );
- })
- .on( 'destroyPager' + namespace, function( e ) {
- e.stopPropagation();
- // call removeWidget to make sure internal flags are modified.
- ts.removeWidget( c.table, 'pager', false );
- })
- .on( 'updateComplete' + namespace, function( e, table, triggered ) {
- e.stopPropagation();
- // table can be unintentionally undefined in tablesorter v2.17.7 and earlier
- // don't recalculate total rows/pages if using ajax
- if ( !table || triggered || p.ajax ) { return; }
- var $rows = c.$tbodies.eq( 0 ).children( 'tr' ).not( c.selectorRemove );
- p.totalRows = $rows.length -
- ( wo.pager_countChildRows ? 0 : $rows.filter( '.' + c.cssChildRow ).length );
- p.totalPages = p.size === 'all' ? 1 : Math.ceil( p.totalRows / p.size );
- if ( $rows.length && c.rowsCopy && c.rowsCopy.length === 0 ) {
- // make a copy of all table rows once the cache has been built
- tsp.updateCache( c );
- }
- if ( p.page >= p.totalPages ) {
- tsp.moveToLastPage( c, p );
- }
- tsp.hideRows( c );
- tsp.changeHeight( c );
- // update without triggering pagerComplete
- tsp.updatePageDisplay( c, false );
- // make sure widgets are applied - fixes #450
- ts.applyWidget( table );
- tsp.updatePageDisplay( c );
- })
- .on( 'pageSize refreshComplete '.split( ' ' ).join( namespace + ' ' ), function( e, size ) {
- e.stopPropagation();
- tsp.setPageSize( c, tsp.parsePageSize( c, size, 'get' ) );
- tsp.moveToPage( c, p, true );
- tsp.hideRows( c );
- tsp.updatePageDisplay( c, false );
- })
- .on( 'pageSet pagerUpdate '.split( ' ' ).join( namespace + ' ' ), function( e, num ) {
- e.stopPropagation();
- // force pager refresh
- if ( e.type === 'pagerUpdate' ) {
- num = typeof num === 'undefined' ? p.page + 1 : num;
- p.last.page = true;
- }
- p.page = ( parseInt( num, 10 ) || 1 ) - 1;
- tsp.moveToPage( c, p, true );
- tsp.updatePageDisplay( c, false );
- })
- .on( 'pageAndSize' + namespace, function( e, page, size ) {
- e.stopPropagation();
- p.page = ( parseInt(page, 10) || 1 ) - 1;
- tsp.setPageSize( c, tsp.parsePageSize( c, size, 'get' ) );
- tsp.moveToPage( c, p, true );
- tsp.hideRows( c );
- tsp.updatePageDisplay( c, false );
- });
-
- // clicked controls
- ctrls = [ s.first, s.prev, s.next, s.last ];
- fxn = [ 'moveToFirstPage', 'moveToPrevPage', 'moveToNextPage', 'moveToLastPage' ];
- if ( debug && !p.$container.length ) {
- console.warn( 'Pager >> "container" not found' );
- }
- p.$container.find( ctrls.join( ',' ) )
- .attr( 'tabindex', 0 )
- .off( 'click' + namespace )
- .on( 'click' + namespace, function( e ) {
- e.stopPropagation();
- var i,
- $c = $( this ),
- l = ctrls.length;
- if ( !$c.hasClass( wo.pager_css.disabled ) ) {
- for ( i = 0; i < l; i++ ) {
- if ( $c.is( ctrls[ i ] ) ) {
- tsp[ fxn[ i ] ]( c, p );
- break;
- }
- }
- }
- });
-
- tmp = p.$container.find( wo.pager_selectors.gotoPage );
- if ( tmp.length ) {
- tmp
- .off( 'change' + namespace )
- .on( 'change' + namespace, function() {
- p.page = $( this ).val() - 1;
- tsp.moveToPage( c, p, true );
- tsp.updatePageDisplay( c, false );
- });
- } else if ( debug ) {
- console.warn( 'Pager >> "goto" selector not found' );
- }
-
- tmp = p.$container.find( wo.pager_selectors.pageSize );
- if ( tmp.length ) {
- // setting an option as selected appears to cause issues with initial page size
- tmp.find( 'option' ).removeAttr( 'selected' );
- tmp
- .off( 'change' + namespace )
- .on( 'change' + namespace, function() {
- if ( !$( this ).hasClass( wo.pager_css.disabled ) ) {
- var size = $( this ).val();
- // in case there are more than one pager
- p.$container.find( wo.pager_selectors.pageSize ).val( size );
- tsp.setPageSize( c, size );
- tsp.moveToPage( c, p, true );
- tsp.changeHeight( c );
- }
- return false;
- });
- } else if ( debug ) {
- console.warn('Pager >> "size" selector not found');
- }
-
- },
-
- // hide arrows at extremes
- pagerArrows: function( c, disable ) {
- var p = c.pager,
- dis = !!disable,
- first = dis || p.page === 0,
- tp = tsp.getTotalPages( c, p ),
- last = dis || p.page === tp - 1 || tp === 0,
- wo = c.widgetOptions,
- s = wo.pager_selectors;
- if ( wo.pager_updateArrows ) {
- p.$container
- .find( s.first + ',' + s.prev )
- .toggleClass( wo.pager_css.disabled, first )
- .prop( 'aria-disabled', first );
- p.$container
- .find( s.next + ',' + s.last )
- .toggleClass( wo.pager_css.disabled, last )
- .prop( 'aria-disabled', last );
- }
- },
-
- calcFilters: function( c ) {
- var normalized, indx, len,
- wo = c.widgetOptions,
- p = c.pager,
- hasFilters = c.$table.hasClass( 'hasFilters' );
- if ( hasFilters && !p.ajax ) {
- if ( $.isEmptyObject( c.cache ) ) {
- // delayInit: true so nothing is in the cache
- p.filteredRows = p.totalRows = c.$tbodies.eq( 0 )
- .children( 'tr' )
- .not( wo.pager_countChildRows ? '' : '.' + c.cssChildRow )
- .length;
- } else {
- p.filteredRows = 0;
- normalized = c.cache[ 0 ].normalized;
- len = normalized.length;
- for ( indx = 0; indx < len; indx++ ) {
- p.filteredRows += p.regexRows.test( normalized[ indx ][ c.columns ].$row[ 0 ].className ) ? 0 : 1;
- }
- }
- } else if ( !hasFilters ) {
- p.filteredRows = p.totalRows;
- }
- },
-
- updatePageDisplay: function( c, completed ) {
- if ( c.pager && c.pager.initializing ) { return; }
- var s, t, $out, options, indx, len, output,
- table = c.table,
- wo = c.widgetOptions,
- p = c.pager,
- namespace = c.namespace + 'pager',
- sz = tsp.parsePageSize( c, p.size, 'get' ); // don't allow dividing by zero
- if ( sz === 'all' ) { sz = p.totalRows; }
- if ( wo.pager_countChildRows ) { t[ t.length ] = c.cssChildRow; }
- p.$container.find( wo.pager_selectors.pageSize + ',' + wo.pager_selectors.gotoPage )
- .removeClass( wo.pager_css.disabled )
- .removeAttr( 'disabled' )
- .prop( 'aria-disabled', 'false' );
- p.totalPages = Math.ceil( p.totalRows / sz ); // needed for 'pageSize' method
- c.totalRows = p.totalRows;
- tsp.parsePageNumber( c, p );
- tsp.calcFilters( c );
- c.filteredRows = p.filteredRows;
- p.filteredPages = Math.ceil( p.filteredRows / sz ) || 0;
- if ( tsp.getTotalPages( c, p ) >= 0 ) {
- t = ( sz * p.page > p.filteredRows ) && completed;
- p.page = t ? wo.pager_pageReset || 0 : p.page;
- p.startRow = t ? sz * p.page + 1 : ( p.filteredRows === 0 ? 0 : sz * p.page + 1 );
- p.endRow = Math.min( p.filteredRows, p.totalRows, sz * ( p.page + 1 ) );
- $out = p.$container.find( wo.pager_selectors.pageDisplay );
-
- // Output param can be callback for custom rendering or string
- if ( typeof wo.pager_output === 'function' ) {
- s = wo.pager_output( table, p );
- } else {
- output = $out
- // get output template from data-pager-output or data-pager-output-filtered
- .attr('data-pager-output' + (p.filteredRows < p.totalRows ? '-filtered' : '')) ||
- wo.pager_output;
- // form the output string (can now get a new output string from the server)
- s = ( p.ajaxData && p.ajaxData.output ? p.ajaxData.output || output : output )
- // {page} = one-based index; {page+#} = zero based index +/- value
- .replace( /\{page([\-+]\d+)?\}/gi, function( m, n ) {
- return p.totalPages ? p.page + ( n ? parseInt( n, 10 ) : 1 ) : 0;
- })
- // {totalPages}, {extra}, {extra:0} (array) or {extra : key} (object)
- .replace( /\{\w+(\s*:\s*\w+)?\}/gi, function( m ) {
- var len, indx,
- str = m.replace( /[{}\s]/g, '' ),
- extra = str.split( ':' ),
- data = p.ajaxData,
- // return zero for default page/row numbers
- deflt = /(rows?|pages?)$/i.test( str ) ? 0 : '';
- if ( /(startRow|page)/.test( extra[ 0 ] ) && extra[ 1 ] === 'input' ) {
- len = ( '' + ( extra[ 0 ] === 'page' ? p.totalPages : p.totalRows ) ).length;
- indx = extra[ 0 ] === 'page' ? p.page + 1 : p.startRow;
- return '<input type="text" class="ts-' + extra[ 0 ] +
- '" style="max-width:' + len + 'em" value="' + indx + '"/>';
- }
- return extra.length > 1 && data && data[ extra[ 0 ] ] ?
- data[ extra[ 0 ] ][ extra[ 1 ] ] :
- p[ str ] || ( data ? data[ str ] : deflt ) || deflt;
- });
- }
- if ( p.$container.find( wo.pager_selectors.gotoPage ).length ) {
- t = '';
- options = tsp.buildPageSelect( c, p );
- len = options.length;
- for ( indx = 0; indx < len; indx++ ) {
- t += '<option value="' + options[ indx ] + '">' + options[ indx ] + '</option>';
- }
- // innerHTML doesn't work in IE9 - http://support2.microsoft.com/kb/276228
- p.$container.find( wo.pager_selectors.gotoPage ).html( t ).val( p.page + 1 );
- }
- if ( $out.length ) {
- $out[ ($out[ 0 ].nodeName === 'INPUT' ) ? 'val' : 'html' ]( s );
- // rebind startRow/page inputs
- $out
- .find( '.ts-startRow, .ts-page' )
- .off( 'change' + namespace )
- .on( 'change' + namespace, function() {
- var v = $( this ).val(),
- pg = $( this ).hasClass( 'ts-startRow' ) ? Math.floor( v / sz ) + 1 : v;
- c.$table.triggerHandler( 'pageSet' + namespace, [ pg ] );
- });
- }
- }
- tsp.pagerArrows( c );
- tsp.fixHeight( c );
- if ( p.initialized && completed !== false ) {
- if ( ts.debug(c, 'pager') ) {
- console.log( 'Pager >> Triggering pagerComplete' );
- }
- c.$table.triggerHandler( 'pagerComplete', c );
- // save pager info to storage
- if ( wo.pager_savePages && ts.storage ) {
- ts.storage( table, wo.pager_storageKey, {
- page : p.page,
- size : sz === p.totalRows ? 'all' : sz
- });
- }
- }
- },
-
- buildPageSelect: function( c, p ) {
- // Filter the options page number link array if it's larger than 'pager_maxOptionSize'
- // as large page set links will slow the browser on large dom inserts
- var i, centralFocusSize, focusOptionPages, insertIndex, optionLength, focusLength,
- wo = c.widgetOptions,
- pg = tsp.getTotalPages( c, p ) || 1,
- // make skip set size multiples of 5
- skipSetSize = Math.ceil( ( pg / wo.pager_maxOptionSize ) / 5 ) * 5,
- largeCollection = pg > wo.pager_maxOptionSize,
- currentPage = p.page + 1,
- startPage = skipSetSize,
- endPage = pg - skipSetSize,
- optionPages = [ 1 ],
- // construct default options pages array
- optionPagesStartPage = largeCollection ? skipSetSize : 1;
-
- for ( i = optionPagesStartPage; i <= pg; ) {
- optionPages[ optionPages.length ] = i;
- i = i + ( largeCollection ? skipSetSize : 1 );
- }
- optionPages[ optionPages.length ] = pg;
-
- if ( largeCollection ) {
- focusOptionPages = [];
- // don't allow central focus size to be > 5 on either side of current page
- centralFocusSize = Math.max( Math.floor( wo.pager_maxOptionSize / skipSetSize ) - 1, 5 );
-
- startPage = currentPage - centralFocusSize;
- if ( startPage < 1 ) { startPage = 1; }
- endPage = currentPage + centralFocusSize;
- if ( endPage > pg ) { endPage = pg; }
- // construct an array to get a focus set around the current page
- for ( i = startPage; i <= endPage ; i++ ) {
- focusOptionPages[ focusOptionPages.length ] = i;
- }
-
- // keep unique values
- optionPages = $.grep( optionPages, function( value, indx ) {
- return $.inArray( value, optionPages ) === indx;
- });
-
- optionLength = optionPages.length;
- focusLength = focusOptionPages.length;
-
- // make sure at all optionPages aren't replaced
- if ( optionLength - focusLength > skipSetSize / 2 && optionLength + focusLength > wo.pager_maxOptionSize ) {
- insertIndex = Math.floor( optionLength / 2 ) - Math.floor( focusLength / 2 );
- Array.prototype.splice.apply( optionPages, [ insertIndex, focusLength ] );
- }
- optionPages = optionPages.concat( focusOptionPages );
-
- }
-
- // keep unique values again
- optionPages = $.grep( optionPages, function( value, indx ) {
- return $.inArray( value, optionPages ) === indx;
- })
- .sort( function( a, b ) {
- return a - b;
- });
-
- return optionPages;
- },
-
- fixHeight: function( c ) {
- var d, h, bs,
- table = c.table,
- p = c.pager,
- wo = c.widgetOptions,
- $b = c.$tbodies.eq( 0 );
- $b.find( 'tr.pagerSavedHeightSpacer' ).remove();
- if ( wo.pager_fixedHeight && !p.isDisabled ) {
- h = $.data( table, 'pagerSavedHeight' );
- if ( h ) {
- bs = 0;
- if ( $(table).css('border-spacing').split(' ').length > 1 ) {
- bs = $(table).css('border-spacing').split(' ')[1].replace( /[^-\d\.]/g, '' );
- }
- d = h - $b.height() + (bs * p.size) - bs;
- if (
- d > 5 && $.data( table, 'pagerLastSize' ) === p.size &&
- $b.children( 'tr:visible' ).length < ( p.size === 'all' ? p.totalRows : p.size )
- ) {
- $b.append( '<tr class="pagerSavedHeightSpacer ' + c.selectorRemove.slice( 1 ) +
- '" style="height:' + d + 'px;"></tr>' );
- }
- }
- }
- },
-
- changeHeight: function( c ) {
- var h,
- table = c.table,
- p = c.pager,
- sz = p.size === 'all' ? p.totalRows : p.size,
- $b = c.$tbodies.eq( 0 );
- $b.find( 'tr.pagerSavedHeightSpacer' ).remove();
- if ( !$b.children( 'tr:visible' ).length ) {
- $b.append( '<tr class="pagerSavedHeightSpacer ' + c.selectorRemove.slice( 1 ) + '"><td>&nbsp</td></tr>' );
- }
- h = $b.children( 'tr' ).eq( 0 ).height() * sz;
- $.data( table, 'pagerSavedHeight', h );
- tsp.fixHeight( c );
- $.data( table, 'pagerLastSize', p.size );
- },
-
- hideRows: function( c ) {
- if ( !c.widgetOptions.pager_ajaxUrl ) {
- var tbodyIndex, rowIndex, $rows, len, lastIndex,
- p = c.pager,
- wo = c.widgetOptions,
- tbodyLen = c.$tbodies.length,
- sz = p.size === 'all' ? p.totalRows : p.size,
- start = ( p.page * sz ),
- end = start + sz,
- last = 0, // for cache indexing
- size = 0; // size counter
- p.cacheIndex = [];
- for ( tbodyIndex = 0; tbodyIndex < tbodyLen; tbodyIndex++ ) {
- $rows = c.$tbodies.eq( tbodyIndex ).children( 'tr' );
- len = $rows.length;
- lastIndex = 0;
- last = 0; // for cache indexing
- size = 0; // size counter
- for ( rowIndex = 0; rowIndex < len; rowIndex++ ) {
- if ( !p.regexFiltered.test( $rows[ rowIndex ].className ) ) {
- if ( size === start && $rows[ rowIndex ].className.match( c.cssChildRow ) ) {
- // hide child rows @ start of pager (if already visible)
- $rows[ rowIndex ].style.display = 'none';
- } else {
- $rows[ rowIndex ].style.display = ( size >= start && size < end ) ? '' : 'none';
- if ( last !== size && size >= start && size < end ) {
- p.cacheIndex[ p.cacheIndex.length ] = rowIndex;
- last = size;
- }
- // don't count child rows
- size += $rows[ rowIndex ].className
- .match( c.cssChildRow + '|' + c.selectorRemove.slice( 1 ) ) && !wo.pager_countChildRows ? 0 : 1;
- if ( size === end && $rows[ rowIndex ].style.display !== 'none' &&
- $rows[ rowIndex ].className.match( ts.css.cssHasChild ) ) {
- lastIndex = rowIndex;
- }
- }
- }
- }
- // add any attached child rows to last row of pager. Fixes part of issue #396
- if ( lastIndex > 0 && $rows[ lastIndex ].className.match( ts.css.cssHasChild ) ) {
- while ( ++lastIndex < len && $rows[ lastIndex ].className.match( c.cssChildRow ) ) {
- $rows[ lastIndex ].style.display = '';
- }
- }
- }
- }
- },
-
- hideRowsSetup: function( c ) {
- var p = c.pager,
- namespace = c.namespace + 'pager',
- $el = p.$container.find( c.widgetOptions.pager_selectors.pageSize ),
- size = $el.val();
- p.size = tsp.parsePageSize( c, size, 'get' );
- tsp.setPageSize( c, p.size );
- tsp.pagerArrows( c );
- if ( !c.widgetOptions.pager_removeRows ) {
- tsp.hideRows( c );
- c.$table.on( 'sortEnd filterEnd '.split( ' ' ).join( namespace + ' ' ), function() {
- tsp.hideRows( c );
- });
- }
- },
-
- renderAjax: function( data, c, xhr, settings, exception ) {
- var table = c.table,
- p = c.pager,
- wo = c.widgetOptions,
- debug = ts.debug(c, 'pager');
- // process data
- if ( $.isFunction( wo.pager_ajaxProcessing ) ) {
-
- // in case nothing is returned by ajax, empty out the table; see #1032
- // but do it before calling pager_ajaxProcessing because that function may add content
- // directly to the table
- c.$tbodies.eq( 0 ).empty();
-
- // ajaxProcessing result: [ total, rows, headers ]
- var i, j, t, hsh, $f, $sh, $headers, $h, icon, th, d, l, rr_count, len, sz,
- $table = c.$table,
- tds = '',
- result = wo.pager_ajaxProcessing( data, table, xhr ) || [ 0, [] ];
-
- // Clean up any previous error.
- ts.showError( table );
-
- if ( exception ) {
- if ( debug ) {
- console.error( 'Pager >> Ajax Error', xhr, settings, exception );
- }
- ts.showError( table, xhr, settings, exception );
- c.$tbodies.eq( 0 ).children( 'tr' ).detach();
- p.totalRows = 0;
- } else {
- // process ajax object
- if ( !$.isArray( result ) ) {
- p.ajaxData = result;
- c.totalRows = p.totalRows = result.total;
- c.filteredRows = p.filteredRows = typeof result.filteredRows !== 'undefined' ?
- result.filteredRows :
- result.total;
- th = result.headers;
- d = result.rows || [];
- } else {
- // allow [ total, rows, headers ] or [ rows, total, headers ]
- t = isNaN( result[ 0 ] ) && !isNaN( result[ 1 ] );
- // ensure a zero returned row count doesn't fail the logical ||
- rr_count = result[ t ? 1 : 0 ];
- p.totalRows = isNaN( rr_count ) ? p.totalRows || 0 : rr_count;
- // can't set filtered rows when returning an array
- c.totalRows = c.filteredRows = p.filteredRows = p.totalRows;
- // set row data to empty array if nothing found - see http://stackoverflow.com/q/30875583/145346
- d = p.totalRows === 0 ? [] : result[ t ? 0 : 1 ] || []; // row data
- th = result[ 2 ]; // headers
- }
- l = d && d.length;
- if ( d instanceof $ ) {
- if ( wo.pager_processAjaxOnInit ) {
- // append jQuery object
- c.$tbodies.eq( 0 ).empty();
- c.$tbodies.eq( 0 ).append( d );
- }
- } else if ( l ) {
- // build table from array
- for ( i = 0; i < l; i++ ) {
- tds += '<tr>';
- for ( j = 0; j < d[i].length; j++ ) {
- // build tbody cells; watch for data containing HTML markup - see #434
- tds += /^\s*<td/.test( d[ i ][ j ] ) ? $.trim( d[ i ][ j ] ) : '<td>' + d[ i ][ j ] + '</td>';
- }
- tds += '</tr>';
- }
- // add rows to first tbody
- if ( wo.pager_processAjaxOnInit ) {
- c.$tbodies.eq( 0 ).html( tds );
- }
- }
- wo.pager_processAjaxOnInit = true;
- // update new header text
- if ( th ) {
- hsh = $table.hasClass( 'hasStickyHeaders' );
- $sh = hsh ?
- wo.$sticky.children( 'thead:first' ).children( 'tr:not(.' + c.cssIgnoreRow + ')' ).children() :
- '';
- $f = $table.find( 'tfoot tr:first' ).children();
- // don't change td headers (may contain pager)
- $headers = c.$headers.filter( 'th' );
- len = $headers.length;
- for ( j = 0; j < len; j++ ) {
- $h = $headers.eq( j );
- // add new test within the first span it finds, or just in the header
- if ( $h.find( '.' + ts.css.icon ).length ) {
- icon = $h.find( '.' + ts.css.icon ).clone( true );
- $h.find( '.' + ts.css.headerIn ).html( th[ j ] ).append( icon );
- if ( hsh && $sh.length ) {
- icon = $sh.eq( j ).find( '.' + ts.css.icon ).clone( true );
- $sh.eq( j ).find( '.' + ts.css.headerIn ).html( th[ j ] ).append( icon );
- }
- } else {
- $h.find( '.' + ts.css.headerIn ).html( th[ j ] );
- if ( hsh && $sh.length ) {
- // add sticky header to container just in case it contains pager controls
- p.$container = p.$container.add( wo.$sticky );
- $sh.eq( j ).find( '.' + ts.css.headerIn ).html( th[ j ] );
- }
- }
- $f.eq( j ).html( th[ j ] );
- }
- if ( hsh ) {
- tsp.bindEvents( c );
- }
- }
- }
- if ( c.showProcessing ) {
- ts.isProcessing( table ); // remove loading icon
- }
- sz = tsp.parsePageSize( c, p.size, 'get' );
- // make sure last pager settings are saved, prevents multiple server side calls with
- // the same parameters
- p.totalPages = sz === 'all' ? 1 : Math.ceil( p.totalRows / sz );
- p.last.totalRows = p.totalRows;
- p.last.currentFilters = p.currentFilters;
- p.last.sortList = ( c.sortList || [] ).join( ',' );
- p.initializing = false;
- // update display without triggering pager complete... before updating cache
- tsp.updatePageDisplay( c, false );
- // tablesorter core updateCache (not pager)
- ts.updateCache( c, function() {
- if ( p.initialized ) {
- // apply widgets after table has rendered & after a delay to prevent
- // multiple applyWidget blocking code from blocking this trigger
- setTimeout( function() {
- if ( debug ) {
- console.log( 'Pager >> Triggering pagerChange' );
- }
- $table.triggerHandler( 'pagerChange', p );
- ts.applyWidget( table );
- tsp.updatePageDisplay( c );
- }, 0 );
- }
- });
- }
- if ( !p.initialized ) {
- ts.applyWidget( table );
- }
- },
-
- getAjax: function( c ) {
- var counter,
- url = tsp.getAjaxUrl( c ),
- $doc = $( document ),
- namespace = c.namespace + 'pager',
- p = c.pager;
- if ( url !== '' ) {
- if ( c.showProcessing ) {
- ts.isProcessing( c.table, true ); // show loading icon
- }
- $doc.on( 'ajaxError' + namespace, function( e, xhr, settings, exception ) {
- tsp.renderAjax( null, c, xhr, settings, exception );
- $doc.off( 'ajaxError' + namespace );
- });
- counter = ++p.ajaxCounter;
- p.last.ajaxUrl = url; // remember processed url
- p.ajaxObject.url = url; // from the ajaxUrl option and modified by customAjaxUrl
- p.ajaxObject.success = function( data, status, jqxhr ) {
- // Refuse to process old ajax commands that were overwritten by new ones - see #443
- if ( counter < p.ajaxCounter ) {
- return;
- }
- tsp.renderAjax( data, c, jqxhr );
- $doc.off( 'ajaxError' + namespace );
- if ( typeof p.oldAjaxSuccess === 'function' ) {
- p.oldAjaxSuccess( data );
- }
- };
- if ( ts.debug(c, 'pager') ) {
- console.log( 'Pager >> Ajax initialized', p.ajaxObject );
- }
- $.ajax( p.ajaxObject );
- }
- },
-
- getAjaxUrl: function( c ) {
- var indx, len,
- p = c.pager,
- wo = c.widgetOptions,
- url = wo.pager_ajaxUrl ? wo.pager_ajaxUrl
- // allow using '{page+1}' in the url string to switch to a non-zero based index
- .replace( /\{page([\-+]\d+)?\}/, function( s, n ) { return p.page + ( n ? parseInt( n, 10 ) : 0 ); })
- // this will pass "all" to server when size is set to "all"
- .replace( /\{size\}/g, p.size ) : '',
- sortList = c.sortList,
- filterList = p.currentFilters || c.$table.data( 'lastSearch' ) || [],
- sortCol = url.match( /\{\s*sort(?:List)?\s*:\s*(\w*)\s*\}/ ),
- filterCol = url.match( /\{\s*filter(?:List)?\s*:\s*(\w*)\s*\}/ ),
- arry = [];
- if ( sortCol ) {
- sortCol = sortCol[ 1 ];
- len = sortList.length;
- for ( indx = 0; indx < len; indx++ ) {
- arry[ arry.length ] = sortCol + '[' + sortList[ indx ][ 0 ] + ']=' + sortList[ indx ][ 1 ];
- }
- // if the arry is empty, just add the col parameter... '&{sortList:col}' becomes '&col'
- url = url.replace( /\{\s*sort(?:List)?\s*:\s*(\w*)\s*\}/g, arry.length ? arry.join( '&' ) : sortCol );
- arry = [];
- }
- if ( filterCol ) {
- filterCol = filterCol[ 1 ];
- len = filterList.length;
- for ( indx = 0; indx < len; indx++ ) {
- if ( filterList[ indx ] ) {
- arry[ arry.length ] = filterCol + '[' + indx + ']=' + encodeURIComponent( filterList[ indx ] );
- }
- }
- // if the arry is empty, just add the fcol parameter... '&{filterList:fcol}' becomes '&fcol'
- url = url.replace( /\{\s*filter(?:List)?\s*:\s*(\w*)\s*\}/g, arry.length ? arry.join( '&' ) : filterCol );
- p.currentFilters = filterList;
- }
- if ( $.isFunction( wo.pager_customAjaxUrl ) ) {
- url = wo.pager_customAjaxUrl( c.table, url );
- }
- if ( ts.debug(c, 'pager') ) {
- console.log( 'Pager >> Ajax url = ' + url );
- }
- return url;
- },
-
- renderTable: function( c, rows ) {
- var $tb, index, count, added,
- table = c.table,
- p = c.pager,
- wo = c.widgetOptions,
- debug = ts.debug(c, 'pager'),
- f = c.$table.hasClass('hasFilters'),
- l = rows && rows.length || 0, // rows may be undefined
- e = p.size === 'all' ? p.totalRows : p.size,
- s = ( p.page * e );
- if ( l < 1 ) {
- if ( debug ) {
- console.warn( 'Pager >> No rows for pager to render' );
- }
- // empty table, abort!
- return;
- }
- if ( p.page >= p.totalPages ) {
- // lets not render the table more than once
- return tsp.moveToLastPage( c, p );
- }
- p.cacheIndex = [];
- p.isDisabled = false; // needed because sorting will change the page and re-enable the pager
- if ( p.initialized ) {
- if ( debug ) {
- console.log( 'Pager >> Triggering pagerChange' );
- }
- c.$table.triggerHandler( 'pagerChange', c );
- }
- if ( !wo.pager_removeRows ) {
- tsp.hideRows( c );
- } else {
- ts.clearTableBody( table );
- $tb = ts.processTbody( table, c.$tbodies.eq(0), true );
- // not filtered, start from the calculated starting point (s)
- // if filtered, start from zero
- index = f ? 0 : s;
- count = f ? 0 : s;
- added = 0;
- while ( added < e && index < rows.length ) {
- if ( !f || !p.regexFiltered.test( rows[ index ][ 0 ].className ) ) {
- count++;
- if ( count > s && added <= e ) {
- added++;
- p.cacheIndex[ p.cacheIndex.length ] = index;
- $tb.append( rows[ index ] );
- }
- }
- index++;
- }
- ts.processTbody( table, $tb, false );
- }
- tsp.updatePageDisplay( c );
-
- wo.pager_startPage = p.page;
- wo.pager_size = p.size;
- if ( table.isUpdating ) {
- if ( debug ) {
- console.log( 'Pager >> Triggering updateComplete' );
- }
- c.$table.triggerHandler( 'updateComplete', [ table, true ] );
- }
-
- },
-
- showAllRows: function( c ) {
- var index, $controls, len,
- table = c.table,
- p = c.pager,
- wo = c.widgetOptions;
- if ( p.ajax ) {
- tsp.pagerArrows( c, true );
- } else {
- $.data( table, 'pagerLastPage', p.page );
- $.data( table, 'pagerLastSize', p.size );
- p.page = 0;
- p.size = p.totalRows;
- p.totalPages = 1;
- c.$table
- .addClass( 'pagerDisabled' )
- .removeAttr( 'aria-describedby' )
- .find( 'tr.pagerSavedHeightSpacer' )
- .remove();
- tsp.renderTable( c, c.rowsCopy );
- p.isDisabled = true;
- ts.applyWidget( table );
- if ( ts.debug(c, 'pager') ) {
- console.log( 'Pager >> Disabled' );
- }
- }
- // disable size selector
- $controls = p.$container.find(
- wo.pager_selectors.pageSize + ',' +
- wo.pager_selectors.gotoPage + ',' +
- '.ts-startRow, .ts-page'
- );
- len = $controls.length;
- for ( index = 0; index < len; index++ ) {
- $controls.eq( index )
- .prop( 'aria-disabled', 'true' )
- .addClass( wo.pager_css.disabled )[ 0 ].disabled = true;
- }
- },
-
- // updateCache if delayInit: true
- // this is normally done by 'appendToTable' function in the tablesorter core AFTER a sort
- updateCache: function( c ) {
- var p = c.pager;
- // tablesorter core updateCache (not pager)
- ts.updateCache( c, function() {
- if ( !$.isEmptyObject( c.cache ) ) {
- var index,
- rows = [],
- normalized = c.cache[ 0 ].normalized;
- p.totalRows = normalized.length;
- for ( index = 0; index < p.totalRows; index++ ) {
- rows[ rows.length ] = normalized[ index ][ c.columns ].$row;
- }
- c.rowsCopy = rows;
- tsp.moveToPage( c, p, true );
- // clear out last search to force an update
- p.last.currentFilters = [ ' ' ];
- }
- });
- },
-
- moveToPage: function( c, p, pageMoved ) {
- if ( p.isDisabled ) { return; }
- if ( pageMoved !== false && p.initialized && $.isEmptyObject( c.cache ) ) {
- return tsp.updateCache( c );
- }
- var tmp,
- table = c.table,
- wo = c.widgetOptions,
- l = p.last,
- debug = ts.debug(c, 'pager');
-
- // abort page move if the table has filters and has not been initialized
- if ( p.ajax && !wo.filter_initialized && ts.hasWidget( table, 'filter' ) ) { return; }
-
- tsp.parsePageNumber( c, p );
- tsp.calcFilters( c );
- // fixes issue where one current filter is [] and the other is [ '', '', '' ],
- // making the next if comparison think the filters as different. Fixes #202.
- l.currentFilters = ( l.currentFilters || [] ).join( '' ) === '' ? [] : l.currentFilters;
- p.currentFilters = ( p.currentFilters || [] ).join( '' ) === '' ? [] : p.currentFilters;
- // don't allow rendering multiple times on the same page/size/totalRows/filters/sorts
- if ( l.page === p.page && l.size === p.size && l.totalRows === p.totalRows &&
- ( l.currentFilters || [] ).join( ',' ) === ( p.currentFilters || [] ).join( ',' ) &&
- // check for ajax url changes see #730
- ( l.ajaxUrl || '' ) === ( p.ajaxObject.url || '' ) &&
- // & ajax url option changes (dynamically add/remove/rename sort & filter parameters)
- ( l.optAjaxUrl || '' ) === ( wo.pager_ajaxUrl || '' ) &&
- l.sortList === ( c.sortList || [] ).join( ',' ) ) {
- return;
- }
- if ( debug ) {
- console.log( 'Pager >> Changing to page ' + p.page );
- }
- p.last = {
- page: p.page,
- size: p.size,
- // fixes #408; modify sortList otherwise it auto-updates
- sortList: ( c.sortList || [] ).join( ',' ),
- totalRows: p.totalRows,
- currentFilters: p.currentFilters || [],
- ajaxUrl: p.ajaxObject.url || '',
- optAjaxUrl: wo.pager_ajaxUrl
- };
- if ( p.ajax ) {
- if ( !wo.pager_processAjaxOnInit && !$.isEmptyObject(wo.pager_initialRows) ) {
- wo.pager_processAjaxOnInit = true;
- tmp = wo.pager_initialRows;
- p.totalRows = typeof tmp.total !== 'undefined' ? tmp.total :
- ( debug ? console.error('Pager >> No initial total page set!') || 0 : 0 );
- p.filteredRows = typeof tmp.filtered !== 'undefined' ? tmp.filtered :
- ( debug ? console.error('Pager >> No initial filtered page set!') || 0 : 0 );
- tsp.updatePageDisplay( c, false );
- } else {
- tsp.getAjax( c );
- }
- } else if ( !p.ajax ) {
- tsp.renderTable( c, c.rowsCopy );
- }
- $.data( table, 'pagerLastPage', p.page );
- if ( p.initialized && pageMoved !== false ) {
- if ( debug ) {
- console.log( 'Pager >> Triggering pageMoved' );
- }
- c.$table.triggerHandler( 'pageMoved', c );
- ts.applyWidget( table );
- if ( !p.ajax && table.isUpdating ) {
- if ( debug ) {
- console.log( 'Pager >> Triggering updateComplete' );
- }
- c.$table.triggerHandler( 'updateComplete', [ table, true ] );
- }
- }
- },
-
- getTotalPages: function( c, p ) {
- return ts.hasWidget( c.table, 'filter' ) ?
- Math.min( p.totalPages, p.filteredPages ) :
- p.totalPages;
- },
-
- parsePageNumber: function( c, p ) {
- var min = tsp.getTotalPages( c, p ) - 1;
- p.page = parseInt( p.page, 10 );
- if ( p.page < 0 || isNaN( p.page ) ) { p.page = 0; }
- if ( p.page > min && min >= 0 ) { p.page = min; }
- return p.page;
- },
-
- // set to either set or get value
- parsePageSize: function( c, size, mode ) {
- var p = c.pager,
- wo = c.widgetOptions,
- s = parseInt( size, 10 ) || p.size || wo.pager_size || 10;
- if (p.initialized && (/all/i.test( s + ' ' + size ) || s === p.totalRows)) {
- // Fixing #1364 & #1366
- return p.$container.find( wo.pager_selectors.pageSize + ' option[value="all"]').length ?
- 'all' : p.totalRows;
- }
- // "get" to set `p.size` or "set" to set `pageSize.val()`
- return mode === 'get' ? s : p.size;
- },
-
- setPageSize: function( c, size ) {
- var p = c.pager,
- table = c.table;
- // "all" size is only returned if an "all" option exists - fixes #1366
- p.size = tsp.parsePageSize( c, size, 'get' );
- p.$container
- .find( c.widgetOptions.pager_selectors.pageSize )
- .val( p.size );
- $.data( table, 'pagerLastPage', tsp.parsePageNumber( c, p ) );
- $.data( table, 'pagerLastSize', p.size );
- p.totalPages = p.size === 'all' ? 1 : Math.ceil( p.totalRows / p.size );
- p.filteredPages = p.size === 'all' ? 1 : Math.ceil( p.filteredRows / p.size );
- },
-
- moveToFirstPage: function( c, p ) {
- p.page = 0;
- tsp.moveToPage( c, p, true );
- },
-
- moveToLastPage: function( c, p ) {
- p.page = tsp.getTotalPages( c, p ) - 1;
- tsp.moveToPage( c, p, true );
- },
-
- moveToNextPage: function( c, p ) {
- p.page++;
- var last = tsp.getTotalPages( c, p ) - 1;
- if ( p.page >= last ) {
- p.page = last;
- }
- tsp.moveToPage( c, p, true );
- },
-
- moveToPrevPage: function( c, p ) {
- p.page--;
- if ( p.page <= 0 ) {
- p.page = 0;
- }
- tsp.moveToPage( c, p, true );
- },
-
- destroyPager: function( c, refreshing ) {
- var table = c.table,
- p = c.pager,
- s = c.widgetOptions.pager_selectors || {},
- ctrls = [ s.first, s.prev, s.next, s.last, s.gotoPage, s.pageSize ].join( ',' ),
- namespace = c.namespace + 'pager';
- // check pager object in case two successive pager destroys are triggered
- // e.g. "destroyPager" then "removeWidget" - see #1155
- if ( p ) {
- p.initialized = false;
- c.$table.off( namespace );
- p.$container
- // hide pager
- .hide()
- // unbind pager controls
- .find( ctrls )
- .off( namespace );
- if ( refreshing ) { return; }
- c.appender = null; // remove pager appender function
- tsp.showAllRows( c );
- if ( ts.storage ) {
- ts.storage( table, c.widgetOptions.pager_storageKey, '' );
- }
- p.$container = null;
- c.pager = null;
- c.rowsCopy = null;
- }
- },
-
- enablePager: function( c, triggered ) {
- var info, size,
- table = c.table,
- p = c.pager,
- wo = c.widgetOptions,
- $el = p.$container.find( wo.pager_selectors.pageSize );
- p.isDisabled = false;
- p.page = $.data( table, 'pagerLastPage' ) || p.page || 0;
- size = $el.find('option[selected]' ).val();
- p.size = $.data( table, 'pagerLastSize' ) || tsp.parsePageSize( c, size, 'get' );
- tsp.setPageSize( c, p.size ); // set page size
- p.totalPages = p.size === 'all' ? 1 : Math.ceil( tsp.getTotalPages( c, p ) / p.size );
- c.$table.removeClass( 'pagerDisabled' );
- // if table id exists, include page display with aria info
- if ( table.id && !c.$table.attr( 'aria-describedby' ) ) {
- $el = p.$container.find( wo.pager_selectors.pageDisplay );
- info = $el.attr( 'id' );
- if ( !info ) {
- // only add pageDisplay id if it doesn't exist - see #1288
- info = table.id + '_pager_info';
- $el.attr( 'id', info );
- }
- c.$table.attr( 'aria-describedby', info );
- }
- tsp.changeHeight( c );
- if ( triggered ) {
- // tablesorter core update table
- ts.update( c );
- tsp.setPageSize( c, p.size );
- tsp.moveToPage( c, p, true );
- tsp.hideRowsSetup( c );
- if ( ts.debug(c, 'pager') ) {
- console.log( 'Pager >> Enabled' );
- }
- }
- },
-
- appender: function( table, rows ) {
- var c = table.config,
- wo = c.widgetOptions,
- p = c.pager;
- if ( !p.ajax ) {
- c.rowsCopy = rows;
- p.totalRows = wo.pager_countChildRows ? c.$tbodies.eq( 0 ).children( 'tr' ).length : rows.length;
- p.size = $.data( table, 'pagerLastSize' ) || p.size || wo.pager_size || p.setSize || 10;
- p.totalPages = p.size === 'all' ? 1 : Math.ceil( p.totalRows / p.size );
- tsp.moveToPage( c, p );
- // update display here in case all rows are removed
- tsp.updatePageDisplay( c, false );
- } else {
- tsp.moveToPage( c, p, true );
- }
- }
-
- };
-
- // see #486
- ts.showError = function( table, xhr, settings, exception ) {
- var $table = $( table ),
- c = $table[ 0 ].config,
- wo = c && c.widgetOptions,
- errorRow = c.pager && c.pager.cssErrorRow ||
- wo && wo.pager_css && wo.pager_css.errorRow ||
- 'tablesorter-errorRow',
- typ = typeof xhr,
- valid = true,
- message = '',
- removeRow = function() {
- c.$table.find( 'thead' ).find( c.selectorRemove ).remove();
- };
-
- if ( !$table.length ) {
- console.error( 'tablesorter showError: no table parameter passed' );
- return;
- }
-
- // ajaxError callback for plugin or widget - see #992
- if ( typeof c.pager.ajaxError === 'function' ) {
- valid = c.pager.ajaxError( c, xhr, settings, exception );
- if ( valid === false ) {
- return removeRow();
- } else {
- message = valid;
- }
- } else if ( typeof wo.pager_ajaxError === 'function' ) {
- valid = wo.pager_ajaxError( c, xhr, settings, exception );
- if ( valid === false ) {
- return removeRow();
- } else {
- message = valid;
- }
- }
-
- if ( message === '' ) {
- if ( typ === 'object' ) {
- message =
- xhr.status === 0 ? 'Not connected, verify Network' :
- xhr.status === 404 ? 'Requested page not found [404]' :
- xhr.status === 500 ? 'Internal Server Error [500]' :
- exception === 'parsererror' ? 'Requested JSON parse failed' :
- exception === 'timeout' ? 'Time out error' :
- exception === 'abort' ? 'Ajax Request aborted' :
- 'Uncaught error: ' + xhr.statusText + ' [' + xhr.status + ']';
- } else if ( typ === 'string' ) {
- // keep backward compatibility (external usage just passes a message string)
- message = xhr;
- } else {
- // remove all error rows
- return removeRow();
- }
- }
-
- // allow message to include entire row HTML!
- $( /tr\>/.test( message ) ?
- message :
- '<tr><td colspan="' + c.columns + '">' + message + '</td></tr>'
- )
- .click( function() {
- $( this ).remove();
- })
- // add error row to thead instead of tbody, or clicking on the header will result in a parser error
- .appendTo( c.$table.find( 'thead:first' ) )
- .addClass( errorRow + ' ' + c.selectorRemove.slice( 1 ) )
- .attr({
- role: 'alert',
- 'aria-live': 'assertive'
- });
-
- };
-
-})(jQuery);
+!function(e){"use strict";var a,t=e.tablesorter;t.addWidget({id:"pager",priority:55,options:{pager_output:"{startRow} to {endRow} of {totalRows} rows",pager_updateArrows:!0,pager_startPage:0,pager_pageReset:0,pager_size:10,pager_maxOptionSize:20,pager_savePages:!0,pager_storageKey:"tablesorter-pager",pager_fixedHeight:!1,pager_countChildRows:!1,pager_removeRows:!1,pager_ajaxUrl:null,pager_customAjaxUrl:function(e,a){return a},pager_ajaxError:null,pager_ajaxObject:{dataType:"json"},pager_processAjaxOnInit:!0,pager_ajaxProcessing:function(e){return e},pager_css:{container:"tablesorter-pager",errorRow:"tablesorter-errorRow",disabled:"disabled"},pager_selectors:{container:".pager",first:".first",prev:".prev",next:".next",last:".last",gotoPage:".gotoPage",pageDisplay:".pagedisplay",pageSize:".pagesize"}},init:function(e){a.init(e)},format:function(e,t){if(!t.pager||!t.pager.initialized)return a.initComplete(t);a.moveToPage(t,t.pager,!1)},remove:function(e,t,r,i){a.destroyPager(t,i)}}),a=t.pager={init:function(r){if(!(r.hasInitialized&&r.config.pager&&r.config.pager.initialized)){var i,s=r.config,o=s.widgetOptions,g=o.pager_selectors,n=s.pager=e.extend({totalPages:0,filteredRows:0,filteredPages:0,currentFilters:[],page:o.pager_startPage,startRow:0,endRow:0,ajaxCounter:0,$size:null,last:{},setSize:o.pager_size,setPage:o.pager_startPage},s.pager);n.removeRows=o.pager_removeRows,n.isInitializing||(n.isInitializing=!0,t.debug(s,"pager")&&console.log("Pager >> Initializing"),n.size=e.data(r,"pagerLastSize")||o.pager_size,n.$container=e(g.container).addClass(o.pager_css.container).show(),n.totalRows=s.$tbodies.eq(0).children("tr").not(o.pager_countChildRows?"":"."+s.cssChildRow).length,n.oldAjaxSuccess=n.oldAjaxSuccess||o.pager_ajaxObject.success,s.appender=a.appender,n.initializing=!0,o.pager_savePages&&t.storage&&(i=t.storage(r,o.pager_storageKey)||{},n.page=(isNaN(i.page)?n.page:i.page)||n.setPage||0,n.size="all"===i.size?i.size:(isNaN(i.size)?n.size:i.size)||n.setSize||10,a.setPageSize(s,n.size)),n.regexRows=new RegExp("("+(o.filter_filteredRow||"filtered")+"|"+s.selectorRemove.slice(1)+"|"+s.cssChildRow+")"),n.regexFiltered=new RegExp(o.filter_filteredRow||"filtered"),n.initialized=!1,s.$table.triggerHandler("pagerBeforeInitialized",s),a.enablePager(s,!1),n.ajaxObject=o.pager_ajaxObject,n.ajaxObject.url=o.pager_ajaxUrl,"string"==typeof o.pager_ajaxUrl?(n.ajax=!0,o.filter_serversideFiltering=!0,s.serverSideSorting=!0,a.moveToPage(s,n)):(n.ajax=!1,t.appendCache(s,!0)))}},initComplete:function(e){var r=e.pager;a.bindEvents(e),r.ajax||a.hideRowsSetup(e),r.initialized=!0,r.initializing=!1,r.isInitializing=!1,a.setPageSize(e,r.size),t.debug(e,"pager")&&console.log("Pager >> Triggering pagerInitialized"),e.$table.triggerHandler("pagerInitialized",e),e.widgetOptions.filter_initialized&&t.hasWidget(e.table,"filter")||a.updatePageDisplay(e,!r.ajax)},bindEvents:function(r){var i,s,o,g=r.pager,n=r.widgetOptions,l=r.namespace+"pager",p=n.pager_selectors,d=t.debug(r,"pager");r.$table.off(l).on("filterInit filterStart ".split(" ").join(l+" "),function(i,s){var o;if(g.currentFilters=e.isArray(s)?s:r.$table.data("lastSearch"),g.ajax&&"filterInit"===i.type)return a.moveToPage(r,g,!1);o=t.filter.equalFilters?t.filter.equalFilters(r,r.lastSearch,g.currentFilters):(r.lastSearch||[]).join("")!==(g.currentFilters||[]).join(""),"filterStart"!==i.type||!1===n.pager_pageReset||o||(g.page=n.pager_pageReset)}).on("filterEnd sortEnd ".split(" ").join(l+" "),function(){g.currentFilters=r.$table.data("lastSearch"),(g.initialized||g.initializing)&&(r.delayInit&&r.rowsCopy&&0===r.rowsCopy.length&&a.updateCache(r),a.updatePageDisplay(r,!1),t.applyWidget(r.table))}).on("disablePager"+l,function(e){e.stopPropagation(),a.showAllRows(r)}).on("enablePager"+l,function(e){e.stopPropagation(),a.enablePager(r,!0)}).on("destroyPager"+l,function(e){e.stopPropagation(),t.removeWidget(r.table,"pager",!1)}).on("updateComplete"+l,function(e,i,s){if(e.stopPropagation(),i&&!s&&!g.ajax){var o=r.$tbodies.eq(0).children("tr").not(r.selectorRemove);g.totalRows=o.length-(n.pager_countChildRows?0:o.filter("."+r.cssChildRow).length),g.totalPages="all"===g.size?1:Math.ceil(g.totalRows/g.size),o.length&&r.rowsCopy&&0===r.rowsCopy.length&&a.updateCache(r),g.page>=g.totalPages&&a.moveToLastPage(r,g),a.hideRows(r),a.changeHeight(r),a.updatePageDisplay(r,!1),t.applyWidget(i),a.updatePageDisplay(r)}}).on("pageSize refreshComplete ".split(" ").join(l+" "),function(e,t){e.stopPropagation(),a.setPageSize(r,a.parsePageSize(r,t,"get")),a.moveToPage(r,g,!0),a.hideRows(r),a.updatePageDisplay(r,!1)}).on("pageSet pagerUpdate ".split(" ").join(l+" "),function(e,t){e.stopPropagation(),"pagerUpdate"===e.type&&(t=void 0===t?g.page+1:t,g.last.page=!0),g.page=(parseInt(t,10)||1)-1,a.moveToPage(r,g,!0),a.updatePageDisplay(r,!1)}).on("pageAndSize"+l,function(e,t,i){e.stopPropagation(),g.page=(parseInt(t,10)||1)-1,a.setPageSize(r,a.parsePageSize(r,i,"get")),a.moveToPage(r,g,!0),a.hideRows(r),a.updatePageDisplay(r,!1)}),i=[p.first,p.prev,p.next,p.last],s=["moveToFirstPage","moveToPrevPage","moveToNextPage","moveToLastPage"],d&&!g.$container.length&&console.warn('Pager >> "container" not found'),g.$container.find(i.join(",")).attr("tabindex",0).off("click"+l).on("click"+l,function(t){t.stopPropagation();var o,l=e(this),p=i.length;if(!l.hasClass(n.pager_css.disabled))for(o=0;o<p;o++)if(l.is(i[o])){a[s[o]](r,g);break}}),(o=g.$container.find(n.pager_selectors.gotoPage)).length?o.off("change"+l).on("change"+l,function(){g.page=e(this).val()-1,a.moveToPage(r,g,!0),a.updatePageDisplay(r,!1)}):d&&console.warn('Pager >> "goto" selector not found'),(o=g.$container.find(n.pager_selectors.pageSize)).length?(o.find("option").removeAttr("selected"),o.off("change"+l).on("change"+l,function(){if(!e(this).hasClass(n.pager_css.disabled)){var t=e(this).val();g.$container.find(n.pager_selectors.pageSize).val(t),a.setPageSize(r,t),a.moveToPage(r,g,!0),a.changeHeight(r)}return!1})):d&&console.warn('Pager >> "size" selector not found')},pagerArrows:function(e,t){var r=e.pager,i=!!t,s=i||0===r.page,o=a.getTotalPages(e,r),g=i||r.page===o-1||0===o,n=e.widgetOptions,l=n.pager_selectors;n.pager_updateArrows&&(r.$container.find(l.first+","+l.prev).toggleClass(n.pager_css.disabled,s).prop("aria-disabled",s),r.$container.find(l.next+","+l.last).toggleClass(n.pager_css.disabled,g).prop("aria-disabled",g))},calcFilters:function(a){var t,r,i,s=a.widgetOptions,o=a.pager,g=a.$table.hasClass("hasFilters");if(g&&!o.ajax)if(e.isEmptyObject(a.cache))o.filteredRows=o.totalRows=a.$tbodies.eq(0).children("tr").not(s.pager_countChildRows?"":"."+a.cssChildRow).length;else for(o.filteredRows=0,i=(t=a.cache[0].normalized).length,r=0;r<i;r++)o.filteredRows+=o.regexRows.test(t[r][a.columns].$row[0].className)?0:1;else g||(o.filteredRows=o.totalRows)},updatePageDisplay:function(r,i){if(!r.pager||!r.pager.initializing){var s,o,g,n,l,p,d,c=r.table,f=r.widgetOptions,u=r.pager,h=r.namespace+"pager",w=a.parsePageSize(r,u.size,"get");if("all"===w&&(w=u.totalRows),f.pager_countChildRows&&(o[o.length]=r.cssChildRow),u.$container.find(f.pager_selectors.pageSize+","+f.pager_selectors.gotoPage).removeClass(f.pager_css.disabled).removeAttr("disabled").prop("aria-disabled","false"),u.totalPages=Math.ceil(u.totalRows/w),r.totalRows=u.totalRows,a.parsePageNumber(r,u),a.calcFilters(r),r.filteredRows=u.filteredRows,u.filteredPages=Math.ceil(u.filteredRows/w)||0,a.getTotalPages(r,u)>=0){if(o=w*u.page>u.filteredRows&&i,u.page=o?f.pager_pageReset||0:u.page,u.startRow=o?w*u.page+1:0===u.filteredRows?0:w*u.page+1,u.endRow=Math.min(u.filteredRows,u.totalRows,w*(u.page+1)),g=u.$container.find(f.pager_selectors.pageDisplay),"function"==typeof f.pager_output?s=f.pager_output(c,u):(d=g.attr("data-pager-output"+(u.filteredRows<u.totalRows?"-filtered":""))||f.pager_output,s=(u.ajaxData&&u.ajaxData.output&&u.ajaxData.output||d).replace(/\{page([\-+]\d+)?\}/gi,function(e,a){return u.totalPages?u.page+(a?parseInt(a,10):1):0}).replace(/\{\w+(\s*:\s*\w+)?\}/gi,function(e){var a,t,r=e.replace(/[{}\s]/g,""),i=r.split(":"),s=u.ajaxData,o=/(rows?|pages?)$/i.test(r)?0:"";return/(startRow|page)/.test(i[0])&&"input"===i[1]?(a=(""+("page"===i[0]?u.totalPages:u.totalRows)).length,t="page"===i[0]?u.page+1:u.startRow,'<input type="text" class="ts-'+i[0]+'" style="max-width:'+a+'em" value="'+t+'"/>'):i.length>1&&s&&s[i[0]]?s[i[0]][i[1]]:u[r]||(s?s[r]:o)||o})),u.$container.find(f.pager_selectors.gotoPage).length){for(o="",p=(n=a.buildPageSelect(r,u)).length,l=0;l<p;l++)o+='<option value="'+n[l]+'">'+n[l]+"</option>";u.$container.find(f.pager_selectors.gotoPage).html(o).val(u.page+1)}g.length&&(g["INPUT"===g[0].nodeName?"val":"html"](s),g.find(".ts-startRow, .ts-page").off("change"+h).on("change"+h,function(){var a=e(this).val(),t=e(this).hasClass("ts-startRow")?Math.floor(a/w)+1:a;r.$table.triggerHandler("pageSet"+h,[t])}))}a.pagerArrows(r),a.fixHeight(r),u.initialized&&!1!==i&&(t.debug(r,"pager")&&console.log("Pager >> Triggering pagerComplete"),r.$table.triggerHandler("pagerComplete",r),f.pager_savePages&&t.storage&&t.storage(c,f.pager_storageKey,{page:u.page,size:w===u.totalRows?"all":w}))}},buildPageSelect:function(t,r){var i,s,o,g,n,l,p=t.widgetOptions,d=a.getTotalPages(t,r)||1,c=5*Math.ceil(d/p.pager_maxOptionSize/5),f=d>p.pager_maxOptionSize,u=r.page+1,h=c,w=d-c,P=[1];for(i=f?c:1;i<=d;)P[P.length]=i,i+=f?c:1;if(P[P.length]=d,f){for(o=[],(h=u-(s=Math.max(Math.floor(p.pager_maxOptionSize/c)-1,5)))<1&&(h=1),(w=u+s)>d&&(w=d),i=h;i<=w;i++)o[o.length]=i;(n=(P=e.grep(P,function(a,t){return e.inArray(a,P)===t})).length)-(l=o.length)>c/2&&n+l>p.pager_maxOptionSize&&(g=Math.floor(n/2)-Math.floor(l/2),Array.prototype.splice.apply(P,[g,l])),P=P.concat(o)}return P=e.grep(P,function(a,t){return e.inArray(a,P)===t}).sort(function(e,a){return e-a})},fixHeight:function(a){var t,r,i,s=a.table,o=a.pager,g=a.widgetOptions,n=a.$tbodies.eq(0);n.find("tr.pagerSavedHeightSpacer").remove(),g.pager_fixedHeight&&!o.isDisabled&&(r=e.data(s,"pagerSavedHeight"))&&(i=0,e(s).css("border-spacing").split(" ").length>1&&(i=e(s).css("border-spacing").split(" ")[1].replace(/[^-\d\.]/g,"")),(t=r-n.height()+i*o.size-i)>5&&e.data(s,"pagerLastSize")===o.size&&n.children("tr:visible").length<("all"===o.size?o.totalRows:o.size)&&n.append('<tr class="pagerSavedHeightSpacer '+a.selectorRemove.slice(1)+'" style="height:'+t+'px;"></tr>'))},changeHeight:function(t){var r,i=t.table,s=t.pager,o="all"===s.size?s.totalRows:s.size,g=t.$tbodies.eq(0);g.find("tr.pagerSavedHeightSpacer").remove(),g.children("tr:visible").length||g.append('<tr class="pagerSavedHeightSpacer '+t.selectorRemove.slice(1)+'"><td>&nbsp</td></tr>'),r=g.children("tr").eq(0).height()*o,e.data(i,"pagerSavedHeight",r),a.fixHeight(t),e.data(i,"pagerLastSize",s.size)},hideRows:function(e){if(!e.widgetOptions.pager_ajaxUrl){var a,r,i,s,o,g=e.pager,n=e.widgetOptions,l=e.$tbodies.length,p="all"===g.size?g.totalRows:g.size,d=g.page*p,c=d+p,f=0,u=0;for(g.cacheIndex=[],a=0;a<l;a++){for(s=(i=e.$tbodies.eq(a).children("tr")).length,o=0,f=0,u=0,r=0;r<s;r++)g.regexFiltered.test(i[r].className)||(u===d&&i[r].className.match(e.cssChildRow)?i[r].style.display="none":(i[r].style.display=u>=d&&u<c?"":"none",f!==u&&u>=d&&u<c&&(g.cacheIndex[g.cacheIndex.length]=r,f=u),(u+=i[r].className.match(e.cssChildRow+"|"+e.selectorRemove.slice(1))&&!n.pager_countChildRows?0:1)===c&&"none"!==i[r].style.display&&i[r].className.match(t.css.cssHasChild)&&(o=r)));if(o>0&&i[o].className.match(t.css.cssHasChild))for(;++o<s&&i[o].className.match(e.cssChildRow);)i[o].style.display=""}}},hideRowsSetup:function(e){var t=e.pager,r=e.namespace+"pager",i=t.$container.find(e.widgetOptions.pager_selectors.pageSize).val();t.size=a.parsePageSize(e,i,"get"),a.setPageSize(e,t.size),a.pagerArrows(e),e.widgetOptions.pager_removeRows||(a.hideRows(e),e.$table.on("sortEnd filterEnd ".split(" ").join(r+" "),function(){a.hideRows(e)}))},renderAjax:function(r,i,s,o,g){var n=i.table,l=i.pager,p=i.widgetOptions,d=t.debug(i,"pager");if(e.isFunction(p.pager_ajaxProcessing)){i.$tbodies.eq(0).empty();var c,f,u,h,w,P,b,z,R,v,m,x,j,_,y,S=i.$table,C="",$=p.pager_ajaxProcessing(r,n,s)||[0,[]];if(t.showError(n),g)d&&console.error("Pager >> Ajax Error",s,o,g),t.showError(n,s,o,g),i.$tbodies.eq(0).children("tr").detach(),l.totalRows=0;else{if(e.isArray($)?(j=$[(u=isNaN($[0])&&!isNaN($[1]))?1:0],l.totalRows=isNaN(j)?l.totalRows||0:j,i.totalRows=i.filteredRows=l.filteredRows=l.totalRows,m=0===l.totalRows?[]:$[u?0:1]||[],v=$[2]):(l.ajaxData=$,i.totalRows=l.totalRows=$.total,i.filteredRows=l.filteredRows=void 0!==$.filteredRows?$.filteredRows:$.total,v=$.headers,m=$.rows||[]),x=m&&m.length,m instanceof e)p.pager_processAjaxOnInit&&(i.$tbodies.eq(0).empty(),i.$tbodies.eq(0).append(m));else if(x){for(c=0;c<x;c++){for(C+="<tr>",f=0;f<m[c].length;f++)C+=/^\s*<td/.test(m[c][f])?e.trim(m[c][f]):"<td>"+m[c][f]+"</td>";C+="</tr>"}p.pager_processAjaxOnInit&&i.$tbodies.eq(0).html(C)}if(p.pager_processAjaxOnInit=!0,v){for(P=(h=S.hasClass("hasStickyHeaders"))?p.$sticky.children("thead:first").children("tr:not(."+i.cssIgnoreRow+")").children():"",w=S.find("tfoot tr:first").children(),_=(b=i.$headers.filter("th")).length,f=0;f<_;f++)(z=b.eq(f)).find("."+t.css.icon).length?(R=z.find("."+t.css.icon).clone(!0),z.find("."+t.css.headerIn).html(v[f]).append(R),h&&P.length&&(R=P.eq(f).find("."+t.css.icon).clone(!0),P.eq(f).find("."+t.css.headerIn).html(v[f]).append(R))):(z.find("."+t.css.headerIn).html(v[f]),h&&P.length&&(l.$container=l.$container.add(p.$sticky),P.eq(f).find("."+t.css.headerIn).html(v[f]))),w.eq(f).html(v[f]);h&&a.bindEvents(i)}}i.showProcessing&&t.isProcessing(n),y=a.parsePageSize(i,l.size,"get"),l.totalPages="all"===y?1:Math.ceil(l.totalRows/y),l.last.totalRows=l.totalRows,l.last.currentFilters=l.currentFilters,l.last.sortList=(i.sortList||[]).join(","),l.initializing=!1,a.updatePageDisplay(i,!1),t.updateCache(i,function(){l.initialized&&setTimeout(function(){d&&console.log("Pager >> Triggering pagerChange"),S.triggerHandler("pagerChange",l),t.applyWidget(n),a.updatePageDisplay(i)},0)})}l.initialized||t.applyWidget(n)},getAjax:function(r){var i,s=a.getAjaxUrl(r),o=e(document),g=r.namespace+"pager",n=r.pager;""!==s&&(r.showProcessing&&t.isProcessing(r.table,!0),o.on("ajaxError"+g,function(e,t,i,s){a.renderAjax(null,r,t,i,s),o.off("ajaxError"+g)}),i=++n.ajaxCounter,n.last.ajaxUrl=s,n.ajaxObject.url=s,n.ajaxObject.success=function(e,t,s){i<n.ajaxCounter||(a.renderAjax(e,r,s),o.off("ajaxError"+g),"function"==typeof n.oldAjaxSuccess&&n.oldAjaxSuccess(e))},t.debug(r,"pager")&&console.log("Pager >> Ajax initialized",n.ajaxObject),e.ajax(n.ajaxObject))},getAjaxUrl:function(a){var r,i,s=a.pager,o=a.widgetOptions,g=o.pager_ajaxUrl?o.pager_ajaxUrl.replace(/\{page([\-+]\d+)?\}/,function(e,a){return s.page+(a?parseInt(a,10):0)}).replace(/\{size\}/g,s.size):"",n=a.sortList,l=s.currentFilters||a.$table.data("lastSearch")||[],p=g.match(/\{\s*sort(?:List)?\s*:\s*(\w*)\s*\}/),d=g.match(/\{\s*filter(?:List)?\s*:\s*(\w*)\s*\}/),c=[];if(p){for(p=p[1],i=n.length,r=0;r<i;r++)c[c.length]=p+"["+n[r][0]+"]="+n[r][1];g=g.replace(/\{\s*sort(?:List)?\s*:\s*(\w*)\s*\}/g,c.length?c.join("&"):p),c=[]}if(d){for(d=d[1],i=l.length,r=0;r<i;r++)l[r]&&(c[c.length]=d+"["+r+"]="+encodeURIComponent(l[r]));g=g.replace(/\{\s*filter(?:List)?\s*:\s*(\w*)\s*\}/g,c.length?c.join("&"):d),s.currentFilters=l}return e.isFunction(o.pager_customAjaxUrl)&&(g=o.pager_customAjaxUrl(a.table,g)),t.debug(a,"pager")&&console.log("Pager >> Ajax url = "+g),g},renderTable:function(e,r){var i,s,o,g,n=e.table,l=e.pager,p=e.widgetOptions,d=t.debug(e,"pager"),c=e.$table.hasClass("hasFilters"),f=r&&r.length||0,u="all"===l.size?l.totalRows:l.size,h=l.page*u;if(f<1)d&&console.warn("Pager >> No rows for pager to render");else{if(l.page>=l.totalPages)return a.moveToLastPage(e,l);if(l.cacheIndex=[],l.isDisabled=!1,l.initialized&&(d&&console.log("Pager >> Triggering pagerChange"),e.$table.triggerHandler("pagerChange",e)),p.pager_removeRows){for(t.clearTableBody(n),i=t.processTbody(n,e.$tbodies.eq(0),!0),s=c?0:h,o=c?0:h,g=0;g<u&&s<r.length;)c&&l.regexFiltered.test(r[s][0].className)||++o>h&&g<=u&&(g++,l.cacheIndex[l.cacheIndex.length]=s,i.append(r[s])),s++;t.processTbody(n,i,!1)}else a.hideRows(e);a.updatePageDisplay(e),p.pager_startPage=l.page,p.pager_size=l.size,n.isUpdating&&(d&&console.log("Pager >> Triggering updateComplete"),e.$table.triggerHandler("updateComplete",[n,!0]))}},showAllRows:function(r){var i,s,o,g=r.table,n=r.pager,l=r.widgetOptions;for(n.ajax?a.pagerArrows(r,!0):(e.data(g,"pagerLastPage",n.page),e.data(g,"pagerLastSize",n.size),n.page=0,n.size=n.totalRows,n.totalPages=1,r.$table.addClass("pagerDisabled").removeAttr("aria-describedby").find("tr.pagerSavedHeightSpacer").remove(),a.renderTable(r,r.rowsCopy),n.isDisabled=!0,t.applyWidget(g),t.debug(r,"pager")&&console.log("Pager >> Disabled")),o=(s=n.$container.find(l.pager_selectors.pageSize+","+l.pager_selectors.gotoPage+",.ts-startRow, .ts-page")).length,i=0;i<o;i++)s.eq(i).prop("aria-disabled","true").addClass(l.pager_css.disabled)[0].disabled=!0},updateCache:function(r){var i=r.pager;t.updateCache(r,function(){if(!e.isEmptyObject(r.cache)){var t,s=[],o=r.cache[0].normalized;for(i.totalRows=o.length,t=0;t<i.totalRows;t++)s[s.length]=o[t][r.columns].$row;r.rowsCopy=s,a.moveToPage(r,i,!0),i.last.currentFilters=[" "]}})},moveToPage:function(r,i,s){if(!i.isDisabled){if(!1!==s&&i.initialized&&e.isEmptyObject(r.cache))return a.updateCache(r);var o,g=r.table,n=r.widgetOptions,l=i.last,p=t.debug(r,"pager");i.ajax&&!n.filter_initialized&&t.hasWidget(g,"filter")||(a.parsePageNumber(r,i),a.calcFilters(r),l.currentFilters=""===(l.currentFilters||[]).join("")?[]:l.currentFilters,i.currentFilters=""===(i.currentFilters||[]).join("")?[]:i.currentFilters,l.page===i.page&&l.size===i.size&&l.totalRows===i.totalRows&&(l.currentFilters||[]).join(",")===(i.currentFilters||[]).join(",")&&(l.ajaxUrl||"")===(i.ajaxObject.url||"")&&(l.optAjaxUrl||"")===(n.pager_ajaxUrl||"")&&l.sortList===(r.sortList||[]).join(",")||(p&&console.log("Pager >> Changing to page "+i.page),i.last={page:i.page,size:i.size,sortList:(r.sortList||[]).join(","),totalRows:i.totalRows,currentFilters:i.currentFilters||[],ajaxUrl:i.ajaxObject.url||"",optAjaxUrl:n.pager_ajaxUrl},i.ajax?n.pager_processAjaxOnInit||e.isEmptyObject(n.pager_initialRows)?a.getAjax(r):(n.pager_processAjaxOnInit=!0,o=n.pager_initialRows,i.totalRows=void 0!==o.total?o.total:p&&console.error("Pager >> No initial total page set!")||0,i.filteredRows=void 0!==o.filtered?o.filtered:p&&console.error("Pager >> No initial filtered page set!")||0,a.updatePageDisplay(r,!1)):i.ajax||a.renderTable(r,r.rowsCopy),e.data(g,"pagerLastPage",i.page),i.initialized&&!1!==s&&(p&&console.log("Pager >> Triggering pageMoved"),r.$table.triggerHandler("pageMoved",r),t.applyWidget(g),!i.ajax&&g.isUpdating&&(p&&console.log("Pager >> Triggering updateComplete"),r.$table.triggerHandler("updateComplete",[g,!0])))))}},getTotalPages:function(e,a){return t.hasWidget(e.table,"filter")?Math.min(a.totalPages,a.filteredPages):a.totalPages},parsePageNumber:function(e,t){var r=a.getTotalPages(e,t)-1;return t.page=parseInt(t.page,10),(t.page<0||isNaN(t.page))&&(t.page=0),t.page>r&&r>=0&&(t.page=r),t.page},parsePageSize:function(e,a,t){var r=e.pager,i=e.widgetOptions,s=parseInt(a,10)||r.size||i.pager_size||10;return r.initialized&&(/all/i.test(s+" "+a)||s===r.totalRows)?r.$container.find(i.pager_selectors.pageSize+' option[value="all"]').length?"all":r.totalRows:"get"===t?s:r.size},setPageSize:function(t,r){var i=t.pager,s=t.table;i.size=a.parsePageSize(t,r,"get"),i.$container.find(t.widgetOptions.pager_selectors.pageSize).val(i.size),e.data(s,"pagerLastPage",a.parsePageNumber(t,i)),e.data(s,"pagerLastSize",i.size),i.totalPages="all"===i.size?1:Math.ceil(i.totalRows/i.size),i.filteredPages="all"===i.size?1:Math.ceil(i.filteredRows/i.size)},moveToFirstPage:function(e,t){t.page=0,a.moveToPage(e,t,!0)},moveToLastPage:function(e,t){t.page=a.getTotalPages(e,t)-1,a.moveToPage(e,t,!0)},moveToNextPage:function(e,t){t.page++;var r=a.getTotalPages(e,t)-1;t.page>=r&&(t.page=r),a.moveToPage(e,t,!0)},moveToPrevPage:function(e,t){t.page--,t.page<=0&&(t.page=0),a.moveToPage(e,t,!0)},destroyPager:function(e,r){var i=e.table,s=e.pager,o=e.widgetOptions.pager_selectors||{},g=[o.first,o.prev,o.next,o.last,o.gotoPage,o.pageSize].join(","),n=e.namespace+"pager";if(s){if(s.initialized=!1,e.$table.off(n),s.$container.hide().find(g).off(n),r)return;e.appender=null,a.showAllRows(e),t.storage&&t.storage(i,e.widgetOptions.pager_storageKey,""),s.$container=null,e.pager=null,e.rowsCopy=null}},enablePager:function(r,i){var s,o,g=r.table,n=r.pager,l=r.widgetOptions,p=n.$container.find(l.pager_selectors.pageSize);n.isDisabled=!1,n.page=e.data(g,"pagerLastPage")||n.page||0,o=p.find("option[selected]").val(),n.size=e.data(g,"pagerLastSize")||a.parsePageSize(r,o,"get"),a.setPageSize(r,n.size),n.totalPages="all"===n.size?1:Math.ceil(a.getTotalPages(r,n)/n.size),r.$table.removeClass("pagerDisabled"),g.id&&!r.$table.attr("aria-describedby")&&((s=(p=n.$container.find(l.pager_selectors.pageDisplay)).attr("id"))||(s=g.id+"_pager_info",p.attr("id",s)),r.$table.attr("aria-describedby",s)),a.changeHeight(r),i&&(t.update(r),a.setPageSize(r,n.size),a.moveToPage(r,n,!0),a.hideRowsSetup(r),t.debug(r,"pager")&&console.log("Pager >> Enabled"))},appender:function(t,r){var i=t.config,s=i.widgetOptions,o=i.pager;o.ajax?a.moveToPage(i,o,!0):(i.rowsCopy=r,o.totalRows=s.pager_countChildRows?i.$tbodies.eq(0).children("tr").length:r.length,o.size=e.data(t,"pagerLastSize")||o.size||s.pager_size||o.setSize||10,o.totalPages="all"===o.size?1:Math.ceil(o.totalRows/o.size),a.moveToPage(i,o),a.updatePageDisplay(i,!1))}},t.showError=function(a,t,r,i){var s=e(a),o=s[0].config,g=o&&o.widgetOptions,n=o.pager&&o.pager.cssErrorRow||g&&g.pager_css&&g.pager_css.errorRow||"tablesorter-errorRow",l=typeof t,p=!0,d="",c=function(){o.$table.find("thead").find(o.selectorRemove).remove()};if(s.length){if("function"==typeof o.pager.ajaxError){if(!1===(p=o.pager.ajaxError(o,t,r,i)))return c();d=p}else if("function"==typeof g.pager_ajaxError){if(!1===(p=g.pager_ajaxError(o,t,r,i)))return c();d=p}if(""===d)if("object"===l)d=0===t.status?"Not connected, verify Network":404===t.status?"Requested page not found [404]":500===t.status?"Internal Server Error [500]":"parsererror"===i?"Requested JSON parse failed":"timeout"===i?"Time out error":"abort"===i?"Ajax Request aborted":"Uncaught error: "+t.statusText+" ["+t.status+"]";else{if("string"!==l)return c();d=t}e(/tr\>/.test(d)?d:'<tr><td colspan="'+o.columns+'">'+d+"</td></tr>").click(function(){e(this).remove()}).appendTo(o.$table.find("thead:first")).addClass(n+" "+o.selectorRemove.slice(1)).attr({role:"alert","aria-live":"assertive"})}else console.error("tablesorter showError: no table parameter passed")}}(jQuery);