jquery-tablesorter 1.19.3 → 1.19.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
  };