function stripTags(oldString) 
{
	return oldString.replace(/<\S[^><]*>/g, "");
}

function sortProcess(a, b) 
{
	var that = elSortable.that;
	
	var aa = parseFloat(that.getInnerText(a.cells[that.sortColumnIndex]));
	var bb = parseFloat(that.getInnerText(b.cells[that.sortColumnIndex]));

	if (aa==bb) 
	{
		return 0;
	} 
	else if (aa<bb) 
	{
		return 1;
	} 
	else 
	{
		return -1;
	}
}

/**
 * Creates an Element for insertion into the DOM tree.
 * From http://simon.incutio.com/archive/2003/06/15/javascriptWithXML
 *
 * @param element the element type to be created.
 *				e.g. ul (no angle brackets)
 **/
function createElement(element) {
	if (typeof document.createElementNS != 'undefined') {
		return document.createElementNS('http://www.w3.org/1999/xhtml', element);
	}
	if (typeof document.createElement != 'undefined') {
		return document.createElement(element);
	}
	return false;
}

/**
 * "targ" is the element which caused this function to be called
 * from http://www.quirksmode.org/js/events_properties.html
 **/
function getEventTarget(e) {
	var targ;
	if (!e) {
		e = window.event;
	}
	if (e.target) {
		targ = e.target;
	} else if (e.srcElement) {
		targ = e.srcElement;
	}
	if (targ.nodeType == 3) { // defeat Safari bug
		targ = targ.parentNode;
	}

	return targ;
}

var elSortable = 
{
	that: false,

	sortColumnIndex : -1,
	lastAssignedId : 0,
	newRows: -1,
	lastSortedTable: -1,

	init : function() 
	{
		this.that = this;
		this.run();
	},
	
	run : function() 
	{
		$$('table.sortable').each( function(s) { elSortable.makeSortable(s); } )
	},
	
	makeSortable : function(table) 
	{
		if (!table.id) 
		{
			table.id = 'sortableTable'+this.lastAssignedId++;
		}
		
		if (!table.tHead || !table.tHead.rows || 0 == table.tHead.rows.length) 
		{
			return;
		}
		
		var hrows = $$('#' + table.id + ' .sort');
		
		for (var i=0; i < hrows.length; i++) 
		{
			if(hrows[i].hasClassName('pointer'))
			{
				hrows[i].onclick = this.headingClicked;
				hrows[i].setAttribute('columnId', i);
				var spanEl = createElement('span');
				spanEl.className = 'tableSortArrow';
				//spanEl.appendChild(document.createTextNode('\u00A0\u00A0'));
				hrows[i].appendChild(spanEl);			
			}
		}
	},	
	
	headingClicked: function(e) 
	{
		var that = elSortable.that;
		var linkEl = getEventTarget(e);
		var td     = linkEl;
		var tr     = td.parentNode;
		var thead  = tr.parentNode;
		var table  = thead.parentNode;

		$$('th.selected').each( function(s) { s.removeClassName('selected'); } )
		td.addClassName('selected');
		
		if (!table.tBodies || table.tBodies[0].rows.length <= 1) 
		{
			return false;
		}

		var column = linkEl.getAttribute('columnId') || td.cellIndex;

		var arrows = $$('td span.tableSortArrow');
		
		var previousSortOrder = '';
		if (arrows.length > 0) 
		{
			previousSortOrder = arrows[0].getAttribute('sortOrder');
		}
		
		var itm = ''
		var rowNum = 0;
		while ('' == itm && rowNum < table.tBodies[0].rows.length) 
		{
			itm = that.getInnerText(table.tBodies[0].rows[rowNum].cells[column]);
			rowNum++;
		}
		if (table.id == that.lastSortedTable && column == that.sortColumnIndex) 
		{
			newRows = that.newRows;
			newRows.reverse();
		} else {
			that.sortColumnIndex = column;
			var newRows = new Array();

			for (var j = 0; j < table.tBodies[0].rows.length; j++) 
			{
				newRows[j] = table.tBodies[0].rows[j]; 
			}
			newRows.sort(sortProcess);
		}
		$$('#' + table.id + ' td.sps').each( function(s) { s.removeClassName('sps'); } )
		$$('#' + table.id + ' tr td:nth-child(' + (1+~~column) + ')').each( function(s) { s.addClassName('sps'); } )
		

		that.moveRows(table, newRows);
		that.newRows = newRows;
		that.lastSortedTable = table.id;
		
		var arrows = $$('td span.tableSortArrow');
		
		for (var j = 0; j < arrows.length; j++) 
		{
			var arrowParent = arrows[j].parentNode;
			arrowParent.removeChild(arrows[j]);

			if (arrowParent != td) 
			{
				spanEl = createElement('span');
				spanEl.className = 'tableSortArrow';
				//spanEl.appendChild(document.createTextNode('\u00A0\u00A0'));
				arrowParent.appendChild(spanEl);
			}
		}
		
		var spanEl = createElement('span');
		spanEl.className = 'tableSortArrow';
		
		if (null == previousSortOrder || '' == previousSortOrder || 'ASC' == previousSortOrder) 
		{
			//spanEl.appendChild(document.createTextNode(' \u2193'));
			spanEl.setAttribute('sortOrder', 'DESC');			
		} else {
			//spanEl.appendChild(document.createTextNode(' \u2191'));
			spanEl.setAttribute('sortOrder', 'ASC');
		}
		
		td.appendChild(spanEl);
		
		return false;
	},

	getInnerText : function(el) 
	{
		var str = el.getAttribute('elSortableInnerText');
		if (null != str && '' != str) 
		{
			return str;
		}
		str = '';

		str = parseFloat(stripTags(el.innerHTML));
		el.setAttribute('elSortableInnerText', str);

		return str;
	},

	moveRows : function(table, newRows) 
	{
		for (var i=0;i<newRows.length;i++)
		{
			if(i % 2 == 0)
				newRows[i].className = '';
				//newRows[i].removeClassName('s');
			else
				newRows[i].className = 's';
				//newRows[i].addClassName('s');
			
			table.tBodies[0].appendChild(newRows[i]); 
		}
	}
	
}

function elSortableInit() 
{
	elSortable.init();
}

Event.observe(window, 'load', elSortableInit);