var sorttype = -1;//desc

function getActualContent(text)
{
	var result;
	var start, end;
	var start_temp;
	// find "</"
	end = text.indexOf("</");
	if(end == -1)// return the original
		return text;
	// find last ">"
	start = -1;
	do {
		start_temp = start;
		start = text.indexOf(">", start + 1);
	} while(start != -1 && start < end)
	if(start_temp == -1)// error
		return text;
	// OK, extract
	result = text.substring(start_temp + 1, end);
	result = result.replace(/&nbsp;/g, "");
	return result;
}

function compare(from, to, sorttype, datatype)
{
	var a = getActualContent(from);
	var b = getActualContent(to);
	var aToBeCompared;
	var bToBeCompared;
	
	//number
	if(datatype == 0)
	{
		// a
		aToBeCompared = parseFloat(a);
		if(isNaN(aToBeCompared)) {
			aToBeCompared = 8888 * Math.pow(10,9) * sorttype;
		}
		// b
		bToBeCompared = parseFloat(b);
		if(isNaN(bToBeCompared)) {
			bToBeCompared = 8888 * Math.pow(10,9) * sorttype;
		}
	}
	//link or text...
	if(datatype == 1)
	{
		aToBeCompared = a.toLowerCase();
		bToBeCompared = b.toLowerCase();
	}
	//percentage
	if(datatype == 2)
	{
		aToBeCompared = a.replace("%", "");
		bToBeCompared = b.replace("%", "");
		// parse
		// a
		aToBeCompared = parseFloat(a);
		if(isNaN(aToBeCompared)) {
			aToBeCompared = 8888 * Math.pow(10,9) * sorttype;
		}
		// b
		bToBeCompared = parseFloat(b);
		if(isNaN(bToBeCompared)) {
			bToBeCompared = 8888 * Math.pow(10,9) * sorttype;
		}
	}
	//scientific numbers
	if(datatype == 4)
	{
		// a
		if( a.indexOf("K") != -1 ) {
			aToBeCompared = parseFloat(a.substring(0, a.indexOf("K"))) * Math.pow(10,3);
		}
		else if( a.indexOf("M") != -1 ) {
			aToBeCompared = parseFloat(a.substring(0, a.indexOf("M"))) * Math.pow(10,6);
		}
		else if( a.indexOf("B") != -1 ) {
			aToBeCompared = parseFloat(a.substring(0, a.indexOf("B"))) * Math.pow(10,9);
		}
		else if( a.indexOf("T") != -1 ) {
			aToBeCompared = parseFloat(a.substring(0, a.indexOf("T"))) * Math.pow(10,12);
		}	
		else {
			aToBeCompared = parseFloat(a);
			if(isNaN(aToBeCompared)) {
				aToBeCompared = 8888 * Math.pow(10,12) * sorttype;
			}
		}
		// b
		if( b.indexOf("K") != -1 ) {
			bToBeCompared = parseFloat(b.substring(0, b.indexOf("K"))) * Math.pow(10,3);
		}
		else if( b.indexOf("M") != -1 ) {
			bToBeCompared = parseFloat(b.substring(0, b.indexOf("M"))) * Math.pow(10,6);
		}
		else if( b.indexOf("B") != -1 ) {
			bToBeCompared = parseFloat(b.substring(0, b.indexOf("B"))) * Math.pow(10,9);
		}
		else if( b.indexOf("T") != -1 ) {
			bToBeCompared = parseFloat(b.substring(0, b.indexOf("T"))) * Math.pow(10,12);
		}	
		else {
			bToBeCompared = parseFloat(b);
			if(isNaN(bToBeCompared)) {
				bToBeCompared = 8888 * Math.pow(10,12) * sorttype;
			}
		}
	}
		
	if(aToBeCompared < bToBeCompared)
	{
		return -1;
	}
	if(aToBeCompared > bToBeCompared)
	{
		return 1;
	}
	return 0;
}

function sortByCol(name, colNum, datatype){
	var parNode = document.getElementById(name);
	Sort(parNode, colNum, 1, parNode.rows.length - 1, sorttype, datatype);
	sorttype = sorttype == 1 ? -1 : 1;
}

function Sort(p_Table, colNum, left, right, sorttype, datatype) {
	var pivot, l, r, temp;

	l = left;
	r = right;
	var l_roundDown = Math.floor((left + right) / 2);
	pivot = p_Table.rows[l_roundDown].cells[colNum].innerHTML;

	while(l < r) {
		while(sorttype * compare(p_Table.rows[l].cells[colNum].innerHTML, pivot, sorttype, datatype) < 0) ++l;
		while(sorttype * compare(p_Table.rows[r].cells[colNum].innerHTML, pivot, sorttype, datatype) > 0) --r;
		if(l >= r) break;
		//columns
		var l_colNum = p_Table.rows[1].cells.length;
		for(var i = 0; i < l_colNum; i++ ) {
			var temp = p_Table.rows[l].cells[i].innerHTML;
			p_Table.rows[l].cells[i].innerHTML = p_Table.rows[r].cells[i].innerHTML;
			p_Table.rows[r].cells[i].innerHTML = temp;
		}
		++l;
		--r;
	}

	if(l == r) {
		if(sorttype * compare(p_Table.rows[l].cells[colNum].innerHTML, pivot, sorttype, datatype) > 0) {
			r--;
		}
		else {
			l++;
		}
	}

	if(left < r) 
		Sort(p_Table, colNum, left, l - 1, sorttype, datatype);
	if(l < right)
		Sort(p_Table, colNum, r + 1, right, sorttype, datatype);
}



