// rekursive Funktion, die das nächste Elternelement mit dem angegebenen Tag findet.
function getParent(el, pTagName) {
	if (el == null) return null;
	else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase())	// Gecko bug, supposed to be uppercase
		return el;
	else
		return getParent(el.parentNode, pTagName);
}

/*
 * cssjs
 * written by Christian Heilmann (http://icant.co.uk)
 * eases the dynamic application of CSS classes via DOM
 * parameters: action a, object o and class names c1 and c2 (c2 optional)
 * actions: swap exchanges c1 and c2 in object o
 *			add adds class c1 to object o
 *			remove removes class c1 from object o
 *			check tests if class c1 is applied to object o
 * example:	cssjs('swap',document.getElementById('foo'),'bar','baz');
 */

function cssjs(a,o,c1,c2)
{
	switch (a){
		case 'swap':
			o.className=!cssjs('check',o,c1)?o.className.replace(c2,c1):o.className.replace(c1,c2);
		break;
		case 'add':
			if(!cssjs('check',o,c1)){o.className+=o.className?' '+c1:c1;}
		break;
		case 'remove':
			var rep=o.className.match(' '+c1)?' '+c1:c1;
			o.className=o.className.replace(rep,'');
		break;
		case 'check':
			return new RegExp('\\b'+c1+'\\b').test(o.className)
		break;
	}
}

// Entfernt Leerzeichen.
var whtSpEnds = new RegExp("^\\s*|\\s*$", "g");
var whtSpMult = new RegExp("\\s\\s+", "g");
function normalizeString(s) {
	s = s.replace(whtSpMult, " ");  // Collapse any multiple whites space.
	s = s.replace(whtSpEnds, "");   // Remove leading or trailing white
                                    // space.
	return s;
}

// Vergleicht zwei Werte, egal ob Text- oder Zahlenwerte
function compareValues(v1, v2) {
	var f1, f2;

	// If the values are numeric, convert them to floats.
	f1 = parseFloat(v1);
	f2 = parseFloat(v2);
	if (!isNaN(f1) && !isNaN(f2)) {
		v1 = f1;
		v2 = f2;
	}

	// Compare the two values.
	if (v1 == v2) return 0;
	if (v1 > v2) return 1
	return -1;
}

function sortTable(link, col) {
	// Get the table section to sort.
	var tblEl = getParent(link, "TABLE");

	// Set the table display style to "none" - necessary for Netscape 6 
	// browsers.
	var oldDsply = tblEl.style.display;
	tblEl.style.display = "none";

	// Beim zweiten Aufruf Suchordnung umdrehen
	if (tblEl.sort_column == col) {
		var sort_order = -1;
		tblEl.sort_column = -1;
	} else {
		var sort_order = 1;
		if (tblEl.sort_column == null) tblEl.sort_column = new Number;	
		tblEl.sort_column = col;
	}

	for (var i = 0; i < tblEl.rows[0].cells.length; i++) cssjs("remove", tblEl.rows[0].cells[i], "highlight");
	cssjs("add", tblEl.rows[0].cells[col], "highlight");

	for (i = 0; i < tblEl.tBodies[0].rows.length - 1; i++) {
	    var value_1 = getTextValue(tblEl.tBodies[0].rows[i].cells[col]);
	    var value_2 = getTextValue(tblEl.tBodies[0].rows[i + 1].cells[col]);

		if (compareValues(value_1, value_2) == sort_order) {
			tblEl.tBodies[0].insertBefore(tblEl.tBodies[0].rows[i + 1], tblEl.tBodies[0].rows[i]);
			i -= 2;
			if (i <= 0) i = -1;
		}
	}


	// Restore the table's display style.
	tblEl.style.display = oldDsply;

	if (cssjs("check", tblEl, "zebra")) create_zebra(tblEl);

	return true;
}

// Links zum sortieren der Tabelle setzen
function init_sortTable(table) {
	if (table.rows && table.rows.length > 0) {
		var firstRow = table.rows[0];
	}
	if (!firstRow) return;
    
	for (var i = 0; i < firstRow.cells.length; i++) {
		var cell = firstRow.cells[i];
		var txt = getTextValue(cell);
		cell.innerHTML = '<a href="#" onclick="return sortTable(this, '+i+');return false;">'+txt+'</a>';
	}
}


// This code is necessary for browsers that don't reflect the DOM constants
// (like IE).
if (document.ELEMENT_NODE == null) {
  document.ELEMENT_NODE = 1;
  document.TEXT_NODE = 3;
}

// Holt allen Text aus einem Element sowie allen Kindelementen
function getTextValue(el) {
	var i;
	var s;

	// Find and concatenate the values of all text nodes contained
	// within the element.
	s = "";
	for (i = 0; i < el.childNodes.length; i++)
		if (el.childNodes[i].nodeType == document.TEXT_NODE)
			s += el.childNodes[i].nodeValue;
		else if (el.childNodes[i].nodeType == document.ELEMENT_NODE && el.childNodes[i].tagName == "BR")
			s += " ";
		else // Use recursion to get text within sub-elements.
			s += getTextValue(el.childNodes[i]);

	return normalizeString(s);
}


// Setzt die Klassen für eine "Zebra-Tabelle"
function create_zebra(table) {
	var even = true;
	var trs = table.getElementsByTagName("tr");
     
	for (var i = 0; i < trs.length; i++) {
		var ths = trs[i].getElementsByTagName("th");
		var tds = trs[i].getElementsByTagName("td");

		if (ths.length == 0) {
			if (even) cssjs("add", trs[i], "even");
			else cssjs("remove", trs[i], "even");
			even = !even;
		}

		if (tds.length >= 1) cssjs("add", tds[0], "first");
		if (ths.length >= 1) cssjs("add", ths[0], "first");
	}
}

function cool_tables() {
	var tables = document.getElementsByTagName("table");  
	for(var x = 0; x < tables.length; x++){
	    var table = tables[x];

	    if (!table) return;
		if (cssjs("check", table, "zebra")) create_zebra(table);
		if (cssjs("check", table, "sortable")) {
			init_sortTable(table);
		}
	}


}

window.onload = cool_tables;
