var Sortable = {
lastKey : 'key0'
,
load: function() {
if (!document.getElementsByTagName) return;
tables = document.getElementsByTagName("table"
);
for (var i=tables.length - 1
; i >=
0
; i--) {
table = tables[i];
if (((' '
+ table.className.toLowerCase() + ' '
).indexOf("sortable"
) !=
-1
)) {
Sortable.create(table);
}
}
},
sort: function(table, key, reverse) {
var tbody;
for (var i = 0
; i < table.tBodies.length; i++) {
tbody=table.tBodies[i];
if (!tbody.lines) continue;
if (tbody.lines[0
][key] ===
+tbody.lines[0
][key]) {
var comparator=function(a, b) {
return a[key] - b[key];
}
if (reverse) tbody.lines.reverse(comparator);
else tbody.lines.sort(comparator);
}
else {
var save = String.prototype.toString;
if (Sortable.lastKey &&
Sortable.lastKey !=
key) String.prototype.toString = function () { return this[key]+this[Sortable.lastKey];};
else String.prototype.toString = function () { return this[key];};
if (reverse) tbody.lines.reverse();
else tbody.lines.sort();
String.prototype.toString = save;
}
tbody.innerHTML=tbody.lines.join("\n"
);
}
Sortable.zebra(table);
},
create: function(table) {
if (table.sortable) return false;
if (table.rows.length < 2
) return false;
if (!table.tHead) {
table.createTHead().appendChild(table.rows[0
]);
}
var row, s;
for (var i = 0
; i < table.tBodies.length; i++) {
table.tBodies[i].lines=new Array();
for (j=table.tBodies[i].rows.length-1
; j >=
0
; j--) {
row=table.tBodies[i].rows[j];
Sortable.paint(row, j);
s=new String(row.outerHTML ||
new XMLSerializer().serializeToString(row).replace(' xmlns="http://www.w3.org/1999/xhtml"'
, ''
));
for (k=row.cells.length -1
; k>-1
; k--) s['key'
+k]=Sortable.key(row.cells[k]);
table.tBodies[i].lines[j]=s;
}
}
firstRow = table.tHead.rows[0
]; var cell;
for (var i=0
;i<firstRow.cells.length;i++) {
cell = firstRow.cells[i];
var text = cell.innerText ||
cell.textContent;
if (cell.className.indexOf("unsort"
) !=
-1
||
cell.className.indexOf("nosort"
) !=
-1
||
Sortable.trim(text) ==
''
) continue;
cell.table=table;
cell.innerHTML = '<a href="#" class="sortheader" onclick="Sortable.sort(this.parentNode.table, \'key'
+i+'\', this.reverse); this.reverse=!this.reverse ;return false;">↓'
+text+'↑</a>'
; }
table.sortable=true;
return true;
},
key: function(text) {
if (typeof text ==
'string'
);
else if (text.textContent) text=text.textContent;
else text=text.innerHTML.replace(/<.+>/g, ''
);
text=Sortable.trim(text);
n=parseFloat(text.replace(/,/g, '.'
).replace(/[ ]/g, ''
));
if (isNaN(n)) {
text=text.toLowerCase().replace(/œ/g, 'oe'
).replace(/æ/g, 'ae'
).replace(/ç/g, 'c'
).replace(/ñ/g, 'n'
).replace(/[éèêë]/g, 'e'
).replace(/[àâä]/g, 'a'
).replace(/[ïîí]/g, 'i'
).replace(/úûü/, 'u'
) +"__________"
;
return text.substring(0
, 10
) ;
}
else {
return n;
}
},
zebra: function (table) {
for (var i = 0
; i < table.tBodies.length; i++) {
for (j=table.tBodies[i].rows.length -1
; j >=
0
; j--) this.paint(table.tBodies[i].rows[j], j);
}
},
paint: function(row, i) {
row.className=" "
+row.className+" "
;
row.className=row.className.replace(/ *(odd|even|mod5|mod10) */g, ' '
);
if ( (i % 2
) ==
0
) row.className+=" even"
;
if ( (i % 2
) ==
1
) row.className+=" odd"
;
if ( (i % 5
) ==
0
) row.className+=" mod5"
;
if ( (i % 10
) ==
0
) row.className+=" mod10"
;
},
trim : function ( s ){
var start = -1
,
end = s.length;
while( s.charCodeAt(--end) < 33
);
while( s.charCodeAt(++start) < 33
);
return s.slice( start, end + 1
);
}
}
if(window.document.body) Sortable.load();