JSLint sortable.js

git-svn-id: https://dev.finn.de/svn/cockpit/branches/reporting_merge@2005 7926756e-e54e-46e6-9721-ed318f58905e
pull/6827/head
t.felgentreff 14 years ago
parent 5e7892e91d
commit e8a7119f6c
  1. 327
      assets/javascripts/sortable.js

@ -36,30 +36,91 @@ var alternate_row_colors = true;
var SORT_COLUMN_INDEX; var SORT_COLUMN_INDEX;
var thead = false; var thead = false;
function sortables_init() { function alternate(table) {
// Find table with id sortable-table and make them sortable // Take object table and get all it's tbodies.
if (!document.getElementById) return; var i, j, tableBodies, tableRows;
tbl = document.getElementById("sortable-table"); tableBodies = table.getElementsByTagName("tbody");
ts_makeSortable(tbl); // 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) { function ts_makeSortable(t) {
var firstRow, i, cell, txt;
if (t.rows && t.rows.length > 0) { if (t.rows && t.rows.length > 0) {
if (t.tHead && t.tHead.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; thead = true;
} else { } 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 // 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++) { for (i = 0; i < firstRow.cells.length; i += 1) {
var cell = firstRow.cells[i]; cell = firstRow.cells[i];
var txt = ts_getInnerText(cell); txt = ts_getInnerText(cell);
if (cell.className != "unsortable" && cell.className.indexOf("unsortable") == -1) { if (cell.className !== "unsortable" && cell.className.indexOf("unsortable") === -1) {
cell.innerHTML = '<a href="#" class="sortheader sort" onclick="ts_resortTable(this, '+i+');return false;">'+txt+'</a>'; cell.innerHTML = '<a href="#" class="sortheader sort" onclick="ts_resortTable(this, ' +
i +
');return false;">' +
txt +
'</a>';
} }
} }
if (alternate_row_colors) { if (alternate_row_colors) {
@ -67,156 +128,161 @@ function ts_makeSortable(t) {
} }
} }
function ts_getInnerText(el) { function sortables_init() {
if (typeof el == "string") return el; // Find table with id sortable-table and make them sortable
if (typeof el == "undefined") { return el }; if (!document.getElementById) {
if (el.innerText) return el.innerText; //Not needed but it is faster return;
var str = ""; }
var tbl = document.getElementById("sortable-table");
ts_makeSortable(tbl);
}
var cs = el.childNodes; function getParent(el, pTagName) {
var l = cs.length; if (el === null) {
for (var i = 0; i < l; i++) { return null;
switch (cs[i].nodeType) { } else if (el.nodeType === 1 && el.tagName.toLowerCase() === pTagName.toLowerCase()) {
case 1: //ELEMENT_NODE return el;
str += ts_getInnerText(cs[i]); } else {
break; return getParent(el.parentNode, pTagName);
case 3: //TEXT_NODE
str += cs[i].nodeValue;
break;
}
} }
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) { function ts_resortTable(lnk, clid) {
var span; var td, column, t, first, itm, i, j, k, numeric_flag, all_sort_links, ci, firstRow, newRows, sortfn;
var td = lnk.parentNode; td = lnk.parentNode;
var column = clid || td.cellIndex; column = clid || td.cellIndex;
var t = getParent(td,'TABLE'); t = getParent(td, 'TABLE');
// Do not sort single a row // Do not sort single a row
if (t.rows.length <= 1) return; if (t.rows.length <= 1) {
return;
}
// Determine if all rows are equal // Determine if all rows are equal
var first = ts_get_cell_data(t.tBodies[0].rows[0], 0); first = ts_get_cell_data(t.tBodies[0].rows[0], 0);
var itm = first; itm = first;
var i = 0; i = 0;
while (itm == first && i < t.tBodies[0].rows.length) { while (itm === first && i < t.tBodies[0].rows.length) {
var itm = ts_get_cell_data(t.tBodies[0].rows[i], column); itm = ts_get_cell_data(t.tBodies[0].rows[i], column);
itm = trim(itm); itm = trim(itm);
if (itm.substr(0,4) == "<!--" || itm.length == 0) { if (itm.substr(0, 4) === "<!--" || itm.length === 0) {
itm = ""; itm = "";
} }
i++; i += 1;
}
if (itm === first) {
return;
} }
if (itm == first) return;
// Determine the sort type. You can set numeric=true on the header to force numeric sorting // Determine the sort type. You can set numeric=true on the header to force numeric sorting
sortfn = ts_sort_caseinsensitive; sortfn = ts_sort_caseinsensitive;
if (thead) { if (thead) {
if (itm.match(/-?\d+(?:\.\d+)?/)) sortfn = ts_sort_numeric; // Normal number if (itm.match(/-?\d+(?:\.\d+)?/)) {
var numeric_flag = t.tHead.rows[0].cells[column].getAttribute("numeric") sortfn = ts_sort_numeric; // Normal number
if (numeric_flag == "true") { }
numeric_flag = t.tHead.rows[0].cells[column].getAttribute("numeric");
if (numeric_flag === "true") {
sortfn = ts_sort_numeric; sortfn = ts_sort_numeric;
} }
} }
// Delete any other arrows there may be showing // Delete any other arrows there may be showing
var all_sort_links = $$("a.sortheader.sort") all_sort_links = $$("a.sortheader.sort");
for (var ci = 0; ci < all_sort_links.length; ci++) { for (ci = 0; ci < all_sort_links.length; ci += 1) {
if (getParent(all_sort_links[ci],"table") == getParent(lnk,"table")) { // in the same table as us? if (getParent(all_sort_links[ci], "table") === getParent(lnk, "table")) { // in the same table as us?
all_sort_links[ci].className = all_sort_links[ci].className.replace(" desc", "").replace(" asc", ""); all_sort_links[ci].className = all_sort_links[ci].className.replace(" desc", "").replace(" asc", "");
} }
} }
// Do the sorting // Do the sorting
SORT_COLUMN_INDEX = column; SORT_COLUMN_INDEX = column;
var firstRow = new Array(); firstRow = [];
var newRows = new Array(); newRows = [];
for (k=0;k<t.tBodies.length;k++) { for (k = 0; k < t.tBodies.length; k += 1) {
for (i=0;i<t.tBodies[k].rows[0].length;i++) { for (i = 0; i < t.tBodies[k].rows[0].length; i += 1) {
firstRow[i] = t.tBodies[k].rows[0][i]; firstRow[i] = t.tBodies[k].rows[0][i];
} }
} }
for (k=0;k<t.tBodies.length;k++) { for (k = 0; k < t.tBodies.length; k += 1) {
if (!thead) { if (!thead) {
// Skip the first row // Skip the first row
for (j=1;j<t.tBodies[k].rows.length;j++) { for (j = 1; j < t.tBodies[k].rows.length; j += 1) {
newRows[j-1] = t.tBodies[k].rows[j]; newRows[j - 1] = t.tBodies[k].rows[j];
} }
} else { } else {
// Do NOT skip the first row // Do NOT skip the first row
for (j=0;j<t.tBodies[k].rows.length;j++) { for (j = 0; j < t.tBodies[k].rows.length; j += 1) {
newRows[j] = t.tBodies[k].rows[j]; newRows[j] = t.tBodies[k].rows[j];
} }
} }
} }
newRows.sort(sortfn); newRows.sort(sortfn);
if (lnk.getAttribute("sortdir") == 'down') { if (lnk.getAttribute("sortdir") === 'down') {
lnk.setAttribute('sortdir','up'); lnk.setAttribute('sortdir', 'up');
lnk.className += " asc"; lnk.className += " asc";
} else { } else {
newRows.reverse(); newRows.reverse();
lnk.setAttribute('sortdir','down'); lnk.setAttribute('sortdir', 'down');
lnk.className += " desc"; lnk.className += " desc";
} }
// We appendChild rows that already exist to the tbody, so it moves them rather than creating new ones // We appendChild rows that already exist to the tbody, so it moves them rather than creating new ones
// don't do sortbottom rows // don't do sortbottom rows
for (i=0; i<newRows.length; i++) { for (i = 0; i < newRows.length; i += 1) {
if (!newRows[i].className || (newRows[i].className && (newRows[i].className.indexOf('sortbottom') == -1))) { if (!newRows[i].className || (newRows[i].className && (newRows[i].className.indexOf('sortbottom') === -1))) {
t.tBodies[0].appendChild(newRows[i]); t.tBodies[0].appendChild(newRows[i]);
} }
} }
// do sortbottom rows only // do sortbottom rows only
for (i=0; i<newRows.length; i++) { for (i = 0; i < newRows.length; i += 1) {
if (newRows[i].className && (newRows[i].className.indexOf('sortbottom') != -1)) if (newRows[i].className && (newRows[i].className.indexOf('sortbottom') !== -1)) {
t.tBodies[0].appendChild(newRows[i]); t.tBodies[0].appendChild(newRows[i]);
}
} }
alternate(t); alternate(t);
} }
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 ts_get_cell_data(a, idx) {
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 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 compare_numeric(a,b) {
var a = parseFloat(a);
a = (isNaN(a) ? 0 : a);
var b = parseFloat(b);
b = (isNaN(b) ? 0 : b);
return a - b;
}
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 addEvent(elm, evType, fn, useCapture) function addEvent(elm, evType, fn, useCapture)
// addEvent and removeEvent // addEvent and removeEvent
// cross-browser event handling for IE5+, NS6 and Mozilla // cross-browser event handling for IE5+, NS6 and Mozilla
@ -225,49 +291,16 @@ function addEvent(elm, evType, fn, useCapture)
if (elm.addEventListener) { if (elm.addEventListener) {
elm.addEventListener(evType, fn, useCapture); elm.addEventListener(evType, fn, useCapture);
return true; return true;
} else if (elm.attachEvent){ } else if (elm.attachEvent) {
var r = elm.attachEvent("on"+evType, fn); var r = elm.attachEvent("on" + evType, fn);
return r; return r;
} else { } else {
alert("Handler could not be removed"); alert("Handler could not be removed");
} }
} }
function clean_num(str) { function clean_num(str) {
str = str.replace(/^[^-?\d]+/, ""); str = str.replace(/^[^\-?\d]+/, "");
str.replace(/(\d),(\d)/g, "$1$2") str.replace(/(\d),(\d)/g, "$1$2");
return str; return str;
} }
function trim(s) {
return s.replace(/^\s+|\s+$/g, "");
}
function alternate(table) {
// Take object table and get all it's tbodies.
var tableBodies = table.getElementsByTagName("tbody");
// Loop through these tbodies
for (var i = 0; i < tableBodies.length; i++) {
// Take the tbody, and get all it's rows
var tableRows = tableBodies[i].getElementsByTagName("tr");
// Loop through these rows
// Start at 1 because we want to leave the heading row untouched
for (var j = 0; j < tableRows.length; j++) {
// 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";
}
}
}
}
}
}

Loading…
Cancel
Save