/*

Sortable Table
Copyright © 2010 Federman Scripts
Author: David Federman
Website: http://federmanscripts.com
Last Updated: 7/22/2010

This Javascript is freely available for public use and modification, but
please give credit where credit is due.

*/
function initSortableTables()
{
	var tables = document.getElementsByTagName('table');
	for(var i = 0; i < tables.length; i++)
	{
		var classes = tables[i].className.split(' ');
		for(var j = 0; j < classes.length; j++)
			if(classes[j] == 'sortable')
				initSortableTable(tables[i]);
	}
}

function initSortableTable(table)
{
	var defaultSort = null;
	var row = table.tHead.rows[0];
	for (var i = 0; i < row.cells.length; i++) 
	{
		var cell = row.cells[i];
		cell.style.cursor = 'pointer';
		cell.column = i;
		cell.onclick = function()
		{
			sortableTableHeaderClicked(this);
		}
		
		var classes = cell.className.split(' ');
		for(var j = 0; j < classes.length; j++)
			if(classes[j] == 'defaultSort')
				defaultSort = cell;
	}
	
	if(defaultSort != null)
		sortableTableHeaderClicked(defaultSort);
}

function sortableTableHeaderClicked(obj)
{
	if(obj.tagName == null)
		obj = this;
	var column = obj.column;
	var table = obj;
	while (table.tagName.toLowerCase() != 'table') 
		table = table.parentNode;

	// check if number, date, or custom
	var isNumber = false;
	var isDate = false;
	var isCustom = false;
	var customFunc = null;
	if(table.tHead.rows[0].cells[column].className)
	{
		var classes = table.tHead.rows[0].cells[column].className.split(' ');
		for(var i = 0; i < classes.length; i++)
		{
			if(classes[i] == 'number')
				isNumber = true;
			if(classes[i] == 'date')
				isDate = true;
			if(classes[i].substring(0, 7) == 'custom_')
			{
				isCustom = true;
				customFunc = classes[i].substring(7);
			}
		}
	}

	var dir;
	if (table.oldColumn == column) 
	{
		dir = false;
		table.oldColumn = null;
	}
	else 
	{
		dir = true;
		table.oldColumn = column;
	}
		
	var newBody = document.createElement('tbody');
	var rows = table.tBodies[0].rows;
	var b = false;
	while (rows.length > 0) 
	{
		var min = 0;
		for (var i = 1; i < rows.length; i++) 
		{
			var thisText = document.all ? rows[i].cells[column].innerText : rows[i].cells[column].textContent;
			var thatText = document.all ? rows[min].cells[column].innerText : rows[min].cells[column].textContent;
			
			if(isNumber)
			{
				thisText = parseFloat(thisText);
				thatText = parseFloat(thatText);
			}

			if(isDate)
			{
				thisText = Date.parse(thisText);
				thatText = Date.parse(thatText);
			}

			if(isCustom)
			{
				thisText = eval(customFunc + '(thisText, thatText)');
				thatText = 0;
			}

			if (dir && thisText < thatText) 
				min = i;
			if (!dir && thisText > thatText) 
				min = i;
		}
		rows[min].className = b ? 'even' : 'odd';
		newBody.appendChild(rows[min]);
		b = !b;
	}
	
	table.appendChild(newBody);
	table.removeChild(table.tBodies[0]);
}

// setup onload
if (window.addEventListener)
	window.addEventListener('load', initSortableTables, false);
else if (window.attachEvent)
	window.attachEvent('onload', initSortableTables);
else
	window.onload = initSortableTables;
