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();