window.onload=function () { install_sorters('Tabelle'); };


function build_sorter(table,i,typ) {
  return function() {
   sort_table(table,
	      ( typ == 'n' ? 
		function (r) {
		return extract_number(r,i);
	      } 
		: 
		function (r) {
		  return extract_string_ci(r,i);
		} ),
	      (typ == 'n' ?
	       compare_numbers : compare_strings )
	      );
  }
}

function install_sorters(tab_id) {
  var typen = ['s','s','s','s','s'];
  var table = document.getElementById(tab_id);
  var headers = table.getElementsByTagName('th');
  var i;
  for (i = 0 ; i < headers.length; i++) {
    headers[i].onclick = build_sorter(table,i,typen[i]);
  }
}

function extract_number(row,column) {
  var cells = row.getElementsByTagName('td');
  return parseInt(cells[column].firstChild.nodeValue);
}

function extract_string_ci(row,column) {
  var cells = row.getElementsByTagName('td');
  return cells[column].firstChild.nodeValue.toUpperCase();
}

function compare_numbers(a,b) {
  return (a.value - b.value);
}

function compare_strings(a,b) {
  if (a.value < b.value) {
    return -1;
  } 
  if (a.value > b.value) {
    return 1;
  }
  return 0;
}

function sort_table(table, extract_fct, sort_fct) {
  var clones = new Array();
  var tbody = table.getElementsByTagName('tbody')[1];
  var rows = tbody.getElementsByTagName('tr');
  var i;
  var l = rows.length;
  // Zeilen aus der Tabelle kopieren und
  // fr jede Zeile Sortierdaten extrahieren
  for (i = 0; i <l; i++) {
    var r = rows[i];
    var v = extract_fct(r);
    clones[i] = {
      value:    v,
      element : r
    }
  }

  // Kopien sortieren
  clones.sort(sort_fct);
  // Zeilen in der richtigen Reihenfolge einfgen
  for (i = 0; i < l; i++) {
    tbody.appendChild(clones[i].element);
  }
}
