/*
	Copyright 2006, Dynamic Tools
	This Dynamic Table code is licensed to mike@netequality.org under a Developer License.
	The terms and conditions of this license can be found at
	http://dynamictable.com/license/DeveloperLicense.html
*/
function dynamicTableInit(table, allowColumnHiding)
{
	var headerRow = table.getElementsByTagName('thead');
	var headerRow = table.getElementsByTagName('thead');
	var rows = table.getElementsByTagName('tr');
	var rowStart = headerRow.length ? 0 : 1;
	headerRow = headerRow.length ? headerRow[0].getElementsByTagName('tr') : [];
	headerRow = headerRow.length ? headerRow[0] : rows[0];

	var headerCells = dynamicTableInitTableHeader(headerRow);
	var rowLength = headerCells.length;

	var tbody = table.getElementsByTagName('tbody');
	tbody = tbody.length ? tbody[0] : null;	
	if (tbody) rows = tbody.getElementsByTagName('tr');
	var length = rows.length;

	var data = [];
	var date = null;	
	var regExp = /<\/?[^>]+>/gi;
	
	var tableCache = [];

	for (var i=rowStart; i < length; i++)
	{
		data[i-rowStart] = [];		
		var cells = rows[i].getElementsByTagName('td');

		tableCache[i] = [];
		for (var j=0; j < rowLength; j++)
		{
			tableCache[i][j] = cells[j];
			data[i-rowStart][j] = valueCalc(cells[j].innerHTML, j);
		}
		data[i-rowStart][rowLength] = rows[i];		
	}

	var compareFunctions = [];
	for (var i=0; i < rowLength; i++) compareFunctions.push(dynamicTableGenericComparison(i));

	table.dataObject = {'headerCells':headerCells, 'data':data, 'sortOrder':0, 'sortColumn':null, 'compareFunctions':compareFunctions};
};

var dtRegExp1 = /<\/?[^>]+>/gi;
var dtRegExp2 = /[,|$]/g;
var dtEmptySpace = '';
var dtDate = null;

function valueCalc(datum)
{
	datum = datum.replace(dtRegExp1,dtEmptySpace);
	if (datum == dtEmptySpace) return datum;
	else if (!isNaN(datum.replace(dtRegExp2, dtEmptySpace) - 0)) return datum.replace(dtRegExp2, dtEmptySpace) - 0;
	else if (window['parseDate'] && (dtDate = parseDate(datum))) return dtDate.getTime();
	return datum;
}

function dynamicTableInitTableHeader(headerRow)
{
	var headers = headerRow.getElementsByTagName('th');
	if (!headers.length) headers = headerRow.getElementsByTagName('td');
	var length = headers.length;
	for (var i=0; i < length; i++) dynamicTableInitHeader(headers[i], i);
	return headers;
};

function dynamicTableInitHeader(headerCell, colNum)
{
	headerCell.onclick = function () { dynamicTableSortTable(this, colNum); };
};

function dynamicTableGenericComparison(colNum)
{	
	function f(r1, r2)
	{	
		var v1 = r1[colNum];
		var v2 = r2[colNum];

		if (v1 == v2) return 0;
		if (v1 > v2) return 1;
		return -1;
	};
	
	return f;
};

function dynamicTableSortTable(element, columnNum)
{
	while (element.parentNode && element.nodeName != 'TABLE') element = element.parentNode;
	if (!element.parentNode) return;

	var dataObject = element.dataObject;
	if (!dataObject) initDynamicTable(element);

	if (dataObject.sortColumn != null)
	{		
		removeClassFromElement(dataObject.headerCells[dataObject.sortColumn], dataObject.sortOrder ? 'sortDesc' : 'sortAsc');
	}

	if (dataObject.sortColumn == columnNum)
	{
		var oldData = dataObject.data;
		var dataLength = oldData.length;					
		dataObject.data = [];
		for (var i=0; i < dataLength; i++) dataObject.data[i] = oldData[dataLength - i - 1];
		dataObject.sortOrder = dataObject.sortOrder ? 0 : 1;
	}
	else
	{	
		sortFunction = dataObject.compareFunctions[columnNum];
		dataObject.data.sort(sortFunction);
		dataObject.sortColumn = columnNum;
		dataObject.sortOrder = 0;
	}
	addClassToElement(dataObject.headerCells[dataObject.sortColumn], dataObject.sortOrder ? 'sortDesc' : 'sortAsc');
	dynamicTableUpdateTable(element);
};		

function dynamicTableUpdateTable(table)
{
	var tbody = table.getElementsByTagName('tr')[1].parentNode;
	var data = table.dataObject.data;
	var rowIndex = data[0].length - 1;
	var dataLength = data.length;
	for (var i=0; i < dataLength; i++) tbody.appendChild(data[i][rowIndex]);
};

function addClassToElement(element, className)
{
	element.className = element.className ? element.className + ' ' + className : className;
};

function removeClassFromElement(element, className)
{
	if (element.className == className) element.className = null;
	else element.className = element.className.replace(' ' + className, '');
};
