/*
 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
 */
/* You can change these values */

var europeandate = false;
/* Don't change anything below this unless you know what you're doing */
addEvent(window, "load", sortables_init);

var SORT_COLUMN_INDEX;
var thead = false;

var strBasePage = location.pathname;
var strSearchPage = location.search;
var bRank = true;
var strPage;

var rePage = /(\/highscores\/alltime\/my\/personal\/scores.toon|\/highscores\/alltime\/user\/scores.toon|\/highscores\/PersonalHighScoresByGame|\/highscores\/MyPersonalHighScoresByGame)/;
var reGameId = /game=(\d+)/;

var nCount = 0;

strPage = strBasePage.match(rePage);
strGameId = strSearchPage.match(reGameId);

if (strPage != null) {
	bRank = false;
}

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.id + ' ').indexOf("holder") != -1)) {
			ts_makeSortable_safari(thisTbl);
		}
		if (((' ' + thisTbl.className + ' ').indexOf("tablesorter") != -1) && (thisTbl.id)) {
			ts_makeSortable(thisTbl);
			var oThCell1 = document.getElementById("thCell1");
			var oThCell2 = document.getElementById("thCell4");
			var oThCell3 = document.getElementById("thCell2");
			var oThCell4 = document.getElementById("thCell3");

			if (bRank) {
				ts_resortTable(oThCell1, 0);
			}
			else {
				switch (strGameId[1]) {
					case '775': //5mtky
					case '1002': //5mtky 2
					case '1139': //fairway to hell
					case '2297': //5mtky wedding
					case '3054': //5mtky reloaded
						ts_resortTable(oThCell3, 2);
						break;
					default:
						ts_resortTable(oThCell3, 2, 'd');
						break;
				}
			}
			
		}
	}
}

function ts_makeSortable(t){
	if (t.rows && t.rows.length > 0) {
		if (t.tHead && t.tHead.rows.length > 0) {
			var firstRow = t.tHead.rows[t.tHead.rows.length - 1];
			thead = true;
		}
		else {
			var firstRow = t.rows[0];
		}
	}
	if (!firstRow) 
		return;
	
	// We have a first row: assume it's the header, and make its contents clickable links
	for (var i = 0; i < firstRow.cells.length; i++) {
		j = i + 1;
		var cell = firstRow.cells[i];
		var txt = ts_getInnerText(cell);
		var linkClass = ts_getInnerClass(cell, txt);
		if (cell.className != "unsortable" && cell.className.indexOf("unsortable") == -1) {
			cell.innerHTML = '<a href="javascript:void(0);" class="' + linkClass + '" onclick="javascript:setOnness(\'thCell' + j + '\');ts_resortTable(this, \'' + i + '\');return false;" id="thCell' + j + '"><span class="sortarrow"><strong>' + txt + '</strong><em></em></span>';
		}
	}
}

function ts_makeSortable_safari(t){
	if (t.rows && t.rows.length > 0) {
		if (t.tHead && t.tHead.rows.length > 0) {
			var firstRow = t.tHead.rows[t.tHead.rows.length - 1];
			thead = true;
		}
		else {
			var firstRow = t.rows[0];
		}
	}
	
	// We have a first row: assume it's the header, and make its contents clickable links
	for (var i = 0; i < firstRow.cells.length; i++) {
		j = i + 1;
		var cell = firstRow.cells[i];
		var txt = ts_getInnerText(cell);
		var linkClass = ts_getInnerClass(cell, txt);
		if (cell.align == "center") {
			var strLinkyClass;
			try {
				strLinkyClass = cell.firstChild.nextSibling.className
			} 
			catch (e) {
			}
			if (strLinkyClass == "playGame") {
				if (isKHTML) {
					cell.firstChild.nextSibling.className = strLinkyClass + ' playNameSaf';
				}
			}
		}
	}
}

function ts_getInnerClass(el, strTxt){
	if (typeof el == "string") 
		return el;
	if (typeof el == "undefined") {
		return el
	};
	var strCN = "";
	
	var cs = el.childNodes;
	var l = cs.length;
	for (var i = 0; i < l; i++) {
		switch (cs[i].nodeType) {
			case 1: //ELEMENT_NODE
				strCN += ts_getInnerClass(cs[i], strTxt);
				if (!bRank) {
					switch (strTxt) {
						case 'Current Rank':
						case 'Rank':
							strCN = 'arrUp_textOff';
							break;
						case 'Score':
							strCN = 'arrDown_textOn';
							break;
						default:
							strCN = cs[i].className;
							break;
					}
				}
				else {
					switch (strTxt) {
						case 'Current Rank':
						case 'Rank':
							strCN = 'arrUp_textOn';
							break;
						case 'Score':
							strCN = 'arrDown_textOff';
							break;
						default:
							strCN = cs[i].className;
							break;
					}
				}
				break;
			default:
				break;
		}
	}
	return strCN;
}

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 ts_resortTable(lnk, clid, strDir){
	var span;
	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 spantext = ts_getInnerText(span);
	var td = lnk.parentNode;
	var column = clid || td.cellIndex;
	var t = getParent(td, 'TABLE');
	// Work out a type for the column
	if (t.rows.length <= 1) 
		return;
	var itm = "";
	var i = 0;
	while (itm == "" && i < t.tBodies[0].rows.length) {
		var itm = ts_getInnerText(t.tBodies[0].rows[i].cells[column]);
		itm = trim(itm);
		if (itm.substr(0, 4) == "<!--" || itm.length == 0) {
			itm = "";
		}
		i++;
	}
	sortfn = ts_sort_caseinsensitive;
	if (itm.match(/^\d\d[\/\.-][a-zA-z][a-zA-Z][a-zA-Z][\/\.-]\d\d\d\d$/)) {
		sortfn = ts_sort_date;
	}
	if (itm.match(/^\d\d[\/\.-]\d\d[\/\.-]\d\d\d{2}?$/)) {
		sortfn = ts_sort_date;
	}
	if (itm.match(/^-?[£$€Û¢´]\d/)) {
		sortfn = ts_sort_numeric;
	}
	if (itm.match(/^-?(\d+[,\.]?)+(E[-+][\d]+)?%?$/)) {
		sortfn = ts_sort_numeric;
	}
	if (itm.match(/^\d+:\d+:\d+$/)) {
		sortfn = ts_sort_numeric;
	}
	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++) {
		if (!thead) {
			// Skip the first row
			for (j = 1; j < t.tBodies[k].rows.length; j++) {
				newRows[j - 1] = t.tBodies[k].rows[j];
			}
		}
		else {
			// Do NOT skip the first row
			for (j = 0; j < t.tBodies[k].rows.length; j++) {
				newRows[j] = t.tBodies[k].rows[j];
			}
		}
	}
	newRows.sort(sortfn);
	if (span.getAttribute("sortdir") == 'down') {
		newRows.reverse();
		span.setAttribute('sortdir', 'up');
		changeArrow(lnk, 'arrDown');
	}
	else {
		span.setAttribute('sortdir', 'down');
		changeArrow(lnk, 'arrUp');
	}
	
	if (strDir == 'd') {
		newRows.reverse();
		span.setAttribute('sortdir', 'up');
		changeArrow(lnk, 'arrDown');
	}
	
	// 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]);
		}
	}
	// do sortbottom rows only
	for (i = 0; i < newRows.length; i++) {
		if (newRows[i].className && (newRows[i].className.indexOf('sortbottom') != -1)) 
			t.tBodies[0].appendChild(newRows[i]);
	}
	// Delete any other arrows there may be showing
}

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){
	//alert(date + ' : ' + date.length)
	dt = "00000000";
	dt = date.substr(6, 4) + date.substr(0, 2) + date.substr(3, 2);
	return dt;
}

function ts_sort_date(a, b){
	//	alert('a : b :: ' + a + ' : ' + b)
	dt1 = sort_date(ts_getInnerText(a.cells[SORT_COLUMN_INDEX]));
	dt2 = sort_date(ts_getInnerText(b.cells[SORT_COLUMN_INDEX]));
	//	alert(dt1 + ' : ' + dt2)
	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 compare_numeric(a, b){
	var a = parseFloat(a);
	a = (isNaN(a) ? 99999 : a);
	var b = parseFloat(b);
	b = (isNaN(b) ? 99999 : 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_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 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 changeArrow(oLink, strDir){
	try {
		var reClass = /(arrUp|arrDown|imOff|imOn|undefined|null)_(textOff|textOn|undefined|null)/;
		// cast	class strings
		strClass1 = oLink.className.replace(reClass, "$1");
		strClass2 = oLink.className.replace(reClass, "$2");
		oLink.className = strDir + '_' + strClass2;
	} 
	catch (e) {
		//alert('err0 ' + e.message)
	}
}

function setOnness(oTarget){
	try {
		// set up vars
		var oCell = document.getElementById(oTarget);
		var oCell1 = document.getElementById('thCell1');
		var oCell2;
		var oCell3;
		var oCell4;
		var oNumbahOneCell;
		try {
			oCell2 = document.getElementById('thCell2');
		} 
		catch (oErr) {
		}
		try {
			oCell3 = document.getElementById('thCell3');
		} 
		catch (oErr) {
		}
		try {
			oCell4 = document.getElementById('thCell4');
		} 
		catch (oErr) {
		}
		try {
			oNumbahOneCell = document.getElementById('numbahOneCell');
		} 
		catch (oErr) {
		}
		
		var bIsOn = false;
		var bTxtIsOn = false;
		
		//break out class names
		var reClass = /(arrUp|arrDown|imOff|imOn|undefined|null)_(textOff|textOn|undefined|null)/;
		
		// cast	class strings
		strOnClass1 = oCell.className.replace(reClass, "$1");
		strOnClass2 = oCell.className.replace(reClass, "$2");
		
		try {
			oCell1.className = strOnClass1 + '_textOff';
		} 
		catch (e) {
		
		}
		try {
			oCell2.className = strOnClass1 + '_textOff';
		} 
		catch (e) {
		
		}
		try {
			oCell3.className = strOnClass1 + '_textOff';
		} 
		catch (e) {
		
		}
		try {
			oCell4.className = strOnClass1 + '_textOff';
		} 
		catch (e) {
		
		}
		oCell.className = strOnClass1_New + '_textOn';
		
	} 
	catch (oErr) {
		//alert('oErr0 ' + oErr.message)
	}
}


