diff --git a/assets/javascripts/sortable.js b/assets/javascripts/sortable.js index ff141b9c3d..5a474fdea4 100644 --- a/assets/javascripts/sortable.js +++ b/assets/javascripts/sortable.js @@ -36,30 +36,91 @@ var alternate_row_colors = true; var SORT_COLUMN_INDEX; var thead = false; -function sortables_init() { - // Find table with id sortable-table and make them sortable - if (!document.getElementById) return; - tbl = document.getElementById("sortable-table"); - ts_makeSortable(tbl); +function alternate(table) { + // Take object table and get all it's tbodies. + var i, j, tableBodies, tableRows; + tableBodies = table.getElementsByTagName("tbody"); + // Loop through these tbodies + for (i = 0; i < tableBodies.length; i += 1) { + // Take the tbody, and get all it's rows + tableRows = tableBodies[i].getElementsByTagName("tr"); + // Loop through these rows + // Start at 1 because we want to leave the heading row untouched + for (j = 0; j < tableRows.length; j += 1) { + // Check if j is even, and apply classes for both possible results + if ((j % 2) === 0) { + if (tableRows[j].className.indexOf('odd') !== -1) { + tableRows[j].className = tableRows[j].className.replace('odd', 'even'); + } else { + if (tableRows[j].className.indexOf('even') === -1) { + tableRows[j].className += " even"; + } + } + } else { + if (tableRows[j].className.indexOf('even') !== -1) { + tableRows[j].className = tableRows[j].className.replace('even', 'odd'); + } else { + if (tableRows[j].className.indexOf('odd') === -1) { + tableRows[j].className += " odd"; + } + } + } + } + } +} + +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, cs, l, i; + str = ""; + + cs = el.childNodes; + l = cs.length; + for (i = 0; i < l; i += 1) { + 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_makeSortable(t) { + var firstRow, i, cell, txt; if (t.rows && t.rows.length > 0) { if (t.tHead && t.tHead.rows.length > 0) { - var firstRow = t.tHead.rows[t.tHead.rows.length-1]; + firstRow = t.tHead.rows[t.tHead.rows.length - 1]; thead = true; } else { - var firstRow = t.rows[0]; + firstRow = t.rows[0]; } } - if (!firstRow) return; + if (!firstRow) { + return; + } // We have a first row: assume it's the header, and make its contents clickable links - for (var i=0;i'+txt+''; + for (i = 0; i < firstRow.cells.length; i += 1) { + cell = firstRow.cells[i]; + txt = ts_getInnerText(cell); + if (cell.className !== "unsortable" && cell.className.indexOf("unsortable") === -1) { + cell.innerHTML = '' + + txt + + ''; } } if (alternate_row_colors) { @@ -67,156 +128,161 @@ function ts_makeSortable(t) { } } -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 = ""; +function sortables_init() { + // Find table with id sortable-table and make them sortable + if (!document.getElementById) { + return; + } + var tbl = document.getElementById("sortable-table"); + ts_makeSortable(tbl); +} - 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; - } +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); } - return str; +} + +function ts_get_cell_data(a, idx) { + var acell, aa; + if ((typeof idx) === "undefined") { + acell = a.cells[SORT_COLUMN_INDEX]; + } else { + acell = a.cells[idx]; + } + if ((aa = acell.getAttribute("raw-data")) === null) { + aa = ts_getInnerText(acell).toLowerCase(); + } + return aa; +} + +function compare_numeric(a, b) { + var af, bf; + af = parseFloat(a); + af = (isNaN(af) ? 0 : af); + bf = parseFloat(b); + bf = (isNaN(bf) ? 0 : bf); + return af - bf; +} + +function ts_sort_numeric(a, b) { + var cells = [ts_get_cell_data(a), ts_get_cell_data(b)]; + return compare_numeric(cells[0], cells[1]); +} + +function ts_sort_caseinsensitive(a, b) { + var cells = [ts_get_cell_data(a), ts_get_cell_data(b)]; + if (cells[0] === cells[1]) { + return 0; + } + if (cells[0] < cells[1]) { + return -1; + } + return 1; +} + +function trim(s) { + return s.replace(/^\s+|\s+$/g, ""); } function ts_resortTable(lnk, clid) { - var span; - var td = lnk.parentNode; - var column = clid || td.cellIndex; - var t = getParent(td,'TABLE'); + var td, column, t, first, itm, i, j, k, numeric_flag, all_sort_links, ci, firstRow, newRows, sortfn; + td = lnk.parentNode; + column = clid || td.cellIndex; + t = getParent(td, 'TABLE'); // Do not sort single a row - if (t.rows.length <= 1) return; + if (t.rows.length <= 1) { + return; + } // Determine if all rows are equal - var first = ts_get_cell_data(t.tBodies[0].rows[0], 0); - var itm = first; - var i = 0; - while (itm == first && i < t.tBodies[0].rows.length) { - var itm = ts_get_cell_data(t.tBodies[0].rows[i], column); + first = ts_get_cell_data(t.tBodies[0].rows[0], 0); + itm = first; + i = 0; + while (itm === first && i < t.tBodies[0].rows.length) { + itm = ts_get_cell_data(t.tBodies[0].rows[i], column); itm = trim(itm); - if (itm.substr(0,4) == "