1 2/* This code is based on Firefox directory listing, distributed under 3 * Mozilla Public License. 4 */ 5 6'use strict'; 7 8var gTable, gOrderBy, gTBody, gRows; 9 10document.addEventListener("DOMContentLoaded", function() { 11 gTable = document.getElementsByTagName("table")[0]; 12 gTBody = gTable.tBodies[0]; 13 if (gTBody.rows.length < 2) 14 return; 15 var headCells = gTable.tHead.rows[0].cells; 16 17 function rowAction(i) { 18 return function(event) { 19 event.preventDefault(); 20 orderBy(i); 21 } 22 } 23 24 for (var i = headCells.length - 1; i >= 0; i--) { 25 var anchor = document.createElement("a"); 26 anchor.href = ""; 27 anchor.appendChild(headCells[i].firstChild); 28 headCells[i].appendChild(anchor); 29 headCells[i].addEventListener("click", rowAction(i), true); 30 } 31 gTable.setAttribute("order", ""); 32 orderBy(0); 33}, "false"); 34 35function compareRows(rowA, rowB) { 36 var a = rowA.cells[gOrderBy].getAttribute("sortable-data") || rowA.cells[gOrderBy].innerHTML; 37 var b = rowB.cells[gOrderBy].getAttribute("sortable-data") || rowB.cells[gOrderBy].innerHTML; 38 var intA = +a; 39 var intB = +b; 40 if (a == intA && b == intB) { 41 a = intA; 42 b = intB; 43 } else { 44 a = a.toLowerCase(); 45 b = b.toLowerCase(); 46 } 47 if (a < b) 48 return -1; 49 if (a > b) 50 return 1; 51 return 0; 52} 53 54function orderBy(column) { 55 if (!gRows) 56 gRows = Array.from(gTBody.rows); 57 var order; 58 if (gOrderBy == column) { 59 order = gTable.getAttribute("order") == "asc" ? "desc" : "asc"; 60 } else { 61 order = "asc"; 62 gOrderBy = column; 63 gTable.setAttribute("order-by", column); 64 gRows.sort(compareRows); 65 } 66 gTable.removeChild(gTBody); 67 gTable.setAttribute("order", order); 68 if (order == "asc") 69 for (var i = 0; i < gRows.length; i++) 70 gTBody.appendChild(gRows[i]); 71 else 72 for (var i = gRows.length - 1; i >= 0; i--) 73 gTBody.appendChild(gRows[i]); 74 gTable.appendChild(gTBody); 75} 76 77