/*
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

Changed bij mvlems, added suwidate, only works with thead, tbody and tfoot
*/


/* You can change these values */
var initialized = false;
var image_path = "images/";
var image_up = "sort-up.gif";
var image_down = "sort-down.gif";
var image_none = "sort-none.gif";
var alternate_row_colors = false;



addEvent(window, "load", sortables_init);


var SORT_COLUMN_INDEX;

function sortables_init() {
	if (initialized) return;
	initialized = true;
	// 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("tableGlobal") != -1) && (thisTbl.id)) {
			ts_makeSortable(thisTbl);
		}
		else if (((' '+thisTbl.className+' ').indexOf("inlineTable") != -1) && (thisTbl.id)) {
			ts_makeSortable(thisTbl);
		}
	}
}

function ts_makeSortable(t) {
	if (t.tHead && t.tHead.rows.length > 0) {
		var firstRow = t.tHead.rows[t.tHead.rows.length-1];
	}

	if (!firstRow || t.tBodies[0].rows.length <= 1) {
		 return;
	}
	else if (t.tBodies[0].rows.length > 1) {
		var cell = firstRow.cells[0];
		if (cell && cell.className && cell.className != "unsortable" && cell.className.indexOf("unsortable") == -1) {
			cell.innerHTML = '<a href="#" class="sortheader" onclick="ts_resortTable(this, 0);return false;"><span class="sortarrow" sortdir="down"><img border="0" src="'+ image_path + image_up + '" alt="Sorteer aflopend" title="Sorteer aflopend"/></span></a>';
		}

/*
		if (t.tBodies[0].rows.length > 2) {
*/
			// We have a first row: assume it's the header, and make its contents clickable links
			var realCount = 0;
			for (var i=1; i < firstRow.cells.length; i++) {
				var foundOne = false;
				var foundOther = false;
				var cell;
				var itm1 = "";
				var j = 0;

				// Check if fields are inputs/selects
				while (!foundOne && j < t.tBodies[0].rows.length) {
					cell = t.tBodies[0].rows[j].cells[i];
					if (cell) {
						if (ts_checkInnerInput(cell)) {
							foundOne = true;
							foundOther = true;
						}
					}
					j++;
				}

				j = 0;	// Check for 2 different values
				while (!foundOne && j < t.tBodies[0].rows.length) {
					cell = t.tBodies[0].rows[j].cells[i];
					if (cell) {
						itm1 = ts_getInnerText(cell);
						if (itm1) 
							itm1 = trim(itm1);
						else
							itm1 = "";
						foundOne = true;
					}
					j++;
				}

				while (!foundOther && j < t.tBodies[0].rows.length) {
					cell = t.tBodies[0].rows[j].cells[i];
					if (cell) {
						var itm2 = ts_getInnerText(cell);
						if (itm2)
							itm2 = trim(itm2);
						else
							itm2 = "";
						if (itm1 != itm2) 
							foundOther = true;
					}
					j++;
				}
				if (foundOther) {
					var cell = firstRow.cells[i];
					if (cell && cell.className && cell.className != "unsortable" && cell.className.indexOf("unsortable") == -1) {
						cell.innerHTML = '<a href="#" class="sortheader" onclick="ts_resortTable(this, '+i+');return false;"><span class="sortarrow"><img border="0" src="'+ image_path + image_none + '" title="Sorteer oplopend" alt="Sorteer oplopend"/></span></a>';
					}
				}
			}
	//	}
	}

//	if (alternate_row_colors) {
//		alternate(t);
//	}
}


function ts_checkInnerInput(el) {
	if (typeof el == "string") return false;
	if (typeof el == "undefined") { return false };
	
	var cs = el.childNodes;
	var l = cs.length;
	for (var i = 0; i < l; i++) {
		switch (cs[i].nodeType) {
			case 1: //ELEMENT_NODE
				if (cs[i].nodeName == 'SELECT' || cs[i].nodeName == 'select')  
					return true;
				else if (cs[i].nodeName == 'INPUT' || cs[i].nodeName == 'input')
					return true;
				else
					return ts_checkInnerInput(cs[i]);
				break;
			case 3:	//TEXT_NODE
				return false;
		}
	}
	return false;
}

function ts_getInnerText(el) {
	if (typeof el == "string") return el;
	if (typeof el == "undefined") { return "" };
	var str = "";
	
	var cs = el.childNodes;
	var l = cs.length;
	if (el.getAttribute("sorttable_customkey") != null) {
      return el.getAttribute("sorttable_customkey");
    }
	for (var i = 0; i < l; i++) {
		switch (cs[i].nodeType) {
			case 1: //ELEMENT_NODE
				if (cs[i].nodeName == 'OPTION' || cs[i].nodeName == 'option')  {
					if (cs[i].selected == true)  {
						if (cs[i].innerText) 
							str += cs[i].innerText;
						else
							str += cs[i].text;
					}
				}
				else if (cs[i].nodeName == 'INPUT' || cs[i].nodeName == 'input')  {
					if (cs[i].type == 'checkbox' && cs[i].checked == true)  {
						str += '~1';
					}
					else if (cs[i].type == 'checkbox')  {
						str += '~0';
					}
					else
						str += cs[i].value;
				}
				else
					str += ts_getInnerText(cs[i]);
				break;
			case 3:	//TEXT_NODE
				str += cs[i].nodeValue;
				break;
		}
	}
	return str;
}

function ts_resortTable(lnk, clid) {
	var span; // container for sort button
	for (var ci=0; ci < lnk.childNodes.length; ci++) {
		if (lnk.childNodes[ci].tagName && lnk.childNodes[ci].tagName.toLowerCase() == 'span')
			span = lnk.childNodes[ci];
	}
	var curSortDirection = span.getAttribute("sortdir");
	var td = lnk.parentNode;
	var t = getParent(td, 'TABLE');

	if (t.rows.length <= 1) return;

	SORT_COLUMN_INDEX = clid || td.cellIndex;
	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++) {
		// Do NOT skip the first row
		for (j = 0; j < t.tBodies[k].rows.length; j++) { 
			newRows[j] = t.tBodies[k].rows[j];
		}
	}

	var itm = "";

	for (i = 0; itm == "" && i < t.tBodies[0].rows.length; i++) {
		itm = ts_getInnerText(t.tBodies[0].rows[i].cells[SORT_COLUMN_INDEX]);
		if (itm.substr(0,4) == "<!--" || itm.length == 0 || itm.charAt(0) <= ' ' || itm.charAt(0) > '~') 
			itm = "";
	}
	if (itm == "") return; 


	// Clear buttons and markers in other columns
	var allspans = document.getElementsByTagName("span");
	for (var ci = 0; ci < allspans.length; ci++) {
		if (allspans[ci].className == 'sortarrow') {
			if (getParent(allspans[ci],"table") == getParent(lnk,"table")) { // in the same table as us?
				allspans[ci].innerHTML = '<img border="0" src="'+ image_path + image_none + '" alt="Sorteer oplopend" title="Sorteer oplopend"/>';
				allspans[ci].setAttribute('sortdir', 'none');
			}
		}
	}		

	if (curSortDirection == 'down') {
		sortfn = ts_sort_caseinsensitive_rev;
		if (itm.match(/^\d\d[\/\.-]\d\d[\/\.-]\d\d\d\d/)) sortfn = ts_sort_date_rev;
		else if (itm.match(/^-?[£$Ûó¢«]\d/)) sortfn = ts_sort_numeric_rev;
		else if (itm.match(/^-?(\d+[,\.]?)+(E[-+][\d]+)?%?/)) sortfn = ts_sort_numeric_rev;

		span.innerHTML = '<img border="0" src="'+ image_path + image_down + '" title="Sorteer oplopend" alt="Sorteer oplopend"/>';
		span.setAttribute('sortdir','up');
	}
	else {
		sortfn = ts_sort_caseinsensitive;
		if (itm.match(/^\d\d[\/\.-]\d\d[\/\.-]\d\d\d\d/)) sortfn = ts_sort_date;
		else if (itm.match(/^-?[£$Ûó¢«]\d/)) sortfn = ts_sort_numeric;
		else if (itm.match(/^-?(\d+[,\.]?)+(E[-+][\d]+)?%?/)) sortfn = ts_sort_numeric;

		span.innerHTML = '<img border="0" src="'+ image_path + image_up + '" title="Sorteer aflopend" alt="Sorteer aflopend"/>';
		span.setAttribute('sortdir','down');
	} 
	newRows = ts_mergesort(newRows, sortfn); // mergesort keeping original order when values are equal
	// newRows.sort(sortfn); default does not work

	// 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]);
		}
	}

	setCSS(t);

//	alternate(t);
}

//====================================

function ts_merge(left, right, fn) {
	var retval = new Array();
	while(left.length > 0 && right.length > 0) {
		if (fn(left[0], right[0]) <= 0)
			retval[retval.length] = left.shift();
		else
			retval[retval.length] = right.shift();
	}

	if (left.length > 0)
		return retval.concat(left);
	if (right.length > 0)
		return retval.concat(right);

	return retval;
}

function ts_mergesort(arr, fn) {
	var left = new Array();
	var right = new Array();
	var len = arr.length;

	if (len <= 1) return arr;

	var middle = Math.floor(len / 2);
	for (var i = 0; i < middle; i++)
		left[left.length] = arr[i];
	for (var i = middle; i < len; i++)
		right[right.length] = arr[i];

	left = ts_mergesort(left, fn);
	right = ts_mergesort(right, fn);

	return ts_merge(left, right, fn);
}

//====================================

function getParent(el, pTagName) {
	if (el == null) {
		return null;
	}
	else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase()) {
		return el;
	}
	else {
		return getParent(el.parentNode, pTagName);
	}
}

function sort_date(date) {	
	if (date.length == 0 || (date.charAt(0) != "-" && (date.charAt(0) < '0' || date.charAt(0) > '9'))) {
		dt = "99999999999999";
	}
	else
		dt = date.substr(6,4)+date.substr(3,2)+date.substr(0,2)+date.substr(11,2)+date.substr(14,2)+date.substr(17,2) + "00000000000000";

	if (dt.length > 14)
		dt = dt.substr(0, 14);

	for(var i = 0; i < 14; i++) {
		if (dt.charAt(i) < '0' || dt.charAt(i) > '9') {
			if (i == 0)
				dt = "0" + dt.substr(1);
			else if (i == 13)
				dt = dt.substr(0,16) + "0"; 
			else 
				dt = dt.substr(0, i) + "0" + dt.substr(i+1);
		}
	}
	return dt;
}

// Sort functions also in reverse to preserve previous sorting 
// =========================================
function ts_sort_date(a, b) {
	dt1 = sort_date(ts_getInnerText(a.cells[SORT_COLUMN_INDEX]));
	dt2 = sort_date(ts_getInnerText(b.cells[SORT_COLUMN_INDEX]));
	
	if (dt1 == dt2) {
		return 0;
	}
	if (dt1 < dt2) { 
		return -1;
	}
	return 1;
}

function ts_sort_date_rev(a, b) {
	dt1 = sort_date(ts_getInnerText(a.cells[SORT_COLUMN_INDEX]));
	dt2 = sort_date(ts_getInnerText(b.cells[SORT_COLUMN_INDEX]));
	
	if (dt1 == dt2) {
		return 0;
	}
	if (dt1 < dt2) { 
		return 1;
	}
	return -1;
}

// =========================================
function ts_sort_numeric(a, b) {
	var aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
	aa = clean_num(aa);
	var bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
	bb = clean_num(bb);
	return compare_numeric(aa,bb);
}

function ts_sort_numeric_rev(a, b) {
	var aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
	aa = clean_num(aa);
	var bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
	bb = clean_num(bb);
	return compare_numeric(bb, aa);
}

function compare_numeric(a, b) {
	var a = parseFloat(a);
	a = (isNaN(a) ? 0 : a);
	var b = parseFloat(b);
	b = (isNaN(b) ? 0 : b);
	return a - b;
}

// =========================================
function ts_sort_caseinsensitive(a, b) {
	aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).toLowerCase();
	bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).toLowerCase();
	if (aa == bb) {
		return 0;
	}
	if (aa < bb) {
		return -1;
	}
	return 1;
}

function ts_sort_caseinsensitive_rev(a, b) {
	aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).toLowerCase();
	bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).toLowerCase();
	if (aa == bb) {
		return 0;
	}
	if (aa < bb) {
		return 1;
	}
	return -1;
}

// =========================================
function ts_sort_default(a, b) {
	aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
	bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
	if (aa == bb) {
		return 0;
	}
	if (aa < bb) {
		return -1;
	}
	return 1;
}

function ts_sort_default_rev(a, b) {
	aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
	bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
	if (aa == bb) {
		return 0;
	}
	if (aa < bb) {
		return 1;
	}
	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 clean_num(str) {
	str = str.replace(new RegExp(/[^-?0-9.]/g),"");
	return str;
}
function trim(s) {
	return s.replace(/^\s+|\s+$/g, "");
}
function alternate(table) {
	// Take object table and get all it's tbodies.
	var tableBodies = table.getElementsByTagName("tbody");
	// Loop through these tbodies
	for (var i = 0; i < tableBodies.length; i++) {
		// Take the tbody, and get all it's rows
		var tableRows = tableBodies[i].getElementsByTagName("tr");
		// Loop through these rows
		// Start at 1 because we want to leave the heading row untouched
		for (var j = 0; j < tableRows.length; j++) {
			// Check if j is even, and apply classes for both possible results
			if ( (j % 2) == 0  ) {
				if ( !(tableRows[j].className.indexOf('odd') == -1) ) {
					tableRows[j].className = tableRows[j].className.replace('odd', 'even');
				} else {
					if ( tableRows[j].className.indexOf('even') == -1 ) {
						tableRows[j].className += " even";
					}
				}
			} else {
				if ( !(tableRows[j].className.indexOf('even') == -1) ) {
					tableRows[j].className = tableRows[j].className.replace('even', 'odd');
				} else {
					if ( tableRows[j].className.indexOf('odd') == -1 ) {
						tableRows[j].className += " odd";
					}
				}
			} 
		}
	}
}


	

function setCSS(table) {
	// Take object table and get all it's tbodies.
	var tableBodies = table.getElementsByTagName("tbody");
	var	processingNeeded = false;

	// Loop through these tbodies
	for (var i = 0; i < tableBodies.length; i++) {
		// Take the tbody, and get all it's rows
		var tableRows = tableBodies[i].getElementsByTagName("tr");
		// Loop through these rows
		// Start at 1 because we want to leave the heading row untouched
		for (var j = 0; j < tableRows.length; j++) {
			for (var k = 0; k < tableRows[j].cells.length; k++) {
				var cell = tableRows[j].cells[k];
				if (cell.className.indexOf('corner') >= 0 && cell.className.indexOf('colorBlock') >= 0) {
					if (j == 0) {
						if (cell.className.indexOf('cmiddlel') >= 0 || cell.className.indexOf('cbottoml') >= 0) {
							cell.className = " corner colorBlock ctopl";
							cell.innerHTML = '<img src="images/ctl.gif" class="imgcorner" alt="" />';
						}
						else if (cell.className.indexOf('cmiddler') >= 0 || cell.className.indexOf('cbottomr') >= 0) {
							cell.className = " corner colorBlock ctopr";
							cell.innerHTML = '<img src="images/ctr.gif" class="imgcorner" alt="" />';
						}
					}
					else if (j == tableRows.length - 1) {
						if (cell.className.indexOf('cmiddlel') >= 0 || cell.className.indexOf('ctopl') >= 0) {
							cell.className = " corner colorBlock cbottoml";
							cell.innerHTML = '';
						}
						else if (cell.className.indexOf('cmiddler') >= 0 || cell.className.indexOf('ctopr') >= 0) {
							cell.className = " corner colorBlock cbottomr";
							cell.innerHTML = '';
						}
					}
					else {
						if (cell.className.indexOf('ctopl') >= 0 || cell.className.indexOf('cbottoml') >= 0) {
							cell.className = " corner colorBlock cmiddlel";
							cell.innerHTML = '';
						}
						else if (cell.className.indexOf('ctopr') >= 0 || cell.className.indexOf('cbottomr') >= 0) {
							cell.className = " corner colorBlock cmiddler";
							cell.innerHTML = '';
						}
					}
					processingNeeded = true;
				}
			}		
			if (!processingNeeded)
				break;			
		}
		if (!processingNeeded)
			break;
		}
}

