$('th').click(function() {
		var table = $(this).parents('table').eq(0)
		var rows = table.find('tr:gt(0)').toArray().sort(comparer($(this).index()))
		this.asc = !this.asc
		if (!this.asc) {
		  rows = rows.reverse()
		}
		for (var i = 0; i < rows.length; i++) {
		  table.append(rows[i])
		}
		setIcon($(this), this.asc);
});

function comparer(index) {
		return function(a, b) {
		  var valA = getCellValue(a, index),
			valB = getCellValue(b, index)
		  return $.isNumeric(valA) && $.isNumeric(valB) ? valA - valB : valA.localeCompare(valB)
		}
}

function getCellValue(row, index) {
		return $(row).children('td').eq(index).html()
}

function setIcon(element, asc) {
		$("th").each(function(index) {
		  $(this).removeClass("sorting");
		  $(this).removeClass("asc");
		  $(this).removeClass("desc");
		});
		element.addClass("sorting");
		if (asc) element.addClass("asc");
		else element.addClass("desc");
}
