jquery-tablesorter 1.13.4 → 1.14.0

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.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +2 -2
  4. data/lib/jquery-tablesorter/version.rb +1 -1
  5. data/vendor/assets/images/jquery-tablesorter/dragtable-handle.png +0 -0
  6. data/vendor/assets/images/jquery-tablesorter/dragtable-handle.svg +7 -0
  7. data/vendor/assets/javascripts/jquery-tablesorter/addons/pager/jquery.tablesorter.pager.js +58 -32
  8. data/vendor/assets/javascripts/jquery-tablesorter/extras/jquery.dragtable.mod.js +605 -0
  9. data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.js +161 -81
  10. data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.widgets-filter-formatter-select2.js +41 -30
  11. data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.widgets.js +151 -96
  12. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-duration.js +32 -5
  13. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-input-select.js +21 -26
  14. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-alignChar.js +5 -4
  15. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-build-table.js +2 -2
  16. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-chart.js +276 -0
  17. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-columnSelector.js +64 -32
  18. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-cssStickyHeaders.js +3 -2
  19. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-editable.js +11 -5
  20. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-formatter.js +70 -0
  21. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-math.js +13 -6
  22. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-output.js +7 -3
  23. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-pager.js +70 -41
  24. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-print.js +2 -2
  25. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-reflow.js +4 -3
  26. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-repeatheaders.js +14 -12
  27. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-scroller.js +68 -26
  28. data/vendor/assets/stylesheets/jquery-tablesorter/dragtable.mod.css +64 -0
  29. data/vendor/assets/stylesheets/jquery-tablesorter/theme.black-ice.css +3 -0
  30. data/vendor/assets/stylesheets/jquery-tablesorter/theme.blue.css +3 -0
  31. data/vendor/assets/stylesheets/jquery-tablesorter/theme.bootstrap.css +3 -0
  32. data/vendor/assets/stylesheets/jquery-tablesorter/theme.bootstrap_2.css +3 -0
  33. data/vendor/assets/stylesheets/jquery-tablesorter/theme.dark.css +3 -0
  34. data/vendor/assets/stylesheets/jquery-tablesorter/theme.default.css +3 -0
  35. data/vendor/assets/stylesheets/jquery-tablesorter/theme.dropbox.css +3 -0
  36. data/vendor/assets/stylesheets/jquery-tablesorter/theme.green.css +3 -0
  37. data/vendor/assets/stylesheets/jquery-tablesorter/theme.grey.css +3 -0
  38. data/vendor/assets/stylesheets/jquery-tablesorter/theme.ice.css +3 -0
  39. data/vendor/assets/stylesheets/jquery-tablesorter/theme.jui.css +3 -0
  40. data/vendor/assets/stylesheets/jquery-tablesorter/theme.metro-dark.css +3 -0
  41. metadata +8 -2
@@ -1,4 +1,4 @@
1
- /*! tablesorter CSS Sticky Headers widget - updated 11/7/2014 (v2.18.3)
1
+ /*! tablesorter CSS Sticky Headers widget - updated 2/7/2015 (v2.19.0)
2
2
  * Requires a modern browser, tablesorter v2.8+
3
3
  */
4
4
  /*jshint jquery:true, unused:false */
@@ -134,7 +134,8 @@
134
134
  });
135
135
 
136
136
  },
137
- remove: function(table, c, wo){
137
+ remove: function(table, c, wo, refreshing) {
138
+ if (refreshing) { return; }
138
139
  var namespace = c.namespace + 'cssstickyheader ';
139
140
  $(window).unbind('scroll resize '.split(' ').join(namespace));
140
141
  c.$table
@@ -1,4 +1,4 @@
1
- /*! tablesorter Editable Content widget - updated 10/26/2014 (v2.18.0)
1
+ /*! tablesorter Editable Content widget - updated 2/7/2015 (v2.19.0)
2
2
  * Requires tablesorter v2.8+ and jQuery 1.7+
3
3
  * by Rob Garrison
4
4
  */
@@ -35,9 +35,9 @@ var tse = $.tablesorter.editable = {
35
35
 
36
36
  update: function( c, wo ) {
37
37
  var indx, tmp, $t,
38
+ colIndex = [],
38
39
  cols = [];
39
-
40
- if ( $.type( wo.editable_columns ) === 'string' && wo.editable_columns.indexOf( '-' ) >= 0 ) {
40
+ if ( !wo.editable_columnsArray && $.type( wo.editable_columns ) === 'string' && wo.editable_columns.indexOf( '-' ) >= 0 ) {
41
41
  // editable_columns can contain a range string ( i.e. '2-4' )
42
42
  tmp = wo.editable_columns.split( /\s*-\s*/ );
43
43
  indx = parseInt( tmp[ 0 ], 10 ) || 0;
@@ -46,15 +46,21 @@ var tse = $.tablesorter.editable = {
46
46
  tmp = c.columns - 1;
47
47
  }
48
48
  for ( ; indx <= tmp; indx++ ) {
49
+ colIndex.push( indx );
49
50
  cols.push( 'td:nth-child(' + ( indx + 1 ) + ')' );
50
51
  }
51
52
  } else if ( $.isArray( wo.editable_columns ) ) {
52
- $.each( wo.editable_columns, function( i, col ) {
53
+ $.each( wo.editable_columnsArray || wo.editable_columns, function( i, col ) {
53
54
  if ( col < c.columns ) {
55
+ colIndex.push( col );
54
56
  cols.push( 'td:nth-child(' + ( col + 1 ) + ')' );
55
57
  }
56
58
  });
57
59
  }
60
+ if ( !wo.editable_columnsArray ) {
61
+ wo.editable_columnsArray = colIndex;
62
+ wo.editable_columnsArray.sort(function(a,b){ return a - b; });
63
+ }
58
64
  tmp = $( '<div>' ).wrapInner( wo.editable_wrapContent ).children().length || $.isFunction( wo.editable_wrapContent );
59
65
  // IE does not allow making TR/TH/TD cells directly editable ( issue #404 )
60
66
  // so add a div or span inside ( it's faster than using wrapInner() )
@@ -91,7 +97,7 @@ var tse = $.tablesorter.editable = {
91
97
  c.$table
92
98
  .off( 'updateComplete pagerComplete '.split( ' ' ).join( '.tseditable' ) )
93
99
  .on( 'updateComplete pagerComplete '.split( ' ' ).join( '.tseditable' ), function() {
94
- tse.update( c, wo );
100
+ tse.update( c, c.widgetOptions );
95
101
  });
96
102
 
97
103
  c.$tbodies
@@ -0,0 +1,70 @@
1
+ /*! tablesorter Formatter widget - 2/7/2015 (v2.19.0)
2
+ * Requires tablesorter v2.8+ and jQuery 1.7+
3
+ * by Rob Garrison
4
+ */
5
+ /*jshint browser:true, jquery:true, unused:false */
6
+ /*global jQuery: false */
7
+ ;(function($){
8
+ 'use strict';
9
+ var ts = $.tablesorter;
10
+
11
+ ts.formatter = {
12
+ init : function( c ) {
13
+ var events = $.trim( c.widgetOptions.formatter_event ) + ' pagerComplete updateComplete '
14
+ .split(' ').join('.tsformatter ');
15
+ c.$table.on( events, function() {
16
+ ts.formatter.setup( c );
17
+ });
18
+ ts.formatter.setup( c );
19
+ },
20
+ setup : function( c ) {
21
+ // do nothing for empty tables
22
+ if ( $.isEmptyObject( c.cache ) ) { return; }
23
+ var $tbody, tbodyIndex, rowIndex, rows, cell, len, column,
24
+ wo = c.widgetOptions,
25
+ data = { config: c, wo: wo },
26
+ formatter = [],
27
+ $headers = [];
28
+ // set up variables
29
+ for ( column = 0; column < c.columns; column++ ) {
30
+ $headers[ column ] = c.$headers.filter('[data-column="' + column + '"]:last');
31
+ formatter[ column ] = ts.getColumnData( c.table, wo.formatter_column, column ) || false;
32
+ }
33
+ // main loop
34
+ for ( tbodyIndex = 0; tbodyIndex < c.$tbodies.length; tbodyIndex++ ){
35
+ $tbody = ts.processTbody( c.table, c.$tbodies.eq( tbodyIndex ), true ); // detach tbody
36
+ rows = c.cache[ tbodyIndex ];
37
+ len = rows.normalized.length;
38
+ for ( rowIndex = 0; rowIndex < len; rowIndex++ ) {
39
+ data.$row = rows.normalized[ rowIndex ][ c.columns ].$row;
40
+ data.$cells = data.$row.children( 'th, td' );
41
+ for ( column = 0; column < c.columns; column++ ) {
42
+ if ( formatter[ column ] ) {
43
+ data.columnIndex = column;
44
+ data.$header = $headers[ column ];
45
+ data.$cell = data.$cells.eq( column );
46
+ cell = data.$cell[0];
47
+ // get text from attribute first, just in case we're updating
48
+ data.text = cell.getAttribute( c.textAttribute ) || cell.textContent || data.$cell.text();
49
+ cell.innerHTML = formatter[ column ]( data.text, data );
50
+ }
51
+ }
52
+ }
53
+ ts.processTbody( c.table, $tbody, false); // restore tbody
54
+ }
55
+ }
56
+ };
57
+
58
+ ts.addWidget({
59
+ id: 'formatter',
60
+ priority: 100,
61
+ options: {
62
+ formatter_column : {},
63
+ formatter_event : 'applyFormatter'
64
+ },
65
+ init: function( table ) {
66
+ ts.formatter.init( table.config );
67
+ }
68
+ });
69
+
70
+ })( jQuery );
@@ -1,4 +1,4 @@
1
- /*! tablesorter math widget - beta - updated 5/28/2014 (v2.17.1)
1
+ /*! tablesorter math widget - updated 2/7/2015 (v2.19.0)
2
2
  * Requires tablesorter v2.16+ and jQuery 1.7+
3
3
  * by Rob Garrison
4
4
  */
@@ -8,6 +8,8 @@
8
8
  "use strict";
9
9
 
10
10
  var ts = $.tablesorter,
11
+ events = ( 'tablesorter-initialized update updateAll updateRows addRows updateCell ' +
12
+ 'filterReset filterEnd recalculate ' ).split(' ').join('.tsmath '),
11
13
  math = {
12
14
 
13
15
  // get all of the row numerical values in an arry
@@ -183,7 +185,7 @@
183
185
  * (c)2011 ecava
184
186
  * Dual licensed under the MIT or GPL Version 2 licenses.
185
187
  */
186
- ts.formatMask = function(m, v, tmpPrefix, tmpSuffix){
188
+ ts.formatMask = function(m, v, tmpPrefix, tmpSuffix) {
187
189
  if ( !m || isNaN(+v) ) {
188
190
  return v; // return as it is.
189
191
  }
@@ -388,9 +390,13 @@
388
390
  },
389
391
  init : function(table, thisWidget, c, wo){
390
392
  c.$table
391
- .bind('tablesorter-initialized update updateRows addRows updateCell filterReset filterEnd '.split(' ').join('.tsmath '), function(e){
393
+ .unbind(events + ' updateComplete.tsmath')
394
+ .bind(events, function(e){
392
395
  var init = e.type === 'tablesorter-initialized';
393
- if (!wo.math_isUpdating || init) {
396
+ if (e.type === 'updateAll') {
397
+ // redo data-column indexes in case columns were rearranged
398
+ ts.computeColumnIndex( c.$table.children('tbody').children() );
399
+ } else if (!wo.math_isUpdating || init) {
394
400
  math.recalculate( table, c, wo, init );
395
401
  }
396
402
  })
@@ -403,9 +409,10 @@
403
409
  },
404
410
  // this remove function is called when using the refreshWidgets method or when destroying the tablesorter plugin
405
411
  // this function only applies to tablesorter v2.4+
406
- remove: function(table, c, wo){
412
+ remove: function(table, c, wo, refreshing){
413
+ if (refreshing) { return; }
407
414
  $(table)
408
- .unbind('tablesorter-initialized update updateRows addRows updateCell filterReset filterEnd '.split(' ').join('.tsmath '))
415
+ .unbind(events + ' updateComplete.tsmath')
409
416
  .find('[data-' + wo.math_data + ']').empty();
410
417
  }
411
418
  });
@@ -1,4 +1,4 @@
1
- /* Output widget (beta) for TableSorter 7/17/2014 (v2.17.5)
1
+ /* Output widget for TableSorter 2/7/2015 (v2.19.0)
2
2
  * Requires tablesorter v2.8+ and jQuery 1.7+
3
3
  * Modified from:
4
4
  * HTML Table to CSV: http://www.kunalbabre.com/projects/table2CSV.php (License unknown?)
@@ -20,7 +20,7 @@ output = ts.output = {
20
20
  regexBR : /(<br([\s\/])?>|\n)/g, // replace
21
21
  regexIMG : /<img[^>]+alt\s*=\s*['"]([^'"]+)['"][^>]*>/i, // match
22
22
  regexHTML : /<[^<]+>/g, // replace
23
-
23
+
24
24
  replaceCR : '\\n',
25
25
  replaceTab : '\\t',
26
26
 
@@ -192,7 +192,11 @@ output = ts.output = {
192
192
  // replace " with “ if undefined
193
193
  result = input.replace(/\"/g, wo.output_replaceQuote || '\u201c');
194
194
  // replace line breaks with \\n & tabs with \\t
195
- result = result.replace(output.regexBR, output.replaceCR).replace(/\t/g, output.replaceTab);
195
+ if (!wo.output_trimSpaces) {
196
+ result = result.replace(output.regexBR, output.replaceCR).replace(/\t/g, output.replaceTab);
197
+ } else {
198
+ result = result.replace(output.regexBR, '');
199
+ }
196
200
  // extract img alt text
197
201
  txt = result.match(output.regexIMG);
198
202
  if (!wo.output_includeHTML && txt !== null) {
@@ -1,4 +1,4 @@
1
- /* Pager widget for TableSorter 12/22/2014 (v2.18.4) - requires jQuery 1.7+ */
1
+ /* Pager widget for TableSorter 2/7/2015 (v2.19.0) - requires jQuery 1.7+ */
2
2
  /*jshint browser:true, jquery:true, unused:false */
3
3
  ;(function($){
4
4
  "use strict";
@@ -111,8 +111,8 @@ ts.addWidget({
111
111
  }
112
112
  tsp.moveToPage(table, c.pager, false);
113
113
  },
114
- remove: function(table, c){
115
- tsp.destroyPager(table, c);
114
+ remove: function(table, c, wo, refreshing){
115
+ tsp.destroyPager(table, c, refreshing);
116
116
  }
117
117
  });
118
118
 
@@ -138,7 +138,12 @@ tsp = ts.pager = {
138
138
  endRow: 0,
139
139
  ajaxCounter: 0,
140
140
  $size: null,
141
- last: {}
141
+ last: {},
142
+ // save original pager size
143
+ setSize: wo.pager_size,
144
+ setPage: wo.pager_startPage,
145
+ events: 'filterInit filterStart filterEnd sortEnd disable enable destroy updateComplete ' +
146
+ 'pageSize pageSet pageAndSize pagerUpdate '
142
147
  }, c.pager);
143
148
 
144
149
  // pager initializes multiple times before table has completed initialization
@@ -162,8 +167,8 @@ tsp = ts.pager = {
162
167
  p.initializing = true;
163
168
  if (wo.pager_savePages && ts.storage) {
164
169
  t = ts.storage(table, wo.pager_storageKey) || {}; // fixes #387
165
- p.page = isNaN(t.page) ? p.page : t.page;
166
- p.size = ( isNaN(t.size) ? p.size : t.size ) || 10;
170
+ p.page = ( isNaN(t.page) ? p.page : t.page ) || p.setPage || 1;
171
+ p.size = ( isNaN(t.size) ? p.size : t.size ) || p.setSize || 10;
167
172
  $.data(table, 'pagerLastSize', p.size);
168
173
  }
169
174
 
@@ -224,9 +229,9 @@ tsp = ts.pager = {
224
229
  s = wo.pager_selectors;
225
230
 
226
231
  c.$table
227
- .off('filterInit filterStart filterEnd sortEnd disable enable destroy updateComplete pageSize pageSet '.split(' ').join('.pager '))
228
- .on('filterInit.pager filterStart.pager', function(e) {
229
- p.currentFilters = c.$table.data('lastSearch');
232
+ .off(p.events.split(' ').join('.pager '))
233
+ .on('filterInit.pager filterStart.pager', function(e, filters) {
234
+ p.currentFilters = $.isArray(filters) ? filters : c.$table.data('lastSearch');
230
235
  // don't change page if filters are the same (pager updating, etc)
231
236
  if (e.type === 'filterStart' && wo.pager_pageReset !== false && (c.lastCombinedFilter || '') !== (p.currentFilters || []).join('')) {
232
237
  p.page = wo.pager_pageReset; // fixes #456 & #565
@@ -253,9 +258,9 @@ tsp = ts.pager = {
253
258
  e.stopPropagation();
254
259
  tsp.enablePager(table, c, true);
255
260
  })
256
- .on('destroy.pager', function(e){
261
+ .on('destroy.pager', function(e, refreshing){
257
262
  e.stopPropagation();
258
- tsp.destroyPager(table, c);
263
+ tsp.destroyPager(table, c, refreshing);
259
264
  })
260
265
  .on('updateComplete.pager', function(e, table, triggered){
261
266
  e.stopPropagation();
@@ -273,22 +278,32 @@ tsp = ts.pager = {
273
278
  }
274
279
  tsp.hideRows(table, c);
275
280
  tsp.changeHeight(table, c);
276
- tsp.updatePageDisplay(table, c);
281
+ // update without triggering pagerComplete
282
+ tsp.updatePageDisplay(table, c, false);
277
283
  // make sure widgets are applied - fixes #450
278
284
  c.$table.trigger('applyWidgets');
285
+ tsp.updatePageDisplay(table, c);
279
286
  })
280
- .on('pageSize.pager', function(e,v){
287
+ .on('pageSize.pager refreshComplete.pager', function(e,v){
281
288
  e.stopPropagation();
282
- tsp.setPageSize(table, parseInt(v, 10) || 10, c);
289
+ tsp.setPageSize(table, parseInt(v, 10) || p.setSize || 10, c);
283
290
  tsp.hideRows(table, c);
284
291
  tsp.updatePageDisplay(table, c, false);
285
- if (p.$size.length) { p.$size.val(p.size); } // twice?
286
292
  })
287
- .on('pageSet.pager', function(e,v){
293
+ .on('pageSet.pager pagerUpdate.pager', function(e,v){
288
294
  e.stopPropagation();
289
295
  p.page = (parseInt(v, 10) || 1) - 1;
290
- if (p.$goto.length) { p.$goto.val(c.size); } // twice?
296
+ // force pager refresh
297
+ if (e.type === 'pagerUpdate') { p.last.page = true; }
298
+ tsp.moveToPage(table, p, true);
299
+ tsp.updatePageDisplay(table, c, false);
300
+ })
301
+ .on('pageAndSize.pager', function(e, page, size){
302
+ e.stopPropagation();
303
+ p.page = (parseInt(page, 10) || 1) - 1;
304
+ tsp.setPageSize(table, parseInt(size, 10) || p.setSize || 10, c);
291
305
  tsp.moveToPage(table, p, true);
306
+ tsp.hideRows(table, c);
292
307
  tsp.updatePageDisplay(table, c, false);
293
308
  });
294
309
 
@@ -356,7 +371,8 @@ tsp = ts.pager = {
356
371
  },
357
372
 
358
373
  calcFilters: function(table, c) {
359
- var wo = c.widgetOptions,
374
+ var tbodyIndex,
375
+ wo = c.widgetOptions,
360
376
  p = c.pager,
361
377
  hasFilters = c.$table.hasClass('hasFilters');
362
378
  if (hasFilters && !wo.pager_ajaxUrl) {
@@ -364,8 +380,10 @@ tsp = ts.pager = {
364
380
  // delayInit: true so nothing is in the cache
365
381
  p.filteredRows = p.totalRows = c.$tbodies.eq(0).children('tr').not( wo.pager_countChildRows ? '' : '.' + c.cssChildRow ).length;
366
382
  } else {
383
+ // just in case the pager tbody isn't the first tbody
384
+ tbodyIndex = c.$table.children('tbody').index( c.$tbodies.eq(0) );
367
385
  p.filteredRows = 0;
368
- $.each(c.cache[0].normalized, function(i, el) {
386
+ $.each(c.cache[tbodyIndex].normalized, function(i, el) {
369
387
  p.filteredRows += p.regexRows.test(el[c.columns].$row[0].className) ? 0 : 1;
370
388
  });
371
389
  }
@@ -379,7 +397,7 @@ tsp = ts.pager = {
379
397
  var s, t, $out,
380
398
  wo = c.widgetOptions,
381
399
  p = c.pager,
382
- sz = p.size || 10; // don't allow dividing by zero
400
+ sz = p.size || p.setSize || 10; // don't allow dividing by zero
383
401
  if (wo.pager_countChildRows) { t.push(c.cssChildRow); }
384
402
  p.$size.add(p.$goto).removeClass(wo.pager_css.disabled).removeAttr('disabled').attr('aria-disabled', 'false');
385
403
  p.totalPages = Math.ceil( p.totalRows / sz ); // needed for "pageSize" method
@@ -389,8 +407,8 @@ tsp = ts.pager = {
389
407
  p.filteredPages = Math.ceil( p.filteredRows / sz ) || 0;
390
408
  if ( Math.min( p.totalPages, p.filteredPages ) >= 0 ) {
391
409
  t = (p.size * p.page > p.filteredRows) && completed;
392
- p.startRow = (t) ? 1 : (p.filteredRows === 0 ? 0 : p.size * p.page + 1);
393
- p.page = (t) ? 0 : p.page;
410
+ p.page = (t) ? wo.pager_pageReset || 0 : p.page;
411
+ p.startRow = (t) ? p.size * p.page + 1 : (p.filteredRows === 0 ? 0 : p.size * p.page + 1);
394
412
  p.endRow = Math.min( p.filteredRows, p.totalRows, p.size * ( p.page + 1 ) );
395
413
  $out = p.$container.find(wo.pager_selectors.pageDisplay);
396
414
  // form the output string (can now get a new output string from the server)
@@ -414,17 +432,16 @@ tsp = ts.pager = {
414
432
  }
415
433
  return extra.length > 1 && data && data[extra[0]] ? data[extra[0]][extra[1]] : p[str] || (data ? data[str] : deflt) || deflt;
416
434
  });
417
-
435
+ if ( p.$goto.length ) {
436
+ t = '';
437
+ $.each(tsp.buildPageSelect(p, c), function(i, opt){
438
+ t += '<option value="' + opt + '">' + opt + '</option>';
439
+ });
440
+ // innerHTML doesn't work in IE9 - http://support2.microsoft.com/kb/276228
441
+ p.$goto.html(t).val( p.page + 1 );
442
+ }
418
443
  if ($out.length) {
419
444
  $out[ ($out[0].tagName === 'INPUT') ? 'val' : 'html' ](s);
420
- if ( p.$goto.length ) {
421
- t = '';
422
- $.each(tsp.buildPageSelect(p, c), function(i, opt){
423
- t += '<option value="' + opt + '">' + opt + '</option>';
424
- });
425
- // innerHTML doesn't work in IE9 - http://support2.microsoft.com/kb/276228
426
- p.$goto.html(t).val( p.page + 1 );
427
- }
428
445
  // rebind startRow/page inputs
429
446
  $out.find('.ts-startRow, .ts-page').off('change').on('change', function(){
430
447
  var v = $(this).val(),
@@ -549,7 +566,9 @@ tsp = ts.pager = {
549
566
  s = ( p.page * p.size ),
550
567
  e = s + p.size,
551
568
  f = wo && wo.filter_filteredRow || 'filtered',
569
+ last = 0, // for cache indexing
552
570
  j = 0; // size counter
571
+ p.cacheIndex = [];
553
572
  for ( i = 0; i < l; i++ ){
554
573
  if ( !rows[i].className.match(f) ) {
555
574
  if (j === s && rows[i].className.match(c.cssChildRow)) {
@@ -557,6 +576,10 @@ tsp = ts.pager = {
557
576
  rows[i].style.display = 'none';
558
577
  } else {
559
578
  rows[i].style.display = ( j >= s && j < e ) ? '' : 'none';
579
+ if ( last !== j && j >= s && j < e ) {
580
+ p.cacheIndex.push(i);
581
+ last = j;
582
+ }
560
583
  // don't count child rows
561
584
  j += rows[i].className.match(c.cssChildRow + '|' + c.selectorRemove.slice(1)) && !wo.pager_countChildRows ? 0 : 1;
562
585
  if ( j === e && rows[i].style.display !== 'none' && rows[i].className.match(ts.css.cssHasChild) ) {
@@ -576,7 +599,7 @@ tsp = ts.pager = {
576
599
 
577
600
  hideRowsSetup: function(table, c){
578
601
  var p = c.pager;
579
- p.size = parseInt( p.$size.val(), 10 ) || p.size;
602
+ p.size = parseInt( p.$size.val(), 10 ) || p.size || p.setSize || 10;
580
603
  $.data(table, 'pagerLastSize', p.size);
581
604
  tsp.pagerArrows(c);
582
605
  if ( !c.widgetOptions.pager_removeRows ) {
@@ -682,12 +705,13 @@ tsp = ts.pager = {
682
705
  }
683
706
  // make sure last pager settings are saved, prevents multiple server side calls with
684
707
  // the same parameters
685
- p.totalPages = Math.ceil( p.totalRows / ( p.size || 10 ) );
708
+ p.totalPages = Math.ceil( p.totalRows / ( p.size || p.setSize || 10 ) );
686
709
  p.last.totalRows = p.totalRows;
687
710
  p.last.currentFilters = p.currentFilters;
688
711
  p.last.sortList = (c.sortList || []).join(',');
689
712
  p.initializing = false;
690
- tsp.updatePageDisplay(table, c);
713
+ // update display without triggering pager complete... before updating cache
714
+ tsp.updatePageDisplay(table, c, false);
691
715
  $t.trigger('updateCache', [function(){
692
716
  if (p.initialized) {
693
717
  // apply widgets after table has rendered & after a delay to prevent
@@ -696,6 +720,7 @@ tsp = ts.pager = {
696
720
  $t
697
721
  .trigger('applyWidgets')
698
722
  .trigger('pagerChange', p);
723
+ tsp.updatePageDisplay(table, c);
699
724
  }, 0);
700
725
  }
701
726
  }]);
@@ -800,6 +825,7 @@ tsp = ts.pager = {
800
825
  // lets not render the table more than once
801
826
  return tsp.moveToLastPage(table, p);
802
827
  }
828
+ p.cacheIndex = [];
803
829
  p.isDisabled = false; // needed because sorting will change the page and re-enable the pager
804
830
  if (p.initialized) { c.$table.trigger('pagerChange', c); }
805
831
  if ( !wo.pager_removeRows ) {
@@ -817,6 +843,7 @@ tsp = ts.pager = {
817
843
  count++;
818
844
  if (count > s && added <= e) {
819
845
  added++;
846
+ p.cacheIndex.push(index);
820
847
  $tb.append(rows[index]);
821
848
  }
822
849
  }
@@ -871,7 +898,8 @@ tsp = ts.pager = {
871
898
  if ( !$.isEmptyObject(table.config.cache) ) {
872
899
  var i,
873
900
  rows = [],
874
- n = table.config.cache[0].normalized;
901
+ tbodyIndex = c.$table.children('tbody').index( c.$tbodies.eq(0) ),
902
+ n = table.config.cache[tbodyIndex].normalized;
875
903
  p.totalRows = n.length;
876
904
  for (i = 0; i < p.totalRows; i++) {
877
905
  rows.push(n[i][c.columns].$row);
@@ -946,7 +974,7 @@ tsp = ts.pager = {
946
974
 
947
975
  setPageSize: function(table, size, c) {
948
976
  var p = c.pager;
949
- p.size = size || p.size || 10;
977
+ p.size = size || p.size || p.setSize || 10;
950
978
  p.$size.val(p.size);
951
979
  $.data(table, 'pagerLastPage', p.page);
952
980
  $.data(table, 'pagerLastSize', p.size);
@@ -981,14 +1009,15 @@ tsp = ts.pager = {
981
1009
  tsp.moveToPage(table, p, true);
982
1010
  },
983
1011
 
984
- destroyPager: function(table, c){
1012
+ destroyPager: function(table, c, refreshing){
985
1013
  var p = c.pager;
1014
+ p.initialized = false;
1015
+ c.$table.off(p.events.split(' ').join('.pager '));
1016
+ if (refreshing) { return; }
986
1017
  tsp.showAllRows(table, c);
987
1018
  p.$container.hide(); // hide pager
988
1019
  c.appender = null; // remove pager appender function
989
- p.initialized = false;
990
1020
  delete table.config.rowsCopy;
991
- c.$table.off('filterInit filterStart filterEnd sortEnd disable enable destroy updateComplete pageSize pageSet '.split(' ').join('.pager '));
992
1021
  if (ts.storage) {
993
1022
  ts.storage(table, c.widgetOptions.pager_storageKey, '');
994
1023
  }
@@ -998,7 +1027,7 @@ tsp = ts.pager = {
998
1027
  var info, p = c.pager;
999
1028
  p.isDisabled = false;
1000
1029
  p.page = $.data(table, 'pagerLastPage') || p.page || 0;
1001
- p.size = $.data(table, 'pagerLastSize') || parseInt(p.$size.find('option[selected]').val(), 10) || p.size || 10;
1030
+ p.size = $.data(table, 'pagerLastSize') || parseInt(p.$size.find('option[selected]').val(), 10) || p.size || p.setSize || 10;
1002
1031
  p.$size.val(p.size); // set page size
1003
1032
  p.totalPages = Math.ceil( Math.min( p.totalRows, p.filteredRows ) / p.size );
1004
1033
  c.$table.removeClass('pagerDisabled');
@@ -1026,7 +1055,7 @@ tsp = ts.pager = {
1026
1055
  if ( !p.ajax ) {
1027
1056
  c.rowsCopy = rows;
1028
1057
  p.totalRows = wo.pager_countChildRows ? c.$tbodies.eq(0).children('tr').length : rows.length;
1029
- p.size = $.data(table, 'pagerLastSize') || p.size || wo.pager_size || 10;
1058
+ p.size = $.data(table, 'pagerLastSize') || p.size || wo.pager_size || p.setSize || 10;
1030
1059
  p.totalPages = Math.ceil( p.totalRows / p.size );
1031
1060
  tsp.moveToPage(table, p);
1032
1061
  // update display here in case all rows are removed