// global variables
var col = 0;
var attribute = "";
var desc = false;
var parent = null;
var items = new Array();
var N = 0;

function isort(m, k, desc) {
	for(var j=m+k; j < N; j+= k) {
		for(var i=j; i >= k && compare(get(i), get(i-k), desc); i-= k) {
			exchange(i, i-k);
		}
	}
}

function sortTable(tableid, n, att) {
	parent = document.getElementById(tableid);
	if(col == n) // Same col is being sorted, so switch descending
		desc = !desc;
	else if (col < 0) // New col being sorted is always sorted in ascending order.
		desc = false;
	col = n;
	attribute = att;
	if(parent.nodeName != "TBODY")
		parent = parent.getElementsByTagName("TBODY")[0];
	if(parent.nodeName != "TBODY")
		return false;
	items = parent.getElementsByTagName("TR");
	N = items.length;
	
	// shell sort
	if((k = Math.floor(N/5)) > 7) {
		for(var m=0; m < k; m++)
			isort(m, k, desc);
	}
	
	if((k = Math.floor(N/7)) > 7) {
		for(var m=0; m < k; m++)
			isort(m, k, desc);
	}
	
	for(k=7; k > 0; k -= 2) {
		for(var m=0; m < k; m++)
			isort(m, k, desc);
	}
}

function get(i) {
	if(col >= 0)
		var retval = items[i].getElementsByTagName("TD")[col].innerHTML;
	else{
		var retval = items[i].getAttribute(attribute);
	}
	
	if(parseInt(retval) == retval)
		return parseInt(retval);
	
	return removeHTMLTags(retval);
}

function compare(val1, val2, desc) {
	return (desc) ? val1 > val2 : val1 < val2;
}

function exchange(i, j) {
	if(i == j+1) {
		parent.insertBefore(items[i], items[j]);
	} else if(j == i+1) {
		parent.insertBefore(items[j], items[i]);
	} else {
		var tmpNode = parent.replaceChild(items[i], items[j]);
		if(typeof(items[i]) == "undefined") {
			parent.appendChild(tmpNode);
		} else {
			parent.insertBefore(tmpNode, items[i]);
		}
	}
}

function removeHTMLTags(strInputCode) {
	return strInputCode.replace(/<\/?[^>]+(>|$)/g, "");
}