jquery-tablesorter 1.19.3 → 1.19.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- /*! Parser: two digit year - updated 10/26/2014 (v2.18.0) */
1
+ /*! Parser: two digit year - updated 11/22/2015 (v2.24.6) */
2
2
  /* Demo: http://mottie.github.io/tablesorter/docs/example-parsers-dates.html */
3
3
  /*jshint jquery:true */
4
4
  ;(function($){
@@ -13,10 +13,9 @@
13
13
  ts = $.tablesorter,
14
14
  now = new Date().getFullYear();
15
15
 
16
- ts.dates = $.extend({}, ts.dates, {
17
- regxxxxyy: /(\d{1,2})[\/\s](\d{1,2})[\/\s](\d{2})/,
18
- regyyxxxx: /(\d{2})[\/\s](\d{1,2})[\/\s](\d{1,2})/
19
- });
16
+ if ( !ts.dates ) { ts.dates = {}; }
17
+ ts.dates.regxxxxyy = /(\d{1,2})[\/\s](\d{1,2})[\/\s](\d{2})/;
18
+ ts.dates.regyyxxxx = /(\d{2})[\/\s](\d{1,2})[\/\s](\d{1,2})/;
20
19
 
21
20
  ts.formatDate = function(s, regex, format, table){
22
21
  if (s) {
@@ -1,40 +1,38 @@
1
- /*! Parser: weekday - updated 11/2/2015 (v2.24.1) */
1
+ /*! Parser: weekday - updated 11/22/2015 (v2.24.6) */
2
2
  /* Demo: http://jsfiddle.net/Mottie/abkNM/4169/ */
3
3
  /*jshint jquery:true */
4
4
  ;(function($){
5
5
  'use strict';
6
6
 
7
7
  var ts = $.tablesorter;
8
- ts.dates = $.extend( true, {}, {
9
- // See http://mottie.github.io/tablesorter/docs/example-widget-grouping.html
10
- // for details on how to use CLDR data for a locale to add data for this parser
11
- // CLDR returns { sun: "Sun", mon: "Mon", tue: "Tue", wed: "Wed", thu: "Thu", ... }
12
- weekdays : {
13
- 'en' : {
14
- 'sun' : 'Sun',
15
- 'mon' : 'Mon',
16
- 'tue' : 'Tue',
17
- 'wed' : 'Wed',
18
- 'thu' : 'Thu',
19
- 'fri' : 'Fri',
20
- 'sat' : 'Sat'
21
- }
22
- },
23
-
24
- // set table.config.weekStarts to change weekday start date for your locale
25
- // cross-reference of a date on which the week starts on a...
26
- // https://github.com/unicode-cldr/cldr-core/blob/master/supplemental/weekData.json
27
- weekStartList : {
28
- 'sun' : '1995', // Sun 1/1/1995
29
- 'mon' : '1996', // Mon 1/1/1996
30
- 'fri' : '1999', // Friday 1/1/1999
31
- 'sat' : '2000' // Sat 1/1/2000
32
- },
33
-
34
- // do not modify this array; it is used for cross referencing
35
- weekdaysXref : [ 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat' ]
36
8
 
37
- }, ts.dates );
9
+ if ( !ts.dates ) { ts.dates = {}; }
10
+ if ( !ts.dates.weekdays ) { ts.dates.weekdays = {}; }
11
+ // See http://mottie.github.io/tablesorter/docs/example-widget-grouping.html
12
+ // for details on how to use CLDR data for a locale to add data for this parser
13
+ // CLDR returns { sun: "Sun", mon: "Mon", tue: "Tue", wed: "Wed", thu: "Thu", ... }
14
+ ts.dates.weekdays.en = {
15
+ 'sun' : 'Sun',
16
+ 'mon' : 'Mon',
17
+ 'tue' : 'Tue',
18
+ 'wed' : 'Wed',
19
+ 'thu' : 'Thu',
20
+ 'fri' : 'Fri',
21
+ 'sat' : 'Sat'
22
+ };
23
+ // set table.config.weekStarts to change weekday start date for your locale
24
+ // cross-reference of a date on which the week starts on a...
25
+ // https://github.com/unicode-cldr/cldr-core/blob/master/supplemental/weekData.json
26
+ // locale agnostic
27
+ ts.dates.weekStartList = {
28
+ 'sun' : '1995', // Sun 1/1/1995
29
+ 'mon' : '1996', // Mon 1/1/1996
30
+ 'fri' : '1999', // Friday 1/1/1999
31
+ 'sat' : '2000' // Sat 1/1/2000
32
+ };
33
+ // do not modify this array; it is used for cross referencing weekdays
34
+ // locale agnostic
35
+ ts.dates.weekdaysXref = [ 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat' ];
38
36
 
39
37
  ts.addParser({
40
38
  id: 'weekday',
@@ -1,5 +1,6 @@
1
1
  /*! Parser: image - new 7/17/2014 (v2.17.5) */
2
2
  /* alt attribute parser for jQuery 1.7+ & tablesorter 2.7.11+ */
3
+ /* NOTE! Moved to jquery.tablesorter.js (core) in v2.18.0 */
3
4
  /*jshint jquery:true, unused:false */
4
5
  ;(function($){
5
6
  'use strict';
@@ -1,4 +1,4 @@
1
- /*! Parser: input & select - updated 10/31/2015 (v2.24.0) *//*
1
+ /*! Parser: input & select - updated 11/22/2015 (v2.24.6) *//*
2
2
  * for jQuery 1.7+ & tablesorter 2.7.11+
3
3
  * Demo: http://mottie.github.com/tablesorter/docs/example-widget-grouping.html
4
4
  */
@@ -10,7 +10,8 @@
10
10
  // do something here to update your server, if needed
11
11
  // event = change event object
12
12
  // $table = jQuery object of the table that was just updated
13
- // $input = jQuery object of the input or select that was modified
13
+ // $input = jQuery object(s) of the input or select that was modified; in v2.24.6,
14
+ // if the thead has a checkbox, $input may include multiple elements
14
15
  };
15
16
 
16
17
  // Custom parser for parsing input values
@@ -125,22 +126,20 @@
125
126
  // you can change it to use delegate (v1.4.3+) or live (v1.3+) as desired
126
127
  // if this code interferes somehow, target the specific table $('#mytable'), instead of $('table')
127
128
  $( function() {
129
+ if ( !$.fn.on ) { return; }
128
130
  $( 'table' ).on( 'tablesorter-initialized updateComplete', function() {
129
- var namespace = '.parser-forms',
130
- restoreValue = function( isTbody ) {
131
+ this.tablesorterBusy = false;
132
+ var namespace = '.parser-forms';
133
+ // bind to .tablesorter (default class name)
134
+ $( this ).children( 'tbody' )
135
+ .off( namespace )
136
+ .on( 'mouseleave' + namespace, function( event ) {
131
137
  // make sure we restore original values (trigger blur)
132
138
  // isTbody is needed to prevent the select from closing in IE
133
139
  // see https://connect.microsoft.com/IE/feedbackdetail/view/962618/
134
- if ( isTbody ) {
140
+ if ( event.target.nodeName === 'TBODY' ) {
135
141
  $( ':focus' ).blur();
136
142
  }
137
- return;
138
- };
139
- // bind to .tablesorter (default class name)
140
- $( this ).children( 'tbody' )
141
- .off( namespace )
142
- .on( 'mouseleave' + namespace, function( event ) {
143
- restoreValue( event.target.nodeName === 'TBODY' );
144
143
  })
145
144
  .on( 'focus' + namespace, 'select, input, textarea', function() {
146
145
  $( this ).data( 'ts-original-value', this.value );
@@ -162,28 +161,92 @@
162
161
  ( event.target.nodeName === 'INPUT' || event.target.nodeName === 'TEXTAREA' && event.altKey ) ) ) {
163
162
  var undef,
164
163
  $target = $( event.target ),
164
+ isCheckbox = event.target.type === 'checkbox',
165
165
  $cell = $target.closest( 'td' ),
166
166
  $table = $cell.closest( 'table' ),
167
167
  indx = $cell[ 0 ].cellIndex,
168
168
  c = $table[ 0 ].config || false,
169
+ busy = $table.length && $table[ 0 ].tablesorterBusy,
169
170
  $hdr = c && c.$headerIndexed && c.$headerIndexed[ indx ] || [],
170
- val = $target.val();
171
- // abort if not a tablesorter table, or don't use updateCell if column is set
171
+ val = isCheckbox ? event.target.checked : $target.val();
172
+ // abort if not a tablesorter table, or busy, or don't use updateCell if column is set
172
173
  // to 'sorter-false' and 'filter-false', or column is set to 'parser-false'
173
- if ( $hdr.length && ( $hdr.hasClass( 'parser-false' ) ||
174
- ( $hdr.hasClass( 'sorter-false' ) && $hdr.hasClass( 'filter-false' ) ) ) ) {
174
+ if ( $.isEmptyObject( c ) || busy !== false || $hdr.length && ( $hdr.hasClass( 'parser-false' ) ||
175
+ ( $hdr.hasClass( 'sorter-false' ) && $hdr.hasClass( 'filter-false' ) ) ) ||
176
+ // table already updating; get out of here, we might be in an endless loop (in IE)! See #971
177
+ ( event.type === 'change' && c.table.isUpdating ) ) {
175
178
  return;
176
179
  }
177
180
  // ignore change event if nothing changed
178
- if ( c && val !== $target.data( 'ts-original-value' ) || event.target.type === 'checkbox' ) {
181
+ if ( c && val !== $target.data( 'ts-original-value' ) || isCheckbox ) {
179
182
  $target.data( 'ts-original-value', val );
183
+ $table[ 0 ].tablesorterBusy = true;
180
184
  // pass undefined resort value so it falls back to config.resort setting
181
185
  $.tablesorter.updateCell( c, $cell, undef, function() {
182
186
  updateServer( event, $table, $target );
187
+ $table[ 0 ].tablesorterBusy = false;
183
188
  });
184
189
  }
185
190
  }
186
191
  });
192
+
193
+ // add code for a checkbox in the header to set/unset all checkboxes in a column
194
+ if ( $( this ).children( 'thead' ).find( 'input[type="checkbox"]' ) ) {
195
+ $( this )
196
+ .off( namespace )
197
+ .on( 'tablesorter-ready' + namespace, function() {
198
+ var checkboxClass, $rows, len,
199
+ $table = $( this ),
200
+ c = $table.length && $table[ 0 ].config;
201
+ if ( !$.isEmptyObject( c ) ) {
202
+ this.tablesorterBusy = true;
203
+ checkboxClass = c && c.checkboxClass || 'checked';
204
+ $rows = $table.children( 'tbody' ).children( ':visible' ); // (include child rows?)
205
+ len = $rows.length;
206
+ // set indeterminate state on header checkbox
207
+ $( this ).children( 'thead' ).find( 'input[type="checkbox"]' ).each( function() {
208
+ var column = $( this ).closest( 'td, th' ).attr( 'data-column' ),
209
+ vis = $rows.filter( '.' + checkboxClass + '-' + column ).length,
210
+ allChecked = vis === len;
211
+ if ( vis === 0 || allChecked ) {
212
+ this.checked = allChecked;
213
+ this.indeterminate = false;
214
+ } else {
215
+ this.indeterminate = true;
216
+ }
217
+ });
218
+ this.tablesorterBusy = false;
219
+ }
220
+ })
221
+ .children( 'thead' )
222
+ .off( namespace )
223
+ // modified from http://jsfiddle.net/abkNM/6163/
224
+ .on( 'change' + namespace, 'input[type="checkbox"]', function( event ) {
225
+ var undef, onlyVisible, column, $target,
226
+ $checkbox = $( this ),
227
+ $table = $checkbox.closest( 'table' ),
228
+ c = $table.length && $table[ 0 ].config,
229
+ isChecked = this.checked;
230
+ if ( $table.length && c && !$table[ 0 ].tablesorterBusy ) {
231
+ column = parseInt( $checkbox.closest( 'td, th' ).attr( 'data-column' ), 10 );
232
+ onlyVisible = $table.length && c.checkboxVisible;
233
+ $table[ 0 ].tablesorterBusy = true; // prevent "change" event from calling updateCell numerous times (see #971)
234
+ $target = $table
235
+ .children( 'tbody' )
236
+ .children( 'tr' + ( typeof onlyVisible === 'undefined' || onlyVisible === true ? ':visible' : '' ) )
237
+ .children( ':nth-child(' + ( column + 1 ) + ')' )
238
+ .find( 'input[type="checkbox"]' )
239
+ .prop( 'checked', isChecked );
240
+ $.tablesorter.update( c, undef, function() {
241
+ updateServer( event, $table, $target );
242
+ $table[ 0 ].tablesorterBusy = false;
243
+ });
244
+ }
245
+ // update already going on, don't do anything!
246
+ return false;
247
+ });
248
+ }
249
+
187
250
  });
188
251
  });
189
252
 
@@ -1,4 +1,4 @@
1
- /*! Widget: filter, insideRange filter type - updated 2/23/2015 (v2.21.0) */
1
+ /*! Widget: filter, insideRange filter type - updated 11/22/2015 (v2.24.6) */
2
2
  ;(function($){
3
3
  'use strict';
4
4
 
@@ -17,6 +17,8 @@
17
17
  ts.filter.types.insideRange = function( c, data ) {
18
18
  if ( isDigit.test( data.iFilter ) && range.test( data.iExact ) ) {
19
19
  var t, val, low, high,
20
+ index = data.index,
21
+ cell = data.$cells[ index ],
20
22
  parts = data.iExact.split( range ),
21
23
  format = c.parsers[data.index].format;
22
24
  // the cell does not contain a range
@@ -24,9 +26,9 @@
24
26
  return null;
25
27
  }
26
28
  // format each side part of the range using the assigned parser
27
- low = parseNumber( format( parts[0], c.table ) );
28
- high = parseNumber( format( parts[1], c.table ) );
29
- val = parseNumber( format( data.iFilter, c.table ) );
29
+ low = parseNumber( format( parts[0], c.table, cell, index ) );
30
+ high = parseNumber( format( parts[1], c.table, cell, index ) );
31
+ val = parseNumber( format( data.iFilter, c.table, cell, index ) );
30
32
  if ( high < low ) {
31
33
  // swap high & low
32
34
  t = high; high = low; low = t;
@@ -1,4 +1,4 @@
1
- /*! Widget: math - updated 11/10/2015 (v2.24.4) *//*
1
+ /*! Widget: math - updated 11/22/2015 (v2.24.6) *//*
2
2
  * Requires tablesorter v2.16+ and jQuery 1.7+
3
3
  * by Rob Garrison
4
4
  */
@@ -40,11 +40,17 @@
40
40
 
41
41
  // get all of the row numerical values in an arry
42
42
  getRow : function( c, $el ) {
43
- var wo = c.widgetOptions,
43
+ var $cells,
44
+ wo = c.widgetOptions,
44
45
  arry = [],
45
46
  $row = $el.closest( 'tr' ),
47
+ isFiltered = $row.hasClass( wo.filter_filteredRow || 'filtered' ),
48
+ hasFilter = wo.math_rowFilter;
49
+ if ( hasFilter ) {
50
+ $row = $row.filter( hasFilter );
51
+ }
52
+ if ( !isFiltered || hasFilter ) {
46
53
  $cells = $row.children().not( '[' + wo.math_dataAttrib + '=ignore]' );
47
- if ( !$row.hasClass( wo.filter_filteredRow || 'filtered' ) ) {
48
54
  if ( wo.math_ignore.length ) {
49
55
  $cells = $cells.not( '[data-column=' + wo.math_ignore.join( '],[data-column=' ) + ']' );
50
56
  }
@@ -57,9 +63,10 @@
57
63
 
58
64
  // get all of the column numerical values in an arry
59
65
  getColumn : function( c, $el, type ) {
60
- var index, $t, len, $mathRows, mathAbove,
66
+ var index, $t, $tr, len, $mathRows, mathAbove,
61
67
  arry = [],
62
68
  wo = c.widgetOptions,
69
+ hasFilter = wo.math_rowFilter,
63
70
  mathAttr = wo.math_dataAttrib,
64
71
  filtered = wo.filter_filteredRow || 'filtered',
65
72
  cIndex = parseInt( $el.attr( 'data-column' ), 10 ),
@@ -71,11 +78,15 @@
71
78
  len = $rows.index( $row );
72
79
  index = len;
73
80
  while ( index >= 0 ) {
74
- $t = $rows.eq( index ).children().filter( '[data-column=' + cIndex + ']' );
81
+ $tr = $rows.eq( index );
82
+ if ( hasFilter ) {
83
+ $tr = $tr.filter( wo.math_rowFilter );
84
+ }
85
+ $t = $tr.children().filter( '[data-column=' + cIndex + ']' );
75
86
  mathAbove = $t.filter( '[' + mathAttr + '^=above]' ).length;
76
87
  // ignore filtered rows & rows with data-math="ignore" (and starting row)
77
- if ( ( !$rows.eq( index ).hasClass( filtered ) &&
78
- $rows.eq( index ).not( '[' + mathAttr + '=ignore]' ).length &&
88
+ if ( ( ( !$tr.hasClass( filtered ) || hasFilter ) &&
89
+ $tr.not( '[' + mathAttr + '=ignore]' ).length &&
79
90
  index !== len ) ||
80
91
  mathAbove && index !== len ) {
81
92
  // stop calculating 'above', when encountering another 'above'
@@ -91,12 +102,16 @@
91
102
  len = $rows.length;
92
103
  // index + 1 to ignore starting node
93
104
  for ( index = $rows.index( $row ) + 1; index < len; index++ ) {
94
- $t = $rows.eq( index ).children().filter( '[data-column=' + cIndex + ']' );
105
+ $tr = $rows.eq( index );
106
+ if ( hasFilter ) {
107
+ $tr = $tr.filter( hasFilter );
108
+ }
109
+ $t = $tr.children().filter( '[data-column=' + cIndex + ']' );
95
110
  if ( $t.filter( '[' + mathAttr + '^=below]' ).length ) {
96
111
  break;
97
112
  }
98
- if ( !$rows.eq( index ).hasClass( filtered ) &&
99
- $rows.eq( index ).not( '[' + mathAttr + '=ignore]' ).length &&
113
+ if ( ( !$tr.hasClass( filtered ) || hasFilter ) &&
114
+ $tr.not( '[' + mathAttr + '=ignore]' ).length &&
100
115
  $t.length ) {
101
116
  arry.push( math.processText( c, $t ) );
102
117
  }
@@ -106,8 +121,12 @@
106
121
  $mathRows = $rows.not( '[' + mathAttr + '=ignore]' );
107
122
  len = $mathRows.length;
108
123
  for ( index = 0; index < len; index++ ) {
109
- $t = $mathRows.eq( index ).children().filter( '[data-column=' + cIndex + ']' );
110
- if ( !$mathRows.eq( index ).hasClass( filtered ) &&
124
+ $tr = $mathRows.eq( index );
125
+ if ( hasFilter ) {
126
+ $tr = $tr.filter( hasFilter );
127
+ }
128
+ $t = $tr.children().filter( '[data-column=' + cIndex + ']' );
129
+ if ( ( !$tr.hasClass( filtered ) || hasFilter ) &&
111
130
  $t.not( '[' + mathAttr + '^=above],[' + mathAttr + '^=below],[' + mathAttr + '^=col]' ).length &&
112
131
  !$t.is( $el ) ) {
113
132
  arry.push( math.processText( c, $t ) );
@@ -124,11 +143,15 @@
124
143
  wo = c.widgetOptions,
125
144
  mathAttr = wo.math_dataAttrib,
126
145
  filtered = wo.filter_filteredRow || 'filtered',
146
+ hasFilter = wo.filter_rowFilter,
127
147
  $rows = c.$table.children( 'tbody' ).children().not( '[' + mathAttr + '=ignore]' );
128
148
  rowLen = $rows.length;
129
149
  for ( rowIndex = 0; rowIndex < rowLen; rowIndex++ ) {
130
150
  $row = $rows.eq( rowIndex );
131
- if ( !$row.hasClass( filtered ) ) {
151
+ if ( hasFilter ) {
152
+ $row = $row.filter( hasFilter );
153
+ }
154
+ if ( !$row.hasClass( filtered ) || hasFilter ) {
132
155
  $cells = $row.children().not( '[' + mathAttr + '=ignore]' );
133
156
  cellLen = $cells.length;
134
157
  // $row.children().each(function(){
@@ -157,7 +180,7 @@
157
180
  recalculate : function(c, wo, init) {
158
181
  if ( c && ( !wo.math_isUpdating || init ) ) {
159
182
 
160
- var time, mathAttr, $mathCells;
183
+ var undef, time, mathAttr, $mathCells;
161
184
  if ( c.debug ) {
162
185
  time = new Date();
163
186
  }
@@ -192,7 +215,9 @@
192
215
  }
193
216
 
194
217
  // update internal cache
195
- ts.update( c );
218
+ ts.update( c, undef, function(){
219
+ math.updateComplete( c );
220
+ });
196
221
 
197
222
  if ( c.debug ) {
198
223
  console.log( 'Math widget update completed' + ts.benchmark( time ) );
@@ -200,6 +225,12 @@
200
225
  }
201
226
  },
202
227
 
228
+ updateComplete : function( c ) {
229
+ var wo = c.widgetOptions;
230
+ if ( wo.math_isUpdating && c.debug && console.groupEnd ) { console.groupEnd(); }
231
+ wo.math_isUpdating = false;
232
+ },
233
+
203
234
  mathType : function( c, $cells, priority ) {
204
235
  if ( $cells.length ) {
205
236
  var formula, result, $el, arry, getAll, $targetCells, index, len,
@@ -488,7 +519,9 @@
488
519
  math_suffix : '',
489
520
  // no matching math elements found (text added to cell)
490
521
  math_none : 'N/A',
491
- math_event : 'recalculate'
522
+ math_event : 'recalculate',
523
+ // use this filter to target specific rows (e.g. ':visible', or ':not(.empty-row)')
524
+ math_rowFilter: ''
492
525
  },
493
526
  init : function( table, thisWidget, c, wo ) {
494
527
  // filterEnd fires after updateComplete
@@ -507,8 +540,7 @@
507
540
  })
508
541
  .on( update + '.tsmath', function() {
509
542
  setTimeout( function(){
510
- if ( wo.math_isUpdating && c.debug && console.groupEnd ) { console.groupEnd(); }
511
- wo.math_isUpdating = false;
543
+ math.updateComplete( c );
512
544
  }, 40 );
513
545
  });
514
546
  wo.math_isUpdating = false;
@@ -1,4 +1,4 @@
1
- /*! Widget: Pager - updated 11/10/2015 (v2.24.4) */
1
+ /*! Widget: Pager - updated 11/22/2015 (v2.24.6) */
2
2
  /* Requires tablesorter v2.8+ and jQuery 1.7+
3
3
  * by Rob Garrison
4
4
  */
@@ -11,9 +11,10 @@
11
11
  ts.addWidget({
12
12
  id: 'pager',
13
13
  priority: 55, // load pager after filter widget
14
- options : {
14
+ options: {
15
15
  // output default: '{page}/{totalPages}'
16
- // possible variables: {size}, {page}, {totalPages}, {filteredPages}, {startRow}, {endRow}, {filteredRows} and {totalRows}
16
+ // possible variables: {size}, {page}, {totalPages}, {filteredPages}, {startRow},
17
+ // {endRow}, {filteredRows} and {totalRows}
17
18
  pager_output: '{startRow} to {endRow} of {totalRows} rows', // '{page}/{totalPages}'
18
19
 
19
20
  // apply disabled classname to the pager arrows when the rows at either extreme is visible
@@ -32,14 +33,15 @@
32
33
  // Number of options to include in the pager number selector
33
34
  pager_maxOptionSize: 20,
34
35
 
35
- // Save pager page & size if the storage script is loaded (requires $.tablesorter.storage in jquery.tablesorter.widgets.js)
36
+ // Save pager page & size if the storage script is loaded (requires $.tablesorter.storage
37
+ // in jquery.tablesorter.widgets.js)
36
38
  pager_savePages: true,
37
39
 
38
40
  // defines custom storage key
39
41
  pager_storageKey: 'tablesorter-pager',
40
42
 
41
- // if true, the table will remain the same height no matter how many records are displayed. The space is made up by an empty
42
- // table row set to a height to compensate; default is false
43
+ // if true, the table will remain the same height no matter how many records are displayed.
44
+ // The space is made up by an empty table row set to a height to compensate; default is false
43
45
  pager_fixedHeight: false,
44
46
 
45
47
  // count child rows towards the set page size? (set true if it is a visible table row within the pager)
@@ -48,7 +50,8 @@
48
50
  pager_countChildRows: false,
49
51
 
50
52
  // remove rows from the table to speed up the sort of large tables.
51
- // setting this to false, only hides the non-visible rows; needed if you plan to add/remove rows with the pager enabled.
53
+ // setting this to false, only hides the non-visible rows; needed if you plan to add/remove rows with
54
+ // the pager enabled.
52
55
  pager_removeRows: false, // removing rows in larger tables speeds up the sort
53
56
 
54
57
  // use this format: 'http://mydatabase.com?page={page}&size={size}&{sortList:col}&{filterList:fcol}'
@@ -60,7 +63,7 @@
60
63
  pager_ajaxUrl: null,
61
64
 
62
65
  // modify the url after all processing has been applied
63
- pager_customAjaxUrl: function(table, url) { return url; },
66
+ pager_customAjaxUrl: function( table, url ) { return url; },
64
67
 
65
68
  // ajax error callback from $.tablesorter.showError function
66
69
  // pager_ajaxError: function( config, xhr, settings, exception ){ return exception; };
@@ -88,13 +91,15 @@
88
91
  // ],
89
92
  // [ "header1", "header2", ... "headerN" ] // optional
90
93
  // ]
91
- pager_ajaxProcessing: function(ajax){ return [ 0, [], null ]; },
94
+ pager_ajaxProcessing: function( ajax ){ return [ 0, [], null ]; },
92
95
 
93
96
  // css class names of pager arrows
94
97
  pager_css: {
95
98
  container : 'tablesorter-pager',
96
- errorRow : 'tablesorter-errorRow', // error information row (don't include period at beginning)
97
- disabled : 'disabled' // class added to arrows @ extremes (i.e. prev/first arrows 'disabled' on first page)
99
+ // error information row (don't include period at beginning)
100
+ errorRow : 'tablesorter-errorRow',
101
+ // class added to arrows @ extremes (i.e. prev/first arrows 'disabled' on first page)
102
+ disabled : 'disabled'
98
103
  },
99
104
 
100
105
  // jQuery selectors
@@ -109,27 +114,27 @@
109
114
  pageSize : '.pagesize' // page size selector - select dropdown that sets the 'size' option
110
115
  }
111
116
  },
112
- init: function(table){
113
- tsp.init(table);
117
+ init: function( table ) {
118
+ tsp.init( table );
114
119
  },
115
120
  // only update to complete sorter initialization
116
- format: function(table, c){
117
- if (!(c.pager && c.pager.initialized)){
118
- return tsp.initComplete(table, c);
121
+ format: function( table, c ) {
122
+ if ( !( c.pager && c.pager.initialized ) ) {
123
+ return tsp.initComplete( c );
119
124
  }
120
- tsp.moveToPage(table, c.pager, false);
125
+ tsp.moveToPage( c, c.pager, false );
121
126
  },
122
- remove: function(table, c, wo, refreshing){
123
- tsp.destroyPager(table, c, refreshing);
127
+ remove: function( table, c, wo, refreshing ) {
128
+ tsp.destroyPager( c, refreshing );
124
129
  }
125
130
  });
126
131
 
127
132
  /* pager widget functions */
128
133
  tsp = ts.pager = {
129
134
 
130
- init: function(table) {
135
+ init: function( table ) {
131
136
  // check if tablesorter has initialized
132
- if (table.hasInitialized && table.config.pager && table.config.pager.initialized) { return; }
137
+ if ( table.hasInitialized && table.config.pager && table.config.pager.initialized ) { return; }
133
138
  var t,
134
139
  c = table.config,
135
140
  wo = c.widgetOptions,
@@ -150,55 +155,60 @@
150
155
  // save original pager size
151
156
  setSize: wo.pager_size,
152
157
  setPage: wo.pager_startPage
153
- }, c.pager);
158
+ }, c.pager );
154
159
 
155
160
  // pager initializes multiple times before table has completed initialization
156
- if (p.isInitializing) { return; }
161
+ if ( p.isInitializing ) { return; }
157
162
 
158
163
  p.isInitializing = true;
159
- if (c.debug) {
160
- console.log('Pager: Initializing');
164
+ if ( c.debug ) {
165
+ console.log( 'Pager: Initializing' );
161
166
  }
162
167
 
163
- p.size = $.data(table, 'pagerLastSize') || wo.pager_size;
168
+ p.size = $.data( table, 'pagerLastSize' ) || wo.pager_size;
164
169
  // added in case the pager is reinitialized after being destroyed.
165
- p.$container = $(s.container).addClass(wo.pager_css.container).show();
170
+ p.$container = $( s.container ).addClass( wo.pager_css.container ).show();
166
171
  // goto selector
167
- p.$goto = p.$container.find(s.gotoPage); // goto is a reserved word #657
172
+ p.$goto = p.$container.find( s.gotoPage ); // goto is a reserved word #657
168
173
  // page size selector
169
- p.$size = p.$container.find(s.pageSize);
170
- p.totalRows = c.$tbodies.eq(0).children('tr').not( wo.pager_countChildRows ? '' : '.' + c.cssChildRow ).length;
174
+ p.$size = p.$container.find( s.pageSize );
175
+ p.totalRows = c.$tbodies.eq( 0 )
176
+ .children( 'tr' )
177
+ .not( wo.pager_countChildRows ? '' : '.' + c.cssChildRow )
178
+ .length;
171
179
  p.oldAjaxSuccess = p.oldAjaxSuccess || wo.pager_ajaxObject.success;
172
180
  c.appender = tsp.appender;
173
181
  p.initializing = true;
174
- if (wo.pager_savePages && ts.storage) {
175
- t = ts.storage(table, wo.pager_storageKey) || {}; // fixes #387
176
- p.page = ( isNaN(t.page) ? p.page : t.page ) || p.setPage || 0;
177
- p.size = ( isNaN(t.size) ? p.size : t.size ) || p.setSize || 10;
178
- $.data(table, 'pagerLastSize', p.size);
182
+ if ( wo.pager_savePages && ts.storage ) {
183
+ t = ts.storage( table, wo.pager_storageKey ) || {}; // fixes #387
184
+ p.page = ( isNaN( t.page ) ? p.page : t.page ) || p.setPage || 0;
185
+ p.size = ( isNaN( t.size ) ? p.size : t.size ) || p.setSize || 10;
186
+ $.data( table, 'pagerLastSize', p.size );
179
187
  }
180
188
 
181
189
  // skipped rows
182
- p.regexRows = new RegExp('(' + (wo.filter_filteredRow || 'filtered') + '|' + c.selectorRemove.slice(1) + '|' + c.cssChildRow + ')');
190
+ p.regexRows = new RegExp( '(' + ( wo.filter_filteredRow || 'filtered' ) + '|' +
191
+ c.selectorRemove.slice( 1 ) + '|' + c.cssChildRow + ')' );
183
192
 
184
193
  // clear initialized flag
185
194
  p.initialized = false;
186
195
  // before initialization event
187
- c.$table.trigger('pagerBeforeInitialized', c);
196
+ c.$table.trigger( 'pagerBeforeInitialized', c );
188
197
 
189
- tsp.enablePager(table, c, false);
198
+ tsp.enablePager( c, false );
190
199
 
191
200
  // p must have ajaxObject
192
- p.ajaxObject = wo.pager_ajaxObject; // $.extend({}, wo.pager_ajaxObject );
201
+ p.ajaxObject = wo.pager_ajaxObject;
193
202
  p.ajaxObject.url = wo.pager_ajaxUrl;
194
203
 
195
204
  if ( typeof wo.pager_ajaxUrl === 'string' ) {
196
205
  // ajax pager; interact with database
197
206
  p.ajax = true;
198
- // When filtering with ajax, allow only custom filtering function, disable default filtering since it will be done server side.
207
+ // When filtering with ajax, allow only custom filtering function, disable default filtering
208
+ // since it will be done server side.
199
209
  wo.filter_serversideFiltering = true;
200
210
  c.serverSideSorting = true;
201
- tsp.moveToPage(table, p);
211
+ tsp.moveToPage( c, p );
202
212
  } else {
203
213
  p.ajax = false;
204
214
  // Regular pager; all rows stored in memory
@@ -207,30 +217,30 @@
207
217
 
208
218
  },
209
219
 
210
- initComplete: function(table, c){
220
+ initComplete: function( c ) {
211
221
  var p = c.pager;
212
- tsp.bindEvents(table, c);
213
- tsp.setPageSize(c, 0); // page size 0 is ignored
214
- if (!p.ajax) {
215
- tsp.hideRowsSetup(table, c);
222
+ tsp.bindEvents( c );
223
+ tsp.setPageSize( c, 0 ); // page size 0 is ignored
224
+ if ( !p.ajax ) {
225
+ tsp.hideRowsSetup( c );
216
226
  }
217
227
 
218
228
  // pager initialized
219
229
  p.initialized = true;
220
230
  p.initializing = false;
221
231
  p.isInitializing = false;
222
- if (c.debug) {
223
- console.log('Pager: Triggering pagerInitialized');
232
+ if ( c.debug ) {
233
+ console.log( 'Pager: Triggering pagerInitialized' );
224
234
  }
225
235
  c.$table.trigger( 'pagerInitialized', c );
226
236
  // filter widget not initialized; it will update the output display & fire off the pagerComplete event
227
- if ( !( c.widgetOptions.filter_initialized && ts.hasWidget(table, 'filter') ) ) {
237
+ if ( !( c.widgetOptions.filter_initialized && ts.hasWidget( c.table, 'filter' ) ) ) {
228
238
  // if ajax, then don't fire off pagerComplete
229
- tsp.updatePageDisplay(table, c, !p.ajax);
239
+ tsp.updatePageDisplay( c, !p.ajax );
230
240
  }
231
241
  },
232
242
 
233
- bindEvents: function(table, c){
243
+ bindEvents: function( c ) {
234
244
  var ctrls, fxn,
235
245
  p = c.pager,
236
246
  wo = c.widgetOptions,
@@ -239,106 +249,108 @@
239
249
 
240
250
  c.$table
241
251
  .off( namespace )
242
- .on('filterInit filterStart '.split(' ').join(namespace + ' '), function(e, filters) {
243
- p.currentFilters = $.isArray(filters) ? filters : c.$table.data('lastSearch');
252
+ .on( 'filterInit filterStart '.split( ' ' ).join( namespace + ' ' ), function( e, filters ) {
253
+ p.currentFilters = $.isArray( filters ) ? filters : c.$table.data( 'lastSearch' );
244
254
  // don't change page if filters are the same (pager updating, etc)
245
- if (e.type === 'filterStart' && wo.pager_pageReset !== false && (c.lastCombinedFilter || '') !== (p.currentFilters || []).join('')) {
255
+ if ( e.type === 'filterStart' && wo.pager_pageReset !== false &&
256
+ ( c.lastCombinedFilter || '' ) !== ( p.currentFilters || [] ).join( '' ) ) {
246
257
  p.page = wo.pager_pageReset; // fixes #456 & #565
247
258
  }
248
259
  })
249
260
  // update pager after filter widget completes
250
- .on('filterEnd sortEnd '.split(' ').join(namespace + ' '), function() {
251
- p.currentFilters = c.$table.data('lastSearch');
252
- if (p.initialized || p.initializing) {
253
- if (c.delayInit && c.rowsCopy && c.rowsCopy.length === 0) {
261
+ .on( 'filterEnd sortEnd '.split( ' ' ).join( namespace + ' ' ), function() {
262
+ p.currentFilters = c.$table.data( 'lastSearch' );
263
+ if ( p.initialized || p.initializing ) {
264
+ if ( c.delayInit && c.rowsCopy && c.rowsCopy.length === 0 ) {
254
265
  // make sure we have a copy of all table rows once the cache has been built
255
- tsp.updateCache(table);
266
+ tsp.updateCache( c );
256
267
  }
257
- tsp.updatePageDisplay(table, c, false);
258
- // tsp.moveToPage(table, p, false); <-- called when applyWidgets is triggered
259
- ts.applyWidget( table );
268
+ tsp.updatePageDisplay( c, false );
269
+ // tsp.moveToPage( c, p, false ); <-- called when applyWidgets is triggered
270
+ ts.applyWidget( c.table );
260
271
  }
261
272
  })
262
- .on('disablePager' + namespace, function(e){
273
+ .on( 'disablePager' + namespace, function( e ) {
263
274
  e.stopPropagation();
264
- tsp.showAllRows(table, c);
275
+ tsp.showAllRows( c );
265
276
  })
266
- .on('enablePager' + namespace, function(e){
277
+ .on( 'enablePager' + namespace, function( e ) {
267
278
  e.stopPropagation();
268
- tsp.enablePager(table, c, true);
279
+ tsp.enablePager( c, true );
269
280
  })
270
- .on('destroyPager' + namespace, function(e, refreshing){
281
+ .on( 'destroyPager' + namespace, function( e, refreshing ) {
271
282
  e.stopPropagation();
272
283
  // call removeWidget to make sure internal flags are modified.
273
- ts.removeWidget( table, 'pager', false );
284
+ ts.removeWidget( c.table, 'pager', false );
274
285
  })
275
- .on('updateComplete' + namespace, function(e, table, triggered){
286
+ .on( 'updateComplete' + namespace, function( e, table, triggered ) {
276
287
  e.stopPropagation();
277
288
  // table can be unintentionally undefined in tablesorter v2.17.7 and earlier
278
289
  // don't recalculate total rows/pages if using ajax
279
- if (!table || triggered || p.ajax) { return; }
280
- var $rows = c.$tbodies.eq(0).children('tr').not(c.selectorRemove);
281
- p.totalRows = $rows.length - ( wo.pager_countChildRows ? 0 : $rows.filter('.' + c.cssChildRow).length );
290
+ if ( !table || triggered || p.ajax ) { return; }
291
+ var $rows = c.$tbodies.eq( 0 ).children( 'tr' ).not( c.selectorRemove );
292
+ p.totalRows = $rows.length -
293
+ ( wo.pager_countChildRows ? 0 : $rows.filter( '.' + c.cssChildRow ).length );
282
294
  p.totalPages = Math.ceil( p.totalRows / p.size );
283
- if ($rows.length && c.rowsCopy && c.rowsCopy.length === 0) {
295
+ if ( $rows.length && c.rowsCopy && c.rowsCopy.length === 0 ) {
284
296
  // make a copy of all table rows once the cache has been built
285
- tsp.updateCache(table);
297
+ tsp.updateCache( c );
286
298
  }
287
299
  if ( p.page >= p.totalPages ) {
288
- tsp.moveToLastPage(table, p);
300
+ tsp.moveToLastPage( c, p );
289
301
  }
290
- tsp.hideRows(table, c);
291
- tsp.changeHeight(table, c);
302
+ tsp.hideRows( c );
303
+ tsp.changeHeight( c );
292
304
  // update without triggering pagerComplete
293
- tsp.updatePageDisplay(table, c, false);
305
+ tsp.updatePageDisplay( c, false );
294
306
  // make sure widgets are applied - fixes #450
295
307
  ts.applyWidget( table );
296
- tsp.updatePageDisplay(table, c);
308
+ tsp.updatePageDisplay( c );
297
309
  })
298
- .on('pageSize refreshComplete '.split(' ').join(namespace + ' '), function(e, size){
310
+ .on( 'pageSize refreshComplete '.split( ' ' ).join( namespace + ' ' ), function( e, size ) {
299
311
  e.stopPropagation();
300
- tsp.setPageSize(c, tsp.parsePageSize( c, size, 'get' ));
301
- tsp.hideRows(table, c);
302
- tsp.updatePageDisplay(table, c, false);
312
+ tsp.setPageSize( c, tsp.parsePageSize( c, size, 'get' ) );
313
+ tsp.hideRows( c );
314
+ tsp.updatePageDisplay( c, false );
303
315
  })
304
- .on('pageSet pagerUpdate '.split(' ').join(namespace + ' '), function(e, num){
316
+ .on( 'pageSet pagerUpdate '.split( ' ' ).join( namespace + ' ' ), function( e, num ) {
305
317
  e.stopPropagation();
306
318
  // force pager refresh
307
- if (e.type === 'pagerUpdate') {
319
+ if ( e.type === 'pagerUpdate' ) {
308
320
  num = typeof num === 'undefined' ? p.page + 1 : num;
309
321
  p.last.page = true;
310
322
  }
311
- p.page = (parseInt(num, 10) || 1) - 1;
312
- tsp.moveToPage(table, p, true);
313
- tsp.updatePageDisplay(table, c, false);
323
+ p.page = ( parseInt( num, 10 ) || 1 ) - 1;
324
+ tsp.moveToPage( c, p, true );
325
+ tsp.updatePageDisplay( c, false );
314
326
  })
315
- .on('pageAndSize' + namespace, function(e, page, size){
327
+ .on( 'pageAndSize' + namespace, function( e, page, size ) {
316
328
  e.stopPropagation();
317
- p.page = (parseInt(page, 10) || 1) - 1;
318
- tsp.setPageSize(c, tsp.parsePageSize( c, size, 'get' ));
319
- tsp.moveToPage(table, p, true);
320
- tsp.hideRows(table, c);
321
- tsp.updatePageDisplay(table, c, false);
329
+ p.page = ( parseInt(page, 10) || 1 ) - 1;
330
+ tsp.setPageSize( c, tsp.parsePageSize( c, size, 'get' ) );
331
+ tsp.moveToPage( c, p, true );
332
+ tsp.hideRows( c );
333
+ tsp.updatePageDisplay( c, false );
322
334
  });
323
335
 
324
336
  // clicked controls
325
337
  ctrls = [ s.first, s.prev, s.next, s.last ];
326
338
  fxn = [ 'moveToFirstPage', 'moveToPrevPage', 'moveToNextPage', 'moveToLastPage' ];
327
- if (c.debug && !p.$container.length) {
328
- console.warn('Pager: >> Container not found');
339
+ if ( c.debug && !p.$container.length ) {
340
+ console.warn( 'Pager: >> Container not found' );
329
341
  }
330
- p.$container.find(ctrls.join(','))
331
- .attr('tabindex', 0)
332
- .off('click' + namespace)
333
- .on('click' + namespace, function(e){
342
+ p.$container.find( ctrls.join( ',' ) )
343
+ .attr( 'tabindex', 0 )
344
+ .off( 'click' + namespace )
345
+ .on( 'click' + namespace, function( e ) {
334
346
  e.stopPropagation();
335
347
  var i,
336
- $c = $(this),
348
+ $c = $( this ),
337
349
  l = ctrls.length;
338
- if ( !$c.hasClass(wo.pager_css.disabled) ) {
339
- for (i = 0; i < l; i++) {
340
- if ($c.is(ctrls[i])) {
341
- tsp[fxn[i]](table, p);
350
+ if ( !$c.hasClass( wo.pager_css.disabled ) ) {
351
+ for ( i = 0; i < l; i++ ) {
352
+ if ( $c.is( ctrls[ i ] ) ) {
353
+ tsp[ fxn[ i ] ]( c, p );
342
354
  break;
343
355
  }
344
356
  }
@@ -347,145 +359,165 @@
347
359
 
348
360
  if ( p.$goto.length ) {
349
361
  p.$goto
350
- .off('change' + namespace)
351
- .on('change' + namespace, function(){
352
- p.page = $(this).val() - 1;
353
- tsp.moveToPage(table, p, true);
354
- tsp.updatePageDisplay(table, c, false);
362
+ .off( 'change' + namespace )
363
+ .on( 'change' + namespace, function() {
364
+ p.page = $( this ).val() - 1;
365
+ tsp.moveToPage( c, p, true );
366
+ tsp.updatePageDisplay( c, false );
355
367
  });
356
- } else if (c.debug) {
357
- console.warn('Pager: >> Goto selector not found');
368
+ } else if ( c.debug ) {
369
+ console.warn( 'Pager: >> Goto selector not found' );
358
370
  }
359
371
 
360
372
  if ( p.$size.length ) {
361
373
  // setting an option as selected appears to cause issues with initial page size
362
- p.$size.find('option').removeAttr('selected');
374
+ p.$size.find( 'option' ).removeAttr( 'selected' );
363
375
  p.$size
364
- .off('change' + namespace)
365
- .on('change' + namespace, function() {
366
- if ( !$(this).hasClass(wo.pager_css.disabled) ) {
367
- var size = $(this).val();
376
+ .off( 'change' + namespace )
377
+ .on( 'change' + namespace, function() {
378
+ if ( !$( this ).hasClass( wo.pager_css.disabled ) ) {
379
+ var size = $( this ).val();
368
380
  p.$size.val( size ); // in case there are more than one pagers
369
- tsp.setPageSize(c, size);
370
- tsp.changeHeight(table, c);
381
+ tsp.setPageSize( c, size );
382
+ tsp.changeHeight( c );
371
383
  }
372
384
  return false;
373
385
  });
374
- } else if (c.debug) {
386
+ } else if ( c.debug ) {
375
387
  console.warn('Pager: >> Size selector not found');
376
388
  }
377
389
 
378
390
  },
379
391
 
380
392
  // hide arrows at extremes
381
- pagerArrows: function(c, disable) {
393
+ pagerArrows: function( c, disable ) {
382
394
  var p = c.pager,
383
395
  dis = !!disable,
384
396
  first = dis || p.page === 0,
385
- tp = Math.min( p.totalPages, p.filteredPages ),
397
+ tp = tsp.getTotalPages( c, p ),
386
398
  last = dis || p.page === tp - 1 || tp === 0,
387
399
  wo = c.widgetOptions,
388
400
  s = wo.pager_selectors;
389
401
  if ( wo.pager_updateArrows ) {
390
- p.$container.find(s.first + ',' + s.prev).toggleClass(wo.pager_css.disabled, first).attr('aria-disabled', first);
391
- p.$container.find(s.next + ',' + s.last).toggleClass(wo.pager_css.disabled, last).attr('aria-disabled', last);
402
+ p.$container
403
+ .find( s.first + ',' + s.prev )
404
+ .toggleClass( wo.pager_css.disabled, first )
405
+ .attr( 'aria-disabled', first );
406
+ p.$container
407
+ .find( s.next + ',' + s.last )
408
+ .toggleClass( wo.pager_css.disabled, last )
409
+ .attr( 'aria-disabled', last );
392
410
  }
393
411
  },
394
412
 
395
- calcFilters: function(table, c) {
413
+ calcFilters: function( c ) {
396
414
  var normalized, indx, len,
397
415
  wo = c.widgetOptions,
398
416
  p = c.pager,
399
- hasFilters = c.$table.hasClass('hasFilters');
400
- if (hasFilters && !wo.pager_ajaxUrl) {
401
- if ($.isEmptyObject(c.cache)) {
417
+ hasFilters = c.$table.hasClass( 'hasFilters' );
418
+ if ( hasFilters && !wo.pager_ajaxUrl ) {
419
+ if ( $.isEmptyObject( c.cache ) ) {
402
420
  // delayInit: true so nothing is in the cache
403
- p.filteredRows = p.totalRows = c.$tbodies.eq(0).children('tr').not( wo.pager_countChildRows ? '' : '.' + c.cssChildRow ).length;
421
+ p.filteredRows = p.totalRows = c.$tbodies.eq( 0 )
422
+ .children( 'tr' )
423
+ .not( wo.pager_countChildRows ? '' : '.' + c.cssChildRow )
424
+ .length;
404
425
  } else {
405
426
  p.filteredRows = 0;
406
- normalized = c.cache[0].normalized;
427
+ normalized = c.cache[ 0 ].normalized;
407
428
  len = normalized.length;
408
- for (indx = 0; indx < len; indx++) {
409
- p.filteredRows += p.regexRows.test(normalized[indx][c.columns].$row[0].className) ? 0 : 1;
429
+ for ( indx = 0; indx < len; indx++ ) {
430
+ p.filteredRows += p.regexRows.test( normalized[ indx ][ c.columns ].$row[ 0 ].className ) ? 0 : 1;
410
431
  }
411
432
  }
412
- } else if (!hasFilters) {
433
+ } else if ( !hasFilters ) {
413
434
  p.filteredRows = p.totalRows;
414
435
  }
415
436
  },
416
437
 
417
- updatePageDisplay: function(table, c, completed) {
438
+ updatePageDisplay: function( c, completed ) {
418
439
  if ( c.pager.initializing ) { return; }
419
440
  var s, t, $out, options, indx, len,
441
+ table = c.table,
420
442
  wo = c.widgetOptions,
421
443
  p = c.pager,
422
444
  namespace = c.namespace + 'pager',
423
445
  sz = tsp.parsePageSize( c, p.size, 'get' ); // don't allow dividing by zero
424
- if (wo.pager_countChildRows) { t.push(c.cssChildRow); }
425
- p.$size.add(p.$goto).removeClass(wo.pager_css.disabled).removeAttr('disabled').attr('aria-disabled', 'false');
446
+ if ( wo.pager_countChildRows ) { t.push( c.cssChildRow ); }
447
+ p.$size
448
+ .add( p.$goto )
449
+ .removeClass( wo.pager_css.disabled )
450
+ .removeAttr( 'disabled' )
451
+ .attr( 'aria-disabled', 'false' );
426
452
  p.totalPages = Math.ceil( p.totalRows / sz ); // needed for 'pageSize' method
427
453
  c.totalRows = p.totalRows;
428
- tsp.parsePageNumber( p );
429
- tsp.calcFilters(table, c);
454
+ tsp.parsePageNumber( c, p );
455
+ tsp.calcFilters( c );
430
456
  c.filteredRows = p.filteredRows;
431
457
  p.filteredPages = Math.ceil( p.filteredRows / sz ) || 0;
432
- if ( Math.min( p.totalPages, p.filteredPages ) >= 0 ) {
433
- t = (p.size * p.page > p.filteredRows) && completed;
434
- p.page = (t) ? wo.pager_pageReset || 0 : p.page;
435
- p.startRow = (t) ? p.size * p.page + 1 : (p.filteredRows === 0 ? 0 : p.size * p.page + 1);
458
+ if ( tsp.getTotalPages( c, p ) >= 0 ) {
459
+ t = ( p.size * p.page > p.filteredRows ) && completed;
460
+ p.page = t ? wo.pager_pageReset || 0 : p.page;
461
+ p.startRow = t ? p.size * p.page + 1 : ( p.filteredRows === 0 ? 0 : p.size * p.page + 1 );
436
462
  p.endRow = Math.min( p.filteredRows, p.totalRows, p.size * ( p.page + 1 ) );
437
- $out = p.$container.find(wo.pager_selectors.pageDisplay);
463
+ $out = p.$container.find( wo.pager_selectors.pageDisplay );
438
464
  // form the output string (can now get a new output string from the server)
439
465
  s = ( p.ajaxData && p.ajaxData.output ? p.ajaxData.output || wo.pager_output : wo.pager_output )
440
466
  // {page} = one-based index; {page+#} = zero based index +/- value
441
- .replace(/\{page([\-+]\d+)?\}/gi, function(m, n){
442
- return p.totalPages ? p.page + (n ? parseInt(n, 10) : 1) : 0;
467
+ .replace( /\{page([\-+]\d+)?\}/gi, function( m, n ) {
468
+ return p.totalPages ? p.page + ( n ? parseInt( n, 10 ) : 1 ) : 0;
443
469
  })
444
470
  // {totalPages}, {extra}, {extra:0} (array) or {extra : key} (object)
445
- .replace(/\{\w+(\s*:\s*\w+)?\}/gi, function(m){
471
+ .replace( /\{\w+(\s*:\s*\w+)?\}/gi, function( m ) {
446
472
  var len, indx,
447
- str = m.replace(/[{}\s]/g, ''),
448
- extra = str.split(':'),
473
+ str = m.replace( /[{}\s]/g, '' ),
474
+ extra = str.split( ':' ),
449
475
  data = p.ajaxData,
450
476
  // return zero for default page/row numbers
451
- deflt = /(rows?|pages?)$/i.test(str) ? 0 : '';
452
- if (/(startRow|page)/.test(extra[0]) && extra[1] === 'input') {
453
- len = ('' + (extra[0] === 'page' ? p.totalPages : p.totalRows)).length;
454
- indx = extra[0] === 'page' ? p.page + 1 : p.startRow;
455
- return '<input type="text" class="ts-' + extra[0] + '" style="max-width:' + len + 'em" value="' + indx + '"/>';
477
+ deflt = /(rows?|pages?)$/i.test( str ) ? 0 : '';
478
+ if ( /(startRow|page)/.test( extra[ 0 ] ) && extra[ 1 ] === 'input' ) {
479
+ len = ( '' + ( extra[ 0 ] === 'page' ? p.totalPages : p.totalRows ) ).length;
480
+ indx = extra[ 0 ] === 'page' ? p.page + 1 : p.startRow;
481
+ return '<input type="text" class="ts-' + extra[ 0 ] +
482
+ '" style="max-width:' + len + 'em" value="' + indx + '"/>';
456
483
  }
457
- return extra.length > 1 && data && data[extra[0]] ? data[extra[0]][extra[1]] : p[str] || (data ? data[str] : deflt) || deflt;
484
+ return extra.length > 1 && data && data[ extra[ 0 ] ] ?
485
+ data[ extra[ 0 ] ][ extra[ 1 ] ] :
486
+ p[ str ] || ( data ? data[ str ] : deflt ) || deflt;
458
487
  });
459
488
  if ( p.$goto.length ) {
460
489
  t = '';
461
- options = tsp.buildPageSelect(p, c);
490
+ options = tsp.buildPageSelect( c, p );
462
491
  len = options.length;
463
- for (indx = 0; indx < len; indx++) {
464
- t += '<option value="' + options[indx] + '">' + options[indx] + '</option>';
492
+ for ( indx = 0; indx < len; indx++ ) {
493
+ t += '<option value="' + options[ indx ] + '">' + options[ indx ] + '</option>';
465
494
  }
466
495
  // innerHTML doesn't work in IE9 - http://support2.microsoft.com/kb/276228
467
- p.$goto.html(t).val( p.page + 1 );
496
+ p.$goto.html( t ).val( p.page + 1 );
468
497
  }
469
- if ($out.length) {
470
- $out[ ($out[0].nodeName === 'INPUT') ? 'val' : 'html' ](s);
498
+ if ( $out.length ) {
499
+ $out[ ($out[ 0 ].nodeName === 'INPUT' ) ? 'val' : 'html' ]( s );
471
500
  // rebind startRow/page inputs
472
- $out.find('.ts-startRow, .ts-page').off('change' + namespace).on('change' + namespace, function(){
473
- var v = $(this).val(),
474
- pg = $(this).hasClass('ts-startRow') ? Math.floor( v / p.size ) + 1 : v;
475
- c.$table.trigger('pageSet' + namespace, [ pg ]);
476
- });
501
+ $out
502
+ .find( '.ts-startRow, .ts-page' )
503
+ .off( 'change' + namespace )
504
+ .on( 'change' + namespace, function() {
505
+ var v = $( this ).val(),
506
+ pg = $( this ).hasClass( 'ts-startRow' ) ? Math.floor( v / p.size ) + 1 : v;
507
+ c.$table.trigger( 'pageSet' + namespace, [ pg ] );
508
+ });
477
509
  }
478
510
  }
479
- tsp.pagerArrows(c);
480
- tsp.fixHeight(table, c);
481
- if (p.initialized && completed !== false) {
482
- if (c.debug) {
483
- console.log('Pager: Triggering pagerComplete');
511
+ tsp.pagerArrows( c );
512
+ tsp.fixHeight( c );
513
+ if ( p.initialized && completed !== false ) {
514
+ if ( c.debug ) {
515
+ console.log( 'Pager: Triggering pagerComplete' );
484
516
  }
485
- c.$table.trigger('pagerComplete', c);
517
+ c.$table.trigger( 'pagerComplete', c );
486
518
  // save pager info to storage
487
- if (wo.pager_savePages && ts.storage) {
488
- ts.storage(table, wo.pager_storageKey, {
519
+ if ( wo.pager_savePages && ts.storage ) {
520
+ ts.storage( table, wo.pager_storageKey, {
489
521
  page : p.page,
490
522
  size : p.size
491
523
  });
@@ -493,100 +525,107 @@
493
525
  }
494
526
  },
495
527
 
496
- buildPageSelect: function(p, c) {
528
+ buildPageSelect: function( c, p ) {
497
529
  // Filter the options page number link array if it's larger than 'pager_maxOptionSize'
498
530
  // as large page set links will slow the browser on large dom inserts
499
- var i, central_focus_size, focus_option_pages, insert_index, option_length, focus_length,
531
+ var i, centralFocusSize, focusOptionPages, insertIndex, optionLength, focusLength,
500
532
  wo = c.widgetOptions,
501
- pg = Math.min( p.totalPages, p.filteredPages ) || 1,
533
+ pg = tsp.getTotalPages( c, p ) || 1,
502
534
  // make skip set size multiples of 5
503
- skip_set_size = Math.ceil( ( pg / wo.pager_maxOptionSize ) / 5 ) * 5,
504
- large_collection = pg > wo.pager_maxOptionSize,
505
- current_page = p.page + 1,
506
- start_page = skip_set_size,
507
- end_page = pg - skip_set_size,
508
- option_pages = [ 1 ],
535
+ skipSetSize = Math.ceil( ( pg / wo.pager_maxOptionSize ) / 5 ) * 5,
536
+ largeCollection = pg > wo.pager_maxOptionSize,
537
+ currentPage = p.page + 1,
538
+ startPage = skipSetSize,
539
+ endPage = pg - skipSetSize,
540
+ optionPages = [ 1 ],
509
541
  // construct default options pages array
510
- option_pages_start_page = (large_collection) ? skip_set_size : 1;
542
+ optionPagesStartPage = largeCollection ? skipSetSize : 1;
511
543
 
512
- for ( i = option_pages_start_page; i <= pg; ) {
513
- option_pages.push(i);
514
- i = i + ( large_collection ? skip_set_size : 1 );
544
+ for ( i = optionPagesStartPage; i <= pg; ) {
545
+ optionPages.push( i );
546
+ i = i + ( largeCollection ? skipSetSize : 1 );
515
547
  }
516
- option_pages.push(pg);
548
+ optionPages.push( pg );
517
549
 
518
- if (large_collection) {
519
- focus_option_pages = [];
550
+ if ( largeCollection ) {
551
+ focusOptionPages = [];
520
552
  // don't allow central focus size to be > 5 on either side of current page
521
- central_focus_size = Math.max( Math.floor( wo.pager_maxOptionSize / skip_set_size ) - 1, 5 );
553
+ centralFocusSize = Math.max( Math.floor( wo.pager_maxOptionSize / skipSetSize ) - 1, 5 );
522
554
 
523
- start_page = current_page - central_focus_size;
524
- if (start_page < 1) { start_page = 1; }
525
- end_page = current_page + central_focus_size;
526
- if (end_page > pg) { end_page = pg; }
555
+ startPage = currentPage - centralFocusSize;
556
+ if ( startPage < 1 ) { startPage = 1; }
557
+ endPage = currentPage + centralFocusSize;
558
+ if ( endPage > pg ) { endPage = pg; }
527
559
  // construct an array to get a focus set around the current page
528
- for (i = start_page; i <= end_page ; i++) {
529
- focus_option_pages.push(i);
560
+ for ( i = startPage; i <= endPage ; i++ ) {
561
+ focusOptionPages.push( i );
530
562
  }
531
563
 
532
564
  // keep unique values
533
- option_pages = $.grep(option_pages, function(value, indx) {
534
- return $.inArray(value, option_pages) === indx;
565
+ optionPages = $.grep( optionPages, function( value, indx ) {
566
+ return $.inArray( value, optionPages ) === indx;
535
567
  });
536
568
 
537
- option_length = option_pages.length;
538
- focus_length = focus_option_pages.length;
569
+ optionLength = optionPages.length;
570
+ focusLength = focusOptionPages.length;
539
571
 
540
- // make sure at all option_pages aren't replaced
541
- if (option_length - focus_length > skip_set_size / 2 && option_length + focus_length > wo.pager_maxOptionSize ) {
542
- insert_index = Math.floor(option_length / 2) - Math.floor(focus_length / 2);
543
- Array.prototype.splice.apply(option_pages, [ insert_index, focus_length ]);
572
+ // make sure at all optionPages aren't replaced
573
+ if ( optionLength - focusLength > skipSetSize / 2 && optionLength + focusLength > wo.pager_maxOptionSize ) {
574
+ insertIndex = Math.floor( optionLength / 2 ) - Math.floor( focusLength / 2 );
575
+ Array.prototype.splice.apply( optionPages, [ insertIndex, focusLength ] );
544
576
  }
545
- option_pages = option_pages.concat(focus_option_pages);
577
+ optionPages = optionPages.concat( focusOptionPages );
546
578
 
547
579
  }
548
580
 
549
581
  // keep unique values again
550
- option_pages = $.grep(option_pages, function(value, indx) {
551
- return $.inArray(value, option_pages) === indx;
582
+ optionPages = $.grep( optionPages, function( value, indx ) {
583
+ return $.inArray( value, optionPages ) === indx;
552
584
  })
553
- .sort(function(a, b) { return a - b; });
585
+ .sort( function( a, b ) {
586
+ return a - b;
587
+ });
554
588
 
555
- return option_pages;
589
+ return optionPages;
556
590
  },
557
591
 
558
- fixHeight: function(table, c) {
592
+ fixHeight: function( c ) {
559
593
  var d, h,
594
+ table = c.table,
560
595
  p = c.pager,
561
596
  wo = c.widgetOptions,
562
- $b = c.$tbodies.eq(0);
563
- $b.find('tr.pagerSavedHeightSpacer').remove();
564
- if (wo.pager_fixedHeight && !p.isDisabled) {
565
- h = $.data(table, 'pagerSavedHeight');
566
- if (h) {
597
+ $b = c.$tbodies.eq( 0 );
598
+ $b.find( 'tr.pagerSavedHeightSpacer' ).remove();
599
+ if ( wo.pager_fixedHeight && !p.isDisabled ) {
600
+ h = $.data( table, 'pagerSavedHeight' );
601
+ if ( h ) {
567
602
  d = h - $b.height();
568
- if ( d > 5 && $.data(table, 'pagerLastSize') === p.size && $b.children('tr:visible').length < p.size ) {
569
- $b.append('<tr class="pagerSavedHeightSpacer ' + c.selectorRemove.slice(1) + '" style="height:' + d + 'px;"></tr>');
603
+ if ( d > 5 && $.data( table, 'pagerLastSize' ) === p.size && $b.children( 'tr:visible' ).length < p.size ) {
604
+ $b.append( '<tr class="pagerSavedHeightSpacer ' + c.selectorRemove.slice( 1 ) +
605
+ '" style="height:' + d + 'px;"></tr>' );
570
606
  }
571
607
  }
572
608
  }
573
609
  },
574
610
 
575
- changeHeight: function(table, c) {
576
- var h, $b = c.$tbodies.eq(0);
577
- $b.find('tr.pagerSavedHeightSpacer').remove();
578
- if (!$b.children('tr:visible').length) {
579
- $b.append('<tr class="pagerSavedHeightSpacer ' + c.selectorRemove.slice(1) + '"><td>&nbsp</td></tr>');
611
+ changeHeight: function( c ) {
612
+ var h,
613
+ table = c.table,
614
+ $b = c.$tbodies.eq( 0 );
615
+ $b.find( 'tr.pagerSavedHeightSpacer' ).remove();
616
+ if ( !$b.children( 'tr:visible' ).length ) {
617
+ $b.append( '<tr class="pagerSavedHeightSpacer ' + c.selectorRemove.slice( 1 ) + '"><td>&nbsp</td></tr>' );
580
618
  }
581
- h = $b.children('tr').eq(0).height() * c.pager.size;
582
- $.data(table, 'pagerSavedHeight', h);
583
- tsp.fixHeight(table, c);
584
- $.data(table, 'pagerLastSize', c.pager.size);
619
+ h = $b.children( 'tr' ).eq( 0 ).height() * c.pager.size;
620
+ $.data( table, 'pagerSavedHeight', h );
621
+ tsp.fixHeight( c );
622
+ $.data( table, 'pagerLastSize', c.pager.size );
585
623
  },
586
624
 
587
- hideRows: function(table, c){
625
+ hideRows: function( c ) {
588
626
  if ( !c.widgetOptions.pager_ajaxUrl ) {
589
627
  var tbodyIndex, rowIndex, $rows, len, lastIndex,
628
+ table = c.table,
590
629
  p = c.pager,
591
630
  wo = c.widgetOptions,
592
631
  tbodyLen = c.$tbodies.length,
@@ -633,236 +672,239 @@
633
672
  }
634
673
  },
635
674
 
636
- hideRowsSetup: function(table, c){
675
+ hideRowsSetup: function( c ) {
637
676
  var p = c.pager,
638
677
  namespace = c.namespace + 'pager',
639
678
  size = p.$size.val();
640
679
  p.size = tsp.parsePageSize( c, size, 'get' );
641
680
  p.$size.val( tsp.parsePageSize( c, p.size, 'set' ) );
642
- $.data(table, 'pagerLastSize', p.size);
643
- tsp.pagerArrows(c);
681
+ $.data( c.table, 'pagerLastSize', p.size );
682
+ tsp.pagerArrows( c );
644
683
  if ( !c.widgetOptions.pager_removeRows ) {
645
- tsp.hideRows(table, c);
646
- c.$table.on('sortEnd filterEnd '.split(' ').join(namespace + ' '), function(){
647
- tsp.hideRows(table, c);
684
+ tsp.hideRows( c );
685
+ c.$table.on( 'sortEnd filterEnd '.split( ' ' ).join( namespace + ' ' ), function() {
686
+ tsp.hideRows( c );
648
687
  });
649
688
  }
650
689
  },
651
690
 
652
- renderAjax: function(data, table, c, xhr, settings, exception) {
653
- var p = c.pager,
691
+ renderAjax: function( data, c, xhr, settings, exception ) {
692
+ var table = c.table,
693
+ p = c.pager,
654
694
  wo = c.widgetOptions;
655
695
  // process data
656
- if ( $.isFunction(wo.pager_ajaxProcessing) ) {
696
+ if ( $.isFunction( wo.pager_ajaxProcessing ) ) {
657
697
 
658
698
  // in case nothing is returned by ajax, empty out the table; see #1032
659
699
  // but do it before calling pager_ajaxProcessing because that function may add content
660
700
  // directly to the table
661
- c.$tbodies.eq(0).empty();
701
+ c.$tbodies.eq( 0 ).empty();
662
702
 
663
703
  // ajaxProcessing result: [ total, rows, headers ]
664
704
  var i, j, t, hsh, $f, $sh, $headers, $h, icon, th, d, l, rr_count, len,
665
705
  $table = c.$table,
666
706
  tds = '',
667
- result = wo.pager_ajaxProcessing(data, table, xhr) || [ 0, [] ],
668
- hl = $table.find('thead th').length;
707
+ result = wo.pager_ajaxProcessing( data, table, xhr ) || [ 0, [] ],
708
+ hl = $table.find( 'thead th' ).length;
669
709
 
670
710
  // Clean up any previous error.
671
711
  ts.showError( table );
672
712
 
673
713
  if ( exception ) {
674
- if (c.debug) {
675
- console.error('Pager: >> Ajax Error', xhr, settings, exception);
714
+ if ( c.debug ) {
715
+ console.error( 'Pager: >> Ajax Error', xhr, settings, exception );
676
716
  }
677
717
  ts.showError( table, xhr, settings, exception );
678
- c.$tbodies.eq(0).children('tr').detach();
718
+ c.$tbodies.eq( 0 ).children( 'tr' ).detach();
679
719
  p.totalRows = 0;
680
720
  } else {
681
721
  // process ajax object
682
- if (!$.isArray(result)) {
722
+ if ( !$.isArray( result ) ) {
683
723
  p.ajaxData = result;
684
724
  c.totalRows = p.totalRows = result.total;
685
- c.filteredRows = p.filteredRows = typeof result.filteredRows !== 'undefined' ? result.filteredRows : result.total;
725
+ c.filteredRows = p.filteredRows = typeof result.filteredRows !== 'undefined' ?
726
+ result.filteredRows :
727
+ result.total;
686
728
  th = result.headers;
687
729
  d = result.rows || [];
688
730
  } else {
689
731
  // allow [ total, rows, headers ] or [ rows, total, headers ]
690
- t = isNaN(result[0]) && !isNaN(result[1]);
732
+ t = isNaN( result[ 0 ] ) && !isNaN( result[ 1 ] );
691
733
  // ensure a zero returned row count doesn't fail the logical ||
692
- rr_count = result[t ? 1 : 0];
693
- p.totalRows = isNaN(rr_count) ? p.totalRows || 0 : rr_count;
734
+ rr_count = result[ t ? 1 : 0 ];
735
+ p.totalRows = isNaN( rr_count ) ? p.totalRows || 0 : rr_count;
694
736
  // can't set filtered rows when returning an array
695
737
  c.totalRows = c.filteredRows = p.filteredRows = p.totalRows;
696
738
  // set row data to empty array if nothing found - see http://stackoverflow.com/q/30875583/145346
697
- d = p.totalRows === 0 ? [] : result[t ? 0 : 1] || []; // row data
698
- th = result[2]; // headers
739
+ d = p.totalRows === 0 ? [] : result[ t ? 0 : 1 ] || []; // row data
740
+ th = result[ 2 ]; // headers
699
741
  }
700
742
  l = d && d.length;
701
- if (d instanceof jQuery) {
702
- if (wo.pager_processAjaxOnInit) {
743
+ if ( d instanceof jQuery ) {
744
+ if ( wo.pager_processAjaxOnInit ) {
703
745
  // append jQuery object
704
- c.$tbodies.eq(0).empty();
705
- c.$tbodies.eq(0).append(d);
746
+ c.$tbodies.eq( 0 ).empty();
747
+ c.$tbodies.eq( 0 ).append( d );
706
748
  }
707
- } else if (l) {
749
+ } else if ( l ) {
708
750
  // build table from array
709
751
  for ( i = 0; i < l; i++ ) {
710
752
  tds += '<tr>';
711
753
  for ( j = 0; j < d[i].length; j++ ) {
712
754
  // build tbody cells; watch for data containing HTML markup - see #434
713
- tds += /^\s*<td/.test(d[i][j]) ? $.trim(d[i][j]) : '<td>' + d[i][j] + '</td>';
755
+ tds += /^\s*<td/.test( d[ i ][ j ] ) ? $.trim( d[ i ][ j ] ) : '<td>' + d[ i ][ j ] + '</td>';
714
756
  }
715
757
  tds += '</tr>';
716
758
  }
717
759
  // add rows to first tbody
718
- if (wo.pager_processAjaxOnInit) {
719
- c.$tbodies.eq(0).html( tds );
760
+ if ( wo.pager_processAjaxOnInit ) {
761
+ c.$tbodies.eq( 0 ).html( tds );
720
762
  }
721
763
  }
722
764
  wo.pager_processAjaxOnInit = true;
723
765
  // only add new header text if the length matches
724
766
  if ( th && th.length === hl ) {
725
- hsh = $table.hasClass('hasStickyHeaders');
726
- $sh = hsh ? wo.$sticky.children('thead:first').children('tr').children() : '';
727
- $f = $table.find('tfoot tr:first').children();
767
+ hsh = $table.hasClass( 'hasStickyHeaders' );
768
+ $sh = hsh ? wo.$sticky.children( 'thead:first' ).children( 'tr' ).children() : '';
769
+ $f = $table.find( 'tfoot tr:first' ).children();
728
770
  // don't change td headers (may contain pager)
729
- $headers = c.$headers.filter( 'th ');
771
+ $headers = c.$headers.filter( 'th' );
730
772
  len = $headers.length;
731
773
  for ( j = 0; j < len; j++ ) {
732
774
  $h = $headers.eq( j );
733
775
  // add new test within the first span it finds, or just in the header
734
- if ( $h.find('.' + ts.css.icon).length ) {
735
- icon = $h.find('.' + ts.css.icon).clone(true);
736
- $h.find('.tablesorter-header-inner').html( th[j] ).append(icon);
776
+ if ( $h.find( '.' + ts.css.icon ).length ) {
777
+ icon = $h.find( '.' + ts.css.icon ).clone( true );
778
+ $h.find( '.tablesorter-header-inner' ).html( th[ j ] ).append( icon );
737
779
  if ( hsh && $sh.length ) {
738
- icon = $sh.eq(j).find('.' + ts.css.icon).clone(true);
739
- $sh.eq(j).find('.tablesorter-header-inner').html( th[j] ).append(icon);
780
+ icon = $sh.eq( j ).find( '.' + ts.css.icon ).clone( true );
781
+ $sh.eq( j ).find( '.tablesorter-header-inner' ).html( th[ j ] ).append( icon );
740
782
  }
741
783
  } else {
742
- $h.find('.tablesorter-header-inner').html( th[j] );
743
- if (hsh && $sh.length) {
744
- $sh.eq(j).find('.tablesorter-header-inner').html( th[j] );
784
+ $h.find( '.tablesorter-header-inner' ).html( th[ j ] );
785
+ if ( hsh && $sh.length ) {
786
+ $sh.eq( j ).find( '.tablesorter-header-inner' ).html( th[ j ] );
745
787
  }
746
788
  }
747
- $f.eq(j).html( th[j] );
789
+ $f.eq( j ).html( th[ j ] );
748
790
  }
749
791
  }
750
792
  }
751
- if (c.showProcessing) {
752
- ts.isProcessing(table); // remove loading icon
793
+ if ( c.showProcessing ) {
794
+ ts.isProcessing( table ); // remove loading icon
753
795
  }
754
796
  // make sure last pager settings are saved, prevents multiple server side calls with
755
797
  // the same parameters
756
798
  p.totalPages = Math.ceil( p.totalRows / tsp.parsePageSize( c, p.size, 'get' ) );
757
799
  p.last.totalRows = p.totalRows;
758
800
  p.last.currentFilters = p.currentFilters;
759
- p.last.sortList = (c.sortList || []).join(',');
801
+ p.last.sortList = ( c.sortList || [] ).join( ',' );
760
802
  p.initializing = false;
761
803
  // update display without triggering pager complete... before updating cache
762
- tsp.updatePageDisplay(table, c, false);
804
+ tsp.updatePageDisplay( c, false );
763
805
  // tablesorter core updateCache (not pager)
764
- ts.updateCache( c, function(){
765
- if (p.initialized) {
806
+ ts.updateCache( c, function() {
807
+ if ( p.initialized ) {
766
808
  // apply widgets after table has rendered & after a delay to prevent
767
809
  // multiple applyWidget blocking code from blocking this trigger
768
- setTimeout(function(){
769
- if (c.debug) {
770
- console.log('Pager: Triggering pagerChange');
810
+ setTimeout( function() {
811
+ if ( c.debug ) {
812
+ console.log( 'Pager: Triggering pagerChange' );
771
813
  }
772
814
  $table.trigger( 'pagerChange', p );
773
815
  ts.applyWidget( table );
774
- tsp.updatePageDisplay(table, c);
775
- }, 0);
816
+ tsp.updatePageDisplay( c );
817
+ }, 0 );
776
818
  }
777
819
  });
778
820
  }
779
- if (!p.initialized) {
821
+ if ( !p.initialized ) {
780
822
  ts.applyWidget( table );
781
823
  }
782
824
  },
783
825
 
784
- getAjax: function(table, c){
826
+ getAjax: function( c ) {
785
827
  var counter,
786
- url = tsp.getAjaxUrl(table, c),
787
- $doc = $(document),
828
+ url = tsp.getAjaxUrl( c ),
829
+ $doc = $( document ),
788
830
  namespace = c.namespace + 'pager',
789
831
  p = c.pager;
790
832
  if ( url !== '' ) {
791
- if (c.showProcessing) {
792
- ts.isProcessing(table, true); // show loading icon
833
+ if ( c.showProcessing ) {
834
+ ts.isProcessing( c.table, true ); // show loading icon
793
835
  }
794
- $doc.on('ajaxError' + namespace, function(e, xhr, settings, exception) {
795
- tsp.renderAjax(null, table, c, xhr, settings, exception);
796
- $doc.off('ajaxError' + namespace);
836
+ $doc.on( 'ajaxError' + namespace, function( e, xhr, settings, exception ) {
837
+ tsp.renderAjax( null, c, xhr, settings, exception );
838
+ $doc.off( 'ajaxError' + namespace );
797
839
  });
798
840
  counter = ++p.ajaxCounter;
799
841
  p.last.ajaxUrl = url; // remember processed url
800
842
  p.ajaxObject.url = url; // from the ajaxUrl option and modified by customAjaxUrl
801
- p.ajaxObject.success = function(data, status, jqxhr) {
843
+ p.ajaxObject.success = function( data, status, jqxhr ) {
802
844
  // Refuse to process old ajax commands that were overwritten by new ones - see #443
803
- if (counter < p.ajaxCounter){
845
+ if ( counter < p.ajaxCounter ) {
804
846
  return;
805
847
  }
806
- tsp.renderAjax(data, table, c, jqxhr);
807
- $doc.off('ajaxError' + namespace);
808
- if (typeof p.oldAjaxSuccess === 'function') {
809
- p.oldAjaxSuccess(data);
848
+ tsp.renderAjax( data, c, jqxhr );
849
+ $doc.off( 'ajaxError' + namespace );
850
+ if ( typeof p.oldAjaxSuccess === 'function' ) {
851
+ p.oldAjaxSuccess( data );
810
852
  }
811
853
  };
812
- if (c.debug) {
813
- console.log('Pager: Ajax initialized', p.ajaxObject);
854
+ if ( c.debug ) {
855
+ console.log( 'Pager: Ajax initialized', p.ajaxObject );
814
856
  }
815
- $.ajax(p.ajaxObject);
857
+ $.ajax( p.ajaxObject );
816
858
  }
817
859
  },
818
860
 
819
- getAjaxUrl: function(table, c) {
861
+ getAjaxUrl: function( c ) {
820
862
  var indx, len,
821
863
  p = c.pager,
822
864
  wo = c.widgetOptions,
823
- url = (wo.pager_ajaxUrl) ? wo.pager_ajaxUrl
865
+ url = wo.pager_ajaxUrl ? wo.pager_ajaxUrl
824
866
  // allow using '{page+1}' in the url string to switch to a non-zero based index
825
- .replace(/\{page([\-+]\d+)?\}/, function(s, n){ return p.page + (n ? parseInt(n, 10) : 0); })
826
- .replace(/\{size\}/g, p.size) : '',
867
+ .replace( /\{page([\-+]\d+)?\}/, function( s, n ) { return p.page + ( n ? parseInt( n, 10 ) : 0 ); })
868
+ .replace( /\{size\}/g, p.size ) : '',
827
869
  sortList = c.sortList,
828
- filterList = p.currentFilters || $(table).data('lastSearch') || [],
829
- sortCol = url.match(/\{\s*sort(?:List)?\s*:\s*(\w*)\s*\}/),
830
- filterCol = url.match(/\{\s*filter(?:List)?\s*:\s*(\w*)\s*\}/),
870
+ filterList = p.currentFilters || c.$table.data( 'lastSearch' ) || [],
871
+ sortCol = url.match( /\{\s*sort(?:List)?\s*:\s*(\w*)\s*\}/ ),
872
+ filterCol = url.match( /\{\s*filter(?:List)?\s*:\s*(\w*)\s*\}/ ),
831
873
  arry = [];
832
- if (sortCol) {
833
- sortCol = sortCol[1];
874
+ if ( sortCol ) {
875
+ sortCol = sortCol[ 1 ];
834
876
  len = sortList.length;
835
- for (indx = 0; indx < len; indx++) {
836
- arry.push(sortCol + '[' + sortList[indx][0] + ']=' + sortList[indx][1]);
877
+ for ( indx = 0; indx < len; indx++ ) {
878
+ arry.push( sortCol + '[' + sortList[ indx ][ 0 ] + ']=' + sortList[ indx ][ 1 ] );
837
879
  }
838
880
  // if the arry is empty, just add the col parameter... '&{sortList:col}' becomes '&col'
839
- url = url.replace(/\{\s*sort(?:List)?\s*:\s*(\w*)\s*\}/g, arry.length ? arry.join('&') : sortCol );
881
+ url = url.replace( /\{\s*sort(?:List)?\s*:\s*(\w*)\s*\}/g, arry.length ? arry.join( '&' ) : sortCol );
840
882
  arry = [];
841
883
  }
842
- if (filterCol) {
843
- filterCol = filterCol[1];
884
+ if ( filterCol ) {
885
+ filterCol = filterCol[ 1 ];
844
886
  len = filterList.length;
845
- for (indx = 0; indx < len; indx++) {
846
- if (filterList[indx]) {
847
- arry.push(filterCol + '[' + indx + ']=' + encodeURIComponent(filterList[indx]));
887
+ for ( indx = 0; indx < len; indx++ ) {
888
+ if ( filterList[ indx ] ) {
889
+ arry.push( filterCol + '[' + indx + ']=' + encodeURIComponent( filterList[ indx ] ) );
848
890
  }
849
891
  }
850
892
  // if the arry is empty, just add the fcol parameter... '&{filterList:fcol}' becomes '&fcol'
851
- url = url.replace(/\{\s*filter(?:List)?\s*:\s*(\w*)\s*\}/g, arry.length ? arry.join('&') : filterCol );
893
+ url = url.replace( /\{\s*filter(?:List)?\s*:\s*(\w*)\s*\}/g, arry.length ? arry.join( '&' ) : filterCol );
852
894
  p.currentFilters = filterList;
853
895
  }
854
- if ( $.isFunction(wo.pager_customAjaxUrl) ) {
855
- url = wo.pager_customAjaxUrl(table, url);
896
+ if ( $.isFunction( wo.pager_customAjaxUrl ) ) {
897
+ url = wo.pager_customAjaxUrl( c.table, url );
856
898
  }
857
- if (c.debug) {
858
- console.log('Pager: Ajax url = ' + url);
899
+ if ( c.debug ) {
900
+ console.log( 'Pager: Ajax url = ' + url );
859
901
  }
860
902
  return url;
861
903
  },
862
904
 
863
- renderTable: function(table, rows) {
905
+ renderTable: function( c, rows ) {
864
906
  var $tb, index, count, added,
865
- c = table.config,
907
+ table = c.table,
866
908
  p = c.pager,
867
909
  wo = c.widgetOptions,
868
910
  f = c.$table.hasClass('hasFilters'),
@@ -870,81 +912,83 @@
870
912
  s = ( p.page * p.size ),
871
913
  e = p.size;
872
914
  if ( l < 1 ) {
873
- if (c.debug) {
874
- console.warn('Pager: >> No rows for pager to render');
915
+ if ( c.debug ) {
916
+ console.warn( 'Pager: >> No rows for pager to render' );
875
917
  }
876
918
  // empty table, abort!
877
919
  return;
878
920
  }
879
921
  if ( p.page >= p.totalPages ) {
880
922
  // lets not render the table more than once
881
- return tsp.moveToLastPage(table, p);
923
+ return tsp.moveToLastPage( c, p );
882
924
  }
883
925
  p.cacheIndex = [];
884
926
  p.isDisabled = false; // needed because sorting will change the page and re-enable the pager
885
- if (p.initialized) {
886
- if (c.debug) {
887
- console.log('Pager: Triggering pagerChange');
927
+ if ( p.initialized ) {
928
+ if ( c.debug ) {
929
+ console.log( 'Pager: Triggering pagerChange' );
888
930
  }
889
931
  c.$table.trigger( 'pagerChange', c );
890
932
  }
891
933
  if ( !wo.pager_removeRows ) {
892
- tsp.hideRows(table, c);
934
+ tsp.hideRows( c );
893
935
  } else {
894
- ts.clearTableBody(table);
895
- $tb = ts.processTbody(table, c.$tbodies.eq(0), true);
936
+ ts.clearTableBody( table );
937
+ $tb = ts.processTbody( table, c.$tbodies.eq(0), true );
896
938
  // not filtered, start from the calculated starting point (s)
897
939
  // if filtered, start from zero
898
940
  index = f ? 0 : s;
899
941
  count = f ? 0 : s;
900
942
  added = 0;
901
- while (added < e && index < rows.length) {
902
- if (!f || !/filtered/.test(rows[index][0].className)){
943
+ while ( added < e && index < rows.length ) {
944
+ if ( !f || !/filtered/.test( rows[ index ][ 0 ].className ) ) {
903
945
  count++;
904
- if (count > s && added <= e) {
946
+ if ( count > s && added <= e ) {
905
947
  added++;
906
- p.cacheIndex.push(index);
907
- $tb.append(rows[index]);
948
+ p.cacheIndex.push( index );
949
+ $tb.append( rows[ index ] );
908
950
  }
909
951
  }
910
952
  index++;
911
953
  }
912
- ts.processTbody(table, $tb, false);
954
+ ts.processTbody( table, $tb, false );
913
955
  }
914
- tsp.updatePageDisplay(table, c);
956
+ tsp.updatePageDisplay( c );
915
957
 
916
958
  wo.pager_startPage = p.page;
917
959
  wo.pager_size = p.size;
918
- if (table.isUpdating) {
919
- if (c.debug) {
920
- console.log('Pager: Triggering updateComplete');
960
+ if ( table.isUpdating ) {
961
+ if ( c.debug ) {
962
+ console.log( 'Pager: Triggering updateComplete' );
921
963
  }
922
- c.$table.trigger('updateComplete', [ table, true ]);
964
+ c.$table.trigger( 'updateComplete', [ table, true ] );
923
965
  }
924
966
 
925
967
  },
926
968
 
927
- showAllRows: function(table, c){
969
+ showAllRows: function( c ) {
928
970
  var index, $controls, len,
971
+ table = c.table,
929
972
  p = c.pager,
930
973
  wo = c.widgetOptions;
931
974
  if ( p.ajax ) {
932
- tsp.pagerArrows(c, true);
975
+ tsp.pagerArrows( c, true );
933
976
  } else {
934
- $.data(table, 'pagerLastPage', p.page);
935
- $.data(table, 'pagerLastSize', p.size);
977
+ $.data( table, 'pagerLastPage', p.page );
978
+ $.data( table, 'pagerLastSize', p.size );
936
979
  p.page = 0;
937
980
  p.size = p.totalRows;
938
981
  p.totalPages = 1;
939
982
  c.$table
940
- .addClass('pagerDisabled')
941
- .removeAttr('aria-describedby')
942
- .find('tr.pagerSavedHeightSpacer').remove();
943
- tsp.renderTable(table, c.rowsCopy);
983
+ .addClass( 'pagerDisabled' )
984
+ .removeAttr( 'aria-describedby' )
985
+ .find( 'tr.pagerSavedHeightSpacer' )
986
+ .remove();
987
+ tsp.renderTable( c, c.rowsCopy );
944
988
  p.isDisabled = true;
945
989
  ts.applyWidget( table );
946
- if (c.debug) {
947
- console.log('Pager: Disabled');
990
+ if ( c.debug ) {
991
+ console.log( 'Pager: Disabled' );
948
992
  }
949
993
  }
950
994
  // disable size selector
@@ -955,96 +999,99 @@
955
999
  for ( index = 0; index < len; index++ ) {
956
1000
  $controls.eq( index )
957
1001
  .attr( 'aria-disabled', 'true' )
958
- .addClass( wo.pager_css.disabled )[0].disabled = true;
1002
+ .addClass( wo.pager_css.disabled )[ 0 ].disabled = true;
959
1003
  }
960
1004
  },
961
1005
 
962
1006
  // updateCache if delayInit: true
963
1007
  // this is normally done by 'appendToTable' function in the tablesorter core AFTER a sort
964
- updateCache: function(table) {
965
- var c = table.config,
966
- p = c.pager;
1008
+ updateCache: function( c ) {
1009
+ var p = c.pager;
967
1010
  // tablesorter core updateCache (not pager)
968
- ts.updateCache( c, function(){
969
- if ( !$.isEmptyObject(table.config.cache) ) {
970
- var i,
1011
+ ts.updateCache( c, function() {
1012
+ if ( !$.isEmptyObject( c.cache ) ) {
1013
+ var index,
971
1014
  rows = [],
972
- n = table.config.cache[0].normalized;
973
- p.totalRows = n.length;
974
- for (i = 0; i < p.totalRows; i++) {
975
- rows.push(n[i][c.columns].$row);
1015
+ normalized = c.cache[ 0 ].normalized;
1016
+ p.totalRows = normalized.length;
1017
+ for ( index = 0; index < p.totalRows; index++ ) {
1018
+ rows.push( normalized[ index ][ c.columns ].$row );
976
1019
  }
977
1020
  c.rowsCopy = rows;
978
- tsp.moveToPage(table, p, true);
1021
+ tsp.moveToPage( c, p, true );
979
1022
  // clear out last search to force an update
980
1023
  p.last.currentFilters = [ ' ' ];
981
1024
  }
982
1025
  });
983
1026
  },
984
1027
 
985
- moveToPage: function(table, p, pageMoved) {
1028
+ moveToPage: function( c, p, pageMoved ) {
986
1029
  if ( p.isDisabled ) { return; }
987
- if ( pageMoved !== false && p.initialized && $.isEmptyObject(table.config.cache)) {
988
- return tsp.updateCache(table);
1030
+ if ( pageMoved !== false && p.initialized && $.isEmptyObject( c.cache ) ) {
1031
+ return tsp.updateCache( c );
989
1032
  }
990
- var c = table.config,
1033
+ var table = c.table,
991
1034
  wo = c.widgetOptions,
992
1035
  l = p.last;
993
1036
 
994
1037
  // abort page move if the table has filters and has not been initialized
995
- if (p.ajax && !wo.filter_initialized && ts.hasWidget(table, 'filter')) { return; }
1038
+ if ( p.ajax && !wo.filter_initialized && ts.hasWidget( table, 'filter' ) ) { return; }
996
1039
 
997
- tsp.parsePageNumber( p );
998
- tsp.calcFilters(table, c);
1040
+ tsp.parsePageNumber( c, p );
1041
+ tsp.calcFilters( c );
999
1042
 
1000
1043
  // fixes issue where one current filter is [] and the other is [ '', '', '' ],
1001
1044
  // making the next if comparison think the filters as different. Fixes #202.
1002
- l.currentFilters = (l.currentFilters || []).join('') === '' ? [] : l.currentFilters;
1003
- p.currentFilters = (p.currentFilters || []).join('') === '' ? [] : p.currentFilters;
1045
+ l.currentFilters = ( l.currentFilters || [] ).join( '' ) === '' ? [] : l.currentFilters;
1046
+ p.currentFilters = ( p.currentFilters || [] ).join( '' ) === '' ? [] : p.currentFilters;
1004
1047
  // don't allow rendering multiple times on the same page/size/totalRows/filters/sorts
1005
1048
  if ( l.page === p.page && l.size === p.size && l.totalRows === p.totalRows &&
1006
- (l.currentFilters || []).join(',') === (p.currentFilters || []).join(',') &&
1049
+ ( l.currentFilters || [] ).join( ',' ) === ( p.currentFilters || [] ).join( ',' ) &&
1007
1050
  // check for ajax url changes see #730
1008
- (l.ajaxUrl || '') === (p.ajaxObject.url || '') &&
1051
+ ( l.ajaxUrl || '' ) === ( p.ajaxObject.url || '' ) &&
1009
1052
  // & ajax url option changes (dynamically add/remove/rename sort & filter parameters)
1010
- (l.optAjaxUrl || '') === (wo.pager_ajaxUrl || '') &&
1011
- l.sortList === (c.sortList || []).join(',') ) {
1053
+ ( l.optAjaxUrl || '' ) === ( wo.pager_ajaxUrl || '' ) &&
1054
+ l.sortList === ( c.sortList || [] ).join( ',' ) ) {
1012
1055
  return;
1013
1056
  }
1014
- if (c.debug) {
1015
- console.log('Pager: Changing to page ' + p.page);
1057
+ if ( c.debug ) {
1058
+ console.log( 'Pager: Changing to page ' + p.page );
1016
1059
  }
1017
1060
  p.last = {
1018
- page : p.page,
1019
- size : p.size,
1061
+ page: p.page,
1062
+ size: p.size,
1020
1063
  // fixes #408; modify sortList otherwise it auto-updates
1021
- sortList : (c.sortList || []).join(','),
1022
- totalRows : p.totalRows,
1023
- currentFilters : p.currentFilters || [],
1024
- ajaxUrl : p.ajaxObject.url || '',
1025
- optAjaxUrl : wo.pager_ajaxUrl
1064
+ sortList: ( c.sortList || [] ).join( ',' ),
1065
+ totalRows: p.totalRows,
1066
+ currentFilters: p.currentFilters || [],
1067
+ ajaxUrl: p.ajaxObject.url || '',
1068
+ optAjaxUrl: wo.pager_ajaxUrl
1026
1069
  };
1027
- if (p.ajax) {
1028
- tsp.getAjax(table, c);
1029
- } else if (!p.ajax) {
1030
- tsp.renderTable(table, c.rowsCopy);
1070
+ if ( p.ajax ) {
1071
+ tsp.getAjax( c );
1072
+ } else if ( !p.ajax ) {
1073
+ tsp.renderTable( c, c.rowsCopy );
1031
1074
  }
1032
- $.data(table, 'pagerLastPage', p.page);
1033
- if (p.initialized && pageMoved !== false) {
1034
- if (c.debug) {
1035
- console.log('Pager: Triggering pageMoved');
1075
+ $.data( table, 'pagerLastPage', p.page );
1076
+ if ( p.initialized && pageMoved !== false ) {
1077
+ if ( c.debug ) {
1078
+ console.log( 'Pager: Triggering pageMoved' );
1036
1079
  }
1037
- c.$table.trigger('pageMoved', c);
1080
+ c.$table.trigger( 'pageMoved', c );
1038
1081
  ts.applyWidget( table );
1039
- if (!p.ajax && table.isUpdating) {
1040
- if (c.debug) {
1041
- console.log('Pager: Triggering updateComplete');
1082
+ if ( !p.ajax && table.isUpdating ) {
1083
+ if ( c.debug ) {
1084
+ console.log( 'Pager: Triggering updateComplete' );
1042
1085
  }
1043
- c.$table.trigger('updateComplete', [ table, true ]);
1086
+ c.$table.trigger( 'updateComplete', [ table, true ] );
1044
1087
  }
1045
1088
  }
1046
1089
  },
1047
1090
 
1091
+ getTotalPages: function( c, p ) {
1092
+ return ts.hasWidget( c.table, 'filter' ) ? Math.min( p.totalPages, p.filteredPages ) : p.totalPages;
1093
+ },
1094
+
1048
1095
  // set to either set or get value
1049
1096
  parsePageSize: function( c, size, mode ) {
1050
1097
  var p = c.pager,
@@ -1057,54 +1104,56 @@
1057
1104
  ( mode === 'get' ? s : p.size );
1058
1105
  },
1059
1106
 
1060
- parsePageNumber: function( p ) {
1061
- var min = Math.min( p.totalPages, p.filteredPages ) - 1;
1107
+ parsePageNumber: function( c, p ) {
1108
+ var min = tsp.getTotalPages( c, p ) - 1;
1062
1109
  p.page = parseInt( p.page, 10 );
1063
1110
  if ( p.page < 0 || isNaN( p.page ) ) { p.page = 0; }
1064
- if ( p.page > min && p.page !== 0 ) { p.page = min; }
1111
+ if ( p.page > min && min >= 0 ) { p.page = min; }
1065
1112
  return p.page;
1066
1113
  },
1067
1114
 
1068
- setPageSize: function(c, size) {
1115
+ setPageSize: function( c, size ) {
1069
1116
  var p = c.pager,
1070
1117
  table = c.table;
1071
1118
  p.size = tsp.parsePageSize( c, size, 'get' );
1072
1119
  p.$size.val( tsp.parsePageSize( c, p.size, 'set' ) );
1073
- $.data(table, 'pagerLastPage', tsp.parsePageNumber( p ) );
1074
- $.data(table, 'pagerLastSize', p.size);
1120
+ $.data( table, 'pagerLastPage', tsp.parsePageNumber( c, p ) );
1121
+ $.data( table, 'pagerLastSize', p.size );
1075
1122
  p.totalPages = Math.ceil( p.totalRows / p.size );
1076
1123
  p.filteredPages = Math.ceil( p.filteredRows / p.size );
1077
- tsp.moveToPage(table, p, true);
1124
+ tsp.moveToPage( c, p, true );
1078
1125
  },
1079
1126
 
1080
- moveToFirstPage: function(table, p) {
1127
+ moveToFirstPage: function( c, p ) {
1081
1128
  p.page = 0;
1082
- tsp.moveToPage(table, p, true);
1129
+ tsp.moveToPage( c, p, true );
1083
1130
  },
1084
1131
 
1085
- moveToLastPage: function(table, p) {
1086
- p.page = ( Math.min( p.totalPages, p.filteredPages ) - 1 );
1087
- tsp.moveToPage(table, p, true);
1132
+ moveToLastPage: function( c, p ) {
1133
+ p.page = tsp.getTotalPages( c, p ) - 1;
1134
+ tsp.moveToPage( c, p, true );
1088
1135
  },
1089
1136
 
1090
- moveToNextPage: function(table, p) {
1137
+ moveToNextPage: function( c, p ) {
1091
1138
  p.page++;
1092
- if ( p.page >= ( Math.min( p.totalPages, p.filteredPages ) - 1 ) ) {
1093
- p.page = ( Math.min( p.totalPages, p.filteredPages ) - 1 );
1139
+ var last = tsp.getTotalPages( c, p ) - 1;
1140
+ if ( p.page >= last ) {
1141
+ p.page = last;
1094
1142
  }
1095
- tsp.moveToPage(table, p, true);
1143
+ tsp.moveToPage( c, p, true );
1096
1144
  },
1097
1145
 
1098
- moveToPrevPage: function(table, p) {
1146
+ moveToPrevPage: function( c, p ) {
1099
1147
  p.page--;
1100
1148
  if ( p.page <= 0 ) {
1101
1149
  p.page = 0;
1102
1150
  }
1103
- tsp.moveToPage(table, p, true);
1151
+ tsp.moveToPage( c, p, true );
1104
1152
  },
1105
1153
 
1106
- destroyPager: function(table, c, refreshing){
1107
- var p = c.pager,
1154
+ destroyPager: function( c, refreshing ) {
1155
+ var table = c.table,
1156
+ p = c.pager,
1108
1157
  s = c.widgetOptions.pager_selectors,
1109
1158
  ctrls = [ s.first, s.prev, s.next, s.last, s.gotoPage, s.pageSize ].join( ',' ),
1110
1159
  namespace = c.namespace + 'pager';
@@ -1117,57 +1166,58 @@
1117
1166
  .find( ctrls )
1118
1167
  .off( namespace );
1119
1168
  if ( refreshing ) { return; }
1120
- tsp.showAllRows(table, c);
1169
+ tsp.showAllRows( c );
1121
1170
  c.appender = null; // remove pager appender function
1122
- if (ts.storage) {
1123
- ts.storage(table, c.widgetOptions.pager_storageKey, '');
1171
+ if ( ts.storage ) {
1172
+ ts.storage( table, c.widgetOptions.pager_storageKey, '' );
1124
1173
  }
1125
1174
  delete table.config.pager;
1126
1175
  delete table.config.rowsCopy;
1127
1176
  },
1128
1177
 
1129
- enablePager: function(table, c, triggered){
1178
+ enablePager: function( c, triggered ) {
1130
1179
  var info, size,
1180
+ table = c.table,
1131
1181
  p = c.pager;
1132
1182
  p.isDisabled = false;
1133
- p.page = $.data(table, 'pagerLastPage') || p.page || 0;
1134
- size = p.$size.find('option[selected]').val();
1135
- p.size = $.data(table, 'pagerLastSize') || tsp.parsePageSize( c, size, 'get' );
1183
+ p.page = $.data( table, 'pagerLastPage' ) || p.page || 0;
1184
+ size = p.$size.find( 'option[selected]' ).val();
1185
+ p.size = $.data( table, 'pagerLastSize' ) || tsp.parsePageSize( c, size, 'get' );
1136
1186
  p.$size.val( tsp.parsePageSize( c, p.size, 'set' ) ); // set page size
1137
- p.totalPages = Math.ceil( Math.min( p.totalRows, p.filteredRows ) / p.size );
1138
- c.$table.removeClass('pagerDisabled');
1187
+ p.totalPages = Math.ceil( tsp.getTotalPages( c, p ) / p.size );
1188
+ c.$table.removeClass( 'pagerDisabled' );
1139
1189
  // if table id exists, include page display with aria info
1140
1190
  if ( table.id ) {
1141
1191
  info = table.id + '_pager_info';
1142
- p.$container.find(c.widgetOptions.pager_selectors.pageDisplay).attr('id', info);
1143
- c.$table.attr('aria-describedby', info);
1192
+ p.$container.find( c.widgetOptions.pager_selectors.pageDisplay ).attr( 'id', info );
1193
+ c.$table.attr( 'aria-describedby', info );
1144
1194
  }
1145
- tsp.changeHeight(table, c);
1195
+ tsp.changeHeight( c );
1146
1196
  if ( triggered ) {
1147
1197
  // tablesorter core update table
1148
1198
  ts.update( c );
1149
- tsp.setPageSize(c, p.size);
1150
- tsp.hideRowsSetup(table, c);
1151
- if (c.debug) {
1152
- console.log('Pager: Enabled');
1199
+ tsp.setPageSize( c, p.size );
1200
+ tsp.hideRowsSetup( c );
1201
+ if ( c.debug ) {
1202
+ console.log( 'Pager: Enabled' );
1153
1203
  }
1154
1204
  }
1155
1205
  },
1156
1206
 
1157
- appender: function(table, rows) {
1207
+ appender: function( table, rows ) {
1158
1208
  var c = table.config,
1159
1209
  wo = c.widgetOptions,
1160
1210
  p = c.pager;
1161
1211
  if ( !p.ajax ) {
1162
1212
  c.rowsCopy = rows;
1163
- p.totalRows = wo.pager_countChildRows ? c.$tbodies.eq(0).children('tr').length : rows.length;
1164
- p.size = $.data(table, 'pagerLastSize') || p.size || wo.pager_size || p.setSize || 10;
1213
+ p.totalRows = wo.pager_countChildRows ? c.$tbodies.eq( 0 ).children( 'tr' ).length : rows.length;
1214
+ p.size = $.data( table, 'pagerLastSize' ) || p.size || wo.pager_size || p.setSize || 10;
1165
1215
  p.totalPages = Math.ceil( p.totalRows / p.size );
1166
- tsp.moveToPage(table, p);
1216
+ tsp.moveToPage( c, p );
1167
1217
  // update display here in case all rows are removed
1168
- tsp.updatePageDisplay(table, c, false);
1218
+ tsp.updatePageDisplay( c, false );
1169
1219
  } else {
1170
- tsp.moveToPage(table, p, true);
1220
+ tsp.moveToPage( c, p, true );
1171
1221
  }
1172
1222
  }
1173
1223
 
@@ -1177,7 +1227,7 @@
1177
1227
  ts.showError = function( table, xhr, settings, exception ) {
1178
1228
  var $row,
1179
1229
  $table = $( table ),
1180
- c = $table[0].config,
1230
+ c = $table[ 0 ].config,
1181
1231
  wo = c && c.widgetOptions,
1182
1232
  errorRow = c.pager && c.pager.cssErrorRow ||
1183
1233
  wo && wo.pager_css && wo.pager_css.errorRow ||
@@ -1185,12 +1235,12 @@
1185
1235
  typ = typeof xhr,
1186
1236
  valid = true,
1187
1237
  message = '',
1188
- removeRow = function(){
1238
+ removeRow = function() {
1189
1239
  c.$table.find( 'thead' ).find( '.' + errorRow ).remove();
1190
1240
  };
1191
1241
 
1192
1242
  if ( !$table.length ) {
1193
- console.error('tablesorter showError: no table parameter passed');
1243
+ console.error( 'tablesorter showError: no table parameter passed' );
1194
1244
  return;
1195
1245
  }
1196
1246
 
@@ -1231,16 +1281,18 @@
1231
1281
  }
1232
1282
 
1233
1283
  // allow message to include entire row HTML!
1234
- $row = ( /tr\>/.test(message) ? $(message) : $('<tr><td colspan="' + c.columns + '">' + message + '</td></tr>') )
1284
+ $row = ( /tr\>/.test( message ) ?
1285
+ $( message ) :
1286
+ $( '<tr><td colspan="' + c.columns + '">' + message + '</td></tr>' ) )
1235
1287
  .click( function() {
1236
1288
  $( this ).remove();
1237
1289
  })
1238
1290
  // add error row to thead instead of tbody, or clicking on the header will result in a parser error
1239
1291
  .appendTo( c.$table.find( 'thead:first' ) )
1240
- .addClass( errorRow + ' ' + c.selectorRemove.slice(1) )
1292
+ .addClass( errorRow + ' ' + c.selectorRemove.slice( 1 ) )
1241
1293
  .attr({
1242
- role : 'alert',
1243
- 'aria-live' : 'assertive'
1294
+ role: 'alert',
1295
+ 'aria-live': 'assertive'
1244
1296
  });
1245
1297
 
1246
1298
  };