jquery-tablesorter 1.5.0 → 1.6.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.
@@ -1,4 +1,4 @@
1
- /*! Filter widget formatter functions - updated 6/4/2013
1
+ /*! Filter widget formatter functions - updated 10/10/2013
2
2
  * requires: tableSorter 2.7.7+ and jQuery 1.4.3+
3
3
  *
4
4
  * uiSpinner (jQuery UI spinner)
@@ -488,7 +488,7 @@ $.tablesorter.filterFormatter = {
488
488
  changeYear : true,
489
489
  numberOfMonths : 1
490
490
  }, defDate),
491
- t, closeFrom, $shcell = [],
491
+ t, closeTo, closeFrom, $shcell = [],
492
492
  // Add a hidden input to hold the range values
493
493
  $input = $('<input class="dateRange" type="hidden">')
494
494
  .appendTo($cell)
@@ -502,7 +502,7 @@ $.tablesorter.filterFormatter = {
502
502
  } else if (v.match('>=')) {
503
503
  closeFrom( v.replace('>=', '') );
504
504
  } else if (v.match('<=')) {
505
- o.onClose( v.replace('<=', '') );
505
+ closeTo( v.replace('<=', '') );
506
506
  }
507
507
  }),
508
508
  c = $cell.closest('table')[0].config;
@@ -516,18 +516,18 @@ $.tablesorter.filterFormatter = {
516
516
  // add callbacks; preserve added callbacks
517
517
  o.oldonClose = o.onClose;
518
518
 
519
- o.defaultDate = o.from || o.defaultDate;
519
+ var localfrom = o.defaultDate = o.from || o.defaultDate;
520
520
 
521
521
  closeFrom = o.onClose = function( selectedDate, ui ) {
522
- var from = new Date($cell.find('.dateFrom').datepicker('getDate')).getTime() || '',
523
- to = new Date($cell.find('.dateTo').datepicker('getDate')).getTime() || '',
522
+ var from = new Date( selectedDate ).getTime() || '',
523
+ to = new Date( $cell.find('.dateTo').datepicker('getDate') ).getTime() || '',
524
524
  range = from ? ( to ? from + ' - ' + to : '>=' + from ) : (to ? '<=' + to : '');
525
525
  $cell
526
- .find('.dateTo').datepicker('option', 'minDate', selectedDate ).end()
527
- .find('.dateFrom').val(selectedDate).end()
528
- // update hidden input
529
526
  .find('.dateRange').val(range)
530
- .trigger('search');
527
+ .trigger('search').end()
528
+ .find('.dateTo').datepicker('option', 'minDate', selectedDate ).end()
529
+ .find('.dateFrom').val(selectedDate);
530
+
531
531
  // update sticky header cell
532
532
  if ($shcell.length) {
533
533
  $shcell
@@ -538,16 +538,18 @@ $.tablesorter.filterFormatter = {
538
538
  };
539
539
 
540
540
  $cell.find('.dateFrom').datepicker(o);
541
+
541
542
  o.defaultDate = o.to || '+7d'; // set to date +7 days from today (if not defined)
542
- o.onClose = function( selectedDate, ui ) {
543
+ closeTo = o.onClose = function( selectedDate, ui ) {
543
544
  var from = new Date( $cell.find('.dateFrom').datepicker('getDate') ).getTime() || '',
544
- to = new Date( $cell.find('.dateTo').datepicker('getDate') ).getTime() || '',
545
+ to = new Date( selectedDate ).getTime() || '',
545
546
  range = from ? ( to ? from + ' - ' + to : '>=' + from ) : (to ? '<=' + to : '');
546
547
  $cell
547
- .find('.dateFrom').datepicker('option', 'maxDate', selectedDate ).end()
548
- .find('.dateTo').val(selectedDate).end()
549
548
  .find('.dateRange').val(range)
550
- .trigger('search');
549
+ .trigger('search').end()
550
+ .find('.dateFrom').datepicker('option', 'maxDate', selectedDate ).end()
551
+ .find('.dateTo').val(selectedDate);
552
+
551
553
  // update sticky header cell
552
554
  if ($shcell.length) {
553
555
  $shcell
@@ -561,24 +563,27 @@ $.tablesorter.filterFormatter = {
561
563
  // has sticky headers?
562
564
  c.$table.bind('stickyHeadersInit', function(){
563
565
  $shcell = c.widgetOptions.$sticky.find('.tablesorter-filter-row').children().eq(indx).empty();
566
+ $shcell.append(t);
567
+
564
568
  // add a jQuery datepicker!
565
- $shcell.append(t).find('.dateTo').datepicker(o);
566
- o.defaultDate = o.from || o.defaultDate || new Date();
569
+ o.onClose = closeTo;
570
+ $shcell.find('.dateTo').datepicker(o);
571
+
572
+ o.defaultDate = localfrom;
567
573
  o.onClose = closeFrom;
568
574
  $shcell.find('.dateFrom').datepicker(o);
569
575
  });
570
576
 
571
577
  // on reset
572
578
  $cell.closest('table').bind('filterReset', function(){
573
- $cell.find('.dateFrom, .dateTo').val('');
579
+ $cell.find('.dateFrom, .dateTo').val('').datepicker('option', 'currentText', '' );
574
580
  if ($shcell.length) {
575
- $shcell.find('.dateFrom, .dateTo').val('');
581
+ $shcell.find('.dateFrom, .dateTo').val('').datepicker('option', 'currentText', '' );
576
582
  }
577
583
  });
578
584
 
579
585
  // return the hidden input so the filter widget has a reference to it
580
- t = o.from ? ( o.to ? o.from + ' - ' + o.to : '>=' + o.from ) : (o.to ? '<=' + o.to : '');
581
- return $input.val( t );
586
+ return $input.val( o.from ? ( o.to ? o.from + ' - ' + o.to : '>=' + o.from ) : (o.to ? '<=' + o.to : '') );
582
587
  },
583
588
 
584
589
  /**********************\
@@ -22,8 +22,8 @@ ts.themes = {
22
22
  footerCells: '',
23
23
  icons : '', // add "icon-white" to make them white; this icon class is added to the <i> in the header
24
24
  sortNone : 'bootstrap-icon-unsorted',
25
- sortAsc : 'icon-chevron-up',
26
- sortDesc : 'icon-chevron-down',
25
+ sortAsc : 'icon-chevron-up glyphicon glyphicon-chevron-up',
26
+ sortDesc : 'icon-chevron-down glyphicon glyphicon-chevron-down',
27
27
  active : '', // applied when column is sorted
28
28
  hover : '', // use custom css here - bootstrap class may not override it
29
29
  filterRow : '', // filter row class
@@ -88,7 +88,7 @@ ts.storage = function(table, key, val){
88
88
  v = (d !== 0) ? $.parseJSON(k[d] || '{}') : {};
89
89
  }
90
90
  }
91
- // allow val to be an empty string to
91
+ // allow val to be an empty string to
92
92
  if ((val || val === '') && window.JSON && JSON.hasOwnProperty('stringify')){
93
93
  // add unique identifiers = url pathname > table ID/index on page > data
94
94
  if (!v[url]) {
@@ -195,7 +195,7 @@ ts.addWidget({
195
195
  }
196
196
  if (c.cssIcon){
197
197
  // if c.cssIcon is '', then no <i> is added to the header
198
- $h.find('.' + c.cssIcon).addClass(o.icons);
198
+ $h.find('.' + ts.css.icon).addClass(o.icons);
199
199
  }
200
200
  if ($t.hasClass('hasFilters')){
201
201
  $h.find('.tablesorter-filter-row').addClass(o.filterRow);
@@ -203,14 +203,14 @@ ts.addWidget({
203
203
  }
204
204
  $.each($h, function(i){
205
205
  $el = $(this);
206
- $tar = (c.cssIcon) ? $el.find('.' + c.cssIcon) : $el;
206
+ $tar = (ts.css.icon) ? $el.find('.' + ts.css.icon) : $el;
207
207
  if (this.sortDisabled){
208
208
  // no sort arrows for disabled columns!
209
209
  $el.removeClass(rmv);
210
210
  $tar.removeClass(rmv + ' tablesorter-icon ' + o.icons);
211
211
  } else {
212
212
  t = ($t.hasClass('hasStickyHeaders')) ? $t.find(sh).find('th').eq(i).add($el) : $el;
213
- klass = ($el.hasClass(c.cssAsc)) ? o.sortAsc : ($el.hasClass(c.cssDesc)) ? o.sortDesc : $el.hasClass(c.cssHeader) ? o.sortNone : '';
213
+ klass = ($el.hasClass(ts.css.sortAsc)) ? o.sortAsc : ($el.hasClass(ts.css.sortDesc)) ? o.sortDesc : $el.hasClass(ts.css.header) ? o.sortNone : '';
214
214
  $el[klass === o.sortNone ? 'removeClass' : 'addClass'](o.active);
215
215
  $tar.removeClass(rmv).addClass(klass);
216
216
  }
@@ -227,7 +227,7 @@ ts.addWidget({
227
227
  rmv = o.sortNone + ' ' + o.sortDesc + ' ' + o.sortAsc;
228
228
  $t
229
229
  .removeClass('tablesorter-' + theme + ' ' + o.table)
230
- .find(c.cssHeader).removeClass(o.header);
230
+ .find(ts.css.header).removeClass(o.header);
231
231
  $h
232
232
  .unbind('mouseenter.tsuitheme mouseleave.tsuitheme') // remove hover
233
233
  .removeClass(o.hover + ' ' + rmv + ' ' + o.active)
@@ -287,20 +287,16 @@ ts.addWidget({
287
287
  ts.processTbody(table, $tb, false);
288
288
  }
289
289
  // add classes to thead and tfoot
290
- $tr = wo.columns_thead !== false ? 'thead tr' : '';
290
+ $tr = wo.columns_thead !== false ? ['thead tr'] : [];
291
291
  if (wo.columns_tfoot !== false) {
292
- $tr += ($tr === '' ? '' : ',') + 'tfoot tr';
292
+ $tr.push('tfoot tr');
293
293
  }
294
294
  if ($tr.length) {
295
- $t = $tbl.find($tr).children().removeClass(rmv);
296
- if (list && list[0]){
297
- // primary sort column class
298
- $t.filter('[data-column="' + list[0][0] + '"]').addClass(css[0]);
299
- if (len > 1){
300
- for (i = 1; i < len; i++){
301
- // secondary, tertiary, etc sort column classes
302
- $t.filter('[data-column="' + list[i][0] + '"]').addClass(css[i] || css[last]);
303
- }
295
+ $t = $tbl.find($tr.join(',')).children().removeClass(rmv);
296
+ if (len){
297
+ for (i = 0; i < len; i++){
298
+ // add primary. secondary, tertiary, etc sort column classes
299
+ $t.filter('[data-column="' + list[i][0] + '"]').addClass(css[i] || css[last]);
304
300
  }
305
301
  }
306
302
  }
@@ -332,7 +328,7 @@ ts.addWidget({
332
328
  options : {
333
329
  filter_childRows : false, // if true, filter includes child row content in the search
334
330
  filter_columnFilters : true, // if true, a filter will be added to the top of each table column
335
- filter_cssFilter : 'tablesorter-filter', // css class name added to the filter row & each input in the row
331
+ filter_cssFilter : '', // css class name added to the filter row & each input in the row (tablesorter-filter is ALWAYS added)
336
332
  filter_filteredRow : 'filtered', // class added to filtered rows; needed by pager plugin
337
333
  filter_formatter : null, // add custom filter elements to the filter row
338
334
  filter_functions : null, // add custom filter functions using this option
@@ -353,7 +349,7 @@ ts.addWidget({
353
349
  "child" : /tablesorter-childRow/, // child row class name; this gets updated in the script
354
350
  "filtered" : /filtered/, // filtered (hidden) row class name; updated in the script
355
351
  "type" : /undefined|number/, // check type
356
- "exact" : /(^[\"|\'|=])|([\"|\'|=]$)/g, // exact match
352
+ "exact" : /(^[\"|\'|=]+)|([\"|\'|=]+$)/g, // exact match (allow '==')
357
353
  "nondigit" : /[^\w,. \-()]/g, // replace non-digits (from digit & currency parser)
358
354
  "operators" : /[<>=]/g // replace operators
359
355
  }
@@ -365,9 +361,8 @@ ts.addWidget({
365
361
  fmt = ts.formatFloat,
366
362
  last = '', // save last filter search
367
363
  $ths = c.$headers,
368
- css = wo.filter_cssFilter,
369
364
  $t = c.$table.addClass('hasFilters'),
370
- b = $t.find('tbody'),
365
+ b = c.$tbodies,
371
366
  cols = c.parsers.length,
372
367
  parsed, time, timer,
373
368
 
@@ -403,7 +398,7 @@ ts.addWidget({
403
398
  var $tb, $tr, $td, cr, r, l, ff, time, r1, r2, searchFiltered;
404
399
  if (c.debug) { time = new Date(); }
405
400
  for (k = 0; k < b.length; k++ ){
406
- if (b.eq(k).hasClass(c.cssInfoBlock)) { continue; } // ignore info blocks, issue #264
401
+ if (b.eq(k).hasClass(ts.css.info)) { continue; } // ignore info blocks, issue #264
407
402
  $tb = ts.processTbody(table, b.eq(k), true);
408
403
  $tr = $tb.children('tr:not(.' + c.cssChildRow + ')');
409
404
  l = $tr.length;
@@ -444,6 +439,8 @@ ts.addWidget({
444
439
  }
445
440
  xi = !wo.filter_regex.type.test(typeof x) && wo.filter_ignoreCase ? x.toLocaleLowerCase() : x;
446
441
  ff = r; // if r is true, show that row
442
+ // replace accents - see #357
443
+ v[i] = c.sortLocaleCompare ? ts.replaceAccents(v[i]) : v[i];
447
444
  // val = case insensitive, v[i] = case sensitive
448
445
  val = wo.filter_ignoreCase ? v[i].toLocaleLowerCase() : v[i];
449
446
  if (wo.filter_functions && wo.filter_functions[i]){
@@ -452,10 +449,10 @@ ts.addWidget({
452
449
  ff = ($ths.filter('[data-column="' + i + '"]:last').hasClass('filter-match')) ? xi.search(val) >= 0 : v[i] === x;
453
450
  } else if (typeof wo.filter_functions[i] === 'function'){
454
451
  // filter callback( exact cell content, parser normalized content, filter input value, column index )
455
- ff = wo.filter_functions[i](x, c.cache[k].normalized[j][i], v[i], i);
452
+ ff = wo.filter_functions[i](x, c.cache[k].normalized[j][i], v[i], i, $tr.eq(j));
456
453
  } else if (typeof wo.filter_functions[i][v[i]] === 'function'){
457
454
  // selector option function
458
- ff = wo.filter_functions[i][v[i]](x, c.cache[k].normalized[j][i], v[i], i);
455
+ ff = wo.filter_functions[i][v[i]](x, c.cache[k].normalized[j][i], v[i], i, $tr.eq(j));
459
456
  }
460
457
  // Look for regex
461
458
  } else if (wo.filter_regex.regex.test(val)){
@@ -578,7 +575,7 @@ ts.addWidget({
578
575
  arry = (ts.sortText) ? arry.sort(function(a, b){ return ts.sortText(table, a, b, i); }) : arry.sort(true);
579
576
 
580
577
  // Get curent filter value
581
- currentVal = $t.find('thead').find('select.' + css + '[data-column="' + i + '"]').val();
578
+ currentVal = $t.find('thead').find('select.tablesorter-filter[data-column="' + i + '"]').val();
582
579
 
583
580
  // build option list
584
581
  for (k = 0; k < arry.length; k++){
@@ -586,7 +583,7 @@ ts.addWidget({
586
583
  // replace quotes - fixes #242 & ignore empty strings - see http://stackoverflow.com/q/14990971/145346
587
584
  o += arry[k] !== '' ? '<option value="' + t + '"' + (currentVal === t ? ' selected="selected"' : '') +'>' + arry[k] + '</option>' : '';
588
585
  }
589
- $t.find('thead').find('select.' + css + '[data-column="' + i + '"]')[ updating ? 'html' : 'append' ](o);
586
+ $t.find('thead').find('select.tablesorter-filter[data-column="' + i + '"]')[ updating ? 'html' : 'append' ](o);
590
587
  },
591
588
  buildDefault = function(updating){
592
589
  // build default select dropdown
@@ -605,7 +602,7 @@ ts.addWidget({
605
602
  // delay filtering
606
603
  clearTimeout(timer);
607
604
  timer = setTimeout(function(){
608
- checkFilters(filter);
605
+ checkFilters(filter);
609
606
  }, wo.filter_liveSearch ? wo.filter_searchDelay : 10);
610
607
  } else {
611
608
  // skip delay
@@ -658,7 +655,7 @@ ts.addWidget({
658
655
  }
659
656
  }
660
657
  if (t) {
661
- t.addClass(css).attr('data-column', i);
658
+ t.addClass('tablesorter-filter ' + wo.filter_cssFilter).attr('data-column', i);
662
659
  if (dis) {
663
660
  t.addClass('disabled')[0].disabled = true; // disabled!
664
661
  }
@@ -672,7 +669,7 @@ ts.addWidget({
672
669
  buildDefault(true);
673
670
  }
674
671
  if (e.type === 'filterReset') {
675
- $t.find('.' + css).val('');
672
+ searching([]);
676
673
  }
677
674
  if (e.type === 'filterEnd') {
678
675
  buildDefault(true);
@@ -683,7 +680,7 @@ ts.addWidget({
683
680
  }
684
681
  return false;
685
682
  })
686
- .find('input.' + css).bind('keyup search', function(e, filter){
683
+ .find('input.tablesorter-filter').bind('keyup search', function(e, filter){
687
684
  // emulate what webkit does.... escape clears the filter
688
685
  if (e.which === 27) {
689
686
  this.value = '';
@@ -701,8 +698,8 @@ ts.addWidget({
701
698
  }).get();
702
699
 
703
700
  // reset button/link
704
- if (wo.filter_reset && $(wo.filter_reset).length){
705
- $(wo.filter_reset).bind('click.tsfilter', function(){
701
+ if (wo.filter_reset){
702
+ $(document).delegate(wo.filter_reset, 'click.tsfilter', function(){
706
703
  $t.trigger('filterReset');
707
704
  });
708
705
  }
@@ -722,7 +719,7 @@ ts.addWidget({
722
719
  ff += '<option value="' + str + '">' + str + '</option>';
723
720
  }
724
721
  }
725
- $t.find('thead').find('select.' + css + '[data-column="' + col + '"]').append(ff);
722
+ $t.find('thead').find('select.tablesorter-filter[data-column="' + col + '"]').append(ff);
726
723
  }
727
724
  }
728
725
  }
@@ -731,7 +728,7 @@ ts.addWidget({
731
728
  // it would append the same options twice.
732
729
  buildDefault(true);
733
730
 
734
- $t.find('select.' + css).bind('change search', function(e, filter){
731
+ $t.find('select.tablesorter-filter').bind('change search', function(e, filter){
735
732
  checkFilters(filter);
736
733
  });
737
734
 
@@ -752,8 +749,8 @@ ts.addWidget({
752
749
  // $(':focus') needs jQuery 1.6+
753
750
  if ($(document.activeElement).closest('tr')[0] !== ft[0]){
754
751
  // get all filter values
755
- all = $t.find('.' + wo.filter_cssFilter).map(function(){
756
- return $(this).val() || '';
752
+ all = $t.find('.tablesorter-filter').map(function(){
753
+ return $(this).val() || '';
757
754
  }).get().join('');
758
755
  // don't hide row if any filter has a value
759
756
  if (all === ''){
@@ -768,7 +765,7 @@ ts.addWidget({
768
765
  clearTimeout(st);
769
766
  st = setTimeout(function(){
770
767
  // don't hide row if any filter has a value
771
- if ($t.find('.' + wo.filter_cssFilter).map(function(){ return $(this).val() || ''; }).get().join('') === ''){
768
+ if ($t.find('.tablesorter-filter').map(function(){ return $(this).val() || ''; }).get().join('') === ''){
772
769
  ft2[ e.type === 'focus' ? 'removeClass' : 'addClass']('hideme');
773
770
  }
774
771
  }, 200);
@@ -778,7 +775,7 @@ ts.addWidget({
778
775
  // show processing icon
779
776
  if (c.showProcessing) {
780
777
  $t.bind('filterStart.tsfilter filterEnd.tsfilter', function(e, v) {
781
- var fc = (v) ? $t.find('.' + c.cssHeader).filter('[data-column]').filter(function(){
778
+ var fc = (v) ? $t.find('.' + ts.css.header).filter('[data-column]').filter(function(){
782
779
  return v[$(this).data('column')] !== '';
783
780
  }) : '';
784
781
  ts.isProcessing($t[0], e.type === 'filterStart', v ? fc : '');
@@ -791,10 +788,13 @@ ts.addWidget({
791
788
  // add default values
792
789
  $t.bind('tablesorter-initialized', function(){
793
790
  ff = ts.getFilters(table);
794
- for (i = 0; i < ff.length; i++) {
795
- ff[i] = $ths.filter('[data-column="' + i + '"]:last').attr(wo.filter_defaultAttrib) || ff[i];
791
+ // ff is undefined when filter_columnFilters = false
792
+ if (ff) {
793
+ for (i = 0; i < ff.length; i++) {
794
+ ff[i] = $ths.filter('[data-column="' + i + '"]:last').attr(wo.filter_defaultAttrib) || ff[i];
795
+ }
796
+ ts.setFilters(table, ff, true);
796
797
  }
797
- ts.setFilters(table, ff, true);
798
798
  });
799
799
  // filter widget initialized
800
800
  $t.trigger('filterInit');
@@ -815,20 +815,20 @@ ts.addWidget({
815
815
  $tb.children().removeClass(wo.filter_filteredRow).show();
816
816
  ts.processTbody(table, $tb, false); // restore tbody
817
817
  }
818
- if (wo.filterreset) { $(wo.filter_reset).unbind('click.tsfilter'); }
818
+ if (wo.filterreset) { $(document).undelegate(wo.filter_reset, 'click.tsfilter'); }
819
819
  }
820
820
  });
821
821
  ts.getFilters = function(table) {
822
822
  var c = table ? $(table)[0].config : {};
823
823
  if (c && c.widgetOptions && !c.widgetOptions.filter_columnFilters) { return $(table).data('lastSearch'); }
824
- return c && c.$filters ? c.$filters.find('.' + c.widgetOptions.filter_cssFilter).map(function(i, el) {
824
+ return c && c.$filters ? c.$filters.find('.tablesorter-filter').map(function(i, el) {
825
825
  return $(el).val();
826
826
  }).get() || [] : false;
827
827
  };
828
828
  ts.setFilters = function(table, filter, apply) {
829
829
  var $t = $(table),
830
830
  c = $t.length ? $t[0].config : {},
831
- valid = c && c.$filters ? c.$filters.find('.' + c.widgetOptions.filter_cssFilter).each(function(i, el) {
831
+ valid = c && c.$filters ? c.$filters.find('.tablesorter-filter').each(function(i, el) {
832
832
  $(el).val(filter[i] || '');
833
833
  }).trigger('change.tsfilter') || false : false;
834
834
  if (apply) { $t.trigger('search', [filter, false]); }
@@ -837,14 +837,14 @@ ts.setFilters = function(table, filter, apply) {
837
837
 
838
838
  // Widget: Sticky headers
839
839
  // based on this awesome article:
840
- // http://css-tricks.com/13465-persistent-headers/
840
+ // http://css-tricks.com/13465-persistent-headers/
841
841
  // and https://github.com/jmosbech/StickyTableHeaders by Jonas Mosbech
842
842
  // **************************
843
843
  ts.addWidget({
844
844
  id: "stickyHeaders",
845
845
  priority: 60,
846
846
  options: {
847
- stickyHeaders : 'tablesorter-stickyHeader',
847
+ stickyHeaders : '', // extra class name added to the sticky header row
848
848
  stickyHeaders_offset : 0, // number or jquery selector targeting the position:fixed element
849
849
  stickyHeaders_cloneId : '-sticky', // added to table ID, if it exists
850
850
  stickyHeaders_addResizeEvent : true, // trigger "resize" event on headers
@@ -859,7 +859,7 @@ ts.addWidget({
859
859
  hdrCells = header.children('tr:not(.sticky-false)').children(),
860
860
  innr = '.tablesorter-header-inner',
861
861
  tfoot = $t.find('tfoot'),
862
- filterInputs = '.' + (wo.filter_cssFilter || 'tablesorter-filter'),
862
+ filterInputs = '.tablesorter-filter',
863
863
  $stickyOffset = isNaN(wo.stickyHeaders_offset) ? $(wo.stickyHeaders_offset) : '',
864
864
  stickyOffset = $stickyOffset.length ? $stickyOffset.height() || 0 : parseInt(wo.stickyHeaders_offset, 10) || 0,
865
865
  stickyzIndex = wo.stickyHeaders_zIndex ? wo.stickyHeaders_zIndex : 2,
@@ -872,7 +872,7 @@ ts.addWidget({
872
872
  visibility : 'hidden',
873
873
  zIndex : stickyzIndex
874
874
  }),
875
- stkyHdr = $stickyTable.children('thead:first').addClass(wo.stickyHeaders),
875
+ stkyHdr = $stickyTable.children('thead:first').addClass('tablesorter-stickyHeader ' + wo.stickyHeaders),
876
876
  stkyCells,
877
877
  laststate = '',
878
878
  spacing = 0,
@@ -924,11 +924,11 @@ ts.addWidget({
924
924
  t
925
925
  .attr('class', $(this).attr('class'))
926
926
  // remove processing icon
927
- .removeClass(c.cssProcessing);
927
+ .removeClass(ts.css.processing + ' ' + c.cssProcessing);
928
928
  if (c.cssIcon){
929
929
  t
930
- .find('.' + c.cssIcon)
931
- .attr('class', $(this).find('.' + c.cssIcon).attr('class'));
930
+ .find('.' + ts.css.icon)
931
+ .attr('class', $(this).find('.' + ts.css.icon).attr('class'));
932
932
  }
933
933
  });
934
934
  })
@@ -1008,7 +1008,7 @@ ts.addWidget({
1008
1008
  c.$table
1009
1009
  .removeClass('hasStickyHeaders')
1010
1010
  .unbind('sortEnd.tsSticky pagerComplete.tsSticky')
1011
- .find('.' + wo.stickyHeaders).remove();
1011
+ .find('.tablesorter-stickyHeader').remove();
1012
1012
  if (wo.$sticky && wo.$sticky.length) { wo.$sticky.remove(); } // remove cloned table
1013
1013
  // don't unbind if any table on the page still has stickyheaders applied
1014
1014
  if (!$('.hasStickyHeaders').length) {
@@ -9,22 +9,9 @@
9
9
  .tablesorter-bootstrap tfoot th,
10
10
  .tablesorter-bootstrap tfoot td {
11
11
  font: bold 14px/20px Arial, Sans-serif;
12
- position: relative;
13
- padding: 8px;
12
+ padding: 4px;
14
13
  margin: 0 0 18px;
15
- list-style: none;
16
- background-color: #FBFBFB;
17
- background-image: -moz-linear-gradient(top, white, #efefef);
18
- background-image: -ms-linear-gradient(top, white, #efefef);
19
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(white), to(#efefef));
20
- background-image: -webkit-linear-gradient(top, white, #efefef);
21
- background-image: -o-linear-gradient(top, white, #efefef);
22
- background-image: linear-gradient(to bottom, white, #efefef);
23
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#efefef', GradientType=0);
24
- background-repeat: repeat-x;
25
- -webkit-box-shadow: inset 0 1px 0 white;
26
- -moz-box-shadow: inset 0 1px 0 #ffffff;
27
- box-shadow: inset 0 1px 0 white;
14
+ background-color: #eee;
28
15
  }
29
16
 
30
17
  .tablesorter-bootstrap .tablesorter-header {
@@ -38,6 +25,7 @@
38
25
 
39
26
  /* bootstrap uses <i> for icons */
40
27
  .tablesorter-bootstrap .tablesorter-header i {
28
+ font-size: 11px;
41
29
  position: absolute;
42
30
  right: 2px;
43
31
  top: 50%;
@@ -97,7 +85,7 @@ caption {
97
85
  cursor: not-allowed;
98
86
  }
99
87
  .tablesorter-bootstrap .tablesorter-filter-row td {
100
- background: #eee;
88
+ background: #efefef;
101
89
  line-height: normal;
102
90
  text-align: center;
103
91
  padding: 4px 6px;
@@ -131,6 +119,10 @@ caption {
131
119
  .tablesorter-bootstrap .tablesorter-pager .pagedisplay {
132
120
  border: 0;
133
121
  }
122
+ /* tfoot i for pager controls */
123
+ .tablesorter-bootstrap tfoot i {
124
+ font-size: 11px;
125
+ }
134
126
 
135
127
  /* ajax error row */
136
128
  .tablesorter .tablesorter-errorRow td {