var lastSort;

function sortTable(table, column, numeric, empty_is_high)
{
    if (typeof table == 'string')
	table = document.getElementById(table);
    if (!table)
    {
	var err = new Error("Can't find table.");
	throw err;
    }
    var trs = table.getElementsByTagName('TR');
    var sortable = new Array();
    for (var i = 0; i < trs.length; i++)
    {
	if (!trs[i].className.match(/header/))
	{
	    var original = new Object();
	    original.tr = trs[i];
	    original.pos = i;
	    var tds = original.tr.getElementsByTagName('TD');
	    original.data = getInnerText(tds[column]);
	    if (typeof lastSort != 'undefined')
		original.lastData = getInnerText(tds[lastSort.column]);
	    sortable.push(original);
	}
    }
    var tmp = '';
    var count = 0;
    var reverse = false;
    if (typeof lastSort != 'undefined')
	reverse = (column == lastSort.column && ! lastSort.reverse);
    sortable.sort(sortByCol);
    if (typeof lastSort == 'undefined')
	lastSort = new Object();
    lastSort.numeric = numeric;
    lastSort.column = column;
    lastSort.reverse = reverse;
    for (i = 0; i < trs.length; i++)
    {
	if (!trs[i].className.match(/header/))
	{
	    var oldNode = sortable.shift();
	    var replacement = oldNode.tr.cloneNode(true);
	    trs[i].parentNode.replaceChild(replacement, trs[i]);
	}
    }
    var newTable = table.cloneNode(true);
    table.parentNode.replaceChild(newTable, table);

    function sortByCol(a, b)
    {
	var left = numeric ? parseComma(a.data + '0') : fixup(a.data);
	var right = numeric ? parseComma(b.data + '0') : fixup(b.data);
	var swap = reverse;
	var num = numeric;
	if (left == right && typeof lastSort != 'undefined')
	{
	    num = lastSort.numeric;
	    left = num ? parseComma(a.lastData + '0') : fixup(a.lastData);
	    right = num ? parseComma(b.lastData + '0'): fixup(b.lastData);
	    swap = lastSort.reverse;
	}
	var retval;
	if (left == right)
	    retval = 0;
	else {
	  if (empty_is_high && !swap)
	  {
	      if (num)
	      {
		  if (left == 0)
		      left = Infinity;
		  if (right == 0)
		      right = Infinity;
	      }
	      else {
		  if (left.match(/^\s*$/))
		      left = String.fromCharCode(10000);
		  if (right.match(/^\s*$/))
		      right = String.fromCharCode(10000);
	      }
	  }
	  if (left < right)
	    retval = swap ? 1 : -1;
	  else retval = swap ? -1 : 1;
	}
	return retval;
    }

    function fixup(s)
    {
	var reg = new RegExp(/(North|South|East)\s(Freeport|Qeynos)/);
	if (reg.test(s))
	{
	    var m = reg.exec(s);
	    s = RegExp.$2 + " " + RegExp.$1;
	}
	return s.toLowerCase();
    }

    function parseComma(s)
    {
	if (s.match(/[pgsc]/))
	    return parseEQ(s);
	var t = s.replace(/,/g, '');
	return parseInt(t);
    }

    function parseEQ(s)
    {
	var reg = new RegExp(/(?:(\d+)p)?\s*(?:(\d+)g)?\s*(?:(\d+)s)?\s*(?:(\d+)c)?/);
	var m = reg.exec(s);
	var copper = ((parseInt(m[1]||0) * 100 + parseInt(m[2]||0)) * 100 + parseInt(m[3]||0)) * 100 + parseInt(m[4]||0);
	return copper;
    }
}

function getInnerText(from)
{
    return from.innerHTML;
    if (from.nodeName == '#text')
	return from.nodeValue;
    if (from.childNodes.length == 0)
	return "";
    return getInnerText(from.childNodes[0]);
}

function fixClass(table, one, two)
{
    if (typeof table == 'string')
	table = document.getElementById(table);
    if (!table)
    {
	var err = new Error("Can't find table.");
	throw err;
    }
    var trs = table.getElementsByTagName('TR');
    var current = one;
    for (var i = 0; i < trs.length; i++)
    {
	if (!trs[i].className.match(/header/))
	{
	    trs[i].className = current;
	    current = current == one ? two : one;
	}
    }
}

function hide_duplicates(setname)
{
    var set = getSpansByName(setname);
    var last = '';
    for (var i = 0; i < set.length; i++)
    {
	var text = set[i].innerHTML;
	var hidden = text == last ? 'hidden' : 'visible';
	set[i].style.visibility = hidden;
	last = text;
    }
    return 0;
}

function unhide_duplicates(setname)
{
    var set = getSpansByName(setname);
    var last = '';
    for (var i = 0; i < set.length; i++)
	set[i].style.visibility = 'visible';
    return 0;
}

function getSpansByName(setname)
{
    var set = document.getElementsByName(setname);
    if (set.length == 0)
    {
	set = new Array();
	var count = 0;
	var spans = document.getElementsByTagName('span');
	for (var i = 0; i < spans.length; i++)
	{
	    att = spans[i].getAttribute('name');
	    if (att && att == setname)
		set.push(spans[i])
	}
    }
    return set;
}

var last_name_hidden;

function sort_col(column, numeric, name_to_hide)
{
    sortTable(table, column, numeric, empty_high);
    fixClass(table, 'row1', 'row2');
    if (last_name_hidden)
    {
	unhide_duplicates(last_name_hidden);
	last_name_hidden = null;
    }
    if (name_to_hide)
    {
	hide_duplicates(name_to_hide);
	last_name_hidden = name_to_hide;
    }
}
