/****************************************************************************************


										FdrNos


****************************************************************************************/

function FdrNo()
{
	this.texto = "";
	this.pai = null;
	this.filhos = new Array();
	this.div = null;
	this.img = null;
	this.span = null;
	this.nivel = 0;
	this.expandido = false;
	this.data = null;
}

/***************************************************************************************


										FdrTV


****************************************************************************************/


function FdrTV(container)
{
	this.container = container;
	this.filhos = new Array();
	this.identacao = "8px";
	this.imagemmais = "plus.gif";
	this.imagemmenos = "minus.gif";
	this.imagemmarcador = "marker.gif";
	this.onclick = null;
	this.onantesexpandir = null;
	this.onexpandiu = null;
	this.nodestacadoanterior = {no: null,cor: "white"};
	this.corfonte = "white";
	this.cordestaque = "yellow";
}

FdrTV.prototype.adicionafilho = FdrTVadicionafilho;
FdrTV.prototype.removeno = FdrTVremoveno;
FdrTV.prototype.exibir = FdrTVexibir;
FdrTV.prototype.exibirsemexpandir = FdrTVexibirsemexpandir
FdrTV.prototype.destacarno = FdrTVdestacarno;
FdrTV.prototype.marcarno = FdrTVmarcarno;
FdrTV.prototype.limpar = limpar;
FdrTV.prototype.filtrarportag = FdrTVfiltrarportag;
FdrTV.prototype.listarnosemvetor = FdrTVlistarnosemvetor;
FdrTV.prototype.setacorfonte = FdrTVsetacorfonte;
FdrTV.prototype.setacordestaque = FdrTVsetacordestaque;
FdrTV.prototype.localizartextonosnos = FdrTVlocalizartextonosnos;
FdrTV.prototype.retornatodoselementos = FdrTVRetornaTodosElementos;
FdrTV.prototype.retornaelementoscomid = FdrTVRetornaElementosComID;

function FdrTVexibir(no)
{
	if (!no.filhos.length) return;//se não tem filhos não tem pq expandir...

	var pode = true;
	
	if (this.onantesexpandir) pode = this.onantesexpandir(no)
	
	if (!pode) return;
	
	no.expandido = !no.expandido;
	
	var i = 0;
	
  if (no.expandido) this.filtrarportag(no.div, "img")[0].src = this.imagemmenos; else this.filtrarportag(no.div, "img")[0].src = this.imagemmais;
	
	for (i=0;i<no.filhos.length;i++)
		(no.expandido)?no.filhos[i].div.style.display="block":no.filhos[i].div.style.display="none";
		
	if (this.onexpandiu) this.onexpandiu(no);
}

function FdrTVexibirsemexpandir(no)
{
	if (!no.filhos.length) return;//se não tem filhos não tem pq expandir...

	var i = 0;
	
  if (no.expandido) this.filtrarportag(no.div, "img")[0].src = this.imagemmenos; else this.filtrarportag(no.div, "img")[0].src = this.imagemmais;
	
	for (i=0;i<no.filhos.length;i++)
		(no.expandido)?no.filhos[i].div.style.display="block":no.filhos[i].div.style.display="none";
}

function trataclick(obj, no)
{
  return function(evento)
  {
     var evt = (evento)?(evento):event;
     try
     {
      evt.cancelBubble = true;
     }
     catch(e)
     {
      try
      {
        evt.stopPropagation();
      }
      catch(e)
      {
        alert('Falha no cancelamento da propagação do evento.');
      }
           
     }
     obj.exibir(no);
     obj.destacarno(no, true);
     if (obj.onclick) obj.onclick(obj, no);
  }
}

function FdrTVadicionafilho(pai, texto)
{
   var No = new FdrNo();
   No.pai = pai;
   No.texto = texto;
   No.div = document.createElement("div");
   No.div.style.cursor = "pointer";
   No.div.style.paddingLeft = this.identacao;
   No.div.style.color = this.corfonte;
   
   No.div.id = "tvitemindiceobra";
   
   //No.div.innerHTML = "<img id='tvimgitemindiceobra' src='" + this.imagemmarcador+"'>" + texto;
   
   No.img = document.createElement("img");
   No.img.id = 'tvimgitemindiceobra';
   No.img.src = this.imagemmarcador;
   No.div.appendChild(No.img);
   
   No.span = document.createElement('span');
   No.span.innerHTML = texto;
   No.span.id = 'tvitemindiceobra';
   No.div.appendChild(No.span);

   No.div.onclick = trataclick(this, No);   
   No.div.onselectstart = function(){return false};
   No.expandido = false;

   if (pai)
   {
	   No.div.style.display="none";
	   No.nivel = pai.nivel + 1;	   
	   pai.filhos[pai.filhos.length] = No;
	   pai.div.appendChild(No.div);
	   
     this.filtrarportag(pai.div, "img")[0].src = this.imagemmais;
   }
   else
   {
	    No.div.style.display="block";
	    No.nivel = 0;
		  this.container.appendChild(No.div);
   		this.filhos[this.filhos.length] = No;
   }
   return No;
}

function indicedono(lista, no)
{
	var i = 0;

	for (i = 0; i<lista.length; i++)
		if (lista[i] == no) return i;

	return -1;
}

function FdrTVremoveno(no)
{
	if (!no) return;

	var indice = 0;
	
	if (no.pai)
	{
	   indice = indicedono(no.pai.filhos, no);
	   if (indice != -1)   no.pai.filhos.splice(indice, 1);
	   no.pai.div.removeChild(no.div);
	   no = null;
	}
	else
	{
	   indice = indicedono(this.filhos, no);
	   if (indice != -1)   this.filhos.splice(indice, 1);
	   this.container.removeChild(no.div);
	   no = null;
	}
}

function limpano(no)
{
	var i = 0;
	
	for (i=0;i<no.filhos.length;i++) limpano(no.filhos[i]);
		
	no.filhos.length = 0;

	if (no.pai) no.pai.div.removeChild(no.div);

	no.div = null;
	no = null;
}

function limpar()
{
	var i = 0;
	
	for (i=0;i<this.filhos.length;i++)
	{
		this.container.removeChild(this.filhos[i].div);
		limpano(this.filhos[i]);
	}
	
	this.filhos.length = 0;
}

// function desdestacano(no)
// {
//   var i = 0;
//   no.div.style.color = "black";
//   
//   for (i=0;i<no.filhos.length;i++)
//     desdestacano(no.filhos[i]);
// }


function FdrTVdestacarno(no, naoexpandir)
{
  if (!no) return;
  
  if (this.nodestacadoanterior.no) this.nodestacadoanterior.no.div.style.color = this.nodestacadoanterior.cor;
  
  this.nodestacadoanterior.no = no;
  this.nodestacadoanterior.cor = no.div.style.color;

  no.div.style.color = this.cordestaque;
  
  if (!naoexpandir)
  {
    this.exibirsemexpandir(no);
    //expandindo..
    var noaux = no.pai;
    while (noaux)
    {
      noaux.expandido = true;
      this.exibirsemexpandir(noaux);
      noaux = noaux.pai;
    }
  }
}

function FdrTVmarcarno(no, corfontedestaque)
{
  if (!no) return;
  
  if (corfontedestaque) no.div.style.color = corfontedestaque; else no.div.style.color = this.cordestaque;
  
  //expandindo..
  var noaux = no.pai;
  while ((noaux) && (!noaux.expandido))
  {
    alert("passando por " + noaux.texto);
    noaux.expandido = true;
    this.exibirsemexpandir(noaux);
    noaux = noaux.pai;
  }
  
}

function listarnos(no)
{
  var resultado = new Array();
  var i = 0;
  
  resultado[resultado.length] = no;
  for (i=0;i<no.filhos.length;i++)
    resultado = resultado.concat(listarnos(no.filhos[i]));
    
  return resultado;
}

function FdrTVlistarnosemvetor()
{
  var resultado = new Array();
  var i = 0;
  
  for (i = 0;i < this.filhos.length; i++)
    resultado = resultado.concat(listarnos(this.filhos[i]));
    
  return resultado;
}

function FdrTVsetacorfonte(corfonte)
{
  this.corfonte = corfonte;
  
  var nos = this.listarnosemvetor();
  
  for (var i = 0;i < nos.length; i++)
    nos[i].div.style.color = this.corfonte;

}


function FdrTVsetacordestaque(cordestaque)
{
  this.cordestaque = cordestaque;
}

function FdrTVlocalizartextonosnos(texto, especiais, cor)
{
  var regexp = new RegExp(texto, especiais); 
  var nos = this.listarnosemvetor();
  var cnt = 0;
  for (var i = 0; i < nos.length; i++) 
    if (nos[i].texto.search(regexp) != -1)
    {
      this.marcarno(nos[i],cor);
      cnt++;
    }
    
  return cnt;
}

function FdrTVfiltrarportag(elementopai, tagdesejada)
{
  return elementopai.getElementsByTagName(tagdesejada);
}

function FdrTVRetornaTodosElementos(elemento)
{
  return elemento.getElementsByTagName("*");
}

function FdrTVRetornaElementosComID(elemento, id)
{
  if (typeof(elemento.all) != 'undefined')
  {
    var resultado = elemento.all[id];
    if (!resultado) return null;
    if (typeof(resultado.length) == 'undefined')
    {
      //achou apenas um elemento, entao preciso transformar em vetor para manter o padrão
      var saida = new Array();
      saida[0] = resultado;
      return saida; 
    }
    else
    return resultado;
  }
  
  if (!elemento) alert("Buscando " + id +  " em null !!!!");
  var coll = elemento.getElementsByTagName("*");
  var resultado = new Array();
  
  for (var i=0;i<coll.length;i++)
    if (coll[i].id == id) resultado[resultado.length] = coll[i];
    
  return resultado;
}
