	var ColorEvenRow = "#eeeeee";
	var ColorKeyRow = "#c0c0c0";

	function DoReverse(oTable, nNumOfRows, nNumOfCols)
	{
		var nR, nC;
		var newRow;
		var newCell;
    
		for(nR = nNumOfRows-2; nR >= 1; nR--)
		{
			newRow = oTable.insertRow();
			for(nC = 0; nC < nNumOfCols; nC++)
			{
				newCell = newRow.insertCell();
				newCell.innerHTML = oTable.rows[nR].cells[nC].innerHTML;	
			}
			
			if(oTable.rows[nR].bgColor == ColorKeyRow)
				newRow.bgColor = ColorKeyRow;
		}
		
		for(nR = 1; nR < nNumOfRows-1; nR++)
			oTable.deleteRow(1);
	}

	function CompareNumber(a, b)
	{
		var v1 = parseFloat(a.cellText);
		if(isNaN(v1))
			v1 = 0;

		var v2 = parseFloat(b.cellText);
		if(isNaN(v2))
			v2 = 0;

		return (v1-v2);
	}
	
	function CompareStr(a, b)
	{
		var v1 = a.cellText;
		var v2 = b.cellText;
		
		if(v1 > v2)
			return 1;
		if(v1 < v2)
			return -1;
		return 0;
	}
	
	function CompareStrNoCase(a, b)
	{
		var v1 = a.cellText.toUpperCase();
		var v2 = b.cellText.toUpperCase();
		
		if(v1 > v2)
			return 1;
		if(v1 < v2)
			return -1;
		return 0;
	}

	function GetSortFunction(compare)
	{
		if(compare == "cmpNum")
			return CompareNumber;
		if(compare == "cmpStrNoCase")
			return CompareStrNoCase;
		return CompareStr;
	}
		
	function DoSort(oTable, col, compare)
	{
		var nNumOfRows = oTable.rows.length;
		var nNumOfCols = oTable.rows[0].cells.length;
		
		var nR, nC;
		var aValueArray = new Array(nNumOfRows-1);
		
		for(nR = 1; nR < nNumOfRows; nR++)
			aValueArray[nR-1] = { rowID : nR, cellText : oTable.rows[nR].cells[col].innerText };
		
		var sortFunc = GetSortFunction(compare);
		aValueArray.sort(sortFunc);
		
		var i;
		var newRow;
		var newCell;
    
		for(i = 0; i < aValueArray.length; i++)
		{
			nR = aValueArray[i].rowID;
			
			newRow = oTable.insertRow();
			for(nC = 0; nC < nNumOfCols; nC++)
			{
				newCell = newRow.insertCell();
				newCell.innerHTML = oTable.rows[nR].cells[nC].innerHTML;	
			}

			if(oTable.rows[nR].bgColor == ColorKeyRow)
				newRow.bgColor = ColorKeyRow;
		}  
		
		for(nR = 1; nR < nNumOfRows; nR++)
			oTable.deleteRow(1);
	}

	function sortTable(col, tableID, compare)
	{
		var oTable = document.getElementById(tableID);
		if(oTable == null)
			return;
		
		var nNumOfRows = oTable.rows.length;
		if(nNumOfRows < 2)
			return;
			
		var nNumOfCols = oTable.rows[0].cells.length;
		if(nNumOfCols < 1 || col < 0 || col >= nNumOfCols)
			return;

		// find last sort column
		var nR, nC;
		var ascStr = "^";
		var descStr = "V";
//		var ascStr = "¡÷";	// "¡ü"
//		var descStr = "¨Œ";	// "¡ý"
	
		for(nC = 0; nC < nNumOfCols; nC++)
		{
			var colName = oTable.rows[0].cells[nC].innerText;
			var nPos = colName.length - ascStr.length;
			var bAsc = false;
			
			var nFind = colName.lastIndexOf(ascStr);
			if(nFind != nPos)
				nFind = colName.lastIndexOf(descStr);
			else
				bAsc = true;
				
			if(nFind == nPos)
			{
				if(nC == col)		// ascStr <--> descStr
				{
					if(bAsc)
						oTable.rows[0].cells[nC].innerText = colName.substring(0, nPos) + descStr;
					else
						oTable.rows[0].cells[nC].innerText = colName.substring(0, nPos) + ascStr;
				}
				else
					oTable.rows[0].cells[nC].innerText = colName.substring(0, nPos);

				break;
			}
		}
		
		if(nC == col)
			DoReverse(oTable, nNumOfRows, nNumOfCols);
		else
		{
			oTable.rows[0].cells[col].innerText = oTable.rows[0].cells[col].innerText + ascStr;
			DoSort(oTable, col, compare);
		}
		
		for(nC = 0; nC < nNumOfCols; nC++)
		{
			var colName = oTable.rows[0].cells[nC].innerText;
			if(colName == "No.")
			{
				for(nR = 1; nR < nNumOfRows; nR++)
					oTable.rows[nR].cells[nC].innerText = nR;
			}
		}
		
		for(nR = 1; nR < nNumOfRows; nR++)
		{
			if(oTable.rows[nR].bgColor != ColorKeyRow	&& nR%2 == 0)
				oTable.rows[nR].bgColor = ColorEvenRow;
		}
	}
