// created by http://www.kryogenix.org/code/browser/sorttable/
// modified by Ulyses

function grabText(o) {

	if(typeof(o)=="string"||typeof(o)=="undefined") return(o);
	if(o.innerText) return(o.innerText); // IE
	if(o.textContent) return(o.textContent); // FireFox + Opera

	var z='',r=o.childNodes;

	for(var i=0; i<r.length; i++) { switch(r[i].nodeType) {
	
		case 1: z+=grabText(r[i]); break; // ELEMENT_NODE
		case 3:	z+=r[i].nodeValue; break; // TEXT_NODE

	} }
	
	return(z);
}

function resortTable(o,id) 
{ 
	SORT_INDEX=id||o.parentNode.cellIndex;

	var T=getParent(o.parentNode,'TABLE'); if(T.rows.length<=1) return;

	var rX=grabText(T.rows[1].cells[SORT_INDEX]), S=$T('span',o)[0], r=new Array();

	if(rX.match(/^\d\d[\/-]\d\d[\/-][0-9]{2,4}$/)) fn=sortDate;
	else if(rX.match(/^[\d\.]+$/)) fn=sortNumeric;
	else if(rX.match(/^[£$]/)) fn=sortCurrency;
	else fn=sortLower;

	for(i=1; i<T.rows.length; i++) { r[i-1]=T.rows[i]; } r.sort(fn);

	if(S.innerHTML=='?') { r.reverse(); S.innerHTML='?'; } else { S.innerHTML='?'; }

	if($('prevTH')) $T('span',$('prevTH'))[0].innerHTML='&nbsp;'; iSW('prevTH',o);

	for(i=0; i<r.length; i++) { T.tBodies[0].appendChild(r[i]); }

}

function sortCurrency(a,b) {

	function z(v) { return(grabText(v.cells[SORT_INDEX]).replace(/[^0-9.]/g,'')); }

	return(parseFloat(z(a))-parseFloat(z(b)));

}

function sortDate(a,b) { a=z(a); b=z(b);

	function z(v) { v=grabText(v.cells[SORT_INDEX]); return(v.substr(6,v.length==10?4:2)+v.substr(3,2)+v.substr(0,2)); }

    return((a==b?0:(a<b?-1:1)));

}

function sortNumeric(a,b) { a=z(a); b=z(b);

	function z(v) { return(parseFloat(grabText(v.cells[SORT_INDEX]))); }
	
    return((isNaN(a)?a:0)-(isNaN(b)?b:0));

}

function sortLower(a,b) { a=z(a); b=z(b);

	function z(v) { return(grabText(v.cells[SORT_INDEX]).toLowerCase()); }

    return((a==b)?0:((a<b)?-1:1));

}

function getParent(o,tag) {

	if(o==null) return null;
	else if(o.nodeType==1 && o.tagName.toLowerCase()==tag.toLowerCase()) return(o);
	else return(getParent(o.parentNode,tag));

}



function $(v) { return(document.getElementById(v)); }
function $T(v,i) { return((typeof(i)=='string'?$(i):(i?i:document)).getElementsByTagName(v)); }
function agent(v) { return(Math.max(navigator.userAgent.toLowerCase().indexOf(v),0)); }
function inArray(v,r) { for(var i in r) if(r[i]==v) return true; } 

function iSW(w,n) 
{ 
	if($(w)) $(w).id=''; 
	if(n) n.id=w; 
}

/* TBODY */

function trMAP(a,b,z) 
{ 
	// AC: do you want numbers in the first column? prior content will be overwritten...
	$rownumbers = false;
	var s=a%2?0:1; for(var i=a?a:0; i<=(b?b:Trl); i++) 
	{ 
		Tr[i].className=(s=!s)?'even':'odd'; 
		if($rownumbers == true) Tr[i].cells[0].innerHTML=i+1; 		
		if(z) trMouse(Tr[i]); 
	} 
}

function trMV(w,n) 
{
	// AC: do you want the rows to be moved with mouseclick?
	$moverows = false;
	if ($moverows == false) return;
	
	w-=1; n-=1; var b=n<=w?n+1:n-1, z=Tb.replaceChild(Tr[w],Tr[n]); 
	Tb.insertBefore(z,Tr[b]); 
	trMAP(Math.min(w,n),Math.max(w,n)); 
}

function trRM(o) 
{ 
	var v=o.rowIndex
	; T.deleteRow(v); 
	Tr[v-1].id='this'; 
	Trl-=1; 
	trMAP(v-1); 
}

function trMouse(o) 
{
	o.onclick=function()
	{ 
		if(stop) return false; 
	};
	o.onmousedown=function()
	{ 
		stop=1; 
		iSW('this',this); 
		document.onmouseup=function()
		{ 
			var v=$('hover'); 
			if(v) 
			{ 
				v.id=''; 
				trMV($('this').rowIndex,v.rowIndex);
			} 
			stop=0; 
		}; 
	};
	o.onmouseover=function()
	{ 
		iSW('hover',(stop && this.id!='this')?this:''); 
	};

}

/* THEAD */

function thMV(w,n) 
{ 
	var r=T.rows,v='',b='',z='';

	for(var i=0; i<r.length; i++) 
	{ 
		v=r[i].cells; SW(v[w],v[n],'innerHTML'); 
		if(i==0) 
		{ 
			SW(v[w],v[n],'style.width'); 
		} 
	}

}

function thMouse(r,R) 
{
	for(var i=0; i<r.length; i++) 
	{ 
		if((R && !inArray(i,R)) || !R) 
		{
			r[i].onclick=function() 
			{ 
				resortTable(this,this.cellIndex); 
				if(this.cellIndex!=0) trMAP(0); 
			};
			r[i].onmousedown=function() 
			{ 
				stopTH=1; 
				iSW('thisTH',this); document.onmouseup=function() 
				{ 
					var v=$('hoverTH'); 
					if(v) 
					{ 
						v.id=''; 
						thMV($('thisTH').cellIndex,v.cellIndex); 
					} 
					stopTH=0; 
				}; 
			};
			r[i].onmouseover=function() 
			{ 
				iSW('hoverTH',(stopTH && this.id!='thisTH')?this:''); 
			};
		} 
	}
}

function SW(w,n,v) 
{ 
	function f(a,b) 
	{ 
		return(eval("a."+v+(b?"='"+b+"'":'')+";")); 
	}; 
	var z=f(n); 
	f(n,f(w)); 
	f(w,z); 
}

/* KEY STROKE */

function mkTime(v) { var z=new Date().getTime(v); return(z); }
function kCode(e) { var k=agent('opera')?e.kCode:(agent('msie')?event.keyCode:e.which); return(k); }
function kRun(e,r,fn) { var k=kCode(e); if(inArray(k,r) && !stopK[1]) { stopK=Array('',mkTime()); kStop(k,fn); } }
function kStop(k,fn) { if(!stopK[0]) { if(fn) fn(k); setTimeout("kStop('"+k+"',"+fn+")",120/((mkTime()-stopK[1]>500)?3:1)); } else { stopK[1]=''; } }