//For sorting table columns on the microbiome page
var SORT_COLUMN_INDEX;
var agent = navigator.userAgent;

function getInnerText(element) {
	if (typeof element == "string") return element;
	if (typeof element == "undefined") return element;
	if (element.innerText) return element.innerText; //Not needed but it is faster
	var str = "";
	var cs = element.childNodes;
	for (var i = 0; i < cs.length; i++) {
		switch (cs[i].nodeType) {
			case 1: //ELEMENT_NODE (named constant is not always understood by the browser)
				str += getInnerText(cs[i]);
				break;
			case 3: //TEXT_NODE (named constant is not always understood by the browser)
				str += cs[i].nodeValue;
				break;
		}
	}
	return str;
}

function getText(element) {
	if (typeof element == "string") return element;
	if (typeof element == "undefined") return element;
	if (element.innerText) return element.innerText; //Not needed but it is faster
	var str = "";
	var cs = element.childNodes;
	for (var i = 0; i < cs.length; i++) {
		switch (cs[i].nodeType) {
			case 3: //TEXT_NODE (named constant is not always understood by the browser)
				str += cs[i].nodeValue;
				break;
		}
	}
	return str;
}

function sortTable(link,columnIndex) {
	//Get the span
    var span;
    for (var i=0; i<link.childNodes.length; i++) {
      if (link.childNodes[i].tagName && link.childNodes[i].tagName.toLowerCase() == 'span'){
			  span = link.childNodes[i];
      }
    }
    var td = link.parentNode;
    var column = columnIndex;
    var table = getParent(td,'TABLE');
    if (table.rows.length <= 1) return;
		
    //Decide how to sort
    sortfn = sort_caseinsensitive;
    var sample = getInnerText(table.rows[1].cells[column]);
    if (sample.match(/^[\d\.]+$/)) sortfn = sort_numeric;
    if (sample.match(/%$/)) sortfn = sort_percent;
    SORT_COLUMN_INDEX = column;
		
    //Get the rows that are not headers and put into an array
    var newRows = new Array();
    for (var j=1; j<table.rows.length; j++) { newRows[j-1] = table.rows[j]; }

    //Sort the rows
    newRows.sort(sortfn);

    //If the col is already sorted down, then reverse it, else set 'down' attr
    if (span.getAttribute("sortdir") == 'down') {
        ARROW = '&nbsp;&nbsp;&#8593;';
        newRows.reverse();
        span.setAttribute('sortdir','up');
    } else {
        ARROW = '&nbsp;&nbsp;&#8595;';
        span.setAttribute('sortdir','down');
    }
		
    //appendChild rows that already exist to the tbody, so it moves them rather 
    //than creating new ones
    for (var i=0; i<newRows.length; i++) { 
    	if ((i % 2) == 0) {
    		newRows[i].className = "oddrow";//where the first row is 1 (and index 0)
    	}
    	else {
    		newRows[i].className = "evenrow";
    	}
		table.tBodies[0].appendChild(newRows[i]);
	}
    
    //Remove any other arrows that may be showing in this table
    var allspans = document.getElementsByTagName("span");
    for (var i=0; i<allspans.length; i++) {
      if (allspans[i].className == 'sortarrow') {
        if (getParent(allspans[i],"table") == getParent(link,"table")) { //Is it this table?
          allspans[i].innerHTML = '&nbsp;&nbsp;&nbsp;';
        }
      }
    }
    //Set the arrow for this column
    span.innerHTML = ARROW;
}

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

function sort_caseinsensitive(a,b) {
    aa = getInnerText(a.cells[SORT_COLUMN_INDEX]).toLowerCase();
    bb = getInnerText(b.cells[SORT_COLUMN_INDEX]).toLowerCase();
    if (aa==bb) return 0;
    if (aa<bb) return -1;
    return 1;
}
function sort_numeric(a,b) { 
    aa = parseFloat(getInnerText(a.cells[SORT_COLUMN_INDEX]));
    if (isNaN(aa)) aa = 0;
    bb = parseFloat(getInnerText(b.cells[SORT_COLUMN_INDEX])); 
    if (isNaN(bb)) bb = 0;
    return aa-bb;
}
function sort_percent(a,b) {
	var aText = getInnerText(a.cells[SORT_COLUMN_INDEX]);
	var aNum = aText.replace("%","");
    var aa = parseFloat(aNum);
    if (isNaN(aa)) aa = 0;
	var bText = getInnerText(b.cells[SORT_COLUMN_INDEX]);
	var bNum = bText.replace("%","");
    var bb = parseFloat(bNum);
    if (isNaN(bb)) bb = 0;
    return aa-bb;
}

