/*---
Objetivo...: Ordenar tabela do lado do cliente
Navegadores: Internet Explorer 5.5 e Netscape 6.1
data.......: 10/set/2002
---*/
var col = 0;
function sortAlfabetico(table, col, direction) {
  /*---
  A coluna da tabela tem dados alfabéticos ou alfanuméricos
  ---*/ 
if(event.srcElement.src.toLowerCase().indexOf('ativar.gif')>=0){
	direction = false //Caso a coluna estivesse desativa, ela inicia a ordenação crescente
}

  //if(col == 0){  return false;}

  sortRowsAlpha.col = col;
  if( direction == true ){
    sortRowsAlpha.compare = compareBlessThanA;
  }
  else {
    sortRowsAlpha.compare = compareAlessThanB;
  }
  sortTable(table, sortRowsAlpha);
  return direction = (direction!=true)?true:false;
}

function sortNumerico(table, col, direction) {
  /*---
  A coluna da tabela tem dados numéricos (inteiros ou reais)
  ---*/ 
if(event.srcElement.src.toLowerCase().indexOf('ativar.gif')>=0){
	direction = false //Caso a coluna estivesse desativa, ela inicia a ordenação crescente
}
  sortRowsNumber.col = col;
  if( direction == true ){
    sortRowsNumber.compare = compareBlessThanA;
  }
  else {
    sortRowsNumber.compare = compareAlessThanB;
  }
  sortTable(table, sortRowsNumber);
  return direction = (direction!=true)?true:false;

}

function sortEspecial(table, col, customFunction, direction) {
  /*---
  A coluna da tabela possui dados que não são alfabéticos e nem numéricos
  CustomFunction é a função que retorna um inteiro maior que zero
  No caso de datas, veja a função ordemDDMMAAAA 
  ---*/ 
if(event.srcElement.src.toLowerCase().indexOf('ativar.gif')>=0){
	direction = false //Caso a coluna estivesse desativa, ela inicia a ordenação crescente
}
  if(col == 0){  return false;}
  sortRowsCustom.col = col;
  //sortRowsCustom.getValue = customFunction;
  if( direction == true ){
    sortRowsCustom.compare = compareBlessThanA;
  }
  else {
    sortRowsCustom.compare = compareAlessThanB;
  }
  sortTable(table, sortRowsCustom);
  return direction = (direction!=true)?true:false;
}

function ordemDDMMAAAA(qualNode){
  /*---
  Inverte a data para ordenação correta
  Os "td" devem conter data no formato dd/mm/aaaa
  ---*/ 
  var s,as,rt;
  var pdata=qualNode.nodeValue;
  var pseparador="/";
  s=pdata;
  as=s.split(pseparador);
  rt= as[2] + as[1] + as[0];
  return rt;
}

var imgAnterior = new Object();
var nodeTH = new Object();

function trocaImagem(obj,ordem){
	node = obj.parentNode;
	
	while( (node.tagName.toUpperCase() != 'TH') && (node.tagName.toUpperCase() != 'TD') ){
	   nodeTH = node.parentNode;
	   node = node.parentNode;
	}
	switch(ordem){
		case 'num' : node.direction=sortNumerico(findTableParent(node), node.cellIndex, node.direction);break;
		case 'data': node.direction=sortEspecial(findTableParent(node), node.cellIndex, ordemDDMMAAAA, node.direction);break;
		case 'alfa': node.direction=sortAlfabetico(findTableParent(node), node.cellIndex, node.direction);break;
	}
	if(obj.src.toLowerCase().indexOf('decresc.gif')>=0 || obj.src.toLowerCase().indexOf('ativar.gif')>=0 ){
		if(nodeTH.className.indexOf('fundoPadraoB')>=0 || nodeTH.className.indexOf('SelB')>=0){
			obj.src = 'http://www.bcb.gov.br/img/s_padraoB/cresc.gif';
		}else if(node.className.indexOf('fundoPadraoC')>=0 || nodeTH.className.indexOf('SelC')>=0  ){
			obj.src = 'http://www.bcb.gov.br/img/s_padraoC/cresc.gif';
		}else{
			obj.src = 'http://www.bcb.gov.br/img/s_padraoA/cresc.gif';
		}
	}else{
		if(nodeTH.className.indexOf('fundoPadraoB')>=0 || nodeTH.className.indexOf('SelB')>=0 ){
			obj.src = 'http://www.bcb.gov.br/img/s_padraoB/decresc.gif';
		}else if(node.className.indexOf('fundoPadraoC')>=0 || nodeTH.className.indexOf('SelC')>=0  ){
			obj.src = 'http://www.bcb.gov.br/img/s_padraoC/decresc.gif';
		}else{
			obj.src = 'http://www.bcb.gov.br/img/s_padraoA/decresc.gif';
		}
	}

	var classe = obj.className;


	if(objAnterior!=nodeTH){
		if(classe.indexOf('ordemSel') >= 0 ){ 
			if(nodeTH.className.indexOf('fundoPadraoB')>=0 ){
				imgAnterior.src = 'http://www.bcb.gov.br/img/s_padraoB/ativar.gif';
				nodeTH.className = "ordemDeSelB";
				objAnterior.className = 'ordemSelB';
			}else if(node.className.indexOf('fundoPadraoC')>=0 ){
				imgAnterior.src = 'http://www.bcb.gov.br/img/s_padraoC/ativar.gif';
				nodeTH.className = "ordemDeSelC";
				objAnterior.className = 'ordemSelC';
			}else{
				imgAnterior.src = 'http://www.bcb.gov.br/img/s_padraoA/ativar.gif';
				nodeTH.className = "ordemDeSelA";
				objAnterior.className = 'ordemSelA';
			}
		}
		else{
			if(nodeTH.className.indexOf('fundoPadraoB')>=0 || nodeTH.className.indexOf('SelB')>=0 ){
				imgAnterior.src = 'http://www.bcb.gov.br/img/s_padraoB/ativar.gif';
				nodeTH.className = "ordemSelB";
				objAnterior.className = 'ordemDeSelB';
			}else if(nodeTH.className.indexOf('fundoPadraoC')>=0 || nodeTH.className.indexOf('SelC')>=0){
				imgAnterior.src = 'http://www.bcb.gov.br/img/s_padraoC/ativar.gif';
				nodeTH.className = "ordemSelC";
				objAnterior.className = 'ordemDeSelC';

			}else{
				imgAnterior.src = 'http://www.bcb.gov.br/img/s_padraoA/ativar.gif';
				nodeTH.className = "ordemSelA";
				objAnterior.className = 'ordemDeSelA';
			}
		}
	}

	objAnterior = nodeTH
	imgAnterior = obj
}

var objAnterior = new Object();



function findTableParent(node) {
  while(node.tagName.toUpperCase() != 'TABLE'){
	node = node.parentNode;
  }
  return node;
}

function createRowsArray(table) {
  var rows = new Array();
  var r = 0;
  if(table.tHead == null && table.tFoot == null)
    for(var r1 = 0; r1 < table.rows.length; r1++, r++)
      rows[r] = table.rows[r1];
  else
    for(var t = 0; t < table.tBodies.length; t++)
      for(var r1 = 0; r1 < table.tBodies[t].rows.length; r1++, r++)
        rows[r] = table.tBodies[t].rows[r1];
  return rows;
}

function insertSortedRows(table, rows) {
  if(document.all) var rowsCopy = new Array(rows.length)
  for(var r = 0; r < rows.length; r++) {
    if(document.all) rowsCopy[r] = rows[r].cloneNode(true);
    table.deleteRow(rows[r].rowIndex);
  }
  var tableSection = table.tBodies[table.tBodies.length - 1];
  for(var r = 0; r < rows.length; r++) {
    var row = document.all ? rowsCopy[r] : rows[r];
    tableSection.appendChild(row);
  }
}

function sortTable(table, sortFun) {
  var rows = createRowsArray(table);
  if(rows.length > 0) {
    rows.sort(sortFun);
    insertSortedRows(table, rows);
  }
}

function compareAlessThanB(A,B){
  data     = /^\d{1,2}\/\d{1,2}\/(\d{1,4})$/
  dataHora = /^\d{1,2}\/\d{1,2}\/(\d{1,4})\s[0-2]\d(:|h){1}[0-5]\d$/
  /* Verifica se é uma String */
  A = (isNaN(A))? A.toLowerCase():A; 
  B = (isNaN(B))? B.toLowerCase():B;
  /* Verifica se é uma Data */
  if(data.test(A)){
  	  A = A.split("/")
	  A =  (''+A[2]+''+A[1]+''+A[0]+'0000')-999999999999
	}
   if(data.test(B)){
  	  B = B.split("/")
	  B =  (''+B[2]+''+B[1]+''+B[0]+'0000')-999999999999
	}
    if(dataHora.test(A)){
  	  dataHoraA = A.split(" ")
	  horaSeparador = (dataHoraA[1].indexOf("h")>=0)?"h":":";
	  dataA = dataHoraA[0].split("/")
	  horaA = dataHoraA[1].split(horaSeparador)
	  A = (''+dataA[2]+''+dataA[1]+''+dataA[0]+horaA[0]+horaA[1])-999999999999
	}
	if(dataHora.test(B)){
  	  dataHoraB = B.split(" ")
	  horaSeparador = (dataHoraB[1].indexOf("h")>=0)?"h":":";
	  dataB = dataHoraB[0].split("/")
	  horaB= dataHoraB[1].split(horaSeparador)
	  B = (''+dataB[2]+''+dataB[1]+''+dataB[0]+horaB[0]+horaB[1])-999999999999
	}


    return A < B ? - 1 :(A == B ? 0 : 1);
}

function compareBlessThanA(A,B){
  data = /^\d{1,2}\/\d{1,2}\/(\d{1,4})$/
  dataHora = /^\d{1,2}\/\d{1,2}\/(\d{1,4})\s[0-2]\d(:|h){1}[0-5]\d$/

  A = (isNaN(A))? A.toLowerCase():A;
  B = (isNaN(B))? B.toLowerCase():B;
  /* Verifica se é uma Data */
  if(data.test(A)){
	  A = A.split("/")
	  A =  (''+A[2]+''+A[1]+''+A[0])-99999999
	}
   if(data.test(B)){
  	  B = B.split("/")
	  B =  (''+B[2]+''+B[1]+''+B[0])-99999999
	}

    if(dataHora.test(A)){
  	  dataHoraA = A.split(" ")
	  horaSeparador = (dataHoraA[1].indexOf("h")>=0)?"h":":";
	  dataA = dataHoraA[0].split("/")
	  horaA = dataHoraA[1].split(horaSeparador)
	  A = (''+dataA[2]+''+dataA[1]+''+dataA[0]+horaA[0]+horaA[1])-999999999999
	}
	if(dataHora.test(B)){
  	  dataHoraB = B.split(" ")
	  horaSeparador = (dataHoraB[1].indexOf("h")>=0)?"h":":";
	  dataB = dataHoraB[0].split("/")
	  horaB= dataHoraB[1].split(horaSeparador)
	  B = (''+dataB[2]+''+dataB[1]+''+dataB[0]+horaB[0]+horaB[1])-999999999999
	}

  return B < A ? - 1 :(A == B ? 0 : 1);
}

function sortRowsAlpha(row1 , row2) {
  var column = sortRowsAlpha.col;
  var cell1 = getNodeValue(row1.cells[column]);
  var cell2 = getNodeValue(row2.cells[column]);
  return sortRowsAlpha.compare(cell1,cell2);
}

function getNodeValue(cell){
  cellVal = cell.firstChild.nodeValue;
  if (cellVal == null){
     getNodeValue(cell.firstChild);
  }
  return cellVal;
}

function sortRowsCustom(row1 , row2) {
  var column = sortRowsCustom.col;
  var cell1 = getNodeValue(row1.cells[column]);
  var cell2 = getNodeValue(row2.cells[column]);
  return sortRowsCustom.compare(cell1,cell2);
}

function sortRowsNumber(row1 , row2) {
  var column = sortRowsNumber.col;
  var cell1 = parseFloat(getNodeValue(row1.cells[column]));
  var cell2 = parseFloat(getNodeValue(row2.cells[column]));
  return sortRowsNumber.compare(cell1,cell2);
}
