function activeTable() {
	if (!document.getElementById )	return;		// dumb browser
	var tables=document.getElementsByTagName('table');
	for (var i=0;i<tables.length;i++ ) {
	  if ( tables[i].className.indexOf('archive') != -1 
		|| tables[i].className.indexOf('active') != -1 ) {
		  if ( tables[i].className.indexOf('block') == -1 )
			setRulerTr( tables[i] );
		  else
			setRulerTbody( tables[i] );
	  }
	  if ( tables[i].className.indexOf('archive') != -1 
		|| tables[i].className.indexOf('sortable') != -1 ) {
		  setTableSort( tables[i] );
	  }
	}
}

////////////////////////////////////////////////////////////////////////////////
// Set up table mouseOver ruler by single line (Tr) or block (Tbody)
////////////////////////////////////////////////////////////////////////////////
function setRulerTr( name ) {
  if ( typeof name == 'string' )
	name = document.getElementById( name );
  if ( typeof name != 'object' ) return;

	var trs=name.getElementsByTagName('tr');
	for (var j=0;j<trs.length;j++ ) {
	  if ( trs[j].parentNode.nodeName == 'TBODY'
	    && trs[j].className.indexOf('header') == -1 ) {
		trs[j].onmouseover=function(){this.className+=' sel';return false}
		trs[j].onmouseout=function(){this.className=this.className.replace(/ sel/,'');return false}
	  }
	}
}

function setRulerTbody( name ) {
  if ( typeof name == 'string' )
	name = document.getElementById( name );
  if ( typeof name != 'object' ) return;

	var tbs=name.getElementsByTagName('tbody');
	for (var j=0;j<tbs.length;j++ ) {
	  if ( tbs[j].className.indexOf('header') == -1 ) {
		tbs[j].onmouseover=function(){this.className+=' sel';return false}
		tbs[j].onmouseout=function(){this.className=this.className.replace(/ sel/,'');return false}
	  }
	}
}

////////////////////////////////////////////////////////////////////////////////
// Set up table row/block Sort
////////////////////////////////////////////////////////////////////////////////
function setTableSort( name ) {
  if ( typeof name == 'string' )
	name = document.getElementById( name );
  if ( typeof name != 'object' ) return;

	name.sortBlockMode = false;
	var headRows = name.tHead.rows;
	if ( headRows.length > 1 ) name.sortBlockMode = true;
	for (var r=0; r<headRows.length; r++ ) {
		var THs = headRows[r].cells;
		for (var c=0; c<THs.length; c++ ) {
			if ( THs[c].childNodes.length == 0 ) continue;		// blank
			if ( THs[c].nodeName.toLowerCase() != 'th' ) continue;
			if ( THs[c].className.indexOf('noSort') != -1 ) continue;
			var newA = document.createElement('a');
			newA.setAttribute('href', '#' );
			var dir = 'asending';
			if ( THs[c].className.indexOf('sortUp') != -1 ) dir = 'descending';
			newA.setAttribute('title', 'Sort this column in ' + dir + ' order' );
			newA.onclick = tableSortColumn;
			newA.sortRow = r;	newA.sortCol = c;
			for (var ix=0; ix<THs[c].childNodes.length; ix++ ) {
				newA.appendChild( THs[c].childNodes[ix] );
			}
			THs[c].appendChild( newA );
		}
	}
}

function tableSortColumn() {
	var cntl = this;
	var tHead = cntl.parentNode.parentNode.parentNode;
	var tTable = tHead.parentNode;
	var nList = tHead.getElementsByTagName('th');
	for( var ix=0; ix<nList.length; ix++ ) {	 // clear old sort class
		nList[ix].className = nList[ix].className.replace(/(^| )sortUp( |$)/, "$1" );
		nList[ix].className = nList[ix].className.replace(/(^| )sortDown( |$)/, "$1" );
	}
	var dir;
	if ( cntl.title.indexOf('descending') != -1 ) {
		dir = 'asending';
		cntl.parentNode.className += " sortDown";
	} else {
		dir = 'descending';
		cntl.parentNode.className += " sortUp";
	} 
	cntl.title = 'Sort this column in ' + dir + ' order';
	if ( tTable.sortBlockMode ) {	   	  	  // tBody sort
		tableSortRows( tTable, cntl.sortRow, cntl.sortCol, dir == 'descending' );
	} else {					// row sort
		nList = tTable.getElementsByTagName('tbody');
		for( var ix=0; ix<nList.length; ix++ ) {	 // sort each body sepertatly
			tableSortRows( nList[ix], -1, cntl.sortCol, dir == 'descending' );
		}
	}
	return false;
}

function tableSortRows( tBody, sortRow, sortCol, asending ) {
	if ( sortRow == -1 )	var tTrs = tBody.rows;
	else	var tTrs = tBody.tBodies;
	if ( tTrs.length <= 1 ) return;
	for (var x=0; x<tTrs.length; x++ ) {
		if ( sortRow == -1 ) {
			var tmp = getInternalText( tTrs[x].cells[sortCol] );
		} else {
			var tmp = getInternalText( tTrs[x].rows[sortRow].cells[sortCol] );
		}
		tTrs[x].sortKey = null;
		if ( tmp == parseInt( tmp, 10 ))	tTrs[x].sortKey = parseInt( tmp, 10 );
		else if (tmp == parseFloat( tmp ))	tTrs[x].sortKey = parseFloat( tmp );
		else tTrs[x].sortKey = tmp;

		for (var j=0; j<x; j++ ) {
			if (( asending && tTrs[x].sortKey < tTrs[j].sortKey ) 
			  ||(!asending && tTrs[x].sortKey > tTrs[j].sortKey )) {
				tBody.insertBefore( tTrs[x], tTrs[j] );
				break;
			}
		}
	}
}

function getInternalText( target ) {
	var internalText = "";
	if ( typeof target == "undefined" )		return internalText; 
	if ( typeof target == "string" )		return target; 
	var eChildern = target.childNodes;
	for ( var i=0; i<eChildern.length; i++ ) {
		if ( eChildern[i].nodeType == 3 ) {	  // text node
			if (!/^\s*$/.test( eChildern[i].nodeValue))
				internalText += eChildern[i].nodeValue;
		} else {
			internalText += getInternalText( eChildern[i] );
		}
	}
	return internalText;
}
			// Auto Kick off the Active Table
function autoTableUtil()
{	var scripts = document.getElementsByTagName('script');
	var myScript = scripts[scripts.length - 1];			// myScript now contains our script object
	if ( myScript.parentNode.nodeName.toUpperCase() == "HEAD" )
		return;
	var myParam = myScript.innerHTML;
	if ( myParam.substr(0,2) == "//" )
		myParam = myParam.substr(2);
	activeTable( myParam );
}
autoTableUtil()
