	var listaRequisicao = [];
	function cancelar_todas_requisicoes_analises()
	{
		for(i =0; i < listaRequisicao.length; i++)
		{
			listaRequisicao[i].abort();
		}
	}
	
	
	colunasTemp = [];
	arrayAnalinalisesFiltro = [];
	function consultar_todas_analises()
	{
		//ordener primeiro widget depois graficos ultimo tabelas
		for(i = 0; i < arrayAnalinalisesFiltro.length; i++)
		{
			for(j = 1; j < arrayAnalinalisesFiltro.length; j++)
			{
				if((arrayAnalinalisesFiltro[j-1].tipo_charts == null || arrayAnalinalisesFiltro[j-1].tipo_charts == "")
					&& arrayAnalinalisesFiltro[j].tipo_charts =="widget")
				{
					auxi = arrayAnalinalisesFiltro[j];
					arrayAnalinalisesFiltro[j] = arrayAnalinalisesFiltro[j-1];
					arrayAnalinalisesFiltro[j-1] = auxi;
				}
				else if((arrayAnalinalisesFiltro[j-1].tipo_charts == null || arrayAnalinalisesFiltro[j-1].tipo_charts == "")
					&& arrayAnalinalisesFiltro[j].tipo_charts !="" && arrayAnalinalisesFiltro[j].tipo_charts != null)
				{
					auxi = arrayAnalinalisesFiltro[j];
					arrayAnalinalisesFiltro[j] = arrayAnalinalisesFiltro[j-1];
					arrayAnalinalisesFiltro[j-1] = auxi;
				}
				
			}
		}
		
		setTimeout(function(){
			//alert(arrayAnalinalisesFiltro.length)
			for(iFilt = 0; iFilt < arrayAnalinalisesFiltro.length; iFilt++)
			{
				analiseFiltro = arrayAnalinalisesFiltro[iFilt];
				//alert(analiseFiltro.seletor);
				montaTebelaBi(analiseFiltro.nomeForm, analiseFiltro.seletor);
				//sleep(100);	
			}
		}, 100);
	}
	/*function sleep(delay) {
		var start = new Date().getTime();
		while (new Date().getTime() < start + delay);
	}*/
	function montaFiltro(filtro, cod_analise, nomeForm, seletor)
	{	
		//alert(cod_analise);
		possuiFiltroObrigatorio = false;
		html = "";
		
		//$.post("src/controller/Bi_analiseControllerUser.php?mod=monta_filtro&analise="+cod_analise,{}, function (retorno)
		$.ajax({
		  type: 'POST',
		  url: dominio+"src/controller/Bi_analiseControllerUser.php?mod=monta_filtro&analise="+cod_analise,
		  async: false,
		  success: function(result) 
		  {
			retorno = $.parseJSON(result); 
			//
			if(retorno.config.tipo_charts == "widget")
			{
				//alert("aaa");
				cor_widget = "#8c8c8c !important";
				icone_widget = "fa-solid fa-spinner";
				html = "<div class='widgetcard' >";
				html += "<div style='height: 100%; width: 5px; position: absolute; left: 0px; top: 0px; background: "+cor_widget+"; opacity: 0.6;'></div>";
				html += "<b style='color: #394d60; opacity: 0.8; margin-left: 5px;' class='status_filtro_bi'></b><br>";
				html += "<b style='color: "+cor_widget+"; opacity: 0.9; margin-left: 5px;'> - </b>";
				html += "<i style='position: absolute; right: 15px; top: 20px; font-size: 30px; color: "+cor_widget+"; opacity: 0.6;' class='"+icone_widget+"'></i></div>";
				$("#"+seletor).html(html);
				html = "";
			}
			else
			{
				html += "<b style='color: #394d60; opacity: 0.8; margin-left: 5px;' class='status_filtro_bi'></b><br>";
				$("#"+seletor).html(html);
				html = "";
			}
			existe_multiplo_escolha = false;
			//
			//html += '<div class="modal_filtro_analise" id="modal'+nomeForm+'" style="display: none; padding: 10px; width: 100%;  height: 100%;  background: rgba(0,0,0, 0.8); position: fixed; margin: 0; left: 0;  z-index: 10;  top: 0px;">'
			//modal
			html += '<button type="button" style="display: none;" id="btn_abrir_modal_filtro'+cod_analise+'" class="btn btn-primary" data-toggle="modal" data-target="#modal_filtro'+cod_analise+'" data-backdrop="static" data-keyboard="false"></button>';
			html += '<div class="modal fade" id="modal_filtro'+cod_analise+'" data-focus="false" data-bs-focus="false"  role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">'
			html += '<div class="modal-dialog" role="document">';
			html += '<div class="modal-content"><div class="modal-header" style="display: none;" ></div>';
			html += '<div class="modal-body" id="conteudo_avisos">';
			html += '<b style="float: left; margin-top: -10px; color: #bfbfbf;">Filtros</b>';
			html += '<a style="float: right; margin-top: -14px; margin-right: -12px;" href="javaScript:void(0)" onclick="$(\'#btn_abrir_modal_filtro'+cod_analise+'\').click();"><i class="fa-solid fa-circle-xmark"></i></a>';
			html += '<br>';
			//fim modal
			html += '<form " style="background: white;  padding: 10px; " action=\'src/controller/Bi_analiseControllerUser.php?mod=executar&analise='+cod_analise+'&seletor='+seletor+'\' id="'+nomeForm+'" seletor="'+seletor+'" class="form_filtro">';;

			for(i = 0; i < retorno.input_form.length; i++)
			{
				
				input = retorno.input_form[i];
				tipoInput = "text";
				atributos = "";
				clasInpu = "form ";
				labelObrigatorio = "";
				if(input.tipo == "data")
				{
					atributos += "data-mask='00/00/0000' placeholder='00/00/0000' ";
					clasInpu = "form mask";
				}
				else if(input.tipo == "data hora minuto")
				{
					atributos += "data-mask='00/00/0000 00:00' placeholder='00/00/0000 00:00' ";
					clasInpu = "form mask";
				}
				else if(input.tipo == "número inteiro")
				{
					tipoInput = "number";
					atributos += "data-mask='0000000000000000000' placeholder='000' ";
					clasInpu = "form mask";
				}
				else if(input.tipo == "número decimal")
				{
					atributos += "data-mask='000.000.000.000.000,00' placeholder='000,00' data-mask-reverse='true' ";
					clasInpu = "form mask";
				}
				
				if(input.obrigatorio)
				{
					atributos += "required ";
					labelObrigatorio = '<span class="form_obrigatorio">*</span>';
					if(input.valor1 =="")
					{
						possuiFiltroObrigatorio = true;
					}
				}
				html += "<div class='filtroForm' style='margin: 5px;' id='filtroSeletor"+retorno.config.codigo+""+i+"'>";
					html += "<label>"+labelObrigatorio+input.label+"</label> <br>";
					if(input.tipo == "data" || input.tipo == "data hora minuto" || input.tipo == "número inteiro" || input.tipo == "número decimal" || input.tipo == "texto")
					{
						html += "<input id='"+input.id+"' name='"+input.id+"' tipo='"+input.tipo+"' "+atributos+" class='"+clasInpu+" inputFiltroBi inputAnalise"+retorno.config.codigo+input.id+"' />"	
					}
					else if(input.tipo == "múltipla escolha")
					{
						existe_multiplo_escolha = true;
						html += "<div class='divMultiPlaEscolha' style='width: 300px;'>"
						html += '<select name="'+input.id+'[]"  id="search'+input.id+'" multiple="multiple" tipo="'+input.tipo+'" class="inputFiltroBi inputAnalise'+retorno.config.codigo+"search"+input.id+'">';
						//html += '<option value=""></option>';
						for(iMult =0; iMult < input.dadosEscolher.length; iMult ++)
						{
							html += '<option value="'+input.dadosEscolher[iMult]+'">'+input.dadosEscolher[iMult]+'</option>';
						}
						html += "</select>"
						html += "</div>";
						
					}
					else if(input.tipo == "Data calculada")
					{
						html += '<input id="'+input.id+'" name="'+input.id+'" tipo="'+input.tipo+'" value="'+input.valor1+'" data-mask="00/00/0000" placeholder="00/00/0000" class="form mask inputFiltroBi inputAnalise'+retorno.config.codigo+input.id+'" >';
						
					}
					
				html += "</div>";
				
			}
			html += "<br><br><button type=\"button\" class=\"btnSuccess btnSn btnFiltroForm\"   onclick=\" if(montaTebelaBi('"+nomeForm+"','"+seletor+"')) { $('#btn_abrir_modal_filtro"+cod_analise+"').click(); }\">Filtrar </button>";
			if ($('#usuario_admin').length > 0) {
				html += "<a href='javaScript: void(0);' type=\"button\" class=\"\" style='float: right;'   onclick=\" salvarFiltro('"+nomeForm+"','"+seletor+"', '"+cod_analise+"')\">Salvar filtro </a>";
			}
			html += '<div class="filtro_custom" style="visibility: hidden; height: 0;"></div>';
			html += '</form>';
			//modal
			html += '</div></div></div></div>';
			//fim modal
			//html += '</div>'
			styleFiltro = "";
			if(retorno.config.tipo_charts == "widget")
			{
				styleFiltro = "display: none;";
			}
			html += '<div style="position: absolute; left: calc(100% - 29px);  top: 0px; z-index: 999; '+styleFiltro+'">';
			html += '	<div class="dropdown" id="filtros_dropdown">';
			html += '	<button class="btn btn-secondary dropdown-toggle dropdown-toggle-filtro" style="background: white; " type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">';
			html += '		<i class="fa-solid fa-ellipsis-vertical"></i>';
			html += '	</button>';
			html += '	<div class="dropdown-menu dropdown-filtro" aria-labelledby="dropdownMenuButton" style="width: auto; min-width: 130px; padding: 10px;  margin-left: -105px;"">';
			//$(\'#modal'+nomeForm+'\').css(\'display\', \'block\') // modal_filtro_analise($(\'#modal'+nomeForm+'\')
			html += '		<a class="dropdown-item dropdown_filtro" href="javaScript:void(0);" style="z-index: 5;" onclick="modal_filtro_analise(\''+cod_analise+'\')"><i class="fa-solid fa-filter"></i> Filtros </a><br>';
			if(retorno.config.tipo_charts == "" || retorno.config.tipo_charts == null)
			{
				/*if($("#analise_view_tab").length > 0)//apenas em análises relatórios
				{
					html += '		<a class="dropdown-item " style=" position: relative; display: table;  float: right; margin-top: -19px; ">  ';
					html += '			<b style="font-size: 10px; color: rgb(99, 113, 140);" class="grupExport">Opções</b><br>';
					html += '			<button  href="javaScript:void(0);" class="dropdown_filtro" style="z-index: 5; background: none; border: none;  padding: 0; text-align: left;" onclick="copiaAnalise(\''+retorno.config.codigo+'\')"><i class="fa-solid fa-copy"></i> Copiar</button>';
					html += '		</a>	';
				}*/
				
				//html += '		<a class="dropdown-item dropdown_filtro" href="javaScript:void(0);" style="z-index: 5;" onclick="pivotTabela(\''+seletor+'\', \'analise'+retorno.config.codigo+'\');"><i class="fa-solid fa-border-top-left"></i> Pivot</a><br>';
				html += '		<a class="dropdown-item dropdown_filtro" href="javaScript:void(0);" style="z-index: 5;" onclick="ajustarCorAnalise(\''+seletor+'\', \'analise'+retorno.config.codigo+'\', \''+retorno.config.codigo+'\', \''+nomeForm+'\');"><i class="fa-solid fa-palette"></i> Cores</a><br>';
				html += '		<a class="dropdown-item dropdown_filtro" href="javaScript:void(0);" style="z-index: 5;" onclick="ajustarColunasAnalise(\''+seletor+'\', \'analise'+retorno.config.codigo+'\', \''+retorno.config.codigo+'\', \''+nomeForm+'\',\'colunas\');"><i class="fa-solid fa-table-columns"></i> Colunas</a><br>';
				html += '		<a class="dropdown-item dropdown_filtro" href="javaScript:void(0);" style="z-index: 5;" onclick="ajustarColunasAnalise(\''+seletor+'\', \'analise'+retorno.config.codigo+'\', \''+retorno.config.codigo+'\', \''+nomeForm+'\', \'agregacao\');"><i class="fa-solid fa-database"></i> Agregação</a><br>';
				html += '		<a class="dropdown-item dropdown_filtro salvar_analise" href="javaScript:void(0);" style="z-index: 5; display: none;" onclick="salvarAlteraoesAnalise(\''+seletor+'\', \'analise'+retorno.config.codigo+'\', \''+retorno.config.codigo+'\', \''+nomeForm+'\');"><i class="fa-solid fa-floppy-disk"></i> Salvar alterações</a><br>';
				html += '		<a class="dropdown-item " style=" position: relative; display: table;  float: right; margin-top: -19px; ">  ';
				html += '			<b style="font-size: 10px; color: rgb(99, 113, 140);" class="grupExport">Exportar</b><br>';
				html += '			<button  href="javaScript:void(0);" class="dropdown_filtro" style="z-index: 5; background: none; border: none; width: 50px; padding: 0; text-align: left;" onclick="download_table_as_csv(\'analise'+retorno.config.codigo+'\')"><i class="fa-solid fa-file-csv"></i> CSV</button>';
				html += '			<button  href="javaScript:void(0);" class="dropdown_filtro" style="z-index: 5; background: none; border: none; width: 40px; padding: 0; text-align: left;" onclick="download_table_as_csv(\'analise'+retorno.config.codigo+'\')"><i class="fa-solid fa-file-excel"></i> XLS</button>';
				//html += '			<button  href="javaScript:void(0);" class="dropdown_filtro" style="z-index: 5; background: none; border: none; width: 50px; padding: 0; text-align: left;" onclick="imprimirPagina()"><i class="fa-solid fa-print"></i> IMP</button>';
				html += '		</a>	';
			}
			else
			{
				html += '		<a  href="javaScript:void(0);" class="dropdown_filtro" onclick="imprimirPagina()"><i class="fa-solid fa-print"></i> Imp</a>';
			}
			html += '	</div>';
			html += '	</div>';
			html += '</div>';
			//alert(window.location.href)
			if($("#analise_view_tab").length > 0)
			{
				//tratamento para relatório em analise view fora das páginas
				html+= '<div style="width: 100%; border-bottom: solid 1px #e2eaf3; display:block;text-overflow: ellipsis; overflow: hidden; white-space: nowrap; text-align: left; margin-top: -20px;"><b style="color: #394d60; text-align: left; ">'+retorno.config.nome+'</b></div><br>';
			}
			/*
			html += '	<a href="javaScript:void(0);" style="z-index: 5;" onclick="$(\'#modal'+nomeForm+'\').css(\'display\', \'block\')"> <img src="images/filtroIcon.png" style="height: 40px; opacity: 0.5;"/> </a>';
			html += '	<a href="javaScript:void(0);" style="z-index: 5;" onclick="pivotTabela(\''+seletor+'\', \'analise'+retorno.config.codigo+'\');"><img src="images/PivotIcon.png" style="height: 40px; opacity: 0.5;"/></a>';
		
			html += ' -- <a href="javaScript:void(0);" style="z-index: 5;" onclick="trocaTipoAnalise(\'analise'+retorno.config.codigo+'\', \'table\', \'tipoDash\');"><img src="images/gridIcon.png" style="height: 40px; opacity: 0.5;"/></a>';
			html += '<a href="javaScript:void(0);" style="z-index: 5;" onclick="trocaTipoAnalise(\'analise'+retorno.config.codigo+'\', \'chart\', \'line\');"><img src="images/graficoLinhaIcon.png" style="height: 40px; opacity: 0.5;"/></a>';
			html += '<a href="javaScript:void(0);" style="z-index: 5;" onclick="trocaTipoAnalise(\'analise'+retorno.config.codigo+'\', \'chart\', \'column\');"><img src="images/graficoColunaIcon.png" style="height: 40px; opacity: 0.5;"/></a>';
			html += '<a href="javaScript:void(0);" style="z-index: 5;" onclick="trocaTipoAnalise(\'analise'+retorno.config.codigo+'\', \'chart\', \'bar\');"><img src="images/graficoBarraIcon.png" style="height: 40px; opacity: 0.5;"/></a>';
			html += '<a href="javaScript:void(0);" style="z-index: 5;" onclick="trocaTipoAnalise(\'analise'+retorno.config.codigo+'\', \'chart\', \'pie\');"><img src="images/graficoPizzaIcon.png" style="height: 40px; opacity: 0.5;"/></a>';
			*/
			$("#"+filtro).html(html);
			if($("#analise_view_tab").length > 0)
			{
				//tratamento para relatório em analise view fora das páginas
				$('.dropdown-filtro').css("display", "none");
				$('.dropdown-toggle-filtro').css("display", "none");
				$('.dropdown_filtro').css({"margin-right": "5px", "font-size": "15px", "color": "#63718c"});
				$('.dropdown_filtro *').css({"font-size": "15px", "color": "#63718c"});
				
				$('.dropdown-item').each(function() {
					$("#"+filtro).append($(this));
				});
				
			}
			for(iFilt =0; iFilt < retorno.config.filtrosSalvos.length;  iFilt++)
			{
				inputSalvo = retorno.config.filtrosSalvos[iFilt];
				//alert(inputSalvo.tipo);
				inputSalvo.valor +="";
				if(inputSalvo != null && inputSalvo.valor != "" && inputSalvo.id != null )
				{
					if(inputSalvo.valor == null || inputSalvo.valor == "null")
					{
						inputSalvo.valor = "";
					}
					if(inputSalvo.tipo == "múltipla escolha")
					{
						$(".inputAnalise"+retorno.config.codigo+"search"+inputSalvo.id.replace("[","").replace("]","")).val(inputSalvo.valor.split(","));
					}
					else
					{
						$(".inputAnalise"+retorno.config.codigo+""+inputSalvo.id.replace("[","").replace("]","")).val(inputSalvo.valor);
					}
				}
			}
			
			//importar script 
			$.getScript("js/formulario.js", function() {
			  // alert("Script loaded but not necessarily executed.");
			});
			
			if(! possuiFiltroObrigatorio)
			{
				//montaTebelaBi(nomeForm,seletor);
				jaIncluiu = false;
				for(iFilt = 0; iFilt < arrayAnalinalisesFiltro.length; iFilt++)
				{
					if(arrayAnalinalisesFiltro[iFilt].nomeForm == nomeForm)
					{
						jaIncluiu = true;
					}
				}
				//alert(retorno.config.nome);
				//jaIncluiu = false;
				if(! jaIncluiu)
				{
					arrayAnalinalisesFiltro.push({nomeForm: nomeForm, seletor: seletor, tipo_charts: retorno.config.tipo_charts});
				}
			}
			if(existe_multiplo_escolha)
			{
				setTimeout(function(){
					$("select").select2({ width: '100%' });	
					$(document).ready(function(){
						$('.select2').parent().css("width", "100%");
						$('.divMultiPlaEscolha').parent().css("width", "100%");
						$('.divMultiPlaEscolha').css("width", $('.divMultiPlaEscolha').parent().css("width"));
					});
				},200);
			}
			
			//alert(retorno.config.nome);
		}}
		);
	}
	//monta tabela
	listaTabs = [];
	somadorParcial = [];
	contadorParcial = [];
	somadorParcialMedia = [];
	contadorParcialMedia = [];
	somadorTotal  = [];
	contadorTotal  = [];
	function montaTebelaBi(formulario, seletor)
	{	
			
		$("#"+seletor).html("<b style='color: #394d60; opacity: 0.8; margin-left: 5px;' class='status_filtro_bi'>Carregando...</b>");
		
		//alert(seletor);
		bloqueio_form = false;
		$("#"+formulario + ' input[required]').each(function() {
			
			if ($(this).val() == ""  )
			{
				bloqueio_form = true;
				$(this).css("border-color","red");
			}	
			else
			{
				$(this).css("border-color","#6b8dae");
			}	
		});
		
		$("#"+formulario+' select[required]').each(function() {
			
			if ($(this).val() == ""  )
			{
				bloqueio_form = true;
				$(this).css("border-color","red");
				
				if($(this).attr("name"))
				{
					//alert($(this).attr("name"))
					//select2
					name_select = $(this).attr("name");
					$("#"+formulario+' span').each(function() {
						if($(this).attr("aria-labelledby"))
						{
							if($(this).attr("aria-labelledby").split("-")[1] == name_select) 
							{
								//alert(name_select+ " - "+$(this).attr("aria-labelledby").split("-")[1])
								$(this).css("border-color","red");
							}
						}
					});
				}
			}	
			else
			{
				$(this).css("border-color","#6b8dae");
				
				if($(this).attr("name"))
				{
					//alert($(this).attr("name"))
					//select2
					name_select = $(this).attr("name");
					$("#"+formulario+' span').each(function() {
						if($(this).attr("aria-labelledby"))
						{
							if($(this).attr("aria-labelledby").split("-")[1] == name_select) 
							{
								$(this).css("border-color","#6b8dae");
							}
						}
					});
				}
			}
			
		});
		
		if (! bloqueio_form)
		{	
			
			$('#modal'+formulario+'').css('display', 'none');
			//$('.btnSalvar').remove();
			//dadosJson = $("#"+formulario).serialize();
			strJson = "{";
			$('.inputFiltroBi').each(function() {
				valorInput = $(this).val();
				name = $(this).attr("name");
				
				if($(this).attr("tipo") == "data" || $(this).attr("tipo") == "data hora minuto" || $(this).attr("tipo") == "Data calculada")
				{
					
					aDataHora = valorInput.split(" ");
					data = aDataHora[0];
					aData = data.split("/");
					valorInput = aData[2]+"-"+aData[1]+"-"+aData[0];
					if(aDataHora.length > 1)
					{
						valorInput += " "+aDataHora[1];
					}
					
				}
				else if($(this).attr("tipo") == "número decimal")
				{
					valorInput = valorInput.replaceAll(".","");
					valorInput = valorInput.replaceAll(",",".");
				}
				if(valorInput == null || valorInput === undefined || valorInput == "undefined-undefined-")
				{
					valorInput = "";
				}
				
				if(valorInput != "")
				{
					if(strJson != "{")
					{
						strJson += ",";	
					}
					strJson += '"'+name+'": "'+valorInput+'"';
				}
				/*alert(name)
				if(name.includes("["))
				{
					
					if(valorInput.length >0)
					{
						if(strJson != "{")
						{
							strJson += ",";	
						}
						strJson += '"'+name+'": "'+valorInput+'"';
					}
				}*/
			});	
			strJson += "}";
			//strJson = strJson.replaceAll("[]", "");
			
			if(strJson == "{}")
			{
				strJson = '{"sem_filtro": ""}';
			}
			console.log(strJson);
			dadosJson = JSON.parse(strJson);
			//dadosJson = $("#"+formulario).serialize();
			
			requisicaoAtual = $.ajax({
				type: 'post',
				url: dominio+$("#"+formulario).attr("action"),
				data: dadosJson,
				async: true,
				success: function(data) {
					//console.log(data);	
					retorno = JSON.parse(data);
					//listaTabs = [];
					if (retorno.hasOwnProperty("erro")) {
						alert(retorno.mensagem);
					}
					else
					{
						tipo = "table";
						tipoDash = "";
						if(retorno.config.usar_charts)
						{
							tipo = "chart";
							tipoDash = retorno.config.tipo_charts;
						}
						montaTabDash(retorno, tipo, seletor, tipoDash);
						listaTabs.push({"codigo": "analise"+retorno.config.codigo, "tipo": tipo, "seletor": seletor, "pivot": false, "dados": retorno})
						return;
					}
				
				}
			  });
			 listaRequisicao.push(requisicaoAtual);
			/*for(i =0; i < listaRequisicao.length; i++)
			{
				listaRequisicao[i].abort();
			}*/
		   /*
			$.post($("#"+formulario).attr("action"),dadosJson, function (retorno)
			{
				
				//////////////////////////////
				///normal/////
				tipo = "table";
				tipoDash = "";
				if(retorno.config.usar_charts)
				{
					tipo = "chart";
					tipoDash = retorno.config.tipo_charts;
				}
				montaTabDash(retorno, tipo, seletor, tipoDash);
				listaTabs.push({"codigo": "analise"+retorno.config.codigo, "tipo": tipo, "seletor": seletor, "pivot": false, "dados": retorno})
				
			},'json'
			);*/
		}
		else
		{
			alert("Verifique campos obrigatórios!");
		}	
		somadorParcial = [];
		contadorParcial = [];
		somadorParcialMedia = [];
		contadorParcialMedia = [];
		somadorTotal = [];
		contadorTotal = [];
		return ! bloqueio_form;
	}
	erro = null
	function montaTabDash(retorno, tipo, seletor, tipoDash)
	{
		$("#"+seletor).html("<b style='color: #394d60; opacity: 0.8; margin-left: 5px;' class='status_filtro_bi'></b><br>");
		$("#"+seletor+" .status_filtro_bi").html("Carregando...");
		if($("#analise_view_tab").length == 0) // essa tag só tem em analise view fora das paginas
		{
			if(tipo == "table")
			{
				$("#"+seletor).css({"top": "-13px", "position": "relative"});
			}
			if(tipo == "chart")
			{
				$("#"+seletor).css({"height": "calc(100% - 35px)", "position": "relative"});
			}
		}
		/*var somadorParcial = [];
		var contadorParcial = [];	
		var somadorTotal  = [];
		var contadorTotal  = [];*/
		//tipo table ou dashboard ou chart
		 
		html = "";
		if(! retorno.config.usar_charts)
		{
			//html += '<a href="javaScript:void(0);" onclick="pivotTabela(\''+seletor+'\', \'analise'+retorno.config.codigo+'\');">Pivot</a>'
		}
		indicesColunasToralizarParcial = [];
		indicesColunasToralizar = [];
		indicesColunasMediaParcial = [];
		indicesColunasMedia = [];
		ultimoValorParaQubraParcial = [];
		indiceColunaAnaliseVertical = null;//continuar fazer igual o faturamento diário
		agrupadorColunasAnaliseVertical = [];
		indiceIniciaColunasValores = 3; //depois cadastrar colunas valores
		
		indicesValSomaParcial = [];
		indicesMediaParcial = [];
		
		nomesColunasQuebraTotalParcial = [];
		indicesColunasQuebraTotalParcial = [];
		nomesColunasQuebraMediaParcial = [];
		indicesColunasQuebraMediaParcial = [];
		nomesColunasQuebraTotal = [];
		indicesColunasQuebraTotal = [];
		nomesColunasQuebraMedia= [];
		indicesColunasQuebraMedia = [];
		
		
		//style='width: "+(retorno.colunas.length*100)+"px;'
		//(retorno.colunas.length*77)
		html += "<table class='tableAnalise' id='analise"+retorno.config.codigo+"' style='min-width: 100%;' >";
		
		//ajustar colunas para análise vertical
		//agrupa colunas até antes do valor
		//percorre novamente e soma valores
		indiceColunaInicaValores = 3;
		for(i =0; i < retorno.colunas.length; i++)
		{
			coluna = retorno.colunas[i];
			if(coluna.nome == retorno.config.coluna_analise_vertical)
			{
				indiceColunaAnaliseVertical = i;
			}
		}
		for(i =0; i < retorno.dados.length; i++)
		{
			valores = retorno.dados[i];
			
		}
		//////////////////NAO FEITO A VERTICAL POR AQUI, FEITO VIA BANCO
		//indiceColunaAnaliseVertical = null;
		
		//colunas com quebra parcial e indice analise vertical
		for(i =0; i < retorno.colunas.length; i++)
		{
			coluna = retorno.colunas[i];
			somadorParcial.push([]); //inicia com 0 pega e valor pelo indice
			contadorParcial.push([]); //inicia com 0 e valor pelo indice 
			somadorParcialMedia.push([]); //inicia com 0 pega e valor pelo indice
			contadorParcialMedia.push([]); //inicia com 0 e valor pelo indice 
			if(coluna.totaliza_parcial)
			{
				//alert(coluna.nome)
				nomesColunasQuebraTotalParcial.push(coluna.nome);
				indicesColunasQuebraTotalParcial.push(i);
			}
			if(coluna.media_parcial)
			{
				nomesColunasQuebraMediaParcial.push(coluna.nome);
				indicesColunasQuebraMediaParcial.push(i);
			}
			if(coluna.totaliza)
			{
				nomesColunasQuebraTotal.push(coluna.nome);
				indicesColunasQuebraTotal.push(i);
			}
			if(coluna.media)
			{
				nomesColunasQuebraMedia.push(coluna.nome);
				indicesColunasQuebraMedia.push(i);
			}
			/*nomesColunasQuebraTotalParcial = [];
			for(j =0; j < coluna.campos_quebrar_total_parcial.length; j++)
			{
				ja_incluiu = false;
				for(k =0; k < nomesColunasQuebraTotalParcial.length; k++)
				{
					if(coluna.campos_quebrar_total_parcial[j] == nomesColunasQuebraTotalParcial[k])
					{
						ja_incluiu = true;
					}
				}
				if(! ja_incluiu)
				{
					nomesColunasQuebraTotalParcial.push(coluna.campos_quebrar_total_parcial[j]);
				}
			}
			for(j =0; j < coluna.campos_quebrar_media_parcial.length; j++)
			{
				ja_incluiu = false;
				for(k =0; k < nomesColunasQuebraMediaParcial.length; k++)
				{
					if(coluna.campos_quebrar_media_parcial[j] == nomesColunasQuebraMediaParcial[k])
					{
						ja_incluiu = true;
					}
				}
				if(! ja_incluiu)
				{
					nomesColunasQuebraMediaParcial.push(coluna.campos_quebrar_media_parcial[j]);
				}
			}
			for(j =0; j < coluna.campos_total.length; j++)
			{
				ja_incluiu = false;
				for(k =0; k < nomesColunasQuebraTotal.length; k++)
				{
					if(coluna.campos_total[j] == nomesColunasQuebraTotal[k])
					{
						ja_incluiu = true;
					}
				}
				if(! ja_incluiu)
				{
					nomesColunasQuebraTotal.push(coluna.campos_total[k]);
				}
			}
			for(j =0; j < coluna.campos_media.length; j++)
			{
				ja_incluiu = false;
				for(k =0; k < nomesColunasQuebraMedia.length; k++)
				{
					if(coluna.campos_media[j] == nomesColunasQuebraMedia[k])
					{
						ja_incluiu = true;
					}
				}
				if(! ja_incluiu)
				{
					nomesColunasQuebraMedia.push(coluna.campos_media[j]);
				}
			}*/
			if(coluna.nome == retorno.config.coluna_analise_vertical)
			{
				///indiceColunaAnaliseVertical = i;
			}
		}
		if(indiceColunaAnaliseVertical != null)
		{
			for(i =0; i < retorno.dados.length; i++)
			{
				valores = retorno.dados[i];
				//colunas da análise vertical
				if(! agrupadorColunasAnaliseVertical.includes(valores[indiceColunaAnaliseVertical].valor))
				{
					agrupadorColunasAnaliseVertical.push(valores[indiceColunaAnaliseVertical].valor);
				}
			}
			/*html += "<thead><tr> <td>"+retorno.config.coluna_analise_vertical+"<td>";
			for(l =0; l < indiceIniciaColunasValores-3; l++)
			{
				html += "<td></td>";
			}
			for(j =0; j < agrupadorColunasAnaliseVertical.length; j++)
			{
				html += "<td>"+agrupadorColunasAnaliseVertical[j]+"<td>";
				for(l =0; l < indiceIniciaColunasValores-2; l++)
				{
					html += "<td></td>";
				}
				
				
			}
			html += "</tr></thead>";*/
		}
		//indices com quebra parcial
		/*for(i =0; i < retorno.colunas.length; i++)
		{
			somadorParcial.push([]); //inicia com 0 pega e valor pelo indice
			contadorParcial.push([]); //inicia com 0 e valor pelo indice 
			somadorParcialMedia.push([]); //inicia com 0 pega e valor pelo indice
			contadorParcialMedia.push([]); //inicia com 0 e valor pelo indice 
			
			coluna = retorno.colunas[i];
			for(j =0; j < nomesColunasQuebraTotalParcial.length; j++)
			{
				if(nomesColunasQuebraTotalParcial[j] == coluna.nome)
				{
					indicesColunasQuebraTotalParcial.push(i);
				}
			}
			for(j =0; j < nomesColunasQuebraMediaParcial.length; j++)
			{
				if(nomesColunasQuebraMediaParcial[j] == coluna.nome)
				{
					indicesColunasQuebraMediaParcial.push(i);
				}
			}
			for(j =0; j < nomesColunasQuebraTotal.length; j++)
			{
				if(nomesColunasQuebraTotal[j] == coluna.nome)
				{
					indicesColunasQuebraTotal.push(i);
				}
			}
			for(j =0; j < nomesColunasQuebraMedia.length; j++)
			{
				if(nomesColunasQuebraMedia[j] == coluna.nome)
				{
					indicesColunasQuebraMedia.push(i);
				}
			}
		}*/
		
		//colunasParcial = [];
		for(l =0; l < indicesColunasQuebraTotalParcial.length; l++)
		{
			for(i =0; i < retorno.colunas.length; i++)
			{
				somadorParcial[indicesColunasQuebraTotalParcial[l]].push(0);
				contadorParcial[indicesColunasQuebraTotalParcial[l]].push(0);
			}
		}
		for(l =0; l < indicesColunasQuebraMediaParcial.length; l++)
		{
			for(i =0; i < retorno.colunas.length; i++)
			{
				somadorParcialMedia[indicesColunasQuebraMediaParcial[l]].push(0);
				contadorParcialMedia[indicesColunasQuebraMediaParcial[l]].push(0);
			}
		}
		
		
		html += "<thead><tr>";
		headVerticalJaUsado = "";
		iniciouVerticalValor = false;
		for(i =0; i < retorno.colunas.length; i++)
		{
			coluna = retorno.colunas[i];
			//colunas quebrar media e totalizador
			
			if(indiceColunaAnaliseVertical != i) // coluna análise vertical
			{
				style = "";
				aColumnComVertival = (coluna.apelido+"").split("__");
				colunaAtual = aColumnComVertival[0];
				if(aColumnComVertival.length > 1)
				{
					colunaAtual = "<b style='font-size: 13px;'>&nbsp;&nbsp;</b>";
					//ajuste para analise vertical
					colunaAtual += "<br><div style='position: relative; border-top: solid 1px #a7b5c3; width: calc(100% + 8px); margin-left: -4px; color: #56708f;'>&nbsp; ";
					colunaAtual += "	<div style='width: calc(100% - 5px); background: #ffffff; height: calc(100% + 6.4px); position: absolute; top: calc(-150% + 0px); '></div>";
					colunaAtual += aColumnComVertival[1]+"</div>";
					if(! headVerticalJaUsado.includes(aColumnComVertival[0]) || aColumnComVertival[0] == "" || aColumnComVertival[0] == null)
					{
						iniciouVerticalValor = true;
						style = "border-left: solid 1px #a7b5c3; min-width: 82px; ";
						//ajuste para analise vertical
						colunaAtual = "<b style='font-size: 10px; color: #607b9f; position: absolute;  z-index: 10; width: 85px; overflow: hidden; height: 15px;'>"+aColumnComVertival[0]+"</b><b style='font-size: 13px; color: #56708f; '>&nbsp;</b>";
						colunaAtual += "<br><div style='position: relative; border-top: solid 1px #a7b5c3; width: calc(100% + 8px); margin-left: -4px; color: #56708f;'>&nbsp;";
						colunaAtual += ""+aColumnComVertival[1]+"</div>";
						headVerticalJaUsado += aColumnComVertival[0]+",";
					}
				}
				if(iniciouVerticalValor)
				{
					//style = "border: 0; "+style;
				}
				
				html += "<td style='"+style+" color: #56708f; '>";
				/*coloca uma div para pintar o fundo, pois background tiras as bordas*/ 
				html += "<div style='position: absolute; height: 100%; width: calc(100% - 0px); background: #ffffff; z-index: -5; top: 0px; left: 0px; border-top: solid 1px #a7b5c3; '></div>";
				if(! iniciouVerticalValor && retorno.config.coluna_analise_vertical != "" && retorno.config.coluna_analise_vertical != null)
				{
					//print a coluna vertial
					if(i == 0)
					{
						html += "&nbsp;"+retorno.config.coluna_analise_vertical+" ";
					}
					html += "<br><div style='position: absolute; height: calc(50% + 3px); width: calc(100% + 2px); background: #eef4f7; z-index: -5; border-bottom: solid 1px #a7b5c3; top: 0px; left: 0px; border-top: solid 1px #a7b5c3; '></div>&nbsp;";
					html += "<div style='height: 0px; width: 100%; margin-top: -9px;'></div>";
					
				}
				html += ""+colunaAtual+"</td>";
			}
			if(coluna.totaliza_parcial)
			{
				indicesColunasToralizarParcial.push(i); 
			}
			
			if(coluna.media_parcial)
			{
				indicesColunasMediaParcial.push(i); 
			}
			
			if(coluna.totaliza)
			{
				//alert(coluna.nome);
				indicesColunasToralizar.push(i); 
			}
			if(coluna.valor_soma_parcial)
			{
				indicesValSomaParcial.push(i); 
			}
			if(coluna.valor_media_parcial)
			{
				indicesMediaParcial.push(i); 
			}
			
			if(coluna.media)
			{
				indicesColunasMedia.push(i); 
			}
			somadorTotal.push(0); 
			contadorTotal.push(0);
			ultimoValorParaQubraParcial.push("nulini");
			
		}
		
		html += "</thead><tbody>";
		//dados
		for(i =0; i < retorno.dados.length; i++)
		{
			valores = retorno.dados[i];
			//validar quebra parcial
			//for(l =0; l < indicesColunasQuebraTotalParcial.length; l++)
			for(l =indicesColunasQuebraTotalParcial.length-1; l >=0; l--)	
			{
				indiceColunaQuebrar = indicesColunasQuebraTotalParcial[l];
				if(valores[indiceColunaQuebrar].valor != ultimoValorParaQubraParcial[indiceColunaQuebrar] 
				&& i > 0  && tipo == "table"
				//falta criar as colunas quebrar, esta fixo a primeira
				)
				{
					html += montaTotalParcial(indicesColunasToralizarParcial, retorno.colunas, indiceColunaQuebrar, indicesColunasQuebraTotalParcial, indicesValSomaParcial);
				}
			}
			//validar media parcial
			//for(l =0; l < indicesColunasQuebraMediaParcial.length; l++)
			for(l =indicesColunasQuebraMediaParcial.length-1; l >=0 ; l--)	
			{
				indiceColunaQuebrar = indicesColunasQuebraMediaParcial[l];
				if(valores[indiceColunaQuebrar].valor != ultimoValorParaQubraParcial[indiceColunaQuebrar] 
				&& i > 0  && tipo == "table"
				//falta criar as colunas quebrar, esta fixo a primeira
				)
				{
					html += montaMediaParcial(indicesColunasMediaParcial, retorno.colunas, indiceColunaQuebrar, indicesColunasQuebraMediaParcial, indicesMediaParcial);
	
				}
			}
			//
			html += "<tr>";
			algumaColunaTemValorDifDaLinhaAnt = false;
			for(j =0; j < valores.length; j++)
			{
				style="color: "+valores[j].cor+"; background: "+valores[j].fundo+";";
				if(valores[j].valor == ultimoValorParaQubraParcial[j] && ! algumaColunaTemValorDifDaLinhaAnt) ///&& j ==0)//sem coluna querar
				{
					if(true)
					{
						//#cce5ff
						style="border-top: none; border-bottom: none; color: #749dbe; ";
					}
				}
				else
				{
					algumaColunaTemValorDifDaLinhaAnt = true;
				}
				if(indiceColunaAnaliseVertical != j) // coluna análise vertical
				{
					html += "<td style='"+style+" text-align: "+valores[j].alinhamento+";'>"+valores[j].valor+"</td>";
				}
				if(indicesValSomaParcial.includes(j))//indicesColunasToralizar.includes(j))
				{
					for(l =0; l < indicesColunasQuebraTotalParcial.length; l++)
					{
						indiceColunaQuebrar = indicesColunasQuebraTotalParcial[l];
						//console.log(indiceColunaQuebrar+" "+valores[j].valor+" "+j)
						if(valores[j].valor != "" && valores[j].valor != null)
						{
							somadorParcial[indiceColunaQuebrar][j] =somadorParcial[indiceColunaQuebrar][j] +parseFloat(valores[j].valor.replaceAll(".","").replaceAll(",","."));	
						}
					}
					
					for(l =0; l < indicesColunasQuebraTotalParcial.length; l++)
					{
						indiceColunaQuebrar = indicesColunasQuebraTotalParcial[l];
						contadorParcial[indiceColunaQuebrar][j] = contadorParcial[indiceColunaQuebrar][j] +1;
					}
					
				}
				if(indicesColunasToralizar.includes(j) || indicesColunasMedia.includes(j))
				{
					if(valores[j].valor != "" && valores[j].valor != null)
					{
						somadorTotal[j] = somadorTotal[j] +parseFloat(valores[j].valor.replaceAll(".","").replaceAll(",","."));
					}
					contadorTotal[j] = contadorTotal[j] +1;
				}
				if(indicesMediaParcial.includes(j))
				{
					
					for(l =0; l < indicesColunasQuebraMediaParcial.length; l++)
					{
						indiceColunaQuebrar = indicesColunasQuebraMediaParcial[l];
						//console.log(indiceColunaQuebrar)
						if(valores[j].valor != "" && valores[j].valor != null)
						{
							somadorParcialMedia[indiceColunaQuebrar][j] = somadorParcialMedia[indiceColunaQuebrar][j] +parseFloat(valores[j].valor.replaceAll(".","").replaceAll(",","."));	
						}
					}
					for(l =0; l < indicesColunasQuebraMediaParcial.length; l++)
					{
						indiceColunaQuebrar = indicesColunasQuebraMediaParcial[l];
						contadorParcialMedia[indiceColunaQuebrar][j] = contadorParcialMedia[indiceColunaQuebrar][j] +1;
					}
					
				}
				
				ultimoValorParaQubraParcial[j] = valores[j].valor;
			}
			html += "</tr>";
			
		}
		
		if(tipo == "table")
		{
			//for(l =0; l < indicesColunasQuebraTotalParcial.length; l++)
			for(l =indicesColunasQuebraTotalParcial.length-1; l >=0; l--)	
			{	
				indiceColunaQuebrar = indicesColunasQuebraTotalParcial[l];
				html += montaTotalParcial(indicesColunasToralizarParcial, retorno.colunas, indiceColunaQuebrar, indicesColunasQuebraTotalParcial, indicesValSomaParcial);
			}
			//for(l =0; l < indicesColunasQuebraMediaParcial.length; l++)
			for(l =indicesColunasQuebraMediaParcial.length-1; l >=0 ; l--)	
			{
				indiceColunaQuebrar = indicesColunasQuebraMediaParcial[l];
				html += montaMediaParcial(indicesColunasMediaParcial, retorno.colunas, indiceColunaQuebrar, indicesColunasQuebraMediaParcial, indicesMediaParcial);
			}
		}
		html += montaTotalFinal(indicesColunasToralizar, indicesColunasMedia, retorno.colunas);
		html += "</tbody></table>";
		//alert(seletor+" "+html);
		$("#"+seletor).html(html);
		//pivot
		//pivotTabela(seletor, 'analise'+retorno.config.codigo)
		//cabecalho fixo
		if(tipoDash == "table" || tipoDash == "")
		{

			document.getElementById(seletor).addEventListener("scroll", function(){
			   //var translate = "translate(0,"+(this.scrollTop-2)+"px)";
			   //this.querySelector("thead").style.transform = translate;
			   
			   //$("#"+seletor+" thead").css("transform", "translate(0, "+(this.scrollTop-2)+"px)");
			});
			$("#"+seletor+"").css("position", "relative");
			$("#"+seletor+" thead").css("position", "sticky");
			$("#"+seletor+" thead").css("top", "0");
			$("#"+seletor).css("transform", "translate3d(0, 0, 0)");
			//$("#"+seletor).css("overflow", "scroll");
		}
		
		if(tipoDash == "widget")
		{
			tipo = "widget";
			for(j =0; j < valores.length; j++)
			{
				cor_widget = retorno.config.cor_widget + " !important";
				icone_widget = retorno.config.icone_widget;
				html = "<div class='widgetcard' >";
				html += "<div style='height: 100%; width: 5px; position: absolute; left: 0px; top: 0px; background: "+cor_widget+"; opacity: 0.6;'></div>";
				html += "<b style='color: #394d60; opacity: 0.8; margin-left: 5px;'>"+retorno.config.titulo_widget_grafico+"</b><br>";
				html += "<b style='color: "+cor_widget+";; opacity: 0.9; margin-left: 5px;'>"+retorno.config.unidade_widget+" "+valores[j].valor+"</b>";
				html += "<i style='position: absolute; right: 15px; top: 20px; font-size: 30px; color: "+cor_widget+"; opacity: 0.6;' class='"+icone_widget+"'></i></div>";
				$("#"+seletor).html(html);
			}
			
		}
		else if(tipoDash == "mapa" )
		{
			
			
			/*$("header").append('<link href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/leaflet.css" />');
			$("header").append('<link rel="stylesheet" href="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.css" />');
			//$("header").append('<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/leaflet.js"></script>');
			$.getScript("https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/leaflet.js", function() {
			  // alert("Script loaded but not necessarily executed.");
			});*/
			
			
			$("#analise"+retorno.config.codigo).css("display", "none");
			tipo = "mapa";
			
			cor_widget = retorno.config.cor_widget +" !important";
			icone_widget = retorno.config.icone_widget;
			html = "<div class='widgetcard' style='height: 100%; width: 100%; padding: 5px;'>  ";
			html += "<div style='height: 100%; width: 5px; position: absolute; left: 0px; top: 0px; background: "+cor_widget+"; opacity: 0.6;'></div>";
			if($("#analise_view_tab").length == 1)//1 esta na pagina de dashboard; 0 é view direto em analises
			{
				html += "<b style='color: #394d60; opacity: 0.8; margin-left: 5px;'>"+retorno.config.titulo_widget_grafico+"</b><br>";
			}
			//html += "<b style='color: "+cor_widget+";; opacity: 0.9; margin-left: 5px;'>"+retorno.config.unidade_widget+" "+valores[j].valor+"</b>";
			html += "<i style='position: absolute; right: 15px; top: 20px; font-size: 30px; color: "+cor_widget+"; opacity: 0.6;' class='"+icone_widget+"'></i>";
			html += "<div id='mapa"+retorno.config.codigo+"' style='height: 100%; width: 100%;'> </div>";
			html += "</div>";
			
			$("#"+seletor).html(html);
			 polylinePoints = [];
			 setTimeout(function(){
				 markerIconPadrao = L.icon({
				  iconSize: [20, 20],
				  // specify the path here
				  iconUrl: "https://unpkg.com/leaflet@1.5.1/dist/images/marker-icon.png"
				  
				});
				/*if(retorno.config.tipo_view_mapa == "marcador")
				{
					markerIconPadrao = L.icon({
					  iconUrl: "https://unpkg.com/leaflet@1.0.3/dist/images/marker-icon.png",
					   iconSize: [21, 31], // size of the icon
						iconAnchor: [10, 41], // point of the icon which will correspond to marker's location
						popupAnchor: [0, -51]
					});
				}*/
				markerA = L.icon({
				  iconSize: [25, 41],
				  iconAnchor: [10, 41],
				  popupAnchor: [2, -40],
				  // specify the path here
				  iconUrl: "images/MarkerA.png",
				  shadowUrl: "https://unpkg.com/leaflet@1.5.1/dist/images/marker-shadow.png"
				});
				markerB = L.icon({
				  iconSize: [25, 41],
				  iconAnchor: [10, 41],
				  popupAnchor: [2, -40],
				  // specify the path here
				  iconUrl: "images/MarkerB.png",
				  shadowUrl: "https://unpkg.com/leaflet@1.5.1/dist/images/marker-shadow.png"
				}); 
				latIni = 0;
				latFim = 0;
				//alert(retorno.dados.length)
				for(j =0; j < retorno.dados.length; j++)
				{
					
					valores = retorno.dados[j];
					//iniciar mapa na posição
					if(valores[0].valor != "" && valores[0].valor != null)
					{
						if(retorno.config.tipo_coluna_lat_lng == "lat_lng_junta")
						{
							latIni = valores[0].valor.split(retorno.config.unidade_widget)[0];
							lngIni = valores[0].valor.split(retorno.config.unidade_widget)[1];
						}
						else
						{
							latIni = valores[0].valor;
							lngIni = valores[1].valor;
						}
						j = retorno.dados.length;
					}
				}
				map = L.map('mapa'+retorno.config.codigo).setView({lat:latIni, lon: lngIni }, 5);
				L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
				maxZoom: 20,
				attribution: '&copy; <a href="https://openstreetmap.org/copyright">OpenStreetMap contributors</a>'
				 }).addTo(map);
				L.control.scale().addTo(map);
				//marcadores
				for(j =0; j < retorno.dados.length; j++)
				{
					valores = retorno.dados[j];
					if(valores[0].valor != "" && valores[0].valor != null)
					{	
						iniColulas = 1;
						if(retorno.config.tipo_coluna_lat_lng == "lat_lng_junta")
						{
							lat = valores[0].valor.split(retorno.config.unidade_widget)[0].trim();
							lng = valores[0].valor.split(retorno.config.unidade_widget)[1].trim();
						}
						else
						{
							lat = valores[0].valor.trim();
							lng = valores[1].valor.trim();
							iniColulas = 2;
						}
						lat = parseFloat(lat);
						lng = parseFloat(lng);
						strPopUup = "Lat,Lng: "+lat+","+lng+" <br>";
						for(lCol = iniColulas; lCol < retorno.colunas.length; lCol ++)
						{
							strPopUup += retorno.colunas[lCol].apelido+": "+valores[lCol].valor.trim()+" <br>";
						}
						
						if(lat != 0 )
						{
							//console.log(lat+" "+lng)
							
							if(retorno.config.tipo_view_mapa == "polilinha" || retorno.config.tipo_view_mapa == "marcador_polilinha")
							{
								polylinePoints.push([lat, lng, 'valores']);
								if(j ==0)
								{
									L.marker({lat: lat, lon: lng},{icon: markerA}).bindPopup(strPopUup).addTo(map);
								}
								if(j == retorno.dados.length-1)
								{
									L.marker({lat: lat, lon: lng},{icon: markerB}).bindPopup(strPopUup).addTo(map);
								}
							}
							
							if(retorno.config.tipo_view_mapa == "marcador" || retorno.config.tipo_view_mapa == "marcador_polilinha")
							{
								L.marker({lat: lat, lon: lng},{icon: markerIconPadrao}).bindPopup(strPopUup).addTo(map);
							}
							
							
						}
						
					}
				}
				if(polylinePoints.length > 0)
				{
					var polyline = L.polyline(polylinePoints).addTo(map);  
				}
		     }, 100);
		   
			
		}
		else if(tipo == "chart")
		{
			
			/*for(i =0; i < 2; i++)//só a primeira e segunda coluna
			{
				series = [];
				categories= [];
				data = [];
				categoria = [];
				coluna = retorno.colunas[i];
				for(j =0; j < retorno.dados.length; j++)
				{
					valores = retorno.dados[j];
					data.push(valores[i]);
					categoria.push(valores[i]);
				}
				//name: coluna.nome,
				if(i == 0)
				{
					categories.push( categoria);
				}
				else if(i == 1)
				{
					series.push({ data: data});
				}
			}
			Highcharts.chart(seletor, {
					chart: {
							type: tipoDash,
							inverted: false
					},
					xAxis: {
						categories: categories
					},
					
				series: series
					
			});
			
			*/
			Highcharts.addEvent(Highcharts, 'displayError', function (err) {
			  if(err.message.includes("error"))
			  {
				abrir_modal("modal_geral", "<b style='color: red;'>Erro ao montar o gráfico</b> <Br> Abaixo exemplo de tabela para gráfico. <br><img src='images/exemplo_grafico.png' style='width: 100%;'/>");
			  }
			}); 
			//alert(retorno.config.icone_widget+" "+seletor)
			aCalculosCustom = [];
			columnChart = {};
			innerSize = 0;
			areaChart = {};
			if(tipoDash == "column_group")
			{
				tipoDash = "column";
				columnChart.stacking  = 'normal'  ;
				//exemplo https://www.highcharts.com/demo/highcharts/column-stacked-and-grouped
			}
			else if(tipoDash == "pie_rosca")
			{
				tipoDash = "pie";
				innerSize = 75;
			}
			else if(tipoDash == "area_empilhada")
			{
				tipoDash = "area";
				areaChart.stacking = 'normal'; 
				areaChart.lineColor = '#666666'; 
				areaChart.lineWidth = 1; 
				areaChart.marker = {
					lineWidth: 1,
					lineColor: '#666666'
				}; 
			}
			//coluna com mais de uma descrição https://jsfiddle.net/api/post/library/pure/
			//tem que arrumar esse para depois fazer o de colunas agrupadas
			Highcharts.chart(seletor, {
				data: {
					table: 'analise'+retorno.config.codigo
				},
				chart: {
					type: tipoDash
				},
				title: {
					text: ''
				},
				subtitle: {
					text:
						''
				},
				xAxis: {
					type: 'category'
				},
				yAxis: {
					allowDecimals: true,
					title: {
						text: retorno.colunas[0].nome
					}
				},
				 plotOptions: {
					column:  columnChart, 
					area: areaChart,
					series: {
						innerSize: innerSize+'%',
						dataLabels: criarDatalabelGrafico(retorno.config.icone_widget, this), olddataLabelsexemplo: {
							//allowOverlap: true,
							//enabled: true,
							//rotation: -90,
							/*formatter: function () { //formatar numero
								return Highcharts.numberFormat(this.y,2);
							},*/
							/*formatter:function() { //porcentagem dividir o atual pelo total
								var total = 0, percentage; 
							   $.each(this.series.data, function() { 
								  total+=this.y; 
							   }); 

							   percentage=((this.y/total)*100).toFixed(1); 
							   return percentage+'%'; 
							},*/
							/*formatter:function() { //porcentagem dividir atual pelo anteior tipo fat/meta
								if(aCalculosCustom[this.name] === undefined || aCalculosCustom[this.name] === null)
								{
									aCalculosCustom[this.name] = this.y;
									return ''; 
								}
								else if(this.y > 0)
								{
									percentage=((aCalculosCustom[this.name]/this.y)*100).toFixed(1); 
									return percentage+'%'; 
								}
								else
								{
									return ''; 
								}
								
							},*/
							//format: '{yData[0]} {yData[1]} {y} % <br/> {series.name}',
							style: {
								color: '#215583',
								fontSize: '10px',
								textShadow: false,
								textOutline: false 
							}/*,
							y: 10 //altura inicioar*/
							
						}
					}
				}
			});
			
			
			
			/*Highcharts.chart(seletor, {
					chart: {
							type: tipoDash,
							inverted: false
					},
					data: {
						table: 'analise'+retorno.config.codigo
					}
					
			});*/
		}
		
	}
	function criarDatalabelGrafico(opcao, seletorGrafico)
	{
		dataLabels = {}
		if(opcao=="exibir_valor")
		{
			dataLabels.allowOverlap= true;
			dataLabels.enabled= true;
			dataLabels.rotation= -90;
			dataLabels.formatter= function () { //formatar numero
				return Highcharts.numberFormat(this.y,2);
			}
		}
		else if(opcao=="porcemtagem_divide_pelo_valor_total_de_todos")
		{
			dataLabels.allowOverlap= true;
			dataLabels.enabled= true;
			dataLabels.rotation= -90;
			dataLabels.formatter= function() { //porcentagem dividir o atual pelo total
			  var total = 0, percentage; 
			  $.each(this.series.data, function() { 
				  total+=this.y; 
			  }); 

			   percentage=((this.y/total)*100).toFixed(1); 
			   return percentage+'%'; 
			}
		}
		else if(opcao=="porcemtagem_divide_primeira_colVal_pela_segunda_colVal")
		{
			dataLabels.allowOverlap= true;
			dataLabels.enabled= true;
			dataLabels.rotation= -90;
			dataLabels.formatter= function() 
			{ //porcentagem dividir atual pelo anteior tipo fat/meta
				if(aCalculosCustom[this.name] === undefined || aCalculosCustom[this.name] === null)
				{
					aCalculosCustom[this.name] = this.y;
					return ''; 
				}
				else if(this.y > 0)
				{
					percentage=((aCalculosCustom[this.name]/this.y)*100).toFixed(1); 
					return percentage+'%'; 
				}
				else
				{
					return ''; 
				}
			
			}
		}
		else if(opcao=="porcemtagem_divide_segunda_colVal_pela_primeira_colVal")
		{
			dataLabels.allowOverlap= true;
			dataLabels.enabled= true;
			dataLabels.rotation= -90;
			dataLabels.formatter=function() 
			{ //porcentagem dividir atual pelo anteior tipo fat/meta
				if(aCalculosCustom[this.name] === undefined || aCalculosCustom[this.name] === null)
				{
					aCalculosCustom[this.name] = this.y;
					return ''; 
				}
				else if(aCalculosCustom[this.name] > 0)
				{
					percentage=((this.y/aCalculosCustom[this.name])*100).toFixed(1); 
					return percentage+'%'; 
				}
				else
				{
					return ''; 
				}
			
			}
		}
		dataLabels.style= {
			color: '#215583',
			fontSize: '12px',
			textShadow: false,
			textOutline: false
		}
		dataLabels.crop = false;
		
		return dataLabels
	}
	function trocaTipoAnalise(table, tipo, tipoDash)
	{
		tabela = retornaTabelaPorNome(table);
		montaTabDash(tabela.dados, tipo, tabela.seletor, tipoDash);
	}
	function montaMediaParcial(indicesColunasMediaParcial, colunas, indiceColunaQuebrar, indicesColunasQuebraMediaParcial, indicesMediaParcial)
	{
		html = "";
		if(indicesColunasMediaParcial.length > 0 && indiceColunaQuebrar != indiceColunaAnaliseVertical && indicesMediaParcial.length > 0//coluna análise vertical
		)
		{
			//caso os primeiros indices forem zero limpa e não exibe
			if(indiceColunaQuebrar > 0 )
			{
				entrou_zerar = false;
				for(l =0; l < indicesColunasQuebraMediaParcial.length; l++)
				{
					indice_atual = indicesColunasQuebraMediaParcial[l];
					if(indice_atual < indiceColunaQuebrar)
					{
						for(k =0; k < colunas.length; k++)
						{
							if(indicesColunasMediaParcial.includes(k) && somadorParcialMedia[indice_atual][k] == 0)
							{
								somadorParcialMedia[indiceColunaQuebrar][k] = 0;
								contadorParcialMedia[indiceColunaQuebrar][k] = 0;
								entrou_zerar = true;
								k = colunas.length;
								l = indicesColunasQuebraMediaParcial.length;
							}
						}
					}
				}
				if(entrou_zerar)
				{
					return html;
				}
			}
			
			//cria uma coluna com totalizador e media
			html += "<tr style='background: #9eb0c7;'>";
			for(k =0; k < colunas.length; k++)
			{
				if(indiceColunaAnaliseVertical != k) //coluna análise vertical
				{
					if(k == indiceColunaQuebrar)
					{
						html += "	<td class='tdTotalizadorBi'>Média parcial</td>";
					}
					else if(indicesMediaParcial.includes(k))//if(indicesColunasMedia.includes(k))
					{
						if(contadorParcialMedia[indiceColunaQuebrar][k] > 0)
						{
							
							html += "	<td class='tdTotalizadorBi' style='text-align: right;'>"+roundToTwo(somadorParcialMedia[indiceColunaQuebrar][k]/contadorParcialMedia[indiceColunaQuebrar][k]).toLocaleString('pt-br', {minimumFractionDigits: 2})+"</td>";
							
							//somadorParcial[k] = 0;
							contadorParcialMedia[indiceColunaQuebrar][k] = 0;
						}
						else
						{
							html += "	<td class='tdTotalizadorBi' style='text-align: right;'>0</td>";
						}
					}
					else
					{
						html += "	<td></td>";
					}
				}
			}
			html += "</tr>";
			//contadorParcial[j] = 0;
		}
		return html;
	}
	function montaTotalParcial(indicesColunasToralizarParcial, colunas, indiceColunaQuebrar, indicesColunasQuebraTotalParcial, indicesValSomaParcial)
	{
		html = "";
		if(indiceColunaQuebrar != indiceColunaAnaliseVertical  && indicesValSomaParcial.length > 0//coluna análise vertical)
		)
		{
			//caso os primeiros indices forem zero limpa e não exibe
			/*if(indiceColunaQuebrar > 0)
			{
				entrou_zerar = false;
				for(l =0; l < indicesColunasQuebraTotalParcial.length; l++)
				{
					indice_atual = indicesColunasQuebraTotalParcial[l];
					if(indice_atual < indiceColunaQuebrar)
					{
						for(k =0; k < colunas.length; k++)
						{
							if(indicesColunasToralizarParcial.includes(k) && somadorParcial[indice_atual][k] == 0)
							{
								somadorParcial[indiceColunaQuebrar][k] = 0;
								contadorParcial[indiceColunaQuebrar][k] = 0;
								entrou_zerar = true;
								k = colunas.length;
								l = indicesColunasQuebraTotalParcial.length;
							}
						}
					}
				}
				if(entrou_zerar)
				{
					return html;
				}
			}*/
			//cria uma coluna com totalizador e media
			html += "<tr style='background: #9eb0c7;'>";
			for(k =0; k < colunas.length; k++)
			{
				if(indiceColunaAnaliseVertical != k) //coluna análise vertical
				{
					if(k == indiceColunaQuebrar)
					{
						//parcial
						html += "	<td class='tdTotalizadorBi'>Total</td>";
					}
					else if(indicesValSomaParcial.includes(k))//if(indicesColunasToralizar.includes(k))
					{
						//console.log(k+" - "+indicesValSomaParcial);
						html += "	<td class='tdTotalizadorBi' style='text-align: right;'>"+roundToTwo(somadorParcial[indiceColunaQuebrar][k]).toLocaleString('pt-br', {minimumFractionDigits: 2})+"</td>";
						somadorParcial[indiceColunaQuebrar][k] = 0;
						contadorParcial[indiceColunaQuebrar][k] = 0;
						
					}
					else
					{
						html += "	<td></td>";
					}
				}
			}
			html += "</tr>";
		}
		return html;
	}
	function montaTotalFinal(indicesColunasToralizar, indicesColunasMedia, colunas)
	{
		htmlMedia = "";
		htmlTotal = "";
		if(indicesColunasToralizar.length > 0 || indicesColunasMedia.length > 0)
		{
			//cria uma coluna com totalizador e media
			htmlMedia += "<tr style='background: #9eb0c7;'>";
			htmlTotal += "<tr style='background: #9eb0c7;'>";
			htmlMedia += "	<td class='tdTotalizadorBi'>Média</td>";
			htmlTotal += "	<td class='tdTotalizadorBi'>Total</td>";
			for(k =1; k < colunas.length; k++)
			{
				if(k != indiceColunaAnaliseVertical) // análise vertival
				{
					entrouQuebra= false;
					if(true)//for(l =0; l < indicesColunasQuebraTotalParcial.length; l++)
					{
						if(indicesColunasMedia.includes(k))
						{
							entrouQuebra= true;
							if(contadorTotal[k] > 0)
							{
								htmlMedia += "	<td class='tdTotalizadorBi' style='text-align: right;'>"+roundToTwo(somadorTotal[k]/contadorTotal[k]).toLocaleString('pt-br', {minimumFractionDigits: 2})+"</td>";
								//somadorParcial[k] = 0;
								contadorTotal[k] = 0;
							}
							else
							{
								htmlMedia += "	<td class='tdTotalizadorBi' style='text-align: right;'>0</td>";
							}
						}
						else
						{
							htmlMedia += "	<td></td>";
						}
						if(indicesColunasToralizar.includes(k))
						{
							entrouQuebra= true;
							if(somadorTotal[k] != 0)
							{
								htmlTotal += "	<td class='tdTotalizadorBi' style='text-align: right;'>"+somadorTotal[k].toLocaleString('pt-br', {minimumFractionDigits: 2})+"</td>";
								//somadorParcial[k] = 0;
							}
							else
							{
								htmlTotal += "	<td class='tdTotalizadorBi' style='text-align: right;'>0</td>";
							}
							contadorTotal[k] = 0;
							somadorTotal[k] = 0;
						}
						else
						{
							htmlTotal += "	<td></td>";
						}
						
						
					}
					
				}
			}
			htmlMedia += "</tr>";
			htmlTotal += "</tr>";
			
		}
		htmlRet = "";
		if(indicesColunasMedia.length > 0)
		{
			htmlRet += htmlMedia;
		}
		if(indicesColunasToralizar.length > 0)
		{
			htmlRet += htmlTotal;
		}
		return htmlRet;
	}
	function tableHtmlToarray(table)
	{
		const trs = document.querySelectorAll('#'+table+' tr');
		const result = [];
		for(let tr of trs) {
		  let th_td = tr.getElementsByTagName('td');
		  if (th_td.length == 0) {
			th_td = tr.getElementsByTagName('th');
		  }
		  
		  let th_td_array = Array.from(th_td); // convert HTMLCollection to an Array
		  th_td_array = th_td_array.map(tag => tag.innerText); // get the text of each element
		  result.push(th_td_array);
		}

		//console.log(result);
		return result;
	}

	
	function roundToTwo(num) {
		return +(Math.round(num + "e+2")  + "e-2");
	}
	
	
	//pivotar tabela
	function tableHtmlToarray(tableSeletor)
	{
		const trs = document.querySelectorAll('#'+tableSeletor+' tr');
		const result = [];
		for(let tr of trs) {
		  let th_td = tr.getElementsByTagName('td');
		  if (th_td.length == 0) {
			th_td = tr.getElementsByTagName('th');
		  }
		  
		  let th_td_array = Array.from(th_td); // convert HTMLCollection to an Array
		  th_td_array = th_td_array.map(tag => tag.innerText); // get the text of each element
		  result.push(th_td_array);
		}

		//console.log(result);
		return result;
	}

	function retornaTabelaPorNome(table)
	{
		//alert(table);
		for(i=0; i< listaTabs.length; i++)
		{
			if(listaTabs[i].codigo == table)
			{
				return listaTabs[i];
			}
			
		}
		return null;
	}

	function pivotTabela(seletor, tableSeletor)
	{
		
		tabela = retornaTabelaPorNome(tableSeletor);
		if(tabela.pivot)
		{
			tabela.pivot = false;
			montaTabDash(tabela.dados, "table", tabela.seletor, tabela.tipoDash);
			return null;
		}
		tabela.pivot = true;
		array = tableHtmlToarray(tableSeletor);
		if(array.length > 0)
		{
			qtdColunas = array[0].length;
			html = "<table id='"+tableSeletor+"' class='tableAnalise' style='width: "+(qtdColunas*100)+"px;'>";
			
			for(i = 0; i < qtdColunas; i++)
			{
				html += "<tr>";
				for(j =0; j < array.length; j++)
				{
					atributos = "";
					if(j == 0) //primeira coluna
					{
						atributos = "class='tdTotalizadorBi'";
					}
					else if(array[j][i].includes("Média parcial") || array[j][i].includes("Total parcial"))
					{
						atributos = "class='tdTotalizadorBi'";
					}
					html += "<td "+atributos+">"+array[j][i]+"</td>";
				}
				html += "</tr>";
			}
			html += "</table>";
			$("#"+seletor).html(html);
			$("#"+seletor).css("overflow", "auto");
		}
		return null;
	}
	
	function abrir_modal(id, conteudo)
	{
			$("#"+id+" .conteudo_modal").html(conteudo);
			$("#"+id).css("display", "block");
	}
	
	function ajustarCorAnalise(seletor, tableSeletor, codigoAnalise, nomeForm)
	{
		$.post(dominio+"src/controller/Bi_analiseControllerUser.php?mod=formulario_cores&codigo="+codigoAnalise+"&nomeForm="+nomeForm+"&seletor="+seletor,
			function (data)
			{
				//alert(data)
				htmlHead = '<b style="float: left; margin-top: -10px; color: #bfbfbf;">Cores</b>';
				htmlHead += '<a style="float: right; margin-top: -14px; margin-right: -12px;" href="javaScript:void(0)" onclick="fechar_modal_aviso()"><i class="fa-solid fa-circle-xmark"></i></a>';
				htmlHead += '<br>';
				abrir_modal_aviso(htmlHead+data);
				
				//$("#conteudo_avisos").html(data);
				
			}
		);
		
	}
	
	carregou_colunas = false;
	ultimaAnalise = "";
	function ajustarColunasAnalise(seletor, tableSeletor, codigoAnalise, nomeForm, tipoConfig)
	{
		tipoConfig = tipoConfig;
		//alert(tipoConfig)
		if(ultimaAnalise != codigoAnalise)
		{
			carregou_colunas = false;
			$('.salvar_analise').css('display', 'none');
		}
		ultimaAnalise = codigoAnalise;
		if(carregou_colunas)
		{
			//$("#btn_abrir_modal_avisos").click();
			fechar_modal_aviso();
			setTimeout(function() {
						if(tipoConfig == "colunas")
						{
							$("#etapa3").css("display", "block");
							$("#etapa4").css("display", "none");							
						}
						else if(tipoConfig == "agregacao")
						{
							$("#etapa3").css("display", "none");
							$("#etapa4").css("display", "block");	
						}
					}, 200);
		}
		else
		{
			carregou_colunas = true;
			$.post(dominio+"src/controller/Bi_analiseControllerUser.php?mod=formulario_colunas&codigo="+codigoAnalise+"&nomeForm="+nomeForm+"&seletor="+seletor+"&tipoConfig="+tipoConfig,
				function (data)
				{
					//alert(data)
					htmlHead = '<b style="float: left; margin-top: -10px; color: #bfbfbf;">Colunas</b>';
					htmlHead += '<a style="float: right; margin-top: -14px; margin-right: -12px;" href="javaScript:void(0)" onclick="fechar_modal_aviso()"><i class="fa-solid fa-circle-xmark"></i></a>';
					htmlHead += '<br>';
					abrir_modal_aviso(htmlHead+data);
					setTimeout(function() {
						if(tipoConfig == "colunas")
						{
							$("#etapa3").css("display", "block");
							$("#etapa4").css("display", "none");							
						}
						else if(tipoConfig == "agregacao")
						{
							$("#etapa3").css("display", "none");
							$("#etapa4").css("display", "block");	
						}
						$("#modal_avisos .modal-dialog").css("min-width","750px");
					}, 200);
					
					//$("body").html(data);
					
				}
			);
		}
		
	}
	
	function modal_filtro_analise(id_modal)
	{
		$("#btn_abrir_modal_filtro"+id_modal).click();
		//$(seletor).css("display", "block");
		/*htmlHead = '<b style="float: left; margin-top: -10px; color: #bfbfbf;">Filtros</b>';
		htmlHead += '<a style="float: right; margin-top: -14px; margin-right: -12px;" href="javaScript:void(0)" onclick="fechar_modal_aviso()"><i class="fa-solid fa-circle-xmark"></i></a>';
		htmlHead += '<br>';
		htmlFiltro = $(seletor).html();
		//$(seletor).html("");
		abrir_modal_aviso(htmlHead+htmlFiltro);
		$.getScript("js/formulario.js", function() {
			  // alert("Script loaded but not necessarily executed.");
			});*/
	}
	
	function salvarAlteraoesAnalise(seletor, tableSeletor, codigoAnalise, nomeForm)
	{
		
		if(carregou_colunas)
		{
			colunasSelecionadas = $("#select_colunas_info").val();
			aColunasSelecionadas = [];
			strColunas = "";
			for(i =0; i < colunasSelecionadas.length; i++)
			{
				for(j =0; j < colunasTemp.length; j++)
				{
					if(colunasTemp[j].nome == colunasSelecionadas[i])
					{
						if(strColunas != "")
						{
							strColunas += ",";
						}
						strColunas += "`"+colunasTemp[j].nome+"`";
						//console.log(colunasTemp[j].nome+" "+colunasTemp[j].tipo_dado);
						aColunasSelecionadas.push({nome: colunasTemp[j].nome, tipo: colunasTemp[j].tipo_dado});
					}
				}
				strColunas.replaceAll("``","`");
			}
			colunas_view_vertical = "";
			colunas_valores_vertical = "";
			coluna_vertical = "";
			colunas_quebrar_parcial_analise_vertical = "";
			colunas_quebrar_media_parcial_analise_vertical = "";
			colunas_total_analise_vertical = "";
			colunas_media_analise_vertical = "";
			colunas_valores_media_parcial = "";
			colunas_valores_soma_parcial = "";
			if(true)//tipo_analise == "tabela_vertical")
			{
				if($("#select_colunas_info").val() != null)
				{
					//colunas_view_vertical = $("#select_colunas_info").val().toString();
					for(k =0; k < $("#select_colunas_info").val().length; k++)
					{
						if(colunas_view_vertical != ""){colunas_view_vertical += ",";}
						colunas_view_vertical += "`"+$("#select_colunas_info").val()[k]+"`";
					}
					colunas_view_vertical.replaceAll("``","`");
					
				}
				if($("#select_colunas_valores_vertical").val() != null)
				{
					//colunas_valores_vertical = $("#select_colunas_valores_vertical").val().toString();
					for(k =0; k < $("#select_colunas_valores_vertical").val().length; k++)
					{
						if(colunas_valores_vertical != ""){colunas_valores_vertical += ",";}
						colunas_valores_vertical += "`"+$("#select_colunas_valores_vertical").val()[k]+"`";
					}
					colunas_valores_vertical.replaceAll("``","`");
				}
				coluna_vertical = $("#select_coluna_vertical").val();
				if($("#select_colunas_quebra_parcial_vertical").val() != null)
				{
					//colunas_quebra_parcial_vertical = $("#select_colunas_quebra_parcial_vertical").val().toString();
					for(k =0; k < $("#select_colunas_quebra_parcial_vertical").val().length; k++)
					{
						if(colunas_quebrar_parcial_analise_vertical != ""){colunas_quebrar_parcial_analise_vertical += ",";}
						colunas_quebrar_parcial_analise_vertical += "`"+$("#select_colunas_quebra_parcial_vertical").val()[k]+"`";
					}
					colunas_quebrar_parcial_analise_vertical.replaceAll("``","`");
				}
				if($("#select_colunas_quebra_media_parcial_vertical").val() != null)
				{
					//colunas_quebra_parcial_vertical = $("#select_colunas_quebra_parcial_vertical").val().toString();
					for(k =0; k < $("#select_colunas_quebra_media_parcial_vertical").val().length; k++)
					{
						if(colunas_quebrar_media_parcial_analise_vertical != ""){colunas_quebrar_media_parcial_analise_vertical += ",";}
						colunas_quebrar_media_parcial_analise_vertical += "`"+$("#select_colunas_quebra_media_parcial_vertical").val()[k]+"`";
					}
					colunas_quebrar_media_parcial_analise_vertical.replaceAll("``","`");
				}
				if($("#select_colunas_total_vertical").val() != null)
				{
					//colunas_quebra_parcial_vertical = $("#select_colunas_quebra_parcial_vertical").val().toString();
					for(k =0; k < $("#select_colunas_total_vertical").val().length; k++)
					{
						if(colunas_total_analise_vertical != ""){colunas_total_analise_vertical += ",";}
						colunas_total_analise_vertical += "`"+$("#select_colunas_total_vertical").val()[k]+"`";
					}
					colunas_total_analise_vertical.replaceAll("``","`");
				}
				if($("#select_colunas_media_vertical").val() != null)
				{
					//colunas_quebra_parcial_vertical = $("#select_colunas_quebra_parcial_vertical").val().toString();
					for(k =0; k < $("#select_colunas_media_vertical").val().length; k++)
					{
						if(colunas_media_analise_vertical != ""){colunas_media_analise_vertical += ",";}
						colunas_media_analise_vertical += "`"+$("#select_colunas_media_vertical").val()[k]+"`";
					}
					colunas_media_analise_vertical.replaceAll("``","`");
				}
				if($("#select_colunas_val_soma_parcial").length > 0)
				{
					if($("#select_colunas_val_soma_parcial").val() != null)
					{
						//colunas_quebra_parcial_vertical = $("#select_colunas_quebra_parcial_vertical").val().toString();
						for(k =0; k < $("#select_colunas_val_soma_parcial").val().length; k++)
						{
							if(colunas_valores_soma_parcial != ""){colunas_valores_soma_parcial += ",";}
							colunas_valores_soma_parcial += "`"+$("#select_colunas_val_soma_parcial").val()[k]+"`";
						}
						colunas_valores_soma_parcial.replaceAll("``","`");
					}
					if($("#select_colunas_val_media_parcial").val() != null)
					{
						for(k =0; k < $("#select_colunas_val_media_parcial").val().length; k++)
						{
							if(colunas_valores_media_parcial != ""){colunas_valores_media_parcial += ",";}
							colunas_valores_media_parcial += "`"+$("#select_colunas_val_media_parcial").val()[k]+"`";
						}
						colunas_valores_media_parcial.replaceAll("``","`");
					}
				}
			}
			/*if(coluna_vertical == "" && colunas_valores_vertical == "")
			{
				query = " select "+strColunas+" from ("+$("#query").val()+") a";
				query += " order by "+strColunas
			}
			else if(coluna_vertical != "" && colunas_valores_vertical != "")
			{
				coluna_vertical = "`"+coluna_vertical+"`";
				query = " select "+strColunas+","+coluna_vertical+","+colunas_valores_vertical+" from ("+$("#query").val()+") a ";
				query += " order by "+strColunas
			}
			else if(colunas_valores_vertical != "" )
			{
				query = " select "+strColunas+", "+colunas_valores_vertical+" from ("+$("#query").val()+") a";
				query += " order by "+strColunas
			}
			else
			{
				query = $("#query").val();
			}*/
			
			//marcar colunasTemp usadas
			for(i =0; i < colunasTemp.length; i++)
			{
				if(colunas_valores_vertical.includes(colunasTemp[i].nome.trim()) ||
				   coluna_vertical.includes(colunasTemp[i].nome.trim()) ||
				   colunas_quebrar_parcial_analise_vertical.includes(colunasTemp[i].nome.trim()) ||
				   colunas_quebrar_media_parcial_analise_vertical.includes(colunasTemp[i].nome.trim()) ||
				   colunas_total_analise_vertical.includes(colunasTemp[i].nome.trim()) ||
				   colunas_media_analise_vertical.includes(colunasTemp[i].nome.trim()) ||
				   colunasSelecionadas.includes(colunasTemp[i].nome.trim()) 
				)
				{
					colunasTemp[i].oculto = false;
				}
				$('.linha_cor_dinamica').each(function(){
					//alert($(this).find('[name="col_valor"]').val())
					if($(this).find('[name="col_valor"]').length > 0)
					{
						//alert($(this).find('[name="col_valor"]').val())
						if($(this).find('[name="col_valor"]').val().trim() == colunasTemp[i].nome.trim())
						{
							colunasTemp[i].utilizada_para_calculo = true;
							if(colunas_valores_ocultas_para_calculo != "")
							{
								colunas_valores_ocultas_para_calculo += ",";
							}
							colunas_valores_ocultas_para_calculo += "`"+colunasTemp[i].nome.trim()+"`";
						}
					}
				});
			}
		
			analise = {colunas_view_vertical: colunas_view_vertical, 
					colunas_valores_vertical: colunas_valores_vertical, coluna_vertical: coluna_vertical,
					colunas_quebrar_parcial_analise_vertical: colunas_quebrar_parcial_analise_vertical, 
					colunas_quebrar_media_parcial_analise_vertical: colunas_quebrar_media_parcial_analise_vertical,
					colunas_total_analise_vertical: colunas_total_analise_vertical,
					colunas_media_analise_vertical: colunas_media_analise_vertical,
					codigo: codigoAnalise,
					colunas_valores_soma_parcial: colunas_valores_soma_parcial,
					colunas_valores_media_parcial: colunas_valores_media_parcial,
					colunas: colunasTemp
				};
			abrir_modal_aviso("<b>Aguarde ...</b>");	
			//console.log(analise);
			$.post(dominio+"src/controller/Bi_analiseControllerUser.php?mod=alterar_analise_user", 
				analise, 
				function (retorno)
				{
					fechar_modal_aviso();
					if(! retorno.status)
					{
						alert(retorno.mensagem);
					}
					else
					{
						carregou_colunas = false;
						alert("Sucesso!");
						//$("#codigo_analise").val(retorno.codigo);
						/*if(confirm("Sucesso! Código "+retorno.codigo+". Deseja visualizar a análise?"))
						{
							window.open('Analise_view.php?analise='+retorno.codigo, '_blank');
						}*/
						$('.salvar_analise').css('display', 'none');
						$(".modal_fechar").click();
							
						//alert(retorno.mensagem);
					}
				},'json'
			);	
		}
	}
	
	
	function download_table_as_csv(table_id, separator = ';') {
		// Select rows from table_id
		var rows = document.querySelectorAll('table#' + table_id + ' tr');
		// Construct csv
		var csv = [];
		for (var i = 0; i < rows.length; i++) {
			var row = [], cols = rows[i].querySelectorAll('td, th');
			for (var j = 0; j < cols.length; j++) {
				// Clean innertext to remove multiple spaces and jumpline (break csv)
				var data = cols[j].innerText.replace(/(\r\n|\n|\r)/gm, '').replace(/(\s\s)/gm, ' ')
				// Escape double-quote with double-double-quote (see https://stackoverflow.com/questions/17808511/properly-escape-a-double-quote-in-csv)
				data = data.replace(/"/g, '""');
				// Push escaped string
				row.push('"' + data + '"');
			}
			csv.push(row.join(separator));
		}
		var csv_string = csv.join('\n');
		// Download it
		var filename = 'export_' + table_id + '_' + new Date().toLocaleDateString() + '.csv';
		var link = document.createElement('a');
		link.style.display = 'none';
		link.setAttribute('target', '_blank');
		link.setAttribute('href', 'data:text/csv;charset=utf-8,%EF%BB%BF' + encodeURIComponent(csv_string));
		link.setAttribute('download', filename);
		document.body.appendChild(link);
		link.click();
		document.body.removeChild(link);
	}
	function imprimirPagina()
	{
		abrirMenuAposImprimir = false;
		if(document.getElementById("mySidenav").style.width != "0px")
		{
			abrirMenuAposImprimir = true;
		}
		closeNav()
		window.print();
		if(abrirMenuAposImprimir)
		{
			openNav();
		}
	}
	function salvarFiltro(formulario, seletor, codigo_analise)
	{
		
		strJson = "[";
		$('.inputFiltroBi').each(function() {
			if($(this).attr("tipo") != "Data calculada")
			{
				valorInput = $(this).val();
				name = $(this).attr("name");
				
				if($(this).attr("tipo") == "data" || $(this).attr("tipo") == "data hora minuto" )
				{
					
					aDataHora = valorInput.split(" ");
					data = aDataHora[0];
					aData = data.split("/");
					valorInput = aData[2]+"-"+aData[1]+"-"+aData[0];
					if(aDataHora.length > 1)
					{
						valorInput += " "+aDataHora[1];
					}
					
				}
				else if($(this).attr("tipo") == "número decimal")
				{
					valorInput = valorInput.replaceAll(".","");
					valorInput = valorInput.replaceAll(",",".");
				}
				if(valorInput == null || valorInput === undefined || valorInput == "undefined-undefined-" || valorInput == "")
				{
					valorInput = "";
				}
				
				
				if(strJson != "[")
				{
					strJson += ",";	
				}
				strJson += '{"id": "'+name+'", "valor": "'+valorInput+'", "tipo": "'+$(this).attr("tipo")+'"}';
				
			}
		
		});	
		strJson += "]";
		dadosJson = strJson;
		requisicaoAtual = $.ajax({
				type: 'post',
				url: dominio+"src/controller/Bi_conteudo_filtroControllerUser.php?mod=salvarFiltro",
				data: {"dados": dadosJson, "analise": codigo_analise},
				async: true,
				success: function(data) {
					//console.log(data);	
					retorno = JSON.parse(data);
					//listaTabs = [];
					alert(retorno.mensagem);
				
				}
		});
		//alert(strJson);
		
	}
	
	