var lastcolumn;
var lastsort;

function sortColumn(el)
{
  var tbl = document.getElementById('ListTable');

  if (tbl.rows.length <= 1) // If 0 or 1 row, do not sort
  {
    return;
  }

  if (el.currentTarget)
  {
    obj = el.currentTarget; // W3C method
  }
  else if (window.event.srcElement)
  {
    obj = window.event.srcElement; // IE method
  }
  var column = obj.id.replace(/[^0-9]+/,'');

  LastRowClass = '';

  // Work out a type for the column
  var itm = ts_getInnerText(tbl.rows[0].cells[column]);
  sortfn = ts_sort_caseinsensitive;
  if (itm.match(/^\d\d[\/-]\d\d[\/-]\d\d\d\d$/)) sortfn = ts_sort_date;
  if (itm.match(/^\d\d[\/-]\d\d[\/-]\d\d$/)) sortfn = ts_sort_date;
  if (itm.match(/^[£$]/)) sortfn = ts_sort_currency;
  if (itm.match(/^[\d\.]+$/)) sortfn = ts_sort_numeric;
  if (itm.match(/^\d\d\d\d\-\d\d$/)) sortfn = ts_sort_year;
  SORT_COLUMN_INDEX = column;

  var newRows = new Array();
  
  for (i=0; i < tbl.rows.length; i++)
  {
    newRows[i] = tbl.rows[i];
  }

  newRows.sort(sortfn);
  
  if (lastsort != 'desc' && lastcolumn == column)
  {
    newRows.reverse();
    changeSortImage(column,'desc')
    lastsort = 'desc';
  }
  else
  {
    if (lastcolumn)
    {
      changeSortImage(lastcolumn,'none')
    }
    changeSortImage(column,'asc')
    lastsort = 'asc';
  }
  lastcolumn = column;

  for (i=0; i < newRows.length; i++)
  {
    if (LastRowClass == 'Reg')
    {
      var thisRowClass = 'Alt';
      LastRowClass = 'Alt';
    }
    else
    {
      var thisRowClass = 'Reg';
      LastRowClass = 'Reg';
    }
    newRows[i].setAttribute('class',thisRowClass);
    newRows[i].setAttribute('className',thisRowClass); // For IE
    tbl.appendChild(newRows[i]);
  }
  
}

function changeSortImage(column,sort)
{
  document.getElementById('Sort' + column).src = 'images/' + sort + '.gif';
}

function ts_sort_date(a,b) {
    // y2k notes: two digit years less than 20 are treated as 20XX, greater than 20 are treated as 19XX
    aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
    bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
    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) < 20) { 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) < 20) { 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 ts_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 ts_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 ts_sort_year(a,b) {
    var re = /\-[0-9][0-9]$/;
    aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
    bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
    aa = aa.replace(re,'');
    bb = bb.replace(re,'');
    return aa-bb;

}

function ts_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 ts_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 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;
}
