/** Global instance **/
var table;

/** Function used to handle sorting, to ensure table object can be reused. **/
function runSort(tablename, col, defaultReverse) {
	if (!table) {
		table = new WinnersTable(tablename);
	}
	return sortTableChangeDefault(table, col, defaultReverse);
}

/** Implementation of Table object.  See tablesort.js for details. **/
function WinnersTable(tablename) {
	/** Public members **/
	this.lastColumn = 1; /** The last column sorted defaults to the first column**/
	this.body = null;
	this.rowPrefix = "row";
	
	/** Private members **/
	var alternateClass = false;
	var tableNode = document.getElementById(tablename);
	var orderElements = new Array();
	var headerImgs = new Array();
	var arrowHide = "sort-arrow-hidden";
	var arrowShow = "sort-arrow-shown";
	var sortNodeName = "sortNodes";
	var numColumns = 4;
	
	/** 
	 * Initialization code.  This only needs to be run once for a page, 
	 * so use only once instance of this object per sorted table.
	 **/	
	var sortNode = document.getElementById(sortNodeName);
	var header = tableNode.tHead;
	this.body = tableNode.tBodies[0];
	
	for (var i = 0; i < header.rows[0].cells.length; i++) {
		var headerNodes = header.rows[0].cells[i].childNodes;
		for (var x = 0; x < headerNodes.length; x++) {
			var img = headerNodes[x];
			
			if (!img.id) { continue; }
			
			for (var y = 1; y <= numColumns; y++) {
				if (img.id != "up"+y && img.id != "down"+y && img.id != "null"+y) {
					continue;
				}
				headerImgs.push(img);
			}
		}
	}
	
	for (var x = 0; x < sortNode.childNodes.length; x++) {
		var child = sortNode.childNodes[x];
		if (child.nodeType == document.ELEMENT_NODE && child.id) {
			orderElements[child.id] = child;
		}
	}
	
	/** Functions **/
	this.startSort = function () {
		alternateClass = false;
	}
	
	this.createNewBody = function () {
		return document.createElement("tbody");
	}	
	
	this.replaceBody = function (newBody) {
		tableNode.replaceChild(newBody, this.body);
		this.body = newBody;
	}
	
	this.getOrderingNode = function (col, reverse) {
		var elemId;		
		if (reverse) {
			elemId = "order"+col+"b";
		} else {
			elemId = "order"+col+"a";
		}		
		return orderElements[elemId];
	}
	
	this.rowInsert = function (row) {
		if (alternateClass) {
			row.className="row alt";
			alternateClass = false;
		} else {
			row.className="row";
			alternateClass = true;
		}
	}
	
	this.sortOrder = function (col, reverse) {
		if (!header) {
			return;
		}
		
		for ( var x=0; x < headerImgs.length; x++ ) {
			var img = headerImgs[x];
			if (reverse && img.id == "up"+col) {
				img.className=arrowShow;
			} else if (!reverse && img.id == "down"+col) {
				img.className=arrowShow;
			} else if (img.id.indexOf("null") != -1 && img.id != "null"+col) {
				// set null image for any column we didn't sort
				img.className=arrowShow;
			} else {
				img.className=arrowHide;
			}
		}
	}
}