String.prototype.stripHTML = function()
{
        var matchTag = /<(?:.|\s)*?>/g;
        return this.replace(matchTag, "");
};

var sortCharsTable=new Array();
sortCharsTable['´'.charCodeAt(0)]='ã'.charCodeAt(0)+0.5;
sortCharsTable['º'.charCodeAt(0)]='å'.charCodeAt(0)+0.3;
sortCharsTable['³'.charCodeAt(0)]='è'.charCodeAt(0)+0.3;
sortCharsTable['¿'.charCodeAt(0)]='è'.charCodeAt(0)+0.6;
sortCharsTable['¸'.charCodeAt(0)]='å'.charCodeAt(0)+0.6;
sortCharsTable['¥'.charCodeAt(0)]='Ã'.charCodeAt(0)+0.5;
sortCharsTable['ª'.charCodeAt(0)]='Å'.charCodeAt(0)+0.3;
sortCharsTable['²'.charCodeAt(0)]='È'.charCodeAt(0)+0.3;
sortCharsTable['¯'.charCodeAt(0)]='È'.charCodeAt(0)+0.6;
sortCharsTable['¨'.charCodeAt(0)]='Å'.charCodeAt(0)+0.6;

function sortCompare(a,b)
{
	if(typeof a!='string'||typeof b!='string')
		if(a<b)return -1;else if(a>b)return 1;else return 0;
	var m=Math.min(a.length,b.length);
	var ac,bc;
	for(var i=0;i<m;i++)
	{
		ac=a.charCodeAt(i);
		if(sortCharsTable[ac])ac=sortCharsTable[ac];
		bc=b.charCodeAt(i);
		if(sortCharsTable[bc])bc=sortCharsTable[bc];
		if(ac<bc)return -1;
		if(ac>bc)return 1;
	}
	if(a.length<b.length)return -1;else if(a.length>b.length)return 1;else return 0;
}

/* Natural Sort algorithm for Javascript Version 0.2. Author: Jim Palmer (based on chunking idea from Dave Koelle). Released under MIT license. */
function natSortAsc (aa, bb) {
        var c,x=aa[0],y=bb[0],
                nC=String.fromCharCode(0),
                xN=x.replace(/([-]{0,1}[0-9.]{1,})/g,nC+'$1'+nC).split(nC),
                yN=y.replace(/([-]{0,1}[0-9.]{1,})/g,nC+'$1'+nC).split(nC),
                xD=Date.parseExact(x,date_format),yD=Date.parseExact(y,date_format);
        if(x==''){if(y=='')return aa[1]-bb[1];else return -1;}
        if(y=='')return 1;
        if(xD&&yD&&xD.getTime()<yD.getTime())return -1;
        else if(xD&&yD&&xD.getTime()>yD.getTime())return 1;
        for(var cLoc=0,numS=Math.max(xN.length,yN.length);cLoc<numS;cLoc++)
        {
            c=sortCompare(parseFloat(xN[cLoc])||xN[cLoc],parseFloat(yN[cLoc])||yN[cLoc]);
        	if(c!=0)return c;
        }
        return aa[1]-bb[1];
}

function natSortDesc (aa, bb) {
        var c,x=bb[0],y=aa[0],
                nC=String.fromCharCode(0),
                xN=x.replace(/([-]{0,1}[0-9.]{1,})/g,nC+'$1'+nC).split(nC),
                yN=y.replace(/([-]{0,1}[0-9.]{1,})/g,nC+'$1'+nC).split(nC),
                xD=Date.parseExact(x,date_format),yD=Date.parseExact(y,date_format);
        if(x==''){if(y=='')return aa[1]-bb[1];else return -1;}
        if(y=='')return 1;
        if(xD&&yD&&xD.getTime()<yD.getTime())return -1;
        else if(xD&&yD&&xD.getTime()>yD.getTime())return 1;
        for(var cLoc=0,numS=Math.max(xN.length,yN.length);cLoc<numS;cLoc++)
        {
            c=sortCompare(parseFloat(xN[cLoc])||xN[cLoc],parseFloat(yN[cLoc])||yN[cLoc]);
        	if(c!=0)return c;
        }
        return aa[1]-bb[1];
}

function listSort(aa, bb)
{	var x=aa[0]; var y=bb[0];	if(x==y)return aa[1]-bb[1];
	for(var i=0;i<tsort_listlen;i++)
		if(tsort_list[i]==x)return -1;
	else if(tsort_list[i]==y)return 1;
	return aa[1]-bb[1];
}

function delquote(s)
{	var l=s.length;	if(l>0&&s.charAt(0)=='(')s=s.substr(1);
	if(l>0&&s.charAt(0)=='«')s=s.substr(1);
	if(l>7&&s.substr(0,7)=='&laquo;')s=s.substr(7);
	return s;
}

var tsort_cur=new Array(),tsort_list,tsort_listlen;

function numsort(a,b){return a-b;}

function tsort(sp,order,aorder)
{	var table_id=sp.parentNode.parentNode.parentNode.parentNode.parentNode.id;	if(typeof tsort_cur[table_id]=='undefined')tsort_cur[table_id]=-1;
	var tn=sp.parentNode.id;
 	var l=tn.lastIndexOf('_');
 	var nm=tn.substr(0,l);
 	var n=parseInt(tn.substr(l+1));
 	var el;
 	if(!aorder)
 	{
 		if(order=='asc'||order=='desc')aorder='none';else
 		{
		    aorder=order.split(",");
		    order='asc';
		}
 	}else if(aorder!='none')aorder=aorder.split(",");
 	if(tsort_cur[table_id]==n)
 	{
	 	if(order=='asc')order='desc';else order='asc';
	 	tsort_cur[table_id]=-1;
		if(el=document.getElementById(nm+'_arrow'))
			el.parentNode.removeChild(el);
	}else
	{		tsort_cur[table_id]=n;
		if(el=document.getElementById(nm+'_arrow2'))
		{			el.parentNode.removeChild(el);
		}
		if(el=document.getElementById(nm+'_arrow'))
		{			el.id=nm+'_arrow2';
			el.src=el.src.substr(0,el.src.length-4)+'2'+el.src.substr(el.src.length-4);
		}
	}
	el=document.createElement('img');
	el.src='/images/table-'+order+'.png';
	el.id=nm+'_arrow';
	sp.parentNode.appendChild(el);
	var isIE6 = /msie|MSIE 6/.test(navigator.userAgent);
	if(isIE6)
	{
  	 	document.getElementById('super').style.height='99%';
   		document.getElementById('super').style.height='100%';
 	}

	var i,tds,trs=document.getElementById(nm).getElementsByTagName('tr'),a=new Array(),ai=new Array(),trs2=new Array(),tcur,from_i;
	if(trs[0].className=='sheader')from_i=3;else from_i=2;
    for(i=from_i;i<trs.length;i++)if(trs[i].className!='to_omit')
    {
     	tds=trs[i].getElementsByTagName('td');
     	a.push(new Array(delquote(tds[n].innerHTML.stripHTML()),i));
     	ai.push(i);
    }
    if(aorder=='none')
	    if(order=='asc')a.sort(natSortAsc);else a.sort(natSortDesc);
	else
	{		if(order=='asc')tsort_list=aorder;else tsort_list=aorder.reverse();
		tsort_listlen=tsort_list.length;		a.sort(listSort);
	}
	ai.sort(numsort);

    for(i=0;i<a.length;i++)
    {
    	tcur=trs[a[i][1]].getElementsByTagName('td');
    	trs2[i]=new Array();
    	for(j=0;j<tcur.length;j++)
    	trs2[i][j]=tcur[j].innerHTML;
    }

	for(i=0;i<a.length;i++)
	{
		tds=trs[ai[i]].getElementsByTagName('td');
		for(j=0;j<tds.length;j++)
			tds[j].innerHTML=trs2[i][j];
	}
	return true;
}
