

/* Skript zur Sortierung von Tabellen
	Original (c) 2006 Stefan Münz, "Professionelle Websites"
	Modifikation (c) 2006-2008 Harald Breitkreutz, harry@ilo.de

	Vorgenommene Modifikationen:
		- Soriterung ohne Berücksichtigung von HTML-Code hinzugefügt
		- Fix für Sortierung mehrerer Tabellen
		- Trim-Funktion hinzugefügt
		- Sortierung nach Datum
	*/

// Konfiguration
var default_order = "asc"; // "asc" || "desc"
var asc_img_uri = "http://commons.tourenwelt.info//img/tabsort/asc.png";
var desc_img_uri = "http://commons.tourenwelt.info//img/tabsort/desc.png";
var asc_img_alt_text = "Aufsteigend sortiert: Ändern in absteigend sortiert";
var desc_img_alt_text = "Absteigend sortiert: Ändern in aufsteigend sortiert";
var trim_strings = 1;	// Leerzeichen entfernen: 0 / 1

// Ab hier nichts mehr ändern!
var tables = new Array();
var ti = 0;

function sort_table(id)
{
	this.id = id;
	this.myt = 0;
	this.obj;
	this.tbody_obj;
	this.sort_cols = 0;
	this.sort_rows = 0;
	this.img_ids = new Array();
	this.tr_ids = new Array();
	this.td_ids = new Array();
	this.active_sort_col;
	this.active_sort_order = default_order;
}

function init_tabsort(table_id)
{
	if(!document.getElementById) return;

	tables[ti] = new sort_table(table_id);

	var t = ti;
	ti += 1;

	tables[t].myt = t;
	tables[t].obj = document.getElementById(table_id);

	for(var i = 0; i < tables[t].obj.childNodes.length; i++)
	{
		switch(tables[t].obj.childNodes[i].nodeName.toLowerCase())
		{
			case 'colgroup':
				for(j = 0; j < tables[t].obj.childNodes[i].childNodes.length; j++)
					if(tables[t].obj.childNodes[i].childNodes[j].nodeName.toLowerCase() == 'col')
						tables[t].sort_cols += 1;
				break;

			case 'tbody':
				tables[t].tbody_obj = tables[t].obj.childNodes[i];
				break;

			default:
				break;
		}
	}

	var tri = 0;
	var tdi = 0;

	for(i = 0; i < tables[t].tbody_obj.childNodes.length; i++)
	{
		if(tables[t].tbody_obj.childNodes[i].nodeName.toLowerCase()== 'tr')
		{
			tables[t].tbody_obj.childNodes[i].id = 'tab_' + t + 'tr_' + tri;
			tables[t].tr_ids.push('tab_' + t + 'tr_' + tri);
			tables[t].sort_rows += 1;

			tdi = 0;

			for(j = 0; j < tables[t].tbody_obj.childNodes[i].childNodes.length; j++)
			{
				if(tables[t].tbody_obj.childNodes[i].childNodes[j].nodeName.toLowerCase() == 'td')
				{
					tables[t].tbody_obj.childNodes[i].childNodes[j].id = 'tab_' + t + 'tr_' + tri + '_td_' + tdi;
					tables[t].td_ids.push('tab_' + t + 'tr_' + tri + '_td_' + tdi);
					tdi += 1;
				}
			}

			tri += 1;
		}
	}
}


function get_sort_table_obj_by_id(id)
{
	for(var i = 0; i < tables.length; i++)
		if(tables[i].id == id)
			return(tables[i]);
}


function numsort(a,b)
{
	return parseFloat(a) - parseFloat(b);
}


function tabsort(table_id, sort_type, col_n)
{
	if(!document.getElementById) return;

	var delimiter = "|||||";
	var to = get_sort_table_obj_by_id(table_id);
	var sort_array = new Array();
	var data_array = new Array();

	for(var i = 0; i < to.sort_rows; i++)
	{
		tr_array = new Array();
		tr_id = 'tab_' + to.myt + 'tr_' + i;
		td_id = tr_id + '_td_' + col_n;

		if(sort_type == 'han')
		{	// Sortierung ohne HTML-Code
			tr_array.push(trim(document.getElementById(td_id).innerHTML.replace(/<\S[^>]*>/g, '').toLowerCase())); }
		else
		{	if(sort_type == 'n')
			{	// Numerische Sortierung
				var x = parseFloat(document.getElementById(td_id).innerHTML);
				if(isNaN(x))
					x = 0;
				tr_array.push(x); }
			else
			{
				if(sort_type == 'd')
				{
					// Sortierung nach Datum
					var datum = document.getElementById(td_id).innerHTML.split(".");
					if(datum[2]>1900)
						datum[2] -= 1900;
					tr_array.push(parseFloat(datum[0])+31*parseFloat(datum[1])*31*12*parseFloat(datum[2]));
				}
				else
					tr_array.push(trim(document.getElementById(td_id).innerHTML.toLowerCase()));
			}
		}

		tr_array.push(tr_id)
		tr_str = tr_array.join(delimiter);
		sort_array.push(tr_str);

		for(var j = 0; j < to.sort_cols; j++)
		{
			tr_id = 'tab_' + to.myt + 'tr_' + i;
			td_id = tr_id + '_td_' + j;
			data_array[td_id] = document.getElementById(td_id).innerHTML;

		}
	}

	// Debug
	// alert(datum.join('---'));
	// alert(parseFloat(datum[0])+31*parseFloat(datum[1])*31*12*parseFloat(datum[2]));


	if(sort_type == 'an' || sort_type == 'han')
		sort_array.sort();
	else if(sort_type == 'n')
		sort_array.sort(numsort);

	if(to.active_sort_order == 'desc')
	{
		sort_array.reverse();
		to.active_sort_order = 'asc';
	}
	else
		to.active_sort_order = 'desc';

	for(i = 0; i < sort_array.length; i++)
	{
		tr_array = sort_array[i].split(delimiter);

		for(j = 0; j < to.sort_cols; j++)
		{
			tr_id = 'tab_' + to.myt + 'tr_' + i;
			td_id = tr_array[1] + '_td_' + j;
			td_id_set = tr_id + '_td_' + j;
			document.getElementById(td_id_set).innerHTML = data_array[td_id];
		}
	}

	var img_html;

	if(to.active_sort_order == 'asc')
		img_html = '<img src="' + desc_img_uri + '" alt="' + desc_img_alt_text + '">';
	else
		img_html = '<img src="' + asc_img_uri + '" alt="' + asc_img_alt_text + '">';

	for(i = 0; i < to.sort_cols; i++)
	{
		if(i == col_n)
			document.getElementById(table_id + '_sort_img_' + i).innerHTML = img_html + "&nbsp;";
		else
			document.getElementById(table_id + '_sort_img_' + i).innerHTML = "";
	}
}

function trim(s)
{
	if(trim_strings==0)
		return s;

	while (s.substring(0,1) == ' ')
		s = s.substring(1,s.length);
  	while (s.substring(s.length-1,s.length) == ' ')
    	s = s.substring(0,s.length-1);
  	return s;
}