jquery-tablesorter 1.15.0 → 1.16.0

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