/*
 * CLASSE GENERICA DE PESQUISA E MULTISELECAO
 */ 
 
 function CtrPesquisa() {

	this.setAutoReferencia(this);
	var autoReferencia = this;
	
	this.controladorRequisitante = null;
		
	/**
	 * M�todo que instancia o limite que representa a interface gr�fica (GUI).
	 */
	this.instanciarLimite = function() {
		return new LimPesquisa(this);
	}
	
/*
 * ATRIBUTOS
 */	
	this.multiSelecao = false;
	
	this.arrayDadosResp = new Array();
	this.totalRegistros = 0;
	this.registroInicial = 0;
	this.qtdRegistrosPorRequisicao = 300;	
	
	
	/**
	 * M�todo que obt�m do formul�rio os dados informados pelo usu�rio e executa o m�todo recebido
	 * pelo controlador afim de tratar a solicita��o do usu�rio de pesquisar dados.
	 */
	this.efetuarPesquisa = function() {
		var objLimite = this.getLimite();
		var codigo = objLimite.getCodigo();

		if(codigo == undefined || codigo == null || codigo == "" || codigo < 0) { 
			codigo = 0; 
		}

		var iniciais = objLimite.getDescricao();
		var ativo = objLimite.getAtivo();
		
		var regInicial = this.getRegistroInicial();
		
		this.setRegistrosPorRequisicao(this.qtdRegistrosPorRequisicao);
		
		var qtdDeRegistros = this.qtdRegistrosPorRequisicao;
		
		this.metodoDePesquisa(codigo, iniciais, ativo, regInicial, qtdDeRegistros);
	}
	
	this.metodoDePesquisa = function(codigo, iniciais, ativo, regInicial, qtdDeRegistros) {
		this.getLimite().mostrarImagem("barraCarregando");
		var controladorRequisitante = this.getControladorRequisitante();

		controladorRequisitante.metodoDePesquisa(codigo, iniciais, ativo, regInicial, qtdDeRegistros, this.metodoDeRetorno);
	}
	
	this.transformaObjetoEmJson = function(dados) {
		
		if (dados.dados[0].registros != null) {
			var arrayRegistro = new Array(); 
			var arrayRegistros = dados.dados[0].registros;
					
			for(var i=0; i<arrayRegistros.length; i++) {
				var JsonRegistro = new Object();
				
				JsonRegistro.codigo = arrayRegistros[i].codigo;
				JsonRegistro.descricao = arrayRegistros[i].descricao;
				JsonRegistro.totalDeRegistros = dados.dados[0].totalDeRegistros;
				
				arrayRegistro.push(JsonRegistro);
			}
			
			var mensagem = new Object();
			var Registro = new Object();
			
			mensagem.CodErro = dados.CodErro;
			mensagem.mensagem = dados.mensagem;
			mensagem.dados =  Registro;
			
			mensagem.dados.Registro = arrayRegistro;
			
			return mensagem;
			
		} else {
			var mensagem = new Object()
			mensagem.dados = undefined;
			
			return mensagem; 
		}
	}
		
	this.metodoDeRetorno = function(dados) {
		// Lissandro 19/06/2009 - Implementacacao da arquitetura nova, tratando
		// o objeto que retorna do metodo de pesquisa generico.   
        var codigoErro;
        var stringMensagem;
        
        if (typeof(dados) == "object" ) {
			codigoErro = dados.codErro;
			stringMensagem = dados.mensagem;
		} else {
			var xml = new Xml();
			xml.lerXml(dados);
			var mensagem = xml.getValorElemento("resposta");
			codigoErro = mensagem.codErro;
			stringMensagem = mensagem.mensagem;
		}
		//*********************
		
		var objLimite = autoReferencia.getLimite();
		var nomeAtributo = autoReferencia.getControladorRequisitante().getNomeAtributoRetornoPesquisa();
		var codigoAtributoRegistro = autoReferencia.getControladorRequisitante().getValorAtributoCodigoPesquisa();
		var descricaoAtributoRegistro = autoReferencia.getControladorRequisitante().getValorAtributoDescricaoPesquisa();
		
		if(autoReferencia.trataMensagemRespostaServidor(codigoErro, stringMensagem, false)) {
			if (typeof(dados) == "object" ) {
				var mensagem = autoReferencia.transformaObjetoEmJson(dados);
			}
			if(mensagem.dados != undefined) {
				if(nomeAtributo != null) {
					mensagem.dados.Registro = eval("mensagem.dados." + nomeAtributo);
					if(mensagem.dados.Registro.length != undefined){
						for(i=0; i<mensagem.dados.Registro.length; i++){
							mensagem.dados.Registro[i].codigo = eval("mensagem.dados.Registro["+ i +"]." + codigoAtributoRegistro);
							mensagem.dados.Registro[i].descricao = eval("mensagem.dados.Registro["+ i +"]." + descricaoAtributoRegistro);
						}
					} 
					else {
						mensagem.dados.Registro.codigo = eval("mensagem.dados.Registro." + codigoAtributoRegistro);
						mensagem.dados.Registro.descricao = eval("mensagem.dados.Registro." + descricaoAtributoRegistro);
					}
				}
				autoReferencia.criaArrayDadosResp(mensagem);
				objLimite.inicializarListagem();
			} else {
				objLimite.getObjDvResposta().style.display = "none";
				objLimite.mostrarMensagem("alerta", "Sem resultados para esta pesquisa.");	
				objLimite.limparPaginacao();
			}
		} else {
			objLimite.getObjDvResposta().style.display = "none";
			objLimite.limparPaginacao();
		}
	}

	this.criaArrayDadosResp = function(mensagem) {
		if(mensagem.dados != undefined) {
			if(mensagem.dados.Registro.length == undefined) {
				var arResp = new Array(1);
				arResp[0] = mensagem.dados.Registro;
				this.setArrayDadosResp(arResp);				
			} 
			else {				
				var arResp = new Array(mensagem.dados.Registro.length);

				for(i=0; i< mensagem.dados.Registro.length; i++) {
					if(mensagem.dados.Registro[i] != undefined) {
						arResp[i] = mensagem.dados.Registro[i]; 						
					}
				}
				this.setArrayDadosResp(arResp);
			}
			this.setTotalRegistros(this.getArrayDadosResp()[0].totalDeRegistros != undefined ? this.getArrayDadosResp()[0].totalDeRegistros : mensagem.qtdeDados);
		}
	}	

	this.retornaPesquisa = function(codigo, descricao, cont){
		var controladorRequisitante = autoReferencia.getControladorRequisitante();
		controladorRequisitante.metodoDeRetorno(codigo, descricao);
	}	

	this.enviaArraySelecao = function() {
		if(this.getArrayDadosResp().length > 0) {
			if(this.getLimite().getArraySelecao().length > 0) {
				this.getControladorRequisitante().metodoDeRetorno(this.getLimite().getArraySelecao(), this);			
			} else {
				this.getLimite().mostrarAlertaSelecao();
			}			
		} else {
			this.getLimite().getObjDvResposta().style.display = "none";
			this.getLimite().mostrarMensagem("alerta", "Fa&ccedil;a uma busca, e selecione pelo menos um item.");	
			this.getLimite().limparPaginacao();
		}
	}	
	
	this.respostaInclusao = function(vNovos, vExistentes) {
		this.getLimite().mostrarRespostaInclusao(vNovos, vExistentes);
		this.getLimite().limparTudo();
	}		

	
	/**
	 * M�todo informado ao controlador de pesquisa para que, quando uma pesquisa de dados em um cadastro
	 * for executada, esse m�todo � invocado
	 */

	
	/*********** M�todos de acesso e modifica��o ***********/
	
	this.setControladorRequisitante = function(controlador) {
		this.controladorRequisitante = controlador;	
	}
	
	this.getControladorRequisitante = function() {
		return this.controladorRequisitante;
	}
	
/**
 * SETS / GETS
 */	
//MULTISELECAO
	this.setMultiSelecao = function(vValor) { 
		this.multiSelecao = vValor; 
	}
	this.getMultiSelecao = function() { 
		return this.multiSelecao; 
	}
 
//ARRAY DADOS RESPOSTA
	this.setArrayDadosResp = function(vValor) { 
		this.arrayDadosResp = vValor; 
	}
	this.getArrayDadosResp = function() { 
		return this.arrayDadosResp; 
	}

//VALOR MAXIMO DE REGISTROS POR REQUISICAO
	this.setRegistrosPorRequisicao = function(vValor) { 
		this.qtdRegistrosPorRequisicao = vValor; 
	}
	this.getRegistrosPorRequisicao = function() { 
		return this.qtdRegistrosPorRequisicao;
	 }
	
//REGISTRO INICIAL
	this.setRegistroInicial = function(vValor) { 
		this.registroInicial = vValor;
	}
 	this.getRegistroInicial = function() { 
 		return this.registroInicial;
 	}


//TOTAL DE REGISTROS
	this.setTotalRegistros = function(vTotal) { 
		this.totalRegistros = vTotal; 
	}
	this.getTotalRegistros = function() { 
		return this.totalRegistros;
	} 	
}

CtrPesquisa.prototype = new Controlador;