SortTable.ok = true;
if(!document.getElementsByTagName){
	alert('Browser unterstützt die Sortierfunktion nicht');
	SortTable.ok = false;
}
SortTable.className = 'sortable'; 
SortTable.init = function(){
	var t = document.getElementsByTagName('table');
	var ret = [];
	var regEx  = new RegExp('\\b' + SortTable.className + '\\b', 'i');
	for(var i = 0; i < t.length; i++) {
		if(SortTable.ok && t[i].className && regEx.test(t[i].className))
		ret.push(new SortTable(t[i]));
	}
	return ret;
}

function SortTable(theTable) {
	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;
	self.onstart = self.onsort = function() {};
	this.length = function() { return tableBody.rows.length;};
	this.sort = function(spalte) {
	header.rows[0].cells[spalte].onclick();
	};
	
	var th = header.rows[0].cells;
	var last_sort;
	
	var offset = 0; 
	for(var i = 0; i < th.length; i++) {
		if(th[i].className && /\bno_sort\b/i.test(th[i].className)) continue;
		
		th[i].onclick = ( function() { 
			var spalte = i + offset;
			var desc = 1;
			var ignoreCase = ((th[i].getAttribute('ignore_case') || th[i].title) == 'ignore_case');
			return function() {
				self.onstart(new Date());
				sort(spalte, desc, ignoreCase);
				desc = -desc;

				this.title = desc < 0 ? SortTable.alt_down : SortTable.alt_up;

				self.onsort(new Date());
				
				return false;
				};
			})();
		th[i].style.cursor = 'pointer';
		if(th[i].getAttribute('colspan')){
			offset += th[i].getAttribute('colspan') -1;
		}
	}
	function getValue(el, ignoreCase) {
		var val = getText(el).trim();
		var d = val.match(DATE_DE);
		
		return val == parseFloat(val) ? parseFloat(val) :
		d ? (new Date(d[3] + '/' + d[2] + '/' + d[1])).getTime(): 
		!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) {
			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 
				return td.innerHTML.replace(/<[^>]*>/g, "");
			}
		} else if(td.firstChild){
				return td.firstChild.data;
		}
		return '';
	}
	
	function sort(spalte, desc, ignoreCase) { 
		var mySort = function (a, b) {
			return  a.value == b.value ? 0 :
			a.value > b.value ? desc : -desc;
		};

		var rows = [];
		var tr = tableBody.rows;
		var tr_length = tableBody.rows.length;
		for(var i = 0; i < tr_length; i++) {
			rows.push(
			{
				elem: tr[i], 
				value: getValue(tr[i].cells[spalte], ignoreCase)
			});
		}
		rows = rows.sort(mySort);

		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);
		}
		tableBody.parentNode.replaceChild(tCopy, tableBody);
		tableBody = tCopy;
	}
}

