//addEvent(window, "load", sortables_init);

var SORT_COLUMN_INDEX;

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 resortTable(titleTableLink, contentTableName, columnPosition, sortType) {
	// get the span
	var span;
	var contentTableRef = document.getElementById(contentTableName);

	var columnIndex = 0;
	while (columnIndex < titleTableLink.childNodes.length) {
		if( titleTableLink.childNodes[columnIndex].tagName && titleTableLink.childNodes[columnIndex].tagName.toLowerCase() == 'span' ){
			span = titleTableLink.childNodes[columnIndex];
		}
		columnIndex++;
	}

	var spantext = ts_getInnerText(span);
	var column = columnPosition;
	var table = contentTableRef;

    
	// Work out a type for the column
	if (table.rows.length <= 1){
		return;
	}

	SORT_COLUMN_INDEX = column;
	var newRows = new Array();
	var i = 0;
	while( i < table.rows.length ){
		newRows[i] = table.rows[i];
		i++;
	}


	if( sortType == 0 ){
		newRows.sort(sort_caseinsensitive);
	} else if( sortType == 1 ){
		newRows.sort(sort_currency);
	} else if( sortType == 2 ){
		newRows.sort(sort_numeric);
	} else if( sortType == 3 ){
		newRows.sort(sort_date);
	} else if( sortType == 4 ){
		newRows.sort(sort_datetime);
	}

	if (span.getAttribute("sortdir") == 'down') {
		ARROW = '&nbsp;&nbsp;&uarr;';
		newRows.reverse();
		span.setAttribute('sortdir','up');
	} else {
		ARROW = '&nbsp;&nbsp;&darr;';
		span.setAttribute('sortdir','down');
	}

   
	i = 0;
	while( i < newRows.length ){
		if (!newRows[i].className || (newRows[i].className && (newRows[i].className.indexOf('sortbottom') == -1))){
			table.tBodies[0].appendChild(newRows[i]);
		}
		i++;
	}

	i = 0;
	while( i < newRows.length ){
		if (newRows[i].className && (newRows[i].className.indexOf('sortbottom') != -1)){
			table.tBodies[0].appendChild(newRows[i]);
		}
		i++;
	}

	var allspans = document.getElementsByTagName("span");
	var columnIndex=0;
	while( columnIndex < allspans.length ){
		if (allspans[columnIndex].className == 'sortarrow') {
			if (getParent(allspans[columnIndex],"table") == getParent(titleTableLink, "table")) { // in the same table as us?
				allspans[columnIndex].innerHTML = '&nbsp;&nbsp;&nbsp;';
			}
		}
		columnIndex++;
	}
	span.innerHTML = ARROW;

}



function getParent(el, pTagName) {
	if (el == null){
		return null;
	} else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase()){	// Gecko bug, supposed to be uppercase
		return el;
	} else{
		return getParent(el.parentNode, pTagName);
	}
}


function calculateMonthValue(mnth){
	if( mnth.toLowerCase() == "january" || mnth.toLowerCase() == "jan" ){
		return "01";
	} else if( mnth.toLowerCase() == "february" || mnth.toLowerCase() == "feb" ){
		return "02";
	} else if( mnth.toLowerCase() == "march" || mnth.toLowerCase() == "mar" ){
		return "03";
	} else if( mnth.toLowerCase() == "april" || mnth.toLowerCase() == "apr" ){
		return "04";
	} else if( mnth.toLowerCase() == "may" || mnth.toLowerCase() == "may" ){
		return "05";
	} else if( mnth.toLowerCase() == "june" || mnth.toLowerCase() == "jun" ){
		return "06";
	} else if( mnth.toLowerCase() == "july" || mnth.toLowerCase() == "jul" ){
		return "07";
	} else if( mnth.toLowerCase() == "august" || mnth.toLowerCase() == "aug" ){
		return "08";
	} else if( mnth.toLowerCase() == "september" || mnth.toLowerCase() == "sep" ){
		return "09";
	} else if( mnth.toLowerCase() == "october" || mnth.toLowerCase() == "oct" ){
		return "10";
	} else if( mnth.toLowerCase() == "november" || mnth.toLowerCase() == "nov" ){
		return "11";
	} else if( mnth.toLowerCase() == "december" || mnth.toLowerCase() == "dec" ){
		return "12";
	}
}



function sort_date(a, b){
	aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
	bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
	dt1 = aa.substr(7, 4) + calculateMonthValue(aa.substr(3, 3)) + aa.substr(0, 2);
	dt2 = bb.substr(7, 4) + calculateMonthValue(bb.substr(3, 3)) + bb.substr(0, 2);
	if(dt1 == dt2){
		return 0;
	}
	if(dt1 < dt2){
		return -1;
	}
	return 1;
}


function calculateHour(hourVal, amPm){
	if( amPm == "am" ){
		return hourVal;
	} else if( amPm == "pm" ){
		return hourVal+12+"";
	}
}


function sort_datetime(a, b){
	aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
	bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
	dt1 = aa.substr(18, 4) + calculateMonthValue(aa.substr(14, 3)) + aa.substr(11, 2) + calculateHour(aa.substr(0, 2), aa.substr(8, 2)) + aa.substr(3, 2) + aa.substr(6, 2);
	dt2 = bb.substr(18, 4) + calculateMonthValue(bb.substr(14, 3)) + bb.substr(11, 2) + calculateHour(bb.substr(0, 2), bb.substr(8, 2)) + bb.substr(3, 2) + bb.substr(6, 2);
	if(dt1 == dt2){
		return 0;
	}
	if(dt1 < dt2){
		return -1;
	}
	return 1;
}




function sort_currency(a, b){ 
	aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');
	bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');
	return parseFloat(aa) - parseFloat(bb);
}

function sort_numeric(a, b){ 
	aa = parseFloat(ts_getInnerText(a.cells[SORT_COLUMN_INDEX]));
	if( isNaN(aa) ){
		aa = 0;
	}
	bb = parseFloat(ts_getInnerText(b.cells[SORT_COLUMN_INDEX])); 
	if( isNaN(bb) ){
		bb = 0;
	}
	return aa - bb;
}

function 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 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){
	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");
	}
} 

