var instanciasArvore = Array();

function Arvore(){
	this.id = "";
}

function getInstanciaArvoreById(id_arvore){
	for(var i=0;i < instanciasArvore.length;i++){
		var instancia = instanciasArvore[i];
		if (instancia.id == id_arvore)
			return instancia;
	}
}

Arvore.prototype.inicializar = function(nomeArvore){
	
	instanciasArvore[instanciasArvore.length] = this;
	this.id = nomeArvore;
	this.nomeArvore = nomeArvore;
	this.elementoSelecionado = "";
	this.isSelecionando = false;
	this.isFocalizando = false;
	this.elementoLocalizado = null;
	this.arrayPaisElementoLocalizado = null;
	this.auxiliarLocalizacao = 0;
    this.arrExtraData = null;
	
	/* IDS */
	this.idLinhaElemento = this.nomeArvore + "Id";
	this.idDescricaoElemento = this.nomeArvore + "Descricao";
	this.idMaisMenos = this.nomeArvore +  "MaisMenosDo";
	this.idImgPastaFolha = this.nomeArvore + "ImgPastaFolha";
	this.idSummaryFilhoOrgao = this.nomeArvore + "FilhoDo";
	this.idSecaoFilhos = this.nomeArvore + "Filhos";
	this.idSecaoAviso = "";
	this.idSecaoAcoes = this.nomeArvore + "SecaoAcoes";
    this.idCampoAlterarElemento = this.nomeArvore + "CampoAlterarElemento"; //Especifico SGT
    this.idBotaoAlterarElemento = this.nomeArvore + "BotaoAlterarElemento"; //Especifico SGT
    this.idBotaoHabilitarDesabilitarElemento = this.nomeArvore + "BotaoHabilitarDesabilitarElemento"; //Especifico SGT
	
	/* IMAGENS */
	this.imgMais           = "imagens/mais.gif";
	this.imgMenos          = "imagens/menos.gif";
	this.imgLinha          = "imagens/linhaFinal.gif";
	this.imgPastaFechada   = "imagens/pastaFechada.gif";
	this.imgPastaAberta    = "imagens/pastaAberta.gif";
	this.imgFolha          = "imagens/folha.gif";
    this.imgLoading        = "imagens/loading2.gif";
    this.imgEditar         = "imagens/edit.png";
    this.imgSalvar         = "imagens/button_ok.gif";
    this.imgDesabilitar    = "imagens/Delete.png";
    this.imgHabilitar      = "imagens/bot_respondido.jpg";
	
	/* MENSAGENS DE AVISO */
	this.msgRecuperandoElementos = "<img src='" + this.imgLoading + "'>";
	this.msgElementosRecuperados = "";
	this.msgFocalizandoElemento = "Localizando elemento... <img src='" + this.imgLoading + "'>";
	this.msgElementoFocalizado = "";
	
	/* FUNCOES */
	this.fncVisualizarElemento     = "";
	this.fncAcoesElemento          = "";
    this.fncOnClickElemento        = ""; /* Ações extras ao se clicar em um elemento */
    this.fncOnLimparSelecionados   = ""; /* Ações extras ao limpar os itens selecionados */
	this.fncAlterarElemento        = ""; /* Função utilizada para alterar o elemento */
	this.fncHabilitarDesabilitarElemento        = ""; /* Função utilizada para habilitar/desabilitar o elemento */
	
    /* DESTE PROJETO */
    this.tipoArvore = "";
    
}

Arvore.prototype.selecionarElemento = function(id_elemento){
	
	this.isSelecionando = false;
	this.limparElementosSelecionados();
	this.colocarEstiloElementoSelecionado(id_elemento);
	this.elementoSelecionado = id_elemento;
	this.isSelecionando = true;
	pegarE(this.idDescricaoElemento + id_elemento).focus();
    if (this.fncOnClickElemento != "")
        this.fncOnClickElemento(id_elemento);
	
}

Arvore.prototype.expandirFecharElemento = function(id_elemento){
	
	this.isSelecionando = false;
	this.limparElementosSelecionados();
    var secaoFilhosElemento = pegarE(this.idSecaoFilhos + id_elemento);
	
	//Verifica se ainda não foi carregado anteriormente
	if (secaoFilhosElemento.innerHTML == ""){
		//avisoRapidoGeral(this.idSecaoAviso,this.msgRecuperandoElementos);
		this.isSelecionando = true;
	
		this.elementoSelecionado = id_elemento;
		var esquerdaSelecionada = this.getMargemElemento(id_elemento);
        
        try{
    	   secaoFilhosElemento.style.display = 'table-caption';
        }catch(ex){
           secaoFilhosElemento.style.display = '';
        }
            
        secaoFilhosElemento.style.marginLeft = (esquerdaSelecionada * 19) + "px";
        secaoFilhosElemento.innerHTML = this.msgRecuperandoElementos;
        
		var objRetorno = Object();
		objRetorno.callback= this.tratarMontarArvoreUtils;
		objRetorno.extra_data = this.id;
		
		x_montarArvoreUtils(this.id,this.elementoSelecionado,esquerdaSelecionada,this.tipoArvore,objRetorno);
		
	}else
		this.mostrarOcultarFilhosElemento(id_elemento);

}

Arvore.prototype.tratarMontarArvoreUtils = function(entrada,idArvore){
	
	if (typeof(entrada) == "string"){
		
		var arvoreAtual = getInstanciaArvoreById(idArvore);
		//avisoRapidoGeral(arvoreAtual.idSecaoAviso,arvoreAtual.msgElementosRecuperados);
		
		var secaoFilhos = arvoreAtual.idSecaoFilhos + arvoreAtual.elementoSelecionado;
		
        pegarE(secaoFilhos).style.display = 'none';
        pegarE(secaoFilhos).style.marginLeft = '0';
		pegarE(secaoFilhos).innerHTML = entrada;
        arvoreAtual.mostrarOcultarFilhosElemento(arvoreAtual.elementoSelecionado);
		
	}else{
		avisoRapidoGeral(arvoreAtual.idSecaoAviso,entrada[0]);
	}

}

Arvore.prototype.adicionarElementoNaArvore = function(conteudo_elemento){
	
	var secaoFilhosAtual = pegarE(this.idSecaoFilhos + this.elementoSelecionado);
	
	if (secaoFilhosAtual.innerHTML == ""){
		this.expandirFecharElemento(this.elementoSelecionado);
	}else{
		secaoFilhosAtual.innerHTML = conteudo_elemento + secaoFilhosAtual.innerHTML;
	}
}

Arvore.prototype.abrirSecaoVisualizarElemento = function(idArvore,id_elemento){
	var arvoreAtual = getInstanciaArvoreById(idArvore);
	arvoreAtual.fncVisualizarElemento(id_elemento);
}

Arvore.prototype.focalizarElemento = function(id_elemento){
	
    if (id_elemento == undefined || id_elemento == "")
        return;
    
	this.elementoLocalizado = id_elemento;
	this.isFocalizando = true;
	
	avisoRapidoGeral(this.idSecaoAviso,this.msgFocalizandoElemento);
		
	var objRetorno = Object();
	objRetorno.callback= this.tratarGetStringPaisElemento;
	objRetorno.extra_data = this.id;
	
	//Recupera a lista de pais do elemento
	x_getStringPaisElementoUtils(this.id,id_elemento,this.tipoArvore,objRetorno);
	
}

Arvore.prototype.tratarGetStringPaisElemento = function(entrada,idArvore){

	var arvoreAtual = getInstanciaArvoreById(idArvore);
	
	if (typeof(entrada) == "string"){
	
		var arrPais = entrada.split(",");
		
		arvoreAtual.arrayPaisElementoLocalizado = arrPais;
		arvoreAtual.auxiliarLocalizacao = 0;
		
		var qntPais = arrPais.length;
		
		while (!pegarE(arvoreAtual.idLinhaElemento + arvoreAtual.arrayPaisElementoLocalizado[arvoreAtual.auxiliarLocalizacao])){
			++arvoreAtual.auxiliarLocalizacao;
			if (arvoreAtual.auxiliarLocalizacao > qntPais)
				if (pegarE(arvoreAtual.idLinhaElemento + arvoreAtual.elementoLocalizado)){
					arvoreAtual.selecionarElemento(arvoreAtual.elementoLocalizado);
					arvoreAtual.finalizarLocalizacaoElemento();
					return;
				}
		}

		arvoreAtual.expandirFecharElemento(arvoreAtual.arrayPaisElementoLocalizado[arvoreAtual.auxiliarLocalizacao]);
		
	}else{
		avisoRapidoGeral(arvoreAtual.idSecaoAviso,entrada[0]);
	}

}

Arvore.prototype.mostrarAcoesElemento = function(id_elemento){
	
	var secaoAcoesElemento = pegarE(this.idSecaoAcoes + id_elemento);
	
	if (secaoAcoesElemento){
		secaoAcoesElemento.style.display = "";
	}
	
}

Arvore.prototype.ocultarAcoesElemento = function(id_elemento){
	
	var secaoAcoesElemento = pegarE(this.idSecaoAcoes + id_elemento);
	
    /* Especifico do SGT */
    var campoTextoAlteracao = pegarE(this.idCampoAlterarElemento + id_elemento);
    var isAlterando = false;
    if (this.arrExtraData != null){
        
        if (this.arrExtraData["seqItemAlterar"] &&
            this.arrExtraData["seqItemAlterar"] == id_elemento)
            isAlterando = true;
            
        if (this.arrExtraData["seqItemDesabilitado"] &&
            this.arrExtraData["seqItemDesabilitado"] == id_elemento)
            isAlterando = true;
    }
    
    
	if (secaoAcoesElemento && !isAlterando){
		secaoAcoesElemento.style.display = "none";
	}
	
}

Arvore.prototype.mostrarOcultarFilhosElemento = function(id_elemento){
	
	var secaoFilhosElemento = pegarE(this.idSecaoFilhos + id_elemento);
	if (secaoFilhosElemento.style.display == "" && 
		!this.isFocalizando){
		this.ocultarFilhosElemento(id_elemento);
	}else{
		this.mostrarFilhosElemento(id_elemento);
	}
	
	if (this.isFocalizando){
		
		var proximoPai = this.arrayPaisElementoLocalizado[++this.auxiliarLocalizacao];
		if (proximoPai){
		
			this.expandirFecharElemento(this.arrayPaisElementoLocalizado[this.auxiliarLocalizacao]);
		
		}else{ //Já abriu todos os elementos pais
			this.selecionarElemento(this.elementoLocalizado);
			this.finalizarLocalizacaoElemento();
		}
	}else
		this.elementoSelecionado = "";
	
}

Arvore.prototype.finalizarLocalizacaoElemento = function(){
	this.isFocalizando = false;
	this.elementoLocalizado = null;
	this.arrayPaisElementoLocalizado = null;
	this.auxiliarLocalizacao = 0;
	avisoRapidoGeral(this.idSecaoAviso,this.msgElementoFocalizado);
}

Arvore.prototype.mostrarFilhosElemento = function(id_elemento){
	
	//Mostra os filhos
	var secaoFilhos = pegarE(this.idSecaoFilhos + id_elemento);
	secaoFilhos.style.display = "";
	//Troca a imagem da pasta e a acao da imagem de "+-"
	this.exibirAcoesPastaAberta(id_elemento);
	
}

Arvore.prototype.ocultarFilhosElemento = function(id_elemento){
	
	//Oculta os filhos
	var secaoFilhos = pegarE(this.idSecaoFilhos + id_elemento);
	secaoFilhos.style.display = "none";
	//Troca a imagem da pasta e a acao da imagem de "+-"
	this.exibirAcoesPastaFechada(id_elemento);
	
}

Arvore.prototype.exibirAcoesPastaFechada = function(id_elemento){
	
	this.setarImagemMaisMenos(id_elemento,this.imgMais);
	this.setarImagemPastaAbertaFechada(id_elemento,this.imgPastaFechada);
	
}

Arvore.prototype.exibirAcoesPastaAberta = function(id_elemento){
	
	this.setarImagemMaisMenos(id_elemento,this.imgMenos);
	this.setarImagemPastaAbertaFechada(id_elemento,this.imgPastaAberta);
	
}

Arvore.prototype.setarImagemPastaAbertaFechada = function(id_elemento,src_imagem){
	
	var img = pegarE(this.idImgPastaFolha + id_elemento);
	if (img){
		var src = src_imagem;
		img.src=src;
	}
}

Arvore.prototype.setarImagemMaisMenos = function(id_elemento,src_imagem){
	
	var img = pegarE(this.idMaisMenos + id_elemento);
	var arvoreTmp = this;
	if (img){
		
		var src = src_imagem;
		
		img.src=src;
		img.style.cursor = "pointer";
		img.onclick = function(){arvoreTmp.expandirFecharElemento(id_elemento);};
	}
	
}

Arvore.prototype.limparElementosSelecionados = function(){
	
	if (!this.isSelecionando){
		this.colocarEstiloElementoNormal(this.elementoSelecionado);
		this.elementoSelecionado = "";
        
        if (this.fncOnLimparSelecionados != "")
            this.fncOnLimparSelecionados();
        
	}else
		this.isSelecionando = false;
	
}

Arvore.prototype.colocarEstiloElementoSelecionado = function(id_elemento){
	
	var linhaDescricaoElemento = pegarE(this.idDescricaoElemento + id_elemento);
	if (linhaDescricaoElemento){
		linhaDescricaoElemento.className= "categoriaSelecionada";
		linhaDescricaoElemento.style.color = "white";
	}	
}

Arvore.prototype.colocarEstiloElementoNormal = function(id_elemento){
	
	var linhaDescricaoElemento = pegarE(this.idDescricaoElemento + id_elemento);
	
	if (linhaDescricaoElemento){
		linhaDescricaoElemento.className= "categoriaNormal";
		linhaDescricaoElemento.style.color = "black";
	}	
}

Arvore.prototype.getMargemElemento = function(id_elemento){

	var margemElemento = "-19";

	if (pegarE(this.idLinhaElemento + id_elemento)){
		margemElemento = pegarE(this.idLinhaElemento + id_elemento).style.marginLeft;
		margemElemento = (margemElemento.substring(0,margemElemento.length -2) / 19) +1;
	}

	return margemElemento;

}
