/**
 * Javascript utilizado no filtro de pesquisa do corpo Guia Médico Geral (2009-guia-medico-geral)
 * 
 * Matheus Trevizan - matheus@dynamix.com.br
 * 27/02/2009
 * 
 * requerido os seguintes scripts:
 * /comum/js/jquery-latest.js
 * /comum/js/jquery-selectboxes-min.js
 * /comum/js/jquery-simplemodal-min.js
 * /comum/js/jquery-create.js
 * 
 * São necessários os métodos na página (corpo):
 * getURLServletGuiaMedico
 * getURLServletEstadoCidade
 * getURLServletDownGuiaMedico
 * selectUnimed
 * closeModal
 * showModal
 * 
 * Alem disso, deve ser adicionado no onChange dos campos as chamadas onChange do Filtro.
 * 
 */
function filtroGuiaMedico() {

	//handle do pacote de modal
	var modUtil = new filtroGuiaMedicoModalUtils();
	//handle do pacote de ajax
	var ajaxUtil = new filtroGuiaMedicoAJAXUtils();
	//handle do pacote cleaner
	var cleanUtil = new filtroGuiaMedicoCleanUtils();
	//handle do pacote util
	var uUtil = new filtroGuiaMedicoUtils();
	//handle do proprio pacote
	var obj = this;
	
	var jsonUnimeds = null;
	
	var isSwapUnimed = true;
	
	var isOldQuery   = true;
	
	var isCliente = false;
	
	// informa se o componente deve ocultar a combo de estado/cidade
	// e mostrar o nome da unimed
	this.setSwapUnimed = function(valor){
		isSwapUnimed = valor;
		cleanUtil.setSwapUnimed(valor);
	}
		
	this.setCliente = function(valor){
		isCliente = valor;
	}
	
	this.setOldQuery = function(valor){
		isOldQuery = valor;
	}
	
	this.limpa = function(){
		//seleciona novamente a primeira opcao de estados (ufs)
		$("select#estado option:first").attr('selected', 'selected');
		cleanUtil.limpaCidade();		
	}
	
	this.showModal = function(){
		//somente mostrar o modal, se existir valores na variavel jsonUnimeds
		if (jsonUnimeds != null){
			//se for mais de uma unimed, ou 
			//se for uma unimed, mas essa nao tiver guia medico
		    if ((jsonUnimeds.qtd > 1) || (jsonUnimeds.qtd == 1 && jsonUnimeds.lista[0].unimed.tpguia != 1)){
			    //abrindo funcao de modal no div id : divMultiUnimed
		    	modUtil.openModal('#divMultiUnimed', function(){
					// ao mostrar o modal, para cada valor de unimed, efetuar a funcao eachUnimed
		    		uUtil.groupUnimed(jsonUnimeds);
			    });
			    //retornar verdadeiro caso o modal seja aberto
			    return true;
		    }
		}
		//retornar falso caso o modal nao seja necessario
		return false;
    }
	
	this.hideModal = function(){
		modUtil.closeModal();
	}
	
	this.alteraCidade = function(){
		cleanUtil.limpaRecursos();
		// limpa o div com o botão de download do GM
		$('div#down').empty();
		$('#filtro-estadocidade').show();
	}
	
	this.onEstadoChange = function(){
	
		cleanUtil.limpaCidade();

		// compatibilidade com as consultas antigas ...
		// Ex. Unimed mais proxima
		if( isOldQuery ) {
			var url = getURLServletCidadeEstado();
			var sel = $("select#estado").selectedOptions().get(0).value;
			
			$.ajax({
				type: "POST",
				url: url,
				data : { ds_uf : sel, fgAddFederacao : "sim"},
				dataType :"xml",
				contentType: "application/x-www-form-urlencoded;charset=UTF-8",
				//funcao executada no campo estado enquanto esta sendo processada a requisicao de cidades
				beforeSend : function(){
					//adicionando opcao de aguarde
					$("select#cidade").addOption(".", "Carregando, por favor aguarde ... ");					
				},
				error : ajaxUtil.onError,
				success : onSuccessEstado
			});
		}
		else {
			var url    = getURLServletGuiaMedico();
			var nmUf   = $("select#estado").selectedOptions().get(0).value;
			var cdRede = getRedeCodigo( $("input#cod_rede").val() );
			
			var acao = "getCidadesComRedes";
			if( !isCliente ) {
					acao = "getCidadesPorEstado";
			}
			
			$.ajax({
				type : "POST",
				url : url,
				data : { ds_uf : nmUf, cd_rede : cdRede,  action: acao},
				contentType: "application/x-www-form-urlencoded;charset=UTF-8",
				dataType : "xml",
				//funcao executada no campo estado enquanto esta sendo processada a requisicao de cidades
				beforeSend : function(){
					//adicionando opcao de aguarde
					$("select#cidade").addOption(".", "Carregando, por favor aguarde ... ");					
				},
				error : ajaxUtil.onError,
				success : onSuccessEstado
			});
		}
	}
	
	this.onCidadeChange = function(){
		
		var url = getURLServletGuiaMedico();
		var selUf = $("select#estado").selectedOptions().get(0).value;
		var selCid = $("select#cidade").selectedOptions().get(0).text;
		var selCValue = $("select#cidade").selectedOptions().get(0).value;
		
		cleanUtil.limpaRecursos();
		
		if ( !uUtil.contemVlrArray(selCid,  new Array(null, ".", "0", "-", "Sua cidade", "--------------------"))){		
			$.ajax({
				type : "POST",
				url : url,
				data : { ds_uf : selUf, ds_cidade : selCid, cd_cidade : selCValue, action: "getInfoGuiaMedicoByCidade"},
				contentType: "application/x-www-form-urlencoded;charset=UTF-8",
				dataType : "json",
				beforeSend: function(){
						//adicionando opcao de aguarde
						$("select#recursos").addOption(".", "Carregando, por favor aguarde ... ");					
				}, 
			    error : ajaxUtil.onError,
			    success : onSuccessCidade
			});
		}
	}		
	
	this.onRecursoChange = function(){
	
		var selRec = $("select#recursos").selectedOptions().get(0).value;
		var selCid= $("select#cidade").selectedOptions().get(0).value;
		var rede  = getRedeCodigo( $("input#cod_rede").val() );
	
		var acao = "getEspecialidadesPorEstado";
		if( !isCliente ) {
			acao = "getEspecialidades";
		}
		
		cleanUtil.limpaEspecialidade();
		
		if ( !uUtil.contemVlrArray(selCid,  new Array(null, ".", "0", "-", "Sua cidade", "--------------------"))){
			if( !isNaN(selRec) && selRec > 0 ) {
				var url = getURLServletGuiaMedico();
				$.ajax({
					type : "POST",
					url : url,
					contentType: "application/x-www-form-urlencoded;charset=UTF-8",
					data : { cd_munic : selCid, tp_recurso : selRec, cd_rede: rede, action: acao},
					dataType : "xml",
					beforeSend: function(){
						$("select#especialidade").addOption(".", "Carregando, por favor aguarde ... ");
					},
				    error : ajaxUtil.onError,
				    success : onSuccessEspecialidade
				});
		}
		}
	}
	
	//funcao de sucesso no caso de selecao de estado
	//funcao private
	function onSuccessEstado(data, textStatus){
		
		cleanUtil.limpaCidade();
		
		//recupera campo de cidade
		var cmpCidade = $("select#cidade");		
		//do objeto data, para cada objeto item encontrado executa a funcao
		$(data).find("item").each(
			function() {
				//recupera nome e valor e cria uma opcao no campo de cidade
				var nm = $(this).find("name").text();
				var vl = $(this).find("value").text();
				cmpCidade.addOption(vl, nm, false);								
			});
		//retira a opcao desabilitada para mostrar os valores
		cmpCidade.removeAttr("disabled");
		//remove a opcao de carregando, por favor aguarde
		cmpCidade.removeOption(".");
		//volta a selecao para a primeira opcao da combo de cidades
		$("select#cidade option:first").attr('selected', 'selected');		
	}	
	
	
	//funcao de sucesso no caso de selecao de cidade
	//funcao private
	function onSuccessCidade(jsUns, textStatus) {

		//adiciona para a variavel global o valor pesquisado, no caso de alterar a unimed
		jsonUnimeds = jsUns;
		
		alert(jsonUnimeds);
		
		//se nao necessita abrir o modal e se for uma unica unimed
		if (!obj.showModal() && jsonUnimeds.qtd == 1){
			alert("IF 1 ");
		    var uni = jsonUnimeds.lista[0].unimed;
		    // valida o botao para download do gm
		    onGuiaMedicoCanDown( uni );
		    //redirecionar a selecao de unimed
		    obj.selectUnimed(uni.cd, uni.nm, false);				
		}
		else {
			if( !isCliente ) {
				alert("ELSE IF 1 ");
				cleanUtil.limpaRecursos();
			}
			else {
				alert("ELSE 2");
				obj.popularRecursos();
			}
		}
	}
	
	function onGuiaMedicoCanDown( unimed ) {
		var url = getURLServletDownGuiaMedico();
		var canDown = unimed.canDown;
		var html = "";

		// Unimed possui o down do gm ativo
		if( canDown == 1 ) {		
			$("#guia-bnt-guiacompleto").show();
		} else {
			$("#guia-bnt-guiacompleto").hide();
		}
	}
	
	//funcao de sucesso no caso de selecao de unimed x recurso
	//funcao private
	function onSuccessRecurso(data, textStatus){
		
		cleanUtil.limpaRecursos();
		
		//recupera campo de recursos
		var cmpRecurso = $("select#recursos");		
		//do objeto data, para cada objeto tp_prest cria uma opcao no campo de recurso
		$(data).find("item").each(
			function() {
				//recupera nome e valor e cria uma opcao no campo de cidade
				var nm = $(this).find("name").text();
				var vl = $(this).find("value").text();
				
				cmpRecurso.addOption(vl, nm, false);								
			}		
		);
		//retira a opcao desabilitada para mostrar os valores
		cmpRecurso.removeAttr("disabled");
		//remove todas as opcoes para retirar a mensagem de aguarde
		cmpRecurso.removeOption(".");		
		//volta a selecao para a primeira opcao da combo de recursos
		$("select#recursos option:first").attr('selected', 'selected');
	}	

	//funcao private
	//funcao de sucesso no caso de selecao de recurso
	function onSuccessEspecialidade(data, textStatus){
		
		cleanUtil.limpaEspecialidade();
		
		//recupera campo de especialidade
		var cmpEspecialidade = $("select#especialidade");
		//retira a opcao desabilitada
		cmpEspecialidade.removeAttr("disabled");
		//remove todas as opcoes para retirar a mensagem de aguarde
		cmpEspecialidade.removeOption(/./);
	
		//do objeto data, para cada objeto item encontrado executa a funcao
		if ($(data).find("item").length > 0){
			var vlrInvalidos = "-";
			if ($("select#recursos").val() != 1){ vlrInvalidos = "0"; } // diferente TipoDePrestador - MEDICO
		
			cmpEspecialidade.addOption(vlrInvalidos, "Selecione");
			if (vlrInvalidos == "0"){ 
				cmpEspecialidade.addOption(vlrInvalidos, "Todos");
			}
			cmpEspecialidade.addOption(vlrInvalidos, "--------------------");
		
			$(data).find("item").each(
				function() {
				//recupera nome e valor e cria uma opcao no campo de cidade
				var nm = $(this).find("name").text();
				var vl = $(this).find("value").text();
				
				cmpEspecialidade.addOption(vl, nm, false);								
			});
			
			$("select#especialidade option:first").attr('selected', 'selected');		
			$("select#especialidade").focus();	
		}
		else{
			alert('Não existem especialidades para o recurso na cidade selecionada. ');
		}
	}
	
	this.selectUnimed = function(cd, nm, fg){
        cleanUtil.limpaRecursos();
        
        if( isSwapUnimed )  {
	        // aparecer div de espacamento
	        $('div.acima').show();
	        // preencher o campo hidden unimed com o cd da unimed
	        $('input#unimed').val(cd);
	        //preencher o h4 com a cidade estado selecionada
	        var nmUf = $("select#estado").selectedOptions().get(0).value;
	        var nmCid = $("select#cidade").selectedOptions().get(0).text;
	        $('#cidUfSelected').text(nmCid+' / '+nmUf);
	        var sCidUf = $.create('span', {
				id: "spanCidUfSelected"
			  }, [
	          $.create('a', { 
	              	href: "javascript: alteraCidade();"
	              	}
	           , ["Alterar"])]);
	        $(sCidUf).append(" )").prepend("( ").insertAfter($('#cidUfSelected'));
	        // preencher o h5 com o nome da unimed
	        $('#uniSelected').text(nm);
	        
	        if( $("input#nm_unimed") ) {
	        	$("input#nm_unimed").val(nm);
	        }
	        
	        // mostrar o h1 que estava hidden
	        $('#filtro-estadocidade').hide();
	        $('#cidUfSelected').show();
	        $('#uniSelected').show();
	        	        
	        //se for flag, ou seja, selecionado atraves do modal
	        if (fg){
	            //criar span e link com ( Alterar a Unimed ) para abrir novamente o modal
	            var sp = $.create('span', {
	            					id: "spanMultiUnimed"
	                			  }, [
	                              $.create('a', { 
	                                  	href: "javascript: showModal();"
	                                  	}
	                               , ["Alterar"])]);
	            $(sp).append(" )").prepend("( ").insertAfter($('#uniSelected'));
	        }
	        //fechar o modal
	        modUtil.closeModal();
        }
        
        obj.popularRecursos();
    };
	
	this.popularRecursos = function(){

		//consultar tipo de recursos
		var url = getURLServletGuiaMedico();
	
		var selCid= $("select#cidade").selectedOptions().get(0).value;
		var cdRede = getRedeCodigo( $("input#cod_rede").val() );
		
		var acao = "getRecursosPorEstado";
		if( !isCliente ) {
			acao = "getRecursos";
		}
		
		if ( !uUtil.contemVlrArray($("select#cidade").val(),  new Array(null, "0", "Sua cidade", "--------------------"))){
			$.ajax({
				type : "POST",
				url : url,
				data : { cd_munic : selCid, cd_rede: cdRede, action: acao},
				contentType: "application/x-www-form-urlencoded;charset=UTF-8",
				dataType : "xml",
				beforeSend: function(){
					//adicionando opcao de aguarde
					$("select#recursos").addOption(".", "Carregando, por favor aguarde ... ");				
				},
			    error : ajaxUtil.onError,
			    success : onSuccessRecurso
			});		
		}
	};
}

/**
 * Pacote de utilitarios
 * 
 * Matheus Trevizan - matheus@dynamix.com.br
 * 
 */
function filtroGuiaMedicoUtils(){
	
	var obj = this;

    // metodo para efetuar a url da unimed, no modal
    // caso tenha guia medico, aparecer a funcao de selecionar unimed
	this.unimedHaveURL = function(uni){
    	if (eval(uni.tpguia) == 1){
        	return "javascript:selectUnimed("+uni.cd+", '"+uni.nm+"', true);";
    	}
    	// caso nao tenha guia medico, retornar o site especifico.
        return uni.site;
    }	
	
	this.contemVlrArray = function(vlr, vlrsNot){
		for(var x=0; x < vlrsNot.length; x++){
			if (vlr == vlrsNot[x]){
				return true;
			}
		}
		return false;
	}
	
	function replaceAll(string, token, newtoken) {
		while (string.indexOf(token) != -1) {
	 		string = string.replace(token, newtoken);
		}
		return string;
	}
	
	this.groupUnimed = function(jsU){
	
		if( $('#divMultiUnimed ol').length > 0 ){ 
			$('#divMultiUnimed ol').find('li').each(
				function() { $(this).remove();
			});
		}
		
		if( $("#divMultiUnimed p").length > 0 ){ 
			$("#divMultiUnimed p").each(
				function() { $(this).remove();
			});
		}

		arrEachUnimed = new Array();
		$.each(jsU.lista, function(i, n){
			eachUnimed(i, n, jsU.qtd);
		});
	}	
	
	var arrEachUnimed = null;
	
	// Funcao private
    // metodo executado a cada unimed para aparecer os textos no modal
	function eachUnimed(i, n, qtd){
				
		//recupera objeto unimed
		var uni = n.unimed;
		//recupera o nome da unimed, para aparecer no titulo
		var contTitulo = uni.nm;
		//verificar url
		var hrefUni = obj.unimedHaveURL(uni);
		
		if (qtd > 1){
			//armazenar uma lista de unimeds para mostrar quais as unimeds que tem regiao
			arrEachUnimed[arrEachUnimed.length] = n.unimed.nm;
			//concatenar as unimeds que atendem a regiao
			if ((i+1) == qtd){
				var pp = $.create('p', { style: "padding-bottom: 20px" }, ["As Unimeds "]);
				for(var x = 0; x < qtd; x++){
					if (x > 0){
						var sep = ", ";
						if ((x+1) == qtd){
							sep = " e "
						}
						$(pp).append(sep);
					}
					var u = $.create('strong', {}, [arrEachUnimed[x]]);
					$(pp).append(u);
				}
				$(pp).append(" atendem a sua região.").insertAfter($("#divMultiUnimed h4"));
			}
			//caso exista url
			if (hrefUni != ''){
				//alterar o titulo para um link com o nome da unimed
				var settings = {href: hrefUni};
				if (uni.tpguia == 0){
					settings = {href: hrefUni, target : "_blank"}
				}
				contTitulo = $.create('a', settings, [contTitulo]);
			}
			var eachLi = $.create('li', {}, [contTitulo]);
			if (uni.tpguia == 0){
				$(eachLi).prepend("A ").append(" não possui o guia médico publicado no Portal Unimed.");
			}
			if (uni.inst != null && uni.inst != ''){
				var instr = $.create('p', {}, [$.create('strong', {}, ["Instruções de acesso ao Guia Médico: "])]);
				$(instr).append(uni.inst);
				$(eachLi).append(instr);
			}
			$('#divMultiUnimed ol').append(eachLi);			
		}else{
			var u = $.create('strong', {}, [contTitulo]);
			var pp = $.create('p', {}, ["A Unimed que atende a sua região é a "]);
			$(u).appendTo(pp);
			$(pp).append(" porém, ela ainda não possui o guia médico cadastrado no Portal Unimed. Para obter informações sobre ");
			if (hrefUni != ''){
				var settings = {href: hrefUni};
				if (uni.tpguia == 0){
					settings = {href: hrefUni, target : "_blank"}
				}				
				$(pp).append("a rede credenciada desta Unimed ");
				var h = $.create('a', settings, ["clique aqui"]);
				$(h).appendTo($(pp)).append(".");
			}else{
				$(pp).append("sua rede credenciada fale com a sua Unimed.");
			}
			$(pp).insertAfter($("#divMultiUnimed h4"));
		}
	}		
	
}

/**
 * Pacote cleaner, limpando e removendo opções.
 * 
 * Matheus Trevizan - matheus@dynamix.com.br
 */

function filtroGuiaMedicoCleanUtils(){
	
	var obj = this;
	var isSwapUnimed = true;
	
	// informa se o componente deve ocultar a combo de estado/cidade
	// e mostrar o nome da unimed
	this.setSwapUnimed = function(valor){
		isSwapUnimed = valor;
	}

	this.limpaCidade = function(){
		//desabilita as opcoes de cidades
		$("select#cidade").attr("disabled", "true");
		$("select#cidade").removeOption(/./);
		obj.limpaRecursos();		
	}
	
	this.limpaRecursos = function (){
        //remover span de alterar unimed
        $('#spanMultiUnimed').remove();
        //remove span de alterar cidade
        $('#spanCidUfSelected').remove();
        		
		if( isSwapUnimed )  {
			//retira valores do campo hidden de unimed
			$('input#unimed').val('');		
		}
		else {
	        // desaparecer div
	        $('div.acima').hide();
	        $('#cidUfSelected').hide();
			$('#uniSelected').hide();				
		}
		
		//desabilita as opcoes de recursos
		$("select#recursos").attr("disabled", "true");
		$("select#recursos").removeOption(/./);
		obj.limpaEspecialidade();
	}
	
	this.limpaEspecialidade = function(){
		//desabilita as opcoes de especialidade
		$("select#especialidade").attr("disabled", "true");
		$("select#especialidade").removeOption(/./);			
	}
	
}

/**
 * Pacote AJAX.
 * 
 * Matheus Trevizan - matheus@dynamix.com.br
 */

function filtroGuiaMedicoAJAXUtils(){
	
	this.onError = function(XMLHttpRequest,textStatus, errorThrown){
		if( XMLHttpRequest.status > 0 ) {
			alert('Ocorreu um problema no processamento.'); 
		}
	}	
	
}

/**
 * Pacote Modal
 * 
 * Matheus Trevizan - matheus@dynamix.com.br
 */
function filtroGuiaMedicoModalUtils(){
	
	//funcao para fechar o modal
	this.closeModal = function(){
		$.modal.close();
	}
	
	this.openModal = function(id, onShowEvent){
	    $(id).modal({
		    close: false, //sem botao especifico de close, o botao esta manual
		    position: [100,],
			overlayId: 'dialogModal-overlay', //id de overlay
			containerId: 'dialogModal-container', //id de container
			onShow: onShowEvent
	    });		
	}	
	
}
