function insAtTop(par,child){
	if (par.childNodes.length) {
		par.insertBefore(child, par.childNodes[0]);
	} else {
		par.appendChild(child);
	}
}
function compareRows(a,b) {
	if (a.sortKey==b.sortKey) {
		return 0;
	}
	return (a.sortKey < b.sortKey) ? g_order : -g_order;
}
function sortTable(tableId, colNo, ord){
	var table, rows, nR, bs, i, j, temp;
	g_colNo=colNo;
	table = document.getElementById(tableId);

	if (table.sortOrder == null) {
		table.sortOrder = ord;
	} else {
		table.sortOrder = table.sortOrder*-1;
	}

	g_order = table.sortOrder;
	rows=new Array();
	nR=0;
	bs=table.tBodies;
	dateRegex = new RegExp('^[0-9]{2}[/\.-]{1}[0-9]{2}[/\.-]{1}[0-9]{4}$');
	dateTimeRegex = new RegExp('^[0-9]{2}[/\.-]{1}[0-9]{2}[/\.-]{1}[0-9]{4} [0-9]{2}[:]{1}[0-9]{2}[:]{1}[0-9]{2} [AP]{1}M$');
	for(i=0; i<bs.length; ++i) {
		for(j=0; j<bs[i].rows.length; ++j) {
			rows[nR]=bs[i].rows[j];
			temp=rows[nR].cells[g_colNo];
			childText=temp.childNodes[0].innerHTML;
			if(!childText){
				childText=temp.innerHTML;
			}

			if (temp) {
				if (dateRegex.test(childText)) {
					sortItem = childText.substr(6,4);
					sortItem = sortItem+childText.substr(0,2);
					sortItem = sortItem+childText.substr(3,2);
				} else if (dateTimeRegex.test(childText)) {
					sortItem = childText.substr(6,4);
					sortItem = sortItem+childText.substr(0,2);
					sortItem = sortItem+childText.substr(3,2);
					/* sort string to be YYYYMMDD.SECONDS */
					hs = childText.substr(11, 2)*60*60;
					ms = childText.substr(14, 2)*60;
					ss = childText.substr(17, 2)*1;
					if (childText.substr(20, 2) == 'PM') {
						ampms = 43200;
					} else {
						ampms = 0;
					}
					ts = hs+ms+ss+ampms;
					sortItem = sortItem+'.'+ts;
				} else {
					sortItem = childText;
					sortItemNum = Number(sortItem);
				}
				if(isNaN(sortItemNum)){
					rows[nR].sortKey=sortItem.toLowerCase();
				}else {
					rows[nR].sortKey=sortItemNum;
				}
			} else {
				rows[nR].sortKey='';
			}
			++nR;
		}
	}
	rows.sort(compareRows);
	for (i=0; i < rows.length; ++i) {
		insAtTop(table.tBodies[0], rows[i]);
	}

	/* if it is a dbEntity table, alternate the colors */
	if (table.getAttribute('class') == 'dbEntity') {
		alternateRows(table, 'alt', '');
	}
}

