//  Stuart Langridge, http://www.kryogenix.org/code/browser/sorttable/

var stIsIE = /* @cc_on!@ */false;
DATE_RE = /^(\d\d?)[\/\.-](\d\d?)[\/\.-]((\d\d)?\d\d)$/;

function makeSortable(tabla) {
table = document.getElementById(tabla)
if (table.getElementsByTagName('thead').length == 0) {
 the = document.createElement('thead');
 the.appendChild(table.rows[0]);
 table.insertBefore(the,table.firstChild);
}
if (table.tHead == null) table.tHead = table.getElementsByTagName('thead')[0];
if (table.tHead.rows.length != 1) return; 
sortbottomrows = [];
for (var i=0; i<table.rows.length; i++) { if (table.rows[i].className.search(/\bsortbottom\b/) != -1) sortbottomrows[sortbottomrows.length] = table.rows[i]; }
if (sortbottomrows) {
 if (table.tFoot == null) { tfo = document.createElement('tfoot'); table.appendChild(tfo); }
 for (var i=0; i<sortbottomrows.length; i++) tfo.appendChild(sortbottomrows[i]);
 delete sortbottomrows;
}
headrow = table.tHead.rows[0].cells;
for (var i=0; i<headrow.length; i++) {
 if (!headrow[i].className.match(/\bsorttable_nosort\b/)) {
  mtch = headrow[i].className.match(/\bsorttable_([a-z0-9]+)\b/);
  if (mtch) override = mtch[1];
	  if (mtch && typeof sorttable["sort_"+override] == 'function') headrow[i].sorttable_sortfunction = sorttable["sort_"+override];
	  else	 headrow[i].sorttable_sortfunction = guessType(table,i);
  	headrow[i].sorttable_columnindex = i;
	  headrow[i].sorttable_tbody = table.tBodies[0];
  headrow[i].addEventListener("click", eee, false)
	 }
}
}

function eee() {
if (this.className.search(/\bsorttable_sorted\b/) != -1) {
 reverse(this.sorttable_tbody);
 this.className = this.className.replace('sorttable_sorted','sorttable_sorted_reverse');
 this.removeChild(document.getElementById('sorttable_sortfwdind'));
 sortrevind = document.createElement('span');
 sortrevind.id = "sorttable_sortrevind";
 sortrevind.innerHTML = stIsIE ? '&nbsp<font face="webdings">5</font>' : '&nbsp;&#x25B4;';
 this.appendChild(sortrevind);
 return;
}
if (this.className.search(/\bsorttable_sorted_reverse\b/) != -1) {
 reverse(this.sorttable_tbody);
 this.className = this.className.replace('sorttable_sorted_reverse','sorttable_sorted');
 this.removeChild(document.getElementById('sorttable_sortrevind'));
 sortfwdind = document.createElement('span');
 sortfwdind.id = "sorttable_sortfwdind";
 sortfwdind.innerHTML = stIsIE ? '&nbsp<font face="webdings">6</font>' : '&nbsp;&#x25BE;';
 this.appendChild(sortfwdind);
 return;
}
theadrow = this.parentNode;
for (var prop in theadrow.childNodes) { fff(prop); }
sortfwdind = document.getElementById('sorttable_sortfwdind');
if (sortfwdind) sortfwdind.parentNode.removeChild(sortfwdind);
sortrevind = document.getElementById('sorttable_sortrevind');
if (sortrevind) sortrevind.parentNode.removeChild(sortrevind);
this.className += ' sorttable_sorted';
sortfwdind = document.createElement('span');
sortfwdind.id = "sorttable_sortfwdind";
sortfwdind.innerHTML = stIsIE ? '&nbsp<font face="webdings">6</font>' : '&nbsp;&#x25BE;';
this.appendChild(sortfwdind);
row_array = [];
col = this.sorttable_columnindex;
rows = this.sorttable_tbody.rows;
for (var j=0; j<rows.length; j++) row_array[row_array.length] = [getInnerText(rows[j].cells[col]), rows[j]];
row_array.sort(this.sorttable_sortfunction);
tb = this.sorttable_tbody;
for (var j=0; j<row_array.length; j++) tb.appendChild(row_array[j][1]);
delete row_array;
};


function fff(cell) {
if (cell.nodeType == 1) {
 cell.className = cell.className.replace('sorttable_sorted_reverse','');
 cell.className = cell.className.replace('sorttable_sorted','');
 }
}


function guessType(table, column) {
sortfn = sort_alpha;
for (var i=0; i<table.tBodies[0].rows.length; i++) {
text = getInnerText(table.tBodies[0].rows[i].cells[column]);
if (text != '') {
 if (text.match(/^-?[�$�]?[\d,.]+%?$/)) return sort_numeric;
 possdate = text.match(DATE_RE)
 if (possdate) {
  first = parseInt(possdate[1]);
  second = parseInt(possdate[2]);
  if (first > 12) return sort_ddmm;
  else if (second > 12) return sort_mmdd; else sortfn = sort_ddmm;
 }
}
}
return sortfn;
}

function getInnerText(node) {
hasInputs = (typeof node.getElementsByTagName == 'function') && node.getElementsByTagName('input').length;
if (node.getAttribute("sorttable_customkey") != null) { return node.getAttribute("sorttable_customkey"); }
else if (typeof node.textContent != 'undefined' && !hasInputs) { return node.textContent.replace(/^\s+|\s+$/g, ''); }
else if (typeof node.innerText != 'undefined' && !hasInputs) { return node.innerText.replace(/^\s+|\s+$/g, ''); }
else if (typeof node.text != 'undefined' && !hasInputs) { return node.text.replace(/^\s+|\s+$/g, ''); }
 else {
 switch (node.nodeType) {
 case 3: if (node.nodeName.toLowerCase() == 'input') return node.value.replace(/^\s+|\s+$/g, '');
 case 4: return node.nodeValue.replace(/^\s+|\s+$/g, ''); break;
 case 1: case 11:
  var innerText = '';
  for (var i = 0; i < node.childNodes.length; i++) innerText += getInnerText(node.childNodes[i]);
  return innerText.replace(/^\s+|\s+$/g, '');
  break;
 default: return '';
}
}
}

function reverse(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]);
delete newrows;
}

function sort_numeric(a,b) {
aa = parseFloat(a[0].replace(/[^0-9-]/g,''));
if (isNaN(aa)) aa = 0;
bb = parseFloat(b[0].replace(/[^0-9-]/g,'')); 
if (isNaN(bb)) bb = 0;
return aa-bb;
}

function sort_alpha(a,b) {
if (a[0]==b[0]) return 0;
if (a[0]<b[0]) return -1;
return 1;
//return a.localeCompare(b)
}

function sort_ddmm(a,b) {
mtch = a[0].match(DATE_RE);
y = mtch[3]; m = mtch[2]; d = mtch[1];
if (m.length == 1) m = '0'+m;
if (d.length == 1) d = '0'+d;
dt1 = y+m+d;
mtch = b[0].match(DATE_RE);
y = mtch[3]; m = mtch[2]; d = mtch[1];
if (m.length == 1) m = '0'+m;
if (d.length == 1) d = '0'+d;
dt2 = y+m+d;
if (dt1==dt2) return 0;
if (dt1<dt2) return -1;
return 1;
}

function sort_mmdd(a,b) {
mtch = a[0].match(DATE_RE);
y = mtch[3]; d = mtch[2]; m = mtch[1];
if (m.length == 1) m = '0'+m;
if (d.length == 1) d = '0'+d;
dt1 = y+m+d;
mtch = b[0].match(DATE_RE);
y = mtch[3]; d = mtch[2]; m = mtch[1];
if (m.length == 1) m = '0'+m;
if (d.length == 1) d = '0'+d;
dt2 = y+m+d;
if (dt1==dt2) return 0;
if (dt1<dt2) return -1;
return 1;
}

function shaker_sort(list, comp_func) {
var b = 0;
var t = list.length - 1;
var swap = true;
while(swap) {
 swap = false;
 for(var i = b; i < t; ++i) {
 if ( comp_func(list[i], list[i+1]) > 0 ) {
  var q = list[i]; list[i] = list[i+1]; list[i+1] = q;
  swap = true;
 }
} t--;
if (!swap) break;
for(var i = t; i > b; --i) {
if ( comp_func(list[i], list[i-1]) < 0 ) {
 var q = list[i]; list[i] = list[i-1]; list[i-1] = q;
 swap = true;
}
} b++;
}
} 
