jquery-tablesorter 1.15.0 → 1.16.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 (22) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/jquery-tablesorter/version.rb +1 -1
  4. data/vendor/assets/javascripts/jquery-tablesorter/addons/pager/jquery.tablesorter.pager.js +71 -30
  5. data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.js +109 -65
  6. data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.widgets.js +83 -62
  7. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-range.js +93 -0
  8. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-input-select.js +6 -4
  9. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-metric.js +1 -1
  10. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-columnSelector.js +4 -2
  11. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter-formatter-html5.js +2 -2
  12. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter-formatter-jui.js +2 -3
  13. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter-formatter-select2.js +1 -1
  14. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter-type-insideRange.js +42 -0
  15. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter.js +57 -45
  16. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-formatter.js +1 -1
  17. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-grouping.js +9 -7
  18. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-output.js +9 -1
  19. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-pager.js +68 -30
  20. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-scroller.js +41 -41
  21. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-stickyHeaders.js +25 -16
  22. metadata +4 -2
@@ -4,7 +4,7 @@
4
4
  ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██▀▀ ▀▀▀▀██
5
5
  █████▀ ▀████▀ ██ ██ ▀████▀ ██ ██ ██ ██ ▀████▀ █████▀ ██ ██ █████▀
6
6
  */
7
- /*! tablesorter (FORK) widgets - updated 02-20-2015 (v2.20.1)*/
7
+ /*! tablesorter (FORK) widgets - updated 03-05-2015 (v2.21.0)*/
8
8
  /* Includes: storage,uitheme,columns,filter,stickyHeaders,resizable,saveSort */
9
9
  /*! Widget: storage */
10
10
  ;(function ($, window, document) {
@@ -347,7 +347,10 @@ ts.addWidget({
347
347
 
348
348
  })(jQuery);
349
349
 
350
- /*! Widget: filter */
350
+ /*! Widget: filter - updated 3/5/2015 (v2.21.0) *//*
351
+ * Requires tablesorter v2.8+ and jQuery 1.7+
352
+ * by Rob Garrison
353
+ */
351
354
  ;(function ($) {
352
355
  'use strict';
353
356
  var ts = $.tablesorter = $.tablesorter || {};
@@ -558,7 +561,7 @@ ts.filter = {
558
561
  parsed = data.parsed[index],
559
562
  query = ts.filter.parseFilter(c, data.iFilter.replace(ts.filter.regex.orReplace, "|"), index, parsed);
560
563
  // look for an exact match with the "or" unless the "filter-match" class is found
561
- if (!c.$headers.filter('[data-column="' + index + '"]:last').hasClass('filter-match') && /\|/.test(query)) {
564
+ if (!c.$headerIndexed[index].hasClass('filter-match') && /\|/.test(query)) {
562
565
  // show all results while using filter match. Fixes #727
563
566
  if (query[ query.length - 1 ] === '|') { query += '*'; }
564
567
  query = data.anyMatch && $.isArray(data.rowArray) ? '(' + query + ')' : '^(' + query + ')$';
@@ -679,7 +682,7 @@ ts.filter = {
679
682
  fxn = ts.getColumnData( table, wo.filter_functions, column );
680
683
  if (fxn) {
681
684
  // remove "filter-select" from header otherwise the options added here are replaced with all options
682
- $header = c.$headers.filter('[data-column="' + column + '"]:last').removeClass('filter-select');
685
+ $header = c.$headerIndexed[column].removeClass('filter-select');
683
686
  // don't build select if "filter-false" or "parser-false" set
684
687
  noSelect = !($header.hasClass('filter-false') || $header.hasClass('parser-false'));
685
688
  options = '';
@@ -775,7 +778,8 @@ ts.filter = {
775
778
  }
776
779
  },
777
780
  filterInitComplete: function(c){
778
- var wo = c.widgetOptions,
781
+ var indx, len,
782
+ wo = c.widgetOptions,
779
783
  count = 0,
780
784
  completed = function(){
781
785
  wo.filter_initialized = true;
@@ -785,11 +789,12 @@ ts.filter = {
785
789
  if ( $.isEmptyObject( wo.filter_formatter ) ) {
786
790
  completed();
787
791
  } else {
788
- $.each( wo.filter_formatterInit, function(i, val) {
789
- if (val === 1) {
792
+ len = wo.filter_formatterInit.length;
793
+ for (indx = 0; indx < len; indx++) {
794
+ if (wo.filter_formatterInit[indx] === 1) {
790
795
  count++;
791
796
  }
792
- });
797
+ }
793
798
  clearTimeout(wo.filter_initTimer);
794
799
  if (!wo.filter_initialized && count === wo.filter_formatterCount) {
795
800
  // filter widget initialized
@@ -805,7 +810,7 @@ ts.filter = {
805
810
  },
806
811
 
807
812
  setDefaults: function(table, c, wo) {
808
- var isArray, saved, indx,
813
+ var isArray, saved, indx, col, $filters,
809
814
  // get current (default) filters
810
815
  filters = ts.getFilters(table) || [];
811
816
  if (wo.filter_saveFilters && ts.storage) {
@@ -816,8 +821,12 @@ ts.filter = {
816
821
  }
817
822
  // if no filters saved, then check default settings
818
823
  if (filters.join('') === '') {
819
- for (indx = 0; indx < c.columns; indx++) {
820
- filters[indx] = c.$headers.filter('[data-column="' + indx + '"]:last').attr(wo.filter_defaultAttrib) || filters[indx];
824
+ // allow adding default setting to external filters
825
+ $filters = c.$headers.add( wo.filter_$externalFilters ).filter('[' + wo.filter_defaultAttrib + ']');
826
+ for (indx = 0; indx <= c.columns; indx++) {
827
+ // include data-column="all" external filters
828
+ col = indx === c.columns ? 'all' : indx;
829
+ filters[indx] = $filters.filter('[data-column="' + col + '"]').attr(wo.filter_defaultAttrib) || filters[indx] || '';
821
830
  }
822
831
  }
823
832
  c.$table.data('lastSearch', filters);
@@ -846,7 +855,7 @@ ts.filter = {
846
855
  for (column = 0; column < columns; column++) {
847
856
  disabled = false;
848
857
  // assuming last cell of a column is the main column
849
- $header = c.$headers.filter('[data-column="' + column + '"]:last');
858
+ $header = c.$headerIndexed[column];
850
859
  ffxn = ts.getColumnData( table, wo.filter_functions, column );
851
860
  buildSelect = (wo.filter_functions && ffxn && typeof ffxn !== "function" ) ||
852
861
  $header.hasClass('filter-select');
@@ -1071,7 +1080,7 @@ ts.filter = {
1071
1080
  },
1072
1081
  multipleColumns: function( c, $input ) {
1073
1082
  // look for multiple columns "1-3,4-6,8" in data-column
1074
- var ranges, singles, indx,
1083
+ var temp, ranges, range, start, end, singles, i, indx, len,
1075
1084
  wo = c.widgetOptions,
1076
1085
  // only target "all" column inputs on initialization
1077
1086
  // & don't target "all" column inputs if they don't exist
@@ -1081,31 +1090,32 @@ ts.filter = {
1081
1090
  // process column range
1082
1091
  if ( targets && /-/.test( val ) ) {
1083
1092
  ranges = val.match( /(\d+)\s*-\s*(\d+)/g );
1084
- $.each(ranges, function(i,v){
1085
- var t,
1086
- range = v.split( /\s*-\s*/ ),
1087
- start = parseInt( range[0], 10 ) || 0,
1088
- end = parseInt( range[1], 10 ) || ( c.columns - 1 );
1089
- if ( start > end ) { t = start; start = end; end = t; } // swap
1093
+ len = ranges.length;
1094
+ for (indx = 0; indx < len; indx++) {
1095
+ range = ranges[indx].split( /\s*-\s*/ );
1096
+ start = parseInt( range[0], 10 ) || 0;
1097
+ end = parseInt( range[1], 10 ) || ( c.columns - 1 );
1098
+ if ( start > end ) { temp = start; start = end; end = temp; } // swap
1090
1099
  if ( end >= c.columns ) { end = c.columns - 1; }
1091
1100
  for ( ; start <= end; start++ ) {
1092
1101
  columns.push(start);
1093
1102
  }
1094
1103
  // remove processed range from val
1095
- val = val.replace( v, '' );
1096
- });
1104
+ val = val.replace( ranges[indx], '' );
1105
+ }
1097
1106
  }
1098
1107
  // process single columns
1099
1108
  if ( targets && /,/.test( val ) ) {
1100
1109
  singles = val.split( /\s*,\s*/ );
1101
- $.each( singles, function(i,v) {
1102
- if (v !== '') {
1103
- indx = parseInt( v, 10 );
1110
+ len = singles.length;
1111
+ for (i = 0; i < len; i++) {
1112
+ if (singles[i] !== '') {
1113
+ indx = parseInt( singles[i], 10 );
1104
1114
  if ( indx < c.columns ) {
1105
1115
  columns.push( indx );
1106
1116
  }
1107
1117
  }
1108
- });
1118
+ }
1109
1119
  }
1110
1120
  // return all columns
1111
1121
  if (!columns.length) {
@@ -1133,12 +1143,12 @@ ts.filter = {
1133
1143
  data.parsed = c.$headers.map(function(columnIndex) {
1134
1144
  return c.parsers && c.parsers[columnIndex] && c.parsers[columnIndex].parsed ||
1135
1145
  // getData won't return "parsed" if other "filter-" class names exist (e.g. <th class="filter-select filter-parsed">)
1136
- ts.getData && ts.getData(c.$headers.filter('[data-column="' + columnIndex + '"]:last'), ts.getColumnData( table, c.headers, columnIndex ), 'filter') === 'parsed' ||
1146
+ ts.getData && ts.getData(c.$headerIndexed[columnIndex], ts.getColumnData( table, c.headers, columnIndex ), 'filter') === 'parsed' ||
1137
1147
  $(this).hasClass('filter-parsed');
1138
1148
  }).get();
1139
1149
 
1140
1150
  if (c.debug) {
1141
- ts.log('Starting filter widget search', filters);
1151
+ ts.log('Filter: Starting filter widget search', filters);
1142
1152
  time = new Date();
1143
1153
  }
1144
1154
  // filtered rows count
@@ -1157,7 +1167,7 @@ ts.filter = {
1157
1167
  $rows = $( $.map(norm_rows, function(el){ return el[columnIndex].$row.get(); }) );
1158
1168
 
1159
1169
  if (combinedFilters === '' || wo.filter_serversideFiltering) {
1160
- $rows.removeClass(wo.filter_filteredRow).not('.' + c.cssChildRow).show();
1170
+ $rows.removeClass(wo.filter_filteredRow).not('.' + c.cssChildRow).css('display', '');
1161
1171
  } else {
1162
1172
  // filter out child rows
1163
1173
  $rows = $rows.not('.' + c.cssChildRow);
@@ -1209,14 +1219,14 @@ ts.filter = {
1209
1219
  // don't search only filtered if the value is negative ('> -10' => '> -100' will ignore hidden rows)
1210
1220
  !(/(>=?\s*-\d)/.test(val) || /(<=?\s*\d)/.test(val)) &&
1211
1221
  // if filtering using a select without a "filter-match" class (exact match) - fixes #593
1212
- !( val !== '' && c.$filters && c.$filters.eq(indx).find('select').length && !c.$headers.filter('[data-column="' + indx + '"]:last').hasClass('filter-match') );
1222
+ !( val !== '' && c.$filters && c.$filters.eq(indx).find('select').length && !c.$headerIndexed[indx].hasClass('filter-match') );
1213
1223
  }
1214
1224
  }
1215
1225
  notFiltered = $rows.not('.' + wo.filter_filteredRow).length;
1216
1226
  // can't search when all rows are hidden - this happens when looking for exact matches
1217
1227
  if (searchFiltered && notFiltered === 0) { searchFiltered = false; }
1218
1228
  if (c.debug) {
1219
- ts.log( "Searching through " + ( searchFiltered && notFiltered < len ? notFiltered : "all" ) + " rows" );
1229
+ ts.log( 'Filter: Searching through ' + ( searchFiltered && notFiltered < len ? notFiltered : 'all' ) + ' rows' );
1220
1230
  }
1221
1231
  if (data.anyMatchFlag) {
1222
1232
  if (c.sortLocaleCompare) {
@@ -1339,7 +1349,7 @@ ts.filter = {
1339
1349
  // data.iFilter = case insensitive (if wo.filter_ignoreCase is true), data.filter = case sensitive
1340
1350
  data.iFilter = wo.filter_ignoreCase ? (data.filter || '').toLocaleLowerCase() : data.filter;
1341
1351
  fxn = ts.getColumnData( table, wo.filter_functions, columnIndex );
1342
- $cell = c.$headers.filter('[data-column="' + columnIndex + '"]:last');
1352
+ $cell = c.$headerIndexed[columnIndex];
1343
1353
  hasSelect = $cell.hasClass('filter-select');
1344
1354
  if ( fxn || ( hasSelect && val ) ) {
1345
1355
  if (fxn === true || hasSelect) {
@@ -1347,10 +1357,10 @@ ts.filter = {
1347
1357
  result = ($cell.hasClass('filter-match')) ? data.iExact.search(data.iFilter) >= 0 : data.filter === data.exact;
1348
1358
  } else if (typeof fxn === 'function') {
1349
1359
  // filter callback( exact cell content, parser normalized content, filter input value, column index, jQuery row object )
1350
- result = fxn(data.exact, data.cache, data.filter, columnIndex, $rows.eq(rowIndex));
1360
+ result = fxn(data.exact, data.cache, data.filter, columnIndex, $rows.eq(rowIndex), c);
1351
1361
  } else if (typeof fxn[ffxn || data.filter] === 'function') {
1352
1362
  // selector option function
1353
- result = fxn[ffxn || data.filter](data.exact, data.cache, data.filter, columnIndex, $rows.eq(rowIndex));
1363
+ result = fxn[ffxn || data.filter](data.exact, data.cache, data.filter, columnIndex, $rows.eq(rowIndex), c);
1354
1364
  }
1355
1365
  } else {
1356
1366
  filterMatched = null;
@@ -1377,8 +1387,8 @@ ts.filter = {
1377
1387
  }
1378
1388
  }
1379
1389
  $rows.eq(rowIndex)
1380
- .toggle(showRow)
1381
- .toggleClass(wo.filter_filteredRow, !showRow);
1390
+ .toggleClass(wo.filter_filteredRow, !showRow)[0]
1391
+ .display = showRow ? '' : 'none';
1382
1392
  if (childRow.length) {
1383
1393
  childRow.toggleClass(wo.filter_filteredRow, !showRow);
1384
1394
  }
@@ -1404,7 +1414,7 @@ ts.filter = {
1404
1414
  },
1405
1415
  getOptionSource: function(table, column, onlyAvail) {
1406
1416
  table = $(table)[0];
1407
- var cts,
1417
+ var cts, indx, len,
1408
1418
  c = table.config,
1409
1419
  wo = c.widgetOptions,
1410
1420
  parsed = [],
@@ -1442,16 +1452,17 @@ ts.filter = {
1442
1452
  return $.inArray(value, arry) === indx;
1443
1453
  });
1444
1454
 
1445
- if (c.$headers.filter('[data-column="' + column + '"]:last').hasClass('filter-select-nosort')) {
1455
+ if (c.$headerIndexed[column].hasClass('filter-select-nosort')) {
1446
1456
  // unsorted select options
1447
1457
  return arry;
1448
1458
  } else {
1459
+ len = arry.length;
1449
1460
  // parse select option values
1450
- $.each(arry, function(i, v){
1461
+ for (indx = 0; indx < len; indx++) {
1451
1462
  // parse array data using set column parser; this DOES NOT pass the original
1452
1463
  // table cell to the parser format function
1453
- parsed.push({ t : v, p : c.parsers && c.parsers[column].format( v, table, [], column ) });
1454
- });
1464
+ parsed.push({ t : arry[indx], p : c.parsers && c.parsers[column].format( arry[indx], table, [], column ) });
1465
+ }
1455
1466
 
1456
1467
  // sort parsed select options
1457
1468
  cts = c.textSorter || '';
@@ -1473,9 +1484,10 @@ ts.filter = {
1473
1484
  });
1474
1485
  // rebuild arry from sorted parsed data
1475
1486
  arry = [];
1476
- $.each(parsed, function(i, v){
1477
- arry.push(v.t);
1478
- });
1487
+ len = parsed.length;
1488
+ for (indx = 0; indx < len; indx++) {
1489
+ arry.push( parsed[indx].t );
1490
+ }
1479
1491
  return arry;
1480
1492
  }
1481
1493
  },
@@ -1495,7 +1507,7 @@ ts.filter = {
1495
1507
  // check if has class filtered
1496
1508
  if (onlyAvail && row.className.match(wo.filter_filteredRow)) { continue; }
1497
1509
  // get non-normalized cell content
1498
- if (wo.filter_useParsedData || c.parsers[column].parsed || c.$headers.filter('[data-column="' + column + '"]:last').hasClass('filter-parsed')) {
1510
+ if (wo.filter_useParsedData || c.parsers[column].parsed || c.$headerIndexed[column].hasClass('filter-parsed')) {
1499
1511
  arry.push( '' + cache.normalized[rowIndex][column] );
1500
1512
  } else {
1501
1513
  cell = row.cells[column];
@@ -1514,7 +1526,7 @@ ts.filter = {
1514
1526
  var indx, val, txt, t, $filters, $filter,
1515
1527
  c = table.config,
1516
1528
  wo = c.widgetOptions,
1517
- node = c.$headers.filter('[data-column="' + column + '"]:last'),
1529
+ node = c.$headerIndexed[column],
1518
1530
  // t.data('placeholder') won't work in jQuery older than 1.4.3
1519
1531
  options = '<option value="">' + ( node.data('placeholder') || node.attr('data-placeholder') || wo.filter_placeholder.select || '' ) + '</option>',
1520
1532
  // Get curent filter value
@@ -1569,7 +1581,7 @@ ts.filter = {
1569
1581
  columns = c.columns;
1570
1582
  // build default select dropdown
1571
1583
  for (columnIndex = 0; columnIndex < columns; columnIndex++) {
1572
- $header = c.$headers.filter('[data-column="' + columnIndex + '"]:last');
1584
+ $header = c.$headerIndexed[columnIndex];
1573
1585
  noSelect = !($header.hasClass('filter-false') || $header.hasClass('parser-false'));
1574
1586
  // look for the filter-select class; build/update it if found
1575
1587
  if (($header.hasClass('filter-select') || ts.getColumnData( table, wo.filter_functions, columnIndex ) === true) && noSelect) {
@@ -1655,7 +1667,10 @@ ts.setFilters = function(table, filter, apply, skipFirst) {
1655
1667
 
1656
1668
  })(jQuery);
1657
1669
 
1658
- /*! Widget: stickyHeaders */
1670
+ /*! Widget: stickyHeaders - updated 3/5/2015 (v2.21.0) *//*
1671
+ * Requires tablesorter v2.8+ and jQuery 1.4.3+
1672
+ * by Rob Garrison
1673
+ */
1659
1674
  ;(function ($, window) {
1660
1675
  'use strict';
1661
1676
  var ts = $.tablesorter = $.tablesorter || {};
@@ -1663,6 +1678,7 @@ var ts = $.tablesorter = $.tablesorter || {};
1663
1678
  $.extend(ts.css, {
1664
1679
  sticky : 'tablesorter-stickyHeader', // stickyHeader
1665
1680
  stickyVis : 'tablesorter-sticky-visible',
1681
+ stickyHide: 'tablesorter-sticky-hidden',
1666
1682
  stickyWrap: 'tablesorter-sticky-wrapper'
1667
1683
  });
1668
1684
 
@@ -1731,6 +1747,7 @@ ts.addWidget({
1731
1747
  return;
1732
1748
  }
1733
1749
  var $table = c.$table,
1750
+ // add position: relative to attach element, hopefully it won't cause trouble.
1734
1751
  $attach = $(wo.stickyHeaders_attachTo),
1735
1752
  namespace = c.namespace + 'stickyheaders ',
1736
1753
  // element to watch for the scroll event
@@ -1740,8 +1757,7 @@ ts.addWidget({
1740
1757
  $header = $thead.children('tr').not('.sticky-false').children(),
1741
1758
  $tfoot = $table.children('tfoot'),
1742
1759
  $stickyOffset = isNaN(wo.stickyHeaders_offset) ? $(wo.stickyHeaders_offset) : '',
1743
- stickyOffset = $attach.length ? 0 : $stickyOffset.length ?
1744
- $stickyOffset.height() || 0 : parseInt(wo.stickyHeaders_offset, 10) || 0,
1760
+ stickyOffset = $stickyOffset.length ? $stickyOffset.height() || 0 : parseInt(wo.stickyHeaders_offset, 10) || 0,
1745
1761
  // is this table nested? If so, find parent sticky header wrapper (div, not table)
1746
1762
  $nestedSticky = $table.parent().closest('.' + ts.css.table).hasClass('hasStickyHeaders') ?
1747
1763
  $table.parent().closest('table.tablesorter')[0].config.widgetOptions.$sticky.parent() : [],
@@ -1750,14 +1766,16 @@ ts.addWidget({
1750
1766
  $stickyTable = wo.$sticky = $table.clone()
1751
1767
  .addClass('containsStickyHeaders ' + ts.css.sticky + ' ' + wo.stickyHeaders)
1752
1768
  .wrap('<div class="' + ts.css.stickyWrap + '">'),
1753
- $stickyWrap = $stickyTable.parent().css({
1754
- position : $attach.length ? 'absolute' : 'fixed',
1755
- padding : parseInt( $stickyTable.parent().parent().css('padding-left'), 10 ),
1756
- top : stickyOffset + nestedStickyTop,
1757
- left : 0,
1758
- visibility : 'hidden',
1759
- zIndex : wo.stickyHeaders_zIndex || 2
1760
- }),
1769
+ $stickyWrap = $stickyTable.parent()
1770
+ .addClass(ts.css.stickyHide)
1771
+ .css({
1772
+ position : $attach.length ? 'absolute' : 'fixed',
1773
+ padding : parseInt( $stickyTable.parent().parent().css('padding-left'), 10 ),
1774
+ top : stickyOffset + nestedStickyTop,
1775
+ left : 0,
1776
+ visibility : 'hidden',
1777
+ zIndex : wo.stickyHeaders_zIndex || 2
1778
+ }),
1761
1779
  $stickyThead = $stickyTable.children('thead:first'),
1762
1780
  $stickyCells,
1763
1781
  laststate = '',
@@ -1800,6 +1818,10 @@ ts.addWidget({
1800
1818
  setWidth( $table, $stickyTable );
1801
1819
  setWidth( $header, $stickyCells );
1802
1820
  };
1821
+ // only add a position relative if a position isn't already defined
1822
+ if ($attach.length && !$attach.css('position')) {
1823
+ $attach.css('position', 'relative');
1824
+ }
1803
1825
  // save stickyTable element to config
1804
1826
  // it is also saved to wo.$sticky
1805
1827
  if (c.$extraTables && c.$extraTables.length) {
@@ -1846,8 +1868,7 @@ ts.addWidget({
1846
1868
  if (!$table.is(':visible')) { return; } // fixes #278
1847
1869
  // Detect nested tables - fixes #724
1848
1870
  nestedStickyTop = $nestedSticky.length ? $nestedSticky.offset().top - $yScroll.scrollTop() + $nestedSticky.height() : 0;
1849
- var prefix = 'tablesorter-sticky-',
1850
- offset = $table.offset(),
1871
+ var offset = $table.offset(),
1851
1872
  yWindow = $.isWindow( $yScroll[0] ), // $.isWindow needs jQuery 1.4.3
1852
1873
  xWindow = $.isWindow( $xScroll[0] ),
1853
1874
  // scrollTop = ( $attach.length ? $attach.offset().top : $yScroll.scrollTop() ) + stickyOffset + nestedStickyTop,
@@ -1857,7 +1878,7 @@ ts.addWidget({
1857
1878
  cssSettings = { visibility : isVisible };
1858
1879
 
1859
1880
  if ($attach.length) {
1860
- cssSettings.top = yWindow ? scrollTop : $attach.scrollTop();
1881
+ cssSettings.top = yWindow ? scrollTop - $attach.offset().top : $attach.scrollTop();
1861
1882
  }
1862
1883
  if (xWindow) {
1863
1884
  // adjust when scrolling horizontally - fixes issue #143
@@ -1867,8 +1888,8 @@ ts.addWidget({
1867
1888
  cssSettings.top = ( cssSettings.top || 0 ) + stickyOffset + nestedStickyTop;
1868
1889
  }
1869
1890
  $stickyWrap
1870
- .removeClass(prefix + 'visible ' + prefix + 'hidden')
1871
- .addClass(prefix + isVisible)
1891
+ .removeClass( ts.css.stickyVis + ' ' + ts.css.stickyHide )
1892
+ .addClass( isVisible === 'visible' ? ts.css.stickyVis : ts.css.stickyHide )
1872
1893
  .css(cssSettings);
1873
1894
  if (isVisible !== laststate || event.type === 'resize') {
1874
1895
  // make sure the column widths match
@@ -0,0 +1,93 @@
1
+ /*!
2
+ * Range date parsers
3
+ * 2/23/2015 (v2.21.0)
4
+ */
5
+ /* Include the widget-filter-type-insideRange.js to filter ranges */
6
+ /*jshint jquery:true */
7
+ ;(function($){
8
+ 'use strict';
9
+
10
+ var regex = {
11
+ mdy : /(\d{1,2}[-\s]\d{1,2}[-\s]\d{4}(\s+\d{1,2}:\d{2}(:\d{2})?(\s+[AP]M)?)?)/gi,
12
+
13
+ dmy : /(\d{1,2}[-\s]\d{1,2}[-\s]\d{4}(\s+\d{1,2}:\d{2}(:\d{2})?(\s+[AP]M)?)?)/gi,
14
+ dmyreplace : /(\d{1,2})[-\s](\d{1,2})[-\s](\d{4})/,
15
+
16
+ ymd : /(\d{4}[-\s]\d{1,2}[-\s]\d{1,2}(\s+\d{1,2}:\d{2}(:\d{2})?(\s+[AP]M)?)?)/gi,
17
+ ymdreplace : /(\d{4})[-\s](\d{1,2})[-\s](\d{1,2})/
18
+ };
19
+
20
+ /*! date-range MMDDYYYY *//* (2/15/2000 - 5/18/2000) */
21
+ $.tablesorter.addParser({
22
+ id: 'date-range-mdy',
23
+ is: function () {
24
+ return false;
25
+ },
26
+ format: function (text) {
27
+ var date, str, i, len,
28
+ parsed = [];
29
+ str = text.replace( /\s+/g, ' ' ).replace( /[\/\-.,]/g, '-' ).match( regex.mdy );
30
+ len = str && str.length;
31
+ // work on dates, even if there is no range
32
+ if ( len ) {
33
+ for (i = 0; i < len; i++) {
34
+ date = new Date( str[i] );
35
+ parsed.push( date instanceof Date && isFinite(date) ? date.getTime() : str[i] );
36
+ }
37
+ // sort from min to max
38
+ return parsed.sort().join( ' - ' );
39
+ }
40
+ return text;
41
+ },
42
+ type: 'text'
43
+ });
44
+
45
+ /*! date-range DDMMYYYY *//* (15/2/2000 - 18/5/2000) */
46
+ $.tablesorter.addParser({
47
+ id: 'date-range-dmy',
48
+ is: function () {
49
+ return false;
50
+ },
51
+ format: function (text) {
52
+ var date, str, i, len,
53
+ parsed = [];
54
+ str = text.replace( /\s+/g, ' ' ).replace( /[\/\-.,]/g, '-' ).match( regex.dmy );
55
+ len = str && str.length;
56
+ if ( len ) {
57
+ for (i = 0; i < len; i++) {
58
+ date = new Date( ( '' + str[i] ).replace( regex.dmyreplace, '$2/$1/$3' ) );
59
+ parsed.push( date instanceof Date && isFinite(date) ? date.getTime() : str[i] );
60
+ }
61
+ // sort from min to max
62
+ return parsed.sort().join( ' - ' );
63
+ }
64
+ return text;
65
+ },
66
+ type: 'text'
67
+ });
68
+
69
+ /*! date-range DDMMYYYY *//* (2000/2/15 - 2000/5/18) */
70
+ $.tablesorter.addParser({
71
+ id: 'date-range-ymd',
72
+ is: function () {
73
+ return false;
74
+ },
75
+ format: function (text) {
76
+ var date, str, i, len,
77
+ parsed = [];
78
+ str = text.replace( /\s+/g, ' ' ).replace( /[\/\-.,]/g, '-' ).match( regex.ymd );
79
+ len = str && str.length;
80
+ if ( len ) {
81
+ for (i = 0; i < len; i++) {
82
+ date = new Date( ( '' + str[i] ).replace( regex.ymdreplace, '$2/$3/$1' ) );
83
+ parsed.push( date instanceof Date && isFinite(date) ? date.getTime() : str[i] );
84
+ }
85
+ // sort from min to max
86
+ return parsed.sort().join( ' - ' );
87
+ }
88
+ return text;
89
+ },
90
+ type: 'text'
91
+ });
92
+
93
+ })(jQuery);