/* Copyright Electronic Arts, 2007 */

// Hack for browsers that don't reflect the DOM constants (like IE).
if (document.ELEMENT_NODE == null) {
  document.ELEMENT_NODE = 1;
  document.TEXT_NODE = 3;
}

/* 
 * See documentation on wiki, and keep it up to date!
 */
function sortTable(table, col) {
	return sortTableChangeDefault(table, col, false);
}
 
/*
 * If defaultReverse is set to true, the column will be sorted in reverse order
 * the first time it is clicked.
 */
function sortTableChangeDefault(table, col, defaultReverse) {
	if (table && col) {
		if (table.startSort) {
			table.startSort();
		}
	
		var order = getSortOrder(table, col, defaultReverse);
		
		if (order && order.length!=0) {	
			outputTable(table, order);
		}
	}
	return false;
}

/**
 * A private method for the sorting function.  Loads the sort order node from
 * the page, parses it, and determines sorting order.
 */
function getSortOrder(table, col, defaultReverse) {	
	// If lastColumn hasn't been set, assume first column is what is sorted.
	if (!table.lastColumn) {
		table.lastColumn = 1;
	}
	
	// Check if this was the last column sorted
	var reverse = false;
	if (table.lastColumn == col) { // we sorted this in normal order last time, set to rev
		table.lastColumn = col * -1;
		reverse = true;
	} else if (defaultReverse && Math.abs(table.lastColumn) != col) {
		// if this wasn't the last column and defaultReverse is true, set to rev
		table.lastColumn = col * -1;
		reverse = true;
	} else {
		table.lastColumn = col;
	}
		
	// Optional callback for any necessary pre-sort table modification
	// Note this is called even if the order node returned is bad (as checked below).
	if (table.sortOrder) {
		table.sortOrder(col, reverse);
	}
	
	// Get the index array from the page
	var orderElem = table.getOrderingNode(col, reverse);	
	if (!orderElem 
			|| orderElem.childNodes.length == 0
			|| orderElem.firstChild.nodeType != document.TEXT_NODE ) {
		return null;
	}		
	var orderArray = orderElem.firstChild.nodeValue.split(" ");
	
	return orderArray;
}

/**
 * A private method for the sorting function.  Given a table object and order
 * array, build a new table and replace it in the page.
 */
function outputTable(table, order) {
	var curRows = new Array();
	// Table optimization
	if (table.body.nodeName=="TBODY") {
		for (var i = 0; i < table.body.rows.length; i++) {
			var row = table.body.rows[i];
			curRows[row.id] = row;
		}
	} else {	
		for (var i = 0; i < table.body.childNodes.length; i++) {
			var row = table.body.childNodes[i];
			if (row.nodeType != document.ELEMENT_NODE) {
				continue;
			}
			curRows[row.id] = row;
		}
	}

	var newbody = table.createNewBody();
	for (var i = 0; i < order.length; i++) {
		var rowPrefix = table.rowPrefix ? table.rowPrefix : "row";
		var row = curRows[rowPrefix + order[i]];
		if (row) {
			var clonedRow = row.cloneNode(true);
			
			if (table.rowInsert) {
				table.rowInsert(clonedRow);
			}
			
			newbody.appendChild(clonedRow);
		}
	}
	
	table.replaceBody(newbody);
}