@@ -1,5 +1,5 @@
/*!
* TableSorter 2.3.2 - Client-side table sorting with ease!
* TableSorter 2.3.3 - Client-side table sorting with ease!
* @requires jQuery v1.2.6+
*
* Copyright (c) 2007 Christian Bach
@@ -18,7 +18,7 @@
$.extend({
tablesorter: new function() {

this.version = "2.3.2";
this.version = "2.3.3";

var parsers = [], widgets = [];
this.defaults = {
@@ -275,16 +275,16 @@
var c = table.config,
b = table.tBodies,
rows = [],
r, n, totalRows, checkCell,
r, n, totalRows, checkCell, c2 = c.cache,
f, i, j, k, l, pos, appendTime;
if (c.debug) {
appendTime = new Date();
}
for (k = 0; k < b.length; k++) {
if (!$(b[k]).hasClass(c.cssInfoBlock)){
f = document.createDocumentFragment();
r = c.cache[k].row;
n = c.cache[k].normalized;
r = c2[k].row;
n = c2[k].normalized;
totalRows = n.length;
checkCell = totalRows ? (n[0].length - 1) : 0;
for (i = 0; i < totalRows; i++) {
@@ -602,6 +602,8 @@
this.config = {};
// merge and extend.
c = config = $.extend(true, this.config, $.tablesorter.defaults, settings);

if (c.debug) { $.data( this, 'startoveralltimer', new Date()); }
// store common expression for speed
$this = $(this).addClass(c.tableClass);
// save the settings where they read
@@ -805,6 +807,9 @@

// initialized
this.hasInitialized = true;
if (c.debug) {
$.tablesorter.benchmark("Overall initialization time", $.data( this, 'startoveralltimer'));
}
$this.trigger('tablesorter-initialized', this);
if (typeof c.initialized === 'function') { c.initialized(this); }
});
@@ -903,18 +908,20 @@
// metadata, header option or header class name ("sorter-false")
// priority = jQuery data > meta > headers option > header class name
this.getData = function(h, ch, key) {
var val = '',
m = $.metadata ? h.metadata() : false,
cl = (h.length) ? h.attr('class') || '' : '';
if (h.length && h.data() && typeof h.data(key) !== 'undefined'){
val += h.data(key);
var val = '', $h = $(h),
m = $.metadata ? $h.metadata() : false,
cl = ' ' + ($h.length ? $h.attr('class') || '' : '');
if ($h.length && $h.data() && ( typeof $h.data(key) !== 'undefined' || typeof $h.data(key.toLowerCase()) !== 'undefined') ){
// "data-lockedOrder" is assigned to "lockedorder"; but "data-locked-order" is assigned to "lockedOrder"
// "data-sort-initial-order" is assigned to "sortInitialOrder"
val += $h.data(key) || $h.data(key.toLowerCase());
} else if (m && typeof m[key] !== 'undefined') {
val += m[key];
} else if (ch && typeof ch[key] !== 'undefined') {
val += ch[key];
} else if (cl && cl.match(key + '-')) {
} else if (cl && cl.match(' ' + key + '-')) {
// include sorter class name "sorter-text", etc
val = cl.match( new RegExp(key + '-(\\w+)') )[1] || '';
val = cl.match( new RegExp(' ' + key + '-(\\w+)') )[1] || '';
}
return $.trim(val);
};
@@ -1032,8 +1039,12 @@
return (/\d{1,4}[\/\-\,\.\s+]\d{1,4}[\/\-\.\,\s+]\d{1,4}/).test(s);
},
format: function(s, table, cell, cellIndex) {
var c = table.config,
format = ts.getData($(cell), c.headers[cellIndex], 'dateFormat') || c.dateFormat;
var c = table.config, ci = c.headerList[cellIndex],
format = ci.shortDateFormat;
if (typeof format === 'undefined') {
// cache header formatting so it doesn't getData for every cell in the column
format = ci.shortDateFormat = ts.getData( ci, c.headers[cellIndex], 'dateFormat') || c.dateFormat;
}
s = s.replace(/\s+/g," ").replace(/[\-|\.|\,]/g, "/");
if (format === "mmddyyyy") {
s = s.replace(/(\d{1,2})[\/\s](\d{1,2})[\/\s](\d{4})/, "$3/$1/$2");
@@ -1086,9 +1097,9 @@
ts.addWidget({
id: "zebra",
format: function(table) {
var $tr, $r, row, even, time, k,
var $tb, $tr, $f, row, even, time, k, j, l, n,
c = table.config,
child = c.cssChildRow,
child = new RegExp(c.cssChildRow, 'i'),
b = $(table).children('tbody:not(.' + c.cssInfoBlock + ')'),
css = [ "even", "odd" ];
// maintain backwards compatibility
@@ -1100,18 +1111,22 @@
for (k = 0; k < b.length; k++ ) {
row = 0;
// loop through the visible rows
$tr = $(b[k]).children('tr:visible');
if ($tr.length > 1) {
$tr.each(function() {
$r = $(this);
// style children rows the same way the parent row was styled
if (!$r.hasClass(child)) { row++; }
even = (row % 2 === 0);
$r
.removeClass(css[even ? 1 : 0])
.addClass(css[even ? 0 : 1]);
});
$tb = $(b[k]);
l = $tb.children('tr').length;
if (l > 1) {
$f = $(document.createDocumentFragment());
$tr = $tb.children('tr').appendTo($f);
for (j = 0; j < l; j++) {
if ($tr[j].style.display !== 'none') {
n = $tr[j].className;
// style children rows the same way the parent row was styled
if (!child.test(n)) { row++; }
even = (row % 2 === 0);
$tr[j].className = n.replace(/\s+/g,'').replace(css[0],'').replace(css[1],'') + ' ' + css[even ? 0 : 1];
}
}
}
$tb.append($tr);
}
if (c.debug) {
ts.benchmark("Applying Zebra widget", time);

Large diffs are not rendered by default.

@@ -1,8 +1,8 @@
/*! tableSorter 2.3 widgets - updated 5/11/2012
/*! tableSorter 2.3 widgets - updated 5/19/2012
*
* jQuery UI Theme
* Column Styles
* Column Filters
* Column Filters (not compatible with tablesorter v2.0.5)
* Sticky Header
* Column Resizing
* Save Sort
@@ -125,7 +125,7 @@ $.tablesorter.addWidget({
$.tablesorter.addWidget({
id: "columns",
format: function(table) {
var $tr, $td, time, last, rmv, k,
var $tb, $tr, $td, $f, time, last, rmv, i, j, k, l,
c = table.config,
b = $(table).children('tbody:not(.' + c.cssInfoBlock + ')'),
list = c.sortList,
@@ -142,23 +142,33 @@ $.tablesorter.addWidget({
// check if there is a sort (on initialization there may not be one)
if (list && list[0]) {
for (k = 0; k < b.length; k++ ) {
$tb = $(b[k]);
$f = $(document.createDocumentFragment());
$tr = $tb.children('tr').appendTo($f);
l = $tr.length;
// loop through the visible rows
$tr = $(b[k]).children('tr:visible');
$tr.each(function(i) {
$td = $(this).children().removeClass(rmv);
for (j = 0; j < l; j++) {
$td = $tr.eq(j).children().removeClass(rmv);
// primary sort column class
$td.eq(list[0][0]).addClass(css[0]);
if (len > 1) {
for (i=1; i<len; i++){
for (i = 1; i < len; i++){
// secondary, tertiary, etc sort column classes
$td.eq(list[i][0]).addClass( css[i] || css[last] );
}
}
});
}
$tb.append($tr);
}
} else {
// remove all column classes if sort is cleared (sortReset)
$(table).find('td').removeClass(rmv);
// $(table).find('td').removeClass(rmv); slow
$td = $(table).find('td');
len = $td.length;
rmv = new RegExp('(' + css.join('|') + ')');
for (i = 0; i < len; i++){
$td[i].className = $td[i].className.replace(rmv, '');
}
}
if (c.debug) {
$.tablesorter.benchmark("Applying Columns widget", time);
@@ -186,7 +196,13 @@ $.tablesorter.addWidget({
for (i=0; i < cols; i++){
fr += '<td><input type="search" data-col="' + i + '" class="' + css;
// use header option - headers: { 1: { filter: false } } OR add class="filter-false"
fr += $.tablesorter.getData(c.headerList[i], c.headers[i], 'filter') === 'false' ? ' disabled" disabled' : '"';
if ($.tablesorter.getData) {
// get data from jQuery data, metadata, headers option or header class name
fr += $.tablesorter.getData(c.headerList[i], c.headers[i], 'filter') === 'false' ? ' disabled" disabled' : '"';
} else {
// only class names and header options - keep this for compatibility with tablesorter v2.0.5
fr += ((c.headers[i] && c.headers[i].hasOwnProperty('filter') && c.headers[i].filter === false) || $(c.headerList[i]).is('.filter-false') ) ? ' disabled" disabled' : '"';
}
fr += '></td>';
}
$t
@@ -196,6 +212,7 @@ $.tablesorter.addWidget({
if (v.join('') === '') {
$t.find('tr').show();
} else {
// *** to do *** optimize this to work better with very large tables
$t.children('tbody:not(.' + c.cssInfoBlock + ')').children('tr:not(.' + c.cssChildRow + ')').each(function(){
r = true;
cr = $(this).nextUntil('tr:not(.' + c.cssChildRow + ')');
@@ -1,6 +1,6 @@
{
"name": "tablesorter",
"version": "2.3.2",
"version": "2.3.3",
"title": "tablesorter",
"author": {
"name": "Christian Bach",