/**
 * Classe respons�vel pela cria��o e manipula��o das janelas de 
 * intera��o com o usu�rio do aplicativo cliente (GUI's). 
 * 
 * TODAS AS CLASSES DE PROT�TIPO "CONTROLADOR" ESTENDEM DESSA CLASSE.
 * 
 * Prot�tipo dessa classe: CONTROLADOR.
 * 
 * @author Renato Sulzbach
 * @version 1.0
 * @since 26/07/2007
 */
function Controlador() {

	this.id = null;
	

	// Vari�vel de auto-refer�ncia utilizada para gerenciar respostas do servidor DWR.
	var autoReferencia = null;
		
	// Var�vel referente ao limite (GUI) do controlador.
	this.objLimite = null;
	
	this.dataDoServidor = null;
	this.horaDoServidor = null;

	//IDENTIFICADOR DA CLASSE (para obter o valor dessa variavel, usar o metodo toString())
	this.ctrName = null;
	
	//NOME DA VARIAVEL DE RETORNO DA PESQUISA GENERICA
	this.nomeAtributoRetornoPesquisa = null;
	this.valorAtributoDescricaoPesquisa = null;
	this.valorAtributoCodigoPesquisa = null;
	this.valorAtributoAtivoPesquisa = false;
	
	this.codSucesso = 0;
	this.codErro = 1;
	this.codAlerta = 2;
	this.codPermissao = 3;
	
	/**
	 * Disponibiliza a interface gr�fica com o usu�rio (GUI), instanciando caso 
	 * a mesma ainda n�o foi criada.
	 */
	this.abrirJanela = function() {
		var objLimite = this.getLimite();

		if (objLimite == null) {
			objLimite = this.instanciarLimite();
			this.setLimite(objLimite);
		}
		objLimite.show();
		
		ServidorFacade.getHtmlContent(objLimite.getHtml(), this.setHtmlContent);
	}
		
	/**
	 * Fecha o limite (GUI) destruindo todas as suas referencias.
	 */
	this.fecharJanela = function() {
		if(this.getLimite() != undefined && this.getLimite() != null) {
			var idControlador = this.getLimite().getId();
			this.getLimite().destroy();
		}

		this.objLimite = null;

		aplicativo.destruirControlador(idControlador);
	}
	
	/**
	 * RETORNA NOME DO CONTROLADOR
	 */	
	this.ctrName = function() {
		return this.getLimite().getId();
	}
	
	this.toString = function() {
		return this.ctrName();
	}
	
	/**
	 * Configura o conte�do do limite.
	 * @param conteudo conte�do HTML, representado como string, n�o como URL, obtido pelo servidor DWR.
	 */
	this.setHtmlContent = function(conteudoComoXml){
		var limite = autoReferencia.getLimite();
		var xml = new Xml();
		xml.lerXml(conteudoComoXml);
		var mensagem = xml.getValorElemento("resposta.mensagem");
		
		return Try.these(function() {
			if (xml.getValorElemento("resposta.codErro") == 0) {
				limite.setContent(mensagem);
			}
			else {
				limite.setContentErro(mensagem);
			}
		})
	}
	
	/**
	 *	Solicita a abertura da janela de pesquisa, onde o usu�rio poder� informar um valor de
	 *  c�digo ou descri��o dos dados que deseja obter a listagem do cadastro.
	 */		

	this.pesquisar = function() {
		var objCtrPesquisa = aplicativo.getControlador("CtrPesquisa");
		objCtrPesquisa.setControladorRequisitante(this);
		objCtrPesquisa.abrirJanela();
	}
	
	/**
	 *	Solicita a abertura da janela de pesquisa rapida, onde o usu�rio poder� informar uma 
	 * descri��o dos dados que deseja obter a listagem do cadastro.
	 */
	this.buscaRapida = function(campoAtual, proximoCampo, departamento, pesquisa, controladorRequisitante){
		var objCtrBuscaRapida = aplicativo.getControlador("CtrBuscaRapida");
		objCtrBuscaRapida.setDepto(departamento);
		objCtrBuscaRapida.setPesquisa(pesquisa);
		objCtrBuscaRapida.setControladorRequisitante(controladorRequisitante);
		objCtrBuscaRapida.setCampoAtual(campoAtual);
		objCtrBuscaRapida.setProximoCampo(proximoCampo);
		objCtrBuscaRapida.abrirJanela();
	}
	
	/*
	 * M�todos implementados pelo Daniel que n�o deveriam estar aqui.
	 */
	this.pesquisarProdutos = function() {
		var objCtrPesquisaProdutos = aplicativo.getControlador("CtrPesquisaProdutos");
		objCtrPesquisaProdutos.setControladorRequisitante(this);
		objCtrPesquisaProdutos.abrirJanela();
	}	

	this.pesquisarServicos = function() {
		var objCtrPesquisaServicos = aplicativo.getControlador("CtrPesquisaServicos");
		objCtrPesquisaServicos.setControladorRequisitante(this);
		objCtrPesquisaServicos.abrirJanela();
	}
	
	this.pesquisarItensEstoque = function() {
		var objCtrPesquisaItensEstoque = aplicativo.getControlador("CtrPesquisaItensEstoque");
		objCtrPesquisaItensEstoque.setControladorRequisitante(this);
		objCtrPesquisaItensEstoque.abrirJanela();
	}	

	this.pesquisarVendasLista = function() {
		var objCtrPesquisaVendas = aplicativo.getControlador("CtrPesquisaVendas");
		objCtrPesquisaVendas.setControladorRequisitante(this);
		objCtrPesquisaVendas.abrirJanela();
	}
	
	this.montaContatos = function(vArContatos) {
		var arContatos = new Array();
		if(vArContatos != null) {
			for(x=0; x < vArContatos.length; x++) {
				var entContato = new EntContato();
				var codigoColaborador = 0;
				if(this.getLimite().getDadoDoFormularioInt("codigo") != null) { 
					codigoColaborador = this.getLimite().getDadoDoFormularioInt("codigo"); 
				}
				entContato.setDados(vArContatos[x][0], codigoColaborador, vArContatos[x][1], vArContatos[x][2], vArContatos[x][3], vArContatos[x][4]);
				arContatos[x] = entContato.getBean();
			}
			return arContatos;
		} else {
			return null;
		}
	}


	/*
	 * Recebe uma resposta do servidor
	 */
	this.recebaRespostaDoServidor = function(respostaDoServidor) {
		var limite = autoReferencia.getLimite();
		
		var xml = new Xml();
		xml.lerXml(respostaDoServidor);
		var mensagem = xml.getValorElemento("resposta");
		
		var sucesso = autoReferencia.trataMensagemRespostaServidor(mensagem.codErro, mensagem.mensagem);
		
		if(sucesso) {
			limite.getResetaForm();
		}
	}
	
	/*
	 * Faz o tratamento de uma mensagem recebida pelo servidor
	 */
	this.trataMensagemRespostaServidor = function(vCodigo, vMensagem, vRetornaFeedback) {
		var objLimite = this.getLimite();
		
		return Try.these(function() {
			var retorno = true;
			if (objLimite != null) {
				if (vCodigo == 0 && vRetornaFeedback != false) {
					objLimite.mostrarMensagem("salvar", vMensagem);
				} else if (vCodigo == 1) {
					retorno = false;
					objLimite.mostrarMensagem("erro", vMensagem);
				} else if (vCodigo == 2) {
					retorno = false;
					objLimite.mostrarMensagem("alerta", vMensagem);
				} else if (vCodigo == 3) {
					retorno = false;
					objLimite.mostrarMensagem("alerta", vMensagem);
				} else {
					objLimite.limparMensagem();
				}
				return retorno;
			} else {
				retorno = false;
			}
		}) || false;		
	}

	
	/*
	 * Solicita ao servidor a data do sistema
	 */
	this.solicitaDataDoServidor = function() {
		ServidorFacade.getData(this.retornaDataDoServidor);
	}
	


	
	/*********** M�todos de acesso e modifica��o ***********/
	
	this.setDataDoServidor = function(vData) {
		this.dataDoServidor = vData;
	}
	
	this.getDataDoServidor = function() {
		return this.dataDoServidor;
	}
	
	this.setHoraDoServidor = function(vHora) {
		this.horaDoServidor = vHora;
	}
	
	this.getHoraDoServidor = function() {
		return this.horaDoServidor;
	}	
	
	this.setAutoReferencia = function(controlador) {
		autoReferencia = controlador;
	}
	
	this.setLimite = function(limite) {
		this.objLimite = limite;
	}
	
	this.getLimite = function() {
		return this.objLimite;
	}
	
	this.setMetodoDePesquisa = function(metodo) {
		this.metodoDePesquisa = metodo;	
	}
	
	this.getMetodoDePesquisa = function() {
		return this.metodoDePesquisa;
	}	
	
	this.setMetodoDeRetorno = function(metodo) {
		this.metodoDeRetorno = metodo;	
	}
	
	this.getMetodoDeRetorno = function() {
		return this.metodoDeRetorno;	
	}
	
	this.setNomeAtributoRetornoPesquisa = function(vNome){
		this.nomeAtributoRetornoPesquisa = vNome;
	}
	
	this.getNomeAtributoRetornoPesquisa = function(){
		return this.nomeAtributoRetornoPesquisa;
	}
	
	this.setValorAtributoDescricaoPesquisa = function(vDesc){
		this.valorAtributoDescricaoPesquisa = vDesc;
	}
	
	this.getValorAtributoDescricaoPesquisa = function(){
		return this.valorAtributoDescricaoPesquisa;
	}
		
	this.setValorAtributoCodigoPesquisa = function(vCodigo){
		this.valorAtributoCodigoPesquisa = vCodigo;
	}
	
	this.getValorAtributoCodigoPesquisa = function(){
		return this.valorAtributoCodigoPesquisa;
	}
	
	this.setValorAtributoAtivoPesquisa = function(vAtivo){
		this.valorAtributoAtivoPesquisa = vAtivo;
	}
	
	this.getValorAtributoAtivoPesquisa = function(){
		return this.valorAtributoAtivoPesquisa;
	}
	
	this.setMetodoPesquisaProduto = function(metodo) {
		this.metodoPesquisaProduto = metodo;	
	}
	
	this.getMetodoPesquisaProduto = function() {
		return this.metodoPesquisaProduto;
	}	
	
	this.setMetodoRetornoProduto = function(metodo) {
		this.metodoRetornoProduto = metodo;	
	}
	
	this.getMetodoRetornoProduto = function() {
		return this.metodoRetornoProduto;	
	}
	
	this.setMetodoPesquisaServico = function(metodo) {
		this.metodoPesquisaServico = metodo;	
	}
	
	this.getMetodoPesquisaServico = function() {
		return this.metodoPesquisaServico;
	}	
	
	this.setMetodoRetornoServico = function(metodo) {
		this.metodoRetornoServico = metodo;	
	}
	
	this.getMetodoRetornoServico = function() {
		return this.metodoRetornoServico;	
	}	
	
	this.setMetodoPesquisaItensEstoque = function(metodo) {
		this.metodoPesquisaItensEstoque = metodo;	
	}
	
	this.getMetodoPesquisaItensEstoque = function() {
		return this.metodoPesquisaItensEstoque;	
	}		
	
	this.setMetodoRetornoPesquisaItensEstoque = function(metodo) {
		this.metodoRetornoPesquisaItensEstoque = metodo;	
	}
	
	this.getMetodoRetornoPesquisaItensEstoque = function() {
		return this.metodoRetornoPesquisaItensEstoque;	
	}			
	
	this.setMetodoPesquisaVendas = function(metodo) {
		this.metodoPesquisaVendas = metodo;	
	}
	
	this.getMetodoPesquisaVendas = function() {
		return this.metodoPesquisaVendas;	
	}		
	
	this.setMetodoRetornoPesquisaVendas = function(metodo) {
		this.metodoRetornoPesquisaVendas = metodo;	
	}
	
	this.getMetodoRetornoPesquisaVendas = function() {
		return this.metodoRetornoPesquisaVendas;	
	}	
	
	this.setId = function(vId) {
		this.id = vId;
	}
	
	this.getId = function() {
		return this.id;
	}


	/************* M�TODOS A SEREM SOBRESCRITOS *************/
	
	/**
	 * Ap�s recebida a solicita��o e ter efetuado a valida��o dos dados, o controlador
	 * est� pronto para solicitar os dados para o seu limite e envi�-los ao servidor
	 * para que seja feita a persist�ncia dos mesmos.
	 */
	this.salvarDados = function() {
		alert("ERRO: o m�todo salvarDados() n�o foi implementado pelo controlador apropriado.");
	}
	
	/**
	 * M�todo informado ao controlador de pesquisa para que, quando usu�rio decidir por fazer uma pesquisa
	 * de dados em um cadastro, esse m�todo seja executado e tratado pelo controlador apropriado.
	 * @param codigo o c�digo para se efetuar uma pesquisa pelo c�digo do cadastro
	 * @param iniciais as iniciais da identifica��o do dado no cadastro (descri��o, nome)
	 * @param ativos <code>true</code> se a pesquisa deve envolver os cadastros ativos ou <code>false</code> se n�o
	 * @param inativos <code>true</code> se a pesquisa deve envolver os cadastros inativos ou <code>false</code> se n�o
	 */
	this.metodoDePesquisa = function(codigo, iniciais, ativos) {
		alert("ERRO: o m�todo metodoDePesquisa() n�o foi implementado pelo controlador apropriado.");
	}
	
	this.instanciarLimite = function() {
		alert("ERRO: o m�todo instanciarLimite() n�o foi implementado pelo controlador apropriado.");
	}
	
	this.retornaDataDoServidor = function(vData) {
		alert("ERRO: o método retornaDataDoServidor() n�o foi implementado pelo controlador apropriado.");
	}
	
	
	
	
	// CARLOS - 17/04/2009 - REPLICANDO METODO DO LimPrincipal PARA RESOLVER PROBLEMAS DE DEPENDENDICA DO CADASTRO DE PONTO

	this.trataRespostaServidor = function(vCodigo, vMensagem, retornarFeedback) {
		var limite = this.getLimite();

		if (limite != null) {
			// Mostra feedback incondicionalmente quando eh erro
			// Quando eh sucesso, mostra apenas quanto retornarFeedback eh true
			if (Number(vCodigo) != 0 || retornarFeedback) {
				limite.mostrarMensagem(Number(vCodigo), vMensagem);
			}
		} else {
			vCodigo = 1;
		}

		return vCodigo == 0 ? true : false;
	}

}