var sortedOn = 0;
var lastSorted = "";

// This function is used to setup sorting on a table's headers
function initTable(id, colTypes, sortedBy, sortedDir) {
    var table = document.getElementById(id);
    var thead= table.getElementsByTagName("thead")[0];
    var cols = thead.getElementsByTagName("td");

    // loop through each header and attach an onclick event
    for (i=0; i < cols.length; i++) {
		last = (i == cols.length - 1);
		
        if (colTypes[i] == 'float' || colTypes[i] == 'perc' || colTypes[i] == 'perc_ch' || colTypes[i] == 'price' || colTypes[i] == 'long') {
			if(last) {
				cols[i].onclick = function() {sortTable(this, 'number', true)};
			} else {
				cols[i].onclick = function() {sortTable(this, 'number', false)};
			}
        }
		else if (colTypes[i] == 'ticker') {
			if(last) {
				cols[i].onclick = function() {sortTable(this, 'ticker', true)};
			} else {
				cols[i].onclick = function() {sortTable(this, 'ticker', false)};
			}
        } 
		else if (colTypes[i] == 'none') {
			//do nothing
		}
		else {
			if(last) {
				cols[i].onclick = function() {sortTable(this, 'string', true)};
			} else {
				cols[i].onclick = function() {sortTable(this, 'string', false)};
			}
        }
		
        // set sort indicator
        if (i == sortedBy) {
		   lastSorted = sortedDir; 
           setIndicator(cols[i], (i == cols.length - 1));
        }
    }
}

function sortTable(e, type, last) {
    // figure out which column this is in the table, and the table
    if (e.parentNode) {
	    table = e.parentNode.parentNode.parentNode;
        sortOn = e.cellIndex;
	} else if (e.parentElement) {
	    table = e.parentElement.parentElement.parentElement;
        sortOn = e.cellIndex;
	}
    
    //var table = document.getElementById(tableId);
    var tbody = table.getElementsByTagName('tbody')[0];
    var rows = tbody.getElementsByTagName('tr');

    var rowArray = new Array();
    for (var i=0, length=rows.length; i<length; i++) {
        rowArray[i] = rows[i].cloneNode(true);
    }
    
    if (sortOn == sortedOn) { 
        rowArray.reverse(); 
        lastSorted = (lastSorted == "asc" || lastSorted == "") ? "desc" : "asc";
    } else {
        lastSorted = "asc";
        sortedOn = sortOn;
		//alert(type);
		
        if (type == "number") {
            rowArray.sort(rowCompareNumbers);
        } else if (type == "dollar") {
            rowArray.sort(rowCompareDollars);
        } else if (type == "ticker") {
			//alert();
			//alert(rowArray[0].getElementsByTagName('td')[0].getElementsByTagName('a')[0].firstChild.nodeValue);
			//alert(rowArray.getElementsByTagName('td')[0].firstChild.getElementsByTagName('a')[0].nodeValue);
			//alert(rowArray.getElementsByTagName('td')[0].name);//[0].firstChild.nodeValue
			//rowArray.getElementsByTagName('td')[0].getElementsByTagName('a')[0].nodeValue;
            rowArray.sort(rowCompareTickers);
        } else {
            rowArray.sort(rowCompare);
        }
    }
            
    var newTbody = document.createElement('tbody');
    for (var i=0, length=rowArray.length; i<length; i++) {
		rowArray[i].className = rows[i].className;
        newTbody.appendChild(rowArray[i]);
    }
    
    table.replaceChild(newTbody, tbody);
    
    // get all the cells in the thead and set the class on the sorted column
    var thead = table.getElementsByTagName('thead')[0];
    var cells = thead.getElementsByTagName('td');
    for (var i=0; i < cells.length; i++) {
        //cells[i].className = "roweven_box";
		cells[i].className = (i == cells.length - 1) ? "rowodd_last" : "roweven_box";
		
        var spans = cells[i].getElementsByTagName('img');
        for (var j=0; j < spans.length; j++) {
			oldWidth = cells[i].offsetWidth;
            cells[i].removeChild(spans[j]);
			cells[i].width = oldWidth - 3;
        }
    }

    setIndicator(e, last);
}

function rowCompare(a, b) {
    var aVal = a.getElementsByTagName('td')[sortedOn].firstChild.nodeValue;
    var bVal = b.getElementsByTagName('td')[sortedOn].firstChild.nodeValue;
    return (aVal == bVal ? 0 : (aVal > bVal ? 1 : -1));
}

function rowCompareNumbers(a, b) {
    var aVal = parseFloat(a.getElementsByTagName('td')[sortedOn].firstChild.nodeValue.replace(/,/g, ''));
    var bVal = parseFloat(b.getElementsByTagName('td')[sortedOn].firstChild.nodeValue.replace(/,/g, ''));
    return (aVal - bVal);
}

function rowCompareDollars(a, b) {
    var aVal = parseFloat(a.getElementsByTagName('td')[sortedOn].firstChild.nodeValue.substr(1));
    var bVal = parseFloat(b.getElementsByTagName('td')[sortedOn].firstChild.nodeValue.substr(1));
    return (aVal - bVal);
}

function rowCompareTickers(a, b) {
    var aVal = a.getElementsByTagName('td')[sortedOn].getElementsByTagName('a')[0].firstChild.nodeValue;
    var bVal = b.getElementsByTagName('td')[sortedOn].getElementsByTagName('a')[0].firstChild.nodeValue;
    return (aVal == bVal ? 0 : (aVal > bVal ? 1 : -1));
}

function setIndicator(e, last) {
	var imgPath = lastSorted == "asc" ? "/img/nav/sorting/up.gif" : "/img/nav/sorting/down.gif";
    e.className = last ? "roweven_box_sorted_last" : "roweven_box_sorted";
	
    var indicator = document.createElement("img");
    indicator.setAttribute("src", imgPath);
    indicator.setAttribute("width", "9");
    indicator.setAttribute("height", "10");
    indicator.setAttribute("alt", (lastSorted == "asc") ? "Ascending" : "Descending");
    indicator.className = "sort_indicator";

	oldWidth = e.offsetWidth; 
	//alert(e.offsetWidth);
    e.appendChild(indicator); 
	//alert(e.offsetWidth);
	e.width = oldWidth - 3;
}
