/*** QuickSort ~ (C) 2005  Simon Bünzli  <zeniko@gmx.ch> ***/

var QuickSort = {
	onLoad: function()
	{
		this.tables = document.getElementsByTagName("TABLE");
		this._headers = [];
		
		for (var i = 0; i < this.tables.length; i++)
		{
			var table = this.tables[i];
			
			if (!/\bquicksort\b/.test(table.className))
			{ // nur Tabellen von der-CSS Klasse "quicksort" werden berücksichtigt
				continue;
			}
			
			var thead = table.createTHead();
			if (!thead.firstChild && table.tBodies[0].rows.length)
			{ // falls keine Kopfzeile vorhanden ist, verwende dafür die erste Datenzeile
				thead.appendChild(table.tBodies[0].rows[0]);
			}
			if (!table.tBodies[0] || table.tBodies[0].rows.length < 2)
			{ // Tabellen ohne Datenzeilen werden ignoriert
				continue;
			}
			
			var header = thead.firstChild;
			if (typeof QuickFilter == "object" && /QuickFilter\.onUpdate/.test(header.innerHTML))
			{ // QuickFilter fügt über der eigentlichen Kopfzeile eine zusätzliche Zeile ein
				header = header.nextSibling;
			}
			
			this._headers[i] = { node: header, sorting: -1 };
			
			for (var j = 0; j < header.cells.length; j++)
			{
				this._headers[i][j] = header.cells[j].innerHTML;
				this.makeHeader(i, j, true);
			}
		}
	},

	makeHeader: function(aTableNo, aColNo, aReverse)
	{
		var header = this._headers[aTableNo];
		
		if (header[aColNo])
		{ // nur betitelte Spalten sind sortierbar
			header.node.cells[aColNo].innerHTML = '<a href="javascript:QuickSort.sortTable(' + aTableNo + ', ' + aColNo + ', ' + !aReverse + ');">' + header[aColNo] + ((header.sorting == aColNo)?' ' + ((aReverse)?'&uarr;':'&darr;'):"") + '</a>';
		}
	},

	sortTable: function(aTableNo, aColNo, aReverse)
	{
		var tbody = this.tables[aTableNo].tBodies[0];
		var rows = new Array();
		
		for (var i = 0; i < tbody.rows.length; i++)
		{
			rows.push(tbody.rows[i]);
			var sortKey = (rows[i].cells[aColNo])?rows[i].cells[aColNo].innerHTML.replace(/<.*?>/g, "").toLowerCase():"";
			// sortiere nach Möglichkeit nummerisch
			rows[i].sortKey = (sortKey == parseFloat(sortKey))?parseFloat(sortKey):sortKey;
		}
		
		rows.sort(function(a, b)
		{
			return ((aReverse)?1:-1) * ((a.sortKey == b.sortKey)?0:((a.sortKey < b.sortKey)?-1:1));
		});
		
		for (i = 0; i < rows.length; i++)
		{
			tbody.insertBefore(rows[i], tbody.childNodes[0]);
		}
		
		this._headers[aTableNo].sorting = aColNo;
		for (i = 0; i < this._headers[aTableNo].node.cells.length; i++)
		{
			this.makeHeader(aTableNo, i, (i == aColNo)?aReverse:true);
		}
	}
};

QuickSort.__onload = window.onload;

window.onload = function(aEvent)
{
	if (QuickSort.__onload)
	{
		QuickSort.__onload(aEvent);
	}
	if (document.createElement && document.getElementsByTagName && document.body.innerHTML)
	{
		QuickSort.onLoad();
	}
}
