$.tablesorter.addWidget({
	id: 'group',
	format: function(table) {
		var previous = null;
		var sortIndex = $('.header', table).index($('.headerSortDown,.headerSortUp', table));
		
		// clean up from last time
		$('tr.group-key', table).remove();
		
		if (sortIndex < 0) return;
		
		// put in the group headers
		for (var i = 0; i < table.tBodies[0].rows.length; i++) {
			try {
				var current = table.tBodies[0].rows[i].cells[sortIndex];
			} catch (e) { }
			if (current == null || current == undefined) continue;
			
			var val = current.innerHTML;
			if (current.getAttribute('group-key') != null) {
				val = current.getAttribute('group-key');
			}
			if (val != previous) {
				if (val != null && val != '') {
					$("tbody tr:eq(" + i + ")", table).before(
						"<tr class='group-key'><th class='group-cell' colspan='" + table.tBodies[0].rows[i].cells.length + "'>" + val + "</th></tr>"
					);
				}
				i++;
				previous = val;
			}
		}
	}
});
