var SORT_COLUMN_INDEX;

//dois argumentos para a função:
//indice: índice da coluna no tbody da table que será ordenado
//funcao: função de ordenação que será utilizada pela função sort
//não esqueça de passar o id da table para a varíavel 'tabela'
function sortTable(tabela, indice, funcao) {
	var newRows = new Array();
	// var tabela = id da tabela que será ordenada
	// var tabelas = document.getElementsByClass('ordTabela');
	var ordem = SORT_COLUMN_INDEX
	//verifica o tipo de dados para iniciar a função de sort correta
	var itm = getInnerText(tabela.tBodies[0].rows[0].cells[indice]);

	//informa a função a ser utilizada para a ordenação
	switch (funcao) {
		case 1:
		sortfn = sort_numeric;
		break;
		case 2:
		sortfn = sort_caseinsensitive;
		break;
		case 3:
		sortfn = sort_date;
		break;
		case 4:
		sortfn = sort_currency;
		break;
		case 5:
		sortfn = sort_default;
		break;
	}

	SORT_COLUMN_INDEX = indice;
	//inserir as linhas do tbody no array
	for (j=0;j<tabela.tBodies[0].rows.length;j++) {
		newRows[j] = tabela.tBodies[0].rows[j];
	}

	//classifica o array de linhas do tbody
	//verifica se o clique é na mesma coluna, invertendo a classificação
	if (ordem == SORT_COLUMN_INDEX) {
		newRows.reverse();
	} else {
		newRows.sort(sortfn);
	}

	//insere o array já clessificado!!
	for (i=0;i<newRows.length;i++) {
		if((i+1) % 2) newRows[i].setAttribute("class", "cor1");
		else newRows[i].setAttribute("class", "cor2");
		
		tabela.tBodies[0].appendChild(newRows[i]);
	}
}

function getParent(el, pTagName) {
	if (el == null) return null;
	else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase())	// Gecko bug, supposed to be uppercase
	return el;
	else
	return getParent(el.parentNode, pTagName);
}

function sort_numeric(a,b) {
	//    aa = getInnerText(a.cells[SORT_COLUMN_INDEX]);
	//    aa = parseFloat(getInnerText(a.cells[SORT_COLUMN_INDEX]));
	aa = parseFloat(unformatNumber(getInnerText(a.cells[SORT_COLUMN_INDEX])));
	if (isNaN(aa)) aa = 0;
	//    bb = getInnerText(b.cells[SORT_COLUMN_INDEX]);
	//    bb = parseFloat(getInnerText(b.cells[SORT_COLUMN_INDEX]));
	bb = parseFloat(unformatNumber(getInnerText(b.cells[SORT_COLUMN_INDEX])));
	if (isNaN(bb)) bb = 0;
	return aa - bb;
}

function sort_caseinsensitive(a,b) {
	aa = getInnerText(a.cells[SORT_COLUMN_INDEX]).toLowerCase();
	bb = getInnerText(b.cells[SORT_COLUMN_INDEX]).toLowerCase();
	if (aa==bb) return 0;
	if (aa<bb) return -1;
	return 1;
}

function sort_date(a,b) {
	// y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX
	aa = getInnerText(a.cells[SORT_COLUMN_INDEX]);
	bb = getInnerText(b.cells[SORT_COLUMN_INDEX]);
	if (aa.length == 10) {
		dt1 = aa.substr(6,4)+aa.substr(3,2)+aa.substr(0,2);
	} else {
		yr = aa.substr(6,2);
		if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }
		dt1 = yr+aa.substr(3,2)+aa.substr(0,2);
	}
	if (bb.length == 10) {
		dt2 = bb.substr(6,4)+bb.substr(3,2)+bb.substr(0,2);
	} else {
		yr = bb.substr(6,2);
		if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }
		dt2 = yr+bb.substr(3,2)+bb.substr(0,2);
	}
	if (dt1==dt2) return 0;
	if (dt1<dt2) return -1;
	return 1;
}

function sort_currency(a,b) {
	aa = getInnerText(a.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');
	bb = getInnerText(b.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');
	return parseFloat(aa) - parseFloat(bb);
}

function sort_default(a,b) {
	aa = getInnerText(a.cells[SORT_COLUMN_INDEX]);
	bb = getInnerText(b.cells[SORT_COLUMN_INDEX]);
	if (aa==bb) return 0;
	if (aa<bb) return -1;
	return 1;
}

function getInnerText(el) {
	if (typeof el == "string") return el;
	if (typeof el == "undefined") { return el };
	if (el.innerText) return el.innerText;	//Not needed but it is faster
	var str = "";

	var cs = el.childNodes;
	var l = cs.length;
	for (var i = 0; i < l; i++) {
		switch (cs[i].nodeType) {
			case 1: //ELEMENT_NODE
			str += getInnerText(cs[i]);
			break;
			case 3:	//TEXT_NODE
			str += cs[i].nodeValue;
			break;
		}
	}
	//	alert(typeof(str));
	return str;
}

function unformatNumber(pNum) {
	//	return String(pNum).replace(/\D/g, "").replace(/^0+/, "");
	pNum = pNum.replace(".", "")
	pNum = pNum.replace(".", "")
	pNum = pNum.replace(".", "")
	pNum = pNum.replace(".", "")
	return String(pNum).replace(",", ".")
}