var sortArrowNone = '<img src="images/site_layout/spacer.gif" border="0" width="5" height="1" />';
var sortArrowUp = '<img src="images/site_layout/sort_arrow_up.gif" border="0" />';
var sortArrowDown = '<img src="images/site_layout/sort_arrow_down.gif" border="0" />';
var sortArrowTag = "span";

var sortColumn;
function sortTable(tableID, cell, arrowID, firstDir)
{
	sortColumn = cell.cellIndex;
	table = document.getElementById(tableID);
	arrow = document.getElementById(arrowID + sortColumn);
	sortDir = arrow.getAttribute("sortdir");
	if (firstDir == "desc")
		firstDir = "down";
	else
		firstDir = "up";

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

	// Determine the data type
	var data = new String(getInnerText(table.rows[1].cells[sortColumn]));
	var sortFunction = sortString;
	if (data.match(/^\d{1,6}[:]\d{2}[:]\d{2}$/)) sortFunction = sortTime;
	if (data.match(/^\d\d[\/-]\d\d[\/-]\d\d\d\d$/)) sortFunction = sortDate;
	if (data.match(/^\d\d[\/-]\d\d[\/-]\d\d$/)) sortFunction = sortDate;
	if (data.match(/^[£$]/)) sortFunction = sortCurrency;
	if (data.match(/^[\d\.]+$/)) sortFunction = sortInt;

	// Get the table rows and put them in an array
	var newRows = Array();
	var firstRow = 1;
	var j = 0;
	for (var i = 1; i < table.rows.length; i++)
	{
		if (!table.rows[i].id || table.rows[i].id.indexOf("static") == -1)
		{
			newRows[j] = table.rows[i];
			j++;
		}
		else if (newRows.length == 0)
			firstRow++;
	}

	// Sort the array
	newRows.sort(sortFunction);

	// Remove other arrows
	var arrows = document.getElementsByTagName(sortArrowTag);
	for (var i = 0; i < arrows.length; i++)
	{
		if (arrows[i].id.indexOf(arrowID) != -1)
		{
			if (getParent(arrows[i], "table") == table)
			{
				arrows[i].innerHTML = sortArrowNone;
				arrows[i].setAttribute("sortdir", "");
			}
		}
	}

	// Handle the sort order
	if (sortDir == "up")
	{
		// Descending
		arrow.innerHTML = sortArrowDown;
		arrow.setAttribute("sortdir", "down");
		newRows.reverse();
	}
	else if (sortDir == "down")
	{
		// Ascending
		arrow.innerHTML = sortArrowUp;
		arrow.setAttribute("sortdir", "up");
	}
	else if (firstDir == "up")
	{
		// Ascending
		arrow.innerHTML = sortArrowUp;
		arrow.setAttribute("sortdir", "up");
	}
	else
	{
		// Descending
		arrow.innerHTML = sortArrowDown;
		arrow.setAttribute("sortdir", "down");
		newRows.reverse();
	}

	// Loop trough the new rows to get the data
	var insertRows = Array();
	for (var i = 0; i < newRows.length; i++)
	{
		insertRows[i] = Array();
		for (var j = 0; j < newRows[i].cells.length; j++)
			insertRows[i][j] = newRows[i].cells[j].innerHTML;
	}
	// Loop trough the insert rows to insert the new cells
	for (var i = 0; i < insertRows.length; i++)
	{
		for (var j = 0; j < insertRows[i].length; j++)
			table.rows[i+firstRow].cells[j].innerHTML = insertRows[i][j];
	}
}

function getParent(element, tag)
{
	if (element == null)
		return null;
	else if (element.nodeType == 1 && element.tagName.toLowerCase() == tag.toLowerCase())    // Gecko bug, supposed to be uppercase
		return element;
	else
		return getParent(element.parentNode, tag);
}

function getInnerText(element) {

    if( element.getAttribute('title') )
        return element.getAttribute('title');

    if (typeof element == "string" || typeof element == "undefined")
	{
        s1 = new String(element);
        element = s1.replace(/,/g,"");
        return element;
    }
    if (element.innerText) {
        s1 = new String(element.innerText);
        element = s1.replace(/,/g,"");
        return element;
    }
    var str = "";

    var cs = element.childNodes;
    var l = cs.length;
    for (var i = 0; i < l; i++) {
        switch (cs[i].nodeType) {
            case 1: //ELEMENT_NODE
                str += getInnerText(cs[i]);
                break;
            case 3:    //TEXT_NODE
                str += cs[i].nodeValue;
                break;
        }
    }
    s1 = new String(str);
    element = s1.replace(/,/g,"");
    return element;
}

function sortTime(a,b)
{
	aa = getInnerText(a.cells[sortColumn]);
	bb = getInnerText(b.cells[sortColumn]);

	var aaSplit = aa.split(":");
	var aaSeconds = ((aaSplit[2]-0) + ((aaSplit[1]-0) * 60) + ((aaSplit[0]-0) * 3600))-0; //Added -0 to strip off leading zeros..

	var bbSplit = bb.split(":");
	var bbSeconds = ((bbSplit[2]-0) + ((bbSplit[1]-0) * 60) + ((bbSplit[0]-0) * 3600))-0; //Added -0 to strip off leading zeros..

	// We now have the seconds
	aa = parseFloat(aaSeconds);
	bb = parseFloat(bbSeconds);

	if (isNaN(aa)) aa = 0;
	if (isNaN(bb)) bb = 0;

	return aa-bb;
}

function sortDate(a,b)
{
	// Two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX
	aa = getInnerText(a.cells[sortColumn]);
	bb = getInnerText(b.cells[sortColumn]);
	if (aa.length == 10)
		dt1 = aa.substr(6,4)+aa.substr(3,2)+aa.substr(0,2);
	else
	{
		yr = aa.substr(6,2);
		if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }
		dt1 = yr+aa.substr(3,2)+aa.substr(0,2);
	}
	if (bb.length == 10)
		dt2 = bb.substr(6,4)+bb.substr(3,2)+bb.substr(0,2);
	else
	{
		yr = bb.substr(6,2);
		if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }
		dt2 = yr+bb.substr(3,2)+bb.substr(0,2);
	}
	if (dt1==dt2) return 0;
	if (dt1<dt2) return -1;
	return 1;
}

function sortCurrency(a,b)
{
	aa = (new String(getInnerText(a.cells[sortColumn]))).replace(/[^0-9.]/g,'');
	bb = (new String(getInnerText(b.cells[sortColumn]))).replace(/[^0-9.]/g,'');
	return parseFloat(aa) - parseFloat(bb);
}

function sortInt(a,b)
{
	aa = parseFloat(getInnerText(a.cells[sortColumn]));
	bb = parseFloat(getInnerText(b.cells[sortColumn]));

	if (isNaN(aa)) aa = 0;
	if (isNaN(bb)) bb = 0;

	return aa-bb;
}

function sortString(a,b)
{
	aa = (new String(getInnerText(a.cells[sortColumn]))).toLowerCase();
	bb = (new String(getInnerText(b.cells[sortColumn]))).toLowerCase();

	s1 = new String(aa);
	s2 = new String(bb);

	aa = s1.replace(/,/g,"");
	bb = s2.replace(/,/g,"");

	if (!isNaN(aa) && !isNaN(bb)) {
	return aa-bb;
	}

	if (aa==bb) return 0;
	if (aa<bb) return -1;
	return 1;
}

function sortDefault(a,b)
{
	aa = getInnerText(a.cells[sortColumn]);
	bb = getInnerText(b.cells[sortColumn]);

	if (aa==bb) return 0;
	if (aa<bb) return -1;
	return 1;
}