/* Table sorting script by Leo Feyer, based on http://www.kryogenix.org/code/browser/sorttable/ (MIT license) */ 
var SORT_COLUMN_INDEX; function sortables_init() { if (!document.getElementsByTagName) { return; } var tbls = document.getElementsByTagName("table"); for (ti=0;ti<tbls.length;ti++) { thisTbl = tbls[ti]; if (thisTbl.className == "sortable" && thisTbl.id) { ts_makeSortable(thisTbl); } } } function ts_makeSortable(table) { if (!table.rows || table.rows.length < 1 || !table.tHead || table.tHead.rows.length < 1) { return; } var firstRow = table.tHead.rows[table.tHead.rows.length-1]; for (var i=0;i<firstRow.cells.length;i++) { var cell = firstRow.cells[i]; var txt = ts_getInnerText(cell); if (cell.className != "unsortable" && cell.className.indexOf("unsortable") == -1) { cell.innerHTML = '<a href="#" class="sortheader" onclick="this.blur(); ts_resortTable(this, '+ i +'); return false;">'+ txt +'</a>'; } } alternate(table); } function ts_getInnerText(el) { if (typeof el == "string") return el; if (typeof el == "undefined") return el; if (el.innerText) return el.innerText; var str = ""; var cs = el.childNodes; var l = cs.length; for (var i = 0; i < l; i++) { switch (cs[i].nodeType) { case 1: str += ts_getInnerText(cs[i]); break; case 3: str += cs[i].nodeValue; break; } } return str; } function ts_resortTable(lnk, clid) { var td = lnk.parentNode; var column = clid || td.cellIndex; var table = getParent(td, 'TABLE'); if (table.rows.length <= 1) return; var itm = ""; var i = 1; while (itm == "") { var itm = ts_getInnerText(table.tBodies[0].rows[i].cells[column]); itm = trim(itm); if (itm.substr(0,4) == "<!--" || itm.length == 0) { itm = ""; } i++; } sortfn = ts_sort_caseinsensitive; if (itm.match(/^\d\d[\/\.-][a-zA-z][a-zA-Z][a-zA-Z][\/\.-]\d\d\d\d$/)) sortfn = ts_sort_date; if (itm.match(/^\d\d[\/\.-]\d\d[\/\.-]\d\d\d{2}?$/)) sortfn = ts_sort_date; if (itm.match(/^[£$€Û¢´]/)) sortfn = ts_sort_currency; if (itm.match(/^-?[\d\.,]+(E[-+][\d]+)?$/)) sortfn = ts_sort_numeric; if (itm.match(/^-?[\d\.,]+%?$/)) sortfn = ts_sort_numeric; SORT_COLUMN_INDEX = column; var firstRow = new Array(); var newRows = new Array(); for (k=0; k<table.tBodies.length; k++) { for (i=0;i<table.tBodies[k].rows[0].length;i++) { firstRow[i] = table.tBodies[k].rows[0][i]; } } for (k=0; k<table.tBodies.length; k++) { for (j=0; j<table.tBodies[k].rows.length; j++) { newRows[j] = table.tBodies[k].rows[j]; } } newRows.sort(sortfn); if (lnk.className == 'sortheader_asc') { newRows.reverse(); lnk.className = 'sortheader_desc'; } else { lnk.className = 'sortheader_asc'; } for (i=0; i<newRows.length; i++) { table.tBodies[0].appendChild(newRows[i]); } var alllnks = table.tHead.getElementsByTagName("a"); for (var ci=0; ci<alllnks.length; ci++) { if (alllnks[ci] == lnk) { continue; } alllnks[ci].className = 'sortheader'; } alternate(table); } function getParent(el, pTagName) { if (el == null) return null; else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase()) return el; else return getParent(el.parentNode, pTagName); } function sort_date(date) { dt = "00000000"; if (date.length == 11) { monthstr = date.substr(3,3); monthstr = monthstr.toLowerCase(); switch(monthstr) { case "jan": var month = "01"; break; case "feb": var month = "02"; break; case "mar": var month = "03"; break; case "apr": var month = "04"; break; case "may": var month = "05"; break; case "jun": var month = "06"; break; case "jul": var month = "07"; break; case "aug": var month = "08"; break; case "sep": var month = "09"; break; case "oct": var month = "10"; break; case "nov": var month = "11"; break; case "dec": var month = "12"; break; } dt = date.substr(7,4) + month + date.substr(0,2); return dt; } else if (date.length == 10) { if (europeandate == false) { dt = date.substr(6,4)+date.substr(0,2)+date.substr(3,2); return dt; } else { dt = date.substr(6,4)+date.substr(3,2)+date.substr(0,2); return dt; } } else if (date.length == 8) { yr = date.substr(6,2); if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; } if (europeandate == true) { dt = yr+date.substr(3,2)+date.substr(0,2); return dt; } else { dt = yr+date.substr(0,2)+date.substr(3,2); return dt; } } return dt; } function ts_sort_date(a,b) { dt1 = sort_date(ts_getInnerText(a.cells[SORT_COLUMN_INDEX])); dt2 = sort_date(ts_getInnerText(b.cells[SORT_COLUMN_INDEX])); 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 compare_numeric(aa,bb); } function ts_sort_numeric(a,b) { aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).replace(/,/,"").replace(/\./,"").replace(/\%/,""); bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).replace(/,/,"").replace(/\./,"").replace(/\%/,""); return compare_numeric(aa,bb); } function compare_numeric(a,b) { a = parseFloat(a); a = (isNaN(a) ? 0 : a); b = parseFloat(b); b = (isNaN(b) ? 0 : b); return a - b; } 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 addEvent(elm, evType, fn, useCapture) { if (elm.addEventListener) { elm.addEventListener(evType, fn, useCapture); return true; } else if (elm.attachEvent) { var r = elm.attachEvent("on"+evType, fn); return r; } } function replace(s, t, u) { r = ""; i = s.indexOf(t); if (i == -1) return s; r += s.substring(0,i) + u; if ( i + t.length < s.length) { r += replace(s.substring(i + t.length, s.length), t, u); } return r; } function trim(s) { while (s.substring(0,1) == ' ') { s = s.substring(1,s.length); } while (s.substring(s.length-1,s.length) == ' ') { s = s.substring(0,s.length-1); } return s; } function alternate(table) { var tableBodies = table.getElementsByTagName("tbody"); for (var i=0; i<tableBodies.length; i++) { var tableRows = tableBodies[i].getElementsByTagName("tr"); for (var j=0; j<tableRows.length; j++) { var tableCols = tableRows[j].getElementsByTagName("td"); for (var k=0; k<tableCols.length; k++) { if ((j%2) == 0) { tableCols[k].className = "col_" + k; } else { tableCols[k].className = "col_" + k + "_bg"; } } } } } addEvent(window, "load", sortables_init);
