SortTable.ok = true;
if(!document.getElementsByTagName){
	alert('Browser unterstÃ¼tzt die Sortierfunktion nicht');
	SortTable.ok = false;
}

/*
	sort_table.js
	http://javascript.jstruebig.de/javascript/74/

	Version 2.4 / Datum 26.11.2008
	* Die PrÃ¼fung des CSS Klassennamens in die Klasse eingebaut

	Version 2.3 / Datum 28.10.2008
	* ein Bug beim sortieren von Textfeldern beseitigt

	Version 2.2 / Datum 16.09.2008
	* sortiert auch Auswahlisten

	Version 2.1 /  Datum 05.09.2008
	* init() Funktion

	Version 2.0 / Datum: 02.09.2008
	* Neue schnellere Sortierroutine.
	* arbeitet mit dem Skript Zebratabelle zusammen
	  http://javascript.jstruebig.de/javascript/75/

	Version: 1.0 / Datum: 28.11.2007
*/

// Die Bezeichnung der Klasse
SortTable.className = 'SortedTable';

// Das Element das angezeigt wird, wenn die Spalte abwÃ¤rts sortiert ist
SortTable.up = String.fromCharCode(9660);
SortTable.alt_up = 'Abwärts sortieren';

// Das Element das angezeigt wird, wenn die Spalte aufwÃ¤rts sortiert ist
SortTable.down = String.fromCharCode(9650);
SortTable.alt_down = 'Aufwärts sortieren';

// Farbe des Zeichens in der SpaltenÃ¼berschrift
SortTable.pointer_color = '#000';

//
SortTable.regEx  = new RegExp('\\b' + SortTable.className + '\\b', 'i');

SortTable.init = function(){
	var t = document.getElementsByTagName('table');
	var ret = [];
	for(var i = 0; i < t.length; i++) {
		var t = new SortTable(t[i]);
		ret.push(t);
	}
	return ret;
}

function SortTable(theTable) {
	if(!SortTable.ok || !theTable.className || !SortTable.regEx.test(theTable.className)) return;

	var self = this;
	var DATE_DE = /(\d{1,2})\.(\d{1,2})\.(\d{2,4})/;
	var zebra = /\bzebra\b/i.test(theTable.className);
	var tableBody = theTable.tBodies[0];
	var header = theTable.tHead;

	// SortTable Eventhandler, Dummy Funktionen
	self.onstart = self.onsort = function() {};

	this.length = function() { return tableBody.rows.length;};

	if(!header) {
		/**
		 exisitert kein Headerelement:
		 dann neues Headerelement erzeugen,
		 die erste Zeile in den Header umhÃ¤ngen
		 und den Header in die Tabelle einfÃ¼gen
		*/
		header = document.createElement('thead');
		header.appendChild(tableBody.rows[0]);
		theTable.appendChild(header);
	}

	/**
	Die Headerzeile mit den Events und dem Markierer versehen
	**/
	var th = header.rows[0].cells;
	var last_sort;

	for(var i = 0; i < th.length; i++) {
		// soll die Spalte sortiert werden
		if(th[i].className && /\bno_sort\b/i.test(th[i].className)) continue;

		// click Event
		th[i].onclick = ( function() {
			// Den Zeiger einfÃ¼gen
			var pointer = document.createElement('span');
			pointer.style.fontFamily = 'Arial';
			pointer.style.fontSize = '80%';
			pointer.style.visibility = 'hidden';
			pointer.innerHTML = SortTable.down;
			th[i].appendChild(pointer);

			// Lokale Werte
			var spalte = i;
			var desc = 1;
			var ignoreCase = ((th[i].getAttribute('ignore_case') || th[i].title) == 'ignore_case');

			// und die Eventfunktion
			return function() {
				self.onstart(new Date());

				// Der Aufruf, der eigentlichen Sortierfunktion
				sort(spalte, desc, ignoreCase);

				// Sortierung umkehren
				desc = -desc;

				// Den Zeiger der zuletzt geklickten Spalte entfernen
				if(last_sort != pointer) {
					if(last_sort) last_sort.style.visibility = 'hidden';
					pointer.style.visibility = '';
					last_sort = pointer;
				}
				pointer.style.color = SortTable.pointer_color;
				pointer.innerHTML = desc < 0 ? SortTable.down : SortTable.up;
				this.title = desc < 0 ? SortTable.alt_down : SortTable.alt_up;

				self.onsort(new Date());

				return false;
				};
			})(); // Funktionsaufruf
		th[i].style.cursor = 'pointer';
	}


	/********************************************
	 * Hilfsfunktionen
	 ********************************************/

	function getValue(el, ignoreCase) {
		var val = getText(el).trim();
		var d = val.match(DATE_DE);

		return val == parseFloat(val) ? parseFloat(val) : // Zahl
		d ? (new Date(d[3] + '/' + d[2] + '/' + d[1])).getTime():  // deutsches Datum
		!isNaN(Date.parse(val)) ? Date.parse(val) :
		ignoreCase ? val.toLowerCase() : val;
	}

	function getText(td) {
		if(td.getAttribute('my_key')) {
			return td.getAttribute('my_key');
		} else if(td.childNodes.length > 0) {
			// EnthÃ¤lt das element HTML Knoten
			var input = td.getElementsByTagName('input')[0];
			if(input && input.type == 'text') {
				return input.value;
			} else if(td.getElementsByTagName('select')[0]) {
				return td.getElementsByTagName('select')[0].value;
			} else {
				// EnthÃ¤lt die Zelle HTML Code wird dieser entfernt
				var tmp = td.innerHTML;
				return tmp.replace(/<[^>]*>/g, "");
			}
		} else {
				return td.firstChild.data;
		}
	}

	/**
	sort(spalte, desc)
	Die Sortierfunktion sortiert die angegebene Spalte.
	**/

	function sort(spalte, desc, ignoreCase) { // Parameter: Headerzelle
		var sort = function (a, b) {
			return  a.value == b.value ? 0 :
			a.value > b.value ? desc : -desc;
		};
		/**
		Die Reihen der Tabelle zwischenspeichern
		*/
		var rows = [];
		var tr = tableBody.rows;
		for(var i = 0; i < tr.length; i++) {
			rows.push({elem: tr[i], value: 0 });
		}
		var tr_length = tableBody.rows.length;

		for(var i = 0; i < rows.length; i++) {
			rows[i].value = getValue(tableBody.rows[i].cells[spalte], ignoreCase);
		}

		rows = rows.sort(sort);

		var tCopy = tableBody.cloneNode(false);
		for(var i = 0; i < tr_length; i++) {

				if(zebra) {
					rows[i].elem.className = rows[i].elem.className.replace(/([ ]?odd)/, "");
					if(i % 2) rows[i].elem.className += ' odd' ;
				}
				tCopy.appendChild(rows[i].elem.cloneNode(true));
		}
		tableBody.parentNode.replaceChild(tCopy, tableBody);
		tableBody = tCopy;
	}
}

