summaryrefslogtreecommitdiffstats
path: root/usr/local/www/javascript/sorttable.js
diff options
context:
space:
mode:
Diffstat (limited to 'usr/local/www/javascript/sorttable.js')
-rw-r--r--usr/local/www/javascript/sorttable.js87
1 files changed, 70 insertions, 17 deletions
diff --git a/usr/local/www/javascript/sorttable.js b/usr/local/www/javascript/sorttable.js
index a66aafb..e86ba5d 100644
--- a/usr/local/www/javascript/sorttable.js
+++ b/usr/local/www/javascript/sorttable.js
@@ -13,6 +13,12 @@
Thanks to many, many people for contributions and suggestions.
Licenced as X11: http://www.kryogenix.org/code/browser/licence.html
This basically means: do what you want with it.
+
+ -- pfSense modifications --
+ Allow for sorting of IP adresses
+ 2012-09-15 Allow for multiple header rows, using "sortableHeaderRowIdentifier" class for the TR that has the column headers. (used in firewall-log)
+ 2012-09-15 Allow sorting multiple dual/mutlti rows together, using sortablemultirow="2" attribute for the table
+ 2012-09-15 Allow sorting of IP:Port texts, changed sort compare function
*/
@@ -50,7 +56,27 @@ sorttable = {
// Safari doesn't support table.tHead, sigh
if (table.tHead == null) table.tHead = table.getElementsByTagName('thead')[0];
- if (table.tHead.rows.length != 1) return; // can't cope with two header rows
+ headrow = undefined;
+ if (table.tHead.rows.length == 1)
+ headrow = table.tHead.rows[0].cells;
+ else
+ {
+ //if multiple rows are found one must be marked with class <tr class="sortableHeaderRowIdentifier">
+ for (var i=0; i<table.tHead.rows.length; i++) {
+ if (table.tHead.rows[i].className.search(/\bsortableHeaderRowIdentifier\b/) != -1)
+ {
+ headrow = table.tHead.rows[i].cells;
+ break;
+ }
+ }
+ }
+ if (headrow == undefined)
+ return;
+
+ if (table.getAttribute("sortableMultirow") != undefined)
+ sortableMultirow = parseInt(table.getAttribute("sortableMultirow"));
+ else
+ sortableMultirow = 1;
// Sorttable v1 put rows with a class of "sortbottom" at the bottom (as
// "total" rows, for example). This is B&R, since what you're supposed
@@ -75,7 +101,6 @@ sorttable = {
}
// work through each column and calculate its type
- headrow = table.tHead.rows[0].cells;
for (var i=0; i<headrow.length; i++) {
// manually override the type with a sorttable_type attribute
if (!headrow[i].className.match(/\bsorttable_nosort\b/)) { // skip this col
@@ -84,7 +109,7 @@ sorttable = {
if (mtch && typeof sorttable["sort_"+override] == 'function') {
headrow[i].sorttable_sortfunction = sorttable["sort_"+override];
} else {
- headrow[i].sorttable_sortfunction = sorttable.guessType(table,i);
+ headrow[i].sorttable_sortfunction = sorttable.guessType(table,i, sortableMultirow);
}
// make it clickable to sort
headrow[i].sorttable_columnindex = i;
@@ -94,7 +119,7 @@ sorttable = {
if (this.className.search(/\bsorttable_sorted\b/) != -1) {
// if we're already sorted by this column, just
// reverse the table, which is quicker
- sorttable.reverse(this.sorttable_tbody);
+ sorttable.reverse(this.sorttable_tbody, sortableMultirow);
this.className = this.className.replace('sorttable_sorted',
'sorttable_sorted_reverse');
this.removeChild(document.getElementById('sorttable_sortfwdind'));
@@ -107,7 +132,7 @@ sorttable = {
if (this.className.search(/\bsorttable_sorted_reverse\b/) != -1) {
// if we're already sorted by this column in reverse, just
// re-reverse the table, which is quicker
- sorttable.reverse(this.sorttable_tbody);
+ sorttable.reverse(this.sorttable_tbody, sortableMultirow);
this.className = this.className.replace('sorttable_sorted_reverse',
'sorttable_sorted');
this.removeChild(document.getElementById('sorttable_sortrevind'));
@@ -144,8 +169,12 @@ sorttable = {
row_array = [];
col = this.sorttable_columnindex;
rows = this.sorttable_tbody.rows;
- for (var j=0; j<rows.length; j++) {
+ for (var j=0; j<rows.length; j+=sortableMultirow) {
row_array[row_array.length] = [sorttable.getInnerText(rows[j].cells[col]), rows[j]];
+ for(var k=1; k < sortableMultirow;k++)
+ {
+ row_array[row_array.length-1][k+1]=rows[j+k];
+ }
}
/* If you want a stable sort, uncomment the following line */
//sorttable.shaker_sort(row_array, this.sorttable_sortfunction);
@@ -154,7 +183,15 @@ sorttable = {
tb = this.sorttable_tbody;
for (var j=0; j<row_array.length; j++) {
- tb.appendChild(row_array[j][1]);
+ for(var k=0; k<sortableMultirow; k++) {
+ row = row_array[j][k+1];
+ if (j % 2 == 0)
+ row.className = row.className.replace(' listMReven',' listMRodd');
+ else
+ row.className = row.className.replace(' listMRodd',' listMReven');
+
+ tb.appendChild(row);
+ }
}
delete row_array;
@@ -163,13 +200,13 @@ sorttable = {
}
},
- guessType: function(table, column) {
+ guessType: function(table, column, sortableMultirow) {
// guess the type of a column based on its first non-blank row
sortfn = sorttable.sort_alpha;
- for (var i=0; i<table.tBodies[0].rows.length; i++) {
+ for (var i=0; i<table.tBodies[0].rows.length; i+=sortableMultirow) {
text = sorttable.getInnerText(table.tBodies[0].rows[i].cells[column]);
if (text != '') {
- if (text.match(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/)) {
+ if (text.match(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(\:[0-9]{1,5})?\b/)) {
return sorttable.sort_ipaddr;
}
if (text.match(/^-?[£$¤]?[\d,.]+%?$/)) {
@@ -244,14 +281,17 @@ sorttable = {
}
},
- reverse: function(tbody) {
+ reverse: function(tbody, sortableMultirow) {
// reverse the rows in a tbody
newrows = [];
for (var i=0; i<tbody.rows.length; i++) {
newrows[newrows.length] = tbody.rows[i];
}
- for (var i=newrows.length-1; i>=0; i--) {
- tbody.appendChild(newrows[i]);
+ for (var i=newrows.length-1; i>=0; i-=sortableMultirow) {
+ for(var j=sortableMultirow-1;j>=0;j--)
+ {
+ tbody.appendChild(newrows[i-j]);
+ }
}
delete newrows;
},
@@ -346,12 +386,25 @@ sorttable = {
function ip2ulong(ip) {
ip += "";
var ulip = false;
- var octets = [];
- if (ip.match(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/)) {
- octets = ip.split('.');
+ var octets = [];
+ ipmatch = ip.match(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/);// IP only
+ if (ipmatch) {
+ ipmatch+="";
+ octets = ipmatch.split('.');
for (i=0; i < 4; i++) {
- ulip += octets[i] * Math.pow(256, (3-i));
+ ulip += octets[i] * Math.pow(256, (5-i));
}
+ } else {
+ ipportmatch = ip.match(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:[0-9]{1,5}\b/);// IP:port
+ if (ipportmatch) {
+ ipportmatch += "";
+ ipport = ipportmatch.split(':');
+ octets = ipport[0].split('.');
+ for (i=0; i < 4; i++) {
+ ulip += octets[i] * Math.pow(256, (5-i));
+ }
+ ulip += parseInt(ipport[1]);
+ }
}
return ulip;
}
OpenPOWER on IntegriCloud