function TSorter(){var table=Object;var trs=Array;var ths=Array;var curSortCol=Object;var prevSortCol='3';var sortType=Object;var juggleClasses=true;function get(){}
function getCell(index){cells=trs[index];cell=cells[curSortCol];return cell;}
this.init=function(tableId,firstSortCol,asc)
{table=document.getElementById(tableId);ths=table.getElementsByTagName("th");if(firstSortCol==undefined||isNaN(firstSortCol)||ths[firstSortCol]==undefined)
firstSortCol=0;if(asc==undefined||(asc!==false&&asc!=='descend'&&asc!=='desc'))
asc=true;else
asc=false;var sorted;for(var i=0;i<ths.length;i++)
{if(!ths[i].className.match(/nosort/)){if(document.addEventListener){ths[i].addEventListener('click',function(){sort(this);},false);}
else{ths[i].attachEvent('onclick',function(){col=window.event.srcElement;sort(col);});}
if(ths[i].className=='ascend'||ths[i].className=='descend'){this.prevSortCol=-1;var desc=(ths[i].className=='descend');sort(ths[i]);if(desc)
sort(ths[i]);sorted=true;}}}
if(!sorted){if(typeof(ths[firstSortCol])!="undefined"){sort(ths[firstSortCol]);if(!asc)
sort(ths[firstSortCol]);}}
return true;};function sort(oTH)
{curSortCol=oTH.cellIndex;sortType=oTH.abbr;trs=table.tBodies[0].rows;setGet(sortType)
for(var j=0;j<trs.length;j++)
{if(trs[j].className.indexOf('detail_row')>-1)
{closeDetails(j+2);}}
if(typeof(prevSortCol)!="undefined"&&prevSortCol==curSortCol)
{oTH.className=(oTH.className!='ascend'?'ascend':'descend');reverseTable();}
else
{oTH.className='ascend';if(typeof(prevSortCol)!="undefined"&&typeof(ths[prevSortCol])!="undefined"&&ths[prevSortCol].className!='exc_cell'){ths[prevSortCol].className='';}
if(trs.length<200&&trs.length>0&&trs[0].innerHTML.length<1024)
binsort(trs);else
quicksort(0,trs.length);}
prevSortCol=curSortCol;}
function setGet(sortType)
{switch(sortType)
{case"value_span":get=function(index){cells=trs[index].cells[curSortCol].getElementsByTagName('span');for(var i=0;i<cells.length;i++){if(cells[i].getAttribute('name')=="value"){return cells[i].innerText||cells[i].textContent;}}
return 0;};break;case"value_span_numeric":get=function(index){cells=trs[index].cells[curSortCol].getElementsByTagName('span');for(var i=0;i<cells.length;i++){if(cells[i].getAttribute('name')=="value"){cell=cells[i].innerText||cells[i].textContent;cell=new Number(cell.replace(/[^0-9.-]/g,''));return cell;}}
return 0;};break;case"numeric":get=function(index){cell=trs[index].cells[curSortCol].firstChild.nodeValue.toString().toLowerCase();cell=new Number(cell.replace(/[^0-9.-]/g,''));return cell;};break;case"link_column":get=function(index){return trs[index].cells[curSortCol].firstChild.firstChild.nodeValue.toString().toLowerCase();};break;default:get=function(index){cell=trs[index].cells[curSortCol];return cell.firstChild.nodeValue.toString().toLowerCase();};break;};}
function exchange(i,j)
{var classi=trs[i].className;var classj=trs[j].className;if(i==j+1){table.tBodies[0].insertBefore(trs[i],trs[j]);}else if(j==i+1){table.tBodies[0].insertBefore(trs[j],trs[i]);}else{var tmpNode=table.tBodies[0].replaceChild(trs[i],trs[j]);if(typeof(trs[i])=="undefined"){table.appendChild(tmpNode);}else{table.tBodies[0].insertBefore(tmpNode,trs[i]);}}
if(juggleClasses){trs[i].className=classi;trs[j].className=classj}}
function reverseTable()
{for(var i=1;i<trs.length;i++)
{table.tBodies[0].insertBefore(trs[i],trs[0]);}}
function quicksort(lo,hi)
{if(hi<=lo+1)return;if((hi-lo)==2){if(get(hi-1)>get(lo))exchange(hi-1,lo);return;}
var i=lo+1;var j=hi-1;if(get(lo)>get(i))exchange(i,lo);if(get(j)>get(lo))exchange(lo,j);if(get(lo)>get(i))exchange(i,lo);var pivot=get(lo);while(true){j--;while(pivot>get(j))j--;i++;while(get(i)>pivot)i++;if(j<=i)break;exchange(i,j);}
exchange(lo,j);if((j-lo)<(hi-j)){quicksort(lo,j);quicksort(j+1,hi);}else{quicksort(j+1,hi);quicksort(lo,j);}}
function binsort(els){if(els.length<1)
return;var parent=els[0].parentNode;var bin=new Array();var keys=new Array();var classes=new Array();var oneClass="";var n=els.length;var got_i=null;for(var i=n-1;i>=0;i--){got_i=get(i);if(bin[got_i]==undefined){bin[got_i]=[els[i]];keys.push(get(i));classes.push(els[i].className);}
else{if(els[i].className==undefined){els[i].className="";}
classes.push(els[i].className);bin[got_i].push(els[i]);}
parent.removeChild(els[i]);}
real_quicksort(keys,0,keys.length-1);for(i=0;i<keys.length;i++){for(var j=0;j<bin[keys[i]].length;j++){if(juggleClasses){if(classes.length){bin[keys[i]][j].className=classes.shift();}
else{bin[keys[i]][j].className="";}}
parent.appendChild(bin[keys[i]][j]);}}}
function real_quicksort(a,low,high){if(high<=low)
return;var alow=new Array();var ahigh=new Array();var pivot=low;for(var i=low+1;i<=high;i++){if(a[i]<a[pivot])
alow.push(a[i]);else
ahigh.push(a[i]);}
alow.push(a[pivot]);pivot=alow.length-1+low;for(i=0;i<ahigh.length;i++)
alow.push(ahigh[i]);for(i=0;i<alow.length;i++){a[i+low]=alow[i];}
real_quicksort(a,low,pivot-1);real_quicksort(a,pivot+1,high);}}
/* Mon, 30 Nov 2009 02:17:47 GMT js/libs/html_table_sort.js */
