/*
Table sorting script  by Joost de Valk, check it out at http://www.joostdevalk.nl/code/sortable-table/.
Based on a script from http://www.kryogenix.org/code/browser/sorttable/.
Distributed under the MIT license: http://www.kryogenix.org/code/browser/licence.html .

Copyright (c) 1997-2007 Stuart Langridge, Joost de Valk.

Version 1.5.7

---

Massivly edited (and made better :D) by SENIKOV

*/
addEvent(window, "load", sortables_init);

var SORT_COLUMN_INDEX;

function sortables_init() {
	// Find all tables with class sortable and make them sortable
	if (!document.getElementsByTagName) return;
	tbls = document.getElementsByTagName("table");
	for (ti=0;ti<tbls.length;ti++) {
		thisTbl = tbls[ti];
		if ((thisTbl.className.indexOf("sortable") != -1) && (thisTbl.id)) {
			ts_makeSortable(thisTbl);
		}
	}
}
function ts_makeSortable(t) {
	ths = t.getElementsByTagName("th");
	for (var i=0; i<ths.length; i++) {
		ths[i].i = i;
		ths[i].onclick = function() {
			ts_resortTable(this);
		}
	}
}
function ts_getInnerText(el) {
	if (typeof el == "string") return el;
	if (typeof el == "undefined") { return el };
	if (el.innerText) return el.innerText;	//Not needed but it is faster
	var str = "";
	
	var cs = el.childNodes;
	var l = cs.length;
	for (var i = 0; i < l; i++) {
		switch (cs[i].nodeType) {
			case 1: //ELEMENT_NODE
				str += ts_getInnerText(cs[i]);
				break;
			case 3:	//TEXT_NODE
				str += cs[i].nodeValue;
				break;
		}
	}
	return str;
}
function echo(str) {
	$id('echo_out').innerHTML += str+"<br />";
}
function ts_resortTable(td) {
	var column = td.i || td.cellIndex;
	var t = td.parentNode.parentNode.parentNode;
	// Work out a type for the column
	if (t.rows.length <= 1) return;
	var itm = t.rows[1].cells[column].innerHTML;
	var i = 0;
	
	SORT_COLUMN_INDEX = column;
	var firstRow = new Array();
	var newRows = new Array();
	for (k=0;k<t.tBodies.length;k++) {
		for (i=0;i<t.tBodies[k].rows[0].length;i++) { 
			firstRow[i] = t.tBodies[k].rows[0][i]; 
		}
	}
	for (k=0;k<t.tBodies.length;k++) {
		for (j=1;j<t.tBodies[k].rows.length;j++) { 
			newRows[j-1] = t.tBodies[k].rows[j];
		}
	}
	newRows.sort(ts_sort);
	
	if (td.sortdir == 'asc') {
		td.sortdir = 'desc';
	} else {
		newRows.reverse();
		td.sortdir = 'asc';
	}
    // We appendChild rows that already exist to the tbody, so it moves them rather than creating new ones
    // don't do sortbottom rows
    for (i=0; i<newRows.length; i++) { 
		if (!newRows[i].className || (newRows[i].className && (newRows[i].className.indexOf('sortbottom') == -1))) {
			t.tBodies[0].appendChild(newRows[i]);
		}
	}
	alternate(t);
}

function ts_sort(a,b) {
	a = a.cells[SORT_COLUMN_INDEX].innerHTML;
	b = b.cells[SORT_COLUMN_INDEX].innerHTML;
	if (!isNaN(a)) {
		a = parseFloat(a);
		b = parseFloat(b);
	}
	if (a==b) {
		return 0;
	} else if (a<b) {
		return -1
	} else {
		return 1;
	}
}

function addEvent(elm, evType, fn, useCapture)
// addEvent and removeEvent
// cross-browser event handling for IE5+,	NS6 and Mozilla
// By Scott Andrew
{
	if (elm.addEventListener){
		elm.addEventListener(evType, fn, useCapture);
		return true;
	} else if (elm.attachEvent){
		var r = elm.attachEvent("on"+evType, fn);
		return r;
	} else {
		alert("Handler could not be removed");
	}
}
function trim(s) {
	return s.replace(/^\s+|\s+$/g, "");
}
//Zebra Stripes + Make Count
function alternate(table) {
	var ths = table.getElementsByTagName("th");
	if (ths[0].className.indexOf('count') >= 0) {
		var tmp = true;
	}
	var rows = table.getElementsByTagName("tr");
	for (var i=0; i<rows.length; i++) {
		if (tmp && i!=0) {
			rows[i].cells[0].innerHTML = i+".";
		}
		// Even
		if ((i%2)==0) {
			if (rows[i].className.indexOf('odd') >= 0){
				rows[i].className = rows[i].className.replace('odd', '');
			}
		// Odd
		} else {
			if (rows[i].className.indexOf('odd') == -1){
				rows[i].className += " odd";
			}
		}
	}
}

