
var SORT_COLUMN_INDEX = -1;
var LAST_SORTED;

function initTable(id) {
    // Find all tables with class sortable and make them sortable
    if (!document.getElementsByTagName) return;
    tbls = document.getElementById(id);
    if (tbls == null) return;
    ts_makeSortable(tbls);
}

function ts_makeSortable(table) {
    if (table.rows && table.rows.length > 0) {
        var firstRow = table.rows[0];
    }
    if (!firstRow) return;
    // We have a first row: assume it's the header, and make its contents clickable links
    for (var i=0;i<firstRow.cells.length;i++) {
        var cell = firstRow.cells[i];
        var txt = ts_getInnerText(cell);
        firstRow.cells[i].onclick = function() {ts_resortTable(this)};
	//if (i==0) setIndicator(firstRow.cells[i], true);
    }
}

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;
}

function ts_resortTable(lnk) {
    var td = lnk.parentNode.parentNode.parentNode;
    var column = lnk.cellIndex;
    var table = getParent(td,'TABLE');
    var body = table.getElementsByTagName('tbody')[0];
    var rows = body.getElementsByTagName('tr');
    // Work out a type for the column
    if (rows.length <= 1) return;
    var newRows = new Array();
    if (column == SORT_COLUMN_INDEX) {
      for (var i=0, length=rows.length; i<length; i++) {
        newRows[i] = rows[i].cloneNode(true);
      }
      newRows.reverse();
      LAST_SORTED = (LAST_SORTED == "asc" || LAST_SORTED == "") ? "desc" : "asc";
    }
    else{
      LAST_SORTED = "asc";
      var itm = ts_getInnerText(rows[1].cells[column]);
      sortfn = ts_sort_caseinsensitive;
      if (itm.match(/^\d\d[\/.]\d\d[\/.]\d\d\d\d[\s]\d\d[\/:]\d\d[\/:]\d\d$/)) sortfn = ts_sort_date_time;
      else if (itm.match(/^\d\d[\/.]\d\d[\/.]\d\d\d\d$/)) sortfn = ts_sort_date;
      else if (itm.match(/^\d\d[\/-]\d\d[\/-]\d\d$/)) sortfn = ts_sort_date;
      else if (itm.match(/^[£$]/)) sortfn = ts_sort_currency;
      else if (itm.match(/^[\d\.]+$/)) sortfn = ts_sort_numeric;
      SORT_COLUMN_INDEX = column;
      for (j=0;j<rows.length;j++) { newRows[j] = rows[j]; }
      newRows.sort(sortfn);
    }
//    var listBkg1 = '#E0E9E9';
//    var listBkg2 = '#E4E2E4';
//    var holdBkg = listBkg1;
    var newTbody = document.createElement('tbody');
    for (var i=0, length=newRows.length; i<length; i++) {
//      newRows[i].style.background = holdBkg;
//      if (holdBkg == listBkg1){
//        holdBkg = listBkg2;
//      }
//      else {
//        holdBkg = listBkg1;
//      }
      newTbody.appendChild(newRows[i]);
    }
    table.replaceChild(newTbody, body);
    var head = table.getElementsByTagName('thead')[0];
    var headerCells = head.getElementsByTagName('th');
    for (var i=0; i < headerCells.length; i++) {
      var spans = headerCells[i].getElementsByTagName('img');
      for (var j=0; j < spans.length; j++) {
        headerCells[i].removeChild(spans[j]);
      }
    }
    setIndicator(lnk);
}

function getParent(el, pTagName) {
    if (el == null) return null;
    else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase())	// Gecko bug, supposed to be uppercase
	return el;
    else
	return getParent(el.parentNode, pTagName);
}

function ts_sort_date(a,b) {
    // y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 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(0,2)+aa.substr(3,2);
    } else {
        yr = aa.substr(6,2);
        if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }
        dt1 = yr+aa.substr(0,2)+aa.substr(3,2);
    }
    if (bb.length == 10) {
        dt2 = bb.substr(6,4)+bb.substr(0,2)+bb.substr(3,2);
    } else {
        yr = bb.substr(6,2);
        if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }
        dt2 = yr+bb.substr(0,2)+bb.substr(3,2);
    }
    if (dt1==dt2) return 0;
    if (dt1<dt2) return -1;
    return 1;
}

function ts_sort_date_time(a,b) {
    // y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX
    aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
    bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
    if (aa.length == 19) {
        dt1 = aa.substr(6,4)+aa.substr(0,2)+aa.substr(3,2);
	tm1 = aa.substr(11,2)+aa.substr(14,2)+aa.substr(17,2);
    } else {
        yr = aa.substr(6,2);
        if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }
        dt1 = yr+aa.substr(0,2)+aa.substr(3,2);
	tm1 = aa.substr(9,2)+aa.substr(12,2)+aa.substr(15,2);
    }
    if (bb.length == 19) {
        dt2 = bb.substr(6,4)+bb.substr(0,2)+bb.substr(3,2);
	tm2 = bb.substr(11,2)+bb.substr(14,2)+bb.substr(17,2);
    } else {
        yr = bb.substr(6,2);
        if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }
        dt2 = yr+bb.substr(0,2)+bb.substr(3,2);
	tm2 = bb.substr(9,2)+bb.substr(12,2)+bb.substr(15,2);
    }
    if (dt1==dt2){
      if (tm1<tm2) return -1;
      if (tm1<tm2) return 1;
      if (tm1==tm2) 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_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 setIndicator(e, pageLoad) {
    if (pageLoad) LAST_SORTED = "asc";
    //e.className = "clsTHead";
    var indicator = document.createElement("img");
    indicator.setAttribute("src", "./graphics/"+LAST_SORTED+".png");
    indicator.setAttribute("alt", (LAST_SORTED == "asc") ? "Ascending" : "Descending");
    indicator.className = "theader";
    e.appendChild(indicator);
}
