PageSourceSearch

https://inegi.org.mx/componentes/biinegi/dibujaCuadros.min.js?v1.1.8

js inegi.org.mx collected 2026-10-02 09:48:52 UTC 884,654 bytes, 14,764 lines download raw bytes

1var aDependencias = [
2    { path: "componentes/biinegi/extjs/css/theme-crisp-all.css?v=c25062019_1", type: "css", active: true },
3    { path: "componentes/biinegi/styles/cuadros.min.css", type: "css", active: true },    
4    { path: "estilos/bootstrap/bootstrap.min.css", type: "css", active: false },
5    { path: "componentes/biinegi/rtTables/rtTables.css?v=c25062019_1", type: "css", active: true },
6    { path: "componentes/biinegi/catalogoHerramientas.min.js", type: "js", active: true},
7    { path: "componentes/biinegi/extjs/js/ext-all.js?v=c25062019_1", type: "js", active: true },
8    { path: "componentes/biinegi/rtTables/rtTables.js?v=c25062019_1", type: "js", active: true }
9];
10const extension_api_cuadros = "";
11// variable para los cuadros que entran en el nuevo llamado a API MetadatoIndicador/ (v2)
12var aCuadrosNuevoMetodoPost = [1, 2, 3, 6, 7, 8, 14, 12, 13,17];
13//var aCuadrosNuevoMetodoPost = [];
14 /**
15 * @description Metodo encargado de traducir al idioma seleccionado
16 * @param {*} parametros 
17 * @param {*} texto 
18 * @returns texto - en el idioma seleccionado
19 * @created 12-11-2021
20 */
21 var getTraductorCuadro = function(parametros, texto){
22    var aTextosEs = ["Exportar como","Exportar como PDF","Exportar como PNG","Opciones","Entidad federativa","Municipio","Localidad","Ubicación geográfica","Tipo de localidad habitada","Es cabecera municipal","Cabecera municipal","Instituto Nacional de Estadística y Geografía","México en Cifras","Localidades","Fecha de consulta","Exportar","de","en adelante","Alta","Baja","Moderada","Coeficiente de variación (CV) en el rango de:","Estimación: Las estimaciones que aparecen en este cuadro están coloreadas de acuerdo con su nivel de precisión, en Alta, Moderada y Baja, tomando como referencia el coeficiente de variación CV (%).","Límite: Intervalo de confianza al 90%.","Una precisión Baja requiere un uso cauteloso de la estimación en el que se analicen las causas de la alta variabilidad y se consideren otros indicadores de precisión y confiabilidad, como el intervalo de confianza.","Interpretación","Coeficiente de variación en el rango de","La información que aparece en este cuadro está coloreada de acuerdo con el nivel de cobertura de la variable de diseño (%) usada para seleccionar la muestra, en Alta, Moderada y Baja. Una cobertura Baja requiere un uso cauteloso de la información.","Cobertura de la variable de diseño en el rango de","menor a","Una cobertura Baja requiere un uso cauteloso de la información","Interpretación"];
23    var aTextosEn = ["Export as","Export as PDF","Export as PNG","Options","Federal entity","Municipality","Location","Geographic location","Type of inhabited locality","It's municipal head","Municipal head","National Institute of Statistic and Geography","Mexico in Numbers","Localities","Query date","Download","of","onwards","High","Low","Moderated","Coefficient of variation (CV) in the range of:","Estimate: The estimates shown in this table are colored according to their level of precision, in High, Moderate and Low, taking as reference the coefficient of variation CV (%).","Limit: 90% confidence interval.","Low precision requires a cautious use of estimation in which the causes of high variability are analyzed and other indicators of precision and reliability, such as the confidence interval, are considered.","Interpretation","Coefficient of variation in the range of","The information in this table is colored according to the level of coverage of the design variable (%) used to select the sample, into High, Moderate and Low. Low coverage requires a cautious use of the information.","Coverage of the design variable in the range of","less than","Low coverage requires cautious use of information","Interpretation"];
24    // var posTexto = aTextosEs.indexOf(texto)
25    
26    // return (parametros.idioma == "es")? aTextosEs[posTexto] : aTextosEn[posTexto]  
27    // return (parametros.idioma == "es")? aTextosEs.filter((e,idx) => { return texto === e? index : -1})[0] : aTextosEn[posTexto]  
28    var posTexto = aTextosEs.findIndex((e) => { return e === texto})
29    // console.log(posTexto);
30    if(parametros.idioma == "es"){
31        return aTextosEs[posTexto]
32    } else {
33        return aTextosEn[posTexto]
34        
35    }
36}
37
38// Objeto gestor de Cobertura para cuadro #8
39// fecha 17-11-2022
40var oCriteriosCobertura = {
41    check: function(data){
42        var oCob = data.coverage_design && data.coverage_design != null? data.coverage_design[0] : null;
43        return oCob;
44    },
45    getColor: function(valor, oCobertura){
46        var valorNumerico = parseFloat(valor);
47        // if(valorNumerico >= oCobertura.LIMITE_INFERIOR && valorNumerico <= oCobertura.LIMITE_SUPERIOR){
48        if(valorNumerico != "" && valorNumerico != null){
49            return oCobertura.COLOR;
50        }        
51        return "";
52    }
53}
54
55// Objeto gestor de datos de precision para cuadro #precision
56// fecha 14-02-2023
57var oCriteriosPrecision = {
58    check: function(data){
59        var oCob = data.precision_rule && data.precision_rule != null? data.precision_rule : null;
60        return oCob;
61    },
62    getColorTooltip: function(valor, oPrecision, parametros){
63        // console.log(valor)
64        // console.log(oPrecision)
65        
66        var valorNumerico = parseFloat(valor);
67        var oRangoAlta = oPrecision.filter((r) => {return r.descripcion === "Alta"})[0];
68        var oRangoModerada = oPrecision.filter((r) => {return r.descripcion === "Moderada"})[0];
69        var oRangoBaja = oPrecision.filter((r) => {return r.descripcion === "Baja"})[0];
70
71        if(oRangoAlta.descripcion === "Alta" && valorNumerico >= parseInt(oRangoAlta.limite_inferior) && valorNumerico < parseInt(oRangoAlta.limite_superior)){ // Alta
72            return {color:oRangoAlta.color, tooltip:getTraductorCuadro(p
72arametros, "Alta")+": "+ getTraductorCuadro(parametros, "Coeficiente de variación en el rango de") +" ("+oRangoAlta.limite_inferior+"%, "+oRangoAlta.limite_superior+"%)"};
73
74        } else if(oRangoModerada.descripcion === "Moderada" && valorNumerico >= parseInt(oRangoModerada.limite_inferior) && valorNumerico < parseInt(oRangoModerada.limite_superior)){ // Moderada
75            return {color:oRangoModerada.color, tooltip:getTraductorCuadro(parametros, "Moderada")+": "+ getTraductorCuadro(parametros, "Coeficiente de variación en el rango de") +" ("+oRangoModerada.limite_inferior+"%, "+oRangoModerada.limite_superior+"%)"};
76
77        } else if(oRangoBaja.descripcion === "Baja" && valorNumerico >= parseInt(oRangoBaja.limite_inferior) && valorNumerico <= parseInt(oRangoBaja.limite_superior)){ // Baja
78            return {color:oRangoBaja.color, tooltip:getTraductorCuadro(parametros, "Baja")+": "+ getTraductorCuadro(parametros, "Coeficiente de variación en el rango de") +" ("+oRangoBaja.limite_inferior+"%, "+oRangoBaja.limite_superior+"%)"};
79        }
80        return "transparent";
81    },
82    getLimites: function(oPrecision){
83        var oRangoAlta = oPrecision.filter((r) => {return r.descripcion === "Alta"})[0];
84        var oRangoModerada = oPrecision.filter((r) => {return r.descripcion === "Moderada"})[0];
85        var oRangoBaja = oPrecision.filter((r) => {return r.descripcion === "Baja"})[0];
86        return {
87            Alta:oRangoAlta,
88            Moderada:oRangoModerada,
89            Baja:oRangoBaja,
90        }
91    }
92}
93
94//////////// OBJETO MESES PARA LA CONVERSION DE PERIODOS DE NUMERO A STRING
95//////////// Agregado: 27-04-2018 01:27 pm
96//////////// Autor: @rovalx
97var oMESES = {
98    listEs: ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"],
99    listEn: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "Octuber", "November", "December"],
100    getMesNombre: function (mesNumero, idioma) {
101        var mes = ((typeof mesNumero === "string") ? parseInt(mesNumero) : mesNumero);
102        if (idioma === undefined || idioma === "es") {  
103            return this.listEs[mesNumero - 1];
104        } else {
105            return this.listEn[mesNumero - 1];
106        }
107    },
108    getMesNombreCorto: function (mesNumero, idioma) {
109        var mes = ((typeof mesNumero === "string") ? parseInt(mesNumero) : mesNumero);
110        if (idioma === undefined || idioma === "es") {
111            return (mesNumero !== undefined) ? this.listEs[mesNumero - 1].substr(0, 3) : "";
112        } else {
113            return (mesNumero !== undefined) ? this.listEn[mesNumero - 1].substr(0, 3) : "";
114        }
115    },
116    getFormatoPeriodo: function (periodo, frecuencia, idioma, formato) { // formato = [1 = largo, 2 = corto]
117        var ft = "";
118        var formato = formato === undefined ? 1 : formato;
119        if (frecuencia === "Trimestral" || frecuencia === "Quarterly") {
120            var anio = periodo.split("/")[0];
121            var mes = periodo.split("/")[1];
122            
123            switch (mes) {
124                case "01": ft = (formato === 1) ? anio + " 1T" : "1T"; break;
125                case "02": ft = (formato === 1) ? anio + " 2T" : "2T"; break;
126                case "03": ft = (formato === 1) ? anio + " 3T" : "3T"; break;
127                case "04": ft = (formato === 1) ? anio + " 4T" : "4T"; break;
128            }
129        } else if (frecuencia === "Bienal" || frecuencia === "No establecida" 
130                || frecuencia === "Biennial" || frecuencia === "Not established") { // ES UN AÑO
131            ft = periodo;
132            
133        } else if (frecuencia === "Mensual" || frecuencia === "Monthly") {
134            var anio = periodo.split("/")[0];
135            var mes = this.getMesNombreCorto(periodo.split("/")[1], idioma);
136            ft = (formato === 1) ? (anio + " " + mes) : mes;
137            
138        } else if (frecuencia === "Período único") { // tal cual biene
139            ft = periodo;
140        } else if (frecuencia === "Anual" || frecuencia === "Quinquenal" || frecuencia == "Decenal" || frecuencia == "Decennial"
141                || frecuencia === "Annual" || frecuencia === "Quinquennial") {
142            ft = periodo;
143        } else if (frecuencia == "Quincenal" || frecuencia === "Biweekly") { // llega quincena en formato AAAA/mm/quincena > 2017/02/01 (primer quincena)
144            var anio = (periodo.indexOf("/") !== -1) ? periodo.split("/")[0] : periodo;
145            var mes = (periodo.indexOf("/") !== -1) ? parseInt(periodo.split("/")[1]) : "";
146            var quincena = (periodo.indexOf("/") !== -1) ? periodo.split("/")[2] : "";
147            var m = "", q = "";
148            if (periodo.split("/")[1] !== undefined) {
149                if (idioma === undefined || idioma === "es") {
150                    m = (mes !== undefined) ? this.listEs[mes - 1].substr(0, 3) : "";
151                } else {
152                    m = (mes !== undefined) ? this.listEn[mes - 1].substr(0, 3) : "";
153                }
154            }
155            switch (quincena) {
156                case "01": q = ((idioma === undefined || idioma === "es") ? "Q" : "H") + "1"; break;
157                case "02": q = ((idioma === undefined || idioma === "es") ? "Q" : "H") + "2"; break;
158                default: q = ""; break;
159            }
160            ft = (anio + " " + m + " " + q);
161
162            /**ESO ES POR SI EL AJUSTE DE SERGIO SI APLICA, EL LO VA A REVISAR (15/5/2025)
163              else if (frecuencia == "Quincenal" || frecuencia === "Biweekly") { // llega quincena en formato AAAA/quincena > 2024/01 (primer quincena)
164            var anio = (periodo.indexOf("/") !== -1) ? periodo.split("/")[0] : periodo;
165            var quincena = (periodo.indexOf("/") !== -1) ? parseInt(periodo.split("/")[1]) : "";
166            // var quincena = (periodo.indexOf("/") !== -1) ? periodo.split("/")[2] : "";
167            var m = "", q = "";
168            if (periodo.split("/")[1] !== undefined) {
169                if (idioma === undefined || idioma === "es") {
170                    m = (mes !== undefined) ? this.listEs[mes - 1].substring(0, 3) : "";
171                } else {
172                    m = (mes !== undefined) ? this.listEn[mes - 1].substring(0, 3) : "";
173                }
174            }
175            // switch (quincena) {
176            //     case "01": q = ((idioma === undefined || idioma === "es") ? "Q" : "H") + "1"; break;
177            //     case "02": q = ((idioma === undefined || idioma === "es") ? "Q" : "H") + "2"; break;
178            //     default: q = ""; break;
179            // }
180            ft = (anio + " " + quincena + "-");
181            if(quincena !== undefined && quincena !== null && quincena !== ""){
182                ft = (anio + " " + quincena + ((idioma === undefined || idioma === "es") ? "Q" : "H"));
183            }
184            
185        }
186             */
187
188            
189        } else { // otro default
190            ft = periodo;
191        }
192        return ft;
193    }
194}
195function getDateF2() {
196    var today = new Date();
197    var dd = today.getDate();
198    var mm = today.getMonth() + 1; //January is 0!
199    var yyyy = today.getFullYear();
200    Number.prototype.padLeft = function (base, chr) {
201        var len = (String(base || 10).length - String(this).length) + 1;
202        return len > 0 ? new Array(len).join(chr || '0') + this : this;
203    }
204    var hh = today.getHours().padLeft();
205    var nn = today.getMinutes().padLeft();
206    var ss = today.getSeconds().padLeft();
207
208    if (dd < 10) {
209        dd = '0' + dd
210    }
211    if (mm < 10) {
212        mm = '0' + mm
213    }
214    var today = yyyy +""+ dd +""+ mm +""+ hh + nn + ss;
215    var todayFormat = dd +"/"+mm+"/"+yyyy+" "+hh+":"+nn+":"+ss
216
217    return {today,todayFormat};
218
219}
220/**
221 * Metodo que registra los eventos del componente
222 * @param nombre_componente // Nombre del componente 
223 * @param caso // tipo de gráfica / cuadro / vista turista
224 * @param parametros // parametros de configuracion del componente 
225 */
226window.INEGIAnalytics = window.INEGIAnalytics === null || window.INEGIAnalytics === undefined? {registro: function(nombre_evento, caso, parametros){
227    if(typeof gtag == 'function'){
228        gtag('event', nombre_evento, {
229            'caso': caso,
230            'parametros': JSON.stringify(parametros),
231            'url': window.location.href        
232        }); 
233    }
234}} : window.INEGIAnalytics; 
235/// <summary>   Invoca componente de cuadro. </summary>
236///
237/// <remarks>   ARMANDO.ORTIZV, 23/11/2016. </remarks>
238///
239/// <param name="parametros">       Objeto de parametros de javascript. </param>
240/// <param name="contenedorCuadro"> Nombre del elemento contenedor. </param>
241///
242/// <returns>   . </returns>
243CuadroComponente.prototype.GeneraCuadro = function (parametros, contenedorCuadro) {
244    //this.CallService(parametros, contenedorCuadro);
245    // ultima modificación: 19-03-2019 se añade cargador dinamico de recursos / librerias css y js
246    configura(null).init();
247    INEGIAnalytics.registro("BI_componente_cuadros", parametros.tipoCuadro, parametros)   
248    
249    // API_V = "v1_3"; // borrar demo apra pruebas del cambio de catalogoareageografica    
250    var _this = this;
251    if (typeof Mura === "function" && Mura !== undefined) {
252        var fUrls = [];
253        var fUrlsCss = [];
254        var scripts = document.getElementsByTagName('head')[0];
255
256        function scriptLoaded(name){
257            let aHead = scripts.children;
258            let loaded = false;
259            for(var x= 0; x < aHead.length; x++){
260                if(aHead[x].src !== undefined){
261                    if(aHead[x].src.indexOf(name) > -1){ loaded = true; break;} //else { loaded = false; break;} 
262                }
263            }
264            return loaded;
265        }
266        for (var x = 0; x < aDependencias.length; x++) {            
267            if (aDependencias[x].active) {
268                if(aDependencias[x].type === "js"){
269                    if(aDependencias[x].path.indexOf("ext-all.js") > -1){ // si se esta invocando un cuadro que utiliza extjs
270                        if(parametros.gc && parametros.gc !== undefined){ // para los casos del # 2 y del #7 que pueden ser cuadros normales o de extjs
271                            // console.log("> Carga libreria extall")
272                            fUrls.push(C_dominioBuscador + aDependencias[x].path)                    
273                        }
274                    } else {
275                        var nombre = aDependencias[x].path.split("/")[aDependencias[x].path.split("/").length-1];
276                        if(scriptLoaded(nombre) === false){
277                            fUrls.push(C_dominioBuscador + aDependencias[x].path)
278                        }
279                    }
280                } else {
281                    fUrlsCss.push(C_dominioBuscador + aDependencias[x].path)
282                }
283            }
284        }
285        Mura.loader().loadcss(fUrlsCss); // Carga los recursos css del componente
286        Mura.loader()
287        .loadjs(fUrls,
288            function () {
289                _this.CallService(parametros, contenedorCuadro);
290                
291            }
292            )
293        } else {
294            this.CallService(parametros, contenedorCuadro);
295            
296        }
297        
298    }
299    
300    /// <summary>   Carga parametros desde la Url de la pagina. </summary>
301    ///
302    /// <remarks>   ARMANDO.ORTIZV, 23/11/2016. </remarks>
303    ///
304    /// <returns>   . </returns>
305    CuadroComponente.prototype.LeeURL = function () {
306        var parametros = this.LeerValores();
307        return parametros;
308    }
309    $('.dropdown.keep-open').on({
310        "shown.bs.dropdown": function () { this.closable = false; },
311        "click": function () { this.closable = true; },
312        "hide.bs.dropdown": function () { return this.closable; }
313    });
314    
315    /// <summary>   Cambia periodos del cuadro cuando cambian los combos de periodos. </summary>
316    ///
317    /// <remarks>   ARMANDO.ORTIZV, 23/11/2016. </remarks>
318    ///
319    /// <param name="cdata">        Configuracion del cuadro en JSON. </param>
320    /// <param name="container">    Elemento contenedor. </param>
321    ///
322    /// <returns>   . </returns>
323    changeComboCuadroEventCuadroComponente = function (cdata, container) {
324        cdata.pi = document.getElementById("cmbPI" + container).value;
325        cdata.pf = document.getElementById("cmbPF" + container).value;
326        if (parseInt(cdata.pi) <= parseInt(cdata.pf)) {
327            cdata.mcch = "true";
328            var cdChange = new CuadroComponente();
329            cdChange.GeneraCuadro(cdata, container);
330        }
331        else {
332            var mensajeAlerta = (cdata.lang == "en") ? "Last year must be same or greater than first year" : "El último año debe ser igual o mayor que el primero";
333            window.alert(mensajeAlerta);
334        }
335        
336    }
337    
338    /// <summary>   Cambia periodo del cuadro cuando cambia el filtro. </summary>
339    ///
340    /// <remarks>   jose.valles, 09/04/2018. </remarks>
341    ///
342    /// <param name="cdata">        Configuracion del cuadro en JSON. </param>
343    /// <param name="container">    Elemento contenedor. </param>
344    ///
345    /// <returns>   . </returns>
346    eventChangeFiltroCuadro = function (cdata, container) {
347        cdata.pf = document.getElementById("cmbPeriodoFiltro" + container).value;
348        cdata.pi = document.getElementById("cmbPeriodoFiltro" + container).value;
349        //cdata.mcch = "true";
350        var cdChange = new CuadroComponente();
351        cdChange.GeneraCuadro(cdata, container);
352    }
353    
354    /// <summary>   Definicion de la clase. </summary>
355    ///
356    /// <remaarks>   ARMANDO.ORTIZV, 23/11/2016. </remaarks>
357    ///
358    /// <returns>   . </returns>
359    function CuadroComponente() {
360        var fecha = "";        
361        /// <summary>   Version y cambios del componentes. </summary>
362        ///
363        /// <remarks>   ARMANDO.ORTIZV, 23/11/2016. </remarks>
364        ///
365        /// <returns>   . </returns>
366        About = function () {
367            fecha = "29.05.2017";
368            modificacion = "23.09.2026";        
369            penultimocambio = "[Corrección] SCITEL para el grupo 1 y 3 las claves de las caracteristicas tenian espacio al final de la cadena, se aplica una limpieza de espacios vacios usando trim()";
370            ultimocambio = "[Ajuste] - Cuadro precisión por el caso de Población total, se cambia el texto temporalmente de 'Límite: Intervalo de confianza al 95%.' por 'Límite: Intervalo de confianza al 90%.'. Se pretende hacer dinámico";
371        }
372        
373        /// <summary>   Implementa busqueda en un array. </summary>
374        ///
375        /// <remarks>   ARMANDO.ORTIZV, 23/11/2016. </remarks>
376        ///
377        /// <param name="obj">      Objeto buscado. </param>
378        /// <param name="start">    Indice de busqueda. </param>
379        ///
380        /// <returns>   . </returns>
381        Array.prototype.indexOf = function (obj, start) {
382            for (var i = (start || 0), j = this.length; i < j; i++) {
383                if (this[i] === obj) { return i; }
384            }
385            return -1;
386        }
387        
388        /// <summary>   Filtra un objeto por atributo en un array de objetos. </summary>
389        ///
390        /// <remarks>   ARMANDO.ORTIZV, 23/11/2016. </remarks>
391        ///
392        /// <param name="fun">  Propiedad buscada en el filtro. </param>
393        ///
394        /// <returns>   . </returns>
395        Array.prototype.filter = function (fun /*, thisp */) {
396            "use strict";
397            
398            if (this === void 0 || this === null)
399            throw new TypeError();
400            
401            var t = Object(this);
402            var len = t.length >>> 0;
403            if (typeof fun !== "function")
404            throw new TypeError();
405            
406            var res = [];
407            var thisp = arguments[1];
408            for (var i = 0; i < len; i++) {
409                if (i in t) {
410                    var val = t[i]; // in case fun mutates this
411                    if (fun.call(thisp, val, i, t))
412                    res.push(val);
413                }
414            }
415            
416            return res;
417        };
418        
419        /// <summary>   Obtiene la cadena de parametros que tiene la URL. </summary>
420        var QueryString = function () {
421            var query_string = {};
422            var query = window.location.search.substring(1);
423            var vars = query.split("&");
424            for (var i = 0; i < vars.length; i++) {
425                var pair = vars[i].split("=");
426                // If first entry with this name
427                if (typeof query_string[pair[0]] === "undefined") {
428                    query_string[pair[0]] = pair[1];
429                    // If second entry with this name
430                } else if (typeof query_string[pair[0]] === "string") {
431                    var arr = [query_string[pair[0]], pair[1]];
432                    query_string[pair[0]] = arr;
433                    // If third or later entry with this name
434                } else {
435                    query_string[pair[0]].push(pair[1]);
436                }
437            }
438            return query_string;
439        }();
440
441        //Polyfill after for IE 9+ (Agregado: 09-10-2020)
442        (function(x){
443            var o=x.prototype;
444            o.after||(o.after=function(){var e,m=arguments,l=m.length,i=0,t=this,p=t.parentNode,n=Node,s=String,d=document;if(p!==null){while(i<l){((e=m[i]) instanceof n)?(((t=t.nextSibling )!==null)?p.insertBefore(e,t):p.appendChild(e)):p.appendChild(d.createTextNode(s(e)));++i;}}});
445           }(Element)); 
446        
447        /// <summary>   Agrega elemento TBody en una tabla generada dinamicamente. </summary>
448        ///
449        /// <remarks>   ARMANDO.ORTIZV, 23/11/2016. </remarks>
450        ///
451        /// <param name="tbody">    Elemento tbody. </param>
452        /// <param name="html">     Html del cuerpo de la tabla. </param>
453        ///
454        /// <returns>   . </returns>
455        function setTBodyInnerHTML(tbody, html) {
456            var temp = tbody.ownerDocument.createElement('div');
457            temp.innerHTML = '<table>' + html + '</table>';
458            
459            tbody.parentNode.replaceChild(temp.firstChild.firstChild, tbody);
460        }
461        /**
462         * revisaHerramienta: Verificacion de indicadores x herramienta
463         * @param parametros [parametros.herr]
464         * @modificacion 25-07-2024
465         */
466        this.herramienta = null;
467        this.revisaHerramienta = function(parametros, callback){   
468            if(API_V === "v1_3" && parametros.tematica !== "0" && parametros.tematica !== "null" && parametros.tematica !== null && parametros.tematica !== ""){    // Solo aplica cuando tematica diferente de 0 y api == 1.3   
469                if(typeof catalogoHerramientas !== "undefined"){          
470                    // 2 maneras de configurar la herramienta
471                    // 1 - usando el parametro "herr" asignando el valor de la herramienta
472                    // 2 - Dejando que el componente en automatico lo determine
473                    var h = parametros.herr;
474                    var ubicacionComponente = "";
475                    var nombreHerramienta = "";
476                    aListaHerramientas = catalogoHerramientas;
477                /*  aListaHerramientas = [
478                        {id:205, nombre:"areasgeograficas"}, // mexico en cifras
479                        {id:6, nombre:"indicadores"}, // banco de indicadores
480                        {id:406, nombre:"temas"} // temas
481                    ] */
482                    var localhost = window.location.hostname.indexOf("localhost"); // original
483                    
484                    if(localhost === -1){ // si no es localhost             
485                    
486                        ubicacionComponente = window.location.pathname.split("/"); // original
487                        /// >>> Posibilidades esperadas segun la url
488                        //  ['', 'temas', 'estructura', '']
489                        //  ['', 'app', 'indicadores', '']
490                        //  ['', 'app', 'areasgeograficas', '']
491                        
492                        if(h === "" || h === "null" || h === null){ // si no se paso parámetro herr desde 
492configuración, obtiene herramienta segun la url donde se encuentre
493        
494                            switch(ubicacionComponente[1]){
495                                case "temas": 
496                                case "temas3": 
497                                    nombreHerramienta = ubicacionComponente[1]
498                                break;
499                                default:
500                                    nombreHerramienta = "";
501                                break;
502                                // case "app":
503                                //     nombreHerramienta = ubicacionComponente[2]                                
504                                // break;
505                            }
506                            if(nombreHerramienta === ""){ // significa que aun no esta activa para validación y pasa normal
507                                this.herramienta = {validar:false};
508
509                            } else {
510                                this.herramienta = aListaHerramientas.find(function(d){
511                                    return d.nombre.includes(nombreHerramienta); 
512                                })
513                                if(this.herramienta === undefined) this.herramienta = {validar:false};
514                            }
515                            // lo busca segun la url en la que se encuentra
516                           
517                        } else { // de lo contrario busca en la lista con el parámetro herr
518                            
519                            this.herramienta = aListaHerramientas.find(function(d){
520                                return d.id === parseInt(h); 
521                            })
522                        }
523                        // si no se definio ninguna herramienta entonces lanza un mensaje de error
524                        // if(this.herramienta === undefined) { console.error("[Para cuadro #"+ parametros.tipoCuadro +" - id:"+ parametros.contenedorCuadro +"] La herramienta no se encontro en el catalogo o no existe"); return;}
525        
526                        // si si existe la herramienta en el catalogo pero validar = false entonces se lo salta ya que no aplica por el momento para esa aplicación
527                        if(this.herramienta.validar){
528                            var promesa = this.requestHerramienta(parametros, this.herramienta, "POST")
529                            promesa.then((response) => {
530                                return response.json()
531                            }).then((data) => {
532                                var IndicadoresHerramientasAplica = data.find((e) => {
533                                    return e.aplica === false;
534                                })
535                                // si existe por lo menos un indicador que no aplica, entonces detenemos la ejecucion y mostramos mensaje en pantalla
536                                if(IndicadoresHerramientasAplica !== undefined){
537                                    var lblMensaje = document.getElementById("lblMensaje" + parametros.contenedorCuadro);
538                                    OcultaCarga(parametros);
539                                    lblMensaje.innerHTML = "No hay datos para mostrar";
540                                        console.group("No se puede mostrar el cuadro por que 1 o mas indicadores no aplican para la herramienta: "+this.herramienta.id)
541                                        console.log(data)
542                                        console.groupEnd()
543                                    lblMensaje.style.display = "";
544                                    if(parametros.callback !== null) parametros.callback()
545                                } else {
546                                    // en caso contrario continuamos normal
547                                    callback()
548                                }
549                            })
550                        } else {
551                            callback();
552                        }
553                        // Request API
554        
555                    } else {
556                        console.info("> verifica Herramienta en Localhost")
557                        
558                        if(h === "null" || h === null || h === "") h = 0; // si no se paso el parámetro de herr
559        
560                        if(h > 0){ // si h llega con un valor diferente de 0
561        
562                            // busca la herramienta dentro de la lista catalogo de herramientas
563                            this.herramienta = aListaHerramientas.find(function(d){
564                                return d.id === parseInt(h); 
565                            })
566                            if(this.herramienta === undefined) { console.error("[Para cuadro #"+ parametros.tipoCuadro +" - id:"+ parametros.contenedorCuadro +"] La herramienta no se encontro en el catalogo o no existe"); return;}
567                            
568                            // si si existe la herramienta en el catalogo pero validar = false entonces se lo salta ya que no aplica por el momento para esa aplicación
569                            if(!this.herramienta.validar){
570                                // realiza la petición GET
571                                var promesa = this.requestHerramienta(parametros, this.herramienta, "GET")
572                                promesa.then((response) => {
573                                    return response.json()
574                                }).then((data) => {                       
575                                    // validamos si algun indicador no aplica y detenemos la ejecucion mostrando un mensje en pantalla
576                                    var IndicadoresHerramientasAplica = data.find((e) => {
577                                        return e.aplica === false;
578                                    })
579                                    // si existe por lo menos un indicador que no aplica, entonces detenemos la ejecucion y mostramos mensaje en pantalla
580                                    if(IndicadoresHerramientasAplica !== undefined){                        
581                                        var lblMensaje = document.getElementById("lblMensaje" + parametros.contenedorCuadro);
582                                        OcultaCarga(parametros);
583                                        lblMensaje.innerHTML = "No hay datos para mostrar";
584                                            console.group("No se puede mostrar el cuadro por que 1 o mas indicadores no aplican para la herramienta: "+this.herramienta.id)
585                                            console.log("Cuadro #"+parametros.tipoCuadro+" id:"+parametros.contenedorCuadro)
586                                            console.log(data)
587                                            console.groupEnd()
588                                        lblMensaje.style.display = "";
589                                        if(parametros.callback !== null) parametros.callback()
590                                    } else {
591                                        callback()
592                                    }
593                                })
594                            } else {
595                                callback()
596                            }
597                        } else { // solo en localhost y h === 0 entonces se brinca la verificacion de indicadores
598                            callback();
599                        } 
600                            
601                    }   
602                } else {
603                    callback();
604                }
605            } else { // si el API_V < 1.3 entonces no realiza verificación de indicadores por herramienta
606                callback()
607            }     
608        }
609        // Llamado al Api de ValidaIndicadorxHerramientaGET / ValidaIndicadorxHerramienta
610        this.requestHerramienta = function(parametros, h, method){
611            
612            if(typeof parametros.indicadorDepurado === "object"){
613                // sIndicadores = parametros.indicadorDepurado.map((i) => { return i.indicador; }).join(",")
614                sIndicadores = parametros.indicadorDepurado.filter((i) => { return i.tematica !== 0; }).map((i) => { return i.indicador; }).join(",")
615
616            } else {
617                sIndicadores = parametros.indicadorDepurado;
618            }            
619            var direccionServicio = C_direccionServicio_V + "_" + API_V.toLowerCase() + extension_api_cuadros;
620            var url = "";
621            if(method === "GET"){
622                url = direccionServicio + "/ValidaIndicadorxHerramientaGET/"+sIndicadores+"/"+ h.id +"/"+parametros.tematica+"/json/"+parametros.token
623                return  fetch(url,{method:"GET"}, function(d){ return d})
624
625            } else { // POST
626                url = direccionServicio + "/ValidaIndicadorxHerramienta"
627                var bodyParametros = {    
628                    "indicadores": sIndicadores
629                    ,"herramienta": h.id
630                    ,"tematica": parametros.tematica
631                    ,"formato": "json"
632                    ,"token": parametros.token
633                }
634                return  fetch(url,{method:"POST",body:JSON.stringify(bodyParametros),headers:{"Content-type":"application/json; charset=UTF-8"}}, function(d){ return d})
635            }
636        }
637        
638        /// <summary>   Lee objeto de parametros e inicializa todas las variables. </summary>
639        ///
640        /// <remarks>   ARMANDO.ORTIZV, 23/11/2016. </remarks>
641        ///
642        /// <param name="parametrosExternos">   Objeto de parametros externos. </param>
643        ///
644        /// <returns>   . </returns>
645        this.CargarParametros = function (parametrosExternos) {
646            
647            var parametros = {};
648            parametros.indicator = !Array.isArray(parametrosExternos.ind) ? decodeURIComponent(EvaluaParametro(parametrosExternos.ind, "")) : parametrosExternos.ind;
649            parametros.areaGeografica = decodeURIComponent(EvaluaParametro(parametrosExternos.ag, "0"));
650            parametros.tipoCuadro = decodeURIComponent(EvaluaParametro(parametrosExternos.tc, ""));
651            
652            
653            parametros.nombreCorto = decodeURIComponent(EvaluaParametro(parametrosExternos.mnc, "null"));
654            // 26-10-2018 3:31 pm ( Propiedad original de Grafica componente pero se ajusta para cuadro cuando se utilice en vista turista)
655            parametros.nombresCategoriasFijas = decodeURIComponent(EvaluaParametro(parametrosExternos.nca, ""));
656            parametros.titulo = decodeURIComponent(EvaluaParametro(parametrosExternos.t, ""));
657            
658            //   parametros.notaParametro = decodeURIComponent(EvaluaParametro(parametrosExternos.nc, ""));
659            
660            parametros.notaParametro = decodeURIComponent(EvaluaParametro(parametrosExternos.na, ""));
661            parametros.muestraNota = decodeURIComponent(EvaluaParametro(parametrosExternos.mn, "true"));
662            parametros.muestraFuente = decodeURIComponent(EvaluaParametro(parametrosExternos.mf, "true"));
663            
664            
665            // parametros.muestraShare = decodeURIComponent(EvaluaParametro(parametrosExternos.sh, "0"));
666            
667            parametros.colorHeader = decodeURIComponent(EvaluaParametro(parametrosExternos.ch, "white"));
668            parametros.titulosColumnas = decodeURIComponent(EvaluaParametro(parametrosExternos.tcl, ""));
669            parametros.fechaInicio = decodeURIComponent(EvaluaParametro(parametrosExternos.pi, "null"));
670            parametros.fechaFin = decodeURIComponent(EvaluaParametro(parametrosExternos.pf, "null"));
671            parametros.subtitulo = decodeURIComponent(EvaluaParametro(parametrosExternos.st, ""));
672            parametros.subtituloSegundo = decodeURIComponent(EvaluaParametro(parametrosExternos.st2, ""));
673            parametros.tituloColumnaPrincipal = decodeURIComponent(EvaluaParametro(parametrosExternos.tcp, ""));
674            parametros.mostrarUnidad = decodeURIComponent(EvaluaParametro(parametrosExternos.mu, "false"));
675            parametros.estiloCuadro = decodeURIComponent(EvaluaParametro(parametrosExternos.ec, "1"));
676            parametros.datoOportunoParametro = decodeURIComponent(EvaluaParametro(parametrosExternos.dop, "null"));
677            parametros.mostrarFuentePersonalizada = decodeURIComponent(EvaluaParametro(parametrosExternos.mfp, ""));
678            parametros.cantidadPeriodos = decodeURIComponent(EvaluaParametro(parametrosExternos.cnp, "0"));
679            parametros.tabInd = decodeURIComponent(EvaluaParametro(parametrosExternos.ti, 5000));
680            parametros.mostrarCifraEstatus = decodeURIComponent(EvaluaParametro(parametrosExternos.mce, "false"));
681            parametros.idioma = decodeURIComponent(EvaluaParametro(parametrosExternos.lang, "es"));
682            parametros.orden = decodeURIComponent(EvaluaParametro(parametrosExternos.ord, "null"));
683            parametros.mostrarCombosPeriodos = decodeURIComponent(EvaluaParametro(parametrosExternos.mcp, "false"));
684            parametros.mostrarCombosChange = decodeURIComponent(EvaluaParametro(parametrosExternos.mcch, "false"));
685            parametros.mostrarFiltroPeriodo = decodeURIComponent(EvaluaParametro(parametrosExternos.mfpu, "false")); // agregado el 09-04-2018 1:06 pm
686            parametros.mostrarSiglaExcepcion = decodeURIComponent(EvaluaParametro(parametrosExternos.mse, "false"));
687            parametros.condicionNota = decodeURIComponent(EvaluaParametro(parametrosExternos.cnt, "ambas"));
688            parametros.textoOriginal = decodeURIComponent(EvaluaParametro(parametrosExternos.to, "false"));
689            parametros.omitevalorseriecero = decodeURIComponent(EvaluaParametro(parametrosExternos.oc, "false"));
690            parametros.grid_configuracion = EvaluaParametro(parametrosExternos.gc, null);
691            parametros.herramientas = EvaluaParametro(parametrosExternos.tools, ""); // valores: "bus|pag|ord|inf" agregado: 20-sept-2018
692            parametros.D3Enabled = decodeURIComponent(EvaluaParametro(parametrosExternos.d3, "false")); // agregado 21-01-2019 para la conexion con SDMX solamente un caso especifico
693            parametros.pivotear = decodeURIComponent(EvaluaParametro(parametrosExternos.piv, "false")); // solo para el caso 7 con agrupacion de indicadores con texto fijo
694            parametros.tema = decodeURIComponent(EvaluaParametro(parametrosExternos.tema, "")); // parametro para el caso de SDMX con d3 (D3Enabled); TEMA
695            parametros.fue = decodeURIComponent(EvaluaParametro(parametrosExternos.fue, "")); // parametro para el caso de SDMX con d3 (D3Enabled); FUENTE
696            parametros.ni = decodeURIComponent(EvaluaParametro(parametrosExternos.ni, "")); // parametro para el caso de SDMX con d3 (D3Enabled); NOTAS
697            parametros.obj = decodeURIComponent(EvaluaParametro(parametrosExternos.obj, "")); // parametro para el caso de SDMX con d3 (D3Enabled); OBJETIVO ODS
698            parametros.met = decodeURIComponent(EvaluaParametro(parametrosExternos.met, "")); // parametro para el caso de SDMX con d3 (D3Enabled); META ODS
699            parametros.frec = decodeURIComponent(EvaluaParametro(parametrosExternos.frec, "")); // parametro para el caso de SDMX con d3 (D3Enabled); FRECUENCIA ODS
700            parametros.desc = decodeURIComponent(EvaluaParametro(parametrosExternos.desc, "")); // parametro para el caso de SDMX con d3 (D3Enabled); DESCRIPCION INDICADOR ODS        
701            parametros.callback = parametrosExternos.callback? parametrosExternos.callback : null; 
702            parametros.tematica = decodeURIComponent(EvaluaParametro(parametrosExternos.tematica, "")); // Solo API V2 - Tematica para todos los metodos del api (agregado 30 abril 2019)
703            parametros.secc = decodeURIComponent(EvaluaParametro(parametrosExternos.secc, "1")); // 05-08-2019 Secciones / cuadro 18 / localidades // 1 = los 2 primeros cuadros, 2 = el resto de información, 3, 4, 5
704            parametros.modoVisualizacionLocalidades = decodeURIComponent(EvaluaParametro(parametrosExternos.mvloc, "1")); // 13-05-2020 cuadro 18 / mvloc = 1 (secciones colapsables), mvloc = 2 (pestañas navegables)
705            parametros.areaLocalidad = EvaluaParametro(parametrosExternos.arealoc, null); // 05-07-2024 cuadro 18 / area localidad mexico para ficha localidad de mexico en cifras
706            parametros.periodoLocalidad = EvaluaParametro(parametrosExternos.periodoloc, null); // 05-07-2024 cuadro 18 / periodo localidad mexico para ficha localidad de mexico en cifras
707            parametros.versionLocalidad = EvaluaParametro(parametrosExternos.versionloc, null); // 05-07-2024 cuadro 18 / version localidad mexico para ficha localidad de mexico en cifras
708            parametros.herr = decodeURIComponent(EvaluaParametro(parametrosExternos.herr, null)); // 09-08-2023 id herramienta opcional para setHerramienta
709            //parametros.idTema = decodeURIComponent(EvaluaParametro(parametrosExternos.idtema, null)); // DEPRECATED DATE 14-02-2023 ----- creado 15-06-2021 cuadro precision / identificador del tema a validar en datos de precision y colorear por default es null
710            parametros.mostrarBotonExportacion = EvaluaParametro(parametrosExternos.mbe, true); //28-06-2022 Boton exportación mbe = true (activar) / mbe = false (
710desactivar) 
711            parametros.areaSeleccionada = EvaluaParametro(parametrosExternos.areaSeleccionada, undefined) // 30-01-2025 cuadro 13v2 - entidad seleccionada por parámetro usado por el Buscador
712            parametros.caracteristicas = EvaluaParametro(parametrosExternos.cara, null) // 11-02-2026 Características de localidades (indicadores) para SCITEL grupo 3
713            return parametros;
714        }
715        
716        /// <summary>   Lee parametros desde la url e inicializa todas las variables. </summary>
717        ///
718        /// <remarks>   ARMANDO.ORTIZV, 23/11/2016. </remarks>
719        ///
720        /// <returns>   . </returns>
721        this.LeerValores = function () {
722            var parametros = {};
723            parametros.indicator = decodeURIComponent(EvaluaParametro(QueryString.ind, ""));
724            parametros.areaGeografica = decodeURIComponent(EvaluaParametro(QueryString.ag, "0"));// (hdAreaGeografica.value == "") ? "0" : hdAreaGeografica.value;
725            parametros.tipoCuadro = decodeURIComponent(EvaluaParametro(QueryString.tc, ""));
726            
727            parametros.nombreCorto = decodeURIComponent(EvaluaParametro(QueryString.mnc, "null")); //(hdNombreCorto.value == "") ? "null" : hdNombreCorto.value;
728            // 26-10-2018 3:31 pm ( Propiedad original de Grafica componente pero se ajusta para cuadro cuando se utilice en vista turista)
729            parametros.nombresCategoriasFijas = decodeURIComponent(EvaluaParametro(QueryString.nca, ""));
730            
731            parametros.titulo = decodeURIComponent(EvaluaParametro(QueryString.t, ""));
732            parametros.notaParametro = decodeURIComponent(EvaluaParametro(QueryString.na, ""));
733            parametros.muestraNota = decodeURIComponent(EvaluaParametro(QueryString.mn, "true"));
734            parametros.muestraFuente = decodeURIComponent(EvaluaParametro(QueryString.mf, "true"));
735            
736            // parametros.muestraShare = decodeURIComponent(EvaluaParametro(QueryString.sh, "0"));
737            parametros.colorHeader = decodeURIComponent(EvaluaParametro(QueryString.ch, ""));
738            parametros.titulosColumnas = decodeURIComponent(EvaluaParametro(QueryString.tcl, ""));
739            parametros.fechaInicio = decodeURIComponent(EvaluaParametro(QueryString.pi, "null"));
740            parametros.fechaFin = decodeURIComponent(EvaluaParametro(QueryString.pf, "null"));
741            parametros.subtitulo = decodeURIComponent(EvaluaParametro(QueryString.st, ""));
742            parametros.subtituloSegundo = decodeURIComponent(EvaluaParametro(QueryString.st2, ""));
743            parametros.tituloColumnaPrincipal = decodeURIComponent(EvaluaParametro(QueryString.tcp, ""));
744            parametros.mostrarUnidad = decodeURIComponent(EvaluaParametro(QueryString.mu, "false"));
745            parametros.estiloCuadro = decodeURIComponent(EvaluaParametro(QueryString.ec, "1"));
746            parametros.datoOportunoParametro = decodeURIComponent(EvaluaParametro(QueryString.dop, "null"));
747            parametros.mostrarFuentePersonalizada = decodeURIComponent(EvaluaParametro(QueryString.mfp, ""));
748            parametros.cantidadPeriodos = decodeURIComponent(EvaluaParametro(QueryString.cnp, "0"));
749            parametros.tabInd = decodeURIComponent(EvaluaParametro(QueryString.ti, 5000));
750            parametros.mostrarCifraEstatus = decodeURIComponent(EvaluaParametro(QueryString.mce, "false"));
751            parametros.idioma = decodeURIComponent(EvaluaParametro(QueryString.lang, "es"));
752            parametros.orden = decodeURIComponent(EvaluaParametro(QueryString.ord, "null"));
753            parametros.mostrarCombosPeriodos = decodeURIComponent(EvaluaParametro(QueryString.mcp, "false"));
754            parametros.mostrarFiltroPeriodo = decodeURIComponent(EvaluaParametro(QueryString.mfpu, "false"));  // agregado el 09-04-2018 1:06 pm
755            parametros.mostrarCombosChange = decodeURIComponent(EvaluaParametro(QueryString.mcch, "false"));
756            parametros.mostrarSiglaExcepcion = decodeURIComponent(EvaluaParametro(QueryString.mse, "false"));
757            parametros.condicionNota = decodeURIComponent(EvaluaParametro(QueryString.cnt, "ambas"));
758            parametros.textoOriginal = decodeURIComponent(EvaluaParametro(QueryString.to, "false"));
759            parametros.omitevalorseriecero = decodeURIComponent(EvaluaParametro(QueryString.oc, "false"));
760            parametros.grid_configuracion = EvaluaParametro(parametrosExternos.gc, null);
761            parametros.D3Enabled = EvaluaParametro(parametrosExternos.d3, "false");
762            parametros.pivotear = EvaluaParametro(parametrosExternos.piv, "false");
763            parametros.tema = EvaluaParametro(parametrosExternos.tema, "");
764            parametros.fue = EvaluaParametro(parametrosExternos.fue, "");
765            parametros.ni = EvaluaParametro(parametrosExternos.ni, "");
766            parametros.obj = EvaluaParametro(parametrosExternos.obj, "");
767            parametros.met = EvaluaParametro(parametrosExternos.met, "");
768            parametros.frec = EvaluaParametro(parametrosExternos.frec, "");
769            parametros.desc = EvaluaParametro(parametrosExternos.desc, "");
770            parametros.tematica = EvaluaParametro(parametrosExternos.tematica, ""); // Solo API v2 - Tematica para todos los metodos del api (agregado 30/04/2019)        
771            parametros.secc = EvaluaParametro(parametrosExternos.secc, "1"); // 05-08-2019 cuadro 18 / secciones / 1 = 2 primeros cuadros, 2 = el restos de la información
772            parametros.modoVisualizacionLocalidades = EvaluaParametro(parametrosExternos.mvloc, "1"); // 13-05-2020 cuadro 18 / mvloc = 1 (secciones colapsables), mvloc = 2 (pestañas navegables)
773            parametros.desdeURL = true;
774            parametros.callback = parametrosExternos.callback? parametrosExternos.callback : null;            
775            parametros.mostrarBotonExportacion = EvaluaParametro(QueryString.mbe, true); // 28-06-2022 Mostrar boton exportacion mbe = true / false
776            parametros.herr = EvaluaParametro(parametrosExternos.herr, null); // 09-08-2023 id herramienta opcional para setHerramienta
777            parametros.areaLocalidad = EvaluaParametro(parametrosExternos.arealoc, null); // 05-07-2024 cuadro 18 / area localidad mexico para ficha localidad de mexico en cifras
778            parametros.periodoLocalidad = EvaluaParametro(parametrosExternos.periodoloc, null); // 05-07-2024 cuadro 18 / periodo localidad mexico para ficha localidad de mexico en cifras
779            parametros.versionLocalidad = EvaluaParametro(parametrosExternos.versionloc, null); // 05-07-2024 cuadro 18 / version localidad mexico para ficha localidad de mexico en cifras
780            parametros.areaSeleccionada =  EvaluaParametro(parametrosExternos.areaSeleccionada, undefined) // 30-01-2025 cuadro 13v2 - entidad seleccionada por parámetro usado por el Buscador
781
782            // se deja de usar idtema para datos de precisión hoy 14-02-2023
783            //parametros.idTema = EvaluaParametro(parametrosExternos.idtema, null); // 15-06-2021 cuadro precision / Identificador de tema para validar los datos de precision y colorear
784            
785            return parametros;
786        }
787        
788        /// <summary>   Evalua los parametros y determina si los indicadores son de cuadro compuesto. </summary>
789        ///
790        /// <remarks>   ARMANDO.ORTIZV, 23/11/2016. </remarks>
791        ///
792        /// <param name="indicadorTipo">    Tipo de indicador. </param>
793        /// <param name="tipoCuadro">       Tipo de cuadro. </param>
794        ///
795        /// <returns>   . </returns>
796        this.EvaluaCondicionCuadro = function (indicadorTipo, tipoCuadro, parametros) {  
797            let indicator = parametros.indicator;                  
798            var condicionCuadro = "";
799            if (indicadorTipo == "b" && tipoCuadro == 1 || tipoCuadro == "4") {
800                //indicadorDepurado = indicadorValorCompuesto.todosLosIndicadores;
801                condicionCuadro = "CuadroGruposA";
802            }
803            //if (tipoCuadro == "6" || tipoCuadro == "7" || (tipoCuadro == "12" && !isFinite(String(indicadorTipo)))) {
804            if (tipoCuadro == "6" || tipoCuadro == "7" || tipoCuadro == "14") {
805                condicionCuadro = "CuadroGruposB";
806                 // Esta validacio se agrega para el cuadro 7 cuando solo es un indicador pero que desde api trae los nombres de las datos verticales
807                // Ejemplo: "741927"
808                // 9.11.2025
809                if(tipoCuadro === "7" && indicator.indexOf("|") === -1 && indicator.indexOf("-") === -1){
810                    condicionCuadro = "CuadroNormal";
811                }
812            }
813            if (condicionCuadro == "")
814            condicionCuadro = "CuadroNormal";
815            if (tipoCuadro == "10")
816            condicionCuadro = "CuadroTituloAgrupado";
817            if (tipoCuadro == "13" || tipoCuadro == "13v2") {
818                if (isFinite(String(indicadorTipo)) == true) {
819                    condicionCuadro = "CuadroFichaResumen";
820                } else {
821                    condicionCuadro = "CuadroFichaResumenCompuesta";
822                }
823            }
824            if (tipoCuadro == "12") {
825                // if (!isFinite(String(indicadorTipo))) {
826                    condicionCuadro = "Cuadro12";
827                // } else {
828                    // condicionCuadro = "CuadroNormal";
829                // }
830            }
831            //console.log(indicadorTipo)
832            if(tipoCuadro === "20"){ // cuadro #20  agregado: 30-05-2019                
833                condicionCuadro = "IndicadorAgrupadoB";               
834            }
835            if(tipoCuadro === "scitel") condicionCuadro = tipoCuadro;
836            // console.log("Indicador Tipo: " + indicadorTipo + " Tipo ducadro: " + tipoCuadro + " condicion Cuadro:" + condicionCuadro);
837            return condicionCuadro;
838        }
839        
840        /// <summary>   Transfoma el formato anterior de area geografica en el nuevo de 5 digitos para municipales. </summary>
841        ///
842        /// <remarks>   ARMANDO.ORTIZV, 23/11/2016. </remarks>
843        ///
844        /// <param name="area"> Clave de area geografica. </param>
845        ///
846        /// <returns>   . </returns>
847        function FormatoAnteriorArea(area) {
848            
849            var areaNueva = area;
850            var listaAreas = [];
851            var listaMunicipios = [];
852            var cadenaArea = "";
853             // se valida si el área geográfica trae desglose
854            // Formato: desglose | clave(s) de áreas geográficas separadas por coma  
855            // Ejemplo: 1|0 => desglose todos los países, 1|0216 => un pais en especifico, 1|0216,0217,0218 => varios países en especifico
856            // No valido: 0|0 por que es para nacional todas las entidades del país 
857            const refexAgeo = /^[1-9]\|(\d+)(,\d+)*$/;
858            if(refexAgeo.test(area)){
859                areaNueva = area.replaceAll("|","_"); 
860            
861            } else if (area.indexOf("'") > 1 || area.indexOf("|") > -1) {
862                
863                listaAreas = area.split("'");
864                for (var i = 0; i < listaAreas.length; i++) {
865                    if (listaAreas[i].indexOf("|") > -1 && listaAreas[i] !== "0|0") {
866                        var strEntidad = listaAreas[i].split("|")[0];
867                        var strMunicipios = listaAreas[i].split("|")[1];
868                        listaMunicipios = strMunicipios.split(",");
869                        for (var j = 0; j < listaMunicipios.length; j++) {
870                            var nuevaArea = AgregarCeros(strEntidad, 2) + AgregarCeros(listaMunicipios[j], 3);
871                            cadenaArea += "," + nuevaArea;
872                        }
873                    } else {
874                        cadenaArea = "00";
875                    }
876                }
877                areaNueva = cadenaArea.replace(",", "");
878            } else if (area === "entidades") {
879                areaNueva = "01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32";
880            }
881            return areaNueva;
882        }
883         // Formatea valor numero de string a numero con separadores de miles "," -> Ejemplo 300000.00 -> 300,000.00
884        // agregado el día 11-02-2021 
885        // modificado 14-02-2021
886        function formatoNumeroMiles(n) {
887            var _n;
888            // Validacion si el valor llega con separador de miles en string y punto decimal, ademas si no hay valor se le asigna 0.00 por default
889            if(n !== ""){
890                if(n.indexOf(",") > -1) n = n.replace(/,/g,"")
891                if(n.indexOf(".") > -1){ 
892                    _n = n.split(".")
893                    n = _n[0] +"."+ _n[1].substr(0,2);
894                } 
895            } else {
896                n = "0.00";
897            }
898
899            n = n.replace(/,/g, "");
900            var s = n.split(".")[1];
901            (s)
902            ? s = "." + s
903            : n.indexOf(".") >= 0
904            ? s = "."
905            : s = "";
906            n = n.split(".")[0];
907            while (n.length > 3) {
908                s = "," + n.substr(n.length - 3, 3) + s;
909                n = n.substr(0, n.length - 3);
910            }
911            return n + s;
912        }
913            
914        
915        /// <summary>   Genera plantilla e inicializa el componente. </summary>
916        ///
917        /// <remarks>   ARMANDO.ORTIZV, 23/11/2016. </remarks>
918        ///
919        /// <param name="parametros">       Objeto de configuracion de parametros. </param>
920        /// <param name="contenedorCuadro"> Nombre del contenedor. </param>
921        ///
922        /// <returns>   . </returns>
923        this.CallService = function (parametros, contenedorCuadro) {
924            // parametros que se incializan internamente
925            // configura(null).init();
926            var parametrosOrig = {};
927            if (parametros.mcp == "true" || parametros.mfpu === "true")
928            parametrosOrig = parametros;
929            if (!parametros.desdeURL)
930            parametros = this.CargarParametros(parametros);        
931            parametros.isLocalhost = window.location.hostname.indexOf("localhost") !== -1 ? true : false; // permite saber si se esta ejecutando en localhost (return true/false)
932            
933            parametros.areaGeografica = FormatoAnteriorArea(parametros.areaGeografica);
934            // parametros.areaGeografica = parametros.areaGeografica.replace(/-/g, "'");
935            parametros.contenedorCuadro = contenedorCuadro;
936            parametros.dominioCuadro = C_dominioBuscador;            
937            var ariaLabel = "Cuadro de información"; // etiqueta para el cuadro
938            //10.1.32.127
939            //if (window.location.href.indexOf("http://internetpwww.inegi.org.mx/temas/") > -1 || window.location.href.indexOf("http://w-webinterpre1/temas/") > -1)
940            //    parametros.direccionServicio = C_direccionServicioMan;
941            //else
942            parametros.direccionServicio = C_direccionServicio + extension_api_cuadros;
943            parametros.subdominioIngles = location.hostname.indexOf("en") > -1? "en." : "";
944            // --------------------TEST------------
945            //parametros.direccionServicio = "http://localhost:3782/API.svc";
946            
947            
948            parametros.indicadorValorCompuesto = {};
949            
950            var _this = this;
951            
952            parametros.token = "563cbaa8-58bb-fef8-6763-1f1dae318f99";
953            parametros.esOportuno = "null";
954            parametros.formatoAreaGeografica = (parametros.areaGeografica === "entidades") ? "0|0" : "null";
955            parametros.indicadorDepurado = "";
956            parametros.filtraPeriodos = false;
957            if (parametros.mostrarCombosPeriodos == "true")
958                parametros.filtraPeriodos = ValidaCasosFiltraPeriodo(parametros);
959            
960            parametros.condicionCuadro = "";
961            parametros.tipoFooter = _this.EvaluaFooter(parametros.muestraNota, parametros.muestraFuente);
962            var dummyHeader = "";
963            if (parametros.tipoCuadro == "7" || parametros.tipoCuadro == "6" || parametros.tipoCuadro == "14")
964                dummyHeader = '<thead id="dummyHeader' + contenedorCuadro + '"></thead>';
965            var combosHtml = "";
966            if (parametros.filtraPeriodos) {
967                
968                combosHtml = '<div id="divCmbPeriodos' + contenedorCuadro + '" style="width:100%; padding-right:15px; padding-left:15px;"><div class="row">'
969                + '<div class="col-md-12 col-sm-12 col-xs-12" style="padding:4px;"> '
970                + '<table class="pull-left"><tr>'
971                + '<td>'
972                    + '<label>&nbsp;Periodo desde:&nbsp;</label>'
973                + '</td><td>'
974                + '<select  id="cmbPI' + contenedorCuadro + '" class="form-control text-right"></select>'
975                + '</td>'               
976                + '<td>'
977                + '<label>&nbsp;hasta:&nbsp;</label>'
978                + '</td><td>'
979                + '<select  id="cmbPF' + contenedorCuadro + '" class="form-control text-right"></select>'
980                + '</td>'
981                + '</tr></table>'
982                + '</div>'
983                + '</div></div>'
984                + '<div id="hideConf' + contenedorCuadro + '" style="display:none;">' + JSON.stringify(parametrosOrig) + '</div>'
985                
986            } else if (parametros.mostrarFiltroPeriodo === "true") { // Un combo filtro por periodo (agregado 09-04-2018 1:06 pm)            
987                combosHtml = '<div id="divCmbPeriodos' + contenedorCuadro + '" style="width:100%; padding-right:15px; padding-left:15px;"><div class="row">'
988                + '<div class="col-md-12 col-sm-12 col-xs-12"> '
989                + '<table style="float:left"><tr>'
990                + '<td>'
991                + '<label>Periodo:</label>&nbsp;'
992                + '</td><td>'
993                + '<select  id="cmbPeriodoFiltro' + contenedorCuadro + '" class="form-control text-right"></select>'
994                + '</td>'
995                + '<td>'
996                + '</tr></table>'
997                + '</div>'
998                + '</div></div>'
999                + '<div id="hideConf' + contenedorCuadro + '" style="display:none;">' + JSON.stringify(parametrosOrig) + '</div>'
1000            }
1001            
1002            //add class to sticky header tables
1003            var clsStickyHeader = "";
1004            //if (parametros.tipoCuadro === "14" || parametros.tipoCuadro === "7") {
1005            //    clsStickyHeader = "sticky-header";
1006            //}
1007            var contenedor = document.getElementById(contenedorCuadro);
1008            contenedor.innerHTML = "";
1009            contenedor.innerHTML += ' <label id="lblMensaje' + contenedorCuadro + '" style="height:1px;display:none;width:100%;"></label>';
1010            contenedor.innerHTML += ' <div id="divCargaCuadro' + contenedorCuadro + '" style="height:100px;" >'
1011            + ' <img src="/img/cargando.gif"   style="display: block; margin: 0 auto; " /> '
1012            
1013            //+ ' <img src="' + parametros.dominioCuadro + '/sistemas/componentes/biinegi/grafica/tree/img/carga.gif"   style="display: block; margin: 0 auto; " /> '
1014            //+'      <label style="display: block; margin: 0 auto; text-align:center"> Cargando Información...</label>'
1015            + '</div>'
1016            + combosHtml;
1017            
1018            contenedor.innerHTML += '<table  class="TablaEnc"  id="TableHeader' + contenedorCuadro + '" ><tbody><tr id="RowHeader' + contenedorCuadro + '">'
1019            //contenedor.innerHTML += tableCombos;
1020            
1021            + '<th id="CellHeaderTitle' + contenedorCuadro + '" class="encabezado" style="width:100%; display:none" ></th>'
1022            // + '<th id="CellHeaderShare' + contenedorCuadro + '" class="encabezado" align="right" style="width:10%;display:none">
1022<input type="image" name="btnShare" id="btnShare' + contenedorCuadro + '" data-toggle="modal" data-target="#myModal' + contenedorCuadro + '" src="" style="visibility: visible;"></th>'
1023            + '</tr></tbody></table>'
1024            + '<table id="TableEspacio' + contenedorCuadro + '"  style="height: 5px"><tr><td></td></tr></table>'
1025            + '<div id="divDatos' + contenedorCuadro + '" style="width: 100%; padding: 1px;" class="table-responsive table-responsive-ignoreborder" data-pattern="priority-columns" tabindex="'+parametros.tabInd+'" aria-label="'+ ariaLabel +'">'
1026            + ' <table id="tableStat' + contenedorCuadro + '" class="table table-small-font table-bordered table-striped ' + clsStickyHeader + '" style="width: 100%;  float: left; ">' + dummyHeader + '<tbody id="dummyBody' + contenedorCuadro + '"></tbody></table></div>';
1027            // + ((parametros.tipoCuadro != "errorbar")? ' <table id="tableStat' + contenedorCuadro + '" class="table table-small-font table-bordered table-striped ' + clsStickyHeader + '" style="width: 100%;  float: left; ">' + dummyHeader + '<tbody id="dummyBody' + contenedorCuadro + '"></tbody></table></div>' : '');
1028            //+ ' <table id="tableNota'+contenedorCuadro+'" style="width: 100%;"><tr><td></td></tr></table>'
1029            //+ ' <table id="tableFuentes'+contenedorCuadro+'" style="width: 100%;"><tr><td></td></tr></table>'
1030            if (parametros.tipoFooter != "noFooter") {
1031                contenedor.innerHTML += _this.FooterGrafica(parametros.tipoFooter, contenedorCuadro, parametros);
1032            }
1033            /* contenedor.innerHTML += '</div>'
1034            + '<div id="myModal' + contenedorCuadro + '" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">'
1035            + '          <div class="modal-dialog">'
1036            + '            <div class="modal-content">'
1037            + '              <div class="modal-header">'
1038            + '                <table width="100%">'
1039            + '                  <tr> <td align="left" width="80%">'
1040            + '                        <p>Banco de Información INEGI</p> </td>'
1041            + '                <td align="right" width="20%">'
1042            + '                  <button type="button" class="btn bt btn-default" data-dismiss="modal" aria-hidden="true">Cerrar</button></td>'
1043            + '        </tr>   </table>  </div>'
1044            + '                      <div class="modal-body">'
1045            + '                        <table id="TableShare' + contenedorCuadro + '" BorderWidth="0" CellPadding="0" CellSpacing="0" runat="server">'
1046            + '                          <tr> <th id="TableWiget"' + contenedorCuadro + '></th>'
1047            + '                             <th> <p>Agregue este <i>widget</i>  a su página Web</p>'
1048            + '                                <p style="text-align: justify">'
1049            + '                                   Descripción: 	Obtiene los indicadores económicos y sus datos actualizados al momento de la consulta. Se puede obtener mayor información del indicador al darle clic en su vínculo.</p>'
1050            + '                             <p class="text-left">'
1051            + '                                <br />  Seleccione, copie y pegue este código en su página web'
1052            + '                           <textarea id="TACodeWidget' + contenedorCuadro + '" style="font-size: 8pt; width: 100%;" rows="10" cols="35" runat="server"></textarea> </p>'
1053            + '                       </th> </tr>   </table>  </div>  </div>   </div>   </div>' */
1054            
1055            if (parametros.indicator != "" || (parametros.indicator === "" && parametros.tipoCuadro === "scitel")) {
1056                var lblMensaje = document.getElementById("lblMensaje" + contenedorCuadro);
1057                lblMensaje.innerHTML = "";
1058                lblMensaje.style.display = "none";
1059               /*  if (parametros.muestraShare == "1")
1060                document.getElementById("btnShare" + contenedorCuadro).style.visibility = "visible"; */
1061                if (parametros.tipoCuadro == "4")
1062                    parametros.areaGeografica = "00000";
1063                parametros.indicadorTipo = Array.isArray(parametros.indicator) ? parametros.indicator : parametros.indicator.charAt(0);
1064                parametros.condicionCuadro = _this.EvaluaCondicionCuadro(parametros.indicadorTipo, parametros.tipoCuadro, parametros);
1065                switch (parametros.condicionCuadro) {
1066                    case "CuadroGruposA":
1067                    parametros.indicadorValorCompuesto = IndicadorCompuesto(parametros.indicator);
1068                    parametros.indicadorDepurado = parametros.indicadorValorCompuesto.todosLosIndicadores;
1069                    break;
1070                    case "CuadroGruposB":
1071                    parametros.indicadorValorCompuesto = IndicadorCompuestoB(parametros.indicator);
1072                    parametros.indicadorDepurado = parametros.indicadorValorCompuesto.todosLosIndicadores;
1073                    break;
1074                    case "CuadroGruposC":
1075                    parametros.indicadorValorCompuesto = IndicadorCompuestoC(parametros.indicator);
1076                    parametros.indicadorDepurado = parametros.indicadorValorCompuesto.todosLosIndicadores;
1077                    case "Cuadro12": /// exclusivo para procesar los indicadores de cuadro 12 - Mex Cifras
1078                    parametros.indicadorValorCompuesto = IndicadorCompuestoCuadro12(parametros.indicator);                    
1079                    parametros.indicadorDepurado = parametros.indicadorValorCompuesto.todosIndicadores;                   
1080                    break;
1081                    case "CuadroNormal":
1082                    parametros.indicadorDepurado = parametros.indicator;
1083                    break;
1084                    case "CuadroFichaResumen":
1085                    parametros.indicadorDepurado = parametros.indicator;
1086                    break;
1087                    case "CuadroFichaResumenCompuesta": //con indicador compuesto
1088                    parametros.indicadorValorCompuesto = IndicadorUnicoCompuesto(parametros.indicator);
1089                    parametros.indicadorDepurado = parametros.indicadorValorCompuesto.indicadorDepurado;
1090                    break;
1091                    case "IndicadorAgrupadoB": // cuadro #20 Agregado: 30-05-2019
1092                        parametros.indicadorValorCompuesto = IndicadorAgrupadoB(parametros.indicator);
1093                        parametros.indicadorDepurado = parametros.indicadorValorCompuesto.todosLosIndicadores;
1094                    break;
1095                    case "scitel": // cuadro #scitel Agregado: 12-07-2025
1096                        let aMergedIndCara = [];
1097                        // console.log("debug scitel")
1098                        // Si llegan caracteristicas de la localidad unir con el arreglo de indicadores 
1099                        if(parametros.caracteristicas !== null){
1100                            aMergedIndCara = [...parametros.caracteristicas, ...parametros.indicator];
1101                            parametros.indicator = aMergedIndCara;
1102                        }
1103                       
1104                        parametros.indicadorValorCompuesto = parametros.indicator;
1105                        // todos los indicadores sin repetir
1106                        parametros.indicadorDepurado = parametros.indicator.map(i => i.indicador);
1107                        let aIndicadores = [];
1108                        parametros.indicator.forEach((i, idx) => {
1109                            let iInd = parseInt(i.indicador);
1110                            if(aIndicadores.indexOf(iInd) === -1) aIndicadores.push(iInd)
1111                        })
1112                        parametros.indicadorDepurado = aIndicadores;
1113                        // obtiene todos los temas sin repetir
1114                        // debug scitel
1115                        let aTemas = [];
1116                        parametros.indicator.forEach((i, idx) => {
1117                            let iTema = parseInt(i.tema);
1118                            // if(aTemas.indexOf(iTema) === -1) aTemas.push({tema:i.tema, nombre:i.nombreTema})
1119                            if(aTemas.find((t) => {return parseInt(t.tema) === iTema}) === undefined) aTemas.push({tema:i.tema, nombre:i.nombreTema})
1120                        })
1121                        // console.log("------")
1122                        parametros.temaDepurado = aTemas;                        
1123                    break;
1124                    default:
1125                    break;
1126                }                                
1127                if (parametros.mostrarCombosPeriodos == "true" || parametros.mostrarFiltroPeriodo == "true") {
1128                    if (ValidaCasosFiltraPeriodo(parametros)) {
1129                        ConsultaFrecuenciaPeriodos(parametros, contenedorCuadro);
1130                    }
1131                    else {
1132                        // irACuadro(parametros, contenedorCuadro);
1133                        this.revisaHerramienta(parametros, () => {                
1134                            irACuadro(parametros, contenedorCuadro);
1135                        });
1136                    }
1137                } else 
1138                    // irACuadro(parametros, contenedorCuadro);
1139                    this.revisaHerramienta(parametros, () => {                
1140                        irACuadro(parametros, contenedorCuadro);
1141                    });
1142                // inicia ir al cuadro
1143                //switch (parametros.condicionCuadro) {
1144                //    case "CuadroGruposA":
1145                //        parametros.indicadorValorCompuesto = IndicadorCompuesto(parametros.indicator);
1146                //        parametros.indicadorDepurado = parametros.indicadorValorCompuesto.todosLosIndicadores;
1147                //        break;
1148                //    case "CuadroGruposB":
1149                //        parametros.indicadorValorCompuesto = IndicadorCompuestoB(parametros.indicator);
1150                //        parametros.indicadorDepurado = parametros.indicadorValorCompuesto.todosLosIndicadores;
1151                //        break;
1152                //    case "CuadroNormal":
1153                //        parametros.indicadorDepurado = parametros.indicator;
1154                //        break;
1155                //    default:
1156                //        break;
1157                //}
1158                //switch (parametros.tipoCuadro) {
1159                //    case "6":
1160                //        parametros.esOportuno = "1";
1161                //        break;
1162                //    case "3":
1163                //        parametros.esOportuno = "1";
1164                //        break;
1165                //    default:
1166                //        parametros.esOportuno = parametros.datoOportunoParametro;
1167                //        break;
1168                //}
1169                
1170                
1171                //if (parametros.indicadorDepurado.length < 200) {
1172                //    $.getJSON(parametros.direccionServicio + '/ValorIndicador/' + parametros.indicadorDepurado + "/" + parametros.areaGeografica + '/null/' + parametros.idioma + '/null/null/3/' + parametros.orden + '/' + parametros.nombreCorto + '/' + parametros.esOportuno + '/' + parametros.fe
1172chaInicio + '/' + parametros.fechaFin + "/" + parametros.formatoAreaGeografica + '/json/563cbaa8-58bb-fef8-6763-1f1dae318f99?callback=?', null, function (data) {
1173                //        switch (parametros.condicionCuadro) {
1174                //            case "CuadroGruposA":
1175                //                CasoCompuesto(data, parametros);
1176                //                break;
1177                
1178                //            default:
1179                //                CasosCuadro(data, parametros);
1180                //                break;
1181                //        }
1182                //    });
1183                //}
1184                //else {
1185                //    ConsultaPostIndicadores(parametros);
1186                //}
1187                // fin ir al cuadro
1188            } else if(parametros.tipoCuadro === "18"){ // localidades #18
1189                irACuadro(parametros, contenedorCuadro);
1190                // this.revisaHerramienta(parametros, () => {                
1191                //     irACuadro(parametros, contenedorCuadro);
1192                // });
1193            } else {
1194                var lblMensaje = document.getElementById("lblMensaje" + parametros.contenedorCuadro);
1195                OcultaCarga(parametros);
1196                lblMensaje.innerHTML = "No se proporcionaron parametros para generar el cuadro";
1197                lblMensaje.style.display = "";
1198                var TableHeader = document.getElementById("TableHeader" + contenedorCuadro);
1199                TableHeader.style.display = "none";
1200                
1201            }
1202        }
1203        
1204        /// <summary>   Determina que casos de cuadro pueden implementar filtros de periodos. </summary>
1205        ///
1206        /// <remarks>   ARMANDO.ORTIZV, 23/11/2016. </remarks>
1207        ///
1208        /// <param name="parametros">   The parametros. </param>
1209        ///
1210        /// <returns>   . </returns>
1211        function ValidaCasosFiltraPeriodo(parametros) {
1212            var filtraPeriodos = false;
1213            switch (parametros.tipoCuadro) {
1214                case '1':
1215                case '2':
1216                case '6'://nuevo modificacion:09-04-2018 11:17 (solo un periodo)
1217                case '5':
1218                case '7':
1219                case '8':
1220                case 'precision':
1221                case 'precision2':
1222                case 'precision3':
1223                    filtraPeriodos = true;
1224                break;
1225                default:
1226                    filtraPeriodos = false;
1227                break;
1228            }
1229            return filtraPeriodos;
1230        }
1231        
1232        /// <summary>   Consulta periodicidad. </summary>
1233        ///
1234        /// <remarks>   ARMANDO.ORTIZV, 23/11/2016. </remarks>
1235        ///
1236        /// <param name="parametros">   Objeto de configuracion de parametros. </param>
1237        /// <param name="contenedor">   Nombre del contenedor. </param>
1238        ///
1239        /// <returns>   . </returns>
1240        function ConsultaFrecuenciaPeriodos(parametros, contenedor) {
1241            if (parametros.mostrarFiltroPeriodo === "true") { // si true: se muestra el combo por periodo pero solamente 
1242                //anual            
1243                parametros.ocurrencias = 10;
1244                ConsultaPeriodos(parametros, contenedor);
1245            } else {
1246                var dirMetodo = '/CatalogoFrecuencias/' + parametros.areaGeografica + '/' + parametros.idioma + '/null/null/' + parametros.indicadorDepurado + '/json/' + parametros.token;
1247                $.getJSON(parametros.direccionServicio + dirMetodo + "?callback=?", null, function (data) {
1248                    ValidaFrecuenciaPeriodos(data, parametros, contenedor);
1249                });
1250            }
1251        }
1252        
1253        /// <summary>   Obtiene la cantidad de ocurrencias por periodicidad. </summary>
1254        ///
1255        /// <remarks>   ARMANDO.ORTIZV, 23/11/2016. </remarks>
1256        ///
1257        /// <param name="data">         Datos de la periodicidad en formato JSON. </param>
1258        /// <param name="parametros">   Objeto de parametros de configuracion. </param>
1259        /// <param name="contenedor">
1259   Nombre del contenedor. </param>
1260        ///
1261        /// <returns>   . </returns>
1262        function ValidaFrecuenciaPeriodos(data, parametros, contenedor) {
1263            if (data.ErrorCode == undefined) {
1264                switch (data[0].NOMBRE_FRECUENCIA) {
1265                    case 'Anual':
1266                    parametros.ocurrencias = 10;
1267                    break;
1268                    case 'Mensual':
1269                    parametros.ocurrencias = 2;
1270                    break;
1271                    case 'Trimestral':
1272                    parametros.ocurrencias = 3;
1273                    break;
1274                    case 'Quincenal':
1275                    parametros.ocurrencias = 2;
1276                    break;
1277                    case 'Quinquenal':
1278                    parametros.ocurrencias = 10;
1279                    break;
1280                    default:
1281                    break;
1282                }
1283                ConsultaPeriodos(parametros, contenedor);
1284            }
1285            else {
1286                console.log(data);
1287            }
1288        }
1289        
1290        function ConsultaPeriodos(parametros, contenedor) {
1291            var dirMetodo = "";
1292                var tematica = "";
1293                var direccion = parametros.direccionServicio;
1294                if (API_V == "v1_2") { // si esta habilitado el uso del api v2
1295                        tematica = (parametros.tematica != "" ? parametros.tematica + "/" : "null/");
1296                        direccion = C_direccionServicio_V + "_" + API_V.toLowerCase() + "/";
1297                } else if(API_V == "v1_1"){
1298                    // No se hace nada
1299                } else { // API VERSION 3 FINAL
1300                    tematica = (parametros.tematica != "" ? parametros.tematica + "/" : "undefined/");
1301                    direccion = C_direccionServicio_V + "_" + API_V.toLowerCase() + "/";                   
1302                }
1303                if (parametros.indicadorDepurado.length > 200) {
1304                        //Parche temporal para hacer la peticion con solo 21 indicadores si llegasen a ser demasiados (agregado: 11-04-2018 2:39) hacer metodo en api para POST
1305                        var aIndicadores = parametros.indicadorDepurado.split(",");
1306                        var sTmpIndicadores = "", aTmpIndicadores = [];
1307                        for (var x = 0; x < aIndicadores.length; x++) {
1308                            if (x < 22) aTmpIndicadores.push(aIndicadores[x]);
1309                        }
1310                        var indicadorDepurado = aTmpIndicadores.join(",");
1311                        dirMetodo = 'PeriodoA/' + parametros.areaGeografica + '/null/null/' + parametros.idioma + '/0/0/' + indicadorDepurado + '/null/null/null/' + tematica +'json/' + parametros.token;
1312                } else {
1313                        dirMetodo = 'PeriodoA/' + parametros.areaGeografica + '/null/null/' + parametros.idioma + '/0/0/' + parametros.indicadorDepurado + '/null/null/null/' + tematica +'json/' + parametros.token;
1314                }
1315                
1316                
1317                $.getJSON(direccion + dirMetodo + "?callback=?", null, function (data) {
1318                        if (parametros.mostrarFiltroPeriodo === "true") {
1319                        CalculaLimiteFiltroPeriodo(data, parametros, contenedor);
1320                        } else {
1321                        CalculaLimitePeriodos(data, parametros, contenedor);
1322                        }
1323                });
1324        }
1325        
1326        /// <summary>   Coloca combos de inicio y fin de los periodos, fija la cantidad de periodos mostrados. </summary>
1327        ///
1328        /// <remarks>   ARMANDO.ORTIZV, 23/11/2016. </remarks>
1329        ///
1330        /// <param name="data">         Datos de los años de consulta en JSON. </param>
1331        /// <param name="parametros">   Objeto de parametros de configuracion. </param>
1332        /// <param name="contenedor">   Nombre del contenedor. </param>
1333        ///
1334        /// <returns>   . </returns>
1335        function CalculaLimitePeriodos(data, parametros, contenedor) {
1336            if (data.ErrorCode == undefined) {
1337                var ultimoPeriodo = parseInt(data[data.length - 1]);
1338                var periodoPrimero = parseInt(data[0]);
1339                var indexPeriodo = data.length - parametros.ocurrencias;
1340                if (indexPeriodo >= 0) {
1341                    periodoPrimero = parseInt(data[indexPeriodo])
1342                    var cmbPIitem = document.getElementById("cmbPI" + contenedor);
1343                    var cmbPFitem = document.getElementById("cmbPF" + contenedor);
1344                    
1345                    fillcomboperiods(data, cmbPIitem, periodoPrimero.toString());
1346                    fillcomboperiods(data, cmbPFitem, ultimoPeriodo.toString());
1347                    if (parametros.mostrarCombosChange == "false") {
1348                        parametros.fechaInicio = periodoPrimero;
1349                        parametros.fechaFin = ultimoPeriodo;
1350                    }
1351                    else {
1352                        cmbPIitem.value = parametros.fechaInicio;
1353                        cmbPFitem.value = parametros.fechaFin;
1354                    }
1355                    var hiddenConfig = JSON.parse(document.getElementById('hideConf' + contenedor).innerHTML);
1356                    cmbPIitem.onchange = function () {
1357                        changeComboCuadroEventCuadroComponente(hiddenConfig, contenedor);
1358                    }
1359                    
1360                    cmbPFitem.onchange = function () {
1361                        changeComboCuadroEventCuadroComponente(hiddenConfig, contenedor);
1362                    }
1363                    
1364                }
1365                else {
1366                    document.getElementById("divCmbPeriodos" + contenedor).style.display = "none";
1367                }
1368                irACuadro(parametros, contenedor);
1369                //    $(".dropdown-toggle").dropdown();
1370            }
1371            else {
1372                console.log(data);
1373            }
1374        }
1375        
1376        /// <summary>   Coloca el filtro - combo con el minimo y maximo periodo. </summary>
1377        ///
1378        /// <remarks>   jose.valles, 09/04/2018. </remarks>
1379        ///
1380        /// <param name="data">         Datos de los años de consulta en JSON. </param>
1381        /// <param name="parametros">   Objeto de parametros de configuracion. </param>
1382        /// <param name="contenedor">   Nombre del contenedor. </param>
1383        ///
1384        /// <returns>   . </returns>
1385        function CalculaLimiteFiltroPeriodo(data, parametros, contenedor) {
1386            if (data.ErrorCode == undefined) {
1387                var ultimoPeriodo = parseInt(data[data.length - 1]);
1388                //var periodoPrimero = parseInt(data[0]);
1389                //console.log(parametros.ocurrencias);
1390                //var indexPeriodo = parametros.ocurrencias -data.length;
1391                //if (indexPeriodo >= 0) {
1392                periodoPrimero = parseInt(data[0])
1393                var cmbPeriodoFiltro = document.getElementById("cmbPeriodoFiltro" + contenedor);
1394                fillcomboperiods(data, cmbPeriodoFiltro, ultimoPeriodo.toString());
1395                //if (parametros.mostrarCombosChange == "false") {
1396                //    parametros.fechaInicio = periodoPrimero;
1397                //    parametros.fechaFin = ultimoPeriodo;
1398                //}
1399                // else {                  
1400                if (parametros.fechaFin !== "null") {
1401                    cmbPeriodoFiltro.value = parametros.fechaFin;
1402                } else {
1403                    cmbPeriodoFiltro.value = ultimoPeriodo;
1404                }
1405                //}
1406                var hiddenConfig = JSON.parse(document.getElementById('hideConf' + contenedor).innerHTML);
1407                cmbPeriodoFiltro.onchange = function () {
1408                    eventChangeFiltroCuadro(hiddenConfig, contenedor);
1409                }
1410                
1411                //}
1412                //else {
1413                //    document.getElementById("divCmbPeriodos" + contenedor).style.display = "none";
1414                //}
1415                irACuadro(parametros, contenedor);
1416                //    $(".dropdown-toggle").dropdown();
1417            }
1418            else {
1419                console.log(data);
1420            }
1421        }
1422        
1423        /// <summary>   Dibuja combos de periods. </summary>
1424        ///
1425        /// <remarks>   ARMANDO.ORTIZV, 23/11/2016. </remarks>
1426        ///
1427        /// <param name="data">                 Datos de periodos en JSON. </param>
1428        /// <param name="combo">                Objeto combobox. </param>
1429        /// <param name="valorSeleccionado">    Valor seleccionado. </param>
1430        ///
1431        /// <returns>   . </returns>
1432        function fillcomboperiods(data, combo, valorSeleccionado) {
1433            
1434            for (var i = 0; i < data.length; i++) {
1435                generateitemscombo(combo, data[i], data[i]);
1436                if (data[i] === valorSeleccionado) {
1437                    combo.selectedIndex = i;
1438                }
1439            }
1440        }
1441        
1442        /// <summary>   Agrega elementos option al combobox. </summary>
1443        ///
1444        /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
1445        ///
1446        /// <param name="select">       Combobox de html. </param>
1447        /// <param name="textValue">    Texto del valor. </param>
1448        /// <param name="valValue">     Valor. </param>
1449        ///
1450        /// <returns>   . </returns>
1451        function generateitemscombo(select, textValue, valValue) {
1452            var option = document.createElement('option');
1453            option.text = textValue;
1454            option.value = valValue;
1455            // option.setAttribute("Ver_Tema", ver_tema);
1456            select.appendChild(option, 0);
1457        }
1458        
1459        /// <summary>   Consulta valores del cuadro por HTTP GET o POST. </summary>
1460        ///
1461        /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
1462        ///
1463        /// <param name="parametros">   Objeto de parametros de configuracion. </param>
1464        /// <param name="contenedor">   Contenedor del componente. </param>
1465        ///
1466        /// <returns>   . </returns>
1467        function irACuadro(parametros, contenedor) {
1468           
1469            switch (parametros.tipoCuadro) {
1470                case "2":
1471                    if (parametros.orden == "ai") {
1472                        parametros.typeChart = 5;
1473                    }
1474                break;
1475                case "1": // Validacion de tc 1 para ultimo periodo (agregado: 19-08-2019)
1476                case "6":
1477                    if (parametros.fechaInicio !== "null" && parametros.fechaFin !== "null") {
1478                        parametros.esOportuno = "null";
1479                    } else {
1480                        parametros.esOportuno = "1";
1481                        if(parametros.tipoCuadro === "1" && parametros.orden == "null"){
1482                            parametros.orden = "n";
1483                        }
1484                    }
1485                break;
1486                case "12":
1487                    parametros.esOportuno = "1";
1488                break;
1489                case "3":
1490                case "21":
1491                    parametros.esOportuno = "1";
1492                    if (parametros.datoOportunoParametro == 0) {
1493                        parametros.datoOportunoParametro = "null";
1494                        parametros.esOportuno = "null";
1495                    }                
1496                break;
1497                case "14":
1498                case "15":
1499                    parametros.typeChart = 3;
1500                    parametros.orden = "af"
1501                break;
1502                case "precision":
1503                    parametros.esOportuno = "null";
1504                    break;
1505                case "precision2":
1506                case "precision3":
1507                    parametros.esOportuno = "1";
1508                break;
1509                    default:
1510                    parametros.esOportuno = parametros.datoOportunoParametro;
1511                break;
1512            }
1513            if (parametros.datoOportunoParametro != "null") {
1514                parametros.esOportuno = parametros.datoOportunoParametro;
1515            }
1516            if (parametros.tipoCuadro == "8" && parametros.D3Enabled === "true") { // 21-01-2019 cuadro 8 D3 enabled llamada a sdmx 
1517                
1518                var periodos = (parametros.periodoInicio === "null" || parametros.periodoInicio === undefined) ? "" : '?startPeriod=' + parametros.fe
1518chaInicio + '-01-01&endPeriod=' + parametros.fechaFin + '-01-01'
1519                var notas = parametros.ni;
1520                var url = "";
1521                if(parametros.indicadorDepurado.indexOf("ODS") > -1){ // DATOS DE LA ODS (agregado: 11 abril 2019)
1522                    //parametros para desarrollo sustentable
1523                    var objetivo = parametros.obj;
1524                    var meta = parametros.met;
1525                    var submeta = parametros.indicadorDepurado;
1526                    var area = parametros.areaGeografica;
1527                    var frecuencia = parametros.frec;
1528                    var descripcion = parametros.desc;
1529                    var fuente = parametros.fue;
1530                    url = "http://10.200.3.98/intraDisseminationNSIService/rest/data/TN1,DF_ODS_ZERO_HUNGER_GOAL_2_1,1.0/"+objetivo+"."+meta+"."+submeta+"."+area+"."+frecuencia+"."+descripcion+"."+fuente+"..";
1531                    // url = "http://10.200.3.98/intraDisseminationNSIService/rest/data/TN1,DF_ODS_ZERO_HUNGER_GOAL_2_1,1.0/ODS0020.ODS00200005.ODS002000050030.00.....";
1532                } else { // DATOS DE SDMX
1533                    url = C_dominioBuscador + 'app/api/indicadores/desarrolladores/sdmx/rest/data/INEGI,BISE,1.0/' + parametros.indicadorDepurado + '..' + notas + '.' + parametros.fue + '.' + parametros.areaGeografica + '.' + parametros.tema + "" + periodos;
1534                }             
1535                $.ajax({
1536                    url: url,
1537                    jsonpCallback: 'callback',
1538                    headers: {
1539                        "Accept": "application/json",
1540                        "Accept-Language": "es-ES"
1541                    }
1542                }).done(function (data) {
1543                    CasosCuadro(data, parametros);
1544                });                
1545                
1546                
1547            } else if (parametros.tipoCuadro == "13v2" || parametros.tipoCuadro == "13" || parametros.tipoCuadro == "16") { // solo para el cuadro 13: ficha resumen para area geografica              
1548                var objDatosGeograficos = {};                
1549                // consulta detalles areaGeografica por area geografica   
1550                var direccionServicio = parametros.direccionServicio;
1551                var tematica = "";
1552                if (API_V == "v1_2") {
1553                        tematica = (parametros.tematica != "" ? parametros.tematica + "/" : "null/");
1554                        direccionServicio = C_direccionServicio_V + "_" + API_V.toLowerCase() + "/";
1555                } else if(API_V == "v1_1"){
1556                    // No se hace nada
1557                } else { // API VERSION 3 FINAL
1558                    tematica = (parametros.tematica != "" ? parametros.tematica + "/" : "undefined/");
1559                    direccionServicio = C_direccionServicio_V + "_" + API_V.toLowerCase() + "/";                    
1560                }
1561
1562                if(parametros.tipoCuadro == "13v2"){ // por lo pronto solo se omite el llamado a MetadatoIndicador por que no usa los datos
1563                    var metodoVersionAreaGeografica = "CatalogoAreaGeograficaV3";
1564                    var desgloseGeografico = "null";
1565                    tematica = "6/";
1566                    var dirAreaGeo = direccionServicio + 'API.svc/'+ metodoVersionAreaGeografica +'/' + parametros.areaGeografica + '/null/null/'+ desgloseGeografico +'/' + tematica +'1/json/' + parametros.token;
1567                    
1568                    var objDatosGeograficos = {};                        
1569                    $.getJSON(dirAreaGeo, function (dataArea) {
1570                        var aGN = parametros.areaGeografica;                        
1571                        
1572                        var urlBase = C_direccionServicio.split("/app")[0]+"/";
1573                        if(aGN != "00" && aGN != "0"){
1574                            var ageoTempoEUM = "";
1575
1576                            if (aGN.length == 2) {
1577                                ageoTempoEUM = aGN;
1578                            } else {
1579                                var ageoTempoSiguentes = aGN.length >= 8 ? aGN.substring(6, 8) : "";
1580                                var ageoTempoSiguentes1 = aGN.length == 12 ? aGN.substring(9, 12) : "";
1581                                ageoTempoEUM = ageoTempoSiguentes + ageoTempoSiguentes1;
1582
1583                                if(ageoTempoEUM == ""){
1584                                    ageoTempoEUM = aGN;
1585                                }
1586                            }
1587                            // Actualización: 05-feb-2021
1588                            // Descripción: El config hace la concatenacion del idioma al resto de la url del api.
1589                            //México en cifras - informacion de localidades
1590                            // Fecha: 01-03-2023
1591                            CatemlLocalidades(urlBase, objDatosGeograficos, [], dataArea, parametros, ageoTempoEUM);
1592                            
1593                        }  else {
1594                            // peticion para obtener el valor del primer objeto para nacional
1595                            // dato corresponde a municipio y demarcaciones territoriales
1596                            // modificado: 18-04-2023
1597                            // fetch(urlBase+"app/api/cateml/catuniAPI/ObtenerFecCorMun/",{method:"GET",mode:"no-cors", headers:{"Content-Type": "application/json"}})
1598                            getFechaReferenciaActualizacion(function(aFecCorMun){
1599                                
1600                                // objDatosGeograficos.indicator = [];
1601                                $.extend(objDatosGeograficos, dataArea[0], {demarcaciones_territoriales:aFecCorMun[0].valor,referencia_actualizacion:aFecCorMun[0].nombre});
1602                                CasosCuadro(objDatosGeograficos, parametros);
1603                                
1604                            })                               
1605                            
1606                        }                              
1607                    });
1608                } else {
1609
1610                    var dirIndicador = direccionServicio + 'API.svc/MetadatoIndicador/' + parametros.idioma + '/' + parametros.indicadorDepurado + '/' + parametros.areaGeografica + '/null/null/null/' + tematica +'json/' + parametros.token;
1611                    $.getJSON(dirIndicador, function (dataIndicador) {
1612                        if (dataIndicador.ErrorCode !== undefined) {
1613                            OcultaCarga(parametros);
1614                            MostrarMensajeErrorCuadro(parametros.contenedorCuadro, dataIndicador.ErrorCode, dataIndicador.ErrorInfo);
1615                        } else {
1616                            // consulta detalles areaGeografica por area geografica
1617                            var metodoVersionAreaGeografica = "CatalogoAreaGeograficaV3";
1618                            // var desgloseGeografico = 3;
1619                            var desgloseGeografico = "null";
1620                            tematica = "6/";
1621                            var dirAreaGeo = direccionServicio + 'API.svc/'+ metodoVersionAreaGeografica +'/' + parametros.areaGeografica + '/null/null/'+ desgloseGeografico +'/' + tematica +'1/json/' + parametros.token;
1622                            
1623                            var objDatosGeograficos = {};                        
1624                            $.getJSON(dirAreaGeo, function (dataArea) {
1625                                var aGN = parametros.areaGeografica;                        
1626                                
1627                                var urlBase = C_direccionServicio.split("/app")[0]+"/";
1628                                if(aGN != "00" && aGN != "0"){
1629                                // if (aGN != "00" && aGN != "0" && aGN != "0700") {
1630                                    var ageoTempoEUM = "";
1631
1632                                    if (aGN.length == 2) {
1633                                        ageoTempoEUM = aGN;
1634                                    } else {
1635                                        var ageoTempoSiguentes = aGN.length >= 8 ? aGN.substring(6, 8) : "";
1636                                        var ageoTempoSiguentes1 = aGN.length == 12 ? aGN.substring(9, 12) : "";
1637                                        ageoTempoEUM = ageoTempoSiguentes + ageoTempoSiguentes1;
1638
1639                                        if(ageoTempoEUM == ""){
1640                                            ageoTempoEUM = aGN;
1641                                        }
1642                                    }
1643                                    // Actualización: 05-feb-2021
1644                                    // Descripción: El config hace la concatenacion del idioma al resto de la url del api.
1645                                    //México en cifras - informacion de localidades
1646                                    // Fecha: 01-03-2023
1647                                    CatemlLocalidades(urlBase, objDatosGeograficos, dataIndicador, dataArea, parametros, ageoTempoEUM);
1648                                    
1649                                }  else {
1650                                    // peticion para obtener el valor del primer objeto para nacional
1651                                    // dato corresponde a municipio y demarcaciones territoriales
1652                                    // modificado: 18-04-2023
1653                                    // fetch(urlBase+"app/api/cateml/catuniAPI/ObtenerFecCorMun/",{method:"GET",mode:"no-cors", headers:{"Content-Type": "application/json"}})
1654                                    getFechaReferenciaActualizacion(function(aFecCorMun){
1655                                        
1656                                        objDatosGeograficos.indicator = dataIndicador;
1657                                        $.extend(objDatosGeograficos, dataArea[0], {demarcaciones_territoriales:aFecCorMun[0].valor,referencia_actualizacion:aFecCorMun[0].nombre});
1658                                        CasosCuadro(objDatosGeograficos, parametros);
1659                                        
1660                                    })                               
1661                                    
1662                                }                              
1663                            });
1664                        }
1665                    });
1666                }
1667                
1668            } else if(parametros.tipoCuadro === "18"){ // Caso para cuadros localidades (mexico en cifras) #18 informacion de localidades
1669
1670                /* var urlLocalidades = C_dominioBuscador + "app/api/indicadores/internalocalidades_V1_1/datosLocalidadTema?cvegeo="+parametros.areaGeografica;
1671                var data = [];             
1672                $.getJSON(urlLocalidades, function (data) { 
1673                    data.dLocalidades = data;
1674                    CasosCuadro(data, parametros);
1675                }); */          
1676
1677                // Validar el area geografica para saber si es la nueva clave o si es la anterior
1678                var aGN = parametros.areaGeografica;
1679                var ageoTempoEUM = "";
1680                if(parametros.areaGeografica.length === 12){
1681                    var ageoTempoSiguentes = aGN.substring(6, 8);
1682                    var ageoTempoSiguentes1 = aGN.substring(9, 12);
1683                    ageoTempoEUM = ageoTempoSiguentes + ageoTempoSiguentes1;
1684                } else {
1685                    ageoTempoEUM = parametros.areaGeografica;
1686                }  
1687                // url localidades datos Un arreglo V3
1688                var urlLocalidades = C_dominioBuscador + "app/api/indicadores/internalocalidades_V1_1/datosLocalidadTema?cvegeo=" + ageoTempoEUM;                
1689                if(parametros.periodoLocalidad !== null && parametros.versionLocalidad !== null && C_dominioBuscador.indexOf("desarrollowww") !== -1){                    
1690                    var periodoLoc = parametros.periodoLocalidad
1691                    var versionLoc = parametros.versionLocalidad
1692                    urlLocalidades = C_dominioBuscador + "app/api/indicadores/internalocalidades_V1_1/DatosReporteLoc5000_2020_pt2?areageo="+ageoTempoEUM+"&edicion="+periodoLoc+"&version="+versionLoc
1693                }
1694                $.getJSON(urlLocalidades, function (dataLoc) {   
1695                     //obtener catalogo de temas
1696                     if(C_dominioBuscador.indexOf("desarrollowww") === -1){
1697                        CasosCuadro(dataLoc, parametros);
1698                     } else {
1699
1700                         var urlCatalogoTemas = C_dominioBuscador + "app/api/indicadores/internalocalidades_V1_1/CatalogoTemas";
1701                         $.getJSON(urlCatalogoTemas, function(catTemasLoc){
1702                             parametros.catalogoTemasLocalidad = catTemasLoc;                  
1703                             CasosCuadro(dataLoc, parametros);
1704                            })
1705                        }
1706                }).fail((e) => {                    
1707                    var msg = parametros.idioma === "es"? "No hay información para esta área geográfica" : "There's not information for this geographic area";
1708                    parametros.error = {code:"500", msg:msg, error:"Object reference not set to an instance of an object...", url:urlLocalidades}                    
1709                    document.getElementById("divCargaCuadro"+parametros.contenedorCuadro).style.display = "none";
1710                    var lblMensaje = document.getElementById("lblMensaje" + parametros.contenedorCuadro);
1711                        lblMensaje.innerHTML = parametros.error.msg;
1712                        lblMensaje.style.display = "block";
1713                    if(parametros.callback !== null) parametros.callback(parametros)
1714                    // return false;
1715                }); 
1716                // CasosCuadro(dataLocalidades, parametros)   
1717            } else if(parametros.tipoCuadro === "12"){ // Agregado 09-03-2023
1718                // console.log(">> iraCuadro -> GetDatosValorIndicadorCuadro12")
1719                GetDatosValorIndicadorCuadro12(parametros);
1720
1721            } else if(parametros.tipoCuadro === "scitel"){ // Agregado 12-07-2025 Cuadros datos SCITEL                
1722                getIndicadoresValorScitel(parametros)
1723            } else {  
1724                if (parametros.indicadorDepurado.length < 200) {                    
1725                    var typeChart = (parametros.typeChart !== undefined) ? parametros.typeChart : (parametros.tipoCuadro === "12" ? 4 : 3);
1726                    //var typeChart = 3;                
1727                    //console.log(parametros.direccionServicio + '/ValorIndicador/' + parametros.indicadorDepurado + "/" + parametros.areaGeografica + '/null/' + parametros.idioma + '/null/null/' + typeChart + '/' + parametros.orden + '/' + parametros.nombreCorto + '/' + parametros.esOportuno + '/' + parametros.fe
1727chaInicio + '/' + parametros.fechaFin + "/" + parametros.formatoAreaGeografica + '/json/563cbaa8-58bb-fef8-6763-1f1dae318f99');
1728                        var direccionServicio = parametros.direccionServicio;
1729                        var _tematica = "";
1730                        if (API_V == "v1_2") {
1731                            _tematica = (parametros.tematica != "" ? parametros.tematica + "/" : "null/");
1732                            direccionServicio = C_direccionServicio_V + "_" + API_V.toLowerCase()+"/";
1733                            // console.debug(_tematica);
1734                        } else if(API_V == "v1_1"){
1735                            // No se hace nada
1736                        } else { // API VERSION 3 FINAL
1737                            _tematica = (parametros.tematica != "" ? parametros.tematica + "/" : "undefined/");
1738                            direccionServicio = C_direccionServicio_V + "_" + API_V.toLowerCase();
1739                        } 
1740                        direccionServicio = direccionServicio + extension_api_cuadros                       
1741
1742                        var urlRequest = direccionServicio + '/ValorIndicador/' + parametros.indicadorDepurado + "/" + parametros.areaGeografica + '/null/' + parametros.idioma + '/null/null/' + typeChart + '/' + parametros.orden + '/' + (parametros.nombreCorto == "true" ? 1 : 0) + '/' + parametros.esOportuno + '/' + parametros.fe
1742chaInicio + '/' + parametros.fechaFin + "/" + parametros.formatoAreaGeografica + '/' + _tematica +'json/563cbaa8-58bb-fef8-6763-1f1dae318f99';                                                
1743                        $.getJSON(urlRequest + "?callback=?", null, function (data) {         
1744                            parametros.listaExcepciones = data.exceptions;                                               
1745                                switch (parametros.condicionCuadro) {
1746                                case "CuadroGruposA":
1747                                    CasoCompuesto(data, parametros);
1748                                break;
1749                                
1750                                default:
1751                                    CasosCuadro(data, parametros);
1752                                break;
1753                                }
1754                        });
1755                }
1756                else {                    
1757                    ConsultaPostIndicadores(parametros);
1758                }
1759            }
1760        }
1761        /**
1762         * Método para obtener y pintar el cuadro de datos SCITEL 2025
1763         * @created 12-07-2025
1764         * @param {*} parametros 
1765         */
1766        function getIndicadoresValorScitel(parametros){
1767            // debug scitel           
1768            const grupo = parametros.indicadorValorCompuesto[0].grupo;   
1769            parametros.grupoArbolScitel = grupo;                        
1770            // obtnemos y concatenamos los temas en un string
1771            let sTemas = parametros.temaDepurado.length > 0 ? parametros.temaDepurado.map(tema => tema.tema).join(",") : null;
1772
1773            let bodyParametros = JSON.stringify({                
1774                // tema:parametros.temaDepurado.join(","),
1775                tema:sTemas, // Si es un tema si se manda, si son varios temas enviar null
1776                // periodo: grupo === "2" || grupo === 2 ? parametros.versionLocalidad : parametros.versionlocalidad,
1777                periodo: parametros.versionLocalidad,
1778                areageo:parametros.areaGeografica,
1779                version:parametros.versionLocalidad,
1780                indicadores:parametros.indicadorDepurado.join(","), // se envian los indicadores separados por coma
1781                formato:"json",
1782                token:parametros.token
1783            });           
1784        
1785            // Validamos para saber si estamos en localhost y poder ejecutar el llamado o usar un objeto de datos fijo
1786            if(!parametros.isLocalhost){
1787                // solo si es grupo 1 del arbol de temas
1788                let urlScitel = C_direccionServicio + extension_api_cuadros + "IndicadoresValorScitel";
1789
1790                if(grupo === "2" || grupo === 2){ // si es grupo 2 del arbol de temas
1791                    urlScitel = C_direccionServicio + extension_api_cuadros + "IndicadoresValorAGEBMZAScitel";
1792
1793                } else if(grupo === "3" || grupo === 3){
1794                    urlScitel = C_direccionServicio + extension_api_cuadros + "IndicadoresValorScitel";
1795                }
1796                console.log(JSON.parse(bodyParametros));
1797            
1798                //Arma y ejecuta la peticion POST a IndicadoresValorScitel
1799                $.ajax({
1800                    method: "POST",
1801                    url: urlScitel,                        
1802                    contentType: "application/json",
1803                    dataType: "json",
1804                    data: bodyParametros,                        
1805                    success: function (data) {
1806                        CasosCuadro(data, parametros);
1807                    },
1808                    error: function (jqXHR, textStatus, errorThrown) {
1809                        console.log(textStatus, errorThrown);
1810                    } 
1811                });
1812
1813            } else {
1814
1815                // SCITEL DATOS ESTÁTICOS: PRUEBAS CUANDO ES LOCALHOST YA QUE LOS POST NO FUNCIONAN 
1816                // UTILIZAMOS UN OBJETO DE DATOS FIJO SIMULANDO LA RESPUESTA DEL API
1817                // Y CONTINUAMOS EL PROCESO
1818                console.log(">> Test scitel localhost");
1819                // console.log("Si grupo 2")
1820                // const pathArchivo = "scripts/IndicadoresValorAGEBMZAScitel.json";
1821                console.log("Si grupo 1,3");
1822                const pathArchivo = "scripts/IndicadoresValorScitel.json";
1823                let data = [];
1824                $.getJSON(pathArchivo, function (d) {
1825                    data = d;
1826                }).error(function (error) {
1827                    console.log(error);
1828                    console.log("ERROR AL LEER EL JSON")
1829                }).done(function () {
1830                    CasosCuadro(data, parametros)           
1831                });
1832            }
1833        }
1834        /**
1835         * Metodo para obtener la fecha de actualización de catalogo unico de claves geoestadisticas
1836         * llamado aplicado para nacional, entidades y municipios
1837         * modificado: 02-05-2023
1838         * @param {*} cb 
1839         */
1840        function getFechaReferenciaActualizacion(cb){
1841            var urlBase = C_direccionServicio.split("/app")[0]+"/";
1842            // produccion
1843            return fetch(urlBase+"app/api/cateml/catuniAPI/ObtenerFecCorMun/",{method:"GET",headers:{"Content-Type": "application/json"}}).then(function(response){
1844                return response.json()
1845            }).then(function(aRefAct){
1846                cb(aRefAct)
1847            })
1848            // localhost
1849            //  var aRefAct = [
1850            //     {
1851            //         "mapa": null,
1852            //         "te": null,
1853            //         "cve_ent": null,
1854            //         "nom_ent": null,
1855            //         "nom_abr": null,
1856            //         "cve_cap": null,
1857            //         "nom_cap": null,
1858            //         "fecha_act": null,
1859            //         "descrip": null,
1860            //         "cod_act": null,
1861            //         "evidencia": null,
1862            //         "cve_ent_act": null,
1863            //         "nom_ent_act": null,
1864            //         "z1": null,
1865            //         "z119": null,
1866            //         "z2": null,
1867            //         "z3": null,
1868            //         "contador": "56",
1869            //         "nombre": "01/05/2023 12:00:00 a. m.",
1870            //         "valor": "2475"
1871            //     }
1872            // ]
1873            // cb(aRefAct) 
1874        }
1875        /**
1876         * Metodo para proceso de obtener datos ValorIndicador para el cuadro #12
1877         * App. Mexico en cifras
1878         * Fecha: 09-03-2023
1879         * @param {*} parametros 
1880         */
1881        function GetDatosValorIndicadorCuadro12(parametros){  
1882            var numTematicas = parametros.indicadorValorCompuesto.todasTematicas.length;
1883            var aTematicas = parametros.indicadorValorCompuesto.todasTematicas;
1884            var aIndicadores = parametros.indicadorDepurado;
1885            var typeChart = 4;
1886            var direccionServicio = parametros.direccionServicio;
1887            var _tematica = "";
1888
1889            if (API_V == "v1_2") {
1890                _tematica = (parametros.tematica != "" ? parametros.tematica + "/" : "null/");
1891                direccionServicio = C_direccionServicio_V + "_" + API_V.toLowerCase()+"/";
1892            } else if(API_V == "v1_1"){
1893                // No se hace nada
1894            } else { // API VERSION 3 FINAL
1895                _tematica = (parametros.tematica != "" ? parametros.tematica + "/" : "undefined/");
1896                direccionServicio = C_direccionServicio_V + "_" + API_V.toLowerCase();
1897            }
1898
1899            direccionServicio = direccionServicio + extension_api_cuadros;
1900            if (parametros.indicadorDepurado.length <= 10) {                    
1901                    
1902                    // console.log(">> FETCH METODO GET VALORINDICADOR " + parametros.tipoCuadro)
1903                    var urlRequest = direccionServicio + '/ValorIndicador/$indicadores/' + parametros.areaGeografica + '/null/' + parametros.idioma + '/null/null/' + typeChart + '/' + parametros.orden + '/' + (parametros.nombreCorto == "true" ? 1 : 0) + '/' + parametros.esOportuno + '/' + parametros.fe
1903chaInicio + '/' + parametros.fechaFin + "/" + parametros.formatoAreaGeografica + '/$tematica/json/563cbaa8-58bb-fef8-6763-1f1dae318f99';                                                
1904                    var aPromesas = []
1905                    for(var x = 0; x < numTematicas; x++){
1906                        _tematica = aTematicas[x];
1907                        var sIndicadores = aIndicadores.filter(function(i){ return i.tematica === aTematicas[x];})
1908                        sIndicadores = sIndicadores.map(function(i){ return i.indicador;}).join(",");
1909                        var url = urlRequest.replaceAll("$indicadores", sIndicadores);
1910                        url = url.replaceAll("$tematica", _tematica);
1911                        var promesa = fetch(url,{method:"GET"},function(d){ return d})
1912                        aPromesas.push(promesa)
1913                    }  
1914                  
1915                    if(aPromesas.length > 0){
1916                        Promise.all(aPromesas)
1917                        .then(function(responses){
1918                            return Promise.all(responses.map(function(response){return response.json();}))
1919                        })
1920                        .then(function(data){
1921                            var allData = data[0];
1922                            parametros.listaExcepciones = data.exceptions;
1923                            data.forEach(function(d,idx) {
1924                                // var aValue = allData.value;
1925                                if(idx > 0){
1926                                    // aValue = [...aValue,...d.value]
1927                                    var tmpValue = [...allData.value, ...d.value]
1928                                    var tmpDecimalFormat = [...allData.valueDecimalFormat, ...d.valueDecimalFormat]
1929                                    var tmpFrecuenciaLabel = [...allData.dimension.freq.category.label, ...d.dimension.freq.category.label];
1930                                    var tmpFrecuenciaIndex = [...allData.dimension.freq.category.index, ...d.dimension.freq.category.index];
1931                                    var tmpPeriodsCategoryIndex = [...allData.dimension.periods.category.index, ...d.dimension.periods.category.index];
1932                                    var tmpPeriodsCategoryLabel = [...allData.dimension.periods.category.label, ...d.dimension.periods.category.label];
1933                                    var tmpUnitCategoryIndex = [...allData.dimension.unit.category.index, ...d.dimension.unit.category.index];
1934                                    var tmpUnitCategoryLabel = [...allData.dimension.unit.category.label, ...d.dimension.unit.category.label];
1935                                    var tmpIndicatorIndex = [...allData.dimension.indicator.category.index, ...d.dimension.indicator.category.index];
1936                                    var tmpIndicadorLabel = [...allData.dimension.indicator.category.label, ...d.dimension.indicator.category.label];
1937
1938                                    allData.value = tmpValue;
1939                                    allData.valueDecimalFormat = tmpDecimalFormat;
1940                                    allData.dimension.freq.category.label = tmpFrecuenciaLabel;
1941                                    allData.dimension.freq.category.index = tmpFrecuenciaIndex;
1942                                    allData.dimension.periods.category.index = tmpPeriodsCategoryIndex;
1943                                    allData.dimension.periods.category.label = tmpPeriodsCategoryLabel;
1944                                    allData.dimension.unit.category.index = tmpUnitCategoryIndex;
1945                                    allData.dimension.unit.category.label = tmpUnitCategoryLabel;
1946                                    allData.dimension.indicator.category.index = tmpIndicatorIndex;
1947                                    allData.dimension.indicator.category.label = tmpIndicadorLabel;
1948                                }
1949                            });                            
1950                            CasosCuadro(allData, parametros);
1951                        })
1952                        .catch(function(error){
1953                            console.log(error);
1954                        })
1955                    }
1956            } else {                    
1957                // ConsultaPostIndicadores(parametros);
1958                
1959                // console.log(">> FETCH METODO POST VALORINDICADOR " + parametros.tipoCuadro)
1960                var url = direccionServicio + '/ValorIndicador';
1961                var aPromesas = []
1962                var bodyParametros = {};
1963                for(var x = 0; x < numTematicas; x++){
1964                    _tematica = aTematicas[x];
1965                    var sIndicadores = aIndicadores.filter(function(i){ return i.tematica === aTematicas[x];})
1966                    sIndicadores = sIndicadores.map(function(i){ return i.indicador;}).join(",");
1967
1968                    bodyParametros.tematica = _tematica
1969                    bodyParametros.indicador = sIndicadores;
1970                    bodyParametros.areaGeografica = parametros.areaGeografica
1971                    bodyParametros.tema = "null";
1972                    bodyParametros.idioma = parametros.idioma;
1973                    bodyParametros.programa_ciclo = "null"; // 28/07/2021 cambio de nombre fuente por programa_ciclo y solo en metodo POST
1974                    bodyParametros.periodos = "null";
1975                    bodyParametros.typeChart = typeChart;
1976                    bodyParametros.orden = parametros.orden;
1977                    bodyParametros.nombreCorto = (parametros.nombreCorto == "true") ? 1 : 0;
1978                    bodyParametros.esOportuno = parametros.esOportuno;
1979                    bodyParametros.fechaInicio = parametros.fechaInicio;
1980                    bodyParametros.fechaFin = parametros.fechaFin;
1981                    bodyParametros.formato = "json";
1982                    bodyParametros.token = "563cbaa8-58bb-fef8-6763-1f1dae318f99";
1983                    bodyParametros.nomenclaturaEntidad = parametros.formatoAreaGeografica;
1984                    var promesa = fetch(url,{method:"POST",body:JSON.stringify(bodyParametros),headers:{"Content-type":"application/json; charset=UTF-8"}}, function(d){ return d})
1985                    aPromesas.push(promesa)
1986                }                  
1987                // Ejecuta todas las promesas acumuladas por tematica e indicadores
1988                if(aPromesas.length > 0){
1989                    Promise.all(aPromesas)
1990                    .then(function(responses){
1991                        return Promise.all(responses.map(function(response){return response.json();}))
1992                    })
1993                    .then(function(data){
1994                        var allData = data[0];
1995                        parametros.listaExcepciones = data.exceptions;
1996                        data.forEach(function(d,idx) {
1997                            // var aValue = allData.value;
1998                            if(idx > 0){
1999                                // aValue = [...aValue,...d.value]
2000                                var tmpValue = [...allData.value, ...d.value]
2001                                var tmpDecimalFormat = [...allData.valueDecimalFormat, ...d.valueDecimalFormat]
2002                                var tmpFrecuenciaLabel = [...allData.dimension.freq.category.label, ...d.dimension.freq.category.label];
2003                                var tmpFrecuenciaIndex = [...allData.dimension.freq.category.index, ...d.dimension.freq.category.index];
2004                                var tmpPeriodsCategoryIndex = [...allData.dimension.periods.category.index, ...d.dimension.periods.category.index];
2005                                var tmpPeriodsCategoryLabel = [...allData.dimension.periods.category.label, ...d.dimension.periods.category.label];
2006                                var tmpUnitCategoryIndex = [...allData.dimension.unit.category.index, ...d.dimension.unit.category.index];
2007                                var tmpUnitCategoryLabel = [...allData.dimension.unit.category.label, ...d.dimension.unit.category.label];
2008                                var tmpIndicatorIndex = [...allData.dimension.indicator.category.index, ...d.dimension.indicator.category.index];
2009                                var tmpIndicadorLabel = [...allData.dimension.indicator.category.label, ...d.dimension.indicator.category.label];
2010
2011                                allData.value = tmpValue;
2012                                allData.valueDecimalFormat = tmpDecimalFormat;
2013                                allData.dimension.freq.category.label = tmpFrecuenciaLabel;
2014                                allData.dimension.freq.category.index = tmpFrecuenciaIndex;
2015                                allData.dimension.periods.category.index = tmpPeriodsCategoryIndex;
2016                                allData.dimension.periods.category.label = tmpPeriodsCategoryLabel;
2017                                allData.dimension.unit.category.index = tmpUnitCategoryIndex;
2018                                allData.dimension.unit.category.label = tmpUnitCategoryLabel;
2019                                allData.dimension.indicator.category.index = tmpIndicatorIndex;
2020                                allData.dimension.indicator.category.label = tmpIndicadorLabel;
2021                            }
2022                        });                            
2023                        CasosCuadro(allData, parametros);
2024                    })
2025                    .catch(function(error){
2026                        console.log(error);
2027                    })
2028                }
2029
2030            }
2031        }
2032        /**
2033         * Descripcion: Funcion aislada para App México en cifras - informacion de localidades - caso #13v2
2034         * Nuevo conteo de municipios (por nuevo llamado a api inegi.org.mx/app/api/cateml/area/01)
2035         *  Uso de: data.dataMunicipios)
2036         *  Fecha: 01-03-2023      
2037         * @param {*} urlBase 
2038         * @param {*} datoIndicador 
2039         * @param {*} dataArea 
2040         * @param {*} parametros 
2041         */
2042        function CatemlLocalidades(urlBase, objDatosGeograficos, dataIndicador, dataArea, parametros, ageoTempoEUM){
2043            // Metodo para obtener la fecha de actualización de catalogo unico de claves geoestadisticas
2044            getFechaReferenciaActualizacion(function(aFecCorMun){
2045                
2046                //  var dataCoordenadas = {
2047                //     "type": "FeatureCollection",
2048                //     "features": [
2049                //         {
2050                //             "type": "Feature",
2051                //             "properties": {
2052                //                 "cve_ent": "03",
2053                //                 "cve_mun": "002",
2054                //                 "nom_mun": "Mulegé",
2055                //                 "count": 615
2056                //             },
2057                //             "geometry": {
2058                //                 "type": "LineString",
2059                //                 "coordinates": [
2060                //                     [
2061                //                         "26°24'21.60\" N",
2062                //                         "115°13'26.40\" W"
2063                //                     ],
2064                //                     [
2065                //                         "28°00'00.00\" N",
2066                //                         "111°25'26.40\" W"
2067                //                     ]
2068                //                 ]
2069                //             }
2070                //         }
2071                //     ]
2072                // }
2073                
2074                // // para testing local   
2075                // objDatosGeograficos.indicator = dataIndicador;            
2076                // if(ageoTempoEUM.length !== 6){                    
2077                //     $.extend(objDatosGeograficos, dataArea[0], dataCoordenadas.features[0].geometry,{HIJOS:dataCoordenadas.features[0].properties.count,referencia_actualizacion:aFecCorMun[0].nombre});
2078                // } else {
2079                //     $.extend(objDatosGeograficos, dataArea[0], dataCoordenadas.features[0].geometry,{referencia_actualizacion:aFecCorMun[0].nombre});
2080                // }
2081                // CasosCuadro(objDatosGeograficos, parametros);
2082            
2083                var dirCoordenadas = urlBase + 'app/api/cateml/Json/ageo/' + ageoTempoEUM;   
2084                $.getJSON(dirCoordenadas, function (dataCoordenadas) {
2085                    objDatosGeograficos.indicator = dataIndicador;                              
2086                    if(ageoTempoEUM.length !== 6){
2087                        $.extend(objDatosGeograficos, dataArea[0], dataCoordenadas.features[0].geometry,{HIJOS:dataCoordenadas.features[0].properties.count, referencia_actualizacion:aFecCorMun[0].nombre});
2088                        CasosCuadro(objDatosGeograficos, parametros);
2089                    } else {
2090                        $.extend(objDatosGeograficos, dataArea[0], dataCoordenadas.features[0].geometry,{referencia_actualizacion:aFecCorMun[0].nombre}); 
2091                        CasosCuadro(objDatosGeograficos, parametros);
2092                    }
2093                }); 
2094            })
2095        }
2096        /**
2097         * METADATO PARA CUADRO #12
2098         * Mexico en cifras
2099         * multiples tematicas para varios indicadores
2100         * fecha: 13-03-2023
2101         * @param {*} parametros 
2102         * @param {*} data 
2103         * @returns 
2104         */
2105        function ConsultaMetaIndicador12(parametros, data, callback) {
2106            /* console.log(parametros)
2107            console.log(data); */
2108            
2109            var direccionServicio = parametros.direccionServicio;
2110            var tematica = "";
2111            if (API_V == "v1_2") {
2112                    tematica = (parametros.tematica != "" ? parametros.tematica + "/" : "null/");
2113                    direccionServicio = C_direccionServicio_V + "_" + API_V.toLowerCase()+"/";
2114            } else if(API_V == "v1_1"){
2115                // No se hace nada
2116            } else { // API VERSION 3 FINAL
2117                tematica = (parametros.tematica != "" ? parametros.tematica + "/" : "undefined/");
2118                direccionServicio = C_direccionServicio_V + "_" + API_V.toLowerCase() + "/";
2119            }
2120
2121            direccionServicio = direccionServicio + extension_api_cuadros;
2122
2123            var dirServicio = direccionServicio + '/MetadatoIndicador';
2124            var periodos = data.dimension.periods.category.label;
2125            var primerPeriodo = (parametros.fechaInicio === null) ? null : parametros.fechaInicio;
2126            var ultimoPeriodo = (parametros.fechaFin === null) ? null : parametros.fechaFin;
2127            var periodo = data.dimension.freq.category.label[0].Value;
2128
2129            var numTematicas = parametros.indicadorValorCompuesto.todasTematicas.length;
2130            var aTematicas = parametros.indicadorValorCompuesto.todasTematicas;
2131            var aIndicadores = parametros.indicadorDepurado;
2132            
2133            var metaRequestPromise = null;
2134            if (parametros.indicadorDepurado.length <= 10) {
2135                    var dirMetaDatos = "";//dirServicio + "/" + parametros.idioma + '/$indicadores/' + parametros.areaGeografica + '/' + ultimoPeriodo + '/null/$tematica/json/' + parametros.token;
2136                    // if (aCuadrosNuevoMetodoPost.indexOf(parseInt(parametros.tipoCuadro)) > -1) { // nuevo metodo metadatoindicador GET
2137                        //comparar primer posicion con ultima para determinar cual es el orden de los periodos    
2138                        var perUno = parseInt(periodos[0].Value.split("/")[0])
2139                        var perDos = parseInt(periodos[periodos.length-1].Value.split("/")[0])                            
2140
2141                        if(perUno < perDos){
2142                            primerPeriodo = periodos[0].Value;
2143                            ultimoPeriodo = periodos[periodos.length-1].Value;
2144                            
2145                        } else if(perUno > perDos){
2146                            primerPeriodo = periodos[periodos.length-1].Value;
2147                            ultimoPeriodo = periodos[0].Value
2148
2149                        } else { // si son iguales -> comprar meses si es que tiene
2150                            if(periodos[0].Value.indexOf("/") > -1){ // traen meses: 2019/05
2151                                var mesUno = parseInt(periodos[0].Value.split("/")[1]);
2152                                var mesDos = parseInt(periodos[periodos.length-1].Value.split("/")[1]);
2153                                if(mesUno < mesDos){
2154                                    primerPeriodo = periodos[0].Value;
2155                                    ultimoPeriodo = periodos[periodos.length-1].Value
2156                                } else {
2157                                    primerPeriodo = periodos[periodos.length-1].Value
2158                                    ultimoPeriodo = periodos[0].Value;
2159                                }
2160                            } else {
2161                                primerPeriodo = periodos[periodos.length-1].Value;
2162                                ultimoPeriodo = periodos[0].Value
2163                            }
2164
2165                        }                            
2166                        primerPeriodo = (primerPeriodo.indexOf("/") > -1? primerPeriodo.replaceAll("/","_") : primerPeriodo)
2167                        ultimoPeriodo = (ultimoPeriodo.indexOf("/") > -1? ultimoPeriodo.replaceAll("/","_") : ultimoPeriodo+"_12");
2168                        dirMetaDatos = dirServicio + '/' + parametros.idioma + '/$indicadores/' + parametros.areaGeografica + '/' + primerPeriodo + '/' + ultimoPeriodo + '/null/$tematica/json/' + parametros.token;
2169                    // }
2170                   
2171                    
2172                    // metaRequestPromise = $.getJSON(dirMetaDatos + "?callback=?", null).then(function (data) { return data; });
2173                    // promesas
2174                   /*  var numTematicas = parametros.indicadorValorCompuesto.todasTematicas.length;
2175                    var aTematicas = parametros.indicadorValorCompuesto.todasTematicas;
2176                    var aIndicadores = parametros.indicadorDepurado; */
2177                    var aPromesas = []
2178                    for(var x = 0; x < numTematicas; x++){
2179                        _tematica = aTematicas[x];
2180                        var sIndicadores = aIndicadores.filter(function(i){ return i.tematica === aTematicas[x];})
2181                        sIndicadores = sIndicadores.map(function(i){ return i.indicador;}).join(",");
2182                        var url = dirMetaDatos.replaceAll("$indicadores", sIndicadores);
2183                        url = url.replaceAll("$tematica", _tematica);
2184                        var promesa = fetch(url, function(d){ return d})
2185                        aPromesas.push(promesa)
2186                    }  
2187                  
2188                    if(aPromesas.length > 0){
2189                        Promise.all(aPromesas).then(function(responses){
2190                            return Promise.all(responses.map(function(response){return response.json();}))
2191                        })
2192                        .then(function(data){   
2193                            // console.log(data);                         
2194                            var allDataMetadato = data[0];
2195                            parametros.listaExcepciones = data.exceptions;
2196                            data.forEach(function(d,idx) {
2197                                // var aValue = allDataMetadato.value;
2198                                if(idx > 0){
2199                                    // aValue = [...aValue,...d.value]
2200                                    if(d.CIFRAS_ESTATUS !== null){
2201                                        var tmpCIFRAS_ESTATUS = [...allDataMetadato.CIFRAS_ESTATUS, ...d.CIFRAS_ESTATUS]
2202                                        allDataMetadato.CIFRAS_ESTATUS = tmpCIFRAS_ESTATUS;
2203                                    }
2204                                    if(d.FUENTES !== null){
2205                                        var tmpFUENTES = [...allDataMetadato.FUENTES, ...d.FUENTES]
2206                                        allDataMetadato.FUENTES = tmpFUENTES;
2207                                    }
2208                                    if(d.NOTAS !== null){
2209                                        var tmpNOTAS = [...allDataMetadato.NOTAS, ...d.NOTAS]
2210                                        allDataMetadato.NOTAS = tmpNOTAS;
2211                                    }
2212                                    
2213
2214                                }
2215                            });      
2216                            callback(allDataMetadato)
2217                        })
2218                        .catch(function(error){
2219                            console.log(error);
2220                        })
2221                                          
2222                    }
2223            } else {
2224              
2225                primerPeriodo = periodos[0].Value.indexOf("/") > -1 ? replaceAll("/", "_", periodos[0].Value) : periodos[0].Value;
2226                ultimoPeriodo = periodos[periodos.length - 1].Value.indexOf("/") > -1 ? replaceAll("/", "_", periodos[periodos.length - 1].Value) : periodos[periodos.length - 1].Value;
2227                ultimoPeriodo = (ultimoPeriodo.indexOf(primerPeriodo) > -1) ? ultimoPeriodo.split("_")[0] + "_12" : ultimoPeriodo; // si el año del periodo es el mismo en los 2
2228                // si el periodo es anual solo de enviarse el año sin periodo       
2229                if (periodo == "Anual") {
2230                        primerPeriodo = primerPeriodo.split("_")[0];
2231                        ultimoPeriodo = ultimoPeriodo.split("_")[0];
2232                }
2233              
2234                // valida las fechas
2235                const comparaPeriodos = esMenor(primerPeriodo, ultimoPeriodo); 
2236                if (comparaPeriodos === false) {
2237                    primerPeriodo = ultimoPeriodo;
2238                    ultimoPeriodo = primerPeriodo;
2239                }   
2240
2241                var url = direccionServicio + 'MetadatoIndicadorV2';
2242                var aPromesas = []
2243                var bodyParametros = {};
2244                for(var x = 0; x < numTematicas; x++){
2245                    _tematica = aTematicas[x];
2246                    var sIndicadores = aIndicadores.filter(function(i){ return i.tematica === aTematicas[x];})
2247                    sIndicadores = sIndicadores.map(function(i){ return i.indicador;}).join(",");
2248
2249                    bodyParametros.tematica = _tematica
2250                    bodyParametros.indicador = sIndicadores;
2251                    bodyParametros.areaGeografica = parametros.areaGeografica
2252                    bodyParametros.idioma = parametros.idioma;
2253                    bodyParametros.periodoinicial = primerPeriodo;
2254                    bodyParametros.periodofinal = ultimoPeriodo;
2255                    bodyParametros.formato = "json";
2256                    bodyParametros.mostrarGenerica = "null";
2257                    bodyParametros.token = "563cbaa8-58bb-fef8-6763-1f1dae318f99";
2258                    // console.log(url)
2259                    // console.log(bodyParametros)
2260                    var promesa = fetch(url,{method:"POST",body:JSON.stringify(bodyParametros),headers:{"Content-type":"application/json; charset=UTF-8"}}, function(d){ return d})
2261                    aPromesas.push(promesa)
2262                }  
2263                // Ejecuta todas las promesas acumuladas por tematica e indicadores
2264                if(aPromesas.length > 0){
2265                  
2266                    Promise.all(aPromesas)
2267                    .then(function(responses){
2268                        return Promise.all(responses.map(function(response){return response.json();}))
2269                    })
2270                    .then(function(data){
2271                        //  console.log(data);                         
2272                         var allDataMetadato = data[0];
2273                         parametros.listaExcepciones = data.exceptions;
2274                         data.forEach(function(d,idx) {
2275                             // var aValue = allDataMetadato.value;
2276                             if(idx > 0){
2277                                 // aValue = [...aValue,...d.value]
2278                                 if(d.CIFRAS_ESTATUS !== null){
2279                                     var tmpCIFRAS_ESTATUS = [...allDataMetadato.CIFRAS_ESTATUS, ...d.CIFRAS_ESTATUS]
2280                                     allDataMetadato.CIFRAS_ESTATUS = tmpCIFRAS_ESTATUS;
2281                                 }
2282                                 if(d.FUENTES !== null){
2283                                     var tmpFUENTES = [...allDataMetadato.FUENTES, ...d.FUENTES]
2284                                     allDataMetadato.FUENTES = tmpFUENTES;
2285                                 }
2286                                 if(d.NOTAS !== null){
2287                                     var tmpNOTAS = [...allDataMetadato.NOTAS, ...d.NOTAS]
2288                                     allDataMetadato.NOTAS = tmpNOTAS;
2289                                 }
2290                                 
2291
2292                             }
2293                         });      
2294                         callback(allDataMetadato)
2295                        
2296                    })
2297                    .catch(function(error){
2298                        console.log(error);
2299                    })
2300                }
2301            }
2302        
2303        }
2304        function esMenor(fecha1, fecha2){
2305            // Función para normalizar la fecha a YYYY-MM-DD
2306            const normalizarFecha = (fecha) => {
2307                const partes = fecha.split('_');
2308                const anio = partes[0];
2309                const mes = partes[1] || '01'; // Si no hay mes, usar enero
2310                const dia = partes.length === 2 ? '01' : partes[2] || '01'; // Si es YYYY_MM, usar primer día
2311                return new Date(`${anio}-${mes.padStart(2, '0')}-${dia.padStart(2, '0')}`);
2312            };
2313
2314            const date1 = normalizarFecha(fecha1);
2315            const date2 = normalizarFecha(fecha2);
2316
2317            if (date1 < date2) return true;
2318            if (date1 > date2) return false;
2319            return true;
2320        }
2321
2322        /// <summary>   Obtiene los metadato indicador solo por el estatis cifra. </summary>
2323        ///
2324        /// <remarks>   @rovalx, 27/02/2018. </remarks>
2325        /// <remarks>   Utilizado actualmente solo para cuadro #12 </remarks> 
2326        ///    
2327        function ConsultaMetaIndicador(parametros, data) {
2328                var direccionServicio = parametros.direccionServicio;
2329                var tematica = "";
2330                if (API_V == "v1_2") {
2331                        tematica = (parametros.tematica != "" ? parametros.tematica + "/" : "null/");
2332                        direccionServicio = C_direccionServicio_V + "_" + API_V.toLowerCase()+"/";
2333                } else if(API_V == "v1_1"){
2334                    // No se hace nada
2335                } else { // API VERSION 3 FINAL
2336                    tematica = (parametros.tematica != "" ? parametros.tematica + "/" : "undefined/");
2337                    direccionServicio = C_direccionServicio_V + "_" + API_V.toLowerCase() + "/";
2338                }
2339
2340                direccionServicio = direccionServicio + extension_api_cuadros;
2341
2342                var dirServicio = direccionServicio + 'MetadatoIndicador';
2343                var periodos = data.dimension.periods.category.label;
2344                var primerPeriodo = (parametros.fechaInicio === null) ? null : parametros.fechaInicio;
2345                var ultimoPeriodo = (parametros.fechaFin === null) ? null : parametros.fechaFin;
2346                var periodo = data.dimension.freq.category.label[0].Value;
2347                
2348                var metaRequestPromise = null;
2349                if (parametros.indicadorDepurado.length < 200) {
2350                        var dirMetaDatos = dirServicio + "/" + parametros.idioma + '/' + parametros.indicadorDepurado + '/' + parametros.areaGeografica + '/' + ultimoPeriodo + '/null/' + tematica +'json/' + parametros.token;
2351                        // if (aCuadrosNuevoMetodoPost.indexOf(parseInt(parametros.tipoCuadro)) > -1) { // nuevo metodo metadatoindicador GET
2352                            //comparar primer posicion con ultima para determinar cual es el orden de los periodos    
2353                            var perUno = parseInt(periodos[0].Value.split("/")[0])
2354                            var perDos = parseInt(periodos[periodos.length-1].Value.split("/")[0])                            
2355
2356                            if(perUno < perDos){
2357                                primerPeriodo = periodos[0].Value;
2358                                ultimoPeriodo = periodos[periodos.length-1].Value;
2359                                
2360                            } else if(perUno > perDos){
2361                                primerPeriodo = periodos[periodos.length-1].Value;
2362                                ultimoPeriodo = periodos[0].Value
2363
2364                            } else { // si son iguales -> comprar meses si es que tiene
2365                                if(periodos[0].Value.indexOf("/") > -1){ // traen meses: 2019/05
2366                                    var mesUno = parseInt(periodos[0].Value.split("/")[1]);
2367                                    var mesDos = parseInt(periodos[periodos.length-1].Value.split("/")[1]);
2368                                    if(mesUno < mesDos){
2369                                        primerPeriodo = periodos[0].Value;
2370                                        ultimoPeriodo = periodos[periodos.length-1].Value
2371                                    } else {
2372                                        primerPeriodo = periodos[periodos.length-1].Value
2373                                        ultimoPeriodo = periodos[0].Value;
2374                                    }
2375                                } else {
2376                                    primerPeriodo = periodos[periodos.length-1].Value;
2377                                    ultimoPeriodo = periodos[0].Value
2378                                }
2379
2380                            }                            
2381                            primerPeriodo = (primerPeriodo.indexOf("/") > -1? primerPeriodo.replaceAll("/","_") : primerPeriodo)
2382                            ultimoPeriodo = (ultimoPeriodo.indexOf("/") > -1? ultimoPeriodo.replaceAll("/","_") : ultimoPeriodo+"_12");
2383                            dirMetaDatos = dirServicio + '/' + parametros.idioma + '/' + parametros.indicadorDepurado + '/' + parametros.areaGeografica + '/' + primerPeriodo + '/' + ultimoPeriodo + '/null/' + tematica +'json/' + parametros.token;
2384                        // }
2385                        // si el periodo es anual solo de enviarse el año sin periodo       
2386                        /* if (periodo == "Anual") {
2387                            primerPeriodo = primerPeriodo.split("_")[0];
2388                            ultimoPeriodo = ultimoPeriodo.split("_")[0];
2389                        } */
2390                        
2391                        metaRequestPromise = $.getJSON(dirMetaDatos + "?callback=?", null).then(function (data) { return data; });
2392                } else {
2393                        if (aCuadrosNuevoMetodoPost.indexOf(parseInt(parametros.tipoCuadro)) > -1) { // nuevo metodo metadatoindicador POST                
2394                                primerPeriodo = periodos[0].Value.indexOf("/") > -1 ? replaceAll("/", "_", periodos[0].Value) : periodos[0].Value;
2395                                ultimoPeriodo = periodos[periodos.length - 1].Value.indexOf("/") > -1 ? replaceAll("/", "_", periodos[periodos.length - 1].Value) : periodos[periodos.length - 1].Value;
2396                                ultimoPeriodo = (ultimoPeriodo.indexOf(primerPeriodo) > -1) ? ultimoPeriodo.split("_")[0] + "_12" : ultimoPeriodo; // si el año del periodo es el mismo en los 2
2397                                // si el periodo es anual solo de enviarse el año sin periodo       
2398                                if (periodo == "Anual") {
2399                                        primerPeriodo = primerPeriodo.split("_")[0];
2400                                        ultimoPeriodo = ultimoPeriodo.split("_")[0];
2401                                }
2402                                dirServicio = direccionServicio + '/MetadatoIndicadorV2';
2403                                var datosServicio = {
2404                                        idioma: parametros.idioma,
2405                                        indicador: parametros.indicadorDepurado,
2406                                        areaGeografica: parametros.areaGeografica,
2407                                        periodoinicial: primerPeriodo,
2408                                        periodofinal: ultimoPeriodo,
2409                                        mostrarGenerica: "null",
2410                                        formato: "json",
2411                                        token: parametros.token
2412                                }
2413                                if (tematica != "") {
2414                                        datosServicio.tematica = tematica.replace("/","");
2415                                }  
2416                        } else {
2417                                var datosServicio = {
2418                                        idioma: parametros.idioma,
2419                                        indicador: parametros.indicadorDepurado,
2420                                        areaGeografica: parametros.areaGeografica,
2421                                        periodo: ultimoPeriodo,
2422                                        mostrarGenerica: "null",
2423                                        formato: "json",
2424                                        token: parametros.token
2425                                }
2426                                if (tematica != "") {
2427                                        datosServicio.tematica = tematica.replace("/","");
2428                                }  
2429                        }
2430                        var datoSend = JSON.stringify(datosServicio);
2431                        var _this = this;
2432                        var tipo = "POST";
2433                        metaRequestPromise = $.ajax({
2434                                // type: tipo,
2435                                method: tipo,
2436                                url: dirServicio,
2437                                contentType: "application/json",
2438                                dataType: "json",
2439                                data: datoSend,
2440                                // processData: true
2441                        }).then(function (data) { return data; });
2442                }
2443                return metaRequestPromise;
2444            
2445        }
2446        
2447        /// <summary>   Convierte el formato de area geografica anterior en el nuevo de 2 digitos por entidad y 3 por municipio. </summary>
2448        ///
2449        /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
2450        ///
2451        /// <param name="areaGeografica">   Clave de area geografica. </param>
2452        ///
2453        /// <returns>   . </returns>
2454        function ConvierteAreaGeografica(areaGeografica) {
2455            var areaFormateada = ""
2456            if (areaGeografica.indexOf("|") > -1) {
2457                var entidadV = areaGeografica.split("|")[0];
2458                if (entidadV == undefined)
2459                entidadV = "0";
2460                var municipioV = (areaGeografica).toString().split("|")[1];
2461                if (municipioV == undefined)
2462                municipioV = "0";
2463                areaFormateada = AgregarCeros(entidadV, 2) + AgregarCeros(municipioV, 3);
2464            }
2465            else
2466            areaFormateada = areaGeografica;
2467            return areaFormateada;
2468        }
2469        
2470        /// <summary>   Despliega un mensaje de error en el contenedor cuando falla alguna consulta. </summary>
2471        ///
2472        /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
2473        ///
2474        /// <param name="contenedor">   Contenedor del componente. </param>
2475        /// <param name="errorCode">    Codigo de error. </param>
2476        /// <param name="errorInfo">    Informacion que describe el error. </param>
2477        ///
2478        /// <returns>   . </returns>
2479        function MostrarMensajeErrorCuadro(contenedor, errorCode, errorInfo) {
2480            document.getElementById("lblMensaje" + contenedor).style.display = "inline";
2481            document.getElementById("TableHeader" + contenedor).style.display = "none";
2482            if (errorCode == "110" || errorCode == "503")
2483            document.getElementById("lblMensaje" + contenedor).innerHTML = "Ocurrió un error inesperado, favor de intentar más tarde";
2484            else
2485            document.getElementById("lblMensaje" + contenedor).innerHTML = errorInfo;
2486        }
2487        
2488        /// <summary>   Consulta de valores por HTTP POST, se invoca cuando se consultan varias series y se sobrepasa la
2489        ///             longitud maxima de url. </summary>
2490        ///
2491        /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
2492        ///
2493        /// <param name="parametros">   Objeto de parametros de configuracion. </param>
2494        ///
2495        /// <returns>   . </returns>
2496        function ConsultaPostIndicadores(parametros) {    
2497            var direccionServicio = parametros.direccionServicio;
2498            var typeChart = (parametros.tipoCuadro === "12" ? 4 : 3);
2499            //  parametros.direccionServicio + '/ValorIndicador/' + parametros.indicadorDepurado + "/" + parametros.areaGeografica + '/null/es/null/null/3/null/' + parametros.nombreCorto + '/' + parametros.esOportuno + '/' + parametros.fe
2499chaInicio + '/' + parametros.fechaFin + "/" + parametros.formatoAreaGeografica + '/json/563cbaa8-58bb-fef8-6763-1f1dae318f99?callback=?', null, function (data) { var direccionServicio = parametros.direccionServicio;
2500            // var tematica = "";
2501            if (API_V == "v1_2") {
2502                parametros.tematica = (parametros.tematica != "" ? parametros.tematica + "/" : "null/");
2503                direccionServicio = C_direccionServicio_V + "_" + API_V.toLowerCase() + "/";
2504            } else if(API_V == "v1_1"){
2505                // No se hace nada
2506                parametros.tematica = "";
2507            } else { // API VERSION 3 FINAL
2508                parametros.tematica = (parametros.tematica != "" ? parametros.tematica : "undefined");
2509                direccionServicio = C_direccionServicio_V + "_" + API_V.toLowerCase() + "/";
2510            }
2511            direccionServicio = direccionServicio + extension_api_cuadros;
2512            // console.log(tematica);
2513
2514            var bdireccionServicio = direccionServicio + '/ValorIndicador';
2515            var dataGraf = DataCuadro(parametros.indicadorDepurado,
2516                parametros.areaGeografica,
2517                "null",
2518                parametros.idioma,
2519                "null",
2520                "null",
2521                typeChart,
2522                parametros.orden, parametros.nombreCorto, parametros.esOportuno, parametros.fe
2522chaInicio,
2523                parametros.fechaFin,
2524                parametros.formatoAreaGeografica
2525                , "json", "563cbaa8-58bb-fef8-6763-1f1dae318f99", parametros.tematica
2526            );
2527            // var _this = this;
2528            var tipo = "POST";
2529            $.ajax({
2530                method: tipo,
2531                url: bdireccionServicio,                        
2532                contentType: "application/json",
2533                dataType: "json",
2534                data: dataGraf,                        
2535                success: function (data) {
2536                    parametros.listaExcepciones = data.exceptions;
2537                    switch (parametros.condicionCuadro) {
2538                        case "CuadroGruposA":
2539                            CasoCompuesto(data, parametros);
2540                        break;
2541                        default:
2542                            CasosCuadro(data, parametros);
2543                        break;
2544                        
2545                    }
2546                },
2547                error: function (jqXHR, textStatus, errorThrown) {
2548                    console.log(textStatus, errorThrown);
2549                } 
2550            });
2551                
2552        }
2553            
2554            /// <summary>   Consulta de datos por HTTP GET. </summary>
2555            ///
2556            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
2557            ///
2558            /// <param name="indicador">        Clave de indicador. </param>
2559            /// <param name="areaGeografica">   Clave de area geografica. </param>
2560            /// <param name="tema">             Clave de tema. </param>
2561            /// <param name="idioma">           Idioma de consulta. </param>
2562            /// <param name="fuente">           Clave de fuente. </param>
2563            /// <param name="periodos">         Periodos. </param>
2564            /// <param name="typeChart">        Tipo de cuadro. </param>
2565            /// <param name="orden">            Orden ascendente o descendente. </param>
2566            /// <param name="nombreCorto">      Muestra nombre corto de los indicadores. </param>
2567            /// <param name="esOportuno">       Muestra valor oportuno. </param>
2568            /// <param name="fechaInicio">      Fecha de inicio de la consulta. </param>
2569            /// <param name="fechaFin">         Fecha de fin de la consulta. </param>
2570            /// <param name="formatoArea">      Muestra nombre abreviado de area geografica. </param>
2571            /// <param name="formato">          Formato xml o JSON. </param>
2572            /// <param name="token">            Clave token de autenticacion. </param>
2573            ///
2574            /// <returns>   . </returns>
2575            function DataCuadro(indicador, areaGeografica, tema, idioma, fuente, periodos, typeChart, orden, nombreCorto, esOportuno, fechaInicio, fechaFin, formatoArea, formato, token, tematica) {
2576                var datos = {};
2577                datos.indicador = indicador;
2578                datos.areaGeografica = areaGeografica;
2579                datos.tema = tema;
2580                datos.idioma = idioma;
2581                // datos.fuente = fuente;
2582                datos.programa_ciclo = fuente; // 28/07/2021 cambio de nombre fuente por programa_ciclo y solo en metodo POST
2583                datos.periodos = periodos;
2584                datos.typeChart = typeChart;
2585                datos.orden = orden;
2586                datos.nombreCorto = (nombreCorto == "true") ? 1 : 0;
2587                datos.esOportuno = esOportuno;
2588                datos.fechaInicio = fechaInicio;
2589                datos.fechaFin = fechaFin;
2590                datos.formato = formato;
2591                datos.token = token;
2592                datos.nomenclaturaEntidad = formatoArea;
2593                datos.tematica = tematica
2594                //this.toJsonString = function () { return JSON.stringify(this); };
2595                return JSON.stringify(datos);
2596                
2597            }
2598            
2599            /// <summary>   Identifica que tipo de plantilla se dibuja bajo el cuadro. </summary>
2600            ///
2601            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
2602            ///
2603            /// <param name="muestraNota">          Mostrar nota. </param>
2604            /// <param name="muestraFuente">        Mostrar fuente. </param>
2605            /// <param name="fuentePorParametro">   Valor de fuente por parametro. </param>
2606            ///
2607            /// <returns>   . </returns>
2608            this.EvaluaFooter = function (muestraNota, muestraFuente, fuentePorParametro) {
2609                var condicionFooter = "ambosFooter";
2610                // aov checar nota parametro
2611                //if (muestraNota == "true" && muestraFuente == "true") {
2612                //    condicionFooter = "ambosFooter";
2613                //}
2614                //if (muestraNota == "true" && muestraFuente != "true") {
2615                //    condicionFooter = "footerNota";
2616                //}
2617                //if (muestraNota != "true" && muestraFuente == "true") {
2618                //    condicionFooter = "fuenteFooter";
2619                //}
2620                //if (muestraNota != "true" && muestraFuente != "true") {
2621                //    condicionFooter = "noFooter";
2622                //}
2623                
2624                return condicionFooter;
2625            }
2626            
2627            /// <summary>   Dibuja plantilla de notas y fuentes. </summary>
2628            ///
2629            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
2630            ///
2631            /// <param name="footer">       Tipo de plantilla. </param>
2632            /// <param name="sufijo">
2632       Nombre del contenedor. </param>
2633            /// <param name="parametros">   Objeto de parametros de configuracion. </param>
2634            ///
2635            /// <returns>   . </returns>
2636            this.FooterGrafica = function (footer, sufijo, parametros) {
2637                var htmlFooter = "";
2638                var tabIndex = parametros.tabInd; // agregado 14/oct/2020 solamente al contenedor de fuentes y llamadas
2639                tabIndex++;
2640                if (footer != "noFooter") {
2641                    htmlFooter += '<div id="divFuentes' + sufijo + '" style= "height:15%;width:100%; overflow-y: auto; display:' + MostrarAreaMetadatos(footer) + ';" tabindex="'+ tabIndex +'">';
2642                    //  if (footer == "footerNota" || footer == "ambosFooter") {
2643                    if (parametros.muestraNota == "true" || parametros.notaParametro != "" || parametros.mostrarCifraEstatus === "true" || parametros.mostrarSiglaExcepcion === "true")
2644                    htmlFooter += '    <table id="tableTitleNotas' + sufijo + '"></table>';
2645                }
2646                if (parametros.mostrarSiglaExcepcion == "true") {
2647                    htmlFooter += '    <table id="tableExceptions' + sufijo + '" style="vertical-align:left!Important;text-align:left !Important"></table>';
2648                }
2649                //SNM 15.06.2018 cambio de posición solicitd -Nuevo sitio [94]
2650                if (parametros.mostrarCifraEstatus == "true") {
2651                    // htmlFooter += '    <table id="tableTitleCifras' + sufijo + '"></table>';
2652                    htmlFooter += '    <table id="tableCifras' + sufijo + '"></table>';
2653                }
2654                
2655                //SNM 15.06.2018 Se saco de la condicion de arriba para que aprezca despues de los estatus - Nuevo sitio [94]
2656                if (footer != "noFooter") {
2657                    htmlFooter += '    <table id="tableNota' + sufijo + '" style="vertical-align:left!Important;text-align:left !Important"></table>';
2658                }
2659                
2660                
2661                if (parametros.muestraFuente == "true" || parametros.fuentePorParametro != "") {
2662                    htmlFooter += '    <table id="tableTitleFuentes' + sufijo + '"></table>';
2663                    htmlFooter += '    <table id="tableFuentes' + sufijo + '" style="vertical-align:left!Important;text-align:left !Important"></table>'
2664                }
2665                
2666                if (parametros.mostrarSiglaExcepcion == "true") {
2667                    htmlFooter += '    <table id="tableSiglas' + sufijo + '"></table>';
2668                }
2669                // Para mostrar la leyenda con los colores e informacion segun las condiciones del archivo json para coeficiente de variacion en datos de precision (Añadido 15-06-2021)                
2670                // Para datos de Cobertura (cobertura de diseño) para cuadro #8 (Añadido 14-12-2022)   
2671                // Ahora solo se valida por el tipo de cuadro: precision, idtema queda obsoleto (14-02-2023)                             
2672                // if((parametros.tipoCuadro === "precision" && parametros.idtema != "null") || (parametros.tipoCuadro === "8")){
2673                if(parametros.tipoCuadro === "precision" || parametros.tipoCuadro === "8"){
2674                    var idTipoCuadro = "divReglasPrecision" + sufijo;
2675                    htmlFooter += '<div id="'+ idTipoCuadro + sufijo +'">'
2676                        +'<table id="tableReglasPrecision'+ sufijo +'" style="line-height:1.5"></table></div>'
2677                        +'<div id="divReglasPrecisionExport'+ sufijo +'" style="display:none" informacion_extra="0">'
2678                            +'<table id="tableReglasPrecisionExportNotas'+ sufijo +'" style="line-height:1.5"></table>'
2679                            +'<table id="tableReglasPrecisionExport'+ sufijo +'" style="line-height:1.5"></table>'
2680                        +'</div>';
2681                }               
2682                
2683                htmlFooter += '</div>';
2684                return htmlFooter;
2685            }
2686            
2687            /// <summary>   Muestra u oculta metadatos. </summary>
2688            ///
2689            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
2690            ///
2691            /// <param name="tipoFooter">   Tipo de footer. </param>
2692            ///
2693            /// <returns>   . </returns>
2694            function MostrarAreaMetadatos(tipoFooter) {
2695                var display = "block";
2696                if (tipoFooter == "noFooter")
2697                display = "none";
2698                return display;
2699            }
2700            
2701            /// <summary>   Obtiene el valor de un parametro por nombre, si no existe asigna un valor default. </summary>
2702            ///
2703            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
2704            ///
2705            /// <param name="valorEvaluando">   Valor evaluado. </param>
2706            /// <param name="valorDefault">     Valor por default. </param>
2707            ///
2708            /// <returns>   . </returns>
2709            function EvaluaParametro(valorEvaluando, valorDefault) {
2710                var valorReturn = valorEvaluando;
2711                if (valorEvaluando == null)
2712                valorReturn = valorDefault;
2713                if (valorEvaluando == undefined)
2714                valorReturn = valorDefault;
2715                return valorReturn;
2716            }
2717            
2718            /// <summary>   Oculta animacion de carga. </summary>
2719            ///
2720            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
2721            ///
2722            /// <param name="parametros">   Objeto de parametros de configuracion. </param>
2723            ///
2724            /// <returns>   . </returns>
2725            function OcultaCarga(parametros) {
2726                document.getElementById("divCargaCuadro" + parametros.contenedorCuadro).style.display = "none";
2727            }
2728            
2729            /// <summary>   Agrega ceros a la izquierda para un valor numerico. </summary>
2730            ///
2731            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
2732            ///
2733            /// <param name="valor">            Valor  numerico. </param>
2734            /// <param name="cantidadCeros">    Cantidad de ceros. </param>
2735            ///
2736            /// <returns>   . </returns>
2737            function AgregarCeros(valor, cantidadCeros) {
2738                var result = valor;
2739                switch (cantidadCeros) {
2740                    case 2:
2741                    if (parseInt(valor) < 10)
2742                    result = "0" + valor;
2743                    break;
2744                    case 3:
2745                    if (parseInt(valor) < 10)
2746                    result = "00" + valor;
2747                    if (parseInt(valor) > 10 && parseInt(valor) > 100)
2748                    result = "00" + valor;
2749                    
2750                    break;
2751                    default:
2752                    break;
2753                    
2754                }
2755                
2756                return result;
2757            }
2758            
2759            /// <summary>   Genera cabecera de la tabla con un solo nivel. </summary>
2760            ///
2761            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
2762            ///
2763            /// <param name="label">            Texto de columna principal. </param>
2764            /// <param name="cantidadColumnas"> Cantidad de columnas. </param>
2765            /// <param name="titulosColumnas">  Titulos de columnas. </param>
2766            /// <param name="parametros">       Objeto de parametros de configuracion. </param>
2767            ///
2768            /// <returns>   . </returns>
2769            function DibujaCabeceraUnNivelGenerico(label, cantidadColumnas, titulosColumnas, parametros, periodos) {
2770                var cabeceras = "";
2771                var labelColumnas = "";
2772                var aPeriodos = periodos || []
2773
2774                if (parametros.tipoCuadro == "6" || parametros.tipoCuadro == "21") {
2775                    if (titulosColumnas.indexOf("|") !== -1 || titulosColumnas.indexOf("-") !== -1) { // si el formato es agrupado ejemplo: [Grupo1-col1,col2,col3|Grupo2-col4,col5|...] (cuado 2: 13-04-2018 10:30 T[65])
2776                        cabeceras += '<tr>'
2777                        //columna principal (1)
2778                        if (label.indexOf(",") !== -1) {
2779                            labelColumnas = label.split(",");
2780                            cabeceras += '<tr>'
2781                            for (var x = 0; x < labelColumnas.length; x++) {
2782                                cabeceras += '<th class ="Th" bgcolor="#DDD" rowspan="2">' + labelColumnas[x] + '</th>';
2783                            }
2784                        } else {
2785                            cabeceras = '<tr><th class ="Th" bgcolor="#DDD" rowspan="2">' + label + '</th>';
2786                        }
2787                        //titulos de grupos principales
2788                        // tituloGrupo puede tener 3 valores: (agregado: 28-09-2
2788020) parametro tcl
2789                        // 1 - Si en el parametro se indica vacio sera igual a vacio
2790                        // 2 - Si en el parametro se indica $periodo sera igual a periodo que regresen los datos
2791                        // 3 - Si en el parametro se indica con un texto sera igual a ese texto especificado.
2792                        var grupos = titulosColumnas.split("|");
2793                        var tituloGrupo = "";
2794                        for (var x = 0; x < grupos.length; x++) {
2795                            var totalGrupo = (grupos[x].split("-")[1]).split(",").length;
2796                            if(grupos[x].split("-")[0].indexOf("$periodo") > -1){
2797                                tituloGrupo = periodos[0].Value;
2798                            } else if(grupos[x].split("-")[0] === ""){
2799                                tituloGrupo = "";
2800                            } else {
2801                                tituloGrupo = grupos[x].split("-")[0];
2802                            }
2803                            cabeceras += '<th class ="Th" bgcolor="#DDD" colspan="' + totalGrupo + '">' + tituloGrupo + '</th>';
2804                        }
2805                        cabeceras += '</tr><tr>';
2806                        //titulos columnas secundarias (datos)                
2807                        for (var a = 0; a < grupos.length; a++) { // ciclo para grupos
2808                            var columnas = (grupos[a].split("-")[1]).split(","); // Ejemplo: Grupo1-col1,col2...
2809                            for (var b = 0; b < columnas.length; b++) { // ciclo para columnas secundarias
2810                                var tituloColumma = columnas[b];
2811                                cabeceras += '<th class ="Th" bgcolor="#DDD" >' + tituloColumma + '</th>';
2812                            }
2813                        }
2814                        
2815                        
2816                        cabeceras += '</tr><tr>';
2817                    } else {
2818                        var listaTitulosColumnas = titulosColumnas.split(",");
2819                        if (label.indexOf(",") !== -1) {
2820                            labelColumnas = label.split(",");
2821                            cabeceras += '<tr>'
2822                            for (var x = 0; x < labelColumnas.length; x++) {
2823                                cabeceras += '<th class ="Th" bgcolor="#DDD" >' + labelColumnas[x] + '</td>';
2824                            }
2825                        } else {
2826                            cabeceras = '<tr><th class ="Th" bgcolor="#DDD" >' + label + '</td>';
2827                        }
2828                        for (var i = 0; i < cantidadColumnas; i++) {
2829                            var textoTituloColumna = ""; // aov va a cambiar segun el caso
2830                            if (titulosColumnas.split(",")[i] != undefined)
2831                            textoTituloColumna = titulosColumnas.split(",")[i];
2832                            cabeceras += '<th class ="Th"  bgcolor="#DDD">' + textoTituloColumna + '</th>';
2833                        }
2834                        cabeceras += '</tr><tr>';
2835                    }
2836                }
2837                
2838                return cabeceras;
2839            }
2840            
2841            /// <summary>   Dibuja renglones con identacion y/o negritas. </summary>
2842            ///
2843            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
2844            ///
2845            /// <param name="texto">                Texto del renglon. </param>
2846            /// <param name="pintaBold">            Pintar en negritas. </param>
2847            /// <param name="identacion">           Espacios de identacion. </param>
2848            /// <param name="descripcionOriginal">  Descripcion original. </param>
2849            /// <param name="descripcionParametro"> Descripcion por parametro. </param>
2850            /// <param name="indiceColor">          Indice de color para tableado. </param>
2851            ///
2852            /// <returns>   . </returns>
2853            function FormatoRenglonTipo7(texto, pintaBold, identacion, descripcionOriginal, descripcionParametro, indiceColor) {
2854                var textoFormateado = texto;
2855                //SNM 09.08.2017 Se divide el texto cuando hay dos titulos separador ° 
2856                var columna1 = "";
2857                var columna2 = "";
2858                if (descripcionParametro.indexOf("°") > 0) {
2859                    var splittituloGrupo = descripcionParametro.split("°");
2860                    columna1 = "<th ";
2861                    columna2 = "<th ";
2862                    
2863                    if (pintaBold) {
2864                        textoFormateado = textoFormateado.replace(/class="Td"/g, 'class="TdB"');
2865                        columna1 += "class='TdInicioB'>";
2866                        columna2 += "class='TdInicioB'>";
2867                    }
2868                    else {
2869                        columna1 += "class='TdInicio'>";
2870                        columna2 += "class='TdInicio'>"
2871                    }
2872                    
2873                    
2874                    if (identacion != undefined && identacion != "") {
2875                        columna1 += '<div style="padding-left:' + IndentacionPadding(identacion) + 'px;" >' + splittituloGrupo[0] + '</div>';
2876                        columna2 += '<div style="padding-left:' + IndentacionPadding(identacion) + 'px;" >' + splittituloGrupo[1] + '</div>';
2877                    }
2878                    else {
2879                        columna1 += splittituloGrupo[0] + '</th>'
2880                        columna2 += splittituloGrupo[1] + '</th>'
2881                    }
2882                    
2883                    //var inicio = descripcionOriginal.indexOf("<th");
2884                    var fin = texto.indexOf("/th>");
2885                    textoFormateado = columna1 + columna2 + texto.substring(fin + 4);
2886                }
2887                else {
2888                    if (pintaBold) {
2889                        textoFormateado = textoFormateado.replace(/class="Td"/g, 'class="TdB"');
2890                        textoFormateado = textoFormateado.replace(/class="TdInicio"/g, 'class="TdInicioB"');
2891                    }
2892                    if (identacion != undefined && identacion != "") {
2893                        descripcionParametro = '<div style="padding-left:' + IndentacionPadding(identacion) + 'px;" >' + descripcionParametro + '</div>';
2894                    }
2895                    textoFormateado = textoFormateado.replace(descripcionOriginal, descripcionParametro);
2896                }
2897                
2898                /*
2899                var textoFormateado = texto;
2900                if (pintaBold) {
2901                    textoFormateado = textoFormateado.replace(/class="Td"/g, 'class="TdB"');
2902                    textoFormateado = textoFormateado.replace(/class="TdInicio"/g, 'class="TdInicioB"');
2903                }
2904                if (identacion != undefined && identacion != "") {
2905                    descripcionParametro = '<div style="padding-left:' + IndentacionPadding(identacion) + 'px;" >' + descripcionParametro + '</div>';
2906                }
2907                // textoFormateado = replaceAll(descripcionOriginal, descripcionParametro, textoFormateado);
2908                textoFormateado = textoFormateado.replace(descripcionOriginal, descripcionParametro);
2909                
2910                //textoFormateado = replaceAll('bgcolor="white"', 'bgcolor="' + ColorRenglon(indiceColor) + '"', textoFormateado);
2911                */
2912                return textoFormateado;
2913            }
2914            
2915            /// <summary>   Calcula pixeles por nivel de identacion. </summary>
2916            ///
2917            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
2918            ///
2919            /// <param name="identacion">   Nivel de identacion. </param>
2920            ///
2921            /// <returns>   . </returns>
2922            function IndentacionPadding(identacion) {
2923                var cantidadPad = 10;
2924                cantidadPad *= identacion;
2925                return cantidadPad;
2926            }
2927            
2928            /// <summary>   Reemplaza todas las ocurrencias de un texto dentro de una cadena. </summary>
2929            ///
2930            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
2931            ///
2932            /// <param name="find">     Texto buscado. </param>
2933            /// <param name="replace">  Valor que reemplaza el texto. </param>
2934            /// <param name="str">      Cadena procesada. </param>
2935            ///
2936            /// <returns>   . </returns>
2937            function replaceAll(find, replace, str) {
2938                return str.replace(new RegExp(find, 'g'), replace);
2939            }
2940            
2941            /// <summary>   Identifica casos de cuadro y procede a sus respectivos tratamientos. </summary>
2942            ///
2943            /// <remarks>   Robert, 11/11/2019. </remarks>
2944            ///
2945            /// <param name="data">         Datos de indicadores en formato JSON. </param>
2946            /// <param name="parametros">   Objeto de parametros de configuracion. </param>
2947            ///
2948            /// <returns>   . </returns>
2949            function CasosCuadro(data, parametros) {
2950                
2951                if (data.ErrorCode != undefined) {
2952                    OcultaCarga(parametros);
2953                    MostrarMensajeErrorCuadro(parametros.contenedorCuadro, data.ErrorCode, data.ErrorInfo);
2954                }
2955                else {                   
2956                    this.ValoresCuadro = data; 
2957                    parametros.tipoCuadro = (parametros.D3Enabled === "true") ? "8sdmx" : parametros.tipoCuadro;
2958                    if(parametros.tipoCuadro != "18") DibujaTitulo(parametros);
2959                    switch (parametros.tipoCuadro) {
2960                        case "1":
2961                            DibujaCuadroTipo1(data, parametros);
2962                        break;
2963                        case "2":
2964                            if (parametros.grid_configuracion === null) {
2965                                if (parametros.mostrarCifraEstatus === "true") {
2966                                    var promesaMetaIndicador = ConsultaMetaIndicador(parametros, data);
2967                                    $.when(promesaMetaIndicador).done(function (dataMetaIndicador) {
2968                                        data.CIFRAS_ESTATUS = dataMetaIndicador.CIFRAS_ESTATUS;
2969                                        DibujaCuadroTipo2(data, parametros);
2970                                        PintaConsultaMetaDatos(dataMetaIndicador, parametros, data);
2971                                    });
2972                                } else {
2973                                    DibujaCuadroTipo2(data, parametros);
2974                                }
2975                            } else {
2976                                if (parametros.mostrarCifraEstatus === "true") { // si se requiere mostrar letra en encabezado periodos entonces realiza la petición
2977                                    var promesaMetaIndicador = ConsultaMetaIndicador(parametros, data);
2978                                    $.when(promesaMetaIndicador).done(function (dataMetaIndicador) {
2979                                        data.CIFRAS_ESTATUS = dataMetaIndicador.CIFRAS_ESTATUS;
2980                                        // data.NOTAS = dataMetaIndicador.NOTAS;
2981                                        DibujaCuadroTipo2_New(data, parametros);
2982                                        PintaConsultaMetaDatos(dataMetaIndicador, parametros, data);
2983                                    });
2984                                } else {
2985                                    data.CIFRAS_ESTATUS = [];
2986                                    DibujaCuadroTipo2_New(data, parametros);
2987                                }
2988                            }
2989                        break;
2990                        case "3":
2991                            DibujaCuadroTipo3(data, parametros);
2992                        break;
2993                        case "4":
2994                            DibujaCuadroTipoTrimestre(data, parametros);
2995                        break;
2996                        case "6":
2997                            DibujaCuadroTipo6Compuesto(data, parametros);
2998                        break;
2999                        case "7":
3000                            if (parametros.grid_configuracion === null) {
3001                                
3002                                var promesaMetaIndicador = ConsultaMetaIndicador(parametros, data);
3003                                $.when(promesaMetaIndicador).done(function (dataMetaIndicador) {
3004                                    data.CIFRAS_ESTATUS = dataMetaIndicador.CIFRAS_ESTATUS === undefined ? [] : dataMetaIndicador.CIFRAS_ESTATUS;
3005                                    data.NOTAS = dataMetaIndicador.NOTAS;
3006                                    DibujaCuadroTipo7(data, parametros);
3007                                    PintaConsultaMetaDatos(dataMetaIndicador, parametros, data);
3008                                });
3009                            } else {
3010                                //DibujaCuadroTipo7_New(data, parametros);
3011                                var promesaMetaIndicador = ConsultaMetaIndicador(parametros, data);
3012                                $.when(promesaMetaIndicador).done(function (dataMetaIndicador) {
3013                                    data.CIFRAS_ESTATUS = dataMetaIndicador.CIFRA
3013S_ESTATUS === undefined ? [] : dataMetaIndicador.CIFRAS_ESTATUS;
3014                                    data.NOTAS = dataMetaIndicador.NOTAS;
3015                                    DibujaCuadroTipo7_New(data, parametros);
3016                                    PintaConsultaMetaDatos(dataMetaIndicador, parametros, data);
3017                                });
3018                            }
3019                            //DibujaCuadroTipo7Prioridad(data, parametros);
3020                        break;
3021                        case "8":
3022                            // Modificacion para que consulta los datos de los metadatos antes de dibujar el cuadro
3023                            // modificacion: 10-04-2018 10:00 am
3024                            var promesaMetaIndicador = ConsultaMetaIndicador(parametros, data);
3025                            $.when(promesaMetaIndicador).done(function (dataMetaIndicador) {    
3026                                data.UNIDAD_MEDIDA = dataMetaIndicador.UNIDAD_MEDIDA;
3027                                data.FACTOR = dataMetaIndicador.FACTOR;
3028                                data.CIFRAS_ESTATUS = dataMetaIndicador.CIFRAS_ESTATUS === undefined ? [] : dataMetaIndicador.CIFRAS_ESTATUS;
3029                                data.NOTAS = dataMetaIndicador.NOTAS;
3030                                DibujaCuadroTipo8(data, parametros);
3031                                PintaConsultaMetaDatos(dataMetaIndicador, parametros, data);
3032                            });
3033                        break;
3034                        case "8sdmx":
3035                            DibujaCuadroTipo8SDMX(data, parametros);
3036                        break;
3037                        case "9":
3038                            DibujaCuadroTipo9(data, parametros);
3039                        break;
3040                        case "10":
3041                            DibujaCuadroTipo9(data, parametros);
3042                        break;
3043                        case "11":
3044                            DibujaCuadroTipo11(data, parametros);
3045                        break;
3046                        case "12":
3047                            var promesaMetaIndicador = ConsultaMetaIndicador12(parametros, data, function(dataMetaIndicador){                        
3048                                data.CIFRAS_ESTATUS = dataMetaIndicador.CIFRAS_ESTATUS;
3049                                data.FUENTES = dataMetaIndicador.FUENTES;
3050                                data.NOTAS = dataMetaIndicador.NOTAS;
3051                                // Si llegan notas entonces buscamos las repeticiones por cada sigla para poder contar el numero de veces que se repite;
3052                                if(data.NOTAS.length > 0){
3053                                    // function contarSigla(letraBuscar){
3054                                    //     const numRepeticiones = data.NOTAS.filter((n) => {
3055                                    //         return n.SIGLA === letraBuscar? 1 : 0
3056                                    //     }).length;                                        
3057                                    //     if(numRepeticiones > 1){
3058                                    //         let i = 1;
3059                                    //         data.NOTAS.forEach((n, idx) => {
3060                                    //             if(n.SIGLA === letraBuscar) data.NOTAS[idx].diferenciador = i++
3061                                    //         })
3062                                    //     }
3063                                    // }
3064                                    let tempNotas = data.NOTAS.map((N) => { N._SIGLA = N.SIGLA; return N;});
3065                                    // tempNotas.forEach((n) => { contarSigla(n.SIGLA); })  
3066                                    
3067                                    //NUEVA ASIGNACION DE SIGLAS
3068                                    let tempSigLetra = "";
3069                                    for (let idx = 0; idx < tempNotas.length; idx++) {                                                                                
3070                                        let actual = tempNotas[idx]._SIGLA.charCodeAt(0)
3071                                        let siguiente = tempNotas[idx+1]?._SIGLA == undefined? tempNotas[idx]._SIGLA.charCodeAt(0) : tempNotas[idx+1]?._SIGLA.charCodeAt(0)
3072                                        
3073                                        if(actual > siguiente){
3074                                            if(tempSigLetra == "" ){
3075                                                tempSigLetra = String.fromCharCode(tempNotas[idx]._SIGLA.charCodeAt(0)+1);    
3076                                                tempNotas[idx+1]._SIGLA = tempSigLetra; 
3077                                                tempSigLetra = ""                                    
3078                                            } 
3079                                        } else {                                            
3080                                            if(tempSigLetra !== "") {
3081                                                tempNotas[idx]._SIGLA = tempSigLetra                                          
3082                                                tempSigLetra = "";
3083                                            }
3084                                        }
3085                                    }
3086                                    data.NOTAS = tempNotas                       
3087                                    
3088                                }
3089
3090                                // return;
3091                                PintaConsultaMetaDatos(dataMetaIndicador, parametros, data);
3092                                DibujaCuadroTipo12_2023(data, parametros);
3093                                // DibujaCuadroTipo12_New(data, parametros);
3094                            });
3095                        break;
3096                        case "13":
3097                            DibujaCuadroTipo13V2_New(data, parametros); // para el nuevo formato de areas geograficas + api v2 (10/07/2019)
3098                        break;
3099                        case "13v2":
3100                            DibujaCuadroTipo13V3_New(data, parametros); // para el nuevo formato de areas geograficas + api v2 (10/07/2019)
3101                        break;
3102                        case "14": // derivado del cuadro 7 (periodos + columna anual por cada uno) (modificacion: 6-mar-2018 9:00 am)
3103                            //var promesaValorIndicadoresAnual = ConsultaValorIndicadoresAnual(parametros);
3104                            //$.when(promesaValorIndicadoresAnual).done(function (dataValorIndicadoresAnual) { 
3105                            //    console.log(dataValorIndicadoresAnual);
3106                            //    if (dataValorIndicadoresAnual.ErrorCode) {
3107                            //        throw "Aviso: no se encontraron datos para IA";
3108                            //    } else {
3109                            //        data.indicadoresAnuales = dataValorIndicadoresAnual;
3110                            DibujaCuadroTipo14(data, parametros);
3111                            //}                        
3112                            //});                    
3113                        break
3114                        case "15":
3115                            DibujaCuadroTipo15_New(data, parametros);
3116                        break;
3117                        case "16":
3118                            DibujaCuadroTipo16(data, parametros);
3119                        break;
3120                        case "17": // Agregado el 28/03/2019                
3121                            if (parametros.mostrarCifraEstatus === "true") {
3122                                var promesaMetaIndicador = ConsultaMetaIndicador(parametros, data);
3123                                $.when(promesaMetaIndicador).done(function (dataMetaIndicador) {
3124                                    data.CIFRAS_ESTATUS = dataMetaIndicador.CIFRA
3124S_ESTATUS;
3125                                    DibujaCuadroTipo17(data, parametros);
3126                                    PintaConsultaMetaDatos(dataMetaIndicador, parametros, data);
3127                                });
3128                            } else {
3129                                DibujaCuadroTipo17(data, parametros);
3130                            }                   
3131                        break;
3132                        case "18": // Cuadro para localidades #18 - infoLocalidad                                                       
3133                                // DibujaCuadroTipo18_LocalidadesV3(data, parametros); // es el que se esta modificando
3134                                // actualizacion del metodo 05-07-2024
3135                                // con datos nuevos y de SCITEL                                
3136                                // parametros nuevos: periodo y version
3137
3138                                if(parametros.periodoLocalidad !== null && parametros.versionLocalidad !== null){
3139                                    DibujaCuadroTipo18_LocalidadesV4_2024(data, parametros, function(){
3140                                        DibujaDatosSITEL(data, parametros)
3141                                    }); // con parametro dis = display = [1,2]                          
3142                                } else {
3143                                    DibujaCuadroTipo18_LocalidadesV4(data, parametros); // con parametro dis = display = [1,2]                          
3144                                }
3145                        break;              
3146                        case "precision":
3147                            // modificado el 14-02-2023
3148                            if (parametros.mostrarCifraEstatus === "true") {
3149                                var promesaMetaIndicador = ConsultaMetaIndicador(parametros, data);
3150                                $.when(promesaMetaIndicador).done(function (dataMetaIndicador) {
3151                                    data.CIFRAS_ESTATUS = dataMetaIndicador.CIFRAS_ESTATUS;
3152                                    DibujaCuadroTipoPrecision(data, parametros);
3153                                    PintaConsultaMetaDatos(dataMetaIndicador, parametros, data);
3154                                });
3155                            } else {
3156                                DibujaCuadroTipoPrecision(data, parametros);
3157                                BuscaMetaDatos(parametros, data);
3158                            }       
3159                        break;          
3160                        /* case "precision":
3161                            // modificado el 15-06-2021
3162                            // DEPRECATED DATE: 14-02-2023
3163                            checkReglasDatosPrecision(parametros, data, function(datos){
3164                                data = datos; // reemplazamos el objeto con el que regresa el callback con los datos de precision incluidos
3165                                if (parametros.mostrarCifraEstatus === "true") {
3166                                    var promesaMetaIndicador = ConsultaMetaIndicador(parametros, data);
3167                                    $.when(promesaMetaIndicador).done(function (dataMetaIndicador) {
3168                                        data.CIFRAS_ESTATUS = dataMetaIndicador.CIFRAS_ESTATUS;
3169                                        DibujaCuadroTipoPrecision(data, parametros);
3170                                        PintaConsultaMetaDatos(dataMetaIndicador, parametros, data);
3171                                    });
3172                                } else {
3173                                    DibujaCuadroTipoPrecision(data, parametros);
3174                                    BuscaMetaDatos(parametros, data);
3175                                }       
3176                           });
3177                        break; */
3178                        case "precision2":
3179                        case "precision3":
3180                            if (parametros.mostrarCifraEstatus === "true") {
3181                                var promesaMetaIndicador = ConsultaMetaIndicador(parametros, data);
3182                                $.when(promesaMetaIndicador).done(function (dataMetaIndicador) {
3183                                    data.CIFRAS_ESTATUS = dataMetaIndicador.CIFRA
3183S_ESTATUS;
3184                                    DibujaCuadroTipoPrecisionV2(data, parametros);
3185                                    PintaConsultaMetaDatos(dataMetaIndicador, parametros, data);
3186                                });
3187                            } else {
3188                                DibujaCuadroTipoPrecisionV2(data, parametros);
3189                            }
3190                            break;
3191                        case "20": // (28-05-2019) varios indicadores /  1 area geografica / 1 periodo o ultimo periodo                                
3192                                DibujaCuadroTipo20(data, parametros);
3193
3194                        case "21": // (12-11-2019) regiones - un indicador / varias regiones / un periodo
3195                            if (parametros.mostrarCifraEstatus === "true") {
3196                                var promesaMetaIndicador = ConsultaMetaIndicador(parametros, data);
3197                                $.when(promesaMetaIndicador).done(function (dataMetaIndicador) {
3198                                    data.CIFRAS_ESTATUS = dataMetaIndicador.CIFRAS_ESTATUS;
3199                                    DibujaCuadroTipo21(data, parametros);
3200                                    PintaConsultaMetaDatos(dataMetaIndicador, parametros, data);
3201                                });
3202                            } else {
3203                                DibujaCuadroTipo21(data, parametros);
3204                            }  
3205                            break; 
3206                        case "scitel": // Informacion de SCITEL agregado: 12/7/2025
3207                                DibujaCuadroTipoScitel(data, parametros);
3208                            break;                               
3209                        default:
3210                            break;
3211                    }
3212                    //--------------------------
3213                    OcultaCarga(parametros);
3214                    // Se agrega la validación para que no busque metadatos del caso cuadro scitel (12-07-2025)
3215                    if (parametros.D3Enabled === "false" && parametros.tipoCuadro !== "scitel") { // solo cuadro 8 y que tengan activo el parametro d3
3216                        if (parametros.tipoCuadro !== "13v2" && parametros.tipoCuadro !== "13" && parametros.tipoCuadro !== "12" && parametros.tipoCuadro !== "8" && parametros.tipoCuadro !== "2" && parametros.tipoCuadro !== "7" && parametros.tipoCuadro !== "17" && parametros.tipoCuadro !== "precision" && parametros.tipoCuadro !== "precision2023" && parametros.tipoCuadro !== "precision2"  && parametros.tipoCuadro !== "precision3" && parametros.tipoCuadro !== "18" && parametros.tipoCuadro !== "21") {
3217                            BuscaMetaDatos(parametros, data);
3218                        } else {
3219                            if (parametros.tipoCuadro === "2" && parametros.mostrarCifraEstatus == "false") {
3220                                BuscaMetaDatos(parametros, data);
3221                            }
3222                        }
3223                    }
3224                }
3225                
3226            }
3227            /**
3228             * @Descripción OBTIENE LOS DATOS DE SITEL
3229             * @creado 13.3.2025
3230             * @param {*} data
3231             * @param {*} parametros
3232             */
3233            function DibujaDatosSITEL(datos, parametros){
3234                // console.log(parametros)
3235                // let ag = parametros.areaLocalidad;
3236                let areaGeo = parametros.areaLocalidad;
3237                let periodo = parametros.periodoLocalidad
3238                let ent, mpio, loc = "";
3239                // let areaGeo = "/700/";
3240
3241                // if(ag.length === 2 || ag.length == "00"){ // estatal
3242                //     areaGeo += Number(ag)+"/";
3243
3244                // } else if(ag.length === 5){ // municipio
3245                //     ent = Number(ag.substring(0,2));
3246                //     mpio = Number(ag.substring(2,ag.length));
3247                //     areaGeo += ent+"/"+mpio+"/"
3248                    
3249                // } else if(ag.length === 9){ // localidad
3250                //     ent = Number(ag.substring(0,2));
3251                //     mpio = Number(ag.substring(2,5));
3252                //     loc = Number(ag.substring(5,9))
3253                //     areaGeo += ent+"/"+mpio+"/"+loc+"/"
3254
3255                // } 
3256                //mensaje cargando
3257                let divLoading = document.createElement("div");
3258                divLoading.innerHTML = "Cargando datos SCITEL..."
3259                divLoading.classList.add("mt-4")
3260                divLoading.style.textAlign= "center"
3261                divLoading.style.fontWeight= "bold"
3262                divLoading.style.fontSize= "15px"
3263                document.querySelector("#"+parametros.contenedorCuadro).append(divLoading)
3264                               
3265                const postDatosSitel = () => {
3266                    url = C_direccionServicio + "IndicadoresSitel"                    
3267                    var bodyParametros = {    
3268                        "periodo": periodo === "null"? "2020" : periodo,
3269                        "areageo": areaGeo, 
3270                        "formato": "json",
3271                        "token": parametros.token
3272                    }
3273                    const response = fetch(url,{method:"POST",body:JSON.stringify(bodyParametros),headers:{"Content-type":"application/json; charset=UTF-8"}}, function(d){ return d})
3274                    response
3275                    .then(resp => { 
3276                        if (!resp.ok) {
3277                            throw Error(resp.status);
3278                        }    
3279                        return resp.json();
3280                        
3281                    }).then(resp => {
3282
3283                        let DIVTABLE = document.createElement("div")
3284                        let TITULO = document.createElement("h5")
3285                        TITULO.innerHTML = "Información de SCITEL (datos en bruto)"
3286                        TITULO.classList.add("mt-4")
3287                        DIVTABLE.id = "divDatosSitel_"+parametros.contenedorCuadro
3288                        
3289                        if(resp.ErrorCode){
3290                            DIVTABLE.innerHTML = "No hay datos"
3291                            document.querySelector("#"+parametros.contenedorCuadro).append(TITULO)
3292                            document.querySelector("#"+parametros.contenedorCuadro).append(DIVTABLE)
3293
3294                        } else {
3295
3296                            let datos = JSON.parse(resp)                           
3297                            let TABLE = document.createElement("table")
3298                            DIVTABLE.style.height = "450px";
3299                            DIVTABLE.style.overflowX = "auto";
3300                            DIVTABLE.style.overflowY = "auto";
3301                            TABLE.classList.add("table","table-bordered","table-responsive")
3302                            let THEAD = document.createElement("thead")
3303                            let TBODY = document.createElement("tbody")
3304                            let TR = document.createElement("tr")
3305                            let TH = document.createElement("th")
3306                            let TD = document.createElement("td")
3307                            TABLE.append(THEAD);
3308                            TABLE.append(TBODY);
3309                            DIVTABLE.append(TABLE);
3310                            document.querySelector("#"+parametros.contenedorCuadro).append(TITULO)
3311                            document.querySelector("#"+parametros.contenedorCuadro).append(DIVTABLE)
3312
3313                            // COLUMNAS
3314                            let aPropiedades = Object.keys(datos[0])
3315                            let trCols = TR.cloneNode(true);
3316                            
3317                            aPropiedades.forEach((c, idx) => {
3318                                let th = TH.cloneNode(true);
3319                                th.innerHTML = c;
3320                                trCols.append(th);
3321                            })
3322                            THEAD.append(trCols);            
3323
3324                            //DATOS / RENGLONES
3325                            for(var i = 0; i < datos.length; i++){
3326                                let aTR = TR.cloneNode(true);
3327                                let aValues = Object.values(datos[i]);
3328                                aValues.forEach((v, idxv) => {
3329                                    let td = TD.cloneNode(true);
3330                                    td.innerHTML = v === null? "null" : v;
3331                                    aTR.append(td);
3332                                })
3333                                TBODY.append(aTR);
3334                            }
3335                        }
3336                        divLoading.remove()
3337                        
3338                    })
3339                    
3340                }
3341                postDatosSitel();
3342            }
3343            /**
3344             * Metodo encargado de validar los datos de precision con reglas condicionales para colorear los valores en el cuadro.
3345             * Se omite idtema y archivo de reglas json. (14-02-2023)
3346             * Se usaran las reglas que llegan de la API en precision_rule (14-02-2023)
3347             * @param {*} parametros 
3348             * @param {*} datos 
3349             * @param {*} callback 
3350             * @created 15-06-2021
3351             */           
3352            function checkReglasDatosPrecision(parametros, datos, callback){
3353
3354                // obsoleta: probablemente no se necesite una funcion como esta
3355                if(parametros.idTema !== "null"){ // si el idTema es diferente a null entonces continua con la validacion de datos
3356                    var https = window.location.protocol.indexOf("https:") > -1? "https" : "http";
3357                    var aTemas, oTema;
3358                    if(window.location.href.indexOf("localhost") > -1){
3359                        pathArchivo = "./scripts/reglasDatosPrecision.json";
3360                    } else {
3361                        pathArchivo = window.location.origin +"/componentes/biinegi/reglasDatosPrecision.json"; 
3362                    }
3363                    $.getJSON(pathArchivo, function (data) {
3364                        aTemas = data.temas;
3365                        
3366                        // con el idtema de los parametros buscaremos el tema para extraer las condiciones del json                     
3367                        oTema = aTemas.filter(function(tema, idx){
3368                            return tema.idTema == parametros.idTema;
3369                        })[0]
3370                        
3371                    }).error(function (error) {
3372                        console.log(error);
3373                        console.error("Error: No se pudo leer el archivo json.")
3374
3375                    }).done(function () {     
3376                        // guardamos el tema y condiciones en el objeto datos principal y lo regresamos en el callback                   
3377                        datos.precitionRules = oTema; 
3378                        callback(datos);
3379                    })
3380                } else { // si el idTema es null continua sin validar y construye el cuadro sin validaciones.
3381                    callback(datos)
3382                }
3383            }
3384            //function ConsultaValorIndicadoresAnual(parametros) {
3385            //    var indicadoresAnuales = [];
3386            //    //separamos los ultimos indicadores de cada grupo (son los anuales)
3387            //    $.each(parametros.indicadorValorCompuesto.grupos, function (idx, item) {            
3388            //        indicadoresAnuales.push(item.indicadores[item.indicadores.length - 1]);
3389            //    });       
3390            //    var promesaRequestValorIndicadores = null;
3391            //    if (parametros.indicadorDepurado.length < 200) {            
3392            //        //var typeChart = 3;                
3393            //        console.log(parametros.direccionServicio + '/ValorIndicador/' + indicadoresAnuales.join(",") + "/" + parametros.areaGeografica + '/null/' + parametros.idioma + '/null/null/3/' + parametros.orden + '/' + parametros.nombreCorto + '/null/' + parametros.fe
3393chaInicio + '/' + parametros.fechaFin + "/" + parametros.formatoAreaGeografica + '/json/563cbaa8-58bb-fef8-6763-1f1dae318f99?callback=?');
3394            //        //console.log(parametros.direccionServicio + '/ValorIndicador/' + parametros.indicadorDepurado + "/" + parametros.areaGeografica + '/null/' + parametros.idioma + '/null/null/' + typeChart + '/' + parametros.orden + '/' + parametros.nombreCorto + '/' + parametros.esOportuno + '/' + parametros.fechaInicio + '/' + parametros.fechaFin + "/" + parametros.formatoAreaGeografica + '/json/563cbaa8-58bb-fef8-6763-1f1dae318f99');
3395            //        promesaRequestValorIndicadores = $.ajax({
3396            //            url: parametros.direccionServicio + '/ValorIndicador/' + indicadoresAnuales.join(",") + "/" + parametros.areaGeografica + '/null/' + parametros.idioma + '/null/null/3/' + parametros.orden + '/' + parametros.nombreCorto + '/' + parametros.esOportuno + '/' + parametros.fechaInicio + '/' + parametros.fechaFin + "/" + parametros.formatoAreaGeografica + '/json/563cbaa8-58bb-fef8-6763-1f1dae318f99?callback=?',
3397            //            dataType: "json"
3398            //        }).then(function (data) { return data; });
3399            //    } else {
3400            //        //  parametros.direccionServicio + '/ValorIndicador/' + parametros.indicadorDepurado + "/" + parametros.areaGeografica + '/null/es/null/null/3/null/' + parametros.nombreCorto + '/' + parametros.esOportuno + '/' + parametros.fe
3400chaInicio + '/' + parametros.fechaFin + "/" + parametros.formatoAreaGeografica + '/json/563cbaa8-58bb-fef8-6763-1f1dae318f99?callback=?', null, function (data) {
3401            //        var bdireccionServicio = parametros.direccionServicio + '/ValorIndicador';
3402            //        var dataGraf = DataCuadro(parametros.indicadorDepurado,
3403            //            parametros.areaGeografica,
3404            //            "null",
3405            //            parametros.idioma,
3406            //            "null",
3407            //            "null",
3408            //            3,
3409            //            parametros.orden, parametros.nombreCorto, null, parametros.fechaInicio,
3410            //            parametros.fechaFin,
3411            //            parametros.formatoAreaGeografica
3412            //            , "json", "563cbaa8-58bb-fef8-6763-1f1dae318f99");
3413            
3414            //        var _this = this;
3415            //        var tipo = "post";
3416            //        promesaRequestValorIndicadores = $.ajax({
3417            //            type: tipo,
3418            //            url: bdireccionServicio,
3419            //            contentType: "application/json; charset=utf-8",
3420            //            dataType: "json",
3421            //            data: dataGraf,
3422            //            processData: true                
3423            //        }).then(function (data) { 
3424            //            return data;
3425            //        });
3426            //    }        
3427            //    return promesaRequestValorIndicadores;
3428            //}
3429            
3430            /// <summary>   Dibuja cuadro de indicador compuesto. </summary>
3431            ///
3432            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
3433            ///
3434            /// <param name="data">         Datos de indicadores en formato JSON. </param>
3435            /// <param name="parametros">   Objeto de parametros de configuracion. </param>
3436            ///
3437            /// <returns>   . </returns>
3438            function CasoCompuesto(data, parametros) {
3439                if (data.ErrorCode != undefined) {
3440                    OcultaCarga(parametros);
3441                    MostrarMensajeErrorCuadro(parametros.contenedorCuadro, data.ErrorCode, data.ErrorInfo);
3442                }
3443                else {
3444                    DibujaTitulo(parametros);
3445                    DibujaCuadroTipo1Compuesto(data, parametros);
3446                    OcultaCarga(parametros);
3447                    BuscaMetaDatos(parametros, data);
3448                }
3449                
3450            }
3451            
3452            /// <summary>   Coloca un div con un titulo sobre el cuadro. </summary>
3453            ///
3454            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
3455            ///
3456            /// <param name="parametros">   Objeto de parametros de configuracion. </param>
3457            ///
3458            /// <returns>   . </returns>
3459            function DibujaTitulo(parametros) {
3460                var tableHeader = document.getElementById("TableHeader" + parametros.contenedorCuadro);
3461                var tableEspacio = document.getElementById("TableEspacio" + parametros.contenedorCuadro);
3462                
3463                //  tableHeader.style["background-color"] = "#"+colorHeader;
3464                // var btnShare = document.getElementById("btnShare" + parametros.contenedorCuadro);
3465                var cellHeaderTitle = document.getElementById("CellHeaderTitle" + parametros.contenedorCuadro);
3466                // var cellShare = document.getElementById("CellHeaderShare" + parametros.contenedorCuadro);
3467                
3468                var RowHeader = document.getElementById("RowHeader" + parametros.contenedorCuadro);
3469                // btnShare.style.visibility = "visible";
3470                var pintarElTitulo = true;
3471                if (parametros.titulo == "") {
3472                    pintarElTitulo = false;
3473                }
3474                //   if (parametros.titulo == "" && parametros.muestraShare == "0") {
3475                if (!pintarElTitulo) {
3476                    cellHeaderTitle.style.display = "none";
3477                    // cellShare.style.display = "none";
3478                    //cellHeaderTitle.className = "";
3479                    tableHeader.style.height = "0px";
3480                    // btnShare.style.visibility = "hidden";
3481                    
3482                    RowHeader.style.display = "none";
3483                    tableHeader.style.height = "0px";
3484                }
3485                else //if (parametros.titulo != "" || parametros.muestraShare != "0") {
3486                {
3487                    cellHeaderTitle.style.display = "";
3488                    /* btnShare.style.display = ""; */
3489                    var textoTitulo = parametros.titulo;
3490                    
3491                    cellHeaderTitle.innerHTML += '<span class="encabezado">' + parametros.titulo + '<br></span>';
3492                    if (parametros.subtitulo)
3493                    cellHeaderTitle.innerHTML += '<span class="subtitleCuadro">' + parametros.subtitulo + '<br></span>';
3494                    if (parametros.subtituloSegundo)
3495                    cellHeaderTitle.innerHTML += '<span class="subtitleCuadro2">' + parametros.subtituloSegundo + '</span>';
3496                   /*  if (parametros.muestraShare == "0" || parametros.muestraShare == "") {
3497                        btnShare.style.visibility = "hidden";
3498                    } */
3499                   /*  if (parametros.muestraShare == "1") {
3500                        btnShare.style.display = "";
3501                        cellShare.style.display = "";
3502                        btnShare.style.visibility = "visible";
3503                    } */
3504                }
3505            }
3506            
3507            /// <summary>   Dibuja cabecera de años y periodos a 2 niveles. </summary>
3508            ///
3509            /// <remarks>   SERGIO.NIETO, 24/11/2016. </remarks>
3510            ///
3511            /// <param name="label">            Titulo de la columna principal. </param>
3512            /// <param name="cantidadColumnas"> Cantidad de columnas. </param>
3513            /// <param name="listaAnios">       Lista de años. </param>
3514            /// <param name="contenedor">       Contenedor del componente. </param>
3515            /// <param name="listaPeridosObj">  Lista de periodos visibles. </param>
3516            ///
3517            /// <returns>SNM 08.08.2017 se cambio para dividir concepto en dos columnas si es el caso</returns>
3518            function DibujaCabeceraTipo7(label, cantidadColumnas, listaAnios, parametros, listaPeridosObj) {
3519                var contenedor = parametros.contenedorCuadro;
3520                var cabeceras = "";
3521                if (label.indexOf("|") > 0) {
3522                    var spittitle = "";
3523                    spittitle = label.split("|");                       
3524                    var rowspan = (listaAnios.length > 0) ? "2" : "0"; // modificacion para validar si llevan anios entonces el rowspan se queda como estaba con valor de 2 (modificacion 20/feb/2018)
3525                    cabeceras = '<tr><th class ="Th" bgcolor="#DDD"  id="columnaTituloSuperior' + contenedor + '" rowspan="' + rows
3525pan + '" nowrap>' + spittitle[0] + '</th>';
3526                    cabeceras += '<th class="Th" bgcolor="#DDD" id="columnaTituloSuperior' + contenedor + '" rowspan="' + rowspan + '" >' + spittitle[1] + '</th>'
3527                }
3528                else {
3529                    cabeceras = '<tr><th class ="Th" bgcolor="#DDD"  id="columnaTituloSuperior' + contenedor + '" rowspan="2" >' + label + '</th>';
3530                }
3531                
3532                if (listaAnios.length > 0) { // validacmos si llegan años por columna
3533                    if (parametros.tipoCuadro === "14") {
3534                        if (parametros.titulosColumnas !== "") {
3535                            var columnasNombres = parametros.titulosColumnas.split(",");
3536                            for (var i = 0; i < columnasNombres.length; i++) {
3537                                var cantidadColumnas = 13;
3538                                cabeceras += '<th class ="Th"  id="tdAnio' + contenedor + "_col" + i + '" bgcolor="#DDD" colspan ="' + cantidadColumnas + '">' + columnasNombres[i] + ' </th>';
3539                            }
3540                        } else {
3541                            for (var i = 0; i < listaAnios.length; i++) {
3542                                if (listaAnios[i] == listaPeridosObj[i].year)
3543                                cantidadColumnas = listaPeridosObj[i].visibles.length;
3544                                
3545                                cabeceras += '<th class ="Th"  id="tdAnio' + contenedor + listaAnios[i] + '" bgcolor="#DDD" colspan ="' + cantidadColumnas + '">' + listaAnios[i] + ' </th>';
3546                            }
3547                        }
3548                    } else {
3549                        for (var i = 0; i < listaAnios.length; i++) {
3550                            if (listaAnios[i] == listaPeridosObj[i].year)
3551                            cantidadColumnas = listaPeridosObj[i].visibles.length;
3552                            
3553                            cabeceras += '<th class ="Th"  id="tdAnio' + contenedor + listaAnios[i] + '" bgcolor="#DDD" colspan ="' + cantidadColumnas + '">' + listaAnios[i] + ' </th>';
3554                        }
3555                    }
3556                    
3557                    cabeceras += "</tr>";
3558                }
3559                return cabeceras;
3560            }              
3561            
3562            /// <summary>   Dibuja cabecera de años. </summary>
3563            ///
3564            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
3565            ///
3566            /// <param name="label">            Titulo de la columna principal. </param>
3567            /// <param name="cantidadColumnas"> Cantidad de columnas. </param>
3568            /// <param name="listaAnios">       Lista de años. </param>
3569            /// <param name="contenedor">       Contenedor del componente. </param>
3570            /// <param name="listaPeridosObj">  Lista de periodos visibles. </param>
3571            ///
3572            /// <returns>   . </returns>
3573            function DibujaCabeceraTipo9(label, cantidadColumnas, listaAnios, contenedor, listaPeridosObj) {
3574                
3575                var cabeceras = '<tr><th class ="Th" bgcolor="#DDD"  id="columnaTituloSuperior' + contenedor + '" rowspan="2" >' + label + '</th>';
3576                for (var i = 0; i < listaAnios.length; i++) {
3577                    if (listaAnios[i] == listaPeridosObj[i].year)
3578                    cantidadColumnas = listaPeridosObj[i].visibles.length;
3579                    cabeceras += '<th class ="Th"  id="tdAnio' + contenedor + listaAnios[i] + '" bgcolor="#DDD" colspan ="' + cantidadColumnas + '">' + listaAnios[i] + ' </th>';
3580                    // identificar periodo de trimestral (3 totales) y anual (1 total)
3581                    cabeceras += '<th class ="Th" bgcolor="#DDD" rowspan="2" >Total</th>';
3582                }
3583                cabeceras += "</tr>";
3584                return cabeceras;
3585            }
3586            
3587            /// <summary>   Agrupa  años y subperiodos, identifica si no se muestran todos los subperiodos. </summary>
3588            ///
3589            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
3590            ///
3591            /// <param name="listaAnios">       Lista de años. </param>
3592            /// <param name="peridosVisibles">  Lista de periodos visibles. </param>
3593            ///
3594            /// <returns>   . </returns>
3595            function ObtienePeriodosVisbles(listaAnios, peridosVisibles) {
3596                var listaPeriodosObj = [];
3597                for (var i = 0; i < listaAnios.length; i++) {
3598                    var periodoObj = {};
3599                    periodoObj["year"] = listaAnios[i];
3600                    var listaVisibles = [];
3601                    for (var j = 0; j < peridosVisibles.length; j++) {
3602                        
3603                        if (peridosVisibles[j].indexOf(listaAnios[i]) > -1) {
3604                            listaVisibles.push(peridosVisibles[j]);
3605                        }
3606                    }
3607                    periodoObj["visibles"] = listaVisibles;
3608                    listaPeriodosObj.push(periodoObj);
3609                }
3610                return listaPeriodosObj;
3611            }
3612            
3613            /// <summary>   Obtiene la cantidad de columnas que abarca un año desplegado por encima de los subperiodos </summary>
3614            ///
3615            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
3616            ///
3617            /// <param name="listaAnios">       Lista de años. </param>
3618            /// <param name="peridosVisibles">  Lista de periodos visibles. </param>
3619            /// <param name="contenedor">       Contenedor del componente. </param>
3620            ///
3621            /// <returns>   . </returns>
3622            function AjustaColspanCabeceraTipo7(listaAnios, peridosVisibles, contenedor) {
3623                var listaPeriodosObj = ObtienePeriodosVisbles(listaAnios, peridosVisibles);
3624                for (var i = 0; i < listaPeriodosObj.length; i++) {
3625                    //var cabeceraOculta = document.getElementById("tdAnio" + contenedor + listaPeriodosObj[i].year);
3626                    //cabeceraOculta["colspan"] = listaPeriodosObj[i].visibles.length;
3627                    if (listaPeriodosObj[i].visibles.length > 0)
3628                    document.getElementById("tdAnio" + contenedor + listaPeriodosObj[i].year)["colspan"] = listaPeriodosObj[i].visibles.length;
3629                    else
3630                    //document.getElementById("tdAnio" + contenedor + listaPeriodosObj[i].year).style.visibility = "hidden";
3631                    document.getElementById("tdAnio" + contenedor + listaPeriodosObj[i].year).style.display = "none";
3632                    //     console.log("tdAnio" + contenedor + listaPeriodosObj[i].year);
3633                }
3634                
3635            }
3636            
3637            /// <summary>   Dibuja cabecera de la tabla, si tiene 2 niveles la primer celda se extiende 2 renglones. </summary>
3638            ///
3639            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
3640            ///
3641            /// <param name="label">            Titulo de la columna principal. </param>
3642            /// <param name="cantidadColumnas"> Cantidad de columnas. </param>
3643            /// <param name="renglones">        Cantidad de renglones de la cabecera. </param>
3644            /// <param name="contenedorCuadro"> Contenedor del componente. </param>
3645            ///
3646            /// <returns>   . </returns>
3647            function DibujaCabecera(label, cantidadColumnas, renglones, contenedorCuadro, parametros) {
3648                var parametros = parametros || null;
3649                var cabeceras = '<tr><th class ="Th" bgcolor="#DDD"  id="columnaTituloSuperior" rowspan="' + renglones + '" >' + label + '</td>';
3650                if (parametros !== null && parametros.tipoCuadro == "17") {
3651                    cabeceras += '<th class ="Th"  id="tdPeriodo1_' + contenedorCuadro + '" bgcolor="#DDD" colspan ="4">valPeriodo1_' + contenedorCuadro + '</th>';
3652                    cabeceras += '<th class ="Th"  id="tdPeriodo2_' + contenedorCuadro + '" bgcolor="#DDD" colspan ="4">valPeriodo2_' + contenedorCuadro + '</th></tr>';
3653                } else {
3654                    if (renglones > 1)
3655                    cabeceras += '<th class ="Th"  id="tdUnidad' + contenedorCuadro + '" bgcolor="#DDD" colspan ="' + cantidadColumnas + '">&nbsp;</th></tr><tr>';
3656                }
3657                return cabeceras;
3658            }
3659            
3660            /// <summary>   Cambia descripciones de columnas por las que se mandan por parametro. </summary>
3661            ///
3662            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
3663            ///
3664            /// <param name="titulosColumnas">  Titulos de columnas separados por coma. </param>
3665            /// <param name="valorDefault">     Nombre default de la columna. </param>
3666            /// <param name="indiceColumna">    Indice de la columna. </param>
3667            ///
3668            /// <returns>   . </returns>
3669            function PintaTitulosColumnas(titulosColumnas, valorDefault, indiceColumna) {       
3670                var valorTitulo = valorDefault;
3671                if (titulosColumnas.split(",")[indiceColumna] != undefined && titulosColumnas.split(",")[indiceColumna] != "")
3672                valorTitulo = titulosColumnas.split(",")[indiceColumna];
3673                return valorTitulo;
3674            }
3675            
3676            /// <summary>   Dibuja cuadro tipo 1, varios indicadores por varios periodos por un area geografica. </summary>
3677            ///
3678            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
3679            ///
3680            /// <param name="data">         Valores de indicador en JSON. </param>
3681            /// <param name="parametros">   Objeto de parametros en JSON. </param>
3682            ///
3683            /// <returns>   . </returns>
3684            function DibujaCuadroTipo1(data, parametros) {
3685                var tablaInterna = "";
3686                var arrayLenght = data.length;
3687                var contadorcolumnas = 1;
3688                var indexValue = 0;
3689                var saltoPeriodos = data.dimension.periods.category.label.length;
3690                var arrayPeriodos = data.dimension.periods.category.label;
3691                // var cabeceras = DibujaCabecera(data.dimension.indicator.label, arrayPeriodos.length, 2, parametros.contenedorCuadro);                
3692                var cabeceras = DibujaCabecera((parametros.idioma === "es"? "Indicador" : "Indicator"), arrayPeriodos.length, 2, parametros.contenedorCuadro);                
3693
3694                var aIndicadorDepurado = parametros.indicadorDepurado.indexOf(",") > -1? parametros.indicadorDepurado.split(",") : parametros.indicadorDepurado;
3695                
3696                // cabeceras con o sin titulo por parametro
3697                var indiceColumna = 0;
3698                $.each(arrayPeriodos, function (key, val) {
3699                    //if (indexValue == (saltoPeriodos * contadorcolumnas - 1)) {
3700                    valorColumna = PintaTitulosColumnas(parametros.titulosColumnas, val.Value, indiceColumna++);
3701                    cabeceras += '<th class ="Th" bgcolor="#DDD" >' + valorColumna + '</th>';
3702                    contadorcolumnas++;
3703                    //}
3704                    //indexValue++;
3705                });
3706                cabeceras += "</tr>";
3707                tablaInterna += cabeceras;
3708                var datos = data.value;
3709                indexValue = 0;
3710                var renglones = "";
3711                var arrayIndicadores = data.dimension.indicator.category.label;
3712                
3713                var listaRenglones = [];
3714                indexValue = 0;
3715                var contRenglones = 0;
3716                var indicadoresNombreCorto = [];
3717               // console.log(indicadoresNombreCorto.reverse().shift());
3718                // 16/04/2020 rep05_2020
3719                if (parametros.nombreCorto == "true" && parametros.nombresCategoriasFijas !== "") {
3720                    if (parametros.nombresCategoriasFijas.indexOf('°') > -1) {
3721                        indicadoresNombreCorto = parametros.nombresCategoriasFijas.replace(new RegExp('°', 'g'), '');
3722                        indicadoresNombreCorto = indicadoresNombreCorto.split("|");
3723                    } else {
3724                        indicadoresNombreCorto = parametros.nombresCategoriasFijas.split("|");
3725                    }
3726                }
3727                
3728                // invertimos el arreglo de nombres por que de algun modo llega invertido y no coinciden los datos cuando se arman
3729                //indicadoresNombreCorto.reverse().shift()
3730                // console.log(arrayIndicadores)
3731                // console.log(indicadoresNombreCorto)
3732                // console.log(parametros.indicadorDepurado)
3733
3734                for (var i = 0; i < arrayIndicadores.length; i++) {
3735                    var bgColor = "white";
3736                    //if (i % 2 == 0) {
3737                    //    var bgColor = "#EFEFEF";
3738                    //}
3739                    var oRenglon = {};
3740                    oRenglon["indicador"] = arrayIndicadores[i].Key.replace("I_", "");
3741                    var value = arrayIndicadores[i].Value;
3742                    if (indicadoresNombreCorto.length > 0) {
3743                        // value = indicadoresNombreCorto[i];
3744                        var indicadorOrden = "";
3745                        for(var s = 0; s < aIndicadorDepurado.length; s++){
3746                            if(aIndicadorDepurado[s] === arrayIndicadores[i].Key.replace("I_", "")){
3747                                value = indicadoresNombreCorto[s];
3748                                break;
3749                            }
3750                        }
3751                        
3752                    }
3753                    oRenglon["contenido"] = '<td class="TdInicio" id="td_indicador_' + arrayIndicadores[i].Key.replace("I_", "") + '"  >' + value + '</td>';
3754                    
3755                    renglones += '<tr><td class="TdInicio" id="td_indicador_' + arrayIndicadores[i].Key.replace("I_", "") + '"  >' + arrayIndicadores[i].Value + '</td>';
3756                    // contadorcolumnas = 0;
3757                    $.each(arrayPeriodos, function (key, val) {
3758                        
3759                        //indexValue = saltoPeriodos * contadorcolumnas + i;
3760                        indexValue = contRenglones;
3761                        renglones += '<td  class="Td"  >' + datos[indexValue] + '</td>';
3762                        
3763                        oRenglon["contenido"] += '<td  class="Td"  >' + datos[indexValue] + '</td>';
3764                        contRenglones++;
3765                        //    contadorcolumnas++;
3766                        indexValue++;
3767                    });
3768                    
3769                    renglones += '</tr>';
3770                    listaRenglones.push(oRenglon);
3771                }                             
3772                // tablaInterna += renglones;
3773                //console.log(listaRenglones);                
3774                var todosLosIndicadoresPorParametro = parametros.indicadorDepurado.split(",");
3775                if(parametros.orden === "n"){
3776                    var todosLosIndicadoresPorParametro = arrayIndicadores.map((ind) => {
3777                        return ind.Key.replaceAll("I_", "");
3778                    })
3779                }
3780                //console.log(todosLosIndicadoresPorParametro);
3781                for (var i = 0; i < todosLosIndicadoresPorParametro.length; i++) {
3782                    bgColor = "white";
3783                    //if (i % 2 == 0) {
3784                    //     bgColor = "#EFEFEF";
3785                    //}
3786                  //  console.log("> " + todosLosIndicadoresPorParametro[i])
3787                    var objIndicador = listaRenglones.filter(function (objIndicador) {
3788                        //console.log(objIndicador.indicador +"==="+ todosLosIndicadoresPorParametro[i])
3789                        return objIndicador.indicador === todosLosIndicadoresPorParametro[i];
3790                    })[0];
3791                    //console.log(objIndicador);
3792                    //console.log("------------------")
3793                    
3794                    if (objIndicador != undefined) {
3795                        var valorRenglon = objIndicador.contenido; //replaceAll("white",bgColor,objIndicador.contenido);                        
3796                        tablaInterna += "<tr>" + valorRenglon + "</tr>";
3797                    }                    
3798                }
3799                ReemplazaTabla(tablaInterna, parametros);
3800            }
3801            
3802            /// <summary>   Dibuja cuadro tipo 1 compuesto, incluye grupos de indicadores que corresponden a una descripcion </summary>
3803            ///
3804            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
3805            ///
3806            /// <param name="data">         Valores de indicador en JSON. </param>
3807            /// <param name="parametros">   Objeto de parametros en JSON. </param>
3808            ///
3809            /// <returns>   . </returns>
3810            function DibujaCuadroTipo1Compuesto(data, parametros) {
3811                
3812                //var tableStat = document.getElementById("tableStat"+ parametros.contenedorCuadro);
3813                //tableStat.style.width = "100%";
3814                var tablaInterna = "";
3815                var arrayLenght = data.length;
3816                
3817                var arrayPeriodos = data.dimension.periods.category.label;
3818                var cabeceras = DibujaCabecera(data.dimension.indicator.label, arrayPeriodos.length, 1, parametros.contenedorCuadro);
3819                var listaTitulos = parametros.titulosColumnas.split(",");
3820                var contadorTitulos = 0;
3821                $.each(arrayPeriodos, function (key, val) {
3822                    var tituloColPeriodo = val.Value;
3823                    if (listaTitulos[contadorTitulos] != undefined && listaTitulos[contadorTitulos] != "")
3824                    tituloColPeriodo = listaTitulos[contadorTitulos];
3825                    cabeceras += '<th class ="Th" bgcolor="#DDD" >' + tituloColPeriodo + '</th>';
3826                    contadorTitulos++;
3827                });
3828                cabeceras += "</tr>";
3829                tablaInterna += cabeceras;
3830                var datos = data.value;
3831                var indexValue = 0;
3832                var renglones = "";
3833                var arrayIndicadores = data.dimension.indicator.category.label;
3834                var tablaDatos = [];
3835                
3836                
3837                // llena datos transformados en un modelo de tabla
3838                for (var i = 0; i < arrayIndicadores.length; i++) {
3839                    var renglonDatos = {};
3840                    renglonDatos["indicator"] = arrayIndicadores[i].Key;
3841                    renglonDatos["descripcion"] = arrayIndicadores[i].Value;
3842                    var valoresIndicador = [];
3843                    $.each(arrayPeriodos, function (key, val) {
3844                        valoresIndicador.push(datos[indexValue]);
3845                        indexValue++;
3846                    });
3847                    renglonDatos["valoresIndicador"] = valoresIndicador;
3848                    tablaDatos.push(renglonDatos);
3849                }
3850                
3851                var bgColor = "white";
3852                if (i % 2 == 0) {
3853                    bgColor = "#EFEFEF";
3854                }
3855                
3856                // busca indicator "principal" y lo pinta en la tabla
3857                var indiceRenglon = 0;
3858                var obj = tablaDatos.filter(function (obj) {
3859                    return obj.indicator === "I_" + parametros.indicadorValorCompuesto.principal;
3860                })[0];
3861                renglones += PintaRenglonTablaGrupos('<b>', '</b>', obj, ColorRenglon(indiceRenglon++), "");
3862                
3863                // busca "grupos" pinta su encabezado 
3864                var colSpanValue = arrayPeriodos.length + 1;
3865                var contadorTitulosGrupos = 0;
3866                $.each(parametros.indicadorValorCompuesto.grupos, function (key, valGroup) {
3867                    renglones += '<tr><td  class="TdInicio" id="tdTituloGrupo' + contadorTitulosGrupos + '" bgcolor="' + ColorRenglon(indiceRenglon++) + '" colspan="' + colSpanValue + '"><b>' + valGroup.titulo + '</b></td></tr>';
3868                    contadorTitulosGrupos++;
3869                    $.each(valGroup.indicadores, function (key, valGroupInd) {
3870                        obj = tablaDatos.filter(function (obj) {
3871                            return obj.indicator === "I_" + valGroupInd;
3872                        })[0];
3873                        if (obj != undefined)
3874                        renglones += PintaRenglonTablaGrupos("", "", obj, ColorRenglon(indiceRenglon++), "&nbsp;&nbsp;&nbsp;&nbsp;");
3875                    });
3876                });
3877                
3878                tablaInterna += renglones;
3879                //   BuscaMetaDatos();
3880                ReemplazaTabla(tablaInterna, parametros);
3881            }
3882            
3883            /// <summary>   Dibuja cuadro tipo 2, un indicador por varios periodos por varias areas geograficas. </summary>
3884            ///
3885            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
3886            ///
3887            /// <param name="data">         Valores de indicador en JSON. </param>
3888            /// <param name="parametros">   Objeto de parametros en JSON. </param>
3889            ///
3890            /// <returns>   . </returns>
3891            function DibujaCuadroTipo2(data, parametros) {
3892                
3893                //var tableStat = document.getElementById("tableStat"+ parametros.contenedorCuadro);
3894                //tableStat.style.width = "100%";
3895                var totalIndicadores = (parametros.indicadorDepurado.indexOf(",") === -1) ? 1 : parametros.indicadorDepurado.split(",").length;
3896                if (totalIndicadores === 1) { // SOLO PARA 1 INDICADOR
3897                    
3898                    var tablaInterna = "";
3899                    var arrayLenght = data.length;
3900                    //var cabeceras = '<tr><th class ="Th" bgcolor="#DDD" > Entidad </th>';
3901                    var arrayPeriodos = data.dimension.periods.category.label;
3902                    var tituloPrincipal = (parametros.tituloColumnaPrincipal != "") ? parametros.tituloColumnaPrincipal : (parametros.idioma === "es"? "Entidad" : "Entity");
3903                    var cabeceras = DibujaCabecera(tituloPrincipal, arrayPeriodos.length, 2, parametros.contenedorCuadro);
3904                    var indiceColumna = 0;
3905                    var frecuencia = data.dimension.freq.category.label[0].Value;
3906                    var valorColumna = "";
3907
3908                    $.each(arrayPeriodos, function (key, val) {
3909                        //datos del periodo para el formato de las columnas
3910                        
3911                        valorColumna = PintaTitulosColumnas(parametros.titulosColumnas, val.Value, indiceColumna++); 
3912                                             
3913                        if (val.Value.indexOf("/") !== -1 && parametros.titulosColumnas == "") {
3914                            valorColumna = oMESES.getFormatoPeriodo(val.Value, frecuencia, parametros.idioma, 2);
3915                        } 
3916                        // console.log(valorColumna)
3917                        cabeceras += '<th class ="Th" bgcolor="#DDD" id="tdAnio' + parametros.contenedorCuadro + val.Value + '"  data-periodo="'+val.Value+'">' + valorColumna + '</td>';
3918                        
3919                    });                     
3920                    cabeceras += "</tr>";
3921                    tablaInterna += cabeceras;
3922                    var datos = data.value;
3923                    var indexValue = 0;
3924                    var renglones = "";
3925                    var arrayIndicadores = data.dimension.indicator.category.label;
3926                    var arrayAreas = data.dimension.state.category.label;
3927                    var totalColumnas = data.dimension.periods.category.label;
3928                    
3929                    for (var i = 0; i < arrayAreas.length; i++) {
3930                        var bgColor = "white";
3931                        if (i % 2 == 0) {
3932                            var bgColor = "#EFEFEF";
3933                        }
3934                        renglones += '<tr><td class="TdInicio notranslate"  >' + arrayAreas[i].Value.toString().split("-")[0] + '</td>';
3935                        
3936                        $.each(arrayPeriodos, function (key, val) {
3937                            if (datos[indexValue] === "") {
3938                                
3939                                renglones += '<td  class="Td"  > --- </td>';
3940                            } else {
3941                                renglones += '<td  class="Td"  >' + datos[indexValue] + '</td>';
3942                            }
3943                            indexValue++;
3944                        });
3945                        
3946                        renglones += '</tr>';
3947                    }
3948                    tablaInterna += renglones;                    
3949                    ReemplazaTabla(tablaInterna, parametros);
3950                    
3951                } else { // SOLO PARA 2 INDICADORES (TRIMESTRALES, ANUAL) agregado: 17-04-2018            
3952                    var tablaInterna = "";
3953                    var arrayPeriodos = data.dimension.periods.category.label;
3954                    var tituloPrincipal = (parametros.tituloColumnaPrincipal != "") ? parametros.tituloColumnaPrincipal : "Entidad";
3955                    var cabeceras = DibujaCabecera(tituloPrincipal, arrayPeriodos.length, 2, parametros.contenedorCuadro);
3956                    var indiceColumna = 0;
3957                    var aCifras = data.CIFRAS_ESTATUS;
3958                    
3959                    arrayPeriodos.sort(function compare(n1, n2) {
3960                        var per1 = n1.Value.indexOf("/") > -1 ? parseInt(n1.Value.split("/")[1]) : 13;
3961                        var per2 = n2.Value.indexOf("/") > -1 ? parseInt(n2.Value.split("/")[1]) : 13;
3962                        var anio1 = n1.Value.indexOf("/") > -1 ? parseInt(n1.Value.split("/")[0]) : parseInt(n1.Value);
3963                        var anio2 = n2.Value.indexOf("/") > -1 ? parseInt(n2.Value.split("/")[0]) : parseInt(n2.Value);
3964                        if (anio1 > anio2) {
3965                            return -1;
3966                        } else if (anio1 < anio2) {
3967                            
3968                            return 1;
3969                        } else {
3970                            if (per1 > per2)
3971                            return 1;
3972                            if (per1 < per2)
3973                            return -1;
3974                            else
3975                            return -1;
3976                        }
3977                    });
3978                    $.each(arrayPeriodos, function (key, val) {
3979                        var cifraSelected = "";
3980                        // if (aCifras !== undefined && aCifras.length > 0) { // si hay datos en cifras estatus
3981                        //var cifraEstatusPeriodo = aCifras.filter(function (c) {
3982                        //    console.log(c.periodos + " == " + val.Value);
3983                        //    return c.periodos.indexOf(val.Value) > -1;
3984                        //});
3985                        //console.log(cifraEstatusPeriodo)
3986                        //if (cifraEstatusPeriodo.length > 0) {
3987                        //    cifraSelected = "<sup>" + cifraEstatusPeriodo[0].letra.replace("/", "") + "</sup>";
3988                        //}
3989                        //aCifras.forEach(function (c, idx) {
3990                        //    cifraSelected = "";
3991                        //    if (c.periodos === val.Value) {
3992                        //        cifraSelected = "<sup>" + c.letra.replace("/", "") + "</sup>";
3993                        //       // return true;
3994                        //    }
3995                        //});
3996                        //}
3997                        var valorColumna = PintaTitulosColumnas(parametros.titulosColumnas, val.Value, indiceColumna++);
3998                        // para el formato de el titulo de la columna 
3999                        /* if (val.Value.indexOf("/") !== -1) {
4000                            valorColumna = oMESES.getFormatoPeriodo(valorColumna, frecuencia, parametros.idioma, 2);
4001                        } */
4002                        cabeceras += '<th class ="Th" bgcolor="#DDD" data-periodo="' + val.Value + '" id="tdAnio' + parametros.contenedorCuadro + val.Value + '">' + valorColumna + '</td>';
4003                        
4004                    });
4005                    cabeceras += "</tr>";
4006                    //tablaInterna += cabeceras;
4007                    var encabezado = cabeceras;
4008                    //var cabeceras2 = "<thead>" + cabeceras + "</thead>";
4009                    var datos = data.value;
4010                    var indexValue = 0;
4011                    var renglones = "";
4012                    var arrayIndicadores = data.dimension.indicator.category.label;
4013                    var arrayAreas = data.dimension.state.category.label;
4014                    var totalColumnas = data.dimension.periods.category.label;
4015                    
4016                    var aPeriodos = data.dimension.periods.category.label;
4017                    if (arrayPeriodos[arrayPeriodos.length - 1].Value.indexOf("/") === -1) { // Significa que el primero es el anual
4018                        var periodo = arrayPeriodos.shift()
4019                        arrayPeriodos.push(periodo);
4020                        //LLENAR DATOS           
4021                        var incAnual = ((datos.length) / 2) - 5; // Control para encontrar los datos anuales cada 5 posiciones por como llegan en el arreglo de datos
4022                        datos.shift();//borramos el primer espacio en blanco del arreglo de datos
4023                    }
4024                    for (var i = 0; i < arrayAreas.length; i++) {
4025                        var bgColor = "white";
4026                        if (i % 2 == 0) {
4027                            var bgColor = "#EFEFEF";
4028                        }
4029                        renglones += '<tr><td class="TdInicio notranslate"  >' + arrayAreas[i].Value.toString().split("-")[0] + '</td>';
4030                        for (var j = 0; j < arrayPeriodos.length; j++) {
4031                            if (j === 4) {
4032                                if (incAnual > 0) {
4033                                    renglones += '<td  class="Td"  > ' + datos[(j + incAnual)] + '</td>';
4034                                    incAnual += 5;
4035                                } else {
4036                                    renglones += '<td  class="Td"  >' + datos[indexValue] + '</td>';
4037                                }
4038                            } else {
4039                                renglones += '<td  class="Td"  >' + datos[indexValue] + '</td>';
4040                            }
4041                            indexValue++;
4042                        }
4043                        renglones += '</tr>';
4044                    }
4045                    //tablaInterna += renglones;
4046                    var cuerpo = renglones;
4047                    //ReemplazaTablaConEncabezado(renglones, cabeceras, parametros);
4048                    //ReemplazaTabla(tablaInterna, parametros);            
4049                    ReemplazaTabla2018(encabezado, cuerpo, parametros);
4050                    //FijaEncabezadoTabla(parametros);
4051                }
4052            }
4053            
4054            /// <summary>   Dibuja cuadro tipo 3, varios indicadores por varias areas geograficas por un periodo </summary>
4055            ///
4056            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
4057            ///
4058            /// <param name="data">         Valores de indicador en JSON. </param>
4059            /// <param name="parametros">   Objeto de parametros en JSON. </param>
4060            ///
4061            /// <returns>   . </returns>
4062            function DibujaCuadroTipo3(data, parametros) {
4063                
4064                //var tableStat = document.getElementById("tableStat"+ parametros.contenedorCuadro);
4065                var tablaInterna = "";
4066                var arrayLenght = data.length;
4067                var contadorcolumnas = 1;
4068                var saltoPeriodos = data.dimension.periods.category.label.length;
4069                var todosLosIndicadoresPorParametro = parametros.indicadorDepurado.split(",");
4070                
4071                var arrayPeriodos = data.dimension.periods.category.label;
4072                var arrayIndicadores = data.dimension.indicator.category.label;
4073                var cabeceras = DibujaCabecera((parametros.idioma === "es"? "Entidad Federativa" : "Federal Entity"), arrayIndicadores.length, 1, parametros.contenedorCuadro);
4074                var periodoUltimo = "";
4075                var listaCabeceras = [];
4076                if (parametros.titulosColumnas != "") {
4077                    var titulosCol = parametros.titulosColumnas.split(",");
4078                    for (var i = 0; i < titulosCol.length; i++) {
4079                        cabeceras += '<th class ="Th" bgcolor="#DDD"  id="columnaIndicador_' + todosLosIndicadoresPorParametro[i] + '" >' + titulosCol[i] + '</th>';
4080                        var cabeceraPorIndicador = {};
4081                        cabeceraPorIndicador["indicador"] = todosLosIndicadoresPorParametro[i];
4082                        cabeceraPorIndicador["contenido"] = '<th class ="Th" bgcolor="#DDD"  id="columnaIndicador_' + todosLosIndicadoresPorParametro[i] + '" >' + titulosCol[i] + '</th>';
4083                        listaCabeceras.push(cabeceraPorIndicador);
4084                    }
4085                }
4086                else {
4087                    $.each(arrayIndicadores, function (key, val) {
4088                        cabeceras += '<th class ="Th" bgcolor="#DDD"  id="columnaIndicador_' + val.Key + '" >' + val.Value + '</th>';
4089                        var cabeceraPorIndicador = {};
4090                        cabeceraPorIndicador["indicador"] = val.Key.toString().replace("I_", "");
4091                        cabeceraPorIndicador["contenido"] = '<th class ="Th" bgcolor="#DDD"  id="columnaIndicador_' + val.Key + '" >' + val.Value + '</th>';
4092                        listaCabeceras.push(cabeceraPorIndicador);
4093                    });
4094                }
4095                
4096                cabeceras += "</tr>";
4097                
4098                var datos = data.value;
4099                var indexValue = 0;
4100                var renglones = "";
4101                var arrayAreas = data.dimension.state.category.label;
4102                var saltoAreas = arrayAreas.length;
4103                var indexIndicador = 0;
4104                var listaRenglonesAreas = [];
4105                var listaColumnasIndicadores = []
4106                var valorNombreRenglon = "";
4107                for (var i = 0; i < arrayAreas.length; i++) {
4108                    var bgColor = "white";
4109                    if (i % 2 == 0) {
4110                        var bgColor = "#EFEFEF";
4111                    }
4112                    if (arrayAreas[i].Value.indexOf("Estatal") > -1) {
4113                        valorNombreRenglon = arrayAreas[i].Value.toString().split("-")[0]
4114                    } else {
4115                        if (arrayAreas[i].Value.toString().split("-")[0] !== arrayAreas[i].Value.toString().split("-")[1]) {
4116                            valorNombreRenglon = arrayAreas[i].Value.toString().split("-")[1] + '<br /><small style="color:#b5b5b5">' + arrayAreas[i].Value.toString().split("-")[0] + '</small>';
4117                        } else {
4118                            valorNombreRenglon = arrayAreas[i].Value.toString().split("-")[1];
4119                        }
4120                    }
4121                    renglones += '<tr><td class="TdInicio notranslate"  >' + valorNombreRenglon + '</td>';
4122                    listaRenglonesAreas.push('<td class="TdInicio notranslate"  >' + valorNombreRenglon + '</td>');
4123                    $.each(arrayIndicadores, function (key, valInd) {
4124                        var columnaIndicador = {};
4125                        columnaIndicador["indicador"] = valInd.Key.replace("I_", "");
4126                        columnaIndicador["renglones"] = [];
4127                        listaColumnasIndicadores.push(columnaIndicador);
4128                    });
4129                    contadorcolumnas = 0;
4130                    $.each(arrayIndicadores, function (key, valInd) {
4131                        indexValue = i + saltoPeriodos - 1 + (contadorcolumnas * saltoAreas);
4132                        renglones += '<td  class="Td"  >' + datos[indexValue] + '</td>';
4133                        listaColumnasIndicadores[contadorcolumnas].renglones.push('<td  class="Td"  >' + datos[indexValue] + '</td>');
4134                        contadorcolumnas++;
4135                    });
4136                    renglones += '</tr>';
4137                }
4138                
4139                
4140                // columnas reordenadas
4141                var cabecerasReorden = DibujaCabecera((parametros.idioma === "es"? "Entidad" : "Entity"), arrayIndicadores.length, 1, parametros.contenedorCuadro);
4142                for (var i = 0; i < todosLosIndicadoresPorParametro.length; i++) {
4143                    var objIndicador = listaCabeceras.filter(function (objIndicador) {
4144                        return objIndicador.indicador === todosLosIndicadoresPorParametro[i];
4145                    })[0];
4146                    
4147                    if (objIndicador != undefined) {
4148                        cabecerasReorden += objIndicador.contenido;
4149                    }
4150                }
4151                cabecerasReorden += "</tr>";
4152                cabeceras = cabecerasReorden;
4153                
4154                
4155                var renglonesReordenados = "";
4156                for (var n = 0; n < arrayAreas.length; n++) {
4157                    renglonesReordenados += "<tr>";
4158                    renglonesReordenados += listaRenglonesAreas[n]
4159                    for (var i = 0; i < todosLosIndicadoresPorParametro.length; i++) {
4160                        var objIndicador = listaColumnasIndicadores.filter(function (objIndicador) {
4161                            return objIndicador.indicador === todosLosIndicadoresPorParametro[i];
4162                        })[0];
4163                        
4164                        if (objIndicador != undefined) {
4165                            renglonesReordenados += objIndicador.renglones[n];
4166                        }
4167                    }
4168                    renglonesReordenados += "</tr>";
4169                }
4170                //tablaInterna += renglonesReordenados +"</tbody>";
4171                var cuerpo = renglonesReordenados;
4172                ReemplazaTabla2018(cabeceras, cuerpo, parametros);
4173                agregaHerramientasTabla(parametros);
4174            }
4175            
4176            /// <summary>   Dibuja cuadro tipo 3, varios indicadores por varias areas geograficas por un periodo </summary>
4177            ///
4178            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
4179            ///
4180            /// <param name="data">         Valores de indicador en JSON. </param>
4181            /// <param name="parametros">   Objeto de parametros en JSON. </param>
4182            ///
4183            /// <returns>   . </returns>
4184            function DibujaCuadroTipo21(data, parametros) {                
4185                //var tableStat = document.getElementById("tableStat"+ parametros.contenedorCuadro);
4186                var tablaInterna = "";
4187                // var titulosColumnas = parametros.titulosColumnas === ""? parametros.titulosColumnas : "Columna 1, Columna 2";
4188                var arrayLenght = data.length;
4189                var contadorcolumnas = 1;
4190                var saltoPeriodos = data.dimension.periods.category.label.length;
4191                var todosLosIndicadoresPorParametro = parametros.indicadorDepurado.split(",");
4192                
4193                var arrayPeriodos = data.dimension.periods.category.label;
4194                var arrayIndicadores = data.dimension.indicator.category.label;
4195                var cabeceras = "";
4196
4197                var periodoUltimo = "";
4198                var listaCabeceras = [];
4199                if (parametros.titulosColumnas != "") {
4200                    var titulosCol = parametros.titulosColumnas.split(",");                                        
4201                    for (var i = 0; i < titulosCol.length; i++) {
4202                        cabeceras += '<th class ="Th" bgcolor="#DDD"  id="columnaIndicador_' + todosLosIndicadoresPorParametro[i] + '" >' + titulosCol[i] + '</th>';
4203                        var cabeceraPorIndicador = {};
4204                        cabeceraPorIndicador["indicador"] = todosLosIndicadoresPorParametro[i];
4205                        cabeceraPorIndicador["contenido"] = '<th class ="Th" bgcolor="#DDD"  id="columnaIndicador_' + todosLosIndicadoresPorParametro[i] + '" >' + titulosCol[i] + '</th>';
4206                        listaCabeceras.push(cabeceraPorIndicador);
4207                    }
4208                }
4209                else {                    
4210                    $.each(arrayIndicadores, function (key, val) {
4211                        cabeceras += '<th class ="Th" bgcolor="#DDD"  id="columnaIndicador_' + val.Key + '" >' + val.Value + '</th>';
4212                        var cabeceraPorIndicador = {};
4213                        cabeceraPorIndicador["indicador"] = val.Key.toString().replace("I_", "");
4214                        cabeceraPorIndicador["contenido"] = '<th class ="Th" bgcolor="#DDD"  id="columnaIndicador_' + val.Key + '" >' + val.Value + '</th>';
4215                        listaCabeceras.push(cabeceraPorIndicador);
4216                    });
4217                }
4218                
4219                cabeceras += "</tr>";
4220                
4221                var datos = data.value;
4222                var indexValue = 0;
4223                var renglones = "";
4224                var arrayAreas = data.dimension.state.category.label;
4225                var saltoAreas = arrayAreas.length;
4226                var indexIndicador = 0;
4227                var listaRenglonesAreas = [];
4228                var listaColumnasIndicadores = []
4229                var valorNombreRenglon = "";
4230                for (var i = 0; i < arrayAreas.length; i++) {
4231                    var bgColor = "white";
4232                    if (i % 2 == 0) {
4233                        var bgColor = "#EFEFEF";
4234                    }
4235                    valorNombreRenglon = arrayAreas[i].Value.toString().split("-")[0]
4236                    
4237                    renglones += '<tr><td class="TdInicio notranslate"  >' + valorNombreRenglon + '</td>';
4238                    listaRenglonesAreas.push('<td class="TdInicio notranslate"  >' + valorNombreRenglon + '</td>');
4239                    $.each(arrayIndicadores, function (key, valInd) {
4240                        var columnaIndicador = {};
4241                        columnaIndicador["indicador"] = valInd.Key.replace("I_", "");
4242                        columnaIndicador["renglones"] = [];
4243                        listaColumnasIndicadores.push(columnaIndicador);
4244                    });
4245                    contadorcolumnas = 0;
4246                    $.each(arrayIndicadores, function (key, valInd) {
4247                        indexValue = i + saltoPeriodos - 1 + (contadorcolumnas * saltoAreas);
4248                        renglones += '<td  class="Td"  >' + datos[indexValue] + '</td>';
4249                        listaColumnasIndicadores[contadorcolumnas].renglones.push('<td  class="Td"  >' + datos[indexValue] + '</td>');
4250                        contadorcolumnas++;
4251                    });
4252                    renglones += '</tr>';
4253                }
4254                
4255                
4256                // columnas reordenadas
4257                var cabecerasReorden = DibujaCabecera((parametros.tituloColumnaPrincipal != "" ? parametros.tituloColumnaPrincipal : "Region"), arrayIndicadores.length, 1, parametros.contenedorCuadro);
4258                for (var i = 0; i < todosLosIndicadoresPorParametro.length; i++) {
4259                    var objIndicador = listaCabeceras.filter(function (objIndicador) {
4260                        return objIndicador.indicador === todosLosIndicadoresPorParametro[i];
4261                    })[0];
4262                    
4263                    if (objIndicador != undefined) {
4264                        cabecerasReorden += objIndicador.contenido;
4265                    }
4266                }
4267                cabecerasReorden += "</tr>";
4268                cabeceras = cabecerasReorden;
4269                
4270                
4271                var renglonesReordenados = "";
4272                for (var n = 0; n < arrayAreas.length; n++) {
4273                    renglonesReordenados += "<tr>";
4274                    renglonesReordenados += listaRenglonesAreas[n]
4275                    for (var i = 0; i < todosLosIndicadoresPorParametro.length; i++) {
4276                        var objIndicador = listaColumnasIndicadores.filter(function (objIndicador) {
4277                            return objIndicador.indicador === todosLosIndicadoresPorParametro[i];
4278                        })[0];
4279                        
4280                        if (objIndicador != undefined) {
4281                            renglonesReordenados += objIndicador.renglones[n];
4282                        }
4283                    }
4284                    renglonesReordenados += "</tr>";
4285                }
4286                //tablaInterna += renglonesReordenados +"</tbody>";
4287                var cuerpo = renglonesReordenados;
4288                ReemplazaTabla2018(cabeceras, cuerpo, parametros);
4289                agregaHerramientasTabla(parametros);
4290            }
4291            /**
4292             * Caso cuadro SCITEL 2025
4293             * Descripción: utiliza el árbol desarrollador por Mariel para poder llamar este caso de "scitel"
4294             * Agregado: 21/7/2025
4295             */
4296            function DibujaCuadroTipoScitel(data, parametros){
4297                let esNumeroValido = /^-?\d+(\.\d+)?$/;
4298                let INTLFormat = Intl.NumberFormat('es-MX',{style:'decimal'});
4299                // Define elementos de la tabla       
4300                // contenedor tabla
4301                let CONTAINERTABLE = document.getElementById("divDatos" + parametros.contenedorCuadro); 
4302                CONTAINERTABLE.innerHTML = "";
4303                var TABLE = document.createElement("table");
4304                TABLE.className = 'table table-small-font table-bordered table-striped estiloCuadro2';
4305                var tHead = TABLE.createTHead();
4306                var tBody = TABLE.createTBody();        
4307                var tRowBody = tBody.insertRow();
4308
4309                if(data.length > 0 && data[0].clave_valor.length > 0){             
4310                    // var TABLE = document.createElement("table");
4311                    // TABLE.className = 'table table-small-font table-bordered table-striped estiloCuadro2';
4312                    // var tHead = TABLE.createTHead();
4313                    // var tBody = TABLE.createTBody();
4314                    // var tRowBody = tBody.insertRow();
4315                    const grupo = parametros.grupoArbolScitel;                    
4316                    const aDatosArbolTemas = parametros.indicadorValorCompuesto;
4317                    const aTemasClaves = parametros.temaDepurado;
4318                    // const oAreaGeografica = data[0].area_geografica;
4319                    const oIndicadoresTemas = data[0].clave_valor;
4320                    //recorremos los temas para imprimir los titulos que permitiran agrupar los indicadores con su valor
4321                    // console.log("grupo: ", grupo)
4322                    // console.log("data")
4323                    // console.log(data)
4324                    console.log("aDatosArbolTemas: COLUMNAS")
4325                    console.log(aDatosArbolTemas)
4326                    // console.log("aTemasClaves")
4327                    // console.log(aTemasClaves)
4328                    console.log("oIndicadoresTemas")
4329                    console.log(oIndicadoresTemas)
4330
4331                    if(grupo === "1" || grupo === "3"){
4332                        // debugger;
4333                        aTemasClaves.forEach((t, idx) => {
4334                            let clave = parseInt(t.tema);
4335                            let oTema = aDatosArbolTemas.find((arbol, idxt) => parseInt(arbol.tema) === clave);                    
4336                            let newTituloTema = document.createElement("th");
4337                            newTituloTema.colSpan = "3";
4338                            newTituloTema.className = "Th";
4339                            var TITULOTEMA = document.createElement("div");
4340                            TITULOTEMA.style.fontWeight = "bold";
4341                            let rowTituloTema = tRowBody.cloneNode(true)
4342                            TITULOTEMA.innerHTML = oTema.nombreTema
4343                            newTituloTema.appendChild(TITULOTEMA);
4344                            rowTituloTema.appendChild(newTituloTema);
4345                            tBody.appendChild(rowTituloTema)
4346
4347                            // armar la tabla de datos
4348                            aDatosArbolTemas.forEach((indicador, idxi) => {
4349                                // console.log(clave)
4350                                if(clave === parseInt(indicador.tema)){                                    
4351                                    let row = tRowBody.cloneNode(true);
4352                                    // let tdClaveIndicador = document.createElement("td");
4353                                    let tdNombreIndicador = document.createElement("td");
4354                                    let tdValor = document.createElement("td");
4355                                    tdValor.style.textAlign = "right";
4356                                    // console.log(oIndicadoresTemas)
4357                                    // console.log( indicador.clave, typeof indicador.clave);
4358                                    let oTema = oIndicadoresTemas.find((ind_tema, idxt) => {
4359                                        return ind_tema.claves.trim() === indicador.clave.trim();
4360                                    });   
4361                                    
4362                                    // Si existe el indicador o caracteristica pero no existe en los datos que regresa el API                 
4363                                    if(oTema === undefined){                                    
4364                                        // tdClaveIndicador.textContent = indicador.clave
4365                                        tdNombreIndicador.textContent = indicador.nombre
4366                                        tdValor.textContent = "";
4367                                    // Si existe el indicador o caracteristica y si regresa dato del API entonces continua normal
4368                                    } else {
4369
4370                                        // tdClaveIndicador.textContent = indicador.clave
4371                                        tdNombreIndicador.textContent = indicador.nombre
4372                                        // tdValor.textContent = formatoDecimalesResultado(oTema.valor, 1)
4373                                        if(esNumeroValido.test(oTema.valor)){                                                                                   
4374                                            tdValor.textContent = INTLFormat.format(oTema.valor)
4375                                        } else {
4376                                            tdValor.textContent = oTema.valor;
4377                                        }                                      
4378                                    }
4379                                     // inserta el dato en el row de la tabla 
4380                                    // row.appendChild(tdClaveIndicador)
4381                                    row.appendChild(tdNombreIndicador)
4382                                    row.appendChild(tdValor)
4383                                    tBody.appendChild(row)
4384
4385                                }
4386                            })
4387                            TABLE.appendChild(tBody);
4388                        })  
4389                        CONTAINERTABLE.appendChild(TABLE)   
4390
4391                    } else { //para el grupo 2 con AGEB MANZANA
4392
4393                        const aColumnasBase = ["Localidad","Clave de AGEB","Clave de la manzana"];
4394                        /**
4395                         * Recorremos los aTemasClaves para agrupar los cuadros por tema seleccionados.
4396                         */
4397                        // aTemasClaves.forEach((temaclave) => {
4398                            // definicion de elementos de cada tabla
4399                            var TABLE = document.createElement("table");
4400                            TABLE.id = "scitel_tabla_";+parametros.tipoCuadro
4401                            // TABLE.className = 'table table-bordered table-hover table-responsive ';
4402                            TABLE.className = 'table table-small-font table-bordered table-striped estiloCuadro2';
4403                            var tHead = TABLE.createTHead();
4404                            var tBody = TABLE.createTBody();
4405                            
4406                            // let h4Titulo = document.createElement("h4");
4407                            // h4Titulo.textContent = temaclave.nombre
4408                            // CONTAINERTABLE.appendChild(h4Titulo)
4409    
4410                            // Creamos el encabezado, columnas: Lolcalidad, Clave AGEB, Clave MZA, indicadores...
4411                            let tr = document.createElement("tr");
4412                            aColumnasBase.forEach((colbase) => {
4413                                let thCol = document.createElement("th");
4414                                thCol.classList.add("Th")
4415                                thCol.textContent = colbase;
4416                                tr.appendChild(thCol);
4417                                tHead.appendChild(tr)
4418                            })
4419                            // Agregamos los indicadores a la tabla enseguida de las columnas base, esto dependen de la seleccion del arbol de temas: aDatosArbolTemas
4420                            aDatosArbolTemas.forEach((temaIndicador) => {
4421                                // if(temaclave.tema === temaIndicador.tema ){
4422                                    let thCol = document.createElement("th");
4423                                    thCol.classList.add("Th")
4424                                    thCol.textContent = temaIndicador.nombre;
4425                                    tr.appendChild(thCol);
4426                                    tHead.appendChild(tr)
4427                                // }
4428                            })
4429
4430                            /**
4431                             * Reglas de pintado de datos en la tabla para los primeros 2 registros
4432                             * 1. Si area_geografica llega "010010001 Aguascalientes" => Total de la localidad urbana
4433                             * 2. Si areag_geografica llega "AGEB 0017" (sin MZA) => Total AGEB urbana
4434                             * Para el resto de los datos:
4435                             * 3. Todos los que tienen AGEB y MZA (Ejem: area_geografica === "AGEB 0017 MZA 001") => Localidad seleccionada 
4436                             * 
4437                             */
4438
4439                            let area  = "";
4440                            let areaOriginal = "";
4441                            let ageb  = "", mza = "";
4442                            data.forEach((d, idx) => {
4443                                if(d.area_geografica !== ""){
4444                                    let fila = document.createElement("tr");
4445                                    if(areaOriginal === "") {                                                                                
4446                                        // area = d.area_geografica.split(" ")[1] // asignamos la primer columna que es el nombre de la localidad
4447                                        area = d.area_geografica // asignamos tal cual la primer columna que es el nombre de la localidad
4448                                        areaOriginal = area;
4449                                        if(d.area_geografica.indexOf("AGEB") === -1 && d.area_geografica.indexOf("MZA") === -1){
4450                                            area = "Total de la localidad urbana"
4451                                        }
4452
4453                                    } else { // descomponemos el contenido en: AGEB y MANZANA y area con nombre original
4454                                        if(d.area_geografica.indexOf("AGEB") !== -1 && d.area_geografica.indexOf("MZA") === -1){
4455                                            area = "Total AGEB urbana"
4456                                            ageb = d.area_geografica.split(" ")[1]
4457                                            mza = "";
4458                                        } else if(d.area_geografica.indexOf("AGEB") !== -1 && d.area_geografica.indexOf("MZA") !== -1){
4459                                            // AGEB Y MANZANA
4460                                            ageb = d.area_geografica.split(" ")[1]
4461                                            mza = d.area_geografica.split("MZA")[1]
4462                                            area = areaOriginal;
4463
4464                                        } else {
4465                                            // nombre de las areas cuando tienen mza y ageb
4466                                            area = areaOriginal;
4467                                        }
4468                                        
4469                                    }
4470                                    // columna area
4471                                    let tdArea = document.createElement("td"); tdArea.classList.add("TdInicioV"); tdArea.textContent = area;
4472                                    fila.appendChild(tdArea);
4473                                    // columna ageb
4474                                    let tdAgeb = document.createElement("td"); tdAgeb.classList.add("TdV"); tdAgeb.textContent = ageb;
4475                                    fila.appendChild(tdAgeb);
4476                                    // columna manzana
4477                                    let tdMza = document.createElement("td"); tdMza.classList.add("TdV"); tdMza.textContent = mza;
4478                                    fila.appendChild(tdMza);
4479
4480                                    // agregamos los valores (clave_valor) al resto de la fila para cada columna de indicadores
4481                                    let aIndicadores = d.clave_valor;
4482                                    aIndicadores.forEach((indicador) => {
4483                                        let td = document.createElement("td"); 
4484                                        td.classList.add("TdV");
4485                                        if(indicador.valor === ""){
4486                                            td.textContent = "*";
4487                                            td.style.color = "#d71d2a";
4488                                        } else {
4489                                            if(esNumeroValido.test(indicador.valor)){                                        
4490                                                td.textContent = INTLFormat.format(indicador.valor);
4491                                            } else {
4492                                                td.textContent = indicador.valor;
4493                                            }
4494                                        }
4495                                        fila.appendChild(td);
4496                                    })
4497                                    // agregamos la fila al cuerpo de la tabla
4498                                    tBody.appendChild(fila)  
4499
4500                                }
4501                            });
4502
4503
4504                            // Agregamos las tablas al contenedor principal
4505                            TABLE.appendChild(tHead)
4506                            TABLE.appendChild(tBody)
4507                            CONTAINERTABLE.appendChild(TABLE)                          
4508
4509                    }
4510                    // Render table
4511                } else {
4512                    let emptyData = document.createElement("td");
4513                    emptyData.colSpan = "3";
4514                    // emptyData.className = "bg-primary";
4515                    console.warn("indicadores arbol: ", parametros.indicadorValorCompuesto)
4516                    console.warn("temas: ", parametros.temaDepurado)
4517                    console.warn("respuesta de IndicadoresValorScitel: ", data)
4518                    emptyData.textContent = "No se encontraron datos relacionados.";
4519                    let trEmptyData = tRowBody.cloneNode(true)
4520                    trEmptyData.appendChild(emptyData)
4521                    TABLE.appendChild(trEmptyData)
4522                    CONTAINERTABLE.appendChild(TABLE)   
4523
4524                }             
4525                $("#tableStat" + parametros.contenedorCuadro).hide();
4526                $("#TableEspacio" + parametros.contenedorCuadro).hide();
4527            }
4528            
4529            /// <summary>   Separa el indicador principal y agrupa indicadores por descripciones </summary>
4530            ///
4531            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
4532            ///
4533            /// <param name="indicadorValor">   Parametro de indicadores con descripciones. </param>
4534            ///
4535            /// <returns>   . </returns>
4536            function IndicadorCompuesto(indicadorValor) {
4537                var indCompuesto = {};
4538                var grupos = indicadorValor.split("|");
4539                indCompuesto["principal"] = grupos[0].split("-")[1];
4540                var listaIndicadores = []
4541                var todosLosIndicadores = "";
4542                var indicadoresGrupo = [];
4543                todosLosIndicadores += indCompuesto["principal"];
4544                //listaIndicadores.push(indCompuesto["principal"]);
4545                var listaIndicadoresGrupoInterna = indCompuesto["principal"].split(",");
4546                for (var i = 0; i < listaIndicadoresGrupoInterna.length; i++) {
4547                    if (listaIndicadoresGrupoInterna[i] != "0")
4548                    todosLosIndicadores += "," + listaIndicadoresGrupoInterna[i];
4549                }
4550                
4551                $.each(grupos, function (key, val) {
4552                    var grupo = {};
4553                    var indicadorBold = val.split("-")[0];
4554                    if (indicadorBold != "b") {
4555                        grupo["titulo"] = indicadorBold;
4556                        var listaInterna = val.split("-")[1];
4557                        var listaIndicadoresGrupoInterna = listaInterna.split(",");
4558                        for (var i = 0; i < listaIndicadoresGrupoInterna.length; i++) {
4559                            if (listaIndicadoresGrupoInterna[i] != "0")
4560                            todosLosIndicadores += "," + listaIndicadoresGrupoInterna[i];
4561                        }
4562                        
4563                        
4564                        var indicadoresPorGrupo = [];
4565                        $.each(listaInterna.split(","), function (key, val1) {
4566                            indicadoresPorGrupo.push(val1);
4567                        });
4568                        grupo["indicadores"] = indicadoresPorGrupo;
4569                        indicadoresGrupo.push(grupo);
4570                    }
4571                });
4572                
4573                indCompuesto["grupos"] = indicadoresGrupo;
4574                indCompuesto["todosLosIndicadores"] = todosLosIndicadores;
4575                indCompuesto["listaIndicadores"] = listaIndicadores;
4576                return indCompuesto;
4577            }
4578            /**
4579             * 
4580             * @param {*} string 
4581             * @returns boleano
4582             * @description Verifica si una cdena son solo numeros
4583             */
4584            function checkOnlyNumbers(string){
4585                var onlyNumbersExp = /^[0-9\,]*$/;
4586                return onlyNumbersExp.test(string)
4587            }
4588            /// <summary>   Agrupa indicadores y descripciones, identifica parametros de negritas e identacion. </summary>
4589            ///
4590            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
4591            ///
4592            /// <param name="indicadorValor">   Parametro de indicadores con descripciones.  </param>
4593            ///
4594            /// <returns>   . </returns>
4595            function IndicadorCompuestoB(indicadorValor) {
4596                var indCompuesto = {};
4597                var grupos = indicadorValor.split("|");
4598                indCompuesto["principal"] = grupos[0].split("-")[1];
4599                var listaIndicadores = []
4600                var todosLosIndicadores = "";
4601                var indicadoresGrupo = [];
4602                //todosLosIndicadores += indCompuesto["principal"];
4603                //listaIndicadores.push(indCompuesto["principal"]);
4604                $.each(grupos, function (key, val) {
4605                    var grupo = {};
4606                    // En caso de que llegue guion medio con dos textos juntos entonces modificar el val 
4607                    // 14-09-2023
4608                    var validaSegundoSplit = val.split("-");                    
4609                    if(validaSegundoSplit.length > 2){
4610                        if(!checkOnlyNumbers(validaSegundoSplit[1])){
4611                            var nVal = validaSegundoSplit.slice(2,validaSegundoSplit.length) // genera una copia del arreglo original pero solo con los indicadores
4612                            nVal.unshift(validaSegundoSplit[0]+" "+validaSegundoSplit[1]) // se inserta la cadena concatenada al arreglo de indicadores
4613                            val = nVal.join("-"); // se une por guines el texto y el indicador como originalmente se encontraba
4614                        }
4615                    }
4616                    var descripcionRenglon = val.split("-")[0];
4617                    
4618                    // grupo["titulo"] = descripcionRenglon.replace("ggg", "-");
4619                    grupo["titulo"] = replaceAll("ggg", "-", descripcionRenglon);
4620                    var listaInterna = val.split("-")[1];
4621                    var listaIndicadoresGrupoInterna = listaInterna.split(",");
4622                    for (var i = 0; i < listaIndicadoresGrupoInterna.length; i++) {
4623                        if (listaIndicadoresGrupoInterna[i] != "0")
4624                        
4625                        todosLosIndicadores += "," + listaIndicadoresGrupoInterna[i];
4626                    }
4627                    
4628                    
4629                    var indicadoresPorGrupo = [];
4630                    $.each(listaInterna.split(","), function (key, val1) {
4631                        indicadoresPorGrupo.push(val1);
4632                    });
4633                    grupo["indicadores"] = indicadoresPorGrupo;
4634                    var ponerBold = (val.split("-")[2] == undefined) ? "" : val.split("-")[2];
4635                    grupo["pintaBold"] = false;
4636                    if (ponerBold == "b")
4637                    grupo["pintaBold"] = true;
4638                    if (ponerBold.indexOf("i") > -1) {
4639                        var identacion = parseInt(ponerBold.replace("i", ""));
4640                        grupo["identacion"] = identacion;
4641                    }
4642                    var identacionParametro = (val.split("-")[3] == undefined) ? "" : val.split("-")[3];
4643                    if (identacionParametro.indexOf("i") > -1) {
4644                        var identacion = parseInt(identacionParametro.replace("i", ""));
4645                        grupo["identacion"] = identacion;
4646                    }
4647                    
4648                    indicadoresGrupo.push(grupo);
4649                    
4650                });
4651                indCompuesto["maximaCantidadPorGrupo"] = indicadoresGrupo[0].indicadores.length;
4652                indCompuesto["grupos"] = indicadoresGrupo;
4653                indCompuesto["todosLosIndicadores"] = todosLosIndicadores.replace(",", "");
4654                indCompuesto["listaIndicadores"] = listaIndicadores;
4655                return indCompuesto;
4656            }
4657            
4658            /// <summary>   Agrupa indicadores y descripciones, identifica parametros con y sin texto. </summary>
4659            ///
4660            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
4661            ///
4662            /// <param name="indicadorValor">   Parametro de indicadores con descripciones.  </param>
4663            ///
4664            /// <returns>   . </returns>
4665        function IndicadorCompuestoC(indicadorValor) {                
4666                var indCompuesto = {};
4667                var grupos = indicadorValor.split("|");
4668                indCompuesto["principal"] = grupos[0].split("-")[1];
4669                var listaIndicadores = []
4670                var todosLosIndicadores = "";
4671                var indicadoresGrupo = [];
4672                var agrupamiento = false;
4673                $.each(grupos, function (key, val) {
4674                    var grupo = {};
4675                    var descripcionRenglon = (val.indexOf("-") !== -1) ? val.split("-")[0] : val;
4676                    
4677                    grupo["titulo"] = replaceAll("ggg", "-", descripcionRenglon);
4678                    //obtiene el listado interno de indicadores
4679                    
4680                    if (val.indexOf(",") !== -1) {
4681                        //console.log(val.split("-"));                
4682                        var listaInterna = (val.indexOf("-") !== -1) ? val.split("-")[1] : val;
4683                        
4684                        var listaIndicadoresGrupoInterna = listaInterna.split(",");
4685                        
4686                        if (!isNaN(listaIndicadoresGrupoInterna[0])) { // si en la posicion 0 esta un "b" o "i.." no es numerico entonces lo ignora por que solo deben ser indicadores
4687                        for (var i = 0; i < listaIndicadoresGrupoInterna.length; i++) {
4688                            if (listaIndicadoresGrupoInterna[i] != "0") {
4689                                todosLosIndicadores += "," + listaIndicadoresGrupoInterna[i];
4690                            }
4691                        }
4692                        var indicadoresPorGrupo = [];
4693                        $.each(listaInterna.split(","), function (key, val1) {
4694                            indicadoresPorGrupo.push(val1);
4695                        });
4696                    }
4697                    
4698                } else {
4699                    agrupamiento = true;
4700                }
4701                
4702                grupo["indicadores"] = indicadoresPorGrupo;
4703                //texto en negritas
4704                if (agrupamiento) {
4705                    grupo['titulo'] = (val.indexOf("-b") !== -1) ? "<b>" + grupo['titulo'] + "</b>" : grupo['titulo'];
4706                } else {
4707                    grupo['titulo'] = (val.indexOf("-b") !== -1) ? "<b>" + grupo['titulo'] + "</b>" : grupo['titulo'];
4708                }
4709                //indentacion
4710                var spacesAdded = "";
4711                if (val.indexOf("-i") !== -1) {
4712                    var indentacion = val.split("-i");
4713                    var totalSpaces = parseInt(indentacion[1]);
4714                    switch (totalSpaces) {
4715                        case 1: strSpaces = "&emsp;"; break;
4716                        case 2: strSpaces = "&emsp;&emsp;"; break;
4717                        case 3: strSpaces = "&emsp;&emsp;&emsp;"; break;
4718                        case 4: strSpaces = "&emsp;&emsp;&emsp;&emsp;"; break;
4719                        case 5: strSpaces = "&emsp;&emsp;&emsp;&emsp;&emsp;"; break;
4720                        default: strSpaces = ""; break;
4721                    }
4722                    spacesAdded = strSpaces;
4723                    grupo['titulo'] = strSpaces + grupo['titulo'];
4724                }
4725                // texto fijo para cifras desestacionalizadas con parametro: -cd
4726                if (val.indexOf("-cd") !== -1) {
4727                    var texto = val.indexOf("-cd:") !== -1 ? val.split("-cd:")[1] : val;
4728                    grupo['cd'] = "<br />" + spacesAdded + "<small style=\'font-style:italic;font-size:11px;color:#737373;\'>" + texto + "</small>";
4729                } else {
4730                    grupo['cd'] = "";
4731                }
4732                //añade a el arreglo final que regresara
4733                indicadoresGrupo.push(grupo);
4734                
4735            });
4736            indCompuesto["agrupamiento"] = agrupamiento; // saber si los indicadores tienen un agrupamiento por renglones
4737            indCompuesto["maximaCantidadPorGrupo"] = indicadoresGrupo[1].indicadores ? indicadoresGrupo[1].indicadores.length : 0;
4738            indCompuesto["grupos"] = indicadoresGrupo;
4739            indCompuesto["todosLosIndicadores"] = todosLosIndicadores.replace(",", "");
4740            indCompuesto["listaIndicadores"] = listaIndicadores;
4741            return indCompuesto;
4742        }
4743        /**
4744         * Metodo para el procesamiento de parametro "ind"
4745         * Formato: nombreindicador-indicador1_tematica-indicador2_tematica-b-cd:textonota|...nombreindicador...etc
4746         * Fecha: 10-03-2023
4747         * @param {*} indicadorValor 
4748         * @returns 
4749         */
4750        function IndicadorCompuestoCuadro12(indicadorValor) {
4751            // console.log(">> IndicadorCompuestoCuadro12 -> procesamiento de parametro ind")
4752            var aIndicadoresGrupos = {};      
4753            var aTematicas = []; // todas las tematicas diferentes;
4754            var aIndicadoresTematica = []
4755            var aIndicadoresInfo = []
4756            var aGruposPipe = indicadorValor.indexOf("|") > -1? indicadorValor.split("|") : indicadorValor.split(",");
4757            var conFormato = null;            
4758            //FORMATO:
4759            // | -> separa grupos indicadores
4760            // -     
4761            // _ -> _tematica    
4762            // , -> indicador_tematica   
4763            // b -> negrita    
4764            // cd: ->descripcion
4765            // i -> indentacion  
4766            if(indicadorValor.indexOf("|") > -1){
4767                // console.log(indicadorValor);
4768                conFormato = true;
4769                
4770                $.each(aGruposPipe, function (idx, g) {
4771                    var strSpaces = "";
4772                    var totalSpaces = 0;
4773                    var oIndicador = {};
4774                    var tituloIndicador = g.split("-")[0];
4775                    var espaciado = "";
4776
4777                   /*  if (g.indexOf(",") > -1) {
4778                        tituloIndicador = (g.indexOf("-b") > -1) ? "<b>" + tituloIndicador + "</b>" : tituloIndicador;
4779                    } */
4780                    tituloIndicador = (g.indexOf("-b") > -1) ? "<b>" + tituloIndicador + "</b>" : tituloIndicador;
4781                    
4782                    if (g.indexOf("-i") !== -1) {
4783                        var indentacion = g.split("-i");
4784                        totalSpaces = parseInt(indentacion[1]);
4785                        switch (totalSpaces) {
4786                            case 1: strSpaces = "&emsp;"; break;
4787                            case 2: strSpaces = "&emsp;&emsp;"; break;
4788                            case 3: strSpaces = "&emsp;&emsp;&emsp;"; break;
4789                            case 4: strSpaces = "&emsp;&emsp;&emsp;&emsp;"; break;
4790                            case 5: strSpaces = "&emsp;&emsp;&emsp;&emsp;&emsp;"; break;
4791                            default: strSpaces = ""; break;
4792                        }                       
4793                        // tituloIndicador = tituloIndicador;
4794                    }
4795                    // obtener descripcion y espaciado como el titulo
4796                    var cd = "";
4797                    if (g.indexOf("-cd") !== -1) {
4798                        var texto = g.indexOf("-cd:") !== -1 ? g.split("-cd:")[1] : g;
4799                        cd = strSpaces + "<small style=\'font-style:italic;font-size:11px;color:#737373;\'>" + texto + "</small>";
4800                    }
4801                
4802                    // Tratamiento de indicadores
4803                    if(g.indexOf("-") > -1){
4804                        var aIndicadores = g.split("-")[1] !== "b" ? g.split("-")[1].split(",") : null;
4805                        if(aIndicadores !== null){                   
4806                            oIndicador.indicadores = [];
4807                            oIndicador.tematicas = [];
4808                            aIndicadores.forEach(i => {                        
4809                                var indicadorTematica = i.split("_") // indicador_tm
4810                                var tm = indicadorTematica[1] !== undefined? parseInt(indicadorTematica[1]) : -1
4811                                oIndicador.indicadores.push(parseInt(indicadorTematica[0]))
4812                                oIndicador.tematicas.push(tm)
4813                                // se llena el arreglo de indicadores-tematica
4814                                if(tm !== -1) aIndicadoresTematica.push({indicador:indicadorTematica[0], tematica:tm})
4815                            // se llena arreglo de todas las tematicas diferentes
4816                                if(tm !== -1 && aTematicas.indexOf(tm) === -1){
4817                                    aTematicas.push(parseInt(tm))
4818                                }
4819                                // llenar arreglo de todos los indicadores
4820                                
4821                            });
4822                        }
4823                        oIndicador.titulo = tituloIndicador
4824                        oIndicador.cd = cd;
4825
4826                    }
4827                    oIndicador.espacios = totalSpaces
4828                    //añade a el arreglo final que regresara
4829                    aIndicadoresInfo.push(oIndicador)
4830                    // console.log(aIndicadoresInfo);
4831                
4832                });
4833
4834            }  else {
4835                conFormato = false;
4836                $.each(aGruposPipe, function (idx, g) {
4837                    var oIndicador={indicadores:[],tematicas:[]};
4838                    var indicadorTematica = g.split("_") // indicador_tm
4839                    var indicadorSolo = indicadorTematica[0].indexOf("-") > -1? indicadorTematica[0].split("-")[1] : indicadorTematica[0];
4840                    var titulo = indicadorTematica[0].indexOf("-") > -1? indicadorTematica[0].split("-")[0] : "";
4841                    var tm = indicadorTematica[1] !== undefined? parseInt(indicadorTematica[1]) : -1
4842                    oIndicador.indicadores.push(parseInt(indicadorSolo))
4843                    oIndicador.tematicas.push(tm)
4844                    oIndicador.titulo = titulo;
4845                        // se llena el arreglo de indicadores-tematica
4846                    if(tm !== -1) aIndicadoresTematica.push({indicador:indicadorSolo, tematica:tm})
4847                    // se llena arreglo de todas las tematicas diferentes
4848                    if(tm !== -1 && aTematicas.indexOf(tm) === -1){
4849                        aTematicas.push(parseInt(tm))
4850                    }
4851
4852                    aIndicadoresInfo.push(oIndicador)
4853                })
4854            }
4855
4856            aIndicadoresGrupos.indicadores = aIndicadoresInfo;
4857            aIndicadoresGrupos.todasTematicas = aTematicas;           
4858            aIndicadoresGrupos.todosIndicadores = aIndicadoresTematica;                       
4859            aIndicadoresGrupos.conFormato = conFormato; // indica si los indicadores pasados por parametro llegan con texto y formato -i -b -cd, si no entonces es false                       
4860            return aIndicadoresGrupos;
4861        }
4862        //Para cuadro #20
4863        // Formato de indicadores (parametro: ind: "b|Menores de 1 año-6207079575,6207079576|1 a 4 años-6207079532,6207079533|...")
4864        // ind:"b|titulo indicador-indicador1,indicador2|tituloindicador-indicador3,indicador4|...";
4865        function IndicadorAgrupadoB(indicadorValor) {
4866            var indCompuesto = {};
4867            var grupos = indicadorValor.split("|");
4868            var listaIndicadores = []
4869            var todosLosIndicadores = "";
4870            var indicadoresGrupo = [];
4871            var maximaCantidadPorGrupo = 0;
4872            var esPrincipal = true;
4873            var contarGrupos = 0;
4874            $.each(grupos, function (key, val) {
4875
4876                var grupo = {};
4877                var indicadorBold = val.split("-")[0];
4878                //if ((indicadorBold != "b" || !esPrincipal)) {
4879                if (contarGrupos != 0) {
4880                    esPrincipal = false;
4881                    grupo["titulo"] = indicadorBold.replace("ggg", "
4881-");
4882                    var listaInterna = val.split("-")[1];
4883                    todosLosIndicadores += "" + listaInterna + ",";
4884                    if (listaInterna.split(",").length > maximaCantidadPorGrupo)
4885                        maximaCantidadPorGrupo = listaInterna.split(",").length;
4886                    var indicadoresPorGrupo = [];
4887                    $.each(listaInterna.split(","), function (key, val1) {
4888                        indicadoresPorGrupo.push(val1);
4889                    });
4890                    grupo["indicadores"] = indicadoresPorGrupo;
4891                    indicadoresGrupo.push(grupo);
4892                }
4893                contarGrupos++;
4894            });
4895
4896
4897            indCompuesto["maximaCantidadPorGrupo"] = maximaCantidadPorGrupo;
4898            indCompuesto["grupos"] = indicadoresGrupo;
4899            indCompuesto["todosLosIndicadores"] = todosLosIndicadores.substring(0, todosLosIndicadores.length - 1);
4900            indCompuesto["listaIndicadores"] = listaIndicadores;
4901            return indCompuesto;
4902        }
4903        
4904        /// <summary>   Coloca titulos por grupos de indicadores. </summary>
4905        ///
4906        /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
4907        ///
4908        /// <param name="indicadorValor">   Parametro de indicadores con descripciones. </param>
4909        ///
4910        /// <returns>   . </returns>
4911        function IndicadorTituloAgrupado(indicadorValor) {
4912            var listaTitulosGrupos = indicadorValor.split("|");
4913            var listaGrupos = [];
4914            var indicadorDepurado = "";
4915            for (var i = 0; i < listaTitulosGrupos.length; i++) {
4916                var nuevoGrupo = {};
4917                var listaNiveles = listaTitulosGrupos[i].split("'");
4918                if (listaNiveles.length < 2)
4919                console.log("debe llevar titulo del grupo y titulos del siguiente nivel " + listaTitulosGrupos[i]);
4920                nuevoGrupo["tituloGrupo"] = listaNiveles[0];
4921                nuevoGrupo["listaIndicadores"] = [];
4922                var titulosNivel2 = listaNiveles[1].split("^");
4923                for (var j = 0; j < titulosNivel2.length; j++) {
4924                    var tituloConIndicador = titulosNivel2.split("-");
4925                    var nuevoIndicador = {};
4926                    nuevoIndicador["titulo"] = tituloConIndicador[0];
4927                    nuevoIndicador["indicador"] = tituloConIndicador[1];
4928                    if (indicadorDepurado != "")
4929                    indicadorDepurado += ",";
4930                    indicadorDepurado += tituloConIndicador[1];
4931                }
4932            }
4933        }
4934        
4935        function IndicadorUnicoCompuesto(indicadorValor) {
4936            
4937            //split partes indicador
4938            var indicadorCompuesto = {};
4939            var indicador_final = indicadorValor.split("-")[0]; // nombre del indicador
4940            // si el texto ira en formato bold / negritas
4941            if (indicadorValor.indexOf("-b") !== -1) {
4942                indicadorCompuesto['indicador'] = "<b>" + indicador_final + "</b>";
4943            }
4944            indicadorCompuesto['indicadorDepurado'] = indicadorValor.split("-")[1];
4945            
4946            return indicadorCompuesto;
4947        }
4948        
4949        /// <summary>   Dibuja cuadro tipo 6 compuesto, varios indicadores por un indicador por un area geografica,
4950        ///             maneja grupos de indicadores por descripcion, cada renglon puede llevar negrita o identacion. </summary>
4951        ///
4952        /// <remarks>   SERGIO.NIETO, 24/11/2016. </remarks>
4953        /// <param name="data">         Valores de indicador en JSON. </param>
4954        /// <param name="parametros">   Objeto de parametros en JSON. </param>
4955        /// <returns>SNM 08.08.2017 Se agrega nombre de columna si no llega por parametro. </returns>
4956        function DibujaCuadroTipo6Compuesto(data, parametros) {
4957            var tableStat = document.getElementById("tableStat" + parametros.contenedorCuadro);
4958            //    tableStat.style.width = "100%";
4959            var tablaInterna = "";
4960            // var arrayLenght = data.length;
4961            var aPeriodos = data.dimension.periods.category.label;
4962            //var cabeceras = '<tr><th class ="Th" bgcolor="#DDD" >' + data.dimension.indicator.label + '</th>';
4963            var tcPrincipal = (parametros.tituloColumnaPrincipal == "") ? "Concepto" : parametros.tituloColumnaPrincipal;
4964            //SNM 08.08.2017 Se agrega nombre de columna si no llega por parametro.
4965            if (parametros.titulosColumnas == "") {
4966                for (var i = 0; data.dimension.periods.category.label.length > i; ++i) {
4967                    if (i != 0) {
4968                        parametros.titulosColumnas += ",";
4969                    }
4970                    parametros.titulosColumnas += data.dimension.periods.category.label[i].Value;
4971                }
4972            }
4973            // var cabeceras = DibujaCabeceraUnNivelGenerico(tcPrincipal, parametros.indicadorValorCompuesto.maximaCantidadPorGrupo, parametros.titulosColumnas, parametros);
4974            var cabeceras = DibujaCabeceraUnNivelGenerico(tcPrincipal, parametros.indicadorValorCompuesto.maximaCantidadPorGrupo, parametros.titulosColumnas, parametros, aPeriodos);
4975            var arrayPeriodos = data.dimension.periods.category.label;
4976            
4977            //tablaInterna += cabeceras;
4978            var datos = data.value;
4979            var indexValue = 0;
4980            var renglones = "";
4981            var arrayIndicadores = data.dimension.indicator.category.label;
4982            var tablaDatos = [];
4983            
4984            // llena datos transformados en un modelo de tabla
4985            for (var i = 0; i < arrayIndicadores.length; i++) {
4986                var renglonDatos = {};
4987                renglonDatos["indicator"] = arrayIndicadores[i].Key;
4988                renglonDatos["descripcion"] = arrayIndicadores[i].Value;
4989                var valoresIndicador = [];
4990                $.each(arrayPeriodos, function (key, val) {
4991                    valoresIndicador.push(datos[indexValue]);
4992                    indexValue++;
4993                });
4994                renglonDatos["valoresIndicador"] = valoresIndicador;
4995                tablaDatos.push(renglonDatos);
4996            }
4997            
4998            var bgColor = "white";
4999            
5000            
5001            // busca indicator "principal" y lo pinta en la tabla
5002            var indiceRenglon = 0;
5003            var transalateText = "";
5004            var classTranslate = ""
5005            if (parametros.textoOriginal == "true") {
5006                transalateText = " notranslate ";
5007                classTranslate = ' class ="notranslate"'
5008            }
5009            
5010            // busca "grupos" pinta su encabezado 
5011            $.each(parametros.indicadorValorCompuesto.grupos, function (key, valGroup) {
5012                var boldInicio = "";
5013                var boldFin = "";
5014                var tdColumnas = "";
5015                if (valGroup.titulo.indexOf("°") !== -1) { // si llegan 2 columnas separados por °
5016                    var aColumnasPrincipales = valGroup.titulo.split("°");
5017                    for (var x = 0; x < aColumnasPrincipales.length; x++) {
5018                        var valDescripcionRenglon = aColumnasPrincipales[x];
5019                        if (valGroup.pintaBold) {
5020                            aColumnasPrincipales[x] = '<b>' + aColumnasPrincipales[x] + '</b>';
5021                            boldInicio = "<b>";
5022                            boldFin = "</b>"
5023                        }
5024                        bgColor = ColorRenglon(indiceRenglon++);
5025                        tdColumnas += '<td  class="TdInicio' + transalateText + '"  ><div ' + classTranslate + '  style="padding-left:' + IndentacionPadding(valGroup.identacion) + 'px;">' + aColumnasPrincipales[x] + '</div></td>';
5026                    }
5027                    
5028                    renglones += '<tr>' + tdColumnas;
5029                    
5030                } else {
5031                    var valDescripcionRenglon = valGroup.titulo;
5032                    if (valGroup.pintaBold) {
5033                        valDescripcionRenglon = '<b>' + valGroup.titulo + '</b>';
5034                        boldInicio = "<b>";
5035                        boldFin = "</b>"
5036                    }
5037                    bgColor = ColorRenglon(indiceRenglon++);
5038                    tdColumnas += '<td  class="TdInicio' + transalateText + '"  ><div ' + classTranslate + ' style="padding-left:' + IndentacionPadding(valGroup.identacion) + 'px;">' + valDescripcionRenglon + '</div></td>';
5039                    renglones += '<tr>' + tdColumnas;
5040                }
5041                $.each(valGroup.indicadores, function (key, valGroupInd) {
5042                    var obj2 = tablaDatos.filter(function (obj) {
5043                        return obj.indicator === "I_" + valGroupInd;
5044                    })[0];
5045                    if (typeof obj2 !== "undefined") {
5046                        renglones += PintaRenglonTablaGruposB(boldInicio, boldFin, obj2, bgColor, parametros);
5047                    } else {
5048                        if (parametros.omitevalorseriecero == 'true') {
5049                            renglones += '<td remove="true" class="Td"  > &nbsp; </td>';
5050                        } else {
5051                            renglones += '<td class="Td"><span style="display:none">-</span></td>';
5052                        }
5053                    }
5054                    
5055                });
5056                
5057                renglones += '</tr>';
5058            });
5059            
5060            //   tablaInterna += renglones;
5061            tablaInterna += renglones;
5062            //var div = document.createElement("div");
5063            //div.innerHTML = "<table><tbody>" + tablaInterna + "</tbody></table>";
5064            //tableStat.appendChild(div.firstChild.tBodies[0]);       
5065            ReemplazaTablaConEncabezado(tablaInterna, cabeceras, parametros);
5066            
5067            //Elimina filas con datos vacios, que no traen ni 0
5068            if (parseInt($($("#tableStat" + parametros.contenedorCuadro).children()[1]).children().length) > 0) {
5069                $($("#tableStat" + parametros.contenedorCuadro).children()[1]).children().each(function (a, b) {
5070                    if ($($(b).children()[1]).text().trim() === "") {
5071                        $($(b)[0]).remove();
5072                    }
5073                });
5074            }
5075        }
5076        
5077        /**
5078         * Descripción: 
5079         * Dibuja cuadro tipo 7 - Un indicador "741927" y regresa todas las entidades con varios periodos
5080         * Dibuja cuadro tipo 7 - Varios indicadores "Nombre entidad-clave_indicador|Nombre entidad 2-clave_indicador|..."
5081         * @modificado 9.11.2025
5082         * @param {*} data 
5083         * @param {*} parametros 
5084         */
5085        function DibujaCuadroTipo7(data, parametros) {
5086            document.getElementById(parametros.contenedorCuadro).style.width = "100%";
5087            document.getElementById("divDatos" + parametros.contenedorCuadro).style["overflow-x"] = "auto";
5088            var tablaInterna = "";
5089            var cabeceras = "";
5090            var arrayPeriodos = data.dimension.periods.category.label;
5091            var arrayIndicadores = data.dimension.indicator.category.label;
5092            var saltoPeriodos = arrayPeriodos.length;
5093            var listaAnios = [];
5094            var listaSubperiodos = [];
5095            var frecuencia = data.dimension.freq.category.label[0].Value;
5096            
5097            if (parametros.pivotear === "false") {
5098                
5099                 // Si solo es un indicador
5100                // 9.11.2025
5101                if(arrayIndicadores.length === 1){
5102
5103                    // Arma los encabezados del cuadro -------------------------------
5104                    $.each(arrayPeriodos, function (key, val) {
5105                        if (val.Value.indexOf("/") > -1) {
5106                            var periodoCortado = val.Value.split("/")[0];
5107                            var subPeriodo = val.Value.split("/")[1];
5108                            if (listaAnios.indexOf(periodoCortado) == -1) {
5109                                listaAnios.push(periodoCortado);
5110                            }
5111                            if (subPeriodo != undefined) {
5112                                if (listaSubperiodos.indexOf(parseInt(subPeriodo)) == -1) {
5113                                    listaSubperiodos.push(parseInt(subPeriodo));
5114                                }
5115                            }
5116                        }
5117                    });
5118                    
5119                    var columnasOcultas = 0
5120                    if (parametros.cantidadPeriodos != "0") {
5121                        columnasOcultas = arrayPeriodos.length - parseInt(parametros.cantidadPeriodos);
5122                        if (columnasOcultas < 0)
5123                        columnasOcultas = 0;
5124                    }
5125                    
5126                    var cantidadPorGrupo = Math.max.apply(null, listaSubperiodos);
5127                    if (cantidadPorGrupo == undefined)
5128                    cantidadPorGrupo = 1;
5129                    var tcPrincipal = (parametros.tituloColumnaPrincipal == "") ? "Denominaci&oacute;n" : parametros.tituloColumnaPrincipal;
5130                    var periodosVisibles = [];
5131                    for (var i = 0; i < arrayPeriodos.length; i++) {
5132                        if (i >= columnasOcultas) {
5133                            periodosVisibles.push(arrayPeriodos[i].Value);
5134                        }
5135                    }
5136                    // console.log(periodosVisibles);
5137                    var listaPeriodosObj = ObtienePeriodosVisbles(listaAnios, periodosVisibles);
5138                    //SNM 08.08.2017 cambio de variable parametros.contenedorCuadro por parametros para dividir cabecera compuesta
5139                    //cabeceras = DibujaCabeceraTipo7(tcPrincipal, cantidadPorGrupo, listaAnios, parametros.contenedorCuadro, listaPeriodosObj);
5140                    cabeceras = DibujaCabeceraTipo7(tcPrincipal, cantidadPorGrupo, listaAnios, parametros, listaPeriodosObj);
5141                    // console.log(cabeceras);
5142                    var indiceColumna = 0;
5143                    //console.log(arrayPeriodos)
5144                    $.each(arrayPeriodos, function (key, val) {
5145                        var estiloOculto = "";
5146                        if (indiceColumna < columnasOcultas) {
5147                            estiloOculto = 'style="display:none;"';
5148                        }
5149                        var valorColumna = PintaTitulosColumnas(parametros.titulosColumnas, val.Value, indiceColumna++);
5150                        if (val.Value.indexOf("/") !== -1) {
5151                            valorColumna = oMESES.getFormatoPeriodo(val.Value, frecuencia, parametros.idioma, 2);
5152                        }
5153                        // se añadio data-p4140eriodo con el periodo sin formato para poder buscarlo en la cabecera y compararlo con los datos de cifras estatus
5154                        cabeceras += '<th class ="Th" id="tdAnio' + parametros.contenedorCuadro + valorColumna + '" bgcolor="#DDD" ' + estiloOculto + ' data-periodo="' + val.Value + '">' + valorColumna + '</th>';
5155                    });
5156                    
5157                    var contadorcolumnas = 0;
5158                    var indexValue = 0;
5159                    cabeceras += "<tr>";
5160                    cabeceras += "</tr>";
5161
5162                    // Arma filas del datos del cuadro -----------------------
5163                    // tablaInterna += cabeceras;
5164                    var datos = data.value;
5165                    var indexValue = 0;
5166                    var renglones = "";
5167                    var arrayIndicadores = data.dimension.indicator.category.label;
5168                    var arrayAreas = data.dimension.state.category.label;
5169                    // var totalColumnas = data.dimension.periods.category.label;
5170                    
5171                    for (var i = 0; i < arrayAreas.length; i++) {
5172                        
5173                        renglones += '<tr><td class="TdInicio notranslate"  >' + arrayAreas[i].Value.toString().split("-")[0] + '</td>';
5174                        
5175                        $.each(arrayPeriodos, function (key, val) {
5176                            if (datos[indexValue] === "") {
5177                                
5178                                renglones += '<td  class="Td"  > --- </td>';
5179                            } else {
5180                                renglones += '<td  class="Td"  >' + datos[indexValue] + '</td>';
5181                            }
5182                            indexValue++;
5183                        });
5184                        
5185                        renglones += '</tr>';
5186                    }
5187                    tablaInterna += renglones;                    
5188                    // ReemplazaTabla(tablaInterna, parametros);
5189                    
5190                } else {
5191
5192                    $.each(arrayPeriodos, function (key, val) {
5193                        if (val.Value.indexOf("/") > -1) {
5194                            var periodoCortado = val.Value.split("/")[0];
5195                            var subPeriodo = val.Value.split("/")[1];
5196                            if (listaAnios.indexOf(periodoCortado) == -1) {
5197                                listaAnios.push(periodoCortado);
5198                            }
5199                            if (subPeriodo != undefined) {
5200                                if (listaSubperiodos.indexOf(parseInt(subPeriodo)) == -1) {
5201                                    listaSubperiodos.push(parseInt(subPeriodo));
5202                                }
5203                            }
5204                        }
5205                    });
5206                    
5207                    var columnasOcultas = 0
5208                    if (parametros.cantidadPeriodos != "0") {
5209                        columnasOcultas = arrayPeriodos.length - parseInt(parametros.cantidadPeriodos);
5210                        if (columnasOcultas < 0)
5211                        columnasOcultas = 0;
5212                    }
5213                    
5214                    var cantidadPorGrupo = Math.max.apply(null, listaSubperiodos);
5215                    if (cantidadPorGrupo == undefined)
5216                    cantidadPorGrupo = 1;
5217                    var tcPrincipal = (parametros.tituloColumnaPrincipal == "") ? "Denominaci&oacute;n" : parametros.tituloColumnaPrincipal;
5218                    var periodosVisibles = [];
5219                    for (var i = 0; i < arrayPeriodos.length; i++) {
5220                        if (i >= columnasOcultas) {
5221                            periodosVisibles.push(arrayPeriodos[i].Value);
5222                        }
5223                    }
5224                    // console.log(periodosVisibles);
5225                    var listaPeriodosObj = ObtienePeriodosVisbles(listaAnios, periodosVisibles);
5226                    //SNM 08.08.2017 cambio de variable parametros.contenedorCuadro por parametros para dividir cabecera compuesta
5227                    //cabeceras = DibujaCabeceraTipo7(tcPrincipal, cantidadPorGrupo, listaAnios, parametros.contenedorCuadro, listaPeriodosObj);
5228                    cabeceras = DibujaCabeceraTipo7(tcPrincipal, cantidadPorGrupo, listaAnios, parametros, listaPeriodosObj);
5229                    // console.log(cabeceras);
5230                    var indiceColumna = 0;
5231                    //console.log(arrayPeriodos)
5232                    $.each(arrayPeriodos, function (key, val) {
5233                        var estiloOculto = "";
5234                        if (indiceColumna < columnasOcultas) {
5235                            estiloOculto = 'style="display:none;"';
5236                        }
5237                        var valorColumna = PintaTitulosColumnas(parametros.titulosColumnas, val.Value, indiceColumna++);
5238                        if (val.Value.indexOf("/") !== -1) {
5239                            valorColumna = oMESES.getFormatoPeriodo(val.Value, frecuencia, parametros.idioma, 2);
5240                        }
5241                        // se añadio data-p4140eriodo con el periodo sin formato para poder buscarlo en la cabecera y compararlo con los datos de cifras estatus
5242                        cabeceras += '<th class ="Th" id="tdAnio' + parametros.contenedorCuadro + valorColumna + '" bgcolor="#DDD" ' + estiloOculto + ' data-periodo="' + val.Value + '">' + valorColumna + '</th>';
5243                    });
5244                    
5245                    var contadorcolumnas = 0;
5246                    var indexValue = 0;
5247                    cabeceras += "<tr>";
5248                    
5249                    cabeceras += "</tr>";
5250                    
5251                    //   tablaInterna += cabeceras;
5252                    
5253                    var transalateText = "";
5254                    if (parametros.textoOriginal == "true")
5255                    transalateText = " notranslate "
5256                    var renglones = "";
5257                    var valores = data.value;
5258                    var bgColor = "white";
5259                    var listaRenglones = [];
5260                    for (var i = 0; i < arrayIndicadores.length; i++) {
5261                        valDescripcionRenglon = arrayIndicadores[i].Value;
5262                        //   bgColor = ColorRenglon(i);
5263                        var itemRenglon = {};
5264                        itemRenglon["indicador"] = arrayIndicadores[i].Key.replace("I_", "");
5265                        itemRenglon["descripcion"] = valDescripcionRenglon;
5266                        itemRenglon["texto"] = '<th  class="TdInicio' + transalateText + '"  >' + valDescripcionRenglon + '</th>';
5267                        
5268                        var estiloOculto = '';
5269                        for (var p = 0; p < arrayPeriodos.length; p++) {
5270                            estiloOculto = "";
5271                            if (p < columnasOcultas)
5272                            estiloOculto = 'style="display:none;"';
5273                            indexValue = p + saltoPeriodos * i;
5274                            if (indexValue < valores.length) {
5275                                itemRenglon["texto"] += '<td  class="Td"   ' + estiloOculto + '>
5275' + valores[indexValue] + ' </td>';
5276                                //   renglones += '<td  class="Td"  >' + valores[indexValue]+ ' </td>';
5277                            }
5278                        }
5279                        listaRenglones.push(itemRenglon);
5280                        renglones += "</tr>";
5281                    }
5282                    
5283                    var indiceColor = 0;
5284                    $.each(parametros.indicadorValorCompuesto.grupos, function (key, valGroup) {
5285                        
5286                        tablaInterna += "<tr>";
5287                        var obj2 = listaRenglones.filter(function (obj) {
5288                            return obj.indicador === valGroup.indicadores[0];
5289                        })[0];
5290                        if (obj2 != undefined) {
5291                            tablaInterna += FormatoRenglonTipo7(obj2.texto, valGroup.pintaBold, valGroup.identacion, obj2.descripcion, valGroup.titulo, indiceColor); // obj2.texto.replace(/class="Td"/g, 'class="TdB"').replace(obj2.descripcion,valGroup.);
5292                        }
5293                        else {
5294                            var textoBlanco = "";
5295                            var itemRenglonBlanco = {};
5296                            itemRenglonBlanco["indicador"] = "";
5297                            var tituloGrupo = (valGroup.titulo == "_") ? "&nbsp;" : valGroup.titulo;
5298                            itemRenglonBlanco["descripcion"] = tituloGrupo;
5299                            
5300                            
5301                            itemRenglonBlanco["texto"] = '<th  class="TdInicio"  >' + tituloGrupo + '</th>';
5302                            
5303                            for (var p = 0; p < arrayPeriodos.length; p++) {
5304                                itemRenglonBlanco["texto"] += '<td  class="Td"  >&nbsp;</td>';
5305                            }
5306                            
5307                            tablaInterna += FormatoRenglonTipo7(itemRenglonBlanco.texto, valGroup.pintaBold, valGroup.identacion, itemRenglonBlanco.descripcion, tituloGrupo, indiceColor);
5308                        }
5309                        
5310                        indiceColor++;
5311                        tablaInterna += "</tr>";
5312                    });
5313                }
5314            } else {
5315                $.each(arrayPeriodos, function (key, val) {
5316                    if (val.Value.indexOf("/") > -1) {
5317                        var periodoCortado = val.Value.split("/")[0];
5318                        var subPeriodo = val.Value.split("/")[1];
5319                        if (listaAnios.indexOf(periodoCortado) == -1) {
5320                            listaAnios.push(periodoCortado);
5321                        }
5322                        if (subPeriodo != undefined) {
5323                            if (listaSubperiodos.indexOf(parseInt(subPeriodo)) == -1) {
5324                                listaSubperiodos.push(parseInt(subPeriodo));
5325                            }
5326                        }
5327                    }
5328                });
5329                
5330                
5331                //dibujado y calculo de columans
5332                var cantidadPorGrupo = Math.max.apply(null, listaSubperiodos);
5333                if (cantidadPorGrupo == undefined)
5334                cantidadPorGrupo = 1;
5335                var tcPrincipal = (parametros.tituloColumnaPrincipal == "") ? "Denominaci&oacute;n" : parametros.tituloColumnaPrincipal;
5336                var periodosVisibles = [];
5337                for (var i = 0; i < arrayPeriodos.length; i++) {
5338                    if (i >= columnasOcultas) {
5339                        periodosVisibles.push(arrayPeriodos[i].Value);
5340                    }
5341                }
5342                
5343                var listaPeriodosObj = ObtienePeriodosVisbles(listaAnios, periodosVisibles);
5344                cabeceras = DibujaCabeceraTipo7(tcPrincipal, cantidadPorGrupo, 1, parametros, listaPeriodosObj);
5345                var indiceColumna = 0;
5346                
5347                $.each(arrayPeriodos, function (key, val) {
5348                    var estiloOculto = "";
5349                    if (indiceColumna < columnasOcultas) {
5350                        estiloOculto = 'style="display:none;"';
5351                    }
5352                    var valorColumna = PintaTitulosColumnas(parametros.titulosColumnas, val.Value, indiceColumna++);
5353                    if (val.Value.indexOf("/") !== -1) {
5354                        valorColumna = oMESES.getFormatoPeriodo(val.Value, frecuencia, parametros.idioma, 2);
5355                    }
5356                    // se añadio data-p4140eriodo con el periodo sin formato para poder buscarlo en la cabecera y compararlo con los datos de cifras estatus
5357                    cabeceras += '<th class ="Th" id="tdAnio' + parametros.contenedorCuadro + valorColumna + '" bgcolor="#DDD" ' + estiloOculto + ' data-periodo="' + val.Value + '">' + valorColumna + '</th>';
5358                });
5359                
5360                var contadorcolumnas = 0;
5361                var indexValue = 0;
5362                cabeceras += "<tr>";
5363                
5364                cabeceras += "</tr>";
5365                
5366                indiceColor++;
5367                tablaInterna += "</tr>";
5368                var renglones = "";
5369                var valores = data.value;
5370                var bgColor = "white";
5371                var listaRenglones = [];
5372                var indiceColor = 0;
5373                var aIndicadoresIndex = data.dimension.indicator.category.index;
5374                // console.log(parametros)
5375                $.each(parametros.indicadorValorCompuesto.grupos, function (key, valGroup) {
5376                    
5377                    tablaInterna += "<tr>";
5378                    var textoBlanco = "";
5379                    var itemRenglonBlanco = {};
5380                    itemRenglonBlanco["indicador"] = "";
5381                    var tituloGrupo = (valGroup.titulo == "_") ? "&nbsp;" : valGroup.titulo;
5382                    itemRenglonBlanco["descripcion"] = tituloGrupo;
5383                    
5384                    
5385                    itemRenglonBlanco["texto"] = '<th  class="TdInicio"  >' + tituloGrupo + '</th>';
5386                    
5387                    for (var p = 0; p < arrayPeriodos.length; p++) {
5388                        itemRenglonBlanco["texto"] += '<td  class="Td"  >&nbsp;</td>';
5389                    }
5390                    tablaInterna += FormatoRenglonTipo7(itemRenglonBlanco.texto, "true", valGroup.identacion, itemRenglonBlanco.descripcion, tituloGrupo, indiceColor);
5391                    
5392                    tablaInterna += "</tr>";
5393                    //indicadores datos de api
5394                    var aIndicadoresGrupo = valGroup.indicadores;
5395                    for (var x = 0; x < aIndicadoresGrupo.length; x++) {
5396                        tablaInterna += "<tr>";
5397                        var indicador = aIndicadoresGrupo[x]; //indicador que pertenece al grupo de indicadores
5398                        //console.log(indicador);
5399                        var oIndicador = arrayIndicadores.filter(function (ind) {
5400                            return ind.Key === ("I_" + indicador).toString();
5401                        })[0];
5402                        if (oIndicador !== undefined) {
5403                            var posIndicador = aIndicadoresIndex.indexOf(oIndicador.Key);
5404                            // console.log(oIndicador);
5405                            // var nombreIndicador = oIndicador.Value.split(">")[oIndicador.Value.split(">").length - 1].split(".")[oIndicador.Value.split(">")[oIndicador.Value.split(">").length - 1].split(".").length - 2];
5406                            var nombreIndicador = oIndicador.Value.split(">")[oIndicador.Value.split(">").length-1]; // Agregado el 15/dic/2020
5407                            var itemRenglonBlanco = {};
5408                            itemRenglonBlanco["descripcion"] = nombreIndicador;
5409                            itemRenglonBlanco["texto"] = '<th  class="TdInicio"  >' + "&nbsp;&nbsp;&nbsp;" + nombreIndicador + '</th>';
5410                            itemRenglonBlanco['texto'] += '<td  class="Td">' + valores[posIndicador] + ' </td>';
5411                            tablaInterna += FormatoRenglonTipo7(itemRenglonBlanco.texto, "", "", itemRenglonBlanco.descripcion, nombreIndicador, indiceColor);
5412                            
5413                        }
5414                        indiceColor++;
5415                        tablaInterna += "</tr>";
5416                    }
5417                });
5418                
5419            }
5420            ReemplazaTablaConEncabezado(tablaInterna, cabeceras, parametros);
5421            AjustaColspanCabeceraTipo7(listaAnios, periodosVisibles, parametros.contenedorCuadro);
5422            //FijaEncabezadoTabla(parametros);
5423            
5424        }
5425        
5426        /// <summary>   Dibuja cuadro tipo derivado del 7 (14) con ultimo periodo + columna anual varios indicadores por varios periodos por un area geografica
5427        ///              maneja grupos de indicadores por descripcion y sus datos por periodo, cada renglon puede llevar negrita o identacion. </summary>
5428        ///
5429        /// <remarks>   @ROVALX, 05/03/2018. </remarks>
5430        ///
5431        /// <param name="data">         Valores de indicador en JSON. </param>
5432        /// <param name="parametros">   Objeto de parametros en JSON. </param>
5433        ///
5434        /// <returns>   . </returns>
5435        function DibujaCuadroTipo14(data, parametros) {
5436            //console.log(parametros);
5437            //console.log(data);
5438            //var aMeses = ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'];
5439            document.getElementById(parametros.contenedorCuadro).style.width = "100%";
5440            document.getElementById("divDatos" + parametros.contenedorCuadro).style["overflow-x"] = "auto";
5441            var tablaInterna = "";
5442            var cabeceras = "";
5443            var arrayPeriodos = data.dimension.periods.category.label;
5444            //var arrayIndicadores = data.dimension.indicator.category.label;
5445            var arrayIndicadores = parametros.indicadorDepurado.split(",");
5446            var saltoPeriodos = arrayPeriodos.length * 2;
5447            var listaAnios = [];
5448            var listaSubperiodos = [];
5449            var datosAnuales = data.indicadoresAnuales;
5450            var indicadoresPorGrupo = parametros.indicadorValorCompuesto.maximaCantidadPorGrupo; // total indicadores x grupo
5451            // ordenamiento: 2017-1....2017-12...2017...2016-1....2016-12...2016
5452            
5453            //arrayPeriodos.sort(function compare(n1, n2) {
5454            //    var per1 = n1.Value.indexOf("/") > -1 ? parseInt(n1.Value.split("/")[1]) : 13;
5455            //    var per2 = n2.Value.indexOf("/") > -1 ? parseInt(n2.Value.split("/")[1]) : 13;
5456            //    var anio1 = n1.Value.indexOf("/") > -1 ? parseInt(n1.Value.split("/")[0]) : parseInt(n1.Value);
5457            //    var anio2 = n2.Value.indexOf("/") > -1 ? parseInt(n2.Value.split("/")[0]) : parseInt(n2.Value);
5458            //    if (anio1 > anio2) {
5459            //        return -1;
5460            //    } else if (anio1 < anio2) {
5461            
5462            //        return 1;
5463            //    } else {
5464            //        if (per1 < per2)
5465            //            return -1;
5466            //        if (per1 > per2)
5467            //            return 1;
5468            //        else
5469            //            return -1;
5470            //    }
5471            //});      
5472            if (indicadoresPorGrupo === 4) {
5473                arrayPeriodos = arrayPeriodos.concat(arrayPeriodos);
5474                var nKey = 1;
5475                var nArrayPeriodos = [];
5476                $.each(arrayPeriodos, function (index, periodo) {
5477                    if (index > 12) {
5478                        var anual = periodo.Value.split("/");
5479                        if (parseInt(anual[1]) === 13) {
5480                            arrayPeriodos[index].Value = periodo.Value.replace("/13", "");
5481                            arrayPeriodos[index].Periodo = periodo.Value.replace("/13", "");
5482                        }
5483                        if (periodo.Value.indexOf("/") !== -1) {
5484                            Value = (parseInt(periodo.Value.split("/")[0]) + 1) + "/" + periodo.Value.split("/")[1];
5485                        } else {
5486                            var Value = (parseInt(periodo.Value) + 1).toString();
5487                        }
5488                        var per = { Key: "P" + nKey, Periodo: periodo.Value, Value: Value };
5489                        nArrayPeriodos.push(per);
5490                        
5491                    } else {
5492                        periodo.Periodo = periodo.Value;
5493                        nArrayPeriodos.push(periodo);
5494                    }
5495                    nKey++;
5496                });
5497                arrayPeriodos = nArrayPeriodos;
5498            }
5499            $.each(arrayPeriodos, function (key, val) {
5500                //if (val.Value.indexOf("/") > -1) {
5501                var anual = parseInt(val.Value.split("/")[1]);
5502                //if (anual === 13) {
5503                //    arrayPeriodos[key]['Texto'] = "Anual";
5504                //} else {
5505                //asigna nombre a mostrar en cabecera para mensuales
5506                var periodoCortado = val.Value.split("/")[0];
5507                var subPeriodo = val.Value.split("/")[1];
5508                //arrayPeriodos[key]['Texto'] = aMeses[parseInt(subPeriodo)]; 
5509                arrayPeriodos[key]['Texto'] = (subPeriodo !== undefined && subPeriodo !== "13") ? oMESES.getMesNombreCorto(parseInt(subPeriodo), parametros.idioma) : parseInt(subPeriodo);
5510                
5511                if (listaAnios.indexOf(periodoCortado) == -1) {
5512                    listaAnios.push(periodoCortado);
5513                }
5514                if (subPeriodo != undefined) {
5515                    if (listaSubperiodos.indexOf(parseInt(subPeriodo)) == -1) {
5516                        listaSubperiodos.push(parseInt(subPeriodo));
5517                    }
5518                }
5519                // }
5520                //} else {
5521                //    //asigna nombre a mostrar en cabecera para anuales                
5522                //    arrayPeriodos[key]['Texto'] = "AnualX";
5523                //}
5524            });
5525            
5526            var columnasOcultas = 0
5527            if (parametros.cantidadPeriodos != "0") {
5528                columnasOcultas = arrayPeriodos.length - parseInt(parametros.cantidadPeriodos);
5529                if (columnasOcultas < 0)
5530                columnasOcultas = 0;
5531            }
5532            var cantidadPorGrupo = Math.max.apply(null, listaSubperiodos);
5533            if (cantidadPorGrupo == undefined)
5534            cantidadPorGrupo = 1;
5535            var tcPrincipal = (parametros.tituloColumnaPrincipal == "") ? "Denominaci&oacute;n" : parametros.tituloColumnaPrincipal;
5536            var periodosVisibles = [];
5537            for (var i = 0; i < arrayPeriodos.length; i++) {
5538                if (i >= columnasOcultas) {
5539                    periodosVisibles.push(arrayPeriodos[i].Value);
5540                }
5541            }
5542            var listaPeriodosObj = ObtienePeriodosVisbles(listaAnios, periodosVisibles);
5543            //cabecera principal de AÑOS no de meses-años
5544            cabeceras = DibujaCabeceraTipo7(tcPrincipal, cantidadPorGrupo, listaAnios, parametros, listaPeriodosObj);
5545            
5546            var indiceColumna = 0;
5547            //crea cabeceras de meses-años
5548            cabeceras += "<tr>";
5549            $.each(arrayPeriodos, function (key, val) {
5550                var estiloOculto = "";
5551                if (indiceColumna < columnasOcultas) {
5552                    estiloOculto = 'style="display:none;"';
5553                }
5554                var valorColumna = val.Value;//PintaTitulosColumnas(parametros.titulosColumnas, val.Value, indiceColumna++);
5555                var textoColumna = "";
5556                if (valorColumna.indexOf("/") !== -1) {
5557                    //textoColumna = aMeses[parseInt(valorColumna.split("/")[1]) - 1];                
5558                    var per = valorColumna.split("/")[1];
5559                    textoColumna = (per !== undefined && per !== "13") ? oMESES.getMesNombreCorto(parseInt(per), parametros.idioma) : "Anual_" + per;
5560                    cabeceras += '<th class="Th" id="tdAnio' + parametros.contenedorCuadro + valorColumna + '" bgcolor="#DDD" ' + estiloOculto + ' >' + textoColumna + '</th>';
5561                    
5562                } else {
5563                    textoColumna = "Anual";
5564                    cabeceras += '<th class="Th" id="tdAnio' + parametros.contenedorCuadro + valorColumna + '" bgcolor="#DDD" ' + estiloOculto + ' >' + textoColumna + "_" + (parseInt(key) + 1) + '</th>';
5565                }
5566                
5567            });
5568            
5569            var contadorcolumnas = 0;
5570            var indexValue = 0;
5571            cabeceras += "<tr>";
5572            // traduccion
5573            var transalateText = "";
5574            if (parametros.textoOriginal == "true")
5575            transalateText = " notranslate "
5576            var renglones = "";
5577            var valores = data.value;
5578            var bgColor = "white";
5579            var listaRenglones = [];
5580            var aPeriodosData = data.dimension.periods.category;
5581            
5582            for (var i = 0; i < arrayIndicadores.length; i++) {
5583                valDescripcionRenglon = "Titulox";//arrayIndicadores[i].Value;            
5584                var indicadorAnual = arrayIndicadores[i];//arrayIndicadores[i].Key;
5585                var itemRenglon = {};
5586                itemRenglon["indicador"] = arrayIndicadores[i];//arrayIndicadores[i].Key.replace("I_", "");
5587                itemRenglon["descripcion"] = valDescripcionRenglon;
5588                itemRenglon["texto"] = '<th class="TdInicio' + transalateText + '"  >' + valDescripcionRenglon + '</th>';
5589                var estiloOculto = '';
5590                var aValores = [];
5591                //recorre periodos
5592                var inc = 0;
5593                //for (var p = arrayPeriodos.length - 1; p >= 0; p--) {              
5594                for (var p = 0; p < arrayPeriodos.length; p++) {
5595                    var oPeriodoPos = parseInt(arrayPeriodos[p].Key.replace("P", "")) - 1;
5596                    indexValue = oPeriodoPos + saltoPeriodos * i;
5597                    aValores.push({ valor: valores[indexValue], periodo: arrayPeriodos[p].Value });
5598                    inc++;
5599                }
5600                itemRenglon["valores"] = aValores;
5601                listaRenglones.push(itemRenglon);           // console.log(itemRenglon);
5602                // renglones += "</tr>";
5603            }
5604            //Permite cambiar la cabecera para los anuales colocando el formato MesInicial-UltimoMesConDato
5605            var aValores = data.value;
5606            var posMesDato = 12; //posicion ultimo dato por variacion
5607            for (var i = 0; i < 12; i++) {
5608                if (aValores[i] === "") {
5609                    posMesDato = i - 1;
5610                    break;
5611                }
5612            }
5613            //var mesConUltimoDato = aMeses[parseInt(listaRenglones[0].valores[posMesDato].periodo.split("/")[1] - 1)];  
5614            var mesConUltimoDato = oMESES.getMesNombreCorto(listaRenglones[0].valores[posMesDato].periodo.split("/")[1], parametros.idioma);
5615            //console.log("mesConUltimoDato);
5616            //console.log(mesConUltimoDato);
5617            //        var cabecerasFormatoAnual = cabeceras.replace(/Anual_13|Anual_26/gi, oMESES.getMesNombreCorto(1, parametros.idioma) + "-" + (mesConUltimoDato === "Ene" ? "Dic" : mesConUltimoDato));
5618            var cabecerasFormatoAnual = cabeceras.replace(/Anual_13|Anual_26/gi, oMESES.getMesNombreCorto(1, parametros.idioma) + "-" + (posMesDato === 12 ? "Dic" : mesConUltimoDato));
5619            cabeceras = cabecerasFormatoAnual;
5620            
5621            // > renglones + columnas + valores
5622            var indiceColor = 0;
5623            $.each(parametros.indicadorValorCompuesto.grupos, function (key, valGroup) {
5624                var indiceColor = 0;
5625                var mergeData = {};
5626                mergeData = listaRenglones[key];
5627                for (var m = 0; m < mergeData.valores.length; m++) {
5628                    mergeData.texto += '<td  class="Td" >' + mergeData.valores[m].valor + ' </td>';
5629                }
5630                tablaInterna += "<tr>";
5631                tablaInterna += FormatoRenglonTipo7(mergeData.texto, valGroup.pintaBold, valGroup.identacion, mergeData.descripcion, valGroup.titulo, indiceColor); // obj2.texto.replace(/class="Td"/g, 'class="TdB"').replace(obj2.descripcion,valGroup.);                    
5632                indiceColor++;
5633                tablaInterna += "</tr>";
5634                
5635            });
5636            
5637            ReemplazaTablaConEncabezado(tablaInterna, cabeceras, parametros);
5638            AjustaColspanCabeceraTipo7(listaAnios, periodosVisibles, parametros.contenedorCuadro);
5639            FijaEncabezadoTabla(parametros);
5640        }
5641        
5642        /// <summary>   Dibuja cuadro tipo 8. Un indicador por un area geografica por varios periodos </summary>
5643        ///
5644        /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
5645        ///
5646        /// <param name="data">         Valores de indicador en JSON. </param>
5647        /// <param name="parametros">   Objeto de parametros en JSON. </param>
5648        ///
5649        /// <returns>   . </returns>
5650        function DibujaCuadroTipo8(data, parametros) {
5651            //var aMeses = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', '
5651Septiembre', 'Octubre', 'Noviembre', 'Diciembre'];
5652            //if (parametros.idioma === "en") aMeses = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'Octuber', 'November', 'December'];        
5653            if (data.ErrorCode == undefined) {
5654                //"keywords"
5655                //"tableSortPeriodos"
5656                //console.log("CUADRO 8")            
5657                var oCobertura = oCriteriosCobertura.check(data);
5658                var bgColorCobertura = "";
5659                var aCifras = data.CIFRAS_ESTATUS;
5660                var arrayPeriodos = data.dimension.periods.category.label;
5661                var valores = data.value;
5662                var tabla = '';
5663                var titleCol1 = (parametros.idioma == "es") ? "Periodo" : "Period";              
5664                var titleCol2 = (parametros.idioma == "es") ? "Valor" : "Value";
5665                var frecuencia = data.dimension.freq.category.label[0].Value; // frecuencia para determinar si llega en trimestral, mensual o anual
5666                
5667                if (parametros.tituloColumnaPrincipal != "") titleCol1 = parametros.tituloColumnaPrincipal;
5668                if (parametros.titulosColumnas != "") titleCol2 = parametros.titulosColumnas;
5669                
5670                tabla += '<tr><th  class ="Th" bgcolor="#DDD">' + titleCol1 + '</th><th  class ="Th" bgcolor="#DDD" id="tdValorUnidad_' + parametros.contenedorCuadro + '">' + titleCol2 + '&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>';
5671                //  tabla += '<tbody>';
5672                if (parametros.orden !== null && parametros.orden === "n") { // ordenamiento alfanumerico   
5673                    var letraTmp = "";
5674                    for (var i = arrayPeriodos.length - 1; i >= 0; i--) {
5675                        var bgColor = "white";
5676                        if (i % 2 == 0) {
5677                            bgColor = "#EFEFEF";
5678                        }
5679                        if (parametros.mostrarCifraEstatus === "true") {
5680                            var perCifra = arrayPeriodos[i].Value;
5681                            //var cifraEstatusPeriodo = aCifras.filter(function (cifra) {
5682                            //    return cifra.periodos.indexOf(perCifra) !== -1;
5683                            //});   
5684                            //if (cifraEstatusPeriodo.length > 0) {
5685                            //    arrayPeriodos[i].Value = arrayPeriodos[i].Value + "<sup>" + cifraEstatusPeriodo[0].letra.replace("/", "") + "</sup>";
5686                            //}                        
5687                           /*  for (var y = 0; y < aCifras.length; y++) {
5688                                if (aCifras[y].periodo_corto === perCifra) {
5689                                    letraTmp = '<sup style="display:inline-block;font-size:9px;">' + aCifras[y].letra.replace("/", "") + "</sup>";
5690                                    if (listaCifras[y].letra === "D") {
5691                                        letraTmp = "";
5692                                    }
5693                                }
5694                            } */
5695                            for (var y = 0; y < aCifras.length; y++) {
5696                                // agregado 01-09-2023 | Para que coloca solo en el periodo que sea igual
5697                                if(frecuencia.toLowerCase() === "mensual"){ 
5698                                    if (aCifras[y].periodo_corto === periodo) {
5699                                        // console.log(">> "+aCifras[y].periodo_corto, periodo);
5700                                        
5701                                        letraTmp = '<sup style="display:inline-block;font-size:9px;">' + aCifras[y].letra.replace("/", "") + "</sup>";
5702                                        if (aCifras[y].letra === "D") {
5703                                            letraTmp = "";
5704                                        }
5705                                    }
5706                                } else {
5707                                    if (aCifras[y].periodo_corto === periodo) {
5708                                    
5709                                        letraTmp = '<sup style="display:inline-block;font-size:9px;">' + aCifras[y].letra.replace("/", "") + "</sup>";
5710                                        if (aCifras[y].letra === "D") {
5711                                            letraTmp = "";
5712                                        }
5713                                    }
5714                                }
5715                            }
5716                            arrayPeriodos[i].Value = arrayPeriodos[i].Value + "<sup>" + letraTmp + "</sup>";
5717                            // si encontro cifras estatus para el indicador
5718                            
5719                        }
5720                        
5721                        tabla += '<tr><td class="TdInicioV"   >' + arrayPeriodos[i].Value + '</td><td  class="TdV"   >' + valores[i] + '</td></tr>';
5722                    }
5723                } else { // sin el parametro de orden (null)
5724
5725                    var letraTmp = "";
5726                    for (var i = 0; i < arrayPeriodos.length; i++) {
5727                        var bgColor = "white";
5728                        if (i % 2 == 0) {
5729                            bgColor = "#EFEFEF";
5730                        }
5731                        var periodo = arrayPeriodos[i].Value;
5732                        //if (parametros.mostrarCifraEstatus === "true") {                        
5733                        //    var perCifra = arrayPeriodos[i].Value;
5734                        //    var cifraEstatusPeriodo = aCifras.filter(function (cifra) {
5735                        //        return cifra.periodos.indexOf(perCifra) > -1;
5736                        //    });
5737                        //    // si encontro cifras estatus para el indicador                        
5738                        //    if (cifraEstatusPeriodo.length > 0) {
5739                        //        //console.log(periodo)
5740                        //        arrayPeriodos[i].Value = periodo + "<sup>" + cifraEstatusPeriodo[0].letra.replace("/", "") + "</sup>";
5741                        //    }
5742                        //} 
5743                        if (parametros.mostrarCifraEstatus === "true") {
5744                            // for (var y = 0; y < aCifras.length; y++) {
5745                            //     if (aCifras[y].periodo_corto === periodo) {
5746                                    
5747                            //         letraTmp = '<sup style="display:inline-block;font-size:9px;">' + aCifras[y].letra.replace("/", "") + "</sup>";
5748                            //         if (aCifras[y].letra === "D") {
5749                            //             letraTmp = "";
5750                            //         }
5751                            //     }
5752                            // }
5753                            letraTmp = "";
5754                            for (var y = 0; y < aCifras.length; y++) {
5755                                // agregado 01-09-2023 | Para que coloca solo en el periodo que sea igual
5756                                if(frecuencia.toLowerCase() === "mensual"){ 
5757                                    if (aCifras[y].periodo_corto === periodo) {
5758                                        // console.log(">> "+aCifras[y].periodo_corto, periodo);
5759                                        
5760                                        letraTmp = '<sup style="display:inline-block;font-size:9px;">' + aCifras[y].letra.replace("/", "") + "</sup>";
5761                                        if (aCifras[y].letra === "D") {
5762                                            letraTmp = "";
5763                                        }
5764                                    }
5765                                } else {
5766                                    if (aCifras[y].periodo_corto === periodo) {
5767                                    
5768                                        letraTmp = '<sup style="display:inline-block;font-size:9px;">' + aCifras[y].letra.replace("/", "") + "</sup>";
5769                                        if (aCifras[y].letra === "D") {
5770                                            letraTmp = "";
5771                                        }
5772                                    }
5773                                }
5774                            }
5775                            
5776                        }    
5777                        // Si tiene cobertura aplica el color correspondiente segun el valor y criterio                    
5778                        if(oCobertura != null){
5779                            var hexColor = oCriteriosCobertura.getColor(valores[i], oCobertura);
5780                            if(hexColor != ""){
5781                                bgColorCobertura = "background-color:"+hexColor;
5782                            }
5783                        }
5784                        // console.log("debug: FRECUENCIA QUINCENAL")
5785                        // console.log(arrayPeriodos[i].Value, frecuencia)
5786                        periodo = oMESES.getFormatoPeriodo(arrayPeriodos[i].Value, frecuencia, parametros.idioma, 1);
5787                        tabla += '<tr><td class="TdInicioV"   >' + periodo + " " + letraTmp + '</td><td  class="TdV" style="'+bgColorCobertura+'"  >' + valores[i] + '</td></tr>';
5788                    }
5789                }
5790                ReemplazaTabla(tabla, parametros);
5791            }
5792        }
5793        
5794        /**
5795        *  Cuadro 8 - SDMX con parametro activo d3 = D3Enabled = true
5796        * @param {any} data
5797        * @param {any} parametros
5798        */
5799        function DibujaCuadroTipo8SDMX(data, parametros) {
5800            //creacion y definicion de las variables de los datos de sdmx
5801            var series = data.dataSets[0].series;
5802            var propiedadesSeries = Object.keys(series);
5803            var aValores = [], aPeriodos = [];
5804            var indicadorNombre = data.structure.dimensions.series[0].values[0].name;
5805            var indicador = data.structure.dimensions.series[0].values[0].id;
5806            var periodos = data.structure.dimensions.observation[0].values;
5807            
5808            // armado de estructura de datos para el cuadro
5809            for (var x = 0; x < propiedadesSeries.length; x++) {
5810                var o = series[propiedadesSeries[x]].observations;
5811                var propiedadesValores = Object.keys(o);
5812                
5813                for (var c = 0; c < propiedadesValores.length; c++) {
5814                    var values = o[propiedadesValores[c]];
5815                    aValores.push(values[0]);
5816                }
5817            }
5818            // periodos 
5819            for (var l = 0; l < periodos.length; l++) {
5820                aPeriodos.push(periodos[l].name);
5821            }
5822            
5823            //creacion de la estructura de la tabla HEADER
5824            var TABLA = "";
5825            var HEAD = document.createElement("thead");
5826            var BODY = document.createElement("tbody");
5827            
5828            //columnas
5829            var aColumnas = ["Periodo", "Porcentaje"];
5830            var tr = document.createElement("tr");
5831            for (var x = 0; x < aColumnas.length; x++) {
5832                var th = document.createElement("th");
5833                th.innerHTML = aColumnas[x];
5834                th.className = "Th";
5835                tr.appendChild(th);
5836            }
5837            HEAD.appendChild(tr);
5838            
5839            //datos renglones
5840            for (var x = 0; x < aValores.length; x++) {
5841                var tr = document.createElement("tr")
5842                var td = document.createElement("td");
5843                var valor = formatoDecimalesResultado(aValores[x], 1);
5844                td.innerHTML = aPeriodos[x];
5845                tr.appendChild(td);
5846                var td = document.createElement("td");
5847                td.innerHTML = valor;
5848                tr.appendChild(td);
5849                BODY.appendChild(tr)
5850            }
5851            TABLA = HEAD.innerHTML + BODY.innerHTML;
5852            ReemplazaTabla(TABLA, parametros);
5853            
5854            //console.log(data);
5855            //return;
5856            //var aCifras = data.CIFRAS_ESTATUS;
5857            //var arrayPeriodos = data.dimension.periods.category.label;
5858            //var valores = data.value;
5859            //var tabla = '';
5860            //var titleCol1 = (parametros.idioma == "es") ? "Periodo" : "Period";
5861            //var titleCol2 = (parametros.idioma == "es") ? "Valor" : "Value";
5862            //var frecuencia = data.dimension.freq.category.label[0].Value; // frecuencia para determinar si llega en trimestral, mensual o anual
5863            
5864            //if (parametros.tituloColumnaPrincipal != "")
5865            //    titleCol1 = parametros.tituloColumnaPrincipal;
5866            //if (parametros.titulosColumnas != "")
5867            //    titleCol2 = parametros.titulosColumnas;
5868            //tabla += '<tr><th  class ="Th" bgcolor="#DDD">' + titleCol1 + '</th><th  class ="Th" bgcolor="#DDD" id="tdValorUnidad_' + parametros.contenedorCuadro + '">' + titleCol2 + '&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>';
5869            ////  tabla += '<tbody>';
5870            //if (parametros.orden !== null && parametros.orden === "n") { // ordenamiento alfanumerico   
5871            //    var letraTmp = "";
5872            //    for (var i = arrayPeriodos.length - 1; i >= 0; i--) {
5873            //        var bgColor = "white";
5874            //        if (i % 2 == 0) {
5875            //            bgColor = "#EFEFEF";
5876            //        }
5877            //        if (parametros.mostrarCifraEstatus === "true") {
5878            //            var perCifra = arrayPeriodos[i].Value;
5879            //            //var cifraEstatusPeriodo = aCifras.filter(function (cifra) {
5880            //            //    return cifra.periodos.indexOf(perCifra) !== -1;
5881            //            //});   
5882            //            //if (cifraEstatusPeriodo.length > 0) {
5883            //            //    arrayPeriodos[i].Value = arrayPeriodos[i].Value + "<sup>" + cifraEstatusPeriodo[0].letra.replace("/", "") + "</sup>";
5884            //            //}                        
5885            //            for (var y = 0; y < aCifras.length; y++) {
5886            //                if (aCifras[y].periodo_corto === perCifra) {
5887            //                    letraTmp = '<sup style="display:inline-block;font-size:9px;">' + aCifras[y].letra.replace("/", "") + "</sup>";
5888            //                    if (listaCifras[y].letra === "D") {
5889            //                        letraTmp = "";
5890            //                    }
5891            //                }
5892            //            }
5893            //            arrayPeriodos[i].Value = arrayPeriodos[i].Value + "<sup>" + letraTmp + "</sup>";
5894            //            // si encontro cifras estatus para el indicador
5895            
5896            //        }
5897            
5898            //        tabla += '<tr><td class="TdInicioV"   >' + arrayPeriodos[i].Value + '</td><td  class="TdV"   >' + valores[i] + '</td></tr>';
5899            //    }
5900            //} else { // sin el parametro de orden (null)
5901            //    var letraTmp = "";
5902            //    for (var i = 0; i < arrayPeriodos.length; i++) {
5903            //        var bgColor = "white";
5904            //        if (i % 2 == 0) {
5905            //            bgColor = "#EFEFEF";
5906            //        }
5907            //        var periodo = arrayPeriodos[i].Value;
5908            //        //if (parametros.mostrarCifraEstatus === "true") {                        
5909            //        //    var perCifra = arrayPeriodos[i].Value;
5910            //        //    var cifraEstatusPeriodo = aCifras.filter(function (cifra) {
5911            //        //        return cifra.periodos.indexOf(perCifra) > -1;
5912            //        //    });
5913            //        //    // si encontro cifras estatus para el indicador                        
5914            //        //    if (cifraEstatusPeriodo.length > 0) {
5915            //        //        //console.log(periodo)
5916            //        //        arrayPeriodos[i].Value = periodo + "<sup>" + cifraEstatusPeriodo[0].letra.replace("/", "") + "</sup>";
5917            //        //    }
5918            //        //} 
5919            //        if (parametros.mostrarCifraEstatus === "true") {
5920            //            for (var y = 0; y < aCifras.length; y++) {
5921            //                if (aCifras[y].periodo_corto === periodo) {
5922            
5923            //                    letraTmp = '<sup style="display:inline-block;font-size:9px;">' + aCifras[y].letra.replace("/", "") + "</sup>";
5924            //                    if (aCifras[y].letra === "D") {
5925            //                        letraTmp = "";
5926            //                    }
5927            //                }
5928            //            }
5929            //        }
5930            //        periodo = oMESES.getFormatoPeriodo(arrayPeriodos[i].Value, frecuencia, parametros.idioma, 1);
5931            //        tabla += '<tr><td class="TdInicioV"   >' + periodo + " " + letraTmp + '</td><td  class="TdV"   >' + valores[i] + '</td></tr>';
5932            //    }
5933            //}
5934            //ReemplazaTabla(tabla, parametros);        
5935            
5936        }
5937        
5938        /// <summary>   Dibuja cuadro tipo 9. </summary>
5939        ///
5940        /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
5941        ///
5942        /// <param name="data">         Valores de indicador en JSON. </param>
5943        /// <param name="parametros">   Objeto de parametros en JSON. </param>
5944        ///
5945        /// <returns>   . </returns>
5946        function DibujaCuadroTipo9(data, parametros) {
5947            if (data.ErrorCode == undefined) {
5948                var arrayPeriodos = data.dimension.periods.category.label;
5949                var arrayAreas = data.dimension.state.category.label;
5950                var arrayDatos = data.value;
5951                // pinta cabecera por periodos (posiblemente cambie)
5952                var listaAnios = [];
5953                var listaSubperiodos = [];
5954                $.each(arrayPeriodos, function (key, val) {
5955                    if (val.Value.indexOf("/") > -1) {
5956                        var periodoCortado = val.Value.split("/")[0];
5957                        var subPeriodo = val.Value.split("/")[1];
5958                        if (listaAnios.indexOf(periodoCortado) == -1) {
5959                            listaAnios.push(periodoCortado);
5960                        }
5961                        if (subPeriodo != undefined) {
5962                            if (listaSubperiodos.indexOf(parseInt(subPeriodo)) == -1) {
5963                                listaSubperiodos.push(parseInt(subPeriodo));
5964                            }
5965                        }
5966                    }
5967                });
5968                var indiceColumna = 0;
5969                var columnasOcultas = 0
5970                if (parametros.cantidadPeriodos != "0") {
5971                    columnasOcultas = arrayPeriodos.length - parseInt(parametros.cantidadPeriodos);
5972                    if (columnasOcultas < 0)
5973                    columnasOcultas = 0;
5974                }
5975                
5976                var cantidadPorGrupo = Math.max.apply(null, listaSubperiodos);
5977                if (cantidadPorGrupo == undefined)
5978                cantidadPorGrupo = 1;
5979                var tcPrincipal = (parametros.tituloColumnaPrincipal == "") ? "Denominaci&oacute;n" : parametros.tituloColumnaPrincipal;
5980                var periodosVisibles = [];
5981                for (var i = 0; i < arrayPeriodos.length; i++) {
5982                    if (i >= columnasOcultas) {
5983                        periodosVisibles.push(arrayPeriodos[i].Value);
5984                    }
5985                }
5986                var listaPeriodosObj = ObtienePeriodosVisbles(listaAnios, periodosVisibles);
5987                cabeceras = DibujaCabeceraTipo9(tcPrincipal, cantidadPorGrupo, listaAnios, parametros.contenedorCuadro, listaPeriodosObj);
5988                
5989                $.each(arrayPeriodos, function (key, val) {
5990                    var estiloOculto = "";
5991                    if (indiceColumna < columnasOcultas) {
5992                        estiloOculto = 'style="display:none;"';
5993                    }
5994                    
5995                    
5996                    var valorColumna = PintaTitulosColumnas(parametros.titulosColumnas, val.Value, indiceColumna++);
5997                    cabeceras += '<th class ="Th" bgcolor="#DDD" ' + estiloOculto + ' >' + valorColumna + '</th>';
5998                });
5999                // fin pinta cabecera periodos
6000                
6001                var tabla = cabeceras;
6002                var iniciaPeriodos = 0;
6003                var periodoAnterior = arrayPeriodos[0].Value.split("/")[0];
6004                for (var i = 0; i < arrayAreas.length; i++) {
6005                    tabla += "<tr>" + "<td>" + arrayAreas[i].Value.split("-")[0] + "</td>";
6006                    iniciaPeriodos = i * 10;
6007                    var sumaTotal = 0;
6008                    
6009                    for (var j = 0; j < arrayPeriodos.length; j++) {
6010                        var periodoRecorriendo = arrayPeriodos[j].Value.split("/")[0];
6011                        if (periodoRecorriendo != periodoAnterior) {
6012                            var cantDecimales = obtieneCantidadDecimales(arrayDatos[0]);
6013                            tabla += "<td>" + formatoDecimalesResultado(sumaTotal, cantDecimales) + " </td>";
6014                            //tabla += "<td>" + sumaTotal + " </td>";
6015                            sumaTotal = parseFloat(0);
6016                            periodoAnterior = periodoRecorriendo;
6017                        }
6018                        
6019                        var valorPintado = arrayDatos[i + j]
6020                        tabla += "<td>" + valorPintado + "</td>"
6021                        
6022                        if (valorPintado != null && valorPintado != undefined && !isNaN(valorPintado))
6023                        sumaTotal += parseFloat(valorPintado);
6024                        
6025                        
6026                    }
6027                    //tabla += "<td>" + sumaTotal + "</td>";
6028                    tabla += "<td>" + formatoDecimalesResultado(sumaTotal, cantDecimales) + "</td>";
6029                    tabla += "</tr>";
6030                }
6031                
6032            }
6033            
6034            ReemplazaTabla(tabla, parametros);
6035        }
6036        
6037        /// <summary>   Dibuja cuadro tipo 11, varios indicadores por varias areas geograficas por un periodo. </summary>
6038        ///
6039        /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
6040        ///
6041        /// <param name="data">         Valores de indicador en JSON. </param>
6042        /// <param name="parametros">   Objeto de parametros en JSON. </param>
6043        ///
6044        /// <returns>   . </returns>
6045        function DibujaCuadroTipo11(data, parametros) {
6046            if (data.ErrorCode == undefined) {
6047                
6048                var arrayIndicadores = data.dimension.indicator.category.label;
6049                var arrayPeriodos = data.dimension.periods.category.label;
6050                var valores = data.value;
6051                var tabla = '';
6052                
6053                tabla += '<tr><th  class ="Th" bgcolor="#DDD">Periodo</th>'
6054                for (var i = 0; i < arrayIndicadores.length; i++) {
6055                    tabla += '<th  class ="Th" bgcolor="#DDD" > ' + arrayIndicadores[i].Value + '</th>';
6056                }
6057                tabla += '</tr>';
6058                
6059                //<th  class ="Th" bgcolor="#DDD" id="tdValorUnidad_' + parametros.contenedorCuadro + '">Valor&nbsp;&nbsp;&nbsp;&nbsp;</th></tr>';
6060                //  tabla += '<tbody>';
6061                var indice = 0;
6062                
6063                for (var i = 0; i < arrayPeriodos.length; i++) {
6064                    var bgColor = "white";
6065                    
6066                    if (i % 2 == 0) {
6067                        bgColor = "#EFEFEF";
6068                    }
6069                    tabla += '<tr><td class="TdInicioV"   >' + arrayPeriodos[i].Value + '</td>';
6070                    for (var j = 0; j < arrayIndicadores.length; j++) {
6071                        indice = j * arrayPeriodos.length + i;
6072                        tabla += '<td  class="TdV"   >' + valores[indice] + '</td>';
6073                        
6074                        //  indice++;
6075                    }
6076                    tabla += '</tr>';
6077                    
6078                }
6079                
6080                ReemplazaTabla(tabla, parametros);
6081            }
6082        }
6083        
6084        /// <summary>   Obtiene cantidad decimales por cada valor del array. </summary>
6085        ///
6086        /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
6087        ///
6088        /// <param name="valor">    Valor numerico del array. </param>
6089        ///
6090        /// <returns>   . </returns>
6091        function obtieneCantidadDecimales(valor) {
6092            var cantidadDecimales = 0;
6093            
6094            var valorArray = valor.split(".");
6095            if (valorArray.length > 1) {
6096                if (!isNaN(valorArray[1]))
6097                cantidadDecimales = valorArray[1].length;
6098            }
6099            
6100            return cantidadDecimales;
6101        }
6102        
6103        /// <summary>   Ajusta el formato de decimales del valor mostrado. </summary>
6104        ///
6105        /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
6106        ///
6107        /// <param name="valor">                Valor numerico. </param>
6108        /// <param name="cantidadDecimales">    Cantidad de decimales. </param>
6109        ///
6110        /// <returns>   . </returns>
6111        function formatoDecimalesResultado(valor, cantidadDecimales) {
6112            return parseFloat(Math.round(valor * 100) / 100).toFixed(cantidadDecimales);
6113        }
6114        
6115        /// <summary>   Consulta de metadato por HTTP POST. </summary>
6116        ///
6117        /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
6118        ///
6119        /// <param name="dirGdirMetaDatosrafica">   Direccion del servicio. </param>
6120        /// <param name="indicadorServicio">        Clave de indicador. </param>
6121        /// <param name="areaGeograficaM">          Clave area geografica. </param>
6122        /// <param name="parametros">               Objeto de parametros de configuracion. </param>
6123        ///
6124        /// <returns>   . </returns>
6125        function MetadatoPorPOST(dirGdirMetaDatosrafica, indicadorServicio, areaGeograficaM, parametros, dataValores) {
6126            
6127            var datosServicio = {
6128                idioma: parametros.idioma,
6129                indicador: indicadorServicio,
6130                areaGeografica: areaGeograficaM,
6131                periodo: parametros.ultimoPeriodoV,
6132                mostrarGenerica: "null",
6133                formato: "json",
6134                token: parametros.token
6135            }
6136            if (API_V == "v1_2") { // api v2              
6137                datosServicio.tematica = (parametros.tematica != "" ? parametros.tematica : "null");
6138            } else if(API_V == "v1_1"){
6139                // No se hace nada
6140            } else { // API VERSION 3 FINAL
6141                datosServicio.tematica = (parametros.tematica != "" ? parametros.tematica : "undefined");                
6142            } 
6143
6144            var datoSend = JSON.stringify(datosServicio);
6145            var _this = this;
6146            var tipo = "POST";
6147            $.ajax({
6148                // type: tipo,
6149                method: tipo,
6150                url: dirGdirMetaDatosrafica,
6151                contentType: "application/json",
6152                dataType: "json",
6153                data: datoSend,
6154                // processData: true,
6155                success: function (data) {
6156                    PintaConsultaMetaDatos(data, parametros, dataValores);
6157                },
6158                error: function (jqXHR, textStatus, errorThrown) {
6159                    console.log(textStatus, errorThrown);
6160                    //  window.alert(jqXHR.responseText);
6161                }
6162                
6163            });
6164        }
6165        
6166        ///
6167        ///
6168        ///
6169        function MetadatoPorPOSTv2(dirGdirMetaDatosrafica, indicadorServicio, areaGeograficaM, parametros, dataValores) {
6170            
6171            var datosServicio = {
6172                idioma: parametros.idioma,
6173                indicador: indicadorServicio,
6174                areaGeografica: areaGeograficaM,
6175                //periodo: parametros.ultimoPeriodoV,
6176                mostrarGenerica: "null",
6177                periodoinicial: parametros.primerPeriodoV === null ? "null" : parametros.primerPeriodoV,
6178                periodofinal: parametros.ultimoPeriodoV === null ? "null" : parametros.ultimoPeriodoV ,
6179                formato: "json",
6180                token: parametros.token
6181            }
6182            if (API_V == "v1_2") { // api v2
6183                datosServicio.tematica = (parametros.tematica != "" ? parametros.tematica : "null");
6184            } else if(API_V == "v1_1"){
6185                // No se hace nada
6186            } else { // API VERSION 3 FINAL
6187                datosServicio.tematica = (parametros.tematica != "" ? parametros.tematica : "undefined");                            
6188            }
6189            
6190            var datoSend = JSON.stringify(datosServicio);
6191            var _this = this;
6192            var tipo = "POST";
6193            $.ajax({
6194                // type: tipo,
6195                method: tipo,
6196                url: dirGdirMetaDatosrafica,
6197                contentType: "application/json",
6198                dataType: "json",
6199                data: datoSend,
6200                // processData: true,
6201                success: function (data) {
6202                    PintaConsultaMetaDatos(data, parametros, dataValores);
6203                },
6204                error: function (jqXHR, textStatus, errorThrown) {
6205                    console.log(textStatus, errorThrown);
6206                    //  window.alert(jqXHR.responseText);
6207                }
6208                
6209            });
6210        }
6211        
6212        /// <summary>   Consulta de metadatos por HTTP GET. </summary>
6213        ///
6214        /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
6215        ///
6216        /// <param name="parametros">       Objeto de parametros de configuracion. </param>
6217        ///
6218        /// <returns>   . </returns>
6219        function BuscaMetaDatos(parametros, dataValores) {          
6220            //if (parametros.tipoFooter != "noFooter")
6221            //{              
6222            var dataValores = dataValores || null; // si no llegan los valores consultas de valorindicador
6223            var areaGeograficaM = ""
6224            if (parametros.areaGeografica.indexOf("|") > -1) {
6225                var entidadV = parametros.areaGeografica.split("|")[0];
6226                if (entidadV == undefined)
6227                    entidadV = "0";
6228                var municipioV = (parametros.areaGeografica).toString().split("|")[1];
6229                if (municipioV == undefined)
6230                    municipioV = "0";
6231                
6232                areaGeograficaM = AgregarCeros(entidadV, 2) + AgregarCeros(municipioV, 3);
6233                
6234            }
6235            else
6236                areaGeograficaM = parametros.areaGeografica;
6237            
6238            var indicadorID = parametros.indicator;
6239            if (parametros.indicadorTipo == "b") {
6240                indicadorID = parametros.indicadorValorCompuesto.todosLosIndicadores;
6241                //    indicadorID = parametros.indicadorValorCompuesto.todosLosIndicadores;
6242            }
6243            if (parametros.tipoCuadro == "6" || parametros.tipoCuadro == "7" || parametros.tipoCuadro == "14")
6244                indicadorID = parametros.indicadorValorCompuesto.todosLosIndicadores;
6245            
6246            if (parametros.tipoCuadro == "12" && parametros.indicadorValorCompuesto.todosLosIndicadores)
6247                indicadorID = parametros.indicadorValorCompuesto.todosLosIndicadores;
6248            //if (parametros.tipoCuadro == "7")        
6249            //    indicadorID = parametros.indicadorValorCompuesto.todosLosIndicadores;
6250            //var ultimoPeriodo = (parametros.fechaFin === null) ? null : parametros.fechaFin; 
6251            
6252            var ultimoPeriodo = "";
6253            var primerPeriodo = "";
6254            var periodos = dataValores.dimension.periods.category.label;
6255            if (parametros.fechaFin == null || parametros.fechaFin == "null") {
6256                
6257                if (periodos.length > 1) {
6258                    periodos.sort(function compare(n1, n2) {
6259                        var per1 = n1.Value.indexOf("/") > -1 ? parseInt(n1.Value.split("/")[1]) : 13;
6260                        var per2 = n2.Value.indexOf("/") > -1 ? parseInt(n2.Value.split("/")[1]) : 13;
6261                        var anio1 = n1.Value.indexOf("/") > -1 ? parseInt(n1.Value.split("/")[0]) : parseInt(n1.Value);
6262                        var anio2 = n2.Value.indexOf("/") > -1 ? parseInt(n2.Value.split("/")[0]) : parseInt(n2.Value);
6263                        if (anio1 > anio2) {
6264                            return -1;
6265                        } else if (anio1 < anio2) {
6266                            
6267                            return 1;
6268                        } else {
6269                            if (per1 < per2)
6270                            return 1;
6271                            if (per1 > per2)
6272                            return -1;
6273                            else
6274                            return -1;
6275                        }
6276                    });
6277                    ultimoPeriodo = periodos[periodos.length - 1].Value.indexOf("/") > -1 ? periodos[periodos.length - 1].Value.split("/")[0] : periodos[periodos.length - 1].Value;
6278                } else {
6279                    ultimoPeriodo = periodos[0].Value.indexOf("/") > -1 ? periodos[0].Value.split("/")[0] : periodos[0].Value;
6280                }
6281                
6282            } else {
6283                ultimoPeriodo = parametros.fechaFin + "_12";
6284                primerPeriodo = parametros.fechaInicio !== "null" ? parametros.fechaInicio + "_01" : null;
6285            }
6286
6287            // Cuando la primerPeriodo es null y el ultimoPeriodo si trae valor
6288            // const comparaPeriodos = esMenor(primerPeriodo, ultimoPeriodo); 
6289            // if (primerPeriodo === null && ultimoPeriodo !== null) {
6290            //     primerPeriodo = ultimoPeriodo;
6291            //     ultimoPeriodo = primerPeriodo;
6292            // }
6293            // si el periodo es anual solo de enviarse el año sin periodo
6294            if (dataValores.dimension.freq.category.label[0].Value == "Anual") {
6295                primerPeriodo = primerPeriodo.split("_")[0];
6296                ultimoPeriodo = ultimoPeriodo.split("_")[0];
6297            }
6298                var direccion = parametros.direccionServicio + extension_api_cuadros;
6299                var tematica = "";
6300                if (API_V == "v1_2") {
6301                        direccion = C_direccionServicio_V + "_" + API_V.toLowerCase();;
6302                        tematica = (parametros.tematica != "" ? parametros.tematica + "/" : "null/");
6303                } else if(API_V == "v1_1"){
6304                    // No se hace nada
6305                } else { // API VERSION 3 FINAL
6306                    direccion = C_direccionServicio_V + "_" + API_V.toLowerCase() + "/";
6307                    tematica = (parametros.tematica != "" ? parametros.tematica + "/" : "undefined/");
6308                }
6309                direccion = direccion + extension_api_cuadros
6310                var dirMetaDatos = direccion + '/MetadatoIndicador/' + parametros.idioma + '/' + indicadorID + '/' + areaGeograficaM + '/' + ultimoPeriodo + '/null/null/'+ tematica +'json/' + parametros.token;
6311            
6312            if (aCuadrosNuevoMetodoPost.indexOf(parseInt(parametros.tipoCuadro)) > -1) { // Casos cuadros para nuevo metodo POST                      
6313                if (parametros.esOportuno == "1") {
6314                    primerPeriodo = periodos[0].Value;
6315                    primerPeriodo = primerPeriodo.indexOf("/") > -1 ? replaceAll("/", "_", primerPeriodo) : primerPeriodo;
6316                    ultimoPeriodo = (primerPeriodo.indexOf("_") > -1) ? primerPeriodo.split("_")[0] + "_12" : primerPeriodo;
6317                    
6318                } else {
6319                    if (ultimoPeriodo != "" && primerPeriodo != "") {
6320                        //console.log(primerPeriodo, ultimoPeriodo)
6321                    } else {
6322                        ultimoPeriodo = periodos[0].Value.indexOf("/") > -1 ? replaceAll("/", "_", periodos[0].Value) : periodos[0].Value;
6323                        primerPeriodo = periodos[periodos.length - 1].Value.indexOf("/") > -1 ? replaceAll("/", "_", periodos[periodos.length - 1].Value) : periodos[periodos.length - 1].Value;
6324                        ultimoPeriodo = (ultimoPeriodo.indexOf(primerPeriodo) > -1) ? ultimoPeriodo.split("_")[0] + "_12" : ultimoPeriodo; // si el año del periodo es el mismo en los 2
6325                        ultimoPeriodo = ultimoPeriodo.indexOf("_") > -1 ? ultimoPeriodo : ultimoPeriodo + "_12";
6326                        // console.log(periodos)
6327                        
6328                        //primerPeriodo = periodos[0].Value.indexOf("/") > -1 ? periodos[0].Value.replace("/", "_") : periodos[0].Value;
6329                        //ultimoPeriodo = periodos[periodos.length - 1].Value.indexOf("/") > -1 ? periodos[periodos.length - 1].Value.replace("/", "_") : periodos[periodos.length - 1].Value;
6330                        //ultimoPeriodo = (ultimoPeriodo.indexOf(primerPeriodo) > -1) ? ultimoPeriodo.split("_")[0] + "_12" : ultimoPeriodo; // si el año del periodo es el mismo en los 2
6331                        //ultimoPeriodo = ultimoPeriodo.indexOf("_") > -1 ? ultimoPeriodo : ultimoPeriodo + "_12"; 
6332                    }
6333                }
6334                dirMetaDatos = direccion + '/MetadatoIndicador/' + parametros.idioma + '/' + indicadorID + '/' + areaGeograficaM + '/' + primerPeriodo + '/' + ultimoPeriodo + '/null/' + tematica + 'json/' + parametros.token;
6335                //console.log(parametros.tipoCuadro)
6336            }
6337            if (indicadorID.length < 200) {
6338                $.getJSON(dirMetaDatos + "?callback=?", null, function (data) {
6339                    PintaConsultaMetaDatos(data, parametros, dataValores);
6340                });
6341            }
6342            else {
6343                parametros.ultimoPeriodoV = ultimoPeriodo;
6344                parametros.primerPeriodoV = primerPeriodo;
6345                if (aCuadrosNuevoMetodoPost.indexOf(parseInt(parametros.tipoCuadro)) > -1) {
6346                    MetadatoPorPOSTv2(direccion + '/MetadatoIndicadorV2', indicadorID, areaGeograficaM, parametros, dataValores);
6347                } else {
6348                    MetadatoPorPOST(direccion + '/MetadatoIndicador', indicadorID, areaGeograficaM, parametros, dataValores);
6349                }
6350            }
6351            
6352            //}
6353            
6354        }
6355        
6356        /// <summary>   Decodifica texto en UTF-8 </summary>
6357        ///
6358        /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
6359        ///
6360        /// <param name="s">    Texto original. </param>
6361        ///
6362        /// <returns>   . </returns>
6363        function decode_utf8(s) {
6364            return decodeURIComponent(escape(s));
6365        }
6366        
6367        /// <summary>   Dibuja metadatos debajo de la tabla, despliega cifras, notas y fuentes. </summary>
6368        ///
6369        /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
6370        ///
6371        /// <param name="data">         Informacion de metadatos en formato JSON. </param>
6372        /// <param name="parametros">       Objeto de parametros de configuracion. </param>
6373        ///
6374        /// <returns>   . </returns>
6375        function PintaConsultaMetaDatos(data, parametros, dataValores) {
6376            var dataValores = dataValores || null;
6377            if (data.ErrorCode == undefined) {
6378                var tituloPrincipalFuente = " Fuente:";
6379                if (parametros.idioma == "en") tituloPrincipalFuente = " Source:";
6380                var tituloPrincipalNotas = " Notas y Llamadas:";
6381                if (parametros.idioma == "en") tituloPrincipalNotas = " Notes and Footnotes:";
6382                    // tituloPrincipalNotas = " Notes and Calls:";
6383                var listaFuentes = data.FUENTES;
6384                var tableFuentes = document.getElementById("tableFuentes" + parametros.contenedorCuadro);
6385                var listaNotas = data.NOTAS;
6386                var tableExceptions = document.getElementById("tableExceptions" + parametros.contenedorCuadro);
6387                var tableNotas = document.getElementById("tableNota" + parametros.contenedorCuadro);
6388                var contRenglon = 0;
6389                var tableTitleNotas = document.getElementById("tableTitleNotas" + parametros.contenedorCuadro);
6390                var tableTitleFuentes = document.getElementById("tableTitleFuentes" + parametros.contenedorCuadro);
6391                var listaCifras = data.CIFRAS_ESTATUS;
6392                var tableCifras = document.getElementById("tableCifras" + parametros.contenedorCuadro);                                
6393                var listaExcepciones = parametros.listaExcepciones ?? [];
6394                var tablaSiglas = document.getElementById("tableSiglas" + parametros.contenedorCuadro);
6395                var tableReglasPrecision = document.getElementById("tableReglasPrecision"+ parametros.contenedorCuadro)
6396                var tableReglasPrecisionExport = document.getElementById("tableReglasPrecisionExport"+ parametros.contenedorCuadro)
6397                var tableReglasPrecisionExportNotas = document.getElementById("tableReglasPrecisionExportNotas"+ parametros.contenedorCuadro)
6398                var divReglasPrecisionExport = document.getElementById("divReglasPrecisionExport"+parametros.contenedorCuadro);
6399                var tabInd = parametros.tabInd;
6400                
6401                var footersPintados = 0;
6402                var fuentesPintadas = 0;
6403                var pintarLasNotas = true;
6404                if (listaNotas == undefined) {
6405                    if (listaFuentes == undefined)
6406                    pintarLasNotas = false;
6407                    else {
6408                        if (listaFuentes.length == 0)
6409                        pintarLasNotas = false;
6410                    }
6411                }
6412                if (listaFuentes == undefined) {
6413                    if (listaNotas == undefined)
6414                    pintarLasNotas = false;
6415                    else {
6416                        if (listaNotas.length == 0)
6417                        pintarLasNotas = false;
6418                    }
6419                }
6420                if (parametros.notaParametro != "")
6421                pintarLasNotas = true;
6422                
6423                if (pintarLasNotas) {
6424                    
6425                }
6426                // Siglas de excepciones (Actualización 27.11.2025)                                       
6427                if (parametros.mostrarSiglaExcepcion === "true" || parametros.mostrarSiglaExcepcion === true) {
6428                    if (listaExcepciones != null && listaExcepciones[0]?.abbreviation !== "") {
6429                        for (var i = 0; i < listaExcepciones.length; i++) {
6430                            var renglon2 = tableExceptions.insertRow(-1);
6431                            var cell1 = renglon2.insertCell(0);
6432                            // tabAux++;
6433                            // cell1.innerHTML = "<span class='pie cn_pre'  tabIndex='" + tabInd + "'>" + listaExcepciones[i].abbreviation + " " + listaExcepciones[i].description + "</span>";
6434                            cell1.innerHTML = "<span class='pie cn_pre'>" + listaExcepciones[i].abbreviation + " " + listaExcepciones[i].description + "</span>";
6435                        }
6436                    }
6437                }
6438                // Coloca el titulo        
6439                
6440                if ((parametros.muestraNota == "true" && listaNotas.length > 0) || parametros.notaParametro != "" || (parametros.mostrarCifraEstatus == "true" && listaCifras.length > 0) || listaExcepciones.length > 0) {
6441                    if(tableTitleNotas){
6442                       var renglon0 = tableTitleNotas.insertRow(-1);
6443                        var cell0 = renglon0.insertCell(0);                  
6444                        // cell0.innerHTML = "<span class='pie' tabIndex='" + tabInd + "'>" + tituloPrincipalNotas + "</span>";
6445                        cell0.innerHTML = "<span class='pie'>" + tituloPrincipalNotas + "</span>";
6446                    }
6447                }
6448                
6449                //ta
6450                // fin notas
6451                if (parametros.notaParametro != "") {
6452                    if (parametros.condicionNota == "ambas" || parametros.condicionNota == "adicional") {
6453                        footersPintados++;
6454                        var renglon = tableNotas.insertRow(-1);
6455                        var cell0 = renglon.insertCell(0);                        
6456                        // cell0.innerHTML = "<span class='pie' tabIndex='" + tabAux + "'>" + parametros.notaParametro + "</span>";                        
6457                        cell0.innerHTML = "<span class='pie'>" + parametros.notaParametro + "</span>";                        
6458                    }
6459                }
6460                // var tabAux = tabInd;
6461                // notas
6462                var notasPintadas = 0;
6463                var listaSiglasInd = []
6464                if (parametros.muestraNota == "true") {
6465                    var notasDistintas = [];
6466                    //inicio notas bd
6467                    if (parametros.condicionNota == "ambas" || parametros.condicionNota == "bd") {
6468                        var aPeriodosData = dataValores.dimension.periods.category.label;
6469                        if (listaNotas != null) {
6470                             // Ajuste 01/09/2025
6471                            //Elimina notas donde NOTA este repetida.
6472                            // Se genera un nuevo arreglo y luego se sobreescribe el original
6473                            // let aNotasUnicas = [];
6474                            // let nListaNotas = [];
6475                            // listaNotas.forEach((n, idx) => {
6476                            //     if(aNotasUnicas.indexOf(n.NOTA.trim()) === -1){ 
6477                            //         aNotasUnicas.push(n.NOTA); 
6478                            //         nListaNotas.push(n)};                                    
6479                            // })
6480                            // listaNotas = nListaNotas;
6481
6482                            if (listaNotas.length > 0) {
6483                                for (var i = contRenglon; i < listaNotas.length; i++) {
6484                                    if (notasDistintas.indexOf(listaNotas[i].NOTA) === -1) {
6485                                        notasDistintas.push(listaNotas[i].NOTA);
6486                                        var renglon = tableNotas.insertRow(-1);
6487                                        var cell1 = renglon.insertCell(0);
6488                                        var notaOriginal = "";
6489                                        try {
6490                                            notaOriginal = decode_utf8(listaNotas[i].NOTA);
6491                                        }
6492                                        catch (e) {
6493                                            notaOriginal = listaNotas[i].NOTA;
6494                                        }
6495                                        var textoNota = "";
6496                                        if ((notaOriginal.indexOf("La suma de los parciales") === -1 && parametros.tipoCuadro === "12") || parametros.tipoCuadro !== "12") { // ocultar nota solo para cuadro 12                                                                                
6497                                            // textoNota = (listaNotas[i].SIGLA == null) ? notaOriginal : "<sup style='font-size:11px'><b>" + listaNotas[i].SIGLA +(listaNotas[i].diferenciador !== undefined? "("+listaNotas[i].diferenciador+")" : "") + "/</b></sup> " + notaOriginal;
6498                                            textoNota = (listaNotas[i].SIGLA == null) ? notaOriginal : "<sup style='font-size:11px'><b>" + (listaNotas[i]._SIGLA ? listaNotas[i]._SIGLA : listaNotas[i].SIGLA) + "/</b></sup> " + notaOriginal;
6499                                            if (listaNotas.length == 1) {
6500                                                var indicadorTipo = parametros.indicator.charAt(0);
6501                                                if (indicadorTipo != "b") {
6502                                                    textoNota = "a/ " + notaOriginal;
6503                                                    PintaSiglaEnEncabezado(parametros.tipoCuadro, "a", "");
6504                                                }
6505                                            }
6506                                            // nota general 1 indicador ( PERIODO = 0 &&  num indicadores = 1)
6507                                            // nota general > 1 indicador (PERIODO = 0 && num indicadores > 1)
6508                                            // modificacion 13/ago/2018
6509                                            if ((
6510                                                listaNotas[i].PERIODO === "0" ||
6511                                                listaNotas[i].PERIODO === "0 - " ||
6512                                                listaNotas[i].PERIODO === "/") ||
6513                                                (parametros.indicadorDepurado.length === 1 || aPeriodosData.length === 1)) {
6514                                                    if (parametros.tipoCuadro !== "12")
6515                                                    textoNota = listaNotas[i].NOTA;
6516                                                }
6517                                                // tabAux++;
6518                                                // cell1.innerHTML = "<span class='pie' tabIndex='" + tabAux + "'>" + textoNota + "</span>";
6519                                                cell1.innerHTML = "<span class='pie'>" + textoNota + "</span>";
6520                                                notasPintadas++;
6521                                            }
6522                                        }
6523                                    }
6524                                    //if (notasPintadas > 0) {
6525                                    //    var renglon = tableTitleNotas.insertRow(-1);
6526                                    //    var cell0 = renglon.insertCell(0);
6527                                    //    cell0.innerHTML = "<span class='pie'  tabIndex='" + tabInd + "'>" + tituloPrincipalNotas + "</span>";
6528                                    footersPintados++;
6529                                    //}
6530                                }
6531                            }
6532                        }
6533                        // fin notas bd
6534                        if (data.INDICADORES_CON_SIGLA != undefined) {
6535                            
6536                            var indicadorTipo = parametros.indicator.charAt(0);
6537                            var pintarEnCabecera = PintaNotaUnIndicador(parametros.tipoCuadro, data.INDICADORES_CON_SIGLA, parametros.indicadorDepurado, pintarEnCabecera, indicadorTipo);
6538                            
6539                            if (pintarEnCabecera) {
6540                                for (var i = 0; i < data.INDICADORES_CON_SIGLA.length; i++) {
6541                                    if (listaSiglasInd.indexOf(data.INDICADORES_CON_SIGLA[i].SIGLA) == -1) {
6542                                        listaSiglasInd.push(data.INDICADORES_CON_SIGLA[i].SIGLA);
6543                                        PintaSiglaEnEncabezado(parametros.tipoCuadro, data.INDICADORES_CON_SIGLA[i].SIGLA, data.INDICADORES_CON_SIGLA[i].INDICADOR);
6544                                        
6545                                    }
6546                                }
6547                            }
6548                            
6549                        }
6550                    }
6551                    // cifras
6552                    /* tabInd = tabAux + 1;
6553                    tabAux = tabInd; */
6554                    if (parametros.mostrarCifraEstatus == "true" || parametros.mostrarCifraEstatus == true) {                        
6555                        borraTabla(tableCifras);
6556
6557                        if (listaCifras != null) {  
6558                            if (aCuadrosNuevoMetodoPost.indexOf(parseInt(parametros.tipoCuadro)) === -1) { // si el cuadro no aplica aun al nuevo metodo post v2  
6559                                var aPeriodosData = dataValores.dimension.periods.category.label;
6560                                //if (aPeriodosData.length > 1) {
6561                                //listaCifras.reverse();    
6562                                var aCifrasPintadas = [];
6563                                // console.log(aPeriodosData);
6564                                for (var i = contRenglon; i < listaCifras.length; i++) {
6565                                    if (listaCifras[i].descripcion != "" && listaCifras[i].descripcion != null) {
6566                                        if (listaCifras[i].letra !== null && listaCifras[i].letra !== "D") {                                            
6567                                            //if (parametros.tipoCuadro === "2" && dataValores !== null) {
6568                                               
6569                                            var searchedPeriod = aPeriodosData.filter(function (p) {
6570                                                return p.Value === listaCifras[i].periodos;
6571                                            });
6572                                            var strDescripcion = (listaCifras[i].descripcion.split(" a partir")[0]);
6573                                            if (strDescripcion.indexOf("preliminar") > -1) {
6574                                                strDescripcion = listaCifras[i].descripcion.split(" a partir")[0].replace("preliminar", "preliminares");
6575                                            }
6576                                            if (strDescripcion.indexOf("revisada") > -1) {
6577                                                strDescripcion = listaCifras[i].descripcion.split(" a partir")[0].replace("revisada", "revisadas");
6578                                            }
6579                                            if (strDescripcion.indexOf("revisadass") > -1) {
6580                                                strDescripcion = strDescripcion.replace("revisadass", "revisadas");
6581                                            }
6582                                            strDescripcion = strDescripcion.replace("preliminareses", "preliminares");
6583                                            if (searchedPeriod.length > 0) {
6584                                                
6585                                                var renglon2 = tableCifras.insertRow(-1);
6586                                                var cell2 = renglon2.insertCell(0);
6587                                                // tabAux++;
6588                                                //var formato = (listaCifras[i].periodos.indexOf("/") !== -1) ? oMESES.getFormatoPeriodo(listaCifras[i].periodos, dataValores.dimension.freq.category.label[0].Value, parametros.idioma, 1) : listaCifras[i].periodos;
6589                                                //var strDescripcion = listaCifras[i].descripcion.split(listaCifras[i].periodos)[0] + " " + formato;                                                                                                                                               
6590                                                if (aCifrasPintadas.indexOf(strDescripcion) === -1) { // evitar repetir los estatus                                        
6591                                                    aCifrasPintadas.push(strDescripcion);
6592                                                    
6593                                                    if (parametros.esOportuno === "1") {                                                        
6594                                                        // cell2.innerHTML = "<span class='pie'  tabIndex='" + tabAux + "'>" + strDescripcion + "</span>";
6595                                                        cell2.innerHTML = "<span class='pie'>" + strDescripcion + "</span>";
6596                                                    } else {
6597                                                        if (aPeriodosData.length == 1) {
6598                                                            // cell2.innerHTML = "<span class='pie'  tabIndex='" + tabAux + "'>" + strDescripcion + "</span>";
6599                                                            cell2.innerHTML = "<span class='pie'>" + strDescripcion + "</span>";
6600                                                        } else {
6601                                                            // cell2.innerHTML = "<span class='pie'  tabIndex='" + tabAux + "'><sup>" + listaCifras[i].letra.replace("/", "") + "</sup> " + strDescripcion + "</span>";
6602                                                            cell2.innerHTML = "<span class='pie'><sup>" + listaCifras[i].letra.replace("/", "") + "</sup> " + strDescripcion + "</span>";
6603                                                        }
6604                                                    }
6605                                                }
6606                                            } else {
6607                                                if (aCifrasPintadas.indexOf(strDescripcion) === -1) { // evitar repetir los estatus                                        
6608                                                    aCifrasPintadas.push(strDescripcion);
6609                                                    
6610                                                    if (parametros.esOportuno === "1") {
6611                                                        if ((listaCifras.length - 1) === i) {
6612                                                            var renglon2 = tableCifras.insertRow(-1);
6613                                                            var cell2 = renglon2.insertCell(0);
6614                                                            // tabAux++;                                                            
6615                                                            // cell2.innerHTML = "<span class='pie'  tabIndex='" + tabAux + "'>" + strDescripcion + "</span>";
6616                                                            cell2.innerHTML = "<span class='pie'>" + strDescripcion + "</span>";
6617                                                        }
6618                                                    } else {
6619
6620                                                        var renglon2 = tableCifras.insertRow(-1);
6621                                                        var cell2 = renglon2.insertCell(0);
6622                                                        // tabAux++;                                                       
6623                                                        if (aPeriodosData.length == 1) {
6624                                                            
6625                                                            var addCifra = aPeriodosData.filter(function (periodo) {
6626                                                                return periodo.Value === listaCifras[i].periodos;
6627                                                            });
6628                                                            if (addCifra.length > 0) {
6629                                                                // cell2.innerHTML = "<span class='pie'  tabIndex='" + tabAux + "'>" + strDescripcion + "</span>";
6630                                                                cell2.innerHTML = "<span class='pie'>" + strDescripcion + "</span>";
6631                                                            }
6632                                                        } else {
6633                                                            // cell2.innerHTML = "<span class='pie'  tabIndex='" + tabAux + "'><sup>" + listaCifras[i].letra.replace("/", "") + "</sup> " + strDescripcion + "</span>";
6634                                                            cell2.innerHTML = "<span class='pie'><sup>" + listaCifras[i].letra.replace("/", "") + "</sup> " + strDescripcion + "</span>";
6635                                                        }
6636                                                    }
6637                                                } else {
6638                                                    //ocultar titulo de notas y fuentes
6639                                                    // agregado 04052020
6640                                                    if ($("#tableTitleNotas"+parametros.contenedorCuadro).find("tbody").children().length == 1) {
6641                                                        $("#tableTitleNotas"+parametros.contenedorCuadro).remove()
6642                                                    }
6643                                                }
6644                                            }
6645                                            
6646                                        }
6647                                        //}
6648                                        //   fuentesPintadas++;
6649                                    }
6650                                }
6651                                
6652                            } else { // cuadros que aplican al nuevo metodo post (03-08-2018) ultima modificacion 21 agosto 2018
6653                                //console.log("> Cifras estatus nuevo metodo");
6654                                var aPeriodosData = dataValores.dimension.peri
6654ods.category.label;
6655                                var frecuencia = dataValores.dimension.freq.category.label[0].Value;
6656                                var aNoRepatEstatus = [];
6657                                var cifrasPintadasSinD = []; // para validar y saber si ocultar el titulo de notas y llamadas
6658                                for (var i = contRenglon; i < listaCifras.length; i++) {                                    
6659                                    if (listaCifras[i].descripcion != "" && listaCifras[i].descripcion != null) {
6660                                        var strDescripcion = "";
6661                                        //var renglon2 = tableCifras.insertRow(-1);
6662                                        //var cell2 = renglon2.insertCell(0);
6663                                        //cell2.className = "CellNote";
6664                                        //tabAux++;
6665                                        
6666                                        // console.log(console.log(listaCifras[i]);
6667                                        if(parametros.idioma == "es"){
6668                                            // var strDescripcion = (listaCifras[i].descripcion.split(" a partir")[0]);
6669                                            // if (strDescripcion.indexOf("preliminar") > -1) {
6670                                            //     strDescripcion = listaCifras[i].descripcion.split(" a partir")[0].replace("preliminar", "preliminares");
6671                                            // }
6672                                            // if (strDescripcion.indexOf("revisada") > -1) {
6673                                            //     strDescripcion = listaCifras[i].descripcion.split(" a partir")[0].replace("revisada", "revisadas");
6674                                            // }
6675                                            // if (strDescripcion.indexOf("revisadass") > -1) {
6676                                            //     strDescripcion = strDescripcion.replace("revisadass", "revisadas");
6677                                            // }
6678                                            // strDescripcion = strDescripcion.replace("preliminareses", "preliminares");
6679                                            if (listaCifras[i].descripcion.toLowerCase().indexOf("preliminar") > -1) {
6680                                                strDescripcion = "Cifras preliminares";
6681                                            }
6682                                            if (listaCifras[i].descripcion.toLowerCase().indexOf("revisada") > -1) {
6683                                                strDescripcion = "Cifras revisadas";
6684                                            }
6685                                            if (listaCifras[i].descripcion.toLowerCase().indexOf("oportuna") > -1) {
6686                                                strDescripcion = "Cifras oportunas";
6687                                            }
6688                                            if (listaCifras[i].descripcion.toLowerCase().indexOf("estimada") > -1) {
6689                                                strDescripcion = "Cifras estimadas";
6690                                            }
6691                                            if (listaCifras[i].descripcion.toLowerCase().indexOf("ajustada") > -1) {
6692                                                strDescripcion = "Cifras ajustadas";
6693                                            }
6694                                        } else {
6695                                            strDescripcion = (listaCifras[i].descripcion.split(" a partir")[0]);
6696                                            if (strDescripcion.indexOf("preliminary") > -1) {
6697                                                strDescripcion = listaCifras[i].descripcion.split(" a partir")[0].replace("preliminary", "preliminares");
6698                                            }   
6699                                            if (strDescripcion.indexOf("preliminary figures") > -1) {
6700                                                strDescripcion = listaCifras[i].descripcion.split(" a partir")[0].replace("preliminary figures", "preliminares");
6701                                            }                                                                                                                           
6702                                            if (listaCifras[i].descripcion.search(/Preliminary/) > -1 || listaCifras[i].descripcion.search(/Preliminary figures/) > -1) {
6703                                                strDescripcion = listaCifras[i].descripcion;
6704                                            }
6705                                            if (listaCifras[i].descripcion.search(/Reviewed/) > -1 || listaCifras[i].descripcion.search(/Reviewed figures/) > -1) {
6706                                                strDescripcion = listaCifras[i].descripcion;
6707                                            }
6708
6709                                            if (listaCifras[i].descripcion.search(/Timely/) > -1 || listaCifras[i].descripcion.search(/Timely figures/) > -1) {
6710                                                strDescripcion = listaCifras[i].descripcion;
6711                                            }
6712                                            if (listaCifras[i].descripcion.search(/Estimated/) > -1 || listaCifras[i].descripcion.search(/Estimated figures/) > -1) {
6713                                                strDescripcion = listaCifras[i].descripcion;
6714                                            }
6715                                            if (listaCifras[i].descripcion.search(/Adjusted/) > -1 || listaCifras[i].descripcion.search(/Adjusted figures/) > -1) {
6716                                                strDescripcion = listaCifras[i].descripcion;
6717                                            }
6718                                        }
6719                                        if (parametros.mostrarEstatusPeriodo === "true" ||
6720                                        listaCifras.length > 1 ||
6721                                        aPeriodosData.length > 1
6722                                        ) {// ultima modificacion:16-04-2018 1:24 pm
6723                                            
6724                                            var letra = listaCifras[i].letra.split("/")[0];
6725                                            if (aNoRepatEstatus.indexOf(letra) === -1) {
6726                                                // tabAux++;
6727                                                aNoRepatEstatus.push(letra);
6728                                                if (letra !== "D") {
6729                                                    var renglon2 = tableCifras.insertRow(-1);
6730                                                    var cell2 = renglon2.insertCell(0);
6731                                                    cell2.className = "CellNote";
6732                                                    // cell2.innerHTML = "<span class='pie' tabIndex ='" + tabAux + "'><sup>" + letra + "</sup> " + strDescripcion + "</span>";
6733                                                    cell2.innerHTML = "<span class='pie'><sup>" + letra + "</sup> " + strDescripcion + "</span>";
6734                                                    cifrasPintadasSinD.push(listaCifras[i]);
6735                                                }
6736                                            }
6737                                        } else if (parametros.esOportuno === "1") {
6738                                            // tabAux++;
6739                                            if ((listaCifras.length - 1) === i) {
6740                                                var letra = (listaCifras[i].letra !== undefined || listaCifras[i].letra !== null) ? listaCifras[i].letra.split("/")[0] : "";
6741                                                if (letra !== "D") {
6742                                                    var renglon2 = tableCifras.insertRow(-1);
6743                                                    var cell2 = renglon2.insertCell(0);
6744                                                    cell2.className = "CellNote";
6745                                                    // cell2.innerHTML = "<span class='pie' tabIndex ='" + tabAux + "'>" + strDescripcion + "</span>";
6746                                                    cell2.innerHTML = "<span class='pie'>" + strDescripcion + "</span>";
6747                                                    cifrasPintadasSinD.push(listaCifras[i]);
6748                                                }
6749                                            }
6750                                        } else {
6751                                            var letra = (listaCifras[i].letra !== undefined || listaCifras[i].letra !== null) ? listaCifras[i].letra.split("/")[0] : "";
6752                                            if (letra !== "D") {
6753                                                var renglon2 = tableCifras.insertRow(-1);
6754                                                var cell2 = renglon2.insertCell(0);
6755                                                cell2.className = "CellNote";
6756                                                // cell2.innerHTML = "<span class='pie' tabIndex ='" + tabAux + "'>" + strDescripcion + "</span>";
6757                                                cell2.innerHTML = "<span class='pie'>" + strDescripcion + "</span>";
6758                                                cifrasPintadasSinD.push(listaCifras[i]);
6759                                            }
6760                                        }
6761                                    }
6762                                }
6763                                if (cifrasPintadasSinD.length == 0 && $(tableNotas).find("tbody").children().length == 0) {
6764                                    $(tableTitleNotas).remove()
6765                                }
6766                                //if (listaExcepciones.length == 0 && cifrasPintadasSinD.length == 0 && listaNotas.length == 0) {                            
6767                                //    $(tableTitleNotas).css({ display: "none" });
6768                                //}
6769                            }
6770                        }
6771                    }
6772                    
6773                    
6774                    // fin cifras
6775                  /*   tabInd = tabAux + 1;
6776                    tabAux = tabInd; */
6777                    
6778                    // fuentes           
6779                    var fuentesDistintas1 = [];
6780                    if (parametros.muestraFuente == "true")
6781                    if (parametros.mostrarFuentePersonalizada != "") {
6782                        var renglon2 = tableFuentes.insertRow(-1);
6783                        var cell2 = renglon2.insertCell(0);
6784                        var textoFuente = parametros.mostrarFuentePersonalizada.split("|")[0];
6785                        var urlFuente = parametros.mostrarFuentePersonalizada.split("|")[1];
6786                        if (urlFuente != undefined)
6787                        textoFuente = "<a href='" + urlFuente + "'>" + parametros.mostrarFuentePersonalizada.split("|")[0] + "</a>"
6788                        // tabAux++;
6789                        // cell2.innerHTML = "<span class='pie'  tabIndex='" + tabAux + "'>" + textoFuente + "</span>";
6790                        cell2.innerHTML = "<span class='pie'>" + textoFuente + "</span>";
6791                        fuentesPintadas++;
6792                    }
6793                    else {
6794                        if (listaFuentes != null) {
6795                            if (listaFuentes.length > 0) {
6796                                // Si hay fuentes, se ordenan por periodo de menor a mayor
6797                                if (listaFuentes.length > 1) {
6798                                    listaFuentes.sort(function (n1, n2) {
6799                                        var p1 = n1.PERIODO.indexOf("-") ? parseInt(n1.PERIODO.split("-")[0]) : parseInt(n1.PERIODO);
6800                                        var p2 = n2.PERIODO.indexOf("-") ? parseInt(n2.PERIODO.split("-")[0]) : parseInt(n2.PERIODO);
6801                                        
6802                                        return p1 - p2;
6803                                    });
6804                                }
6805                                for (var i = contRenglon; i < listaFuentes.length; i++) {
6806                                    if (listaFuentes[i].NOMBRE_FUENTE != "" && listaFuentes[i].NOMBRE_FUENTE != null) {
6807                                        if (fuentesDistintas1.indexOf(listaFuentes[i].NOMBRE_FUENTE) < 0) {
6808                                            fuentesDistintas1.push(listaFuentes[i].NOMBRE_FUENTE)
6809                                            var urlFuente = EvaluaParametro(l
6809istaFuentes[i].URL_PROYECTO, "");
6810                                            var fuenteOriginal = "";
6811                                            try {
6812                                                fuenteOriginal = decode_utf8(listaFuentes[i].NOMBRE_FUENTE);
6813                                            }
6814                                            catch (err) {
6815                                                fuenteOriginal = listaFuentes[i].NOMBRE_FUENTE;
6816                                            }
6817                                            var textoFuente = fuenteOriginal;
6818                                            if (urlFuente != "" && urlFuente != null)
6819                                            textoFuente = "<a href='" + urlFuente + "'>" + fuenteOriginal + "</a>"
6820                                            
6821                                            
6822                                            var renglon2 = tableFuentes.insertRow(-1);
6823                                            var cell2 = renglon2.insertCell(0);
6824                                            // tabAux++;
6825                                            // cell2.innerHTML = "<span class='pie'  tabIndex='" + tabAux + "'>" + textoFuente + "</span>";
6826                                            cell2.innerHTML = "<span class='pie'>" + textoFuente + "</span>";
6827                                            fuentesPintadas++;
6828                                        }
6829                                    }
6830                                }
6831                                
6832                            }
6833                        }
6834                    }
6835                    if (fuentesPintadas > 0) {
6836                        var renglon = tableTitleFuentes.insertRow(-1);
6837                        var cell1 = renglon.insertCell(0);
6838                        // cell1.innerHTML = "<span class='pie'  tabIndex='" + tabInd + "'>" + tituloPrincipalFuente + "</span>";
6839                        cell1.innerHTML = "<span class='pie'>" + tituloPrincipalFuente + "</span>";
6840                        footersPintados++;
6841                        // tabAux++;
6842                       /*  tabInd = tabAux + 1;
6843                        tabAux = tabInd; */
6844                    }
6845                    //fin fuentes
6846                    // bInd = tabAux + 1;
6847                    //tabAux = tabInd;
6848                    // fin siglas de excepciones                    
6849                    // SiglasGrupoA(parametros);            
6850                    SiglasTipo7(parametros, listaCifras, dataValores);
6851                    
6852                    var tdUnidad = document.getElementById("tdUnidad" + parametros.contenedorCuadro);
6853                    if (tdUnidad != undefined && data.NOMBRE_UNIDAD != null) {
6854                        // [29-09-2021] se agrega el dato FACTOR e la UNIDAD DE MEDIDA para nombre de columna en los cuadros que manejan la columna tdUnidad...                        
6855                        var sFactor = data.FACTOR !== undefined && data.FACTOR != null? data.FACTOR +" "+ getTraductorCuadro(parametros,"de")+" " : "";
6856                        tdUnidad.innerHTML += sFactor + data.NOMBRE_UNIDAD;
6857                    }
6858                    
6859                    var tdUnidadValor = document.getElementById("tdValorUnidad_" + parametros.contenedorCuadro);
6860                    if (tdUnidadValor != undefined && parametros.titulosColumnas == "" && data.NOMBRE_UNIDAD != null) {
6861                        
6862                        tdUnidadValor.innerHTML = (data.FACTOR !== undefined && data.FACTOR != null? data.FACTOR +" "+ getTraductorCuadro(parametros,"de")+" "+data.NOMBRE_UNIDAD : data.NOMBRE_UNIDAD);
6863                        // si el valor es un "." entonces eliminar para dejar vacia la columnas (15-02-2023)
6864                        if(tdUnidadValor.innerHTML === "."){
6865                            tdUnidadValor.innerHTML = "";
6866                        }
6867                    }
6868
6869                    // Mostrar leyenda de colores para datos de precision (cuadro #precision)
6870                    // Agregado: 15-06-2021 
6871                    // Modificado: 05-07-2023 (Actualizacion dinamica de reglas por API)    
6872                    var oTieneDatosPrecision = oCriteriosPrecision.check(dataValores);
6873                    if(parametros.tipoCuadro === "precision" && oTieneDatosPrecision !== null){
6874                            borraTabla(tableReglasPrecision);
6875                            borraTabla(tableReglasPrecisionExportNotas);
6876                            borraTabla(tableReglasPrecisionExport);
6877                            var oLimitesPrecision = oCriteriosPrecision.getLimites(oTieneDatosPrecision);                            
6878                            divReglasPrecisionExport.setAttribute("informacion_extra",1);                                
6879                            tableReglasPrecision.style.borderCollapse = "inherit";
6880                            var renglon = tableReglasPrecision.insertRow();
6881                            var cell0 = renglon.insertCell(0);
6882                            cell0.colSpan = 2
6883                            var textoNotas1 = getTraductorCuadro(p
6883arametros, "Estimación: Las estimaciones que aparecen en este cuadro están coloreadas de acuerdo con su nivel de precisión, en Alta, Moderada y Baja, tomando como referencia el coeficiente de variación CV (%).");
6884                            var textoNotas2 = getTraductorCuadro(parametros, "Límite: Intervalo de confianza al 90%.");
6885                            
6886                            cell0.innerHTML = '<tr>'
6887                                    +'<td colspan="2" style="font-size:10px;padding:6px 0">'
6888                                        +'<span class="pie">'
6889                                            +'<div>'+ textoNotas1 +'</div>'
6890                                            +'<div>' + textoNotas2 + '</div>'
6891                                            +'<div><br /></div>'
6892                                        +'</span>'
6893                                    +'</td>'
6894                                +'</tr>'
6895
6896                            var renglon1 = tableReglasPrecision.insertRow();
6897                            var cell1 = renglon1.insertCell(0);
6898                            cell1.colSpan = 2
6899                            cell1.innerHTML = '<span class="pie">'+ getTraductorCuadro(parametros, "Coeficiente de variación (CV) en el rango de:") +'</span>'
6900                            
6901                            var renglon2 = tableReglasPrecision.insertRow();
6902                            var cell12 = renglon2.insertCell(0);                        
6903                            var cell22 = renglon2.insertCell(0); 
6904                            cell22.innerHTML = '<table><tbody><tr><td style="background-color: '+ oLimitesPrecision.Alta.color +'; border: 0.5px solid rgb(220, 220, 220); min-width:20px;width: 20px; height: 16px;"></td></tr></tbody></table>'
6905                            cell12.innerHTML = '<span class="pie">&nbsp;&nbsp;'+ getTraductorCuadro(parametros, "Alta")+' ('+ oLimitesPrecision.Alta.limite_inferior +'%, '+ oLimitesPrecision.Alta.limite_superior +'%)</span>'
6906                            
6907                            var renglon3 = tableReglasPrecision.insertRow();
6908                            var cell13 = renglon3.insertCell(0);                        
6909                            var cell23 = renglon3.insertCell(0); 
6910                            cell23.innerHTML = '<table><tbody><tr><td style="background-color: '+ oLimitesPrecision.Moderada.color +'; border: 0.5px solid rgb(220, 220, 220); min-width:20px; width: 20px; height: 16px;"></td></tr></tbody></table>'
6911                            cell13.innerHTML = '<span class="pie">&nbsp;&nbsp;'+ getTraductorCuadro(parametros, "Moderada")+' ('+ oLimitesPrecision.Moderada.limite_inferior +'%, '+ oLimitesPrecision.Moderada.limite_superior +'%)</span>'
6912                            
6913                            var renglon4 = tableReglasPrecision.insertRow();
6914                            var cell14 = renglon4.insertCell(0);                        
6915                            var cell24 = renglon4.insertCell(0); 
6916                            cell24.style.verticalAlign = "top";
6917                            cell24.innerHTML = '<table><tbody><tr><td style="background-color: '+ oLimitesPrecision.Baja.color +'; border: 0.5px solid rgb(220, 220, 220); min-width:20px; width: 20px; height: 16px;"></td></tr></tbody></table>'
6918                            cell14.innerHTML = '<span class="pie">&nbsp;&nbsp;'+ getTraductorCuadro(parametros, "Baja")+' '+ oLimitesPrecision.Baja.limite_inferior +'% '+ getTraductorCuadro(parametros, "en adelante")+'. '+ getTraductorCuadro(parametros, "Una precisión Baja requiere un uso cauteloso de la estimación en el que se analicen las causas de la alta variabilidad y se consideren otros indicadores de precisión y confiabilidad, como el intervalo de confianza.") +'</span>'
6919
6920                            // Exportacion de la tabla de datos para cobertura
6921
6922                            tableReglasPrecisionExportNotas.innerHTML = '<tr>'
6923                                +'<td colspan="2" style="font-size:10px;padding:6px 0">'
6924                                +'<span class="pie">'
6925                                +'<div>
6925'+ getTraductorCuadro(parametros, "Estimación: Las estimaciones que aparecen en este cuadro están coloreadas de acuerdo con su nivel de precisión, en Alta, Moderada y Baja, tomando como referencia el coeficiente de variación CV (%).") +'</div>'
6926                                +'<div>' + getTraductorCuadro(parametros, "Límite: Intervalo de confianza al 90%.") + '</div>'
6927                                +'</span>'
6928                                +'</td>'
6929                            +'</tr>'
6930
6931                            tableReglasPrecisionExport.setAttribute("informacion_extra","1")
6932                            tableReglasPrecisionExport.setAttribute("border","1")
6933                            tableReglasPrecisionExport.style.width = "60%";
6934                            tableReglasPrecisionExport.innerHTML = '<tr>'
6935                                    +'<td style="text-align:center;font-weight:700;font-size:10px">'+ getTraductorCuadro(parametros, "Coeficiente de variación (CV) en el rango de:") +'</td>'
6936                                    +'<td style="text-align:center;font-weight:700;font-size:10px">'+ getTraductorCuadro(parametros, "Interpretación") +'</td>'
6937                                +'</tr>'
6938                                +'<tr>'
6939                                    +'<td style="background-color:#fff;color:#000;width:30%;height:30px;font-size:10px;text-align:center;vertical-align:middle">('+ oLimitesPrecision.Alta.limite_inferior +'%, '+ oLimitesPrecision.Alta.limite_superior +'%)</td>'
6940                                    +'<td style="font-size:10px;vertical-align:middle">'
6941                                        +'<span class="">'+ getTraductorCuadro(parametros, "Alta")+'</span>'
6942                                    +'</td>'
6943                                +'</tr>'
6944                                +'<tr>'
6945                                    +'<td style="background-color:#ffea00;color:#000;width:30%;height:30px;font-size:10px;text-align:center;vertical-align:middle">('+ oLimitesPrecision.Moderada.limite_inferior +'%, '+ oLimitesPrecision.Moderada.limite_superior +'%)</td>'
6946                                    +'<td style="font-size:10px;vertical-align:middle">'
6947                                        +'<span class="">'+ getTraductorCuadro(parametros, "Moderada")+'</span>'
6948                                    +'</td>'
6949                                +'</tr>'
6950                                +'<tr>'
6951                                    +'<td style="background-color:#ff5400;color:#000;width:30%;height:100px;font-size:10px;text-align:center;vertical-align:middle">'+ getTraductorCuadro(parametros, "Baja")+' '+ oLimitesPrecision.Baja.limite_inferior +'% '+ getTraductorCuadro(parametros, "en adelante")+'</td>'
6952                                    +'<td style="font-size:10px;vertical-align:middle">'
6953                                        +'<span class="">'+ getTraductorCuadro(parametros, "Una precisión Baja requiere un uso cauteloso de la estimación en el que se analicen las causas de la alta variabilidad y se consideren otros indicadores de precisión y confiabilidad, como el intervalo de confianza.") +'</span>'
6954                                    +'</td>'
6955                                +'</tr>'
6956                                                            
6957                    }
6958                    // 17-11-2022
6959                    // Para el cuadro 8 siempre y cuando tenga Cobertura
6960                    // Pinta las descripcion de colores fijas bajo las notas
6961                    var oTieneCobertura = oCriteriosCobertura.check(dataValores)
6962                    if(oTieneCobertura != null && parametros.tipoCuadro === "8"){
6963                        var limiteInferior = oTieneCobertura.LIMITE_INFERIOR;
6964                        var limiteSuperior = oTieneCobertura.LIMITE_SUPERIOR;
6965                        borraTabla(tableReglasPrecision);   
6966                        borraTabla(tableReglasPrecisionExportNotas);
6967                        borraTabla(tableReglasPrecisionExport); 
6968                        divReglasPrecisionExport.setAttribute("informacion_extra",1);                    
6969                        tableReglasPrecision.style.borderCollapse = "inherit";
6970                        
6971                        var renglon = tableReglasPrecision.insertRow();
6972                        var cell0 = renglon.insertCell(0);
6973                        cell0.colSpan = 2
6974                        /* cell0.innerHTML = '<tr>'
6975                                +'<td colspan="2" style="font-size:10px;padding:6px 0">'
6976                                    +'<span class="pie">'
6977                                        +'<div>a/ Las estimaciones que aparecen en este cuadro están coloreadas de acuerdo con su nivel de precisión, en Alta, Moderada y Baja, tomando como referencia el coeficie
6977nte de variación CV (%).</div>'
6978                                        +'<div>b/ Intervalo de confianza al 90%.</div>'
6979                                        +'<div><br /></div>'
6980                                    +'</span>'
6981                                +'</td>'
6982                            +'</tr>' */
6983                        cell0.innerHTML = '<tr>'
6984                                +'<td colspan="2" style="font-size:10px;padding:6px 0">'
6985                                    +'<span class="pie">'                                        
6986                                        +'<div>'+ getTraductorCuadro(parametros, "La información que aparece en este cuadro está coloreada de acuerdo con el nivel de cobertura de la variable de diseño (%) usada para seleccionar la muestra, en Alta, Moderada y Baja. Una cobertura Baja requiere un uso cauteloso de la información."); +'</div>'
6987                                        +'<div><br /></div>'
6988                                    +'</span>'
6989                                +'</td>'
6990                            +'</tr>'
6991                        var renglon1 = tableReglasPrecision.insertRow();
6992                        var cell1 = renglon1.insertCell(0);
6993                        cell1.colSpan = 2
6994                        cell1.innerHTML = '<span class="pie">'+ getTraductorCuadro(parametros,"Cobertura de la variable de diseño en el rango de") +':</span>'
6995                        
6996                        var renglon2 = tableReglasPrecision.insertRow();
6997                        var cell12 = renglon2.insertCell(0);                        
6998                        var cell22 = renglon2.insertCell(0); 
6999                        cell22.innerHTML = '<table><tbody><tr><td style="background-color: rgb(255, 255, 255); border: 0.5px solid rgb(220, 220, 220); width: 50px; height: 16px;"></td></tr></tbody></table>'
7000                        cell12.innerHTML = '<span class="pie">&nbsp;&nbsp;'+ getTraductorCuadro(parametros, "Alta") +' (0%, '+ limiteInferior +'%)</span>'
7001                        
7002                        var renglon3 = tableReglasPrecision.insertRow();
7003                        var cell13 = renglon3.insertCell(0);                        
7004                        var cell23 = renglon3.insertCell(0); 
7005                        cell23.innerHTML = '<table><tbody><tr><td style="background-color: rgb(255, 234, 0); border: 0.5px solid rgb(220, 220, 220); width: 50px; height: 16px;"></td></tr></tbody></table>'
7006                        cell13.innerHTML = '<span class="pie">&nbsp;&nbsp;'+ getTraductorCuadro(parametros, "Moderada") +' ('+ limiteInferior +'%, '+ limiteSuperior +'%)</span>'
7007                        
7008                        var renglon4 = tableReglasPrecision.insertRow();
7009                        var cell14 = renglon4.insertCell(0);                        
7010                        var cell24 = renglon4.insertCell(0); 
7011                        cell24.innerHTML = '<table><tbody><tr><td style="background-color: rgb(255, 84, 0); border: 0.5px solid rgb(220, 220, 220); width: 50px; height: 16px;"></td></tr></tbody></table>'
7012                        cell14.innerHTML = '<span class="pie">&nbsp;&nbsp;' + getTraductorCuadro(parametros, "Baja") + ' '+ getTraductorCuadro(parametros, "menor a") +' '+ limiteSuperior +'% '+ getTraductorCuadro(parametros, "en adelante") +'. '+ getTraductorCuadro(parametros, "Una cobertura Baja requiere un uso cauteloso de la información") +'.</span>'
7013
7014                        // Exportacion de la tabla de datos para cobertura
7015
7016                        tableReglasPrecisionExportNotas.innerHTML = '<tr>'
7017                            +'<td colspan="2" style="font-size:10px;padding:6px 0">'
7018                            +'<span class="pie">'
7019                            +'<div>'+ getTraductorCuadro(parametros, "La información que aparece en este cuadro está coloreada de acuerdo con el nivel de cobertura de la variable de diseño (%) usada para seleccionar la muestra, en Alta, Moderada y Baja. Una cobertura Baja requiere un uso cauteloso de la información."); +'</div>'
7020                                +'<div><br /></div>'
7021                            +'</span>'
7022                            +'</td>'
7023                        +'</tr>'
7024
7025                        tableReglasPrecisionExport.setAttribute("informacion_extra","1")
7026                        tableReglasPrecisionExport.setAttribute("border","1")
7027                        tableReglasPrecisionExport.style.width = "60%";
7028                        tableReglasPrecisionExport.innerHTML = '<tr>'
7029                                +'<td style="text-align:center;font-weight:700;font-size:10px">
7029'+ getTraductorCuadro(parametros,"Cobertura de la variable de diseño en el rango de") +'</td>'
7030                                +'<td style="text-align:center;font-weight:700;font-size:10px">'+ getTraductorCuadro(parametros, "Interpretación") + '</td>'
7031                            +'</tr>'
7032                            +'<tr>'
7033                                +'<td style="background-color:#fff;color:#000;width:30%;height:30px;font-size:10px;text-align:center;vertical-align:middle">(0%, '+ limiteInferior +'%)</td>'
7034                                +'<td style="font-size:10px;vertical-align:middle">'
7035                                    +'<span class="">'+ getTraductorCuadro(parametros,"Alta") +'</span>'
7036                                +'</td>'
7037                            +'</tr>'
7038                            +'<tr>'
7039                                +'<td style="background-color:#ffea00;color:#000;width:30%;height:30px;font-size:10px;text-align:center;vertical-align:middle">('+ limiteInferior +'%, '+ limiteSuperior +'%)</td>'
7040                                +'<td style="font-size:10px;vertical-align:middle">'
7041                                    +'<span class="">'+ getTraductorCuadro(parametros,"Moderada") +'</span>'
7042                                +'</td>'
7043                            +'</tr>'
7044                            +'<tr>'
7045                                +'<td style="background-color:#ff5400;color:#000;width:30%;height:100px;font-size:10px;text-align:center;vertical-align:middle">'+ getTraductorCuadro(parametros, "Baja")  +' '+ getTraductorCuadro(parametros, "menor a") +' '+ limiteSuperior +'% '+ getTraductorCuadro(parametros, "en adelante") +'</td>'
7046                                +'<td style="font-size:10px;vertical-align:middle">'
7047                                    +'<span class="">'+ getTraductorCuadro(parametros, "Una cobertura Baja requiere un uso cauteloso de la información")  +'.</span>'
7048                                +'</td>'
7049                            +'</tr>'
7050                    }
7051                    
7052                }
7053                else {
7054                    console.log("error");
7055                    console.log(data);
7056                }
7057                parametros.datos = null;                
7058                if(parametros.callback && typeof parametros.callback == "function"){ parametros.callback(parametros.contenedorCuadro, (this.ValoresCuadro !== undefined? this.ValoresCuadro : {}));}
7059            }
7060            function SiglasTipo7(parametros, listaCifras, data) {
7061                var periodos = data.dimension.periods.category.label || 0;
7062                if ((parametros.tipoCuadro == "7" || parametros.tipoCuadro == "2" || parametros.tipoCuadro == "14" || parametros.tipoCuadro == "17") && listaCifras != null && parametros.grid_configuracion == undefined) {
7063                    if (listaCifras.length > 0) {                        
7064                        if (aCuadrosNuevoMetodoPost.indexOf(parseInt(parametros.tipoCuadro)) === -1) {                            
7065                            // if (parametros.tipoCuadro == "7") {
7066                            if (periodos.length > 1) { // si llegaron mas de 1 periodo desde valorindicador
7067                                var letra = "";
7068                                var elements = document.getElementById("tableStat" + parametros.contenedorCuadro).tHead.children[0].children;
7069                                var letraTmp = "";
7070                                if (elements.length > 2) { // la primer columna no cuenta
7071                                    for (var x = 0; x < elements.length; x++) {
7072                                        var th = elements[x];
7073                                        for (var y = 0; y < listaCifras.length; y++) {
7074                                            if (listaCifras[y].periodos == th.innerHTML) {
7075                                                letraTmp = "<sup>" + listaCifras[y].letra.replace("/", "") + "</sup>";
7076                                            }
7077                                        }
7078                                        th.innerHTML = th.innerHTML + " " + letraTmp;
7079                                    }
7080                                }
7081                            }
7082                        } else { // aplicar siglas con el nuevo formato en datos del api MetadatoIndicador/                   
7083                            if (parametros.tipoCuadro === "14") {
7084                                if (periodos.length > 1) { // si llegaron mas de 1 periodo desde valorindicador
7085                                    var letra = ""; // ultima modificacion 21 ago 2018 (pintado de letras cuados 2 y 7 (sin extjs))
7086                                    //var elements = document.getElementById("tableStat" + parametros.contenedorCuadro).tHead.children[].children;
7087                                    var elements = $("#tableStat" + parametros.contenedorCuadro).prev().find("table thead").children().eq(1).children();
7088                                    var row = $("#tableStat" + parametros.contenedorCuadro + " tbody").children().eq(0).children();
7089                                    //console.log(row[0].innerHTML);
7090                                    var letraTmp = "", letraTmp2 = "", c = 0, html = "";
7091                                    
7092                                    if (elements.length > 2) { // la primer columna no cuenta
7093                                        for (var x = 0; x < elements.length; x++) {
7094                                            var th = elements[x];
7095                                            var mes = th.innerHTML;
7096                                            c = x;
7097                                            html = th.innerHTML.indexOf("-") > -1 ? th.innerHTML.split("-").join("<br />") : th.innerHTML;
7098                                            letraPrev = "";
7099                                            //console.log(listaCifras)
7100                                            for (var y = 0; y < listaCifras.length; y++) {
7101                                                if (row[c + 1].innerHTML != " ") {
7102                                                    if (listaCifras[y].periodos.split(" ")[1] === mes || mes.indexOf("-") > -1) {
7103                                                        letraTmp = '<sup style="display:inline-block;font-size:9px;">' + listaCifras[y].letra.replace("/", "") + "</sup>";
7104                                                        if (listaCifras[y].letra === "D") {
7105                                                            letraTmp = "";
7106                                                        }
7107                                                    }
7108                                                } else {
7109                                                    letraTmp = "";
7110                                                }
7111                                            }
7112                                            th.innerHTML = '<div style="white-space:nowrap;">' + html + letraTmp + '</div>';
7113                                        }
7114                                    }
7115                                }
7116                            } else {
7117                                
7118                                if (periodos.length > 1) { // si llegaron mas de 1 periodo desde valorindicador                                                                       
7119                                    var frecuencia = data.dimension.freq.category.label[0].Value;
7120                                    var letra = ""; // ultima modificacion 21 ago 2018 (pintado de letras cuados 2 y 7 (sin extjs))
7121                                    var elements = null;
7122                                    if (frecuencia === "Anual" || frecuencia === "No establecida" || frecuencia === "Annual" || frecuencia === "Not established") {
7123                                        if (document.getElementById("tableStat" + parametros.contenedorCuadro).tHead !== null) {
7124                                            elements = document.getElementById("tableStat" + parametros.contenedorCuadro).tHead.children[0].children;
7125                                        } else {
7126                                            elements = document.getElementById("tableStat" + parametros.contenedorCuadro).children[0].children[1];
7127                                        }
7128                                        
7129                                    } else if (frecuencia === "Trimestral" || frecuencia === "Mensual" || frecuencia === "Monthly" || frecuencia === "Quarterly") {                                        
7130                                        if (document.getElementById("tableStat" + parametros.contenedorCuadro).tHead !== null) {
7131                                            elements = document.getElementById("tableStat" + parametros.contenedorCuadro).tHead.children[1].children;
7132                                        } else {
7133                                            elements = document.getElementById("tableStat" + parametros.contenedorCuadro).children[0].children[1];
7134                                            
7135                                        }                                        
7136                                        
7137                                    } else if (frecuencia === "Bienal" || frecuencia == "Biennial") {
7138                                        elements = document.getElementById("tableStat" + parametros.contenedorCuadro).tBodies[0].children;
7139                                    }
7140                                    var letraTmp = "";
7141                                    if (elements && elements.length > 2 && (frecuencia !== "Bienal" || frecuencia != "Biennial")) { // la primer columna no cuenta
7142                                        for (var x = 0; x < elements.length; x++) {
7143                                            var th = elements[x];
7144                                            
7145                                            for (var y = 0; y < listaCifras.length; y++) {
7146                                                //console.log(listaCifras[y].periodos + " === " + th.getAttribute("data-periodo"))
7147                                                if (listaCifras[y].periodo_corto === th.getAttribute("data-periodo") || listaCifras[y].periodo_corto === th.innerHTML) {
7148                                                    if (listaCifras[y].letra !== "D") {
7149                                                        letraTmp = "<sup>" + listaCifras[y].letra.replace("/", "") + "</sup>";
7150                                                    } else letraTmp = "";
7151                                                }
7152                                            }
7153                                            th.innerHTML = th.innerHTML + " " + letraTmp;
7154                                        }
7155                                    } else if (frecuencia === "Bienal" || frecuencia == "Biennial") { // por el momento solo aplica para la frecuencia Bienal (17.10.2018)                                 
7156                                        var elem = elements[1].children;
7157                                        for (var x = 0; x < elem.length; x++) {
7158                                            var th = elem[x];
7159                                            for (var y = 0; y < listaCifras.length; y++) {
7160                                                if (th.innerHTML.indexOf(listaCifras[y].periodo_corto) > -1) {
7161                                                    if (listaCifras[y].letra !== "D") {
7162                                                        th.innerHTML += "<sup>" + listaCifras[y].letra.replace("/", "") + "</sup>";
7163                                                    }
7164                                                }
7165                                            }
7166                                        }
7167                                    } else if (frecuencia === "Trimestral" || frecuencia === "Quarterly") { // por el momento solo aplica para la frecuencia Bienal (17.10.2018)    
7168                                        var elem = elements.children;
7169                                        // console.log(elem);
7170                                        for (var x = 0; x < elem.length; x++) {
7171                                            var th = elem[x];
7172                                            for (var y = 0; y < listaCifras.length; y++) {
7173                                                // console.log(listaCifras[y].periodo_corto +" === "+ th.getAttribute("data-periodo") +"||"+ listaCifras[y].periodo_corto +"==="+ th.innerHTML)
7174                                                if (listaCifras[y].periodo_corto === th.getAttribute("data-periodo") || listaCifras[y].periodo_corto === th.innerHTML) {
7175                                                    if (listaCifras[y].letra !== "D") {
7176                                                        if(th.innerHTML.indexOf("<sup>") == -1){
7177                                                            letraTmp = "<sup>" + listaCifras[y].letra.replace("/", "") + "</sup>";
7178                                                        }
7179                                                    } else letraTmp = "";
7180                                                }
7181                                            }
7182                                            th.innerHTML = th.innerHTML + " " + letraTmp;
7183                                        }
7184                                    }
7185                                }
7186                            }
7187                        }
7188                    }
7189                }
7190            }
7191            // Borra tablas de fuentes, notas y cifras
7192            function borraTabla(table) {
7193                if (table != undefined)
7194                while (table.rows.length > 0) {
7195                    table.deleteRow(0);
7196                }
7197            }
7198            
7199            /// <summary>   Genera siglas del caso compuesto </summary>
7200            ///
7201            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
7202            ///
7203            /// <param name="parametros">       Objeto de parametros de configuracion. </param>
7204            ///
7205            /// <returns>   . </returns>
7206            function SiglasGrupoA(parametros) {
7207                var indicadorTipo = parametros.indicator.charAt(0);
7208                if (indicadorTipo == "b" && parametros.tipoCuadro == "1") {
7209                    
7210                    var contarGrupos = 0;
7211                    var contarIndices = 0;
7212                    $.each(parametros.indicadorValorCompuesto.grupos, function (key, valGroup) {
7213                        contarGrupos++;
7214                        if (valGroup.titulo.indexOf("/a") > -1) {
7215                            document.getElementById("tdTituloGrupo" + contarIndices).innerHTML = "<b>" + valGroup.titulo.replace("/a", "") + "</b>";
7216                            contarIndices++;
7217                        }
7218                    });
7219                    //if (contarIndices == contarGrupos)
7220                    //    PintaSiglaEnEncabezado(parametros.tipoCuadro, "a", "");
7221                }
7222            }
7223            
7224            /// <summary>   Pinta notas y coloca siglas en cabeceras. </summary>
7225            ///
7226            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
7227            ///
7228            /// <param name="tipoCuadro">                       Tipo de cuadro. </param>
7229            /// <param name="listaNotasPorIndicador">           Lista de notas por indicador. </param>
7230            /// <param name="todosLosIndicadoresPorParametro">  Parametro de indicadores sin descripciones. </param>
7231            /// <param name="pintarEnCabecera">                 Mostrar en la cabecera. </param>
7232            /// <param name="indicadorTipo">                    Tipo de indicador (normal o compuesto). </param>
7233            ///
7234            /// <returns>   . </returns>
7235            function PintaNotaUnIndicador(tipoCuadro, listaNotasPorIndicador, todosLosIndicadoresPorParametro, pintarEnCabecera, indicadorTipo) {
7236                pintarEnCabecera = true;
7237                //var indicadorTipo = todosLosIndicadoresPorParametro.charAt(0);
7238                if (tipoCuadro == "1" && indicadorTipo != "b") {
7239                    var listaNotas = [];
7240                    var indicadoresConNota = "";
7241                    if (listaNotasPorIndicador != undefined && listaNotasPorIndicador != null) {
7242                        for (var i = 0; i < listaNotasPorIndicador.length; i++) {
7243                            if (indicadoresConNota.indexOf(listaNotasPorIndicador[i].INDICADOR) == -1) {
7244                                if (i > 0)
7245                                indicadoresConNota += ",";
7246                                indicadoresConNota += listaNotasPorIndicador[i].INDICADOR;
7247                            }
7248                        }
7249                        if (indicadoresConNota.split(",").length != todosLosIndicadoresPorParametro.split(",").length && indicadoresConNota != "") {
7250                            pintarEnCabecera = false;
7251                            for (var i = 0; i < listaNotasPorIndicador.length; i++) {
7252                                PintaSiglaEnRenglon(tipoCuadro, listaNotasPorIndicador[i].SIGLA, listaNotasPorIndicador[i].INDICADOR);
7253                            }
7254                        }
7255                    }
7256                    
7257                }
7258                return pintarEnCabecera;
7259            }
7260            
7261            /// <summary>   Coloca siglas junto a descpripcion del renglon. </summary>
7262            ///
7263            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
7264            ///
7265            /// <param name="tipoCuadro">   Tipo de cuadro. </param>
7266            /// <param name="sigla">        Valor de sigla. </param>
7267            /// <param name="indicador">    Clave de indicador. </param>
7268            ///
7269            /// <returns>   . </returns>
7270            function PintaSiglaEnRenglon(tipoCuadro, sigla, indicador) {
7271                var indicadorTipo = indicador.charAt(0);
7272                if (tipoCuadro == "1") {
7273                    //columnaTituloSuperior
7274                    var columnaTitulo = document.getElementById("td_indicador_" + indicador);
7275                    columnaTitulo.innerHTML += " <sup>/" + sigla + "</sup> ";
7276                }
7277                
7278                
7279            }
7280            
7281            /// <summary>   Pinta sigla en la descripcion de la columna. </summary>
7282            ///
7283            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
7284            ///
7285            /// <param name="tipoCuadro">   Tipo de cuadro. </param>
7286            /// <param name="sigla">        Valor de sigla. </param>
7287            /// <param name="indicador">    Clave de indicador. </param>
7288            ///
7289            /// <returns>   . </returns>
7290            function PintaSiglaEnEncabezado(tipoCuadro, sigla, indicador) {
7291                if (tipoCuadro == "1") {
7292                    //columnaTituloSuperior
7293                    var columnaTitulo = document.getElementById("columnaTituloSuperior");
7294                    columnaTitulo.innerHTML += " <sup>/" + sigla + "</sup> ";
7295                }
7296                if (tipoCuadro == "3") {
7297                    var columnaTitulo = document.getElementById("columnaIndicador_I_" + indicador);
7298                    if (columnaTitulo != undefined)
7299                    columnaTitulo.innerHTML += " /" + sigla;
7300                }
7301                
7302            }
7303            
7304            /// <summary>   Separa la tabla dinamicamente en un header y tbody para que se ajuste a estilos que manejan 
7305            ///             este formato de tabla. </summary>
7306            ///
7307            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
7308            ///
7309            /// <param name="tablaInterna"> Valor del cuerpo de la tabla. </param>
7310            /// <param name="parametros">   Objeto de parametros de configuracion. </param>
7311            ///
7312            /// <returns>   . </returns>
7313            function ReemplazaTabla(tablaInterna, parametros) {
7314                var tableStat = document.getElementById("tableStat" + parametros.contenedorCuadro);
7315                var div = document.createElement("div");
7316                var primerBody = document.getElementById("dummyBody" + parametros.contenedorCuadro);
7317                tableStat.removeChild(primerBody);
7318                div.innerHTML = "<table><tbody>" + tablaInterna + "</tbody></table>";
7319                tableStat.appendChild(div.firstChild.tBodies[0]);
7320                if (parametros.estiloCuadro == "2") {
7321                    tableStat.className = tableStat.className + "estiloCuadro2";
7322                }
7323            }
7324            // para el caso 3
7325            function ReemplazaTabla2018(headerTabla, tablaInterna, parametros) {
7326                var tableStat = document.getElementById("tableStat" + parametros.contenedorCuadro);
7327                var div = document.createElement("div");
7328                var div2 = document.createElement("div");
7329                var primerBody = document.getElementById("dummyBody" + parametros.contenedorCuadro);
7330                tableStat.removeChild(primerBody);
7331                div.innerHTML = "<table><tbody>" + tablaInterna + "</tbody></table>";
7332                div2.innerHTML = "<table><thead>" + headerTabla + "</thead></table>";
7333                tableStat.appendChild(div2.firstChild.tHead);
7334                tableStat.appendChild(div.firstChild.tBodies[0]);
7335                if (parametros.estiloCuadro == "2") {
7336                    tableStat.className = tableStat.className + "estiloCuadro2";
7337                }
7338            }
7339            
7340            // reemplaza tabla v2: cuadros sin header y tbody
7341            function ReemplazaTablav2(tablaInterna, parametros) {
7342                var tableStat = document.getElementById("tableStat" + parametros.contenedorCuadro);
7343                var div = document.createElement("div");
7344                var primerBody = document.getElementById("dummyBody" + parametros.contenedorCuadro);
7345                tableStat.removeChild(primerBody);
7346                div.innerHTML = "<table>" + tablaInterna + "</table>";
7347                tableStat.appendChild(div.firstChild);
7348                //tableStat.appendChild(div.firstChild.tBodies[0]);        
7349                if (parametros.estiloCuadro == "2") {
7350                    tableStat.className = tableStat.className + "estiloCuadro2";
7351                }
7352            }
7353            
7354            /// <summary>   Separa la tabla dinamicamente en un header personalizado y tbody para que se ajuste a estilos que manejan 
7355            ///             este formato de tabla. </summary>
7356            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
7357            ///
7358            /// <param name="tablaInterna"> Valor del cuerpo de la tabla. </param>
7359            /// <param name="headerTabla">  Valor del header de la tabla. </param>
7360            /// <param name="parametros">   Objeto de parametros de configuracion. </param>
7361            ///
7362            /// <returns>   . </returns>
7363            function ReemplazaTablaConEncabezado(tablaInterna, headerTabla, parametros) {
7364                var tableStat = document.getElementById("tableStat" + parametros.contenedorCuadro);
7365                var div = document.createElement("div");
7366                var div2 = document.createElement("div");
7367                var primerBody = document.getElementById("dummyBody" + parametros.contenedorCuadro);
7368                tableStat.removeChild(primerBody);
7369                var primerHeader = document.getElementById("dummyHeader" + parametros.contenedorCuadro)
7370                tableStat.removeChild(primerHeader);
7371                div.innerHTML = "<table><tbody>" + tablaInterna + "</tbody></table>";
7372                div2.innerHTML = "<table><thead>" + headerTabla + "</thead></table>";
7373                // div.innerHTML = "<table><thead>"+headerTabla+"</thead><tbody>" + tablaInterna + "</tbody></table>";
7374                tableStat.appendChild(div2.firstChild.tHead);
7375                tableStat.appendChild(div.firstChild.tBodies[0]);
7376                if (parametros.estiloCuadro == "2" || parametros.estiloCuadro == "7") {
7377                    tableStat.className = tableStat.className + "estiloCuadro2";
7378                }
7379                //if (parametros.tipoCuadro == "7" || parametros.tipoCuadro == "14" || parametros.tipoCuadro == "6") {
7380                if (parametros.tipoCuadro == "14") {
7381                    //tableStat.className = tableStat.className + " stickTable";
7382                    tableStat.className = tableStat.className + " sticky-header";
7383                }
7384                //console.log(tableStat);
7385                /**
7386                *   Omite valores cero en series, solo para cuadros tipo 6 (mejora 30/oct/2017)
7387                */
7388                if (parametros.omitevalorseriecero == "true" && parametros.tipoCuadro == "6") {
7389                    $("#tableStatc1").find("tbody").eq(0).children().each(function (e) {
7390                        if ($(this).children().eq(1).attr("remove")) {
7391                            $(this).children().eq(1).parent().remove();
7392                        }
7393                    });
7394                }
7395            }
7396            
7397            /// <summary>   Genera tableado de renglones en blanco y gris. </summary>
7398            ///
7399            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
7400            ///
7401            /// <param name="indice">   Indice del renglon. </param>
7402            ///
7403            /// <returns>   . </returns>
7404            function ColorRenglon(indice) {
7405                var bgColor = "white";
7406                if (indice % 2 == 0) {
7407                    bgColor = "#EFEFEF";
7408                }
7409                return bgColor;
7410            }
7411            
7412            /// <summary>   Coloca identacion y negrita en tabla de indicadores compuestos </summary>
7413            ///
7414            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
7415            ///
7416            /// <param name="boldAbrir">    Abre etiqueta de negrita. </param>
7417            /// <param name="boldCerrar">   Cierra etiqueta de negrita. </param>
7418            /// <param name="indicadorObj"> Objeto de grupo de indicadores. </param>
7419            /// <param name="bgColor">      Color de fondo. </param>
7420            /// <param name="espacio">      Espacio de identacion. </param>
7421            ///
7422            /// <returns>   . </returns>
7423            function PintaRenglonTablaGrupos(boldAbrir, boldCerrar, indicadorObj, bgColor, espacio) {
7424                var renglones = "";
7425                var padd = 0;
7426                if (espacio != "")
7427                padd = 1;
7428                //renglones += '<tr><td class="TdInicio"  >' + boldAbrir + espacio + indicadorObj.descripcion + boldCerrar + '</td>';
7429                renglones += '<tr><td class="TdInicio"  ><div  style="padding-left:' + IndentacionPadding(padd) + 'px;">' + boldAbrir + indicadorObj.descripcion + boldCerrar + '</div></td>';
7430                
7431                //var listaTitulos = titulosCol.split(",");
7432                
7433                $.each(indicadorObj.valoresIndicador, function (key, val) {
7434                    var valorRenglon = val;
7435                    //if (listaTitulos[contadorTitulos] != undefined)
7436                    //    valorRenglon = listaTitulos[contadorTitulos];
7437                    renglones += '<td  class="Td"  >' + boldAbrir + valorRenglon + boldCerrar + '</td>';
7438                });
7439                renglones += "</tr>";
7440                return renglones;
7441            }
7442            
7443            /// <summary>   Coloca identacion y negrita en tabla de indicadores compuestos tipo B</summary>
7444            ///
7445            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
7446            ///
7447            /// <param name="boldAbrir">    Abre etiqueta de negrita. </param>
7448            /// <param name="boldCerrar">   Cierra etiqueta de negrita. </param>
7449            /// <param name="indicadorObj"> Objeto de grupo de indicadores. </param>
7450            /// <param name="bgColor">      Color de fondo. </param>
7451            /// <param name="parametros">   Objeto de parametros de configuracion. </param>
7452            ///
7453            /// <returns>   . </returns>
7454            function PintaRenglonTablaGruposB(boldAbrir, boldCerrar, indicadorObj, bgColor, parametros) {
7455                var renglones = "";
7456                
7457                $.each(indicadorObj.valoresIndicador, function (key, val) {
7458                    
7459                    renglones += '<td  class="Td"  >' + boldAbrir + val + boldCerrar + '</td>';
7460                });
7461                
7462                return renglones;
7463            }
7464            
7465            /// <summary>   Dibuja renglones del cuadro. </summary>
7466            ///
7467            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
7468            ///
7469            /// <param name="data">         Valores de indicadores en formato JSON. </param>
7470            /// <param name="parametros">   Objeto de parametros de configuracion. </param>
7471            ///
7472            /// <returns>   . </returns>
7473            function DibujaCuadro(data, parametros) {
7474                var CellHeaderTitle = document.getElementById("CellHeaderTitle" + parametros.contenedorCuadro);
7475                CellHeaderTitle.innerText = data.label;
7476                //  var tableStat = document.getElementById("tableStat"+ parametros.contenedorCuadro);
7477                var tablaInterna = "";
7478                var arrayLenght = data.length;
7479                
7480                var cabeceras = '<tr><th class ="Th" bgcolor="#DDD" >' + data.dimension.indicator.label + '</td>';
7481                
7482                var arrayPeriodos = data.dimension.periods.category.label;
7483                $.each(arrayPeriodos, function (key, val) {
7484                    cabeceras += '<th class ="Th" bgcolor="#DDD" >' + val.Value + '</td>';
7485                });
7486                cabeceras += "</tr>";
7487                tablaInterna += cabeceras;
7488                var datos = data.value;
7489                var indexValue = 0;
7490                var renglones = "";
7491                var arrayIndicadores = data.dimension.indicator.category.label;
7492                
7493                for (var i = 0; i < arrayIndicadores.length; i++) {
7494                    var bgColor = "white";
7495                    if (i % 2 == 0) {
7496                        var bgColor = "#EFEFEF";
7497                    }
7498                    renglones += '<tr><td class="TdInicio"  >' + arrayIndicadores[i].Value + '</td>';
7499                    
7500                    $.each(arrayPeriodos, function (key, val) {
7501                        renglones += '<td  class="Td"  >' + datos[indexValue] + '</td>';
7502                        indexValue++;
7503                    });
7504                    
7505                    renglones += '</tr>';
7506                }
7507                
7508                tablaInterna += renglones;
7509                ReemplazaTabla(tablaInterna, parametros);
7510            }
7511            
7512            /// <summary>   Dibuja cuadro tipo trimestre. </summary>
7513            ///
7514            /// <remarks>   ARMANDO.ORTIZV, 24/11/2016. </remarks>
7515            ///
7516            /// <param name="data">         Valores de indicadores en formato JSON. </param>
7517            /// <param name="parametros">   Objeto de parametros de configuracion. </param>
7518            ///
7519            /// <returns>   . </returns>
7520            function DibujaCuadroTipoTrimestre(data, parametros) {
7521                var CellHeaderTitle = document.getElementById("CellHeaderTitle" + parametros.contenedorCuadro);
7522                CellHeaderTitle.innerText = data.label;
7523                //var tableStat = document.getElementById("tableStat"+ parametros.contenedorCuadro);
7524                //tableStat.style.width = "100%";
7525                var tablaInterna = "";
7526                var arrayLenght = data.length;
7527                
7528                var contadorcolumnas = 1;
7529                var indexValue = 0;
7530                var saltoPeriodos = data.dimension.periods.category.label.length;
7531                var arrayPeriodos = data.dimension.periods.category.label;
7532                var subPeriodos = [];
7533                var listaAnios = [];
7534                $.each(arrayPeriodos, function (key, val) {
7535                    var subperiodo = parseFloat(val.Value.toString().split("/")[1]);
7536                    if (subPeriodos.indexOf(subperiodo) < 0)
7537                    subPeriodos.push(subperiodo);
7538                    var periodoAnio = val.Value.toString().split("/")[0];
7539                    if (listaAnios.indexOf(periodoAnio) < 0) {
7540                        listaAnios.push(periodoAnio);
7541                    }
7542                });
7543                
7544                var cabeceras = DibujaCabecera(data.dimension.indicator.label, subPeriodos.length, 2, parametros.contenedorCuadro);
7545                
7546                
7547                var cantidadSubperiodos = Math.max.apply(Math, subPeriodos);
7548                
7549                $.each(subPeriodos, function (key, val) {
7550                    cabeceras += '<th class ="Th" bgcolor="#DDD" >' + val + '</th>';
7551                    contadorcolumnas++;
7552                    indexValue++;
7553                });
7554                
7555                cabeceras += "</tr>";
7556                tablaInterna += cabeceras;
7557                
7558                var datos = data.value;
7559                indexValue = 0;
7560                var renglones = "";
7561                var arrayIndicadores = data.dimension.indicator.category.label;
7562                
7563                contadorcolumnas = 0;
7564                var columnaActual = contadorcolumnas;
7565                
7566                for (var i = 0; i < arrayPeriodos.length; i++) {
7567                    var bgColor = ColorRenglon(contadorcolumnas);
7568                    
7569                    if (i == 0)
7570                    renglones += '<tr>' + '<td class="TdInicio"  >' + listaAnios[contadorcolumnas++] + '</td>';
7571                    
7572                    if (i % cantidadSubperiodos == 0 && i != 0)
7573                    renglones += '</tr><tr>' + '<td class="TdInicio"  >' + listaAnios[contadorcolumnas++] + '</td>';
7574                    
7575                    bgColor = ColorRenglon(contadorcolumnas - 1);
7576                    renglones += '<td class="Td"  >' + datos[i] + '</td>';
7577                    
7578                }
7579                renglones += "</tr>";
7580                
7581                tablaInterna += renglones;
7582                ReemplazaTabla(tablaInterna, parametros);
7583            }
7584            
7585            /*===========================================================
7586            =            CUADRO #2 GRID EXTJS - 21 Marzo 2018           =
7587            ===========================================================*/
7588            function DibujaCuadroTipo2_New(data, parametros) {
7589                // var aMeses = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', '
7589Septiembre', 'Octubre', 'Noviembre', 'Diciembre'];
7590                var aDataPeriodos = data.dimension.periods.category; // contiene => [label, index]
7591                var aDataIndicadores = data.dimension.indicator.category; // contiene => [label, index]
7592                var aDataAreas = data.dimension.state.category; // contiene => [label, index]
7593                var aValores = data.value;
7594                var datos_tabla = [], columnas_tabla = []; // datos renglones
7595                var totalColumnasPeriodos = (aDataIndicadores.label.length * aDataPeriodos.label.length); // total de columnas totales que se generaran
7596                var aCifrasEstatus = data.CIFRAS_ESTATUS;
7597                var titulosEcabezados = parametros.titulosColumnas;
7598                // Columna1 principal 
7599                var contColumna = 0;
7600                columnas_tabla.push({
7601                    title: (parametros.tituloColumnaPrincipal !== "") ? parametros.tituloColumnaPrincipal : "Entidades Federativas",
7602                    width: 250,
7603                    dataIndex: "col" + contColumna,
7604                    fix: false,
7605                    renderer: true
7606                });
7607                contColumna++;
7608                // Columnas indicadores y columnas  (subcolumnas ) periodos 
7609                $.each(aDataIndicadores.label, function (idx, indicador) {
7610                    var nTitulo = "";
7611                    var titulo = "";
7612                    if (titulosEcabezados === "") {
7613                        titulo = indicador.Value;
7614                    } else {
7615                        var aTitulosEncabezados = titulosEcabezados.split(",");
7616                        
7617                        titulo = aTitulosEncabezados[idx];
7618                    }
7619                    var lenString = titulo.length;
7620                    var totalSpaces = titulo.split(" ").length - 1;
7621                    var aString = titulo.split(" ");
7622                    // if (lenString > 40) {
7623                    for (var s = 0; s < aString.length; s++) {
7624                        var salto = " ";
7625                        if (s == Math.floor(totalSpaces / 2)) { salto = "<br />" }
7626                        nTitulo += salto + aString[s];
7627                    }
7628                    
7629                    //} else {
7630                    //  nTitulo = indicador.Value;
7631                    //}
7632                    
7633                    var oColumna = {
7634                        title: nTitulo,
7635                        width: 160,
7636                        dataIndex: "col" + contColumna,
7637                        fix: false,
7638                        ind: indicador.Key.split("I_")[1],
7639                        renderer: true
7640                    };
7641                    var oSubColumnas = [];
7642                    $.each(aDataPeriodos.label, function (idx2, periodo) {
7643                        oSubColumnas.push({
7644                            title: periodo.Value,
7645                            width: 150,
7646                            dataIndex: "scol" + contColumna,
7647                            subColumns: []
7648                        });
7649                        contColumna++;
7650                    });
7651                    oColumna.subColumns = oSubColumnas;
7652                    columnas_tabla.push(oColumna);
7653                });
7654                // Mostrar cifra estatus de un periodo especifico ------------------ mce = mostrarCifraEstatus
7655                if (parametros.mostrarCifraEstatus === "true") {
7656                    var tmpPeriodo = "0";
7657                    $.each(columnas_tabla, function (index, col) {
7658                        var indicador = col.ind;
7659                        if (indicador !== undefined) {
7660                            var existenCifrasIndicador = aCifrasEstatus.filter(function (cifra) {
7661                                return cifra.indicadores.indexOf(indicador) !== -1;
7662                            });
7663                            // si encontro cifras estatus para el indicador
7664                            if (existenCifrasIndicador.length > 0) {
7665                                var tCI = existenCifrasIndicador.length - 1;
7666                                if (col.subColumns && col.subColumns.length > 0) {
7667                                    //console.log("> DEMO")
7668                                    $.each(col.subColumns, function (idx, scol) {
7669                                        // verifica si el periodo se encuentra en las cifras estatus  (si es igual o mayor al de metadato cifras estatus)
7670                                        if (aCuadrosNuevoMetodoPost.indexOf(parseInt(parametros.tipoCuadro)) > -1) {
7671                                            var existenCifraPeriodo = aCifrasEstatus.filter(function (cifra) {
7672                                                return cifra.periodo_corto.indexOf(scol.title) > -1;
7673                                            });
7674                                            if (existenCifraPeriodo.length > 0) {
7675                                                if (existenCifraPeriodo[0].letra !== null) {
7676                                                    columnas_tabla[index].subColumns[idx].title = scol.title + "<sup>" + existenCifraPeriodo[0].letra.replace("/", "") + "</sup>";
7677                                                } else {
7678                                                    columnas_tabla[index].subColumns[idx].title = scol.title;
7679                                                }
7680                                            }
7681                                        } else {
7682                                            var existenCifraPeriodo = aCifrasEstatus.filter(function (cifra) {
7683                                                return cifra.periodos.indexOf(scol.title) > -1;
7684                                            });
7685                                            if (existenCifraPeriodo.length > 0) {
7686                                                if (existenCifraPeriodo[0].letra !== null) {
7687                                                    columnas_tabla[index].subColumns[idx].title = scol.title + "<sup>" + existenCifraPeriodo[0].letra.replace("/", "") + "</sup>";
7688                                                } else {
7689                                                    columnas_tabla[index].subColumns[idx].title = scol.title;
7690                                                }
7691                                            }
7692                                        }
7693                                    });
7694                                }
7695                            }
7696                        }
7697                    });
7698                }
7699                /// Llenado de renglones  
7700                var totalValores = aValores.length;
7701                $.each(aDataAreas.label, function (index, area) {
7702                    var oRenglon = {};
7703                    $.extend(oRenglon, JSON.parse('{"col0":"' + area.Value.split("-")[0] + '"}'));
7704                    for (var i = 0; i < totalColumnasPeriodos; i++) {
7705                        var indexValue = i + totalColumnasPeriodos * index;
7706                        //console.log("i:" + i + "  area:" + index, " => ", indexValue + " ( " + aValores[indexValue] + ")");
7707                        $.extend(oRenglon, JSON.parse('{"scol' + (i + 1) + '":"' + aValores[indexValue] + '"}'));
7708                    }
7709                    datos_tabla.push(oRenglon);
7710                });
7711                
7712                //Recibir configuracion de altura y estilos del grid 
7713                var TABLA = new GridComponent();
7714                TABLA.render(columnas_tabla, datos_tabla, parametros);
7715            }
7716            
7717            /*===========================================================
7718            =            CUADRO #7 GRID EXTJS - 6 Octubre 2017            =
7719            ===========================================================*/
7720            function DibujaCuadroTipo7_New(data, parametros) {
7721                //var aMeses = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', '
7721Septiembre', 'Octubre', 'Noviembre', 'Diciembre'];
7722                var tablaInterna = "";
7723                var cabeceras = "";
7724                var arrayPeriodos = data.dimension.periods.category.label;
7725                var frecuencia = data.dimension.freq.category.label[0].Value;
7726                var aCifras = data.CIFRAS_ESTATUS;
7727                
7728                //nuevos metodos de extraccion para columnas        
7729                $.each(arrayPeriodos, function (key, periodo) {
7730                    var anio = periodo.Value.split("/");
7731                    arrayPeriodos[key].a = anio[0];
7732                    if (anio[1] !== undefined) { // si no existe el mes o la posicion 1 en el arreglo de peridos
7733                        arrayPeriodos[key].m = anio[1];
7734                    }
7735                });
7736                
7737                var listaAnios = [];
7738                $.each(arrayPeriodos, function (key, item) {
7739                    if (listaAnios.indexOf(item.a) == -1) {
7740                        listaAnios.push(item.a);
7741                    }
7742                });
7743                
7744                var listaPeriodosObj = [];
7745                $.each(listaAnios, function (key, anio) {
7746                    var objPer = { a: anio, meses: [] };
7747                    $.each(arrayPeriodos, function (keyp, periodo) {
7748                        if (objPer.a == periodo.a && periodo.m !== undefined) {
7749                            objPer.meses.push(periodo);
7750                        }
7751                    });
7752                    listaPeriodosObj.push(objPer);
7753                });
7754                
7755                //ARMADO DE COLUMNAS DEL GRID /////////////////////////////////////////////////////////////////
7756                //COLUMNA PRINCIPAL
7757                var columnas_tabla = [];
7758                var aDataIndexesColumnasPrincipal = ["first", "second", "third"];
7759                var aTitulosColumnas = parametros.titulosColumnas != "" ? parametros.titulosColumnas.split(",") : [];
7760                
7761                if (parametros.tituloColumnaPrincipal.indexOf("|") != -1 && parametros.tituloColumnaPrincipal !== "") { // si se encuentra un pipe |, hay mas de una columna
7762                    var aColumnasPrincipal = parametros.tituloColumnaPrincipal.split("|");
7763                    var totalColumnasPrincipal = aColumnasPrincipal.length;
7764                    
7765                    for (var x = 0; x < totalColumnasPrincipal; x++) {
7766                        columnas_tabla.push({
7767                            title: aColumnasPrincipal[x],
7768                            width: 250,
7769                            dataIndex: aDataIndexesColumnasPrincipal[x],
7770                            fix: false,
7771                            renderer: true
7772                        });
7773                    }
7774                } else { // si llega vacio o no llega por default es una columna fija
7775                    
7776                    columnas_tabla.push({
7777                        title: (parametros.tituloColumnaPrincipal == "") ? "Denominaci&oacute;n" : parametros.tituloColumnaPrincipal,
7778                        width: 250,
7779                        dataIndex: 'first',
7780                        fix: false,
7781                    });
7782                }
7783                
7784                // COLUMNAS SECUNDARIAS Y AGRUPACIONES                
7785                $.each(listaPeriodosObj, function (key, periodo) {
7786                    //add column nivel 1
7787                    var defColumna = {
7788                        title: periodo.a,
7789                        dataIndex: periodo.a,
7790                        subColumns: []
7791                    }
7792                    var totalChildren = periodo.meses ? periodo.meses.length : 0;
7793                    if (totalChildren > 0) {
7794                        var columnasChildren = periodo.meses;
7795                        var letraTmp = "";
7796                        $.each(columnasChildren, function (keym, mes) {
7797                            var titleCol = "";
7798                            if (aTitulosColumnas.length > 0) {
7799                                titleCol = aTitulosColumnas[keym];
7800                            } else {
7801                                // titleCol = aMeses[parseInt(mes.m) - 1];
7802                                titleCol = oMESES.getFormatoPeriodo(mes.Value, frecuencia, parametros.idioma, 2);
7803                                if (aCifras.length > 0) {
7804                                    for (var c = 0; c < aCifras.length; c++) {
7805                                        if (aCifras[c].periodo_corto === mes.Value) {
7806                                            if (aCifras[c].letra !== "D") {
7807                                                letraTmp = aCifras[c].letra;
7808                                            } else letraTmp = "";
7809                                        }
7810                                    }
7811                                    titleCol = titleCol + "<sup>" + letraTmp + "</sup>";
7812                                }
7813                            }
7814                            defColumna.subColumns.push({
7815                                title: titleCol,
7816                                width: 150,
7817                                dataIndex: mes.Key + '_' + mes.a,
7818                                subColumns: []
7819                            });
7820                        });
7821                    }
7822                    columnas_tabla.push(defColumna);
7823                });
7824                
7825                // arrayIndicadores y parametros.indicadorValorCompuesto.grupos
7826                var arrayIndicadores = data.dimension.indicator.category.label;
7827                var saltoPeriodos = arrayPeriodos.length;
7828                var arrIndicadoresFinales = [];
7829                $.each(arrayIndicadores, function (key, item) {
7830                    var indicador_separated = (item.Key).split("_");
7831                    var indR = parametros.indicadorValorCompuesto.grupos.find(function (o, index) {
7832                        return o.indicadores.indexOf(indicador_separated[1]) !== -1;
7833                    });
7834                    var indicadorMerged = $.extend(item, indR)
7835                    arrIndicadoresFinales.push(indicadorMerged);
7836                });
7837                //ARMADO DEL ARREGLO DE RENGLONES DE COLUMNA PRINCIPAL CON DATOS /////////////////////////////////////////////////////////////////
7838                var aDatosTablaFinal = [];
7839                var valores = data.value; //valores por renglon
7840                var totalPeriodos = arrayPeriodos.length;
7841                var indicadores = parametros.indicator.split("|");
7842                var totalIndicadores = indicadores.length;
7843                
7844                $.each(arrIndicadoresFinales, function (key, item) {
7845                    var aRenglon = [];
7846                    // Si columnas principal llegan varias separadas por "°"                                    
7847                    if (parametros.tituloColumnaPrincipal.indexOf("|") !== -1) {
7848                        var valorColumnaRenglon = item.titulo.split("°"); //[string] => [col1, col2]
7849                        
7850                        for (var cr = 0; cr < totalColumnasPrincipal; cr++) {
7851                            var datoColumnaPrincipal = "";
7852                            datoColumnaPrincipal = valorColumnaRenglon[cr];
7853                            
7854                            //Object.assign(item, JSON.parse('{"' + aDataIndexesColumnasPrincipal[cr] + '":"' + (datoColumnaPrincipal ? datoColumnaPrincipal : "") + '"}')); // columnas principales con opciones dataIndex:valor                                                                
7855                            $.extend(item, JSON.parse('{"' + aDataIndexesColumnasPrincipal[cr] + '":"' + (datoColumnaPrincipal ? datoColumnaPrincipal : "") + '"}')); // columnas principales con opciones dataIndex:valor                                                                
7856                        }
7857                        
7858                        // para cuando columna principal solamente es una columna
7859                    } else {
7860                        //Object.assign(item, JSON.parse('{"' + aDataIndexesColumnasPrincipal[0] + '":"' + item.titulo + '"}')); // primer columna con su dataIndex:valor                                
7861                        $.extend(item, JSON.parse('{"' + aDataIndexesColumnasPrincipal[0] + '":"' + item.titulo + '"}')); // primer columna con su dataIndex:valor                                
7862                    }
7863                    
7864                    for (var p = 0; p < totalPeriodos; p++) { // aqui genera los objetos que iran en cada fila dataIndex:valor segun el numero de periodos (columnas)
7865                        var indexValue = p + saltoPeriodos * key;
7866                        
7867                        dataIndex = (arrayPeriodos[p].m) ? arrayPeriodos[p].Key + '_' + arrayPeriodos[p].a : arrayPeriodos[p].a;
7868                        //console.log(p + " + " + saltoPeriodos + " * " + key + " = " + indexValue + " valor [ " + valores[indexValue] + "] ");
7869                        //Object.assign(item, JSON.parse('{"' + dataIndex + '":"' + valores[indexValue] + '"}'));
7870                        $.extend(item, JSON.parse('{"' + dataIndex + '":"' + valores[indexValue] + '"}'));
7871                        
7872                    }
7873                    //console.log("Salto filas segun periodos a mostrar ---------------->");              
7874                    aDatosTablaFinal.push(item); // inserta en arreglo de datos              
7875                });
7876                
7877                if (parametros.tituloColumnaPrincipal.indexOf("|") !== -1) { // ORDENAR SI LLEGAN MAS DE 1 COLUMNA PRINCIPAL
7878                    for (var x = 0; x < totalIndicadores; x++) {
7879                        
7880                        var ind = indicadores[x].split("-"); // [col2] => [indicador, id, bold]
7881                        var indicador_txt = ind[0]; // nombre del indicador
7882                        var colsIndicador = indicador_txt.split("°");
7883                        var indicador_id = ind[1]; // id indicador
7884                        var feature = ind[2]; // fuente bold, indentacion, nada
7885                        
7886                        var item = arrIndicadoresFinales.find(function (objInd, index) {
7887                            return objInd.indicadores.indexOf(indicador_id) != -1;
7888                        });
7889                        //console.log(item);
7890                        
7891                        //recorre las columnas principales
7892                        for (var cr = 0; cr < totalColumnasPrincipal; cr++) {
7893                            //aDataIndexesColumnasPrincipal[cr]
7894                            var valColumna = "";
7895                            colsIndicador[cr] = (colsIndicador[cr] !== undefined) ? colsIndicador[cr].replace(/ggg/g, "-") : ""; // reemplaza ggg > - en columnas principales
7896                            if (feature == "b") {
7897                                valColumna = "<b>" + colsIndicador[cr] + "</b>";
7898                            } else if (feature.indexOf("i") != -1) {
7899                                var totalSpaces = parseInt(feature.replace("i", ""));
7900                                switch (totalSpaces) {
7901                                    case 1: strSpaces = "&emsp;"; break;
7902                                    case 2: strSpaces = "&emsp;&emsp;"; break;
7903                                    case 3: strSpaces = "&emsp;&emsp;&emsp;"; break;
7904                                    case 4: strSpaces = "&emsp;&emsp;&emsp;&emsp;"; break;
7905                                    case 5: strSpaces = "&emsp;&emsp;&emsp;&emsp;&emsp;"; break;
7906                                    default: strSpaces = ""; break;
7907                                }
7908                                valColumna = strSpaces + colsIndicador[cr];
7909                            }
7910                            //Object.assign(item, JSON.parse('{"' + aDataIndexesColumnasPrincipal[cr] + '":"' + valColumna + '"}'));
7911                            $.extend(item, JSON.parse('{"' + aDataIndexesColumnasPrincipal[cr] + '":"' + valColumna + '"}'));
7912                        }
7913                        //console.log(item);
7914                        aDatosTablaFinal.push(item);
7915                    }
7916                    
7917                } else {
7918                    for (var x = 0; x < totalIndicadores; x++) {
7919                        
7920                        var ind = indicadores[x].split("-"); // [col2] => [indicador, id, bold]
7921                        var indicador_txt = ind[0]; // nombre del indicador
7922                        var colsIndicador = indicador_txt.split("°");
7923                        var indicador_id = ind[1]; // id indicador
7924                        var feature = ind[2]; // fuente bold, indentacion, nada
7925                        
7926                        var item = arrIndicadoresFinales.find(function (objInd, index) {
7927                            return objInd.indicadores.indexOf(indicador_id) != -1;
7928                        });
7929                        if (item.pintaBold) {
7930                            item.first = "<b>" + item.first + "</b>";
7931                        }
7932                        if (item.identacion && item.identacion > 0) {
7933                            var strSpaces = "";
7934                            switch (parseInt(item.identacion)) {
7935                                case 1: strSpaces = "&emsp;"; break;
7936                                case 2: strSpaces = "&emsp;&emsp;"; break;
7937                                case 3: strSpaces = "&emsp;&emsp;&emsp;"; break;
7938                                case 4: strSpaces = "&emsp;&emsp;&emsp;&emsp;"; break;
7939                                case 5: strSpaces = "&emsp;&emsp;&emsp;&emsp;&emsp;"; break;
7940                                default: strSpaces = ""; break;
7941                            }
7942                            
7943                            item.first = strSpaces + item.first;
7944                        }
7945                        aDatosTablaFinal.push(item);
7946                    }
7947                    //Aqui recorrer para pintar bold cada columa de cada row
7948                }
7949                //Recibir configuracion de altura y estilos del grid 
7950                var TABLA = new GridComponent();
7951                TABLA.render(columnas_tabla, aDatosTablaFinal, parametros);
7952            }
7953            
7954            /*===========================================================
7955            =            CUADRO #12 GRID EXTJS - 4 Diciembre 2017            =
7956            =  Ultima modificación: 07-11-2025                               =
7957            ===========================================================*/
7958            function DibujaCuadroTipo12_2023(data, parametros) {
7959                var idioma = parametros.idioma;
7960                var aMeses = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', '
7960Septiembre', 'Octubre', 'Noviembre', 'Diciembre'];
7961                if (idioma === "en") aMeses = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'Octuber', 'November', 'December'];
7962                var datos_tabla = [];
7963                var aDefaultColumnas = (idioma === "es") ? ["Concepto", "Dato"] : ["Concept", "Data"];
7964                var dataValores = data.value;
7965                // var tValores = data.value.length;
7966                var indexFrecuencia = data.dimension.freq.category.index; // arreglo de indices de frecuencias
7967                var dataFrecuencia = data.dimension.freq.category.label; //arreglo de valores de frecuencias
7968                var indexFactor = data.dimension.factor.category.index; //arreglo de valores de factor                
7969                var dataFactor = data.dimension.factor.category.label; 
7970                var indexUnidadMedida = data.dimension.unit.category.index;
7971                var dataUnidadMedida = data.dimension.unit.category.label; //arreglo de valores de unidad de medida    
7972                // var gruposIndicadores = parametros.indicadorValorCompuesto.grupos; // grupo de indicadores de params
7973                // var agrupamiento = parametros.agrupamiento = parametros.indicadorValorCompuesto.agrupamiento;
7974                var aCifraEstatus = data.CIFRAS_ESTATUS;
7975                var aNotas = data.NOTAS;
7976                
7977                //ARMADO DE COLUMNAS DEL GRID /////////////////////////////////////////////////////////////////        
7978                var columnas_tabla = [];
7979                var aTitulosColumnas = parametros.titulosColumnas != "" ? parametros.titulosColumnas.split(",") : [];
7980                var totalColumnas = 0; var aColumnas = null;
7981                
7982                if (aTitulosColumnas.length > 0) { // nombres de columnas si llegan en parametro            
7983                    totalColumnas = aTitulosColumnas.length;
7984                    aColumnas = aTitulosColumnas;
7985                    
7986                    for (var x = 0; x < totalColumnas; x++) {
7987                        columnas_tabla.push({
7988                            title: aTitulosColumnas[x],
7989                            width: 250,
7990                            dataIndex: "col" + x,
7991                            fix: false,
7992                        });
7993                    }
7994                } else { // columnas por default
7995                    //depende el numero de indicadores que tiene un indicador  
7996                    if (typeof defaultColumnas === "undefined") {
7997                        //throw "Los titulos de las columnas no estan definidas para cuadro " + parametros.tipoCuadro + " con ID: " + parametros.contenedorCuadro; return false;
7998                        defaultColumnas = aDefaultColumnas;
7999                    }
8000                    totalColumnas = defaultColumnas.length;
8001                    aColumnas = defaultColumnas;
8002                    
8003                    for (var x = 0; x < totalColumnas; x++) {
8004                        columnas_tabla.push({
8005                            title: defaultColumnas[x],
8006                            width: 250,
8007                            dataIndex: "col" + x,
8008                            fix: false,
8009                        });
8010                    }
8011                }
8012                /// ----> Columnas del cuadro
8013                var aIndicadores = [];
8014                // var periodo = data.dimension.periods.category.label[0].Value.split("/")[0];
8015                
8016                aIndicadores = parametros.indicadorValorCompuesto.indicadores;  
8017                var conFormato = parametros.indicadorValorCompuesto.conFormato;
8018                // agregado: 21/08/2026
8019                // Descripción: aplicaba un pop() sin tener un por que            
8020            //     data.dimension.indicator.category.label.pop();         
8021                var dataIndicadores = data.dimension.indicator.category.label; // arreglo de indicadores, respuesta de peticion
8022                var dataPeriodos = data.dimension.periods.category; // periodos en index y label
8023                //titulo indicadores primera columna del cuadro        
8024                if (conFormato) {
8025                    var textoAgrupamiento = "";
8026                    $.each(aIndicadores, function (key, item) {
8027                        var objRenglon = item;
8028                        if (item.indicadores == undefined) {
8029                            textoAgrupamiento = item.titulo;
8030                        }
8031
8032                        $.extend(objRenglon, JSON.parse('{"' + "col0" + '":"' + item.titulo + '"}'));
8033                        item.cd = item.cd !== undefined ? item.cd : ""; // para el texto Cifras desestacionalizadas
8034                        datos_tabla.push(objRenglon);
8035                    });
8036                } else {
8037                    $.each(dataIndicadores, function (key, item) {
8038                        var objRenglon = item;
8039                        // busca algun titulo directo en el parametro de ind
8040                        var oIndicadorTitulo = aIndicadores.filter(function(i){
8041                            return "I_"+i.indicadores[0] === item.Key && i.titulo !== ""
8042                        })[0]
8043                        item.Value = oIndicadorTitulo !== undefined? oIndicadorTitulo.titulo : item.Value;
8044                        $.extend(objRenglon, JSON.parse('{"' + "col0" + '":"' + item.Value + '"}'));
8045                        datos_tabla.push(objRenglon);
8046                    });
8047                }
8048                /// LLENADO DE DATOS (RENGLONES INDICADOR-VALOR)
8049                /// ----> LLenado de indicadores_valores de la matriz de valores usando formula JSON-Stat
8050                var indicadores_valores = [];
8051                var contenidoValor = "";
8052                $.each(dataIndicadores, function (index, indicador) {
8053                    var valor = dataValores[index];
8054                    var periodo = dataPeriodos.index[index];
8055                    // ------ Concatena unidad medida, periodicidad y periodo al titulo de cada titulo de indicador en columna 0
8056                    // obtiene index de frecuencia y unidad de medida para la posicion y obtiene dato de labels segun posicion obtenida previamente             
8057                    var valFrecuencia = dataFrecuencia.filter(function (obj) {
8058                        return obj.Key === indexFrecuencia[index];
8059                    });
8060                    // console.log("en Desarrollo: en espera del ajuste de sergio")
8061                    var valFactor = dataFactor.filter(function (obj) {
8062                        return obj.Key === indexFactor[index];
8063                    });
8064                    var vFactor = valFactor.length > 0 && valFactor[0].Value !== null? valFactor[0].Value+" de " : ""; 
8065
8066                    // console.log(dataUnidadMedida);
8067                    var valUnidad = dataUnidadMedida.filter(function (obj) {
8068                        return obj.Key === indexUnidadMedida[index];
8069                    });
8070                    // console.log(dataUnidadMedida)
8071                    ///  Consulta y obtiene las cifras estatus de cada indicador si las tiene
8072                    var formatoCifraEstatus = "";
8073                    if (aCifraEstatus != undefined && aCifraEstatus.length > 0) {
8074                        var cifraEstatusDeIndicador = aCifraEstatus.filter(function (cifraestatus) {
8075                            var indicador_buscar = indicador.Key.split("I_")[1];
8076                            return cifraestatus.indicadores.indexOf(indicador_buscar) !== -1;
8077                        });
8078                        //  recorre cada grupo de cifras estatus encontradas y les da formato para integrarlas a la celda del indicador en la tabla                
8079                        if (cifraEstatusDeIndicador.length > 0) {
8080                            var desc = cifraEstatusDeIndicador[cifraEstatusDeIndicador.length - 1]['descripcion'].split("a partir de")[0];
8081                            formatoCifraEstatus = "<div style=\'font-style:italic;font-size:9px;color:#9b9b9b;\'>" + desc + "</div>";
8082                        }
8083                    }
8084                    // hasta aqui el proceso de cifras estatus para cada indicador
8085                    
8086                    /// >----- Obtiene la sigla (s) que le corresponden a un indicador (busca del grupo de indicadores de notas dentro del grupo de indicadores que se estan recorriendo)            
8087                    var siglas = "";
8088                    if(parametros.muestraNota === "true"){
8089                        var aSiglasIndicador = [];
8090                        var match = aNotas.filter(function (j) {
8091                            var aIndicadores = j.INDICADOR.split(",");
8092                            return aIndicadores.indexOf(indicador.Key.split("I_")[1].toString()) !== -1;
8093                        });
8094                        if (match.length > 0) {
8095                            match.forEach(function (m) {
8096                                if (aSiglasIndicador.indexOf(m.SIGLA) === -1){
8097                                    aSiglasIndicador.push(m._SIGLA ? m._SIGLA : m.SIGLA);
8098                                }
8099                            });
8100                        }
8101                        if (aSiglasIndicador.length > 0) {
8102                            siglas = " <sup>" + aSiglasIndicador.join("/ ") + "/</sup>";
8103                        }
8104                    }
8105                    /// <----- Fin Obtiene la sigla (s) que le corresponden a un indicador (busca del grupo de indicadores de notas dentro del grupo de indicadores que se estan recorriendo)
8106                    // var contenidoValor = '<center>' + (valor + (totalColumnas > 1 ? siglas : "")) + '<div style=\'font-size:9px;color:#6b6a6a;\'>(' + valUnidad[0].Value + ')</div>' + formatoCifraEstatus + '</center>';
8107                    var contenidoValor = '<center>' + (valor + siglas) + '<div style=\'font-size:9px;color:#6b6a6a;\'>(' + vFactor +" "+ valUnidad[0].Value + ')</div>' + formatoCifraEstatus + '</center>';
8108                    //periodo con formato segun frecuencia             
8109                    var formato_periodo = "";
8110                    if (valFrecuencia[0].Value === "Anual") { // Anual
8111                        formato_periodo = periodo;
8112                    } else if (valFrecuencia[0].Value === "Mensual") { // Mensual
8113                        var mes = periodo.split("/")[1];
8114                        //formato_periodo = aMeses[parseInt(mes) - 1].substr(0, 3);                
8115                        formato_periodo = oMESES.getMesNombreCorto(parseInt(mes), parametros.idioma);
8116                        
8117                    } else if (valFrecuencia[0].Value === "Trimestral") { // Trimestral
8118                        var mes = parseInt(periodo.split("/")[1]); // 03, 12
8119                        if (mes == 1) { // trimestre 1
8120                            formato_periodo = "1T";
8121                        } else if (mes == 2) { // trimestre 2
8122                            formato_periodo = "2T";
8123                        } else if (mes == 3) { // trimestre 3
8124                            formato_periodo = "3T";
8125                        } else { // trimestre 4
8126                            formato_periodo = "4T";
8127                        }
8128                        
8129                    } else { // otros
8130                        formato_periodo = "";
8131                    }
8132                    
8133                    formato_periodo = (periodo.split("/")[0] !== formato_periodo) ? (periodo.split("/")[0] + " " + formato_periodo) : periodo.split("/")[0];
8134                    indicadores_valores.push({ indicador: indicador.Key, valor: contenidoValor, periodo: formato_periodo, unidad: valUnidad[0].Value, frecuencia: valFrecuencia[0].Value });
8135                });
8136                
8137                /// ----> Cruce de aIndicadores finales con indicadores_valores                 
8138                if (aIndicadores !== undefined && conFormato) {
8139                    //solo indicadores agrupados por |
8140                    $.each(aIndicadores, function (index, item) {
8141                        
8142                        /// ----- Obtiene el grupo array de indicadores por cada uno para recorrerlos y buscar su dato valor en indicadores_valores
8143                        // console.log(item.indicadores)
8144                        if (item.indicadores !== undefined) {
8145                           
8146                            //buscar un indicador > 0 como referencia para colocar el periodo y la frecuencia en el titulo (columna 0
8147                            var indicadorBuscar = item.indicadores.find(function (ind) {
8148                                return parseInt(ind) > 0;
8149                            });
8150                            // console.log(indicadorBuscar)
8151                            var oFrecUnidad = indicadores_valores.filter(function (obj) {
8152                                return obj.indicador === "I_" + indicadorBuscar;
8153                            });
8154                            var tituloIndicador = item.titulo;
8155                            var spaces = item.espacios;
8156                            
8157                            if (oFrecUnidad.length > 0) {  
8158                                tituloIndicador = '<div style=\\"margin-left:'+spaces+'em;\\">'+item.titulo + ', (' + oFrecUnidad[0].frecuencia + ') ' + oFrecUnidad[0].periodo+'</div>';
8159
8160                            } else { 
8161                                // Aqui cae en caso de que el indicador no tenia ningun valor, sin embargo debe respetar y colocarlo tal cual se especifica.                               
8162                                tituloIndicador = '<div style=\\"margin-left:'+spaces+'em;\\">'+item.titulo+'</div>';
8163                            }                            
8164                            tituloIndicador += aIndicadores[index].cd;
8165                            $.extend(aIndicadores[index], JSON.parse('{"' + "col0" + '":"' + tituloIndicador + '"}'));
8166                            
8167                            var arrayIndicadores = item.indicadores;
8168                            $.each(arrayIndicadores, function (idx, ind) {
8169                                var oIndValores = indicadores_valores.filter(function (obj) {
8170                                    return obj.indicador === "I_" + ind;
8171                                });
8172                                
8173                                var valor = oIndValores[0] ? oIndValores[0].valor : "-";
8174                                $.extend(aIndicadores[index], JSON.parse('{"' + "col" + (idx + 1) + '":"' + valor + '"}'));
8175                            });
8176                        } else {
8177                            var spaces = item.espacios;
8178                            // subtexto cifras desestacionalizadas (-cd)
8179                            item.titulo += item.cd;
8180                            var tituloIndicador = '<div style=\\"margin-left:'+spaces+'em;\\">'+item.titulo +'</div>';
8181                            $.extend(aIndicadores[index], JSON.parse('{"' + "col0" + '":"' + tituloIndicador + '"}'));
8182                        }
8183                    });
8184                    
8185                } else {
8186                    //solo para indicadores sin agrupar y separados por coma
8187                    $.each(dataIndicadores, function (index, ind) {
8188                        // console.log(ind)
8189                        // var siglas = "";
8190                        // var aSiglasIndicador = [];
8191                        // //item.indicadores.forEach(function (i) {
8192                        // var match = aNotas.filter(function (j) {
8193                        //     var aIndicadores = j.INDICADOR.split(",");
8194                        //     return aIndicadores.indexOf(ind.Key.split("I_")[1].toString()) !== -1;
8195                        // });
8196                        // if (match.length > 0) {
8197                        //     match.forEach(function (m) {
8198                        //         if (aSiglasIndicador.indexOf(m.SIGLA) === -1){
8199                        //             aSiglasIndicador.push(m.SIGLA + (m.diferenciador !== undefined? "("+m.diferenciador+")" : ""));
8200                        //         }
8201                        //     });
8202                        // }
8203                        // //});
8204                        // if (aSiglasIndicador.length > 0) {
8205                        //     siglas = " <sup><b>" + aSiglasIndicador.join("/ ") + "/</b></sup>";
8206                        // }
8207                        var oindvalores = indicadores_valores.filter(function (obj) {
8208                            return obj.indicador === ind.Key;
8209                        });
8210                        
8211                        var oFrecUnidad = indicadores_valores.filter(function (obj) {
8212                            return obj.indicador === ind.Key;
8213                        });
8214                        var tituloIndicador = ind.Value;
8215                        if (oFrecUnidad.length > 0) {
8216                            tituloIndicador = ind.Value + ", (" + oFrecUnidad[0].frecuencia + ") " + oFrecUnidad[0].periodo;
8217                        }
8218                        tituloIndicador = tituloIndicador;                        
8219                        
8220                        var valor = oindvalores[0] ? oindvalores[0].valor : "-";
8221                        $.extend(dataIndicadores[index], JSON.parse('{"' + "col0" + '":"' + tituloIndicador + '"}')); //columna 0
8222                        $.extend(dataIndicadores[index], JSON.parse('{"col1":"' + valor + '"}'));
8223                    });
8224                    aIndicadores = dataIndicadores;
8225                }
8226                //parametros.grid_configuracion.hide_columns = [];        
8227                // envuelve notas en un box 
8228                $("#divFuentes" + parametros.contenedorCuadro).css({ "backgroundColor": "#eaf3f3", "padding": "6px 8px", "margin": "6px 1px 6px 1px", "borderRadius": "2px", "display": "none" });
8229                //$("#divFuentes" + parametros.contenedorCuadro).addClass("collapsed");
8230                
8231                //adding event toggle notas/fuentes ////////////////////////////////////////////////////////////////////////////////
8232                var toggleTarget = "divFuentes" + parametros.contenedorCuadro;
8233                var aToggle = document.createElement("a");
8234                aToggle.innerHTML = (idioma === "es") ? "Mostrar llamadas" : "Show calls";
8235                aToggle.id = "linkToggle_" + parametros.contenedorCuadro;
8236                aToggle.style = "cursor:pointer;";
8237                $(aToggle).insertBefore("#" + toggleTarget);
8238                $(document).ready(function () {
8239                    $("#" + aToggle.id).click(function () {
8240                        var linkEl = this;
8241                        $("#divFuentes" + parametros.contenedorCuadro).slideToggle("fast", function () {
8242                            if ($(this).is(":visible")) {
8243                                $(linkEl).html((idioma === "es") ? "Ocultar llamadas" : "Hide calls");
8244                            } else {
8245                                $(linkEl).html((idioma === "es") ? "Mostrar llamadas" : "Show calls");
8246                            }
8247                        });
8248                    });
8249                });
8250                
8251                //Recibir configuracion de altura y estilos del grid 
8252                var TABLA = new GridComponent();
8253                // estilos header border blanco                
8254                parametros.grid_configuracion.header_css = "background:#DDD;font-weight:bold;border-color:#fff;";
8255                TABLA.render(columnas_tabla, datos_tabla, parametros);
8256            }
8257            /* 
8258            * YA NO SE UTILIZA PARA EL CUADRO #12
8259            */
8260            function DibujaCuadroTipo12_New(data, parametros) {
8261                
8262                var idioma = parametros.idioma;
8263                var aMeses = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', '
8263Septiembre', 'Octubre', 'Noviembre', 'Diciembre'];
8264                if (idioma === "en") aMeses = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'Octuber', 'November', 'December'];
8265                var datos_tabla = [];
8266                var aDefaultColumnas = (idioma === "es") ? ["Concepto", "Dato"] : ["Concept", "Data"];
8267                var dataValores = data.value;
8268                // var tValores = data.value.length;
8269                var indexFrecuencia = data.dimension.freq.category.index; // arreglo de indices de frecuencias
8270                var dataFrecuencia = data.dimension.freq.category.label; //arreglo de valores de frecuencias
8271                var indexUnidadMedida = data.dimension.unit.category.index;
8272                var dataUnidadMedida = data.dimension.unit.category.label; //arreglo de valores de unidad de medida    
8273                // var gruposIndicadores = parametros.indicadorValorCompuesto.grupos; // grupo de indicadores de params
8274                // var agrupamiento = parametros.agrupamiento = parametros.indicadorValorCompuesto.agrupamiento;
8275                var aCifraEstatus = data.CIFRAS_ESTATUS;
8276                var aNotas = data.NOTAS;
8277                
8278                //ARMADO DE COLUMNAS DEL GRID /////////////////////////////////////////////////////////////////        
8279                var columnas_tabla = [];
8280                var aTitulosColumnas = parametros.titulosColumnas != "" ? parametros.titulosColumnas.split(",") : [];
8281                var totalColumnas = 0; var aColumnas = null;
8282                
8283                if (aTitulosColumnas.length > 0) { // nombres de columnas si llegan en parametro            
8284                    totalColumnas = aTitulosColumnas.length;
8285                    aColumnas = aTitulosColumnas;
8286                    
8287                    for (var x = 0; x < totalColumnas; x++) {
8288                        columnas_tabla.push({
8289                            title: aTitulosColumnas[x],
8290                            width: 250,
8291                            dataIndex: "col" + x,
8292                            fix: false,
8293                        });
8294                    }
8295                } else { // columnas por default
8296                    //depende el numero de indicadores que tiene un indicador  
8297                    if (typeof defaultColumnas === "undefined") {
8298                        //throw "Los titulos de las columnas no estan definidas para cuadro " + parametros.tipoCuadro + " con ID: " + parametros.contenedorCuadro; return false;
8299                        defaultColumnas = aDefaultColumnas;
8300                    }
8301                    totalColumnas = defaultColumnas.length;
8302                    aColumnas = defaultColumnas;
8303                    
8304                    for (var x = 0; x < totalColumnas; x++) {
8305                        columnas_tabla.push({
8306                            title: defaultColumnas[x],
8307                            width: 250,
8308                            dataIndex: "col" + x,
8309                            fix: false,
8310                        });
8311                    }
8312                }
8313                /// ----> Columnas del cuadro
8314                var aIndicadores = [];
8315                var periodo = data.dimension.periods.category.label[0].Value.split("/")[0];
8316                
8317                aIndicadores = parametros.indicadorValorCompuesto.grupos;
8318                var dataIndicadores = data.dimension.indicator.category.label; // arreglo de indicadores, respuesta de peticion
8319                var dataPeriodos = data.dimension.periods.category; // periodos en index y label
8320                //titulo indicadores primera columna del cuadro         
8321                if (parametros.indicadorValorCompuesto.grupos) {
8322                    var textoAgrupamiento = "";
8323                    $.each(aIndicadores, function (key, item) {
8324                        var objRenglon = item;
8325                        if (item.indicadores == undefined) {
8326                            textoAgrupamiento = item.titulo;
8327                        }
8328                        $.extend(objRenglon, JSON.parse('{"' + "col0" + '":"' + item.titulo + '"}'));
8329                        item.cd = item.cd !== undefined ? item.cd : ""; // para el texto Cifras desestacionalizadas
8330                        datos_tabla.push(objRenglon);
8331                    });
8332                } else {
8333                    $.each(dataIndicadores, function (key, item) {
8334                        var objRenglon = item;
8335                        $.extend(objRenglon, JSON.parse('{"' + "col0" + '":"' + item.Value + '"}'));
8336                        datos_tabla.push(objRenglon);
8337                    });
8338                }
8339                /// LLENADO DE DATOS (RENGLONES INDICADOR-VALOR)
8340                /// ---->
8340 LLenado de indicadores_valores de la matriz de valores usando formula JSON-Stat
8341                var indicadores_valores = [];
8342                var contenidoValor = "";
8343                $.each(dataIndicadores, function (index, indicador) {
8344                    var valor = dataValores[index];
8345                    var periodo = dataPeriodos.index[index];
8346                    // ------ Concatena unidad medida, periodicidad y periodo al titulo de cada titulo de indicador en columna 0
8347                    // obtiene index de frecuencia y unidad de medida para la posicion y obtiene dato de labels segun posicion obtenida previamente             
8348                    var valFrecuencia = dataFrecuencia.filter(function (obj) {
8349                        return obj.Key === indexFrecuencia[index];
8350                    });
8351                    var valUnidad = dataUnidadMedida.filter(function (obj) {
8352                        return obj.Key === indexUnidadMedida[index];
8353                    });
8354                    ///  Consulta y obtiene las cifras estatus de cada indicador si las tiene
8355                    var formatoCifraEstatus = "";
8356                    if (aCifraEstatus != undefined && aCifraEstatus.length > 0) {
8357                        var cifraEstatusDeIndicador = aCifraEstatus.filter(function (cifraestatus) {
8358                            var indicador_buscar = indicador.Key.split("I_")[1];
8359                            return cifraestatus.indicadores.indexOf(indicador_buscar) !== -1;
8360                        });
8361                        //  recorre cada grupo de cifras estatus encontradas y les da formato para integrarlas a la celda del indicador en la tabla                
8362                        if (cifraEstatusDeIndicador.length > 0) {
8363                            var desc = cifraEstatusDeIndicador[cifraEstatusDeIndicador.length - 1]['descripcion'].split("a partir de")[0];
8364                            formatoCifraEstatus = "<div style=\'font-style:italic;font-size:9px;color:#9b9b9b;\'>" + desc + "</div>";
8365                        }
8366                    }
8367                    // hasta aqui el proceso de cifras estatus para cada indicador
8368                    
8369                    /// >----- Obtiene la sigla (s) que le corresponden a un indicador (busca del grupo de indicadores de notas dentro del grupo de indicadores que se estan recorriendo)            
8370                    var siglas = "";
8371                    var aSiglasIndicador = [];
8372                    //item.indicadores.forEach(function (i) {
8373                    var match = aNotas.filter(function (j) {
8374                        var aIndicadores = j.INDICADOR.split(",");
8375                        return aIndicadores.indexOf(indicador.Key.split("I_")[1].toString()) !== -1;
8376                    });
8377                    if (match.length > 0) {
8378                        match.forEach(function (m) {
8379                            if (aSiglasIndicador.indexOf(m.SIGLA) === -1)
8380                            aSiglasIndicador.push(m.SIGLA);
8381                        });
8382                    }
8383                    //});
8384                    if (aSiglasIndicador.length > 0) {
8385                        siglas = " <sup>" + aSiglasIndicador.join("/ ") + "/</sup>";
8386                    }
8387                    /// <----- Fin Obtiene la sigla (s) que le corresponden a un indicador (busca del grupo de indicadores de notas dentro del grupo de indicadores que se estan recorriendo)
8388                    var contenidoValor = '<center>' + (valor + (totalColumnas > 2 ? siglas : "")) + '<div style=\'font-size:9px;color:#6b6a6a;\'>(' + valUnidad[0].Value + ')</div>' + formatoCifraEstatus + '</center>';
8389                    //periodo con formato segun frecuencia             
8390                    var formato_periodo = "";
8391                    if (valFrecuencia[0].Value === "Anual") { // Anual
8392                        formato_periodo = periodo;
8393                    } else if (valFrecuencia[0].Value === "Mensual") { // Mensual
8394                        var mes = periodo.split("/")[1];
8395                        //formato_periodo = aMeses[parseInt(mes) - 1].substr(0, 3);                
8396                        formato_periodo = oMESES.getMesNombreCorto(parseInt(mes), parametros.idioma);
8397                        
8398                    } else if (valFrecuencia[0].Value === "Trimestral") { // Trimestral
8399                        var mes = parseInt(periodo.split("/")[1]); // 03, 12
8400                        if (mes == 1) { // trimestre 1
8401                            formato_periodo = "1T";
8402                        } else if (mes == 2) { // trimestre 2
8403                            formato_periodo = "2T";
8404                        } else if (mes == 3) { // trimestre 3
8405                            formato_periodo = "3T";
8406                        } else { // trimestre 4
8407                            formato_periodo = "4T";
8408                        }
8409                        
8410                    } else { // otros
8411                        formato_periodo = "";
8412                    }
8413                    
8414                    formato_periodo = (periodo.split("/")[0] !== formato_periodo) ? (periodo.split("/")[0] + " " + formato_periodo) : periodo.split("/")[0];
8415                    indicadores_valores.push({ indicador: indicador.Key, valor: contenidoValor, periodo: formato_periodo, unidad: valUnidad[0].Value, frecuencia: valFrecuencia[0].Value });
8416                });
8417                
8418                /// ----> Cruce de aIndicadores finales con indicadores_valores 
8419                if (aIndicadores !== undefined) {
8420                    //solo indicadores agrupados por |
8421                    $.each(aIndicadores, function (index, item) {
8422                        
8423                        /// ----- Obtiene el grupo array de indicadores por cada uno para recorrerlos y buscar su dato valor en indicadores_valores
8424                        if (item.indicadores !== undefined) {
8425                            //buscar un indicador > 0 como referencia para colocar el periodo y la frecuencia en el titulo (columna 0
8426                            var indicadorBuscar = item.indicadores.find(function (ind) {
8427                                return parseInt(ind) > 0;
8428                            });
8429                            var oFrecUnidad = indicadores_valores.filter(function (obj) {
8430                                return obj.indicador === "I_" + indicadorBuscar;
8431                            });
8432                            var tituloIndicador = item.titulo;
8433                            
8434                            if (oFrecUnidad.length > 0) {
8435                                tituloIndicador = item.titulo + ", (" + oFrecUnidad[0].frecuencia + ") " + oFrecUnidad[0].periodo;
8436                            }
8437                            tituloIndicador += aIndicadores[index].cd;
8438                            $.extend(aIndicadores[index], JSON.parse('{"' + "col0" + '":"' + tituloIndicador + '"}'));
8439                            
8440                            var arrayIndicadores = item.indicadores;
8441                            $.each(arrayIndicadores, function (idx, ind) {
8442                                var oIndValores = indicadores_valores.filter(function (obj) {
8443                                    return obj.indicador === "I_" + ind;
8444                                });
8445                                
8446                                var valor = oIndValores[0] ? oIndValores[0].valor : "-";
8447                                $.extend(aIndicadores[index], JSON.parse('{"' + "col" + (idx + 1) + '":"' + valor + '"}'));
8448                            });
8449                        } else {
8450                            // subtexto cifras desestacionalizadas (-cd)
8451                            item.titulo += item.cd;
8452                            $.extend(aIndicadores[index], JSON.parse('{"' + "col0" + '":"' + item.titulo + '"}'));
8453                        }
8454                    });
8455                } else {
8456                    //solo para indicadores sin agrupar y separados por coma
8457                    $.each(dataIndicadores, function (index, ind) {
8458                        var siglas = "";
8459                        var aSiglasIndicador = [];
8460                        //item.indicadores.forEach(function (i) {
8461                        var match = aNotas.filter(function (j) {
8462                            var aIndicadores = j.INDICADOR.split(",");
8463                            return aIndicadores.indexOf(ind.Key.split("I_")[1].toString()) !== -1;
8464                        });
8465                        if (match.length > 0) {
8466                            match.forEach(function (m) {
8467                                if (aSiglasIndicador.indexOf(m.SIGLA) === -1)
8468                                aSiglasIndicador.push(m.SIGLA);
8469                            });
8470                        }
8471                        //});
8472                        if (aSiglasIndicador.length > 0) {
8473                            siglas = " <sup><b>" + aSiglasIndicador.join("/ ") + "/</b></sup>";
8474                        }
8475                        var oindvalores = indicadores_valores.filter(function (obj) {
8476                            return obj.indicador === ind.Key;
8477                        });
8478                        
8479                        var oFrecUnidad = indicadores_valores.filter(function (obj) {
8480                            return obj.indicador === ind.Key;
8481                        });
8482                        var tituloIndicador = ind.Value;
8483                        if (oFrecUnidad.length > 0) {
8484                            tituloIndicador = ind.Value + ", (" + oFrecUnidad[0].frecuencia + ") " + oFrecUnidad[0].periodo;
8485                        }
8486                        
8487                        tituloIndicador = tituloIndicador + siglas;
8488                        
8489                        var valor = oindvalores[0] ? oindvalores[0].valor : "-";
8490                        $.extend(dataIndicadores[index], JSON.parse('{"' + "col0" + '":"' + tituloIndicador + '"}')); //columna 0
8491                        $.extend(dataIndicadores[index], JSON.parse('{"col1":"' + valor + '"}'));
8492                    });
8493                    aIndicadores = dataIndicadores;
8494                }
8495                //parametros.grid_configuracion.hide_columns = [];        
8496                // envuelve notas en un box 
8497                $("#divFuentes" + parametros.contenedorCuadro).css({ "backgroundColor": "#eaf3f3", "padding": "6px 8px", "margin": "6px 1px 6px 1px", "borderRadius": "2px", "display": "none" });
8498                //$("#divFuentes" + parametros.contenedorCuadro).addClass("collapsed");
8499                
8500                //adding event toggle notas/fuentes ////////////////////////////////////////////////////////////////////////////////
8501                var toggleTarget = "divFuentes" + parametros.contenedorCuadro;
8502                var aToggle = document.createElement("a");
8503                aToggle.innerHTML = (idioma === "es") ? "Mostrar llamadas" : "Show calls";
8504                aToggle.id = "linkToggle_" + parametros.contenedorCuadro;
8505                aToggle.style = "cursor:pointer;";
8506                $(aToggle).insertBefore("#" + toggleTarget);
8507                $(document).ready(function () {
8508                    $("#" + aToggle.id).click(function () {
8509                        var linkEl = this;
8510                        $("#divFuentes" + parametros.contenedorCuadro).slideToggle("fast", function () {
8511                            if ($(this).is(":visible")) {
8512                                $(linkEl).html((idioma === "es") ? "Ocultar llamadas" : "Hide calls");
8513                            } else {
8514                                $(linkEl).html((idioma === "es") ? "Mostrar llamadas" : "Show calls");
8515                            }
8516                        });
8517                    });
8518                });
8519                
8520                //Recibir configuracion de altura y estilos del grid 
8521                var TABLA = new GridComponent();
8522                // estilos header border blanco 
8523                parametros.grid_configuracion.header_css = "background:#DDD;font-weight:bold;border-color:#fff;";
8524                TABLA.render(columnas_tabla, datos_tabla, parametros);
8525            }
8526            /*===========================================================
8527            = FICHA RESUMEN #13 GRID EXTJS - 12 Diciembre 2017            =
8528            ===========================================================*/
8529            function DibujaCuadroTipo13_New(data, parametros) {                
8530                //armar tabla         
8531                //traduccion
8532                var idioma = parametros.idioma;
8533                var titulo1 = "Capital", titulo2 = "Coordenadas"; titulo3 = "Entidades &area", titulo4 = "Superficie";
8534                if (idioma === "en") {
8535                    titulo2 = "Coordinates";
8536                    titulo3 = "Number of &area";
8537                    titulo4 = "Area";
8538                }
8539                var TABLE = document.createElement("table");
8540                TABLE.className = 'table table-bordered table-hover table-responsive';
8541                var tBody = (!BROWSER.ie()) ? TABLE.createTBody() : document.createElement("tbody");
8542                var tRowBody = (!BROWSER.ie()) ? tBody.insertRow() : document.createElement("tr");
8543                
8544                if (BROWSER.ie) {
8545                    //tBody.appendChild(tRowBody);
8546                    //TABLE.appendChild(tBody)
8547                }
8548                
8549                var styleHeaders = 'background:#ddd;font-family:"HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;border:1px solid #fff;border-top:1px solid #c8c8c8;border-left:1px solid #c8c8c8;border-right:1px solid #c8c8c8;';
8550                var styleGeneral = "border:1px solid #c8c8c8;";
8551                //cel Capital
8552                //var cellHeader = document.createElement("th");
8553                //cellHeader.innerHTML = titulo1;
8554                //cellHeader.style = styleHeaders;
8555                //tRowBody.appendChild(cellHeader);        
8556                //var cell = document.createElement("td");
8557                //cell.style = styleGeneral;        
8558                //cell.innerHTML = data.Nombre;
8559                //tRowBody.appendChild(cell);  
8560                
8561                
8562                if (BROWSER.ie) {
8563                    tBody.appendChild(tRowBody);
8564                    TABLE.appendChild(tBody)
8565                }
8566                
8567                //cel Coordenadas  
8568                if(data.hasOwnProperty("coordinates")){    
8569                   
8570                    var cellHeader = document.createElement("th");
8571                    cellHeader.innerHTML = titulo2;
8572                    tRowBody.appendChild(cellHeader);
8573                    cellHeader.style = styleHeaders + "border-bottom:1px solid #c8c8c8;border-top:1px solid #c8c8c8;";        
8574                    var cell = document.createElement("td");
8575                    var latitud = "", longitud = "";
8576                    if(data.coordinates.length == 2){
8577                        var lat1_grados = data.coordinates[0][0].split("°")[0];
8578                        var lat1_decimales = (data.coordinates[0][0].split("'")[0]).split("°")[1];
8579                        var lat1_minutos = data.coordinates[0][0].split("'")[1];
8580                        var lat2_grados = data.coordinates[1][0].split("°")[0];
8581                        var lat2_decimales = (data.coordinates[1][0].split("'")[0]).split("°")[1];
8582                        var lat2_minutos = data.coordinates[1][0].split("'")[1];
8583
8584                        var lon1_grados = data.coordinates[0][1].split("°")[0];
8585                        var lon1_decimales = (data.coordinates[0][1].split("'")[0]).split("°")[1];
8586                        var lon1_minutos = data.coordinates[0][1].split("'")[1];
8587                        var lon2_grados = data.coordinates[1][1].split("°")[0];
8588                        var lon2_decimales = (data.coordinates[1][1].split("'")[0]).split("°")[1];
8589                        var lon2_minutos = data.coordinates[1][1].split("'")[1];
8590                        var styleSpan = "width:23px;text-align:right;display:inline-block;";
8591                        var styleSpan2 = "width:60px;text-align:right;display:inline-block;";
8592                        latitud = '<span style="width:80px;display:inline-block;">Latitud</span><span style="' + styleSpan + 'width:35px !important;">' + lat1_grados + '°</span><span style="' + styleSpan + '">' + lat1_decimales + '\'</span><span style="' + styleSpan2 + '">' + lat1_minutos + '"</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="' + styleSpan + 'width:35px !important;">' + lat2_grados + '°</span><span style="' + styleSpan + '">' + lat2_decimales + '\'</span><span style="' + styleSpan2 + '">
8592' + lat2_minutos +'"</span>';     
8593                        longitud = '<span style="width:80px;display:inline-block;">Longitud</span><span style="' + styleSpan + 'width:35px !important;">' + lon1_grados + '°</span><span style="' + styleSpan + '">' + lon1_decimales + '\'</span><span style="' + styleSpan2 + '">' + lon1_minutos + '"</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="' + styleSpan + 'width:35px !important;">' + lon2_grados + '°</span><span style="' + styleSpan + '">' + lon2_decimales + '\'</span><span style="' + styleSpan2 + '">' + lon2_minutos + '"</span>';          
8594                        // latitud = "Latitud &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + data.coordinates[0][0] + "&nbsp;&nbsp;&nbsp;" + data.coordinates[1][0];
8595                        // longitud = "Longitud &nbsp;&nbsp;"+data.coordinates[0][1].replace("-", "") + "&nbsp;&nbsp;" + data.coordinates[1][1].replace("-", "");
8596                    } else {
8597                        latitud = data.coordinates[0] + " " + data.coordinates[1].replace("-","");
8598                        
8599                    }
8600                    //var latitud = parseFloat(data.LATITUD_GRADOS1).toFixed(0) + "° " + (data.LATITUD_MINUTOS1 == "" || data.LATITUD_MINUTOS1 == "0" ? "" : data.LATITUD_MINUTOS1 + "'") + " " + parseFloat(data.LATITUD_GRADOS2).toFixed(0) + "° " + (data.LATITUD_MINUTOS2 == "" || data.LATITUD_MINUTOS2 == '0' ? "" : data.LATITUD_MINUTOS2 + "'") + " N";
8601                    // var longitud = parseFloat(data.LONGITUD_GRADOS1).toFixed(0) + "° " + (data.LONGITUD_MINUTOS1 == "" || data.LONGITUD_MINUTOS1 == "0" ? "" : data.LONGITUD_MINUTOS1 + "'") + " " + parseFloat(data.LONGITUD_GRADOS2).toFixed(0) + "° " + (data.LONGITUD_MINUTOS2 == "" || data.LONGITUD_MINUTOS2 == '0' ? "" : data.LONGITUD_MINUTOS2 + "'") + " O";
8602                    cell.innerHTML = latitud + "<br />" + longitud;
8603                    tRowBody.appendChild(cell);        
8604                }
8605                var tRowBody = (!BROWSER.ie()) ? tBody.insertRow() : document.createElement("tr");
8606                
8607                //cel Numero de municipios / entidades
8608                var cellHeader = document.createElement("th");
8609                //var area = (parametros.areaGeografica == "00" ? (idioma === "en" ? "States" : "Federativas") : (idioma === "en" ? "Municipalities" : "Municipios"));
8610                var area = (parametros.areaGeografica == "00" ? (idioma === "en" ? "Federal Entities" : "Entidades Federativas") : (idioma === "en" ? "Municipalities" : "Municipios"));
8611                //cellHeader.innerHTML = titulo3.replace("&area", area);
8612                cellHeader.innerHTML = area;
8613                cellHeader.style = styleHeaders + "border-bottom:1px solid #c8c8c8;";
8614                tRowBody.appendChild(cellHeader);
8615                
8616                var cell = document.createElement("td");
8617                //cell.setAttribute("colspan", 3)   
8618                cell.style.width = "50%";
8619                if (data.Municipio.length > 1) {
8620                    var cont = 0;
8621                    $.each(data.Municipio, function (key, mpio) {
8622                        if (mpio.Municipio !== "000" && mpio.Municipio !== "901" && mpio.Municipio !== "902" && mpio.Municipio !== "996" && mpio.Municipio !== "997" && mpio.Municipio !== "998" && mpio.Municipio !== "999") {
8623                            ++cont;
8624                        }
8625                    });
8626                }
8627                cell.innerHTML = data.Municipio.length > 1 ? cont : 32;
8628                tRowBody.appendChild(cell);
8629                
8630                
8631                //cel indicador
8632                //var cellHeader = document.createElement("th");
8633                //cellHeader.innerHTML = titulo4;
8634                //tRowBody.appendChild(cellHeader);
8635                //cellHeader.style = styleHeaders;
8636                //var cell = document.createElement("td");
8637                //arma estructura
8638                //var texto_unidad_medida = (data.indicator.NOMBRE_UNIDAD) ? " (" + data.indicator.NOMBRE_UNIDAD + ")" : "";
8639                //var texto_periodicidad = (data.indicator.NOMBRE_FRECUENCIA) ? ", (" + data.indicator.NOMBRE_FRECUENCIA + ")" : "";
8640                //var texto_anio = (data.indicator.CIFRAS_ESTATUS.length == 1) ? data.indicator.CIFRAS_ESTATUS[0].periodos : "";
8641                //var nombre_indicador = Object.getOwnPropertyNames(parametros.indicadorValorCompuesto).length > 0 ? parametros.indicadorValorCompuesto.indicador : data.indicator.NOMBRE_INDICADOR;        
8642                //texto_anio = texto_anio.split("/")[0];
8643                
8644                //var texto_mostrar = texto_unidad_medida + texto_periodicidad + " " + texto_anio;
8645                //cell.innerHTML = nombre_indicador + texto_mostrar;
8646                //tRowBody.appendChild(cell);
8647                
8648                // estilos  
8649                if (BROWSER.ie) {
8650                    tBody.appendChild(tRowBody);
8651                    TABLE.appendChild(tBody)
8652                }
8653                
8654                document.getElementById("divDatos" + parametros.contenedorCuadro).appendChild(TABLE);
8655                $("#tableStat" + parametros.contenedorCuadro).hide();
8656                $("#TableEspacio" + parametros.contenedorCuadro).hide();
8657            }
8658            /*===========================================================
8659            = FICHA RESUMEN #13 V3 - 08 Nov 2019           =
8660            = MEXICO EN CIFRAS - V3 API metodo CatalogoAreaGeograficav3/ (EN USO ACTUAL)          =
8661            ===========================================================*/
8662            function DibujaCuadroTipo13V3_New(data, parametros) {   
8663                /* objEntidadSeleccionadaMC = {
8664                    "cveMpio": "01003",
8665                    "cveEnt": "01",
8666                    "mpio": "Calvillo",
8667                    "ent": "Aguascalientes"
8668                    };      */ 
8669                //variable global con datos principales de las entidades seleccionadas desde el combo de entidades
8670                // var objEntidadSeleccionadaMC = {cveMpio: '00', cveEnt: '00', mpio: '', ent: 'Estados Unidos Mexicanos'}                
8671                var objEntidadSeleccionada = (typeof objEntidadSeleccionadaMC === "undefined")? {cveMpio:"n/d",cveEnt:"n/d", mpio:"",ent:""} : objEntidadSeleccionadaMC ; 
8672                if((parametros.areaSeleccionada !== undefined) && typeof objEntidadSeleccionadaMC === "undefined") objEntidadSeleccionada = parametros.areaSeleccionada;                
8673 
8674                //traduccion
8675                var idioma = parametros.idioma;
8676                var UL = document.createElement("ul");
8677                    UL.id = "ulCardLocalidad_" + parametros.contenedorCuadro;                                
8678                    UL.style.paddingLeft = "0px";
8679                var LI = document.createElement("li"); LI.style.display = "block"; LI.style.width = "100%";
8680                var SPAN = document.createElement("span");
8681
8682                var titulo1 = "Capital", titulo2 = "Coordenadas"; titulo3 = "Entidades &area", titulo4 = "Superficie";
8683                if (idioma === "en") {
8684                    titulo2 = "Coordinates";
8685                    titulo3 = "Number of &area";
8686                    titulo4 = "Area";
8687                }
8688               
8689                var styleHeaders = 'background:#ddd;font-family:"HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;border:1px solid #fff;border-top:1px solid #c8c8c8;border-left:1px solid #c8c8c8;border-right:1px solid #c8c8c8;';
8690                var styleGeneral = "border:1px solid #c8c8c8;";
8691
8692                // Entidad y municipio
8693                var LIEntidad = LI.cloneNode(true);
8694                var SpanEntidad = SPAN.cloneNode(true);
8695                SpanEntidad.style.fontWeight = "bold";
8696                SpanEntidad.style.padding = "0px 10px 0px 0px";
8697                SpanEntidad.style.display = "inline-block";
8698                SpanEntidad.className = "cls-block-loc";
8699                SpanEntidad.style.width = "40%";
8700                if(parametros.areaGeografica === "00" || parametros.areaGeografica === "0"){
8701                // if(parametros.areaGeografica === "00" || parametros.areaGeografica === "0700"){
8702                    SpanEntidad.innerHTML = (parametros.idioma == "es"? "Nación:" : "Country:");                
8703                } else {
8704                    SpanEntidad.innerHTML = (parametros.idioma == "es"? "Entidad federativa:" : "Federal entity:");                
8705                }
8706                LIEntidad.appendChild(SpanEntidad);
8707
8708                var SpanEntidadValor = SPAN.cloneNode(true);
8709                SpanEntidadValor.style.display = "inline-block";
8710                SpanEntidadValor.style.width = "60%";
8711                // if(objEntidadSeleccionada.mpio !== "" || objEntidadSeleccionada.cveEnt === "00"){
8712                    // crea link
8713                    var link = document.createElement("a")
8714                    link.setAttribute("href", C_dominioBuscador+"app/areasgeograficas?ag=" + objEntidadSeleccionada.cveEnt);
8715                    link.setAttribute("target","_blank");
8716                    // link.innerHTML = objEntidadSeleccionada.cveEnt +" "+ objEntidadSeleccionada.ent
8717                    link.innerHTML = objEntidadSeleccionada.ent +" ("+objEntidadSeleccionada.cveEnt+")"
8718                    SpanEntidadValor.append(link)
8719                // } else if(objEntidadSeleccionada.cveEnt === "00"){                    
8720                //     SpanEntidadValor.innerHTML = objEntidadSeleccionada.ent;
8721                // } else {
8722                //     SpanEntidadValor.innerHTML = objEntidadSeleccionada.ent +" ("+objEntidadSeleccionada.cveEnt+")"
8723                // }
8724                LIEntidad.appendChild(SpanEntidadValor);
8725
8726                UL.appendChild(LIEntidad)
8727                
8728                if(objEntidadSeleccionada.mpio !== ""){
8729                    var LIMpio = LI.cloneNode(true);
8730                    var SpanMpio = SPAN.cloneNode(true);
8731                    SpanMpio.style.fontWeight = "bold";
8732                    SpanMpio.style.padding = "0px 10px 0px 0px";
8733                    SpanMpio.style.display = "inline-block";
8734                    SpanMpio.style.width = "40%";
8735                    SpanMpio.className = "cls-block-loc";
8736                    SpanMpio.innerHTML = (parametros.idioma == "es"? "Municipio:" : "Municipality:");                
8737                    LIMpio.appendChild(SpanMpio);
8738
8739                    var SpanMpioValor = SPAN.cloneNode(true);
8740                    SpanMpioValor.style.display = "inline-block";
8741                    SpanMpioValor.style.width = "60%";
8742                    // SpanMpioValor.innerHTML = objEntidadSeleccionada.cveMpio +" "+ objEntidadSeleccionada.mpio;
8743                    var link = document.createElement("a")
8744                    link.setAttribute("href", C_dominioBuscador+"app/areasgeograficas?ag=" + objEntidadSeleccionad
8744a.cveMpio);
8745                    link.setAttribute("target","_blank");
8746                    // link.innerHTML = objEntidadSeleccionada.cveMpio +" "+ objEntidadSeleccionada.mpio
8747                    link.innerHTML =  objEntidadSeleccionada.mpio +" ("+ objEntidadSeleccionada.cveMpio +")"
8748                    SpanMpioValor.append(link)
8749                    LIMpio.appendChild(SpanMpioValor);
8750
8751                    UL.appendChild(LIMpio)
8752                }
8753            
8754                //cel Coordenadas  
8755                if(data.hasOwnProperty("coordinates")){    
8756                    var SpanCoorTitulo = SPAN.cloneNode(true);
8757                    SpanCoorTitulo.innerHTML = (parametros.idioma == "es"? "Coordenadas:" : "Coordinates:");
8758                    SpanCoorTitulo.style.fontWeight = "bold";
8759                    SpanCoorTitulo.style.padding = "0px 10px 0px 0px";
8760                    SpanCoorTitulo.style.display = "inline-block";
8761                    SpanCoorTitulo.style.verticalAlign = "top";
8762                    SpanCoorTitulo.style.width = "40%";
8763                    SpanCoorTitulo.className = "cls-block-loc";
8764
8765                    var latitud = "", longitud = "";
8766                    if(data.coordinates.length == 2){
8767                        var lat1_grados = data.coordinates[0][0].split("°")[0];
8768                        var lat1_decimales = (data.coordinates[0][0].split("'")[0]).split("°")[1];
8769                        var lat1_minutos = data.coordinates[0][0].split("'")[1];
8770                        var lat2_grados = data.coordinates[1][0].split("°")[0];                        
8771                        var lat2_decimales = (data.coordinates[1][0].split("'")[0]).split("°")[1];
8772                        var lat2_minutos = data.coordinates[1][0].split("'")[1];                        
8773
8774                        var lon1_grados = data.coordinates[0][1].split("°")[0];
8775                        var lon1_decimales = (data.coordinates[0][1].split("'")[0]).split("°")[1];
8776                        var lon1_minutos = data.coordinates[0][1].split("'")[1];
8777                        var lon2_grados = data.coordinates[1][1].split("°")[0];
8778                        var lon2_decimales = (data.coordinates[1][1].split("'")[0]).split("°")[1];
8779                        var lon2_minutos = data.coordinates[1][1].split("'")[1];
8780                        var styleSpan = "text-align:right;display:inline-block;";
8781                        var styleSpan2 = "text-align:right;display:inline-block;";
8782                        //idioma textos                        
8783                        var latitudTitle = (parametros.idioma === "en")? "Latitude" : "Latitud"; 
8784                        var longitudTitle = (parametros.idioma === "en")? "Longitude" : "Longitud"; 
8785                        latitud = '<span style="width:auto;display:inline-block;padding-right:6px">'+ latitudTitle +'</span><span style="' + styleSpan + '">' + lat1_grados + '°</span><span style="' + styleSpan + '">' + lat1_decimales + '\'</span><span style="' + styleSpan2 + '">' + lat1_minutos + '</span>&nbsp;&nbsp;<span style="' + styleSpan + '">' + lat2_grados + '°</span><span style="' + styleSpan + '">' + lat2_decimales + '\'</span><span style="' + styleSpan2 + '">' + lat2_minutos +'</span>';     
8786                        longitud = '<span style="width:auto;display:inline-block;padding-right:6px">'+ longitudTitle +'</span><span style="' + styleSpan + '">' + lon1_grados + '°</span><span style="' + styleSpan + '">' + lon1_decimales + '\'</span><span style="' + styleSpan2 + '">' + lon1_minutos + '</span>&nbsp;&nbsp;<span style="' + styleSpan + '">' + lon2_grados + '°</span><span style="' + styleSpan + '">' + lon2_decimales + '\'</span><span style="' + styleSpan2 + '">' + lon2_minutos + '</span>';          
8787                    } else {
8788                        latitud = data.coordinates[0] + " " + data.coordinates[1].replace("-","");
8789                        
8790                    }
8791                    var SpanCoorValores = SPAN.cloneNode(true);
8792                    SpanCoorValores.style.display = "inline-block";
8793                    SpanCoorValores.style.width = "60%";
8794                    SpanCoorValores.innerHTML = longitud + ",<br /> " + latitud;                    
8795                    var LICoor = LI.cloneNode(true);                                        
8796                    LICoor.appendChild(SpanCoorTitulo);
8797                    LICoor.appendChild(SpanCoorValores);
8798                    UL.appendChild(LICoor);        
8799                }                
8800                
8801                //celda para conteo Numero de municipios / entidades / localidades                
8802                var INTLFormat = Intl.NumberFormat('es-MX',{style:'decimal'});      
8803                var cont = 0;                    
8804                if(data.AREAS_GEOGRAFICAS_DEPENDIENTES !== null || parametros.areaGeografica.length === 5){
8805                    
8806                    var LIArea = LI.cloneNode(true);                                        
8807                    var SpanAreaTitulo = SPAN.cloneNode(true);
8808                    SpanAreaTitulo.style.display = "inline-block";
8809                    SpanAreaTitulo.style.width = "40%";
8810                    SpanAreaTitulo.className = "cls-block-loc";
8811                    SpanAreaTitulo.style.fontWeight = "bold";                     
8812                    SpanAreaTitulo.style.padding = "0px 10px 0px 0px";
8813
8814                    var SpanAreaValor = SPAN.cloneNode(true);
8815                    SpanAreaValor.style.display = "inline-block";
8816                    SpanAreaValor.style.width = "60%";
8817                    if(parametros.areaGeografica === "09"){
8818                        SpanAreaTitulo.innerHTML = (idioma === "en" ? "Territorial districts:" : "Demarcaciones territoriales:");
8819                    } else {
8820                        SpanAreaTitulo.innerHTML = ((parametros.areaGeografica === "0" || parametros.areaGeografica === "00") ? (idioma === "en" ? "Federal entities:" : "Entidades federativas:") : ((parametros.areaGeografica.length === 5)? (idioma === "en" ? "Locations:" : "Localidades:") : (idioma === "en" ? "Municipalities:" : "Municipios:")));
8821                        // SpanAreaTitulo.innerHTML = ((parametros.areaGeografica == "0700" || parametros.areaGeografica == "00") ? (idioma === "en" ? "Federal entities:" : "Entidades federativas:") : ((parametros.areaGeografica.length === 5)? (idioma === "en" ? "Locations:" : "Localidades:") : (idioma === "en" ? "Municipalities:" : "Municipios:")));
8822                    }
8823                    LIArea.appendChild(SpanAreaTitulo);
8824                    // Finalmente se queda el conteo de municipios (por llamado a api inegi.org.mx/app/api/cateml/json/ageo/01)
8825                    // Uso de: data.HIJOS)
8826                    // Fecha: 02-03-2023          
8827                    SpanAreaValor.innerHTML= INTLFormat.format(data.HIJOS);
8828                    LIArea.appendChild(SpanAreaValor);
8829                    UL.appendChild(LIArea);  
8830                }
8831
8832                // para nacional coloca las demarcaciones territoriales
8833                // agregado: 18-04-2023
8834                // ID:687
8835                if(parametros.areaGeografica === "0" || parametros.areaGeografica === "00"){
8836                // if(parametros.areaGeografica === "0700" || parametros.areaGeografica === "00"){
8837                    var LIArea = LI.cloneNode(true);                                        
8838                    var SpanAreaTitulo = SPAN.cloneNode(true);
8839                    SpanAreaTitulo.style.display = "inline-block";
8840                    SpanAreaTitulo.style.width = "40%";
8841                    SpanAreaTitulo.className = "cls-block-loc";
8842                    SpanAreaTitulo.style.fontWeight = "bold";                     
8843                    SpanAreaTitulo.style.padding = "0px 10px 0px 0px";
8844
8845                    var SpanAreaValor = SPAN.cloneNode(true);
8846                    SpanAreaValor.style.display = "inline-block";
8847                    SpanAreaValor.style.width = "60%";
8848                    SpanAreaTitulo.innerHTML = (idioma === "en" ? "Municipalities and territorial districts:" : "Municipios y demarcaciones territoriales:");
8849                    LIArea.appendChild(SpanAreaTitulo);
8850                    // Finalmente se queda el conteo de municipios (por llamado a api inegi.org.mx/app/api/cateml/json/ageo/01)
8851                    // Uso de: data.HIJOS)
8852                    // Fecha: 02-03-2023                                                                       
8853                    SpanAreaValor.innerHTML= INTLFormat.format(data.demarcaciones_territoriales);
8854                    LIArea.appendChild(SpanAreaValor);
8855                    UL.appendChild(LIArea);  
8856                }
8857                // Fecha de referencia de actualizacion del catalogo unico de claves geoestadisticas
8858                // Agregado: 28-04-2023
8859                if(data.referencia_actualizacion !== undefined) {
8860                    var LIReferencia = LI.cloneNode(true);                                        
8861                    var SpanReferenciaTitulo = SPAN.cloneNode(true);
8862                    SpanReferenciaTitulo.style.display = "inline-block";
8863                    SpanReferenciaTitulo.style.width = "40%";
8864                    SpanReferenciaTitulo.className = "cls-block-loc";
8865                    SpanReferenciaTitulo.style.fontWeight = "bold";                     
8866                    SpanReferenciaTitulo.style.padding = "0px 10px 0px 0px";
8867
8868                    var SpanReferenciaValor = SPAN.cloneNode(true);
8869                    SpanReferenciaValor.style.display = "inline-block";
8870                    SpanReferenciaValor.style.width = "60%";
8871                    SpanReferenciaTitulo.innerHTML = (idioma === "en" ? "Upd
8871ate reference:" : "Referencia de actualización:");
8872                    LIReferencia.appendChild(SpanReferenciaTitulo);
8873                                                                      
8874                    SpanReferenciaValor.innerHTML= data.referencia_actualizacion.split(" ")[0];
8875                    LIReferencia.appendChild(SpanReferenciaValor);
8876                    UL.appendChild(LIReferencia);  
8877                }
8878
8879                document.getElementById("divDatos" + parametros.contenedorCuadro).appendChild(UL);
8880                
8881                $(window).resize(function(e){
8882                    var widthWindow = document.body.clientWidth;
8883                    if(widthWindow >= 480){
8884                        $("#ulCardLocalidad_" + parametros.contenedorCuadro).find(".cls-block-loc").css({width:"40%"});
8885                        
8886                    } else {                        
8887                        $("#ulCardLocalidad_" + parametros.contenedorCuadro).find(".cls-block-loc").css({width:"auto"});
8888                        
8889                    }
8890                })
8891                var widthWindow = document.body.clientWidth;
8892                    if(widthWindow >= 510){
8893                        $("#ulCardLocalidad_" + parametros.contenedorCuadro).find(".cls-block-loc").css({width:"40%"});
8894                        
8895                    } else {
8896                        $("#ulCardLocalidad_" + parametros.contenedorCuadro).find(".cls-block-loc").css({width:"auto"});
8897                        
8898                    }
8899                $("#tableStat" + parametros.contenedorCuadro).hide();
8900                $("#TableEspacio" + parametros.contenedorCuadro).hide();
8901            }
8902            /*===========================================================
8903            = FICHA RESUMEN #13 V2 GRID EXTJS - 10 Jul 2019           =
8904            = MEXICO EN CIFRAS - V2 API metodo CatalogoAreaGeograficav2/           =
8905            ===========================================================*/
8906            function DibujaCuadroTipo13V2_New(data, parametros) {
8907                // console.log("demo")
8908                //armar tabla  
8909                //traduccion
8910                var idioma = parametros.idioma;
8911                var titulo1 = "Capital", titulo2 = "Coordenadas"; titulo3 = "Entidades &area", titulo4 = "Superficie";
8912                if (idioma === "en") {
8913                    titulo2 = "Coordinates";
8914                    titulo3 = "Number of &area";
8915                    titulo4 = "Area";
8916                }
8917                var TABLE = document.createElement("table");
8918                TABLE.className = 'table table-bordered table-hover table-responsive';
8919                var tBody = (!BROWSER.ie()) ? TABLE.createTBody() : document.createElement("tbody");
8920                var tRowBody = (!BROWSER.ie()) ? tBody.insertRow() : document.createElement("tr");
8921            
8922                var styleHeaders = 'background:#ddd;font-family:"HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;border:1px solid #fff;border-top:1px solid #c8c8c8;border-left:1px solid #c8c8c8;border-right:1px solid #c8c8c8;';
8923                var styleGeneral = "border:1px solid #c8c8c8;";
8924                //cel Capital
8925                //var cellHeader = document.createElement("th");
8926                //cellHeader.innerHTML = titulo1;
8927                //cellHeader.style = styleHeaders;
8928                //tRowBody.appendChild(cellHeader);        
8929                //var cell = document.createElement("td");
8930                //cell.style = styleGeneral;        
8931                //cell.innerHTML = data.Nombre;
8932                //tRowBody.appendChild(cell);  
8933                
8934                if (BROWSER.ie) {
8935                    tBody.appendChild(tRowBody);
8936                    TABLE.appendChild(tBody)
8937                }
8938                
8939                //cel Coordenadas  
8940                if(data.hasOwnProperty("coordinates")){    
8941                   
8942                    var cellHeader = document.createElement("th");
8943                    cellHeader.innerHTML = titulo2;
8944                    tRowBody.appendChild(cellHeader);
8945                    cellHeader.style = styleHeaders + "border-bottom:1px solid #c8c8c8;border-top:1px solid #c8c8c8;";        
8946                    var cell = document.createElement("td");
8947                    var latitud = "", longitud = "";
8948                    if(data.coordinates.length == 2){
8949                        var lat1_grados = data.coordinates[0][0].split("°")[0];
8950                        var lat1_decimales = (data.coordinates[0][0].split("'")[0]).split("°")[1];
8951                        var lat1_minutos = data.coordinates[0][0].split("'")[1];
8952                        var lat2_grados = data.coordinates[1][0].split("°")[0];                        
8953                        var lat2_decimales = (data.coordinates[1][0].split("'")[0]).split("°")[1];
8954                        var lat2_minutos = data.coordinates[1][0].split("'")[1];                        
8955
8956                        var lon1_grados = data.coordinates[0][1].split("°")[0];
8957                        var lon1_decimales = (data.coordinates[0][1].split("'")[0]).split("°")[1];
8958                        var lon1_minutos = data.coordinates[0][1].split("'")[1];
8959                        var lon2_grados = data.coordinates[1][1].split("°")[0];
8960                        var lon2_decimales = (data.coordinates[1][1].split("'")[0]).split("°")[1];
8961                        var lon2_minutos = data.coordinates[1][1].split("'")[1];
8962                        var styleSpan = "text-align:right;display:inline-block;";
8963                        var styleSpan2 = "text-align:right;display:inline-block;";
8964                        //idioma textos                        
8965                        var latitudTitle = (parametros.idioma === "en")? "Latitude" : "Latitud"; 
8966                        var longitudTitle = (parametros.idioma === "en")? "Longitude" : "Longitud"; 
8967                        latitud = '<span style="width:80px;display:inline-block;">'+ latitudTitle +'</span><span style="' + styleSpan + '">' + lat1_grados + '°</span><span style="' + styleSpan + '">' + lat1_decimales + '\'</span><span style="' + styleSpan2 + '">' + lat1_minutos + '</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="' + styleSpan + '">' + lat2_grados + '°</span><span style="' + styleSpan + '">' + lat2_decimales + '\'</span><span style="' + styleSpan2 + '">' + lat2_minutos +'</span>';     
8968                        longitud = '<span style="width:80px;display:inline-block;">'+ longitudTitle +'</span><span style="' + styleSpan + '">' + lon1_grados + '°</span><span style="' + styleSpan + '">' + lon1_decimales + '\'</span><span style="' + styleSpan2 + '">' + lon1_minutos + '</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="' + styleSpan + '">' + lon2_grados + '°</span><span style="' + styleSpan + '">' + lon2_decimales + '\'</span><span style="' + styleSpan2 + '">' + lon2_minutos + '</span>';          
8969                        // latitud = "Latitud &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + data.coordinates[0][0] + "&nbsp;&nbsp;&nbsp;" + data.coordinates[1][0];
8970                        // longitud = "Longitud &nbsp;&nbsp;"+data.coordinates[0][1].replace("-", "") + "&nbsp;&nbsp;" + data.coordinates[1][1].replace("-", "");
8971                    } else {
8972                        latitud = data.coordinates[0] + " " + data.coordinates[1].replace("-","");
8973                        
8974                    }
8975                    //var latitud = parseFloat(data.LATITUD_GRADOS1).toFixed(0) + "° " + (data.LATITUD_MINUTOS1 == "" || data.LATITUD_MINUTOS1 == "0" ? "" : data.LATITUD_MINUTOS1 + "'") + " " + parseFloat(data.LATITUD_GRADOS2).toFixed(0) + "° " + (data.LATITUD_MINUTOS2 == "" || data.LATITUD_MINUTOS2 == '0' ? "" : data.LATITUD_MINUTOS2 + "'") + " N";
8976                    // var longitud = parseFloat(data.LONGITUD_GRADOS1).toFixed(0) + "° " + (data.LONGITUD_MINUTOS1 == "" || data.LONGITUD_MINUTOS1 == "0" ? "" : data.LONGITUD_MINUTOS1 + "'") + " " + parseFloat(data.LONGITUD_GRADOS2).toFixed(0) + "° " + (data.LONGITUD_MINUTOS2 == "" || data.LONGITUD_MINUTOS2 == '0' ? "" : data.LONGITUD_MINUTOS2 + "'") + " O";
8977                    cell.innerHTML = longitud + "<br />" + latitud;
8978                    tRowBody.appendChild(cell);        
8979                }
8980                var tRowBody = (!BROWSER.ie()) ? tBody.insertRow() : document.createElement("tr");
8981                
8982                //cel Numero de municipios / entidades
8983                // if(data.TOTAL_AREAS !== null){
8984                var cont = 0;                    
8985                if(data.AREAS_GEOGRAFICAS_DEPENDIENTES !== null){
8986                    var cellHeader = document.createElement("th");
8987                    //var area = (parametros.areaGeografica == "00" ? (idioma === "en" ? "States" : "Federativas") : (idioma === "en" ? "Municipalities" : "Municipios"));
8988                    var area = ((parametros.areaGeografica == "0700" || parametros.areaGeografica == "00") ? (idioma === "en" ? "Federal Entities" : "Entidades Federativas") : (idioma === "en" ? "Municipalities" : "Municipios"));
8989                    //cellHeader.innerHTML = titulo3.replace("&area", area);
8990                    cellHeader.innerHTML = area;
8991                    cellHeader.style = styleHeaders + "border-bottom:1px solid #c8c8c8;";
8992                    tRowBody.appendChild(cellHeader);
8993                
8994                    var cell = document.createElement("td");
8995                    //cell.setAttribute("colspan", 3)   
8996                    cell.style.width = "50%";
8997                    // cell.innerHTML = data.TOTAL_AREAS;
8998                    $.each(data.AREAS_GEOGRAFICAS_DEPENDIENTES, function (key, mpio) {
8999                       /*  if (mpio.UBICACION_GEOGRAFICA !== 2516 && 
9000                            mpio.UBICACION_GEOGRAFICA !== 2594 && 
9001                            mpio.UBICACION_GEOGRAFICA !== 2884 && 
9002                            mpio.UBICACION_GEOGRAFICA !== 3274) { */
9003                            ++cont;
9004                        // }
9005                    });
9006                    cell.innerHTML = data.AREAS_GEOGRAFICAS_DEPENDIENTES.length > 0 ? cont : 32;
9007                    tRowBody.appendChild(cell);
9008                }
9009                /* if (data.AREAS_GEOGRAFICAS_DEPENDIENTES != null && data.AREAS_GEOGRAFICAS_DEPENDIENTES.length > 1) {
9010                    var cont = 0;
9011                    $.each(data.AREAS_GEOGRAFICAS_DEPENDIENTES, function (key, mpio) {
9012                        if (mpio.UBICACION_GEOGRAFICA !== "2516" && 
9013                            mpio.UBICACION_GEOGRAFICA !== "2594" && 
9014                            mpio.UBICACION_GEOGRAFICA !== "2884" && 
9015                            mpio.UBICACION_GEOGRAFICA !== "3274") {
9016                            ++cont;
9017                        }
9018                    });
9019                    cell.innerHTML = data.AREAS_GEOGRAFICAS_DEPENDIENTES.length > 1 ? cont : 32;
9020                    tRowBody.appendChild(cell);
9021                } */                
9022                
9023                // estilos  
9024                if (BROWSER.ie) {
9025                    tBody.appendChild(tRowBody);
9026                    TABLE.appendChild(tBody)
9027                }
9028                TABLE.style.width = "99.9%";                
9029                
9030                document.getElementById("divDatos" + parametros.contenedorCuadro).appendChild(TABLE);
9031                $("#tableStat" + parametros.contenedorCuadro).hide();
9032                $("#TableEspacio" + parametros.contenedorCuadro).hide();
9033            }
9034            
9035            /*===========================================================
9036            =            CUADRO #15 GRID EXTJS - 5 Abril 2018            =
9037            =  Ultima modificación: 5-4-2018                                 =
9038            ===========================================================*/
9039            function DibujaCuadroTipo15_New(data, parametros) {
9040                var idioma = parametros.idioma;
9041                //var aMeses = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', '
9041Septiembre', 'Octubre', 'Noviembre', 'Diciembre'];
9042                //if (idioma === "en") aMeses = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'Octuber', 'November', 'December'];
9043                var datos_tabla = [];
9044                var columnas_tabla = [];
9045                var aDefaultColumnas = ["Periodo"];
9046                var dataValores = data.value;
9047                var agrupamiento = parametros.agrupamiento = parametros.indicadorValorCompuesto.agrupamiento;
9048                var dataPeriodos = data.dimension.periods.category;
9049                var totalPeriodos = data.dimension.periods.category.index.length;
9050                
9051                
9052                //ARMADO DE COLUMNAS DEL GRID /////////////////////////////////////////////////////////////////       
9053                
9054                // Columna principal titulo
9055                for (var x = 0; x < aDefaultColumnas.length; x++) {
9056                    columnas_tabla.push({
9057                        title: aDefaultColumnas[x],
9058                        width: 250,
9059                        dataIndex: "col" + x,
9060                        fix: false,
9061                    });
9062                }
9063                // ARMADO DE COLUMNAS MESES Y LA ANUAL
9064                var aPeriodos = dataPeriodos.label;
9065                var aAniosRenglones = [];
9066                var aMesesColumnas = [];
9067                var colIncremento = columnas_tabla.length;
9068                $.each(aPeriodos, function (index, periodo) {
9069                    var anio = periodo.Value.split("/")[0];
9070                    if (aAniosRenglones.indexOf(anio) === -1) {
9071                        aAniosRenglones.push(anio);
9072                    }
9073                    
9074                    var mes = periodo.Value.split("/")[1];
9075                    if (aMesesColumnas.indexOf(mes) === -1) {
9076                        var mesNombre = (mes === "13") ? "Anual" : oMESES.getMesNombreCorto(parseInt(mes), parametros.idioma);//aMeses[parseInt(mes) - 1];
9077                        aMesesColumnas.push(mes);
9078                        columnas_tabla.push({
9079                            title: mesNombre,
9080                            width: 250,
9081                            dataIndex: "col" + colIncremento,
9082                            fix: false,
9083                        });
9084                        colIncremento++;
9085                    }
9086                    aPeriodos[index].anio = anio;
9087                    aPeriodos[index].mes = mes;
9088                });
9089                // ARMADO DE DATOS DE COLUMNA 0 (NOMBRES DE PERIODOS / AÑOS)
9090                var valor = "";
9091                $.each(aAniosRenglones, function (index, anio) {
9092                    var objRenglon = JSON.parse('{"' + "col0" + '":"' + anio + '"}');
9093                    var col = 1;
9094                    
9095                    $.each(aMesesColumnas, function (indexP, mes) {
9096                        valor = "-";
9097                        var oPeriodo = dataPeriodos.label.filter(function (o) {
9098                            return o.Value === (anio + "/" + mes);
9099                        })[0];
9100                        //if (oPeriodo !== undefined) {    
9101                        //    console.log(oPeriodo);
9102                        //    var posicion = dataPeriodos.index.indexOf(oPeriodo.Key);
9103                        //    console.log(posicion);
9104                        //    valor = dataValores[posicion];
9105                        //    console.log("-------")
9106                        //}                
9107                        //$.extend(objRenglon, JSON.parse('{"' + "col" + parseInt(col) + '":"' + valor + '"}'));
9108                        col++;
9109                    });
9110                    datos_tabla.push(objRenglon);
9111                });
9112                
9113                //aIndicadores = parametros.indicadorValorCompuesto.grupos;
9114                //var dataIndicadores = data.dimension.indicator.category.label; // arreglo de indicadores, respuesta de peticion
9115                //var dataPeriodos = data.dimension.periods.category; // periodos en index y label
9116                ////titulo indicadores primera columna del cuadro         
9117                //if (parametros.indicadorValorCompuesto.grupos) {
9118                //    var textoAgrupamiento = "";
9119                //    $.each(aIndicadores, function (key, item) {
9120                //        var objRenglon = item;
9121                //        if (item.indicadores == undefined) {
9122                //            textoAgrupamiento = item.titulo;
9123                //        }
9124                //        $.extend(objRenglon, JSON.parse('{"' + "col0" + '":"' + item.titulo + '"}'));
9125                //        datos_tabla.push(objRenglon);
9126                //    });
9127                //} else {
9128                //    $.each(dataIndicadores, function (key, item) {
9129                //        var objRenglon = item;
9130                //        $.extend(objRenglon, JSON.parse('{"' + "col0" + '":"' + item.Value + '"}'));
9131                //        datos_tabla.push(objRenglon);
9132                //    });
9133                //}
9134                /// LLENADO DE DATOS (RENGLONES INDICADOR-VALOR)
9135                /// ----> LLenado de indicadores_valores de la matriz de valores usando formula JSON-Stat
9136                var indicadores_valores = [];
9137                
9138                
9139                
9140                
9141                //parametros.grid_configuracion.hide_columns = [];        
9142                // envuelve notas en un box 
9143                $("#divFuentes" + parametros.contenedorCuadro).css({ "backgroundColor": "#eaf3f3", "padding": "6px 8px", "margin": "6px 1px 6px 1px", "borderRadius": "2px", "display": "none" });
9144                //$("#divFuentes" + parametros.contenedorCuadro).addClass("collapsed");
9145                
9146                //adding event toggle notas/fuentes ////////////////////////////////////////////////////////////////////////////////
9147                var toggleTarget = "divFuentes" + parametros.contenedorCuadro;
9148                var aToggle = document.createElement("a");
9149                aToggle.innerHTML = "Mostrar Notas / Fuentes";
9150                aToggle.id = "linkToggle_" + parametros.contenedorCuadro;
9151                aToggle.style = "cursor:pointer;";
9152                $(aToggle).insertBefore("#" + toggleTarget);
9153                $(document).ready(function () {
9154                    $("#" + aToggle.id).click(function () {
9155                        var linkEl = this;
9156                        $("#divFuentes" + parametros.contenedorCuadro).slideToggle("fast", function () {
9157                            if ($(this).is(":visible")) {
9158                                $(linkEl).html("Ocultar Notas / Fuentes");
9159                            } else {
9160                                $(linkEl).html("Mostrar Notas / Fuentes");
9161                            }
9162                        });
9163                    });
9164                });
9165                
9166                //Recibir configuracion de altura y estilos del grid 
9167                var TABLA = new GridComponent();
9168                TABLA.render(columnas_tabla, datos_tabla, parametros);
9169            }
9170            /*===========================================================
9171            =            FICHA INFORMACON LOCALIDAD #16 HTML PURO - 14 Diciembre 2018            =
9172            ===========================================================*/
9173            function DibujaCuadroTipo16(data, parametros) {
9174                var aTitulos = [];
9175                var idioma = parametros.idioma;
9176                if (idioma == "es") {
9177                    aTitulos = ["Identificación geoestadística", "Clave de Identidad federativa", "Entidad federativa", "Clave de municipio", "Municipio", "Clave de localidad", "Localidad", "Tipificación", "Tipo de Localidad habitada", "Es cabecera municipal", "Cabecera municipal", "Ubicación geográfica", "Latitud norte", "Latitud oeste", "Altitud"];
9178                } else {
9179                    aTitulos = ["Geostatistical identification", "State Entity Code", "State Entity", "Municipality code", "Municipality", "Code Locality", "Locality", "Typification", "Type of inhabited locality", "It is municipal head", "Municipal head", "Geographic location", "North Latitude", "West Latitude", "Altitude"];
9180                }
9181                
9182                var TABLE = document.createElement("table");
9183                TABLE.className = 'table table-bordered table-responsive';
9184                var tBody = (!BROWSER.ie()) ? TABLE.createTBody() : document.createElement("tbody");
9185                var tRowBody = (!BROWSER.ie()) ? tBody.insertRow() : document.createElement("tr");
9186                
9187                var styleHeaders = 'width:30%;background:#f1f1f1;font-family:"HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;border:1px solid #fff;border-top:1px solid #c8c8c8;border-left:1px solid #c8c8c8;border-right:1px solid #c8c8c8;';
9188                var styleGeneral = "border:1px solid #c8c8c8;";
9189                var styleCaptions = 'background:#ddd;font-weight:bold;';
9190                
9191                if (BROWSER.ie) {
9192                    tBody.appendChild(tRowBody);
9193                    TABLE.appendChild(tBody)
9194                }
9195                
9196                //CAPTION 1
9197                var cellCaption = document.createElement("th");
9198                cellCaption.innerHTML = aTitulos[0];
9199                cellCaption.colSpan = 3;
9200                cellCaption.style = styleCaptions;
9201                tRowBody.appendChild(cellCaption);
9202                
9203                // ROW DATA 1
9204                var tRowBody = (!BROWSER.ie()) ? tBody.insertRow() : document.createElement("tr");
9205                var cellHeader = document.createElement("th");
9206                cellHeader.innerHTML = aTitulos[1];
9207                cellHeader.colSpan = 1;
9208                tRowBody.appendChild(cellHeader);
9209                
9210                cellHeader.style = styleHeaders + "border-bottom:1px solid #c8c8c8;border-top:1px solid #c8c8c8;";
9211                var cell = document.createElement("td");
9212                cell.innerHTML = "Valor";
9213                tRowBody.appendChild(cell);
9214                
9215                if (BROWSER.ie) {
9216                    tBody.appendChild(tRowBody);
9217                    TABLE.appendChild(tBody)
9218                }
9219                
9220                // ROW DATA 2
9221                var tRowBody = (!BROWSER.ie()) ? tBody.insertRow() : document.createElement("tr");
9222                var cellHeader = document.createElement("th");
9223                cellHeader.innerHTML = aTitulos[2];
9224                cellHeader.colSpan = 1;
9225                tRowBody.appendChild(cellHeader);
9226                
9227                cellHeader.style = styleHeaders + "border-bottom:1px solid #c8c8c8;border-top:1px solid #c8c8c8;";
9228                var cell = document.createElement("td");
9229                cell.innerHTML = "Valor";
9230                tRowBody.appendChild(cell);
9231                
9232                if (BROWSER.ie) {
9233                    tBody.appendChild(tRowBody);
9234                    TABLE.appendChild(tBody)
9235                }
9236                // ROW DATA 3
9237                var tRowBody = (!BROWSER.ie()) ? tBody.insertRow() : document.createElement("tr");
9238                var cellHeader = document.createElement("th");
9239                cellHeader.innerHTML = aTitulos[3];
9240                cellHeader.colSpan = 1;
9241                tRowBody.appendChild(cellHeader);
9242                
9243                cellHeader.style = styleHeaders + "border-bottom:1px solid #c8c8c8;border-top:1px solid #c8c8c8;";
9244                var cell = document.createElement("td");
9245                cell.innerHTML = "Valor";
9246                tRowBody.appendChild(cell);
9247                
9248                if (BROWSER.ie) {
9249                    tBody.appendChild(tRowBody);
9250                    TABLE.appendChild(tBody)
9251                }
9252                
9253                // ROW DATA 4
9254                var tRowBody = (!BROWSER.ie()) ? tBody.insertRow() : document.createElement("tr");
9255                var cellHeader = document.createElement("th");
9256                cellHeader.innerHTML = aTitulos[4];
9257                cellHeader.colSpan = 1;
9258                tRowBody.appendChild(cellHeader);
9259                
9260                cellHeader.style = styleHeaders + "border-bottom:1px solid #c8c8c8;border-top:1px solid #c8c8c8;";
9261                var cell = document.createElement("td");
9262                cell.innerHTML = "Valor";
9263                tRowBody.appendChild(cell);
9264                
9265                if (BROWSER.ie) {
9266                    tBody.appendChild(tRowBody);
9267                    TABLE.appendChild(tBody)
9268                }
9269                
9270                // ROW DATA 5
9271                var tRowBody = (!BROWSER.ie()) ? tBody.insertRow() : document.createElement("tr");
9272                var cellHeader = document.createElement("th");
9273                cellHeader.innerHTML = aTitulos[5];
9274                cellHeader.colSpan = 1;
9275                tRowBody.appendChild(cellHeader);
9276                
9277                cellHeader.style = styleHeaders + "border-bottom:1px solid #c8c8c8;border-top:1px solid #c8c8c8;";
9278                var cell = document.createElement("td");
9279                cell.innerHTML = "Valor";
9280                tRowBody.appendChild(cell);
9281                
9282                if (BROWSER.ie) {
9283                    tBody.appendChild(tRowBody);
9284                    TABLE.appendChild(tBody)
9285                }
9286                
9287                // ROW DATA 5
9288                var tRowBody = (!BROWSER.ie()) ? tBody.insertRow() : document.createElement("tr");
9289                var cellHeader = document.createElement("th");
9290                cellHeader.innerHTML = aTitulos[6];
9291                cellHeader.colSpan = 1;
9292                tRowBody.appendChild(cellHeader);
9293                
9294                cellHeader.style = styleHeaders + "border-bottom:1px solid #c8c8c8;border-top:1px solid #c8c8c8;";
9295                var cell = document.createElement("td");
9296                cell.innerHTML = "Valor";
9297                tRowBody.appendChild(cell);
9298                
9299                if (BROWSER.ie) {
9300                    tBody.appendChild(tRowBody);
9301                    TABLE.appendChild(tBody)
9302                }
9303                
9304                //CAPTION 2
9305                var tRowBody = (!BROWSER.ie()) ? tBody.insertRow() : document.createElement("tr");
9306                var cellCaption = document.createElement("th");
9307                cellCaption.innerHTML = aTitulos[7];
9308                cellCaption.colSpan = 3;
9309                cellCaption.style = styleCaptions;
9310                tRowBody.appendChild(cellCaption);
9311                if (BROWSER.ie) {
9312                    tBody.appendChild(tRowBody);
9313                    TABLE.appendChild(tBody)
9314                }
9315                
9316                // ROW DATA 6
9317                var tRowBody = (!BROWSER.ie()) ? tBody.insertRow() : document.createElement("tr");
9318                var cellHeader = document.createElement("th");
9319                cellHeader.innerHTML = aTitulos[8];
9320                cellHeader.colSpan = 1;
9321                tRowBody.appendChild(cellHeader);
9322                
9323                cellHeader.style = styleHeaders + "border-bottom:1px solid #c8c8c8;border-top:1px solid #c8c8c8;";
9324                var cell = document.createElement("td");
9325                cell.innerHTML = "Valor";
9326                tRowBody.appendChild(cell);
9327                
9328                if (BROWSER.ie) {
9329                    tBody.appendChild(tRowBody);
9330                    TABLE.appendChild(tBody)
9331                }
9332                
9333                // ROW DATA 7
9334                var tRowBody = (!BROWSER.ie()) ? tBody.insertRow() : document.createElement("tr");
9335                var cellHeader = document.createElement("th");
9336                cellHeader.innerHTML = aTitulos[9];
9337                cellHeader.colSpan = 1;
9338                tRowBody.appendChild(cellHeader);
9339                
9340                cellHeader.style = styleHeaders + "border-bottom:1px solid #c8c8c8;border-top:1px solid #c8c8c8;";
9341                var cell = document.createElement("td");
9342                cell.innerHTML = "Valor";
9343                tRowBody.appendChild(cell);
9344                
9345                if (BROWSER.ie) {
9346                    tBody.appendChild(tRowBody);
9347                    TABLE.appendChild(tBody)
9348                }
9349                // ROW DATA 8
9350                var tRowBody = (!BROWSER.ie()) ? tBody.insertRow() : document.createElement("tr");
9351                var cellHeader = document.createElement("th");
9352                cellHeader.innerHTML = aTitulos[10];
9353                cellHeader.colSpan = 1;
9354                tRowBody.appendChild(cellHeader);
9355                
9356                cellHeader.style = styleHeaders + "border-bottom:1px solid #c8c8c8;border-top:1px solid #c8c8c8;";
9357                var cell = document.createElement("td");
9358                cell.innerHTML = "Valor";
9359                tRowBody.appendChild(cell);
9360                
9361                if (BROWSER.ie) {
9362                    tBody.appendChild(tRowBody);
9363                    TABLE.appendChild(tBody)
9364                }
9365                
9366                //CAPTION 3
9367                var tRowBody = (!BROWSER.ie()) ? tBody.insertRow() : document.createElement("tr");
9368                var cellCaption = document.createElement("th");
9369                cel
9369lCaption.innerHTML = aTitulos[11];
9370                cellCaption.colSpan = 3;
9371                cellCaption.style = styleCaptions;
9372                tRowBody.appendChild(cellCaption);
9373                if (BROWSER.ie) {
9374                    tBody.appendChild(tRowBody);
9375                    TABLE.appendChild(tBody)
9376                }
9377                
9378                // ROW DATA 9
9379                var tRowBody = (!BROWSER.ie()) ? tBody.insertRow() : document.createElement("tr");
9380                var cellHeader = document.createElement("th");
9381                cellHeader.innerHTML = aTitulos[12];
9382                cellHeader.colSpan = 1;
9383                tRowBody.appendChild(cellHeader);
9384                
9385                cellHeader.style = styleHeaders + "border-bottom:1px solid #c8c8c8;border-top:1px solid #c8c8c8;";
9386                var cell = document.createElement("td");
9387                cell.innerHTML = "Valor";
9388                tRowBody.appendChild(cell);
9389                
9390                if (BROWSER.ie) {
9391                    tBody.appendChild(tRowBody);
9392                    TABLE.appendChild(tBody)
9393                }
9394                
9395                // ROW DATA 10
9396                var tRowBody = (!BROWSER.ie()) ? tBody.insertRow() : document.createElement("tr");
9397                var cellHeader = document.createElement("th");
9398                cellHeader.innerHTML = aTitulos[13];
9399                cellHeader.colSpan = 1;
9400                tRowBody.appendChild(cellHeader);
9401                
9402                cellHeader.style = styleHeaders + "border-bottom:1px solid #c8c8c8;border-top:1px solid #c8c8c8;";
9403                var cell = document.createElement("td");
9404                cell.innerHTML = "Valor";
9405                tRowBody.appendChild(cell);
9406                
9407                if (BROWSER.ie) {
9408                    tBody.appendChild(tRowBody);
9409                    TABLE.appendChild(tBody)
9410                }
9411                
9412                // ROW DATA 11
9413                var tRowBody = (!BROWSER.ie()) ? tBody.insertRow() : document.createElement("tr");
9414                var cellHeader = document.createElement("th");
9415                cellHeader.innerHTML = aTitulos[14];
9416                cellHeader.colSpan = 1;
9417                tRowBody.appendChild(cellHeader);
9418                
9419                cellHeader.style = styleHeaders + "border-bottom:1px solid #c8c8c8;border-top:1px solid #c8c8c8;";
9420                var cell = document.createElement("td");
9421                cell.innerHTML = "Valor";
9422                tRowBody.appendChild(cell);
9423                
9424                if (BROWSER.ie) {
9425                    tBody.appendChild(tRowBody);
9426                    TABLE.appendChild(tBody)
9427                }
9428                
9429                
9430                document.getElementById("divDatos" + parametros.contenedorCuadro).appendChild(TABLE);
9431                $("#tableStat" + parametros.contenedorCuadro).hide();
9432                $("#TableEspacio" + parametros.contenedorCuadro).hide();
9433            }
9434            /// <summary>   Dibuja cuadro tipo 17, un indicador 2 ultimos periodos por todas las areas geograficas. </summary>
9435            ///
9436            /// <remarks>   robert, 28/03/2019. </remarks>
9437            ///
9438            /// Cuadro 17 por entidades federativas en vertical y agrupados por periodo (cada periodo contiene las columnas de los 4 trimestres)
9439            ///
9440            function DibujaCuadroTipo17(data, parametros) {
9441                
9442                var tablaInterna = "";
9443                var arrayLenght = data.length;
9444                var arrayPeriodos = data.dimension.periods.category.label;
9445                var tituloPrincipal = (parametros.tituloColumnaPrincipal != "") ? parametros.tituloColumnaPrincipal : (parametros.idioma === "en"? "Entity" : "Entidad");
9446                var cabeceras = DibujaCabecera(tituloPrincipal, arrayPeriodos.length, 2, parametros.contenedorCuadro, parametros);                    
9447                var indiceColumna = 0;
9448                var frecuencia = data.dimension.freq.category.label[0]["Value"];
9449                var arrPeriodos = [];
9450                $.each(arrayPeriodos, function (key, val) {
9451                    var valorColumna = PintaTitulosColumnas(parametros.titulosColumnas, val.Value, indiceColumna++);
9452                    var anio = val.Value.split("/")[0];
9453                    if (arrPeriodos.indexOf(anio) === -1) {
9454                        arrPeriodos.push(anio);
9455                    }
9456                    //var mes = val.Value.split("/")[1];                
9457                    var formatoValor = oMESES.getFormatoPeriodo(val.Value, frecuencia, parametros.idioma, 2);
9458                    cabeceras += '<th class ="Th" bgcolor="#DDD" id="tdAnio' + parametros.contenedorCuadro + val.Value + '"  data-periodo="' + val.Value + '">' + formatoValor + '</td>';
9459                }); 
9460                var tPeriodos = arrPeriodos.length 
9461                for(var x = 1; x <= tPeriodos; x++) {
9462                    var idReplace = "valPeriodo" + x + "_" + parametros.contenedorCuadro;            
9463                    cabeceras = cabeceras.replace(idReplace, arrPeriodos[x-1]
9463);
9464                }
9465                cabeceras += "</tr>";        
9466                tablaInterna += cabeceras;
9467                var datos = data.value;
9468                var indexValue = 0;
9469                var renglones = "";
9470                var arrayIndicadores = data.dimension.indicator.category.label;
9471                var arrayAreas = data.dimension.state.category.label;
9472                var totalColumnas = data.dimension.periods.category.label;
9473                
9474                for (var i = 0; i < arrayAreas.length; i++) {
9475                    var bgColor = "white";
9476                    if (i % 2 == 0) {
9477                        var bgColor = "#EFEFEF";
9478                    }
9479                    renglones += '<tr><td class="TdInicio notranslate"  >' + arrayAreas[i].Value.toString().split("-")[0] + '</td>';
9480                    
9481                    $.each(arrayPeriodos, function (key, val) {
9482                        if (datos[indexValue] === "") {
9483                            
9484                            renglones += '<td  class="Td"  > --- </td>';
9485                        } else {
9486                            renglones += '<td  class="Td"  >' + datos[indexValue] + '</td>';
9487                        }
9488                        indexValue++;
9489                    });
9490                    
9491                    renglones += '</tr>';
9492                }
9493                tablaInterna += renglones;
9494                ReemplazaTabla(tablaInterna, parametros);
9495                
9496            }
9497
9498        /** 
9499         *  LOCALIDADES VERSION UN ARRAY COMPLETO ORDENADO V4
9500         *  Presentacon en pestañas navegable y secciones colapsables
9501         *  Cuadro #18 - Datos de la localidad (metodo: datosLocalidadTema/)
9502         *  parametro que acompaña a este cuadro:
9503         *  - mvloc = modoVisualizacionLocalidades valores:[1,2] 
9504         * @param data
9505         * @param parametros
9506         */
9507      /*   const dataLocalidades = [
9508            {
9509            "descripcion": "Clave de entidad federativa",
9510            "valor": "01",
9511            "tema": 1,
9512            "desc_tema": "Información localidad"
9513            },
9514            {
9515            "descripcion": "Entidad federativa",
9516            "valor": "Aguascalientes",
9517            "tema": 1,
9518            "desc_tema": "Información localidad"
9519            },
9520            {
9521            "descripcion": "Clave de municipio",
9522            "valor": "003",
9523            "tema": 1,
9524            "desc_tema": "Información localidad"
9525            },
9526            {
9527            "descripcion": "Municipio",
9528            "valor": "Calvillo",
9529            "tema": 1,
9530            "desc_tema": "Información localidad"
9531            },
9532            {
9533            "descripcion": "Clave de localidad",
9534            "valor": "0289",
9535            "tema": 1,
9536            "desc_tema": "Información localidad"
9537            },
9538            {
9539            "descripcion": "Localidad",
9540            "valor": "El Llano (El Llano de San Rafael)",
9541            "tema": 1,
9542            "desc_tema": "Información localidad"
9543            },
9544            {
9545            "descripcion": "Frijol",
9546            "valor": "No",
9547            "tema": 8,
9548            "desc_tema": "Abasto de alimentos"
9549            },
9550            {
9551            "descripcion": "Maíz",
9552            "valor": "No",
9553            "tema": 8,
9554            "desc_tema": "Abasto de alimentos"
9555            },
9556            {
9557            "descripcion": "Tortillas",
9558            "valor": "No",
9559            "tema": 8,
9560            "desc_tema": "Abasto de alimentos"
9561            },
9562            {
9563            "descripcion": "Pan",
9564            "valor": "No",
9565            "tema": 8,
9566            "desc_tema": "Abasto de alimentos"
9567            },
9568            {
9569            "descripcion": "Arroz",
9570            "valor": "No",
9571            "tema": 8,
9572            "desc_tema": "Abasto de alimentos"
9573            },
9574            {
9575            "descripcion": "Leche",
9576            "valor": "No",
9577            "tema": 8,
9578            "desc_tema": "Abasto de alimentos"
9579            },
9580            {
9581            "descripcion": "Huevo",
9582            "valor": "No",
9583            "tema": 8,
9584            "desc_tema": "Abasto de alimentos"
9585            },
9586            {
9587            "descripcion": "Carne de res o de puerco",
9588            "valor": "No",
9589            "tema": 8,
9590            "desc_tema": "Abasto de alimentos"
9591            },
9592            {
9593            "descripcion": "Pollo",
9594            "valor": "No",
9595            "tema": 8,
9596            "desc_tema": "Abasto de alimentos"
9597            },
9598            {
9599            "descripcion": "Pescado fresco",
9600            "valor": "No",
9601            "tema": 8,
9602            "desc_tema": "Abasto de alimentos"
9603            },
9604            {
9605            "descripcion": "Frutas y verduras",
9606            "valor": "No",
9607            "tema": 8,
9608            "desc_tema": "Abasto de alimentos"
9609            },
9610            {
9611            "descripcion": "Lugar de trabajo de los habitantes",
9612            "valor": "En otra localidad",
9613            "tema": 13,
9614            "desc_tema": "Actividad económica"
9615            },
9616            {
9617            "descripcion": "Cultivo de algún producto para venta",
9618            "valor": "*",
9619            "tema": 13,
9620            "desc_tema": "Actividad económica"
9621            },
9622            {
9623            "descripcion": "Cultivo de algún producto para consumo familiar",
9624            "valor": "*",
9625            "tema": 13,
9626            "desc_tema": "Actividad económica"
9627            },
9628            {
9629            "descripcion": "No se realiza la actividad de cultivo de algún producto ",
9630            "valor": "Sí",
9631            "tema": 13,
9632            "desc_tema": "Actividad económica"
9633            },
9634            {
9635            "descripcion": "Cría o explotación de animales para venta",
9636            "valor": "*",
9637            "tema": 13,
9638            "desc_tema": "Actividad económica"
9639            },
9640            {
9641            "descripcion": "Cría o explotación de animales para consumo familiar",
9642            "valor": "Sí",
9643            "tema": 13,
9644            "desc_tema": "Actividad económica"
9645            },
9646            {
9647            "descripcion": "No se realiza la actividad de cría o explotación de animales",
9648            "valor": "*",
9649            "tema": 13,
9650            "desc_tema": "Actividad económica"
9651            },
9652            {
9653            "descripcion": "Explotación de minas para venta",
9654            "valor": "*",
9655            "tema": 13,
9656            "desc_tema": "Actividad económica"
9657            },
9658            {
9659            "descripcion": "Explotación de minas para consumo familiar",
9660            "valor": "*",
9661            "tema": 13,
9662            "desc_tema": "Actividad económica"
9663            },
9664            {
9665            "descripcion": "No se realiza la actividad de explotación de minas para consumo familiar",
9666            "valor": "Sí",
9667            "tema": 13,
9668            "desc_tema": "Actividad económica"
9669            },
9670            {
9671            "descripcion": "Cortan o siembran árboles para venta",
9672            "valor": "*",
9673            "tema": 13,
9674            "desc_tema": "Actividad económica"
9675            },
9676            {
9677            "descripcion": "Cortan o siembran árboles para consumo familiar",
9678            "valor": "*",
9679            "tema": 13,
9680            "desc_tema": "Actividad económica"
9681            },
9682            {
9683            "descripcion": "No se realiza la actividad de cortar o sembrar árboles",
9684            "valor": "Sí",
9685            "tema": 13,
9686            "desc_tema": "Actividad económica"
9687            },
9688            {
9689            "descripcion": "Recolección de hierbas o plantas para venta",
9690            "valor": "*",
9691            "tema": 13,
9692            "desc_tema": "Actividad económica"
9693            },
9694            {
9695            "descripcion": "Recolección de hierbas o plantas para consumo familiar",
9696            "valor": "*",
9697            "tema": 13,
9698            "desc_tema": "Actividad económica"
9699            },
9700            {
9701            "descripcion": "No se realiza la actividad de recolección de hierbas o plantas ",
9702            "valor": "Sí",
9703            "tema": 13,
9704            "desc_tema": "Actividad económica"
9705            },
9706            {
9707            "descripcion": "Pesca o caza de animales para venta",
9708            "valor": "*",
9709            "tema": 13,
9710            "desc_tema": "Actividad económica"
9711            },
9712            {
9713            "descripcion": "Pesca o caza de animales para consumo familiar",
9714            "valor": "*",
9715            "tema": 13,
9716            "desc_tema": "Actividad económica"
9717            },
9718            {
9719            "descripcion": "No se realiza la actividad de pesca o caza de animales",
9720            "valor": "Sí",
9721            "tema": 13,
9722            "desc_tema": "Actividad económica"
9723            },
9724            {
9725            "descripcion": "Elaboración de artesanías para venta",
9726            "valor": "*",
9727            "tema": 13,
9728            "desc_tema": "Actividad económica"
9729            },
9730            {
9731            "descripcion": "Elaboración de artesanías para consumo familiar",
9732            "valor": "*",
9733            "tema": 13,
9734            "desc_tema": "Actividad económica"
9735            },
9736            {
9737            "descripcion": "No se realiza la actividad de elaboración de artesanías",
9738            "valor": "Sí",
9739            "tema": 13,
9740            "desc_tema": "Actividad económica"
9741            },
9742            {
9743            "descripcion": "Se realiza otra actividad económica para venta",
9744            "valor": "*",
9745            "tema": 13,
9746            "desc_tema": "Actividad económica"
9747            },
9748            {
9749            "descripcion": "Se realiza otra actividad económica para consumo familiar",
9750            "valor": "*",
9751            "tema": 13,
9752            "desc_tema": "Actividad económica"
9753            },
9754            {
9755            "descripcion": "No se realiza otra actividad económica",
9756            "valor": "Sí",
9757            "tema": 13,
9758            "desc_tema": "Actividad económica"
9759            },
9760            {
9761            "descripcion": "Actividades económicas (otra descripción) - Clave",
9762            "valor": "*",
9763            "tema": 13,
9764            "desc_tema": "Actividad económica"
9765            },
9766            {
9767            "descripcion": "Principal actividad económica",
9768            "valor": "Crianza de animales",
9769            "tema": 13,
9770            "desc_tema": "Actividad económica"
9771            },
9772            {
9773            "descripcion": "Principal actividad económica (Otra)  - Clave",
9774            "valor": "*",
9775            "tema": 13,
9776            "desc_tema": "Actividad económica"
9777            },
9778            {
9779            "descripcion": "Producto principal  - Clave1",
9780            "valor": "Conejo",
9781            "tema": 13,
9782            "desc_tema": "Actividad económica"
9783            },
9784            {
9785            "descripcion": "Producto principal  - Clave2",
9786            "valor": "Pollo",
9787            "tema": 13,
9788            "desc_tema": "Actividad económica"
9789            },
9790            {
9791            "descripcion": "Producto principal  - Clave3",
9792            "valor": "*",
9793            "tema": 13,
9794            "desc_tema": "Actividad económica"
9795            },
9796            {
9797            "descripcion": "Abastecimiento de agua entubada",
9798            "valor": "No hay agua entubada",
9799            "tema": 4,
9800            "desc_tema": "Agua entubada"
9801            },
9802            {
9803            "descripcion": "Cobertura de agua entubada",
9804            "valor": "*",
9805            "tema": 4,
9806            "desc_tema": "Agua entubada"
9807            },
9808            {
9809            "descripcion": "Fuente de abastecimiento de agua entubada",
9810            "valor": "*",
9811            "tema": 4,
9812            "desc_tema": "Agua entubada"
9813            },
9814            {
9815            "descripcion": "Fuente de abastecimiento de agua entubada (otra fuente) - Clave",
9816            "valor": "*",
9817            "tema": 4,
9818            "desc_tema": "Agua entubada"
9819            },
9820            {
9821            "descripcion": "Disponibilidad de alumbrado público en la localidad",
9822            "valor": "Sí",
9823            "tema": 6,
9824            "desc_tema": "Alumbrado público"
9825            },
9826            {
9827            "descripcion": "Fuente de energía eléctrica del alumbrado",
9828            "valor": "Comisión Federal de Electricidad (CFE)",
9829            "tema": 6,
9830            "desc_tema": "Alumbrado público"
9831            },
9832            {
9833            "descripcion": "Fuente de energía eléctrica del alumbrado (otra) - Clave",
9834            "valor": "*",
9835            "tema": 6,
9836            "desc_tema": "Alumbrado público"
9837            },
9838            {
9839            "descripcion": "Cobertura del alumbrado público",
9840            "valor": "toda la localidad?",
9841            "tema": 6,
9842            "desc_tema": "Alumbrado público"
9843            },
9844            {
9845            "descripcion": "Autoridades municipales",
9846            "valor": "6",
9847            "tema": 14,
9848            "desc_tema": "Aspectos sociales"
9849            },
9850            {
9851            "descripcion": "Autoridades municipales (otra)  - Clave",
9852            "valor": "*",
9853            "tema": 14,
9854            "desc_tema": "Aspectos sociales"
9855            },
9856            {
9857            "descripcion": "Comisariado ejidal o de bienes comunales",
9858            "valor": "No",
9859            "tema": 14,
9860            "desc_tema": "Aspectos sociales"
9861            },
9862            {
9863            "descripcion": "Autoridad indígena",
9864            "valor": "No",
9865            "tema": 14,
9866            "desc_tema": "Aspectos sociales"
9867            },
9868            {
9869            "descripcion": "Autoridad tradicional",
9870            "valor": "No",
9871            "tema": 14,
9872            "desc_tema": "Aspectos sociales"
9873            },
9874            {
9875            "descripcion": "Policía local",
9876            "valor": "No",
9877            "tema": 14,
9878            "desc_tema": "Aspectos sociales"
9879            },
9880            {
9881            "descripcion": "Conflictos sociales por propiedad de la tierra",
9882            "valor": "No",
9883            "tema": 14,
9884            "desc_tema": "Aspectos sociales"
9885            },
9886            {
9887            "descripcion": "Conflictos sociales por preferencias religiosas",
9888            "valor": "No",
9889            "tema": 14,
9890            "desc_tema": "Aspectos sociales"
9891            },
9892            {
9893            "descripcion": "Conflictos sociales por preferencias electorales",
9894            "valor": "No",
9895            "tema": 14,
9896            "desc_tema": "Aspectos sociales"
9897            },
9898            {
9899            "descripcion": "Conflictos sociales por delincuencia",
9900            "valor": "No",
9901            "tema": 14,
9902            "desc_tema": "Aspectos sociales"
9903            },
9904            {
9905            "descripcion": "Conflictos sociales por alcoholismo y drogadicción",
9906            "valor": "No",
9907            "tema": 14,
9908            "desc_tema": "Aspectos sociales"
9909            },
9910            {
9911            "descripcion": "Otros conflictos sociales",
9912            "valor": "No",
9913            "tema": 14,
9914            "desc_tema": "Aspectos sociales"
9915            },
9916            {
9917            "descripcion": "Conflictos sociales (otro descripción) - clave",
9918            "valor": "*",
9919            "tema": 14,
9920            "desc_tema": "Aspectos sociales"
9921            },
9922            {
9923            "descripcion": "Daños por sequía",
9924            "valor": "No",
9925            "tema": 14,
9926            "desc_tema": "Aspectos sociales"
9927            },
9928            {
9929            "descripcion": "Daños por helada o granizada",
9930            "valor": "No",
9931            "tema": 14,
9932            "desc_tema": "Aspectos sociales"
9933            },
9934            {
9935            "descripcion": "Daños por inundación o desbordamiento",
9936            "valor": "No",
9937            "tema": 14,
9938            "desc_tema": "Aspectos sociales"
9939          
9939  },
9940            {
9941            "descripcion": "Daños por incendio forestal",
9942            "valor": "No",
9943            "tema": 14,
9944            "desc_tema": "Aspectos sociales"
9945            },
9946            {
9947            "descripcion": "Daños por temblor",
9948            "valor": "No",
9949            "tema": 14,
9950            "desc_tema": "Aspectos sociales"
9951            },
9952            {
9953            "descripcion": "Daños por ciclón o huracán",
9954            "valor": "No",
9955            "tema": 14,
9956            "desc_tema": "Aspectos sociales"
9957            },
9958            {
9959            "descripcion": "Daños por otro fenómeno natural",
9960            "valor": "No",
9961            "tema": 14,
9962            "desc_tema": "Aspectos sociales"
9963            },
9964            {
9965            "descripcion": "Daños por fenómenos naturales (otro descripción) - clave",
9966            "valor": "*",
9967            "tema": 14,
9968            "desc_tema": "Aspectos sociales"
9969            },
9970            {
9971            "descripcion": "Contaminación por humos, polvos o gases provenientes de industrias",
9972            "valor": "No",
9973            "tema": 14,
9974            "desc_tema": "Aspectos sociales"
9975            },
9976            {
9977            "descripcion": "Contaminación por humos o gases de vehículos de motor",
9978            "valor": "No",
9979            "tema": 14,
9980            "desc_tema": "Aspectos sociales"
9981            },
9982            {
9983            "descripcion": "Contaminación por malos olores provenientes de granjas, empresas vecinas o de un basurero",
9984            "valor": "No",
9985            "tema": 14,
9986            "desc_tema": "Aspectos sociales"
9987            },
9988            {
9989            "descripcion": "Contaminación por música o ruido excesivo en los alrededores",
9990            "valor": "No",
9991            "tema": 14,
9992            "desc_tema": "Aspectos sociales"
9993            },
9994            {
9995            "descripcion": "Contaminación por líquidos industriales o combustible del transporte acuático en ríos, lagos, canales o estanques",
9996            "valor": "No",
9997            "tema": 14,
9998            "desc_tema": "Aspectos sociales"
9999            },
10000            {
10001            "descripcion": "Contaminación por aguas negras del drenaje depositadas en ríos, lagos, canales o estanques",
10002            "valor": "No",
10003            "tema": 14,
10004            "desc_tema": "Aspectos sociales"
10005            },
10006            {
10007            "descripcion": "Contaminación por basura acumulada en ríos, lagos, canales o estanques",
10008            "valor": "No",
10009            "tema": 14,
10010            "desc_tema": "Aspectos sociales"
10011            },
10012            {
10013            "descripcion": "Contaminación por líquidos industriales, pesticidas o aguas negras depositadas en terrenos",
10014            "valor": "No",
10015            "tema": 14,
10016            "desc_tema": "Aspectos sociales"
10017            },
10018            {
10019            "descripcion": "Contaminación por basura acumulada en terrenos al aire libre",
10020            "valor": "No",
10021            "tema": 14,
10022            "desc_tema": "Aspectos sociales"
10023            },
10024            {
10025            "descripcion": "Contaminación por plagas en cultivos, árboles o animales",
10026            "valor": "No",
10027            "tema": 14,
10028            "desc_tema": "Aspectos sociales"
10029            },
10030            {
10031            "descripcion": "Otro tipo de contaminación",
10032            "valor": "No",
10033            "tema": 14,
10034            "desc_tema": "Aspectos sociales"
10035            },
10036            {
10037            "descripcion": "Riesgos por contaminación ambiental (otro desc.) - clave",
10038            "valor": "*",
10039            "tema": 14,
10040            "desc_tema": "Aspectos sociales"
10041            },
10042            {
10043            "descripcion": "Condición de habla de alguna lengua indígena en la localidad",
10044            "valor": "No",
10045            "tema": 14,
10046            "desc_tema": "Aspectos sociales"
10047            },
10048            {
10049            "descripcion": "Nombre de la lengua indígena",
10050            "valor": "*",
10051            "tema": 14,
10052            "desc_tema": "Aspectos sociales"
10053            },
10054            {
10055            "descripcion": "Uso de la lengua indígena en la escuela",
10056            "valor": "*",
10057            "tema": 14,
10058            "desc_tema": "Aspectos sociales"
10059            },
10060            {
10061            "descripcion": "Uso de la lengua indígena en la iglesia",
10062            "valor": "*",
10063            "tema": 14,
10064            "desc_tema": "Aspectos sociales"
10065            },
10066            {
10067            "descripcion": "Uso de la lengua indígena en festividades",
10068            "valor": "*",
10069            "tema": 14,
10070            "desc_tema": "Aspectos sociales"
10071            },
10072            {
10073            "descripcion": "Uso de la lengua indígena para comerciar",
10074            "valor": "*",
10075            "tema": 14,
10076            "desc_tema": "Aspectos sociales"
10077            },
10078            {
10079            "descripcion": "Uso de la lengua indígena con familiares y vecinos",
10080            "valor": "*",
10081            "tema": 14,
10082            "desc_tema": "Aspectos sociales"
10083            },
10084            {
10085            "descripcion": "Uso de la lengua indígena en el hogar",
10086            "valor": "*",
10087            "tema": 14,
10088            "desc_tema": "Aspectos sociales"
10089            },
10090            {
10091            "descripcion": "Problema principal declarado por el informante",
10092            "valor": "Carencia de agua y mala calidad",
10093            "tema": 14,
10094            "desc_tema": "Aspectos sociales"
10095            },
10096            {
10097            "descripcion": "Problema principal declarado por el informante (otro descripción) - Clave",
10098            "valor": "*",
10099            "tema": 14,
10100            "desc_tema": "Aspectos sociales"
10101            },
10102            {
10103            "descripcion": "Características de la población",
10104            "valor": "Total",
10105            "tema": 4,
10106            "desc_tema": "Características de la población"
10107            },
10108            {
10109            "descripcion": "De 0 a 14 años <sup>b/</sup>",
10110            "valor": "5",
10111            "tema": 4,
10112            "desc_tema": "Características de la población"
10113            },
10114            {
10115            "descripcion": "De 15 a 29 años <sup>a/</sup>",
10116            "valor": "36",
10117            "tema": 4,
10118            "desc_tema": "Características de la población"
10119            },
10120            {
10121            "descripcion": "De 15 a 64 años <sup>b/</sup>",
10122            "valor": "18",
10123            "tema": 4,
10124            "desc_tema": "Características de la población"
10125            },
10126            {
10127            "descripcion": "De 30 a 59 años <sup>a/</sup>",
10128            "valor": "30",
10129            "tema": 4,
10130            "desc_tema": "Características de la población"
10131            },
10132            {
10133            "descripcion": "De 60 y más años  <sup>b/</sup>",
10134            "valor": "2",
10135            "tema": 4,
10136            "desc_tema": "Características de la población"
10137            },
10138            {
10139            "descripcion": "De 65 y más años <sup>b/</sup>",
10140            "valor": "1",
10141            "tema": 4,
10142            "desc_tema": "Características de la población"
10143            },
10144            {
10145            "descripcion": "Con discapacidad <sup>b/</sup>",
10146            "valor": "1",
10147            "tema": 4,
10148            "desc_tema": "Características de la población"
10149            },
10150            {
10151            "descripcion": "NOTA",
10152            "valor": "Fecha de actualización: <sup>a/</sup>2015 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp&nbsp;<sup>b/</sup>2020<br>Fuente(s):  <br> Censos y Conteos de Población y Vivienda 2010 <br> Encuesta Intercensal 2015 <br> Censos y Conteos de Población y Vivienda 2020",
10153            "tema": 4,
10154            "desc_tema": "Características de la población"
10155            },
10156            {
10157            "descripcion": "Características de las viviendas",
10158            "valor": "Total",
10159            "tema": 3,
10160            "desc_tema": "Características de las viviendas"
10161            },
10162            {
10163            "descripcion": "Particulares <sup>b/</sup>",
10164            "valor": "6",
10165            "tema": 3,
10166            "desc_tema": "Características de las viviendas"
10167            },
10168            {
10169            "descripcion": "Habitadas <sup>b/</sup>",
10170            "valor": "6",
10171            "tema": 3,
10172            "desc_tema": "Características de las viviendas"
10173            },
10174            {
10175            "descripcion": "Particulares habitadas <sup>b/</sup>",
10176            "valor": "6",
10177            "tema": 3,
10178            "desc_tema": "Características de las viviendas"
10179            },
10180            {
10181            "descripcion": "Particulares no habitadas <sup>a/</sup>",
10182            "valor": "0",
10183            "tema": 3,
10184            "desc_tema": "Características de las viviendas"
10185            },
10186            {
10187            "descripcion": "Con recubrimiento de piso <sup>b/</sup>",
10188            "valor": "6",
10189            "tema": 3,
10190            "desc_tema": "Características de las viviendas"
10191            },
10192            {
10193            "descripcion": "Con energía eléctrica <sup>b/</sup>",
10194            "valor": "6",
10195            "tema": 3,
10196            "desc_tema": "Características de las viviendas"
10197            },
10198            {
10199            "descripcion": "Con agua entubada <sup>b/</sup>",
10200            "valor": "4",
10201            "tema": 3,
10202            "desc_tema": "Características de las viviendas"
10203            },
10204            {
10205            "descripcion": "Con drenaje <sup>b/</sup>",
10206            "valor": "6",
10207            "tema": 3,
10208            "desc_tema": "Características de las viviendas"
10209            },
10210            {
10211            "descripcion": "Con servicio sanitario <sup>b/</sup>",
10212            "valor": "6",
10213            "tema": 3,
10214            "desc_tema": "Características de las viviendas"
10215            },
10216            {
10217            "descripcion": "Con 3 o más ocupantes por cuarto <sup>a/</sup>",
10218            "valor": "18",
10219            "tema": 3,
10220            "desc_tema": "Características de las viviendas"
10221            },
10222            {
10223            "descripcion": "NOTA",
10224            "valor": "Fecha de actualización: <sup>a/</sup>2015 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp&nbsp;<sup>b/</sup>2020<br>Fuente(s):  <br> Censos y Conteos de Población y Vivienda 2010 <br> Encuesta Intercensal 2015 <br> Censos y Conteos de Población y Vivienda 2020",
10225            "tema": 3,
10226            "desc_tema": "Características de las viviendas"
10227            },
10228            {
10229            "descripcion": "Comedor comunitario del gobierno del estado",
10230            "valor": "No",
10231            "tema": 10,
10232            "desc_tema": "Comedor comunitario"
10233            },
10234            {
10235            "descripcion": "Comedor comunitario del gobierno municipal",
10236            "valor": "No",
10237            "tema": 10,
10238            "desc_tema": "Comedor comunitario"
10239            },
10240            {
10241            "descripcion": "Comedor comunitario de organización no gubernamental",
10242            "valor": "No",
10243            "tema": 10,
10244            "desc_tema": "Comedor comunitario"
10245            },
10246            {
10247            "descripcion": "Otros servicios de comedor popular o público",
10248            "valor": "No",
10249            "tema": 10,
10250            "desc_tema": "Comedor comunitario"
10251            },
10252            {
10253            "descripcion": "Comedor comunitario (otros descripción) - Clave",
10254            "valor": "*",
10255            "tema": 10,
10256            "desc_tema": "Comedor comunitario"
10257            },
10258            {
10259            "descripcion": "Clave de identificación geográfica",
10260            "valor": " (0100302890064800)",
10261            "tema": 1,
10262            "desc_tema": "Identificación geoestadística"
10263            },
10264            {
10265            "descripcion": "Clave de entidad federativa",
10266            "valor": "1",
10267            "tema": 1,
10268            "desc_tema": "Identificación geoestadística"
10269            },
10270            {
10271            "descripcion": "Nombre de la entidad federativa",
10272            "valor": "Aguascalientes",
10273            "tema": 1,
10274            "desc_tema": "Identificación geoestadística"
10275            },
10276            {
10277            "descripcion": "Clave de municipio o demarcación territorial",
10278            "valor": "3",
10279            "tema": 1,
10280            "desc_tema": "Identificación geoestadística"
10281            },
10282            {
10283            "descripcion": "Municipio o demarcación territorial",
10284            "valor": "Calvillo",
10285            "tema": 1,
10286            "desc_tema": "Identificación geoestadística"
10287            },
10288            {
10289            "descripcion": "Clave de localidad",
10290            "valor": "289",
10291            "tema": 1,
10292            "desc_tema": "Identificación geoestadística"
10293            },
10294            {
10295            "descripcion": "Nombre de localidad",
10296            "valor": "El Llano (El Llano de San Rafael)",
10297            "tema": 1,
10298            "desc_tema": "Identificación geoestadística"
10299            },
10300            {
10301            "descripcion": "AGEB",
10302            "valor": "64",
10303            "tema": 1,
10304            "desc_tema": "Identificación geoestadística"
10305            },
10306            {
10307            "descripcion": "Clave de la Cabecera Municipal",
10308            "valor": "No",
10309            "tema": 1,
10310            "desc_tema": "Identificación geoestadística"
10311            },
10312            {
10313            "descripcion": "Nombre de la Cabecera Municipal",
10314            "valor": "Calvillo (01 003 0001)",
10315            "tema": 1,
10316            "desc_tema": "Identificación geoestadística"
10317            },
10318            {
10319            "descripcion": "Longitud",
10320            "valor": "102°42'41.048 W",
10321            "tema": 1,
10322            "desc_tema": "Identificación geoestadística"
10323            },
10324            {
10325            "descripcion": "Latitud",
10326            "valor": "21°51'06.609 N",
10327            "tema": 1,
10328            "desc_tema": "Identificación geoestadística"
10329            },
10330            {
10331            "descripcion": "Altitud",
10332            "valor": "1,652 metros sobre el nivel del mar",
10333            "tema": 1,
10334            "desc_tema": "Identificación geoestadística"
10335            },
10336            {
10337            "descripcion": "NOTA",
10338            "valor": "Sin dato debido a que se levantó cuestionario parcial",
10339            "tema": 1,
10340            "desc_tema": "Identificación geoestadística"
10341            },
10342            {
10343            "descripcion": "Condición de amanzanamiento",
10344            "valor": "No",
10345            "tema": 7,
10346            "desc_tema": "Infraestructura y equipamiento"
10347            },
10348            {
10349            "descripcion": "Recubrimiento en calles",
10350            "valor": "*",
10351            "tema": 7,
10352            "desc_tema": "Infraestructura y equipamiento"
10353            },
10354            {
10355            "descripcion": "Banquetas en las vialidades",
10356            "valor": "*",
10357            "tema": 7,
10358            "desc_tema": "Infraestructura y equipamiento"
10359            },
10360            {
10361            "descripcion": "Plaza o jardín público",
10362            "valor": "No",
10363            "tema": 7,
10364            "desc_tema": "Infraestructura y equipamiento"
10365            },
10366            {
10367            "descripcion": "Cancha deportiva",
10368            "valor": "No",
10369            "tema": 7,
10370            "desc_tema": "Infraestructura y equipamiento"
10371            },
10372            {
10373            "descripcion": "Parque con juegos infantiles",
10374            "valor": "No",
10375            "tema": 7,
10376            "desc_tema": "Infraestructura y equipamiento"
10377            },
10378            {
10379            "descripcion": "Biblioteca",
10380            "valor": "No",
10381            "tema": 7,
10382            "desc_tema": "Infraestructura y equipamiento"
10383            },
10384            {
10385            "descripcion": "Casa de la cultura",
10386            "valor": "No",
10387            "tema": 7,
10388            "desc_tema": "Infraestructura y equipamiento"
10389            },
10390            {
10391            "descripcion": "Salón de usos múltiples",
10392            "valor": "No",
10393            "tema": 7,
10394            "desc_tema": "Infraestructura y equipamiento"
10395            },
10396            {
10397            "descripcion": "Disponibilidad de red pública de drenaje en la localidad",
10398            "valor": "No",
10399            "tema": 5,
10400            "desc_tema": "Saneamiento"
10401            },
10402            {
10403            "descripcion": "Cobertura del drenaje público",
10404            "valor": "*",
10405            "tema": 5,
10406            "desc_tema": "Saneamiento"
10407            },
10408            {
10409            "descripcion": "Destino del drenaje",
10410            "valor": "*",
10411            "tema": 5,
10412            "desc_tema": "Saneamiento"
10413            },
10414            {
10415            "descripcion": "Destino del drenaje (otro) - Clave",
10416            "valor": "*",
10417            "tema": 5,
10418            "desc_tema": "Saneamiento"
10419            },
10420            {
10421            "descripcion": "Limpieza de áreas públicas",
10422            "valor": "No",
10423            "tema": 5,
10424            "desc_tema": "Saneamiento"
10425            },
10426            {
10427            "descripcion": "Recolección de basura domiciliaria",
10428            "valor": "Sí",
10429            "tema": 5,
10430            "desc_tema": "Saneamiento"
10431            },
10432            {
10433            "descripcion": "Destino de la basura",
10434            "valor": "Centro de transferencia o acopio",
10435            "tema": 5,
10436            "desc_tema": "Saneamiento"
10437            },
10438            {
10439            "descripcion": "Destino de la basura (otro) - Clave",
10440            "valor": "*",
10441            "tema": 5,
10442            "desc_tema": "Saneamiento"
10443            },
10444            {
10445            "descripcion": "Tianguis",
10446            "valor": "No",
10447            "tema": 9,
10448            "desc_tema": "Servicios de comercio"
10449            },
10450            {
10451            "descripcion": "Tienda de abarrotes",
10452            "valor": "No",
10453            "tema": 9,
10454            "desc_tema": "Servicios de comercio"
10455            },
10456            {
10457            "descripcion": "Tienda SEGALMEX-DICONSA",
10458            "valor": "No",
10459            "tema": 9,
10460            "desc_tema": "Servicios de comercio"
10461            },
10462            {
10463            "descripcion": "Lechería SEGALMEX-LICONSA",
10464            "valor": "No",
10465            "tema": 9,
10466            "desc_tema": "Servicios de comercio"
10467            },
10468            {
10469            "descripcion": "Farmacia",
10470            "valor": "No",
10471            "tema": 9,
10472            "desc_tema": "Servicios de comercio"
10473            },
10474            {
10475            "descripcion": "Papelería",
10476            "valor": "No",
10477            "tema": 9,
10478            "desc_tema": "Servicios de comercio"
10479            },
10480            {
10481            "descripcion": "Ferretería o tlapalería",
10482            "valor": "No",
10483            "tema": 9,
10484            "desc_tema": "Servicios de comercio"
10485            },
10486            {
10487            "descripcion": "Tienda de ropa o calzado",
10488            "valor": "No",
10489            "tema": 9,
10490            "desc_tema": "Servicios de comercio"
10491            },
10492            {
10493            "descripcion": "Tienda de loza o utensilios caseros",
10494            "valor": "No",
10495            "tema": 9,
10496            "desc_tema": "Servicios de comercio"
10497            },
10498            {
10499            "descripcion": "Tienda de muebles o aparatos electrodomésticos",
10500            "valor": "No",
10501            "tema": 9,
10502            "desc_tema": "Servicios de comercio"
10503            },
10504            {
10505            "descripcion": "Tienda de materiales de construcción",
10506            "valor": "No",
10507            "tema": 9,
10508            "desc_tema": "Servicios de comercio"
10509            },
10510            {
10511            "descripcion": "Venta de gas",
10512            "valor": "No",
10513            "tema": 9,
10514            "desc_tema": "Servicios de comercio"
10515            },
10516            {
10517            "descripcion": "Clínica o centro de salud",
10518            "valor": "No",
10519            "tema": 11,
10520            "desc_tema": "Servicios o agentes de salud"
10521            },
10522            {
10523            "descripcion": "Consultorio o médico particular",
10524            "valor": "No",
10525            "tema": 11,
10526            "desc_tema": "Servicios o agentes de salud"
10527            },
10528            {
10529            "descripcion": "Partera(o) o comadrón(a)",
10530            "valor": "No",
10531            "tema": 11,
10532            "desc_tema": "Servicios o agentes de salud"
10533            },
10534            {
10535            "descripcion": "Brigada móvil o caravana de salud",
10536            "valor": "No",
10537            "tema": 11,
10538            "desc_tema": "Servicios o agentes de salud"
10539            },
10540            {
10541            "descripcion": "Promotor(a) de salud",
10542            "valor": "No",
10543            "tema": 11,
10544            "desc_tema": "Servicios o agentes de salud"
10545            },
10546            {
10547            "descripcion": "Curandera(o)",
10548            "valor": "No",
10549            "tema": 11,
10550            "desc_tema": "Servicios o agentes de salud"
10551            },
10552            {
10553            "descripcion": "Teléfono público",
10554            "valor": "No",
10555            "tema": 12,
10556            "desc_tema": "Telecomunicaciones"
10557            },
10558            {
10559            "descripcion": "Internet público",
10560            "valor": "No",
10561            "tema": 12,
10562            "desc_tema": "Telecomunicaciones"
10563            },
10564            {
10565            "descripcion": "Teléfono celular",
10566            "valor": "Sí",
10567            "tema": 12,
10568            "desc_tema": "Telecomunicaciones"
10569            },
10570            {
10571            "descripcion": "Televisión abierta",
10572            "valor": "Sí",
10573            "tema": 12,
10574            "desc_tema": "Telecomunicaciones"
10575            },
10576            {
10577            "descripcion": "Televisión de paga",
10578            "valor": "Sí",
10579            "tema": 12,
10580            "desc_tema": "Telecomunicaciones"
10581            },
10582            {
10583            "descripcion": "Servicio de envío y recepción de dinero",
10584            "valor": "No",
10585            "tema": 12,
10586            "desc_tema": "Telecomunicaciones"
10587            },
10588            {
10589            "descripcion": "Tipo de localidad habitada",
10590            "valor": "Caserío",
10591            "tema": 2,
10592            "desc_tema": "Tipificación"
10593            },
10594            {
10595            "descripcion": "Tipo de localidad habitada  (otro tipo) - Clave",
10596            "valor": "*",
10597            "tema": 2,
10598            "desc_tema": "Tipificación"
10599            },
10600            {
10601            "descripcion": "Transporte público",
10602            "valor": "No",
10603            "tema": 3,
10604            "desc_tema": "Transporte público"
10605            },
10606            {
10607            "descripcion": "Autobús o camión",
10608            "valor": "No",
10609            "tema": 3,
10610            "desc_tema": "Transporte público"
10611            },
10612            {
10613            "descripcion": "Micro, combi o taxi colectivo",
10614            "valor": "*",
10615            "tema": 3,
10616            "desc_tema": "Transporte público"
10617            },
10618            {
10619            "descripcion": "Camión de redilas o troca",
10620            "valor": "*",
10621            "tema": 3,
10622            "desc_tema": "Transporte público"
10623            },
10624            {
10625            "descripcion": "Taxi libre o de sitio",
10626            "valor": "*",
10627            "tema": 3,
10628            "desc_tema": "Transporte público"
10629            },
10630            {
10631            "descripcion": "Bicitaxi o mototaxi",
10632            "valor": "*",
10633            "tema": 3,
10634            "desc_tema": "Transporte público"
10635            },
10636            {
10637            "descripcion": "Barco, panga o lancha colectiva",
10638            "valor": "*",
10639            "tema": 3,
10640            "desc_tema": "Transporte público"
10641            },
10642            {
10643            "descripcion": "Autobús o camión directo a la cabecera municipal",
10644            "valor": "*",
10645            "tema": 3,
10646            "desc_tema": "Transporte público"
10647            },
10648            {
10649            "descripcion": "Micro, combi o taxi colectivo directo a la cabecera municipal",
10650            "valor": "*",
10651            "tema": 3,
10652            "desc_tema": "Transporte público"
10653            },
10654            {
10655            "descripcion": "Camión de redilas o troca directo a la cabecera municipal",
10656            "valor": "*",
10657            "tema": 3,
10658            "desc_tema": "Transporte público"
10659            },
10660            {
10661            "descripcion": "Taxi libre o sitio directo a la cabecera municipal",
10662            "valor": "*",
10663            "tema": 3,
10664            "desc_tema": "Transporte público"
10665            },
10666            {
10667            "descripcion": "Bicitaxi o mototaxi directo a la cabecera municipal",
10668            "valor": "*",
10669            "tema": 3,
10670            "desc_tema": "Transporte público"
10671            },
10672            {
10673            "descripcion": "Barco, panga o lancha colectiva directo a la cabecera municipal",
10674            "valor": "*",
10675            "tema": 3,
10676            "desc_tema": "Transporte público"
10677            },
10678            {
10679            "descripcion": "Transporte público principal a la cabecera municipal",
10680            "valor": "*",
10681            "tema": 3,
10682            "desc_tema": "Transporte público"
10683            },
10684            {
10685            "descripcion": "Frecuencia de salidas del transporte a la cabecera municipal",
10686            "valor": "*",
10687            "tema": 3,
10688            "desc_tema": "Transporte público"
10689            },
10690            {
10691            "descripcion": "Tiempo de traslado a la cabecera municipal (minutos)",
10692            "valor": "*",
10693            "tema": 3,
10694            "desc_tema": "Transporte público"
10695            }
10696            ];  */
10697       
10698        function DibujaCuadroTipo18_LocalidadesV4(data, parametros) {            
10699            var contenedorCuadro = parametros.contenedorCuadro;
10700            if ($("#divDatos" + contenedorCuadro)) {
10701                $("#divDatos" + contenedorCuadro).empty();
10702            }
10703            if(parametros.mostrarBotonExportacion){
10704                var divExportacion = document.createElement("div");
10705                divExportacion.className = "col-sm-12 col-md-12 col-xs-12 pull-right";
10706                divExportacion.style.textAlign = "right";
10707                divExportacion.style.marginTop = "10px";
10708                $("#divDatos" + contenedorCuadro).append(divExportacion);
10709
10710                var buttonExportacion = document.createElement("button");
10711                buttonExportacion.type = "button";
10712                buttonExportacion.className = "btn dropdown-toggle cls-tooltip";
10713                buttonExportacion.setAttribute("data-toggle","dropdown");
10714                buttonExportacion.style.backgroundColor = "#fff"
10715                buttonExportacion.style.borderColor = "#dcdcdc"
10716                // tooltip
10717                buttonExportacion.setAttribute("aria-haspopup",true);
10718                buttonExportacion.setAttribute("data-placement","left"); 
10719                buttonExportacion.setAttribute("data-original-title",getTraductorCuadro(p
10719arametros, "Exportar")); 
10720                
10721                var spanExportacion = document.createElement("span");
10722                var spanCaret = spanExportacion.cloneNode(true);
10723                spanCaret.className = "caret"
10724                spanExportacion.style.paddingRight = "4px";
10725                spanExportacion.style.fontSize = "18px";
10726                spanExportacion.className = "inegi-descarga";
10727                spanExportacion.setAttribute("aria-hidden",true);
10728                buttonExportacion.append(spanExportacion);
10729                buttonExportacion.append(spanCaret);
10730            
10731                var ulExportacion = document.createElement("ul");
10732                ulExportacion.className = "dropdown-menu";
10733                ulExportacion.setAttribute("role","menu");
10734                ulExportacion.style.minWidth = "100px";
10735                
10736                var liExportacion = document.createElement("li");
10737                var liLabel = liExportacion.cloneNode(true);
10738                var btnDescargaXls = document.createElement("a");
10739                btnDescargaXls.id = "btnDescargaXls_"+contenedorCuadro;
10740                btnDescargaXls.style.display = "block";            
10741                btnDescargaXls.style.cursor = "pointer";            
10742                btnDescargaXls.style.padding = "3px 6px";            
10743                // btnDescargaXls.setAttribute("title","Exporta información localidades en XLS")
10744                btnDescargaXls.addEventListener("click", function(e){
10745                    e.stopPropagation();
10746                    exportXLSLocalidades(parametros, data)
10747                })
10748                var imgIconDescargaXLS = document.createElement("img");
10749                imgIconDescargaXLS.src = C_dominio_seguro +'img/ico/ico_XLS.png';
10750                btnDescargaXls.append(imgIconDescargaXLS);
10751
10752                var labelSubtitle = document.createElement("div");
10753                labelSubtitle.textContent = getTraductorCuadro(parametros, "Exportar como")+":";
10754                labelSubtitle.style.fontWeight = "bold";
10755                labelSubtitle.style.padding = "0 6px";
10756                labelSubtitle.style.width = "auto";            
10757                liLabel.append(labelSubtitle)
10758                
10759                liExportacion.append(btnDescargaXls);
10760                ulExportacion.append(liLabel);
10761                ulExportacion.append(liExportacion)            
10762                divExportacion.append(ulExportacion);
10763                divExportacion.append(buttonExportacion);
10764            }
10765            
10766            // estructuras de datos            
10767            var idioma = parametros.idioma;
10768            //elementos HTML para el armado de las secciones
10769            var LOC_CONTAINER = document.createElement("div"); // contenedor principal de localidades
10770            document.getElementById("divDatos" + parametros.contenedorCuadro).appendChild(LOC_CONTAINER);
10771           
10772            // validacion sino llega ningun dato entonces coloca el nensaje "Sin datos"
10773            if (data.length === 0) {
10774                
10775                var divNodatos = document.createElement("div");
10776                divNodatos.innerHTML = (idioma === "es"? "No se encontraron resultados" : "No found results");
10777                LOC_CONTAINER.appendChild(divNodatos);
10778              
10779            } else {
10780                if(parametros.modoVisualizacionLocalidades === "1"){ // Ver en secciones colapsables
10781                    var UL = document.createElement("ul");                        
10782                    var LI = document.createElement("li");            
10783                    var SPAN = document.createElement("span");
10784                        SPAN.style.display = "inline-block";
10785                        SPAN.style.verticalAlign = "middle";                        
10786                    var DIV = document.createElement("div"); 
10787                        DIV.style.paddingTop = "8px";
10788                    var TABLE = document.createElement("table"); TABLE.className = 'table table-bordered table-responsive table-striped';
10789                    TABLE.style.width = "auto";
10790                    TABLE.style.margin = "0 25px";
10791                    var TR = document.createElement("tr");
10792                    var TD = document.createElement("td");
10793                    var TH = document.createElement("th");
10794                    // console.log(data);
10795
10796                    // tema 1 infolocalidad
10797                    var ulInfo = null;
10798                    var cAgrupador = 0;
10799                    var tmpInfoLocalidad = null;
10800                    var divContainerInformacionLocalidad = DIV.cloneNode(true);  
10801                    
10802                    // temsa 5 loc5000
10803                    var ulIdentificacion = null;
10804                    var clavesPath = "";
10805                    var tmpLocUbicacionGeografica = [];
10806
10807                    if(parametros.secc.indexOf("1") > -1){ // Solamente para tema = 1 y 2 (informacion de localidad)
10808                        var d = data.filter(function(item, idx){                            
10809                            return item.tema === 1 || item.tema === 5;
10810                        })
10811                        var _UlInformacionLocalidad = tplInformacionLocalidad(d, UL, parametros);
10812                        divContainerInformacionLocalidad.appendChild(_UlInformacionLocalidad); // agrega la lista UL con todos los items al div contenedor de informacion localidad
10813                        LOC_CONTAINER.appendChild(divContainerInformacionLocalidad); // agrega el div contenedor al contenedor donde estan todos los elementos
10814                    }
10815                    // var notaFinal = false;
10816                    /* data.map(function(tema, index){ // recorre el arreglo completo de datos                    
10817                        if(parametros.secc.indexOf("1") > -1){                           
10818                            if(tema.tema === 1){
10819                            //  seccion infoLocalidad ------------------------------------------------
10820                                if(ulInfo == null){
10821                                    ulInfo = UL.cloneNode(true);
10822                                    ulInfo.className = "cls-ulInfoLocalidad";
10823                                    // ulInfo.style.border = "1px solid #cecece";
10824                                    ulInfo.style.padding = "0px";
10825                                    ulInfo.style.marginBottom = "0px";
10826                                    ulInfo.style.listStyleType = "none";   
10827                                }                 
10828                                if (tema.descripcion.indexOf("Clave de entidad federativa") > -1 || tema.descripcion.indexOf("Clave de municipio") > -1){
10829                                    clavesPath = clavesPath + tema.valor;                                
10830                                }
10831
10832                                if(cAgrupador == 0){
10833                                    tmpInfoLocalidad = tema;
10834                                    cAgrupador++;
10835                                } else {                                       
10836                                    cAgrupador = 0;
10837                                    var liInfo = LI.cloneNode(true);
10838                                    var span = SPAN.cloneNode(true);
10839                                    // span.innerHTML = getTraductorCuadro(parametros, tema.descripcion) +":";                                                                          
10840                                    span.innerHTML = tema.descripcion +":";                                                                          
10841                                    // span.style.width = "50%";
10842                                    span.style.padding = "0px 0px";
10843                                    span.style.fontWeight = "600"; 
10844                                    span.className = "cls-block-loc";
10845                                    span.style.width = "40%";                   
10846                                    liInfo.appendChild(span);
10847                                    var span = SPAN.cloneNode(true);
10848                                    span.style.width = "60%";
10849                                    var a = document.createElement("a");
10850                                    if (tmpInfoLocalidad.descripcion.indexOf("localidad") === -1) {
10851                                        a.setAttribute("href", C_dominioBuscador + "app/areasgeograficas?ag=" + clavesPath);
10852                                        a.setAttribute("target","_blank");
10853                                        a.style.cursor = "pointer";
10854                                        // console.log(tema)
10855                                        // console.log(clavesPath);
10856                                        a.innerHTML = (tema.descripcion === "Municipio") ? clavesPath + " " + tema.valor : tmpInfoLocalidad.valor + " " + tema.valor;
10857                                        span.appendChild(a);
10858                                    } else {
10859                                        span.innerHTML = (tema.descripcion === "Localidad") ? clavesPath +  tmpInfoLocalidad.valor + " " + tema.valor : tmpInfoLocalidad.valor + " " + tema.valor;
10860                                    }
10861
10862                                    liInfo.appendChild(span); 
10863                                    ulInfo.appendChild(liInfo);                                       
10864                                }
10865                                divContainerInformacionLocalidad.appendChild(ulInfo)
10866                                // LOC_CONTAINER.appendChild(ulInfo);
10867
10868                            } else if(tema.tema === 1 && tema.descripcion !== "NOTA"){
10869                                // console.log(tema)
10870                            // seccion identificacion (en loc5000)------------------------------------------------                        
10871                                if(ulIdentificacion == null){
10872                                    ulIdentificacion = UL.cloneNode(true);
10873                                    ulIdentificacion.className = "cls-ulInfoLocalidad";
10874                                    // ulIdentificacion.style.border = "1px solid #cecece";
10875                                    ulIdentificacion.style.padding = "0px";
10876                                    ulIdentificacion.style.listStyleType = "none";
10877                                }
10878                                if(tema.descripcion === "TITULO"){
10879
10880                                } else {
10881                                    
10882                                    var liInfo = LI.cloneNode(true);
10883                                    var span = SPAN.cloneNode(true);
10884                                    if(tema.descripcion.indexOf("Latitud") > -1 || tema.descripcion.indexOf("Longitud") > -1 || tema.descripcion.indexOf("Altitud") > -1){
10885                                        tmpLocUbicacionGeografica.push(tema);
10886                                        if(tmpLocUbicacionGeografica.length === 3){ // si no es coordenada grografica el proceso es normal
10887                                            var valor = "Longitud "+tmpLocUbicacionGeografica[1].valor +", Latitud "+tmpLocUbicacionGeografica[0].valor +", Altitud "+tmpLocUbicacionGeografica[2].valor;
10888                                            span.innerHTML = "Ubicación geográfica:";                                            
10889                                            span.style.padding = "0px 0px";
10890                                            span.style.verticalAlign = "top";
10891                                            span.style.fontWeight = "600";
10892                                            span.className = "cls-block-loc";
10893                                            span.style.width = "40%";            
10894                                            liInfo.appendChild(span);
10895                                            var span = SPAN.cloneNode(true);                                            
10896                                            span.innerHTML = valor; 
10897                                            span.style.width = "60%";            
10898                                            liInfo.appendChild(span); 
10899                                            ulIdentificacion.appendChild(liInfo);             
10900                                        }
10901                                    } else {
10902                                        span.innerHTML = tema.descripcion +":";
10903                                        // span.style.width = "50%";
10904                                        span.style.padding = "0px 0px";
10905                                        span.style.fontWeight = "600";
10906                                        span.className = "cls-block-loc";
10907                                        span.style.width = "40%";            
10908                                        liInfo.appendChild(span);
10909                                        var span = SPAN.cloneNode(true);
10910                                        span.style.width = "60%";            
10911                                        if(tema.descripcion.indexOf("Cabecera municipal") > -1){
10912                                            cveLoc = tema.valor.substring(tema.valor.indexOf("(") + 1, tema.valor.length-1); 
10913                                            var a = document.createElement("a");
10914                                            a.setAttribute("href", C_dominioBuscad
10914or+"app/areasgeograficas?ag=" + cveLoc);
10915                                            a.setAttribute("target","_blank");
10916                                            a.style.cursor = "pointer";
10917                                            //invierte valor 
10918                                            var valor = tema.valor;
10919                                            if(valor.indexOf("(") > -1){
10920                                                var valor1 = tema.valor.substring(0, tema.valor.indexOf('(')-1);                                            
10921                                                var valor2 = tema.valor.substring(tema.valor.indexOf('('), tema.valor.length);                                            
10922                                                valor = valor2.replace("(","").replace(")","") + " " + valor1;
10923                                            }
10924                                            a.innerHTML = valor;
10925                                            span.appendChild(a);
10926                                        } else {
10927                                            span.innerHTML = tema.valor;
10928                                        }
10929                                        liInfo.appendChild(span); 
10930                                        ulIdentificacion.appendChild(liInfo);                                                                        
10931                                    }
10932                                
10933                                }
10934                                divContainerInformacionLocalidad.appendChild(ulIdentificacion);
10935                            }
10936                            LOC_CONTAINER.appendChild(divContainerInformacionLocalidad);
10937                        }
10938                    }); */
10939
10940                    //viviendas
10941                    var containerViviendas = null;
10942                    var tableViviendas = null
10943                    var theadViviendas = null;
10944                    var tbodyViviendas = null;
10945
10946                    //poblacion 
10947                    var containerPoblacion = null;
10948                    var tablePoblacion = null;
10949                    var theadPoblacion = null;
10950                    var tbodyPoblacion = null;
10951
10952                    //urbano
10953                    var containerUrbano = null;
10954                    var tableUrbano = null;
10955                    var theadUrbano = null;
10956                    var tbodyUrbano = null;
10957                    var isHeader = 0; // variable de control, 0 = es encabezado 0+ son datos (solo para el cuadro en datos urbanos)
10958
10959                    // temas mayores al 5
10960                    var temaTmp = 0;
10961                    var containerUl = null; 
10962                    var ulLoc5000 = null;
10963
10964                    //arreglo de notas vivienda, poblacion, entorno urbano
10965                    var arrNotasVivienda = [];
10966                    var arrNotasPoblacion = [];
10967                    var arrNotasEntornoUrbano = [];
10968                    var spanNotaLoc5000 = "";
10969
10970                    data.forEach(function(tema, index){ // recorre el arreglo completo de datos
10971                                            
10972                        // if(parametros.secc.indexOf("2") > -1){
10973                            var contViviendaCoL = 0;
10974                            // seccion vivienda ------------------------------------------------
10975                            if(tema.tema === 3){
10976                                // console.log(tema);
10977                                if(containerViviendas === null){
10978                                    containerViviendas = DIV.cloneNode(true);
10979                                    tableViviendas = TABLE.cloneNode(true); 
10980                                    tableViviendas.id = "tableViviendas";
10981                                    tableViviendas.style.display = "none";
10982                                    tableViviendas.style.marginTop = "10px";
10983                                    theadViviendas = document.createElement("thead");
10984                                    tbodyViviendas = document.createElement("tbody");
10985
10986                                    var divTituloViviendas = DIV.cloneNode(true);                                
10987                                    divTituloViviendas.innerHTML = '<i id="iViviendas" style="font-size:10px;color:#bb0026;vertical-align:middle;padding-right:6px"><span class="inegi-nav-desp enest_t"></span></i>Características de las viviendas';
10988                                    divTituloViviendas.style.padding = "0 0 0 10px";
10989                                    divTituloViviendas.style.cursor = "pointer";
10990                                    divTituloViviendas.onclick = function (e) {
10991                                        $("#tableViviendas").toggle();
10992                                        $(".spanVivienda").toggle();
10993                                        if ($("#iViviendas").html() == '<span class="inegi-nav-desp enest_t"></span>') {
10994                                            $("#iViviendas").html('<span class="inegi-nav-despa enest_t"></span>')
10995                                        } else {
10996                                            $("#iViviendas").html('<span class="inegi-nav-desp enest_t"></span>');
10997                                        }
10998                                    }
10999                                    containerViviendas.appendChild(divTituloViviendas);
11000                                }
11001
11002                                if(tema.valor === "Total"){
11003                                    var tr = TR.cloneNode(true);
11004                                    var th = TH.cloneNode(true);                                
11005                                    th.innerHTML = "Viviendas";
11006                                    th.className = "Th"
11007                                    tr.appendChild(th);
11008                                    var th = TH.cloneNode(true);
11009                                    th.className = "Th"
11010                                    th.innerHTML = tema.valor;
11011                                    tr.appendChild(th);
11012                                    theadViviendas.appendChild(tr);
11013                                    
11014                                } else if(tema.descripcion === "NOTA") {                            
11015                                    var spanNota = DIV.cloneNode(true);
11016                                    spanNota.innerHTML = tema.valor;
11017                                    spanNota.style.fontSize = "11px";  
11018                                    // spanNota.id = "spanVivienda";                                              
11019                                    spanNota.className = "spanVivienda";                                              
11020                                    spanNota.style.display = "none"; 
11021                                    spanNota.style.margin = "0 25px"; 
11022
11023                                } else {
11024                                    var tr = TR.cloneNode(true);
11025                                    var td = TD.cloneNode(true);
11026                                    td.innerHTML = tema.descripcion; 
11027                                    td.style.width = "auto";                       
11028                                    tr.appendChild(td);
11029                                    var td = TD.cloneNode(true);                        
11030                                    td.innerHTML = tema.valor;
11031                                    td.className = "TdV"                                
11032                                    tr.appendChild(td);                                    
11033                                    tbodyViviendas.appendChild(tr)
11034                                }
11035                                tableViviendas.appendChild(theadViviendas);
11036                                tableViviendas.appendChild(tbodyViviendas);
11037                                
11038                                containerViviendas.appendChild(tableViviendas);
11039                                if(spanNota) {
11040                                    arrNotasVivienda.push(spanNota)                                
11041                                }
11042                                if(parametros.secc.indexOf("2") === -1){
11043                                    containerViviendas.style.display = "none";
11044                                }
11045                                LOC_CONTAINER.appendChild(containerViviendas);
11046                            }
11047                        // }
11048
11049                        // if(parametros.secc.indexOf("3") > -1){
11050                            // seccion poblacion ------------------------------------------------
11051                            if(tema.tema === 4){
11052                                if(containerPoblacion === null){
11053                                    containerPoblacion = DIV.cloneNode(true);
11054                                    tablePoblacion = TABLE.cloneNode(true);
11055                                    theadPoblacion = document.createElement("thead");
11056                                    tbodyPoblacion = document.createElement("tbody");
11057                                    tablePoblacion.id = "tablePoblacion";
11058                                    tablePoblacion.style.display = "none";
11059                                    tablePoblacion.style.marginTop = "10px";
11060
11061                                    var divTituloPoblacion = DIV.cloneNode(true);
11062                                    divTituloPoblacion.innerHTML = '<i id="iPoblacion" style="font-size:10px;color:#bb0026;vertical-align:middle;padding-right:6px"><span class="inegi-nav-desp enest_t"></span></i>Características de la población';
11063                                    divTituloPoblacion.style.padding = "0 0 0 10px";
11064                                    divTituloPoblacion.style.cursor = "pointer";
11065                                    divTituloPoblacion.onclick = function (e) {
11066                                        $("#tablePoblacion").toggle();
11067                                        $(".spanPoblacion").toggle();                    
11068                                        if ($("#iPoblacion").html() == '<span class="inegi-nav-desp enest_t"></span>') {
11069                                            $("#iPoblacion").html('<span class="enest_t inegi-nav-despa"></span>')
11070                                        } else {
11071                                            $("#iPoblacion").html('<span class="inegi-nav-desp enest_t"></span>');
11072                                        }
11073                                    }
11074                                    containerPoblacion.appendChild(divTituloPoblacion);
11075                                }
11076
11077                                if(tema.valor === "Total"){
11078                                    var tr = TR.cloneNode(true);
11079                                    var th = TH.cloneNode(true);
11080                                    th.innerHTML = "Población";
11081                                    th.className = "Th"
11082                                    tr.appendChild(th);
11083                                    var th = TH.cloneNode(true);
11084                                    th.className = "Th"
11085                                    th.innerHTML = tema.valor;
11086                                    tr.appendChild(th);
11087                                    theadPoblacion.appendChild(tr);
11088                                    
11089                                } else if(tema.descripcion === "NOTA") {
11090                                    var spanNotaP = DIV.cloneNode(true);
11091                                    spanNotaP.innerHTML = tema.valor;
11092                                    spanNotaP.style.fontSize = "11px";                        
11093                                    spanNotaP.className = "spanPoblacion";  
11094                                    spanNotaP.style.display = "none"; 
11095                                    spanNotaP.style.margin = "0 25px";                      
11096                                } else {
11097                                    var tr = TR.cloneNode(true);
11098                                    var td = TD.cloneNode(true);
11099                                    td.innerHTML = tema.descripcion;                        
11100                                    tr.appendChild(td);
11101                                    var td = TD.cloneNode(true);                        
11102                                    td.innerHTML = tema.valor;
11103                                    td.className = "TdV";
11104                                    tr.appendChild(td);
11105                                    tbodyPoblacion.appendChild(tr)
11106                                }
11107                                tablePoblacion.appendChild(theadPoblacion);
11108                                tablePoblacion.appendChild(tbodyPoblacion);
11109
11110                                containerPoblacion.appendChild(tablePoblacion);
11111                                if(spanNotaP){
11112                                    arrNotasPoblacion.push(spanNotaP);
11113                                } 
11114                                if(parametros.secc.indexOf("3") === -1){
11115                                    containerPoblacion.style.display = "none";
11116                                }    
11117                                LOC_CONTAINER.appendChild(containerPoblacion);
11118                            }
11119                        // }
11120
11121                        // if (parametros.secc.indexOf("4") > -1) {
11122                            // seccion entorno urbano ------------------------------------------------
11123                            if(tema.tema === 2){
11124
11125                                if(containerUrbano === null){
11126                                    containerUrbano = DIV.cloneNode(true);
11127                                    tableUrbano = TABLE.cloneNode(true);
11128                                    theadUrbano = document.createElement("thead");
11129                                    tbodyUrbano = document.createElement("tbody");
11130                                    tableUrbano.id = "tableUrbano";
11131                                    tableUrbano.style.display = "none";
11132                                    tableUrbano.style.marginTop = "10px";
11133                                    
11134
11135                                    var divTituloUrbano = DIV.cloneNode(true);
11136                                    divTituloUrbano.innerHTML = '<i id="iUrbano" style="font-size:10px;color:#bb0026;vertical-align:middle;padding-right:6px"><span class="inegi-nav-desp enest_t"></span></i>Entorno Urbano';
11137                                    divTituloUrbano.style.padding = "0 0 0 10px";
11138                                    divTituloUrbano.style.cursor = "pointer";
11139                                    
11140                                    divTituloUrbano.onclick = function (e) {
11141                                        $("#tableUrbano").toggle();
11142                                        $(".spanUrbano").toggle();                    
11143                                        if ($("#iUrbano").html() == '<span class="inegi-nav-desp enest_t"></span>') {
11144                                            $("#iUrbano").html('<span class="enest_t inegi-nav-despa"></span>')
11145                                        } else {
11146                                            $("#iUrbano").html('<span class="inegi-nav-desp enest_t"></span>');
11147                                        }
11148                                    }
11149                                    containerUrbano.appendChild(divTituloUrbano);
11150                                }
11151
11152                                if(isHeader == 0){                                    
11153                                    var tr = TR.cloneNode(true);
11154                                    var th = TH.cloneNode(true);
11155                                    th.innerHTML = tema.descripcion;
11156                                    th.className = "Th"
11157                                    tr.appendChild(th);
11158                                    for(var c = 0; c < tema.valor.length; c++){
11159
11160                                        var th = TH.cloneNode(true);
11161                                        th.className = "Th"
11162                                        th.innerHTML = tema.valor[c];
11163                                        tr.appendChild(th);
11164                                    }
11165                                    theadUrbano.append(tr);  
11166                                    isHeader++;                                  
11167                                    
11168                                } else if(tema.descripcion === "NOTA") {
11169                                    var spanNotaU = DIV.cloneNode(true)                                    
11170                                    spanNotaU.innerHTML =  tema.valor[0];
11171                                    spanNotaU.style.fontSize = "11px";                        
11172                                    spanNotaU.className = "spanUrbano";                        
11173                                    spanNotaU.style.display = "none";  
11174                                    spanNotaU.style.margin = "0 25px";                       
11175                                } else {
11176                                    var tr = TR.cloneNode(true);
11177                                    var td = TD.cloneNode(true);
11178                                    td.innerHTML = tema.descripcion;                                                                            
11179                                    tr.appendChild(td);
11180                                    for(var c = 0; c < tema.valor.length; c++){
11181                                        var td = TD.cloneNode(true);                        
11182                                        td.innerHTML = tema.valor[c];
11183                                        td.className = "TdV";
11184                                        tr.appendChild(td);
11185                                    }
11186                                    tbodyUrbano.appendChild(tr)
11187                                }
11188                                tableUrbano.appendChild(theadUrbano);
11189                                tableUrbano.appendChild(tbodyUrbano);
11190
11191                                containerUrbano.appendChild(tableUrbano);
11192                                if(spanNotaU){
11193                                    // containerUrbano.appendChild(spanNotaU);
11194                                    arrNotasEntornoUrbano.push(spanNotaU);
11195                                }
11196                                if(parametros.secc.indexOf("4") === -1){
11197                                    containerUrbano.style.display = "none";
11198                                }    
11199                                LOC_CONTAINER.appendChild(containerUrbano);
11200                            }
11201                        // }
11202
11203                        // if(parametros.secc.indexOf("5") > -1){
11204                            // seccion Loc5000 ------------------------------------------------
11205                            if(tema.tema > 5 ){
11206                                if(temaTmp !== tema.tema){                                
11207                                    // if(tema.descripcion !== "NOTA"){
11208                                        temaTmp = tema.tema;                                                                
11209                                        // crear lista para nuevo tema
11210                                        containerUl = DIV.cloneNode(true);                                        
11211                                        ulLoc5000 = UL.cloneNode(true);
11212                                        ulLoc5000.className = "list-group";
11213                                        ulLoc5000.style.padding = "0px";
11214                                        ulLoc5000.style.width = "90%";//"67%"; // para las listas fichas un width acncho fijo
11215                                        ulLoc5000.style.margin = "10px 0 0 25px";
11216                                        ulLoc5000.style.listStyleType = "none";
11217                                        ulLoc5000.id = "listTema"+ tema.tema;
11218                                        ulLoc5000.style.display = "none";
11219                                        // area titulo 
11220                                        var divTituloUl = DIV.cloneNode(true);
11221                                        divTituloUl.innerHTML = '<i id="iLoc_' + tema.tema +'" style="font-size:10px;color:#bb0026;vertical-align:middle;padding-right:6px"><span class="inegi-nav-desp enest_t"></span></i>' + tema.desc_tema;                                
11222                                        divTituloUl.style.padding = "0 0 0 10px";
11223                                        divTituloUl.style.cursor = "pointer";
11224                                        divTituloUl.onclick = function (e) {
11225                                            var t = $(this).find("i")[0].id.split("iLoc_")[1];
11226                                            $("#listTema" + t).toggle();
11227                                            if ($("#iLoc_" + t).html() == '<span class="inegi-nav-desp enest_t"></span>') {
11228                                                $("#iLoc_" + t).html('<span class="inegi-nav-despa enest_t"></span>')
11229                                            } else {
11230                                                $("#iLoc_" + t).html('<span class="inegi-nav-desp enest_t"></span>');
11231                                            }
11232                                        }
11233                                        containerUl.appendChild(divTituloUl);
11234
11235                                }
11236                                if(tema.descripcion === "TITULO"){
11237                                    var liInfo = LI.cloneNode(true);
11238                                    liInfo.style.backgroundColor = "#f9f9f9";
11239                                    liInfo.style.color = "#157fcc";
11240                                    liInfo.style.padding = "4px 0";                                    
11241                                    liInfo.style.paddingLeft = "10px;"
11242                                    liInfo.className = "cls-title";
11243                                    var span = SPAN.cloneNode(true);
11244                                    span.style.fontWeight = "bold";
11245                                    span.innerHTML = tema.valor;
11246                                    span.style.padding = "0px 10px";
11247                                    liInfo.appendChild(span);       
11248                                    
11249                                    ulLoc5000.appendChild(liInfo); 
11250                                    containerUl.appendChild(ulLoc5000);
11251                                    LOC_CONTAINER.appendChild(containerUl);
11252
11253                                } else if(tema.descripcion === "NOTA"){                                
11254                                        spanNotaLoc5000 = DIV.cloneNode(true);
11255                                        spanNotaLoc5000.innerHTML = "* "+tema.valor;
11256
11257                                        spanNotaLoc5000.style.fontSize = "11px";                                                                                                
11258                                        $(ulLoc5000).append(spanNotaLoc5000)
11259
11260                                } else {
11261                                    var liInfo = LI.cloneNode(true);
11262                                    liInfo.className = "list-group-item";
11263                                    liInfo.style.borderLeft = "0";
11264                                    liInfo.style.borderRight = "0";
11265                                    liInfo.style.padding = "4px 15px";
11266                                    var span = SPAN.cloneNode(true);
11267                                    span.innerHTML = "&emsp;&emsp;"+ tema.descripcion+":";
11268                                    span.style.fontWeight = "bold";
11269                                    span.style.padding = "0px 10px";
11270                                    liInfo.appendChild(span);
11271                                    var span = SPAN.cloneNode(true);
11272                                    span.innerHTML = tema.valor;
11273                                    liInfo.appendChild(span); 
11274                                    
11275                                    ulLoc5000.appendChild(liInfo); 
11276                                    containerUl.appendChild(ulLoc5000);
11277                                    if(parametros.secc.indexOf("5") === -1){
11278                                        containerUl.style.display = "none";
11279                                    }   
11280                                    LOC_CONTAINER.appendChild(containerUl);
11281                                }                             
11282                            }
11283                        // }
11284                        //nota al pie del contenido 
11285                    });
11285 // termina el forEach
11286
11287                    //inserta notas correspondientes a entorno urbano
11288                    if(arrNotasEntornoUrbano.length > 0){
11289                        for(var n = 0; n < arrNotasEntornoUrbano.length; n++){                        
11290                            tableUrbano.after(arrNotasEntornoUrbano[n]);
11291                        }
11292                    }
11293                    //inserta notas correspondientes a viviendas
11294                    if(arrNotasVivienda.length > 0){
11295                        for(var n = 0; n < arrNotasVivienda.length; n++){
11296                            tableViviendas.after(arrNotasVivienda[n]);
11297                        }
11298                    }
11299                    //inserta notas correspondientes a población
11300                    if(arrNotasPoblacion.length > 0){
11301                        for(var n = 0; n < arrNotasPoblacion.length; n++){
11302                            tablePoblacion.after(arrNotasPoblacion[n]);
11303                        }
11304                    }
11305                   
11306                    $(window).resize(function(e){
11307                        var widthWindow = document.body.clientWidth;
11308                        if(widthWindow >= 480){
11309                            $(".cls-ulInfoLocalidad").find(".cls-block-loc").css({width:"40%"});
11310                            
11311                        } else {                        
11312                            $(".cls-ulInfoLocalidad").find(".cls-block-loc").css({width:"auto"});
11313                            
11314                        }
11315                    })
11316                    var widthWindow = document.body.clientWidth;
11317                        if(widthWindow >= 510){
11318                            $(".cls-ulInfoLocalidad").find(".cls-block-loc").css({width:"40%"});
11319                            
11320                        } else {
11321                            $(".cls-ulInfoLocalidad").find(".cls-block-loc").css({width:"auto"});
11322                            
11323                        }
11324                } else if(parametros.modoVisualizacionLocalidades == "2") { // ver en pestañas navegables
11325
11326                    /// ----------- ESTRUCTURA DE DATOS ------------------
11327                    var tmpTema = ""; // guardar el tema temporalmente
11328                    var aTemas = []; // nuevo almacen del tema y sus datos
11329                    var aDatosTema = [] // guarda todos los datos por tema
11330                    
11331                    // -- recordar que el tema: 1 y 2 comparten datos parecidos.
11332                    var index = null;
11333                    var oD = {};
11334                    var l = false;
11335                    data.map(function(t) {
11336                        if(tmpTema != t.tema){ // si el tmpTema es diferente al de la ctual posición, se asigna el nuevo a tmpTema y guarda el objeto tema
11337                            aDatosTema = [];// limpiamos para volver a llenar dependiendo del tema nuevo que se esta leyendo
11338                            tmpTema = t.tema;
11339                            l = false
11340                            if(tmpTema > 5) l = true;
11341                            // -- Generamos un arreglo de temas principales (Nuestras pestañas)
11342                            aTemas.push({tema_id:t.tema, tema:t.desc_tema,loc5000:l,datos:[]});
11343                            index = aTemas.length-1;
11344                            
11345                        } // else {// si el tema es igual al anterior (tmpTema) no guarda el objeto tema, pero si guarda los datos en el tema
11346                        oD = {descripcion:t.descripcion,valor:t.valor}
11347                        aDatosTema.push(oD);               
11348                        aTemas[index].datos = aDatosTema;                    
11349                        
11350                    });
11351                   
11352                    // si existe  el tema 2 fusionar arreglo de datos con el tema 1
11353                    /* var temasCompartidos = aTemas.filter(function(t, index){
11354                        t.index = index;
11355                        return t.tema_id === 0;
11356                    })[0]; */
11357                    var temasCompartidos = aTemas.filter(function(t, index){
11358                        t.index = index;
11359                        return t.tema_id === 1 || t.tema_id === 5;
11360                    });
11361                    var aTemasFinal = [];
11362                    var aIndexesIngore = []; 
11363                    if(temasCompartidos !== undefined && temasCompartidos.length > 1){
11364                        for(var x = 0; x < temasCompartidos.length; x++){
11365                            if(x > 0){
11366                                var aTemaDatosCombinado = aTemas[0].datos.concat(temasCompartidos[x].datos);
11367                                aTemas[0].datos = aTemaDatosCombinado;
11368                                aIndexesIngore.push(temasCompartidos[x].index)
11369                            }
11370                        }
11371                        // pasamos a nuevo arreglos los datos finales
11372                        aTemasFinal = aTemas.filter(function(tema, idx) {
11373                            return aIndexesIngore.indexOf(tema.index) == -1;
11374                        })
11375                    } else {
11376                        aTemasFinal = aTemas;
11377                    }                                   
11378                    
11379                    /// ----------- ARMADO DEL COMPONENTE PESTAÑAS ------------------                   
11380                    
11381                    var divCarruselTemas = document.createElement("div");
11382                    divCarruselTemas.id = "divCarouselTemas_" + parametros.contenedorCuadro;
11383                    LOC_CONTAINER.appendChild(divCarruselTemas);
11384                    // new carouselTemas(divCarruselTemas.id, aTemas, parametros.secc).render()
11385                    new carouselTemas(divCarruselTemas.id, aTemasFinal, parametros.secc, parametros).render()
11386                    
11387                }
11388            }
11389
11390            //document.getElementById("divDatos" + parametros.contenedorCuadro).appendChild(LOC_CONTAINER);
11391            $("#tableStat" + parametros.contenedorCuadro).hide();
11392            $("#TableEspacio" + parametros.contenedorCuadro).hide();
11393            $("#divCargaCuadro" + parametros.contenedorCuadro).hide();
11394            $(".clsHover").hover(function(){
11395                $(this).css("background-color", "#ececec");
11396                }, function(){
11397                $(this).css("background-color", "#f9f7f7");
11398            });
11399            $(".cls-tooltip").tooltip(); 
11400        }  
11401        // Con datos actualizados de SCITEL 
11402        // fecha: 10-07-2024
11403        function DibujaCuadroTipo18_LocalidadesV4_2024(data, parametros, callback) { 
11404            var INTLFormat = Intl.NumberFormat('es-MX',{style:'decimal'});            
11405            var contenedorCuadro = parametros.contenedorCuadro;
11406            var catalogoTemasLocalidad = parametros.catalogoTemasLocalidad;
11407            // se guarda este valor para poder saber cuando llega periodo y version
11408            parametros.conVersionPeriodoLocalidad = (parametros.periodoLocalidad !== null && parametros.versionLocalidad !== null ? true : false);
11409            // var dataOrdenadoPorTema = data.sort((a,b) => {
11410            //     if(a.tema < b.tema) return -1
11411            //     if(a.tema > b.tema) return 1
11412            //     if(a.orden < b.orden) return -1
11413            //     if(a.orden > b.orden) return 1
11414            //     return 0;
11415            // })
11416            // data = dataOrdenadoPorTema
11417            // console.log(data)
11418
11419            if ($("#divDatos" + contenedorCuadro)) {
11420                $("#divDatos" + contenedorCuadro).empty();
11421            }
11422            if(parametros.mostrarBotonExportacion && data.length > 0){
11423                var divExportacion = document.createElement("div");
11424                divExportacion.className = "col-sm-12 col-md-12 col-xs-12 pull-right";
11425                divExportacion.style.textAlign = "right";
11426                divExportacion.style.marginTop = "10px";
11427                $("#divDatos" + contenedorCuadro).append(divExportacion);
11428
11429                var buttonExportacion = document.createElement("button");
11430                buttonExportacion.type = "button";
11431                buttonExportacion.className = "btn dropdown-toggle cls-tooltip";
11432                buttonExportacion.setAttribute("data-toggle","dropdown");
11433                buttonExportacion.style.backgroundColor = "#fff"
11434                buttonExportacion.style.borderColor = "#dcdcdc"
11435                // tooltip
11436                buttonExportacion.setAttribute("aria-haspopup",true);
11437                buttonExportacion.setAttribute("data-placement","left"); 
11438                buttonExportacion.setAttribute("data-original-title",getTraductorCuadro(parametros, "Exportar")); 
11439                
11440                var spanExportacion = document.createElement("span");
11441                var spanCaret = spanExportacion.cloneNode(true);
11442                spanCaret.className = "caret"
11443                spanExportacion.style.paddingRight = "4px";
11444                spanExportacion.style.fontSize = "18px";
11445                spanExportacion.className = "inegi-descarga";
11446                spanExportacion.setAttribute("aria-hidden",true);
11447                buttonExportacion.append(spanExportacion);
11448                buttonExportacion.append(spanCaret);
11449            
11450                var ulExportacion = document.createElement("ul");
11451                ulExportacion.className = "dropdown-menu";
11452                ulExportacion.setAttribute("role","menu");
11453                ulExportacion.style.minWidth = "100px";
11454                
11455                var liExportacion = document.createElement("li");
11456                var liLabel = liExportacion.cloneNode(true);
11457                var btnDescargaXls = document.createElement("a");
11458                btnDescargaXls.id = "btnDescargaXls_"+contenedorCuadro;
11459                btnDescargaXls.style.display = "block";            
11460                btnDescargaXls.style.cursor = "pointer";            
11461                btnDescargaXls.style.padding = "3px 6px";            
11462                // btnDescargaXls.setAttribute("title","Exporta información localidades en XLS")
11463                btnDescargaXls.addEventListener("click", function(e){
11464                    e.stopPropagation();
11465                    exportXLSLocalidades(parametros, data)
11466                })
11467                var imgIconDescargaXLS = document.createElement("img");
11468                imgIconDescargaXLS.src = C_dominio_seguro +'img/ico/ico_XLS.png';
11469                btnDescargaXls.append(imgIconDescargaXLS);
11470
11471                var labelSubtitle = document.createElement("div");
11472                labelSubtitle.textContent = getTraductorCuadro(parametros, "Exportar como")+":";
11473                labelSubtitle.style.fontWeight = "bold";
11474                labelSubtitle.style.padding = "0 6px";
11475                labelSubtitle.style.width = "auto";            
11476                liLabel.append(labelSubtitle)
11477                
11478                liExportacion.append(btnDescargaXls);
11479                ulExportacion.append(liLabel);
11480                ulExportacion.append(liExportacion)            
11481                divExportacion.append(ulExportacion);
11482                divExportacion.append(buttonExportacion);
11483            }
11484            
11485            // estructuras de datos            
11486            var idioma = parametros.idioma;
11487            //elementos HTML para el armado de las secciones
11488            var LOC_CONTAINER = document.createElement("div"); // contenedor principal de localidades
11489            document.getElementById("divDatos" + parametros.contenedorCuadro).appendChild(LOC_CONTAINER);
11490           
11491            // validacion sino llega ningun dato entonces coloca el nensaje "Sin datos"
11492            if (data.length === 0) {
11493                
11494                var divNodatos = document.createElement("div");
11495                divNodatos.innerHTML = (idioma === "es"? "No se encontraron resultados" : "No found results");
11496                LOC_CONTAINER.appendChild(divNodatos);
11497              
11498            } else {
11499                if(parametros.modoVisualizacionLocalidades === "1"){ // Ver en secciones colapsables
11500                    var DETAILS = document.createElement("details");                        
11501                    var SUMMARY = document.createElement("summary");                        
11502                    var UL = document.createElement("ul");                        
11503                    var LI = document.createElement("li");            
11504                    var SPAN = document.createElement("span");
11505                        SPAN.style.display = "inline-block";
11506                        SPAN.style.verticalAlign = "middle";                        
11507                    var DIV = document.createElement("div"); 
11508                        DIV.style.paddingTop = "8px";
11509                    var TABLE = document.createElement("table"); TABLE.className = 'table table-bordered table-responsive table-striped';
11510                    TABLE.style.width = "auto";
11511                    TABLE.style.margin = "0 25px";
11512                    var TR = document.createElement("tr");
11513                    var TD = document.createElement("td");
11514                    var TH = document.createElement("th");
11515                    // console.log(data);
11516
11517                    // tema 1 infolocalidad
11518                    var ulInfo = null;
11519                    var cAgrupador = 0;
11520                    var tmpInfoLocalidad = null;
11521                    var divContainerInformacionLocalidad = DIV.cloneNode(true);  
11522                    
11523                    // temsa 5 loc5000
11524                    var ulIdentificacion = null;
11525                    var clavesPath = "";
11526                    var tmpLocUbicacionGeografica = [];
11527
11528                    if(parametros.secc.indexOf("1") > -1){ // Solamente para tema = 1 y 2 (informacion de localidad)
11529                        var d = data.filter(function(item, idx){                            
11530                            return item.tema === 1 || item.tema === 5;
11531                        })
11532                        var _UlInformacionLocalidad = tplInformacionLocalidad(d, UL, parametros);
11533                        divContainerInformacionLocalidad.appendChild(_UlInformacionLocalidad); // agrega la lista UL con todos los items al div contenedor de informacion localidad
11534                        LOC_CONTAINER.appendChild(divContainerInformacionLocalidad); // agrega el div contenedor al contenedor donde estan todos los elementos
11535                    }
11536                    
11537                    //viviendas
11538                    var containerViviendas = null;
11539                    var tableViviendas = null
11540                    var theadViviendas = null;
11541                    var tbodyViviendas = null;
11542
11543                    //poblacion 
11544                    var containerPoblacion = null;
11545                    var tablePoblacion = null;
11546                    var theadPoblacion = null;
11547                    var tbodyPoblacion = null;
11548
11549                    //urbano
11550                    var containerUrbano = null;
11551                    var tableUrbano = null;
11552                    var theadUrbano = null;
11553                    var tbodyUrbano = null;
11554                    var isHeader = 0; // variable de control, 0 = es encabezado 0+ son datos (solo para el cuadro en datos urbanos)
11555
11556                    // temas mayores al 5
11557                    var temaTmp = 0;
11558                    var containerUl = null; 
11559                    var ulLoc5000 = null;
11560
11561                    //arreglo de notas vivienda, poblacion, entorno urbano
11562                    var arrNotasVivienda = [];
11563                    var arrNotasPoblacion = [];
11564                    var arrNotasEntornoUrbano = [];
11565                    var spanNotaLoc5000 = "";
11566
11567                    data.forEach(function(tema, index){ // recorre el arreglo completo de datos
11568                                            
11569                        // if(parametros.secc.indexOf("2") > -1){
11570                            var contViviendaCoL = 0;
11571                            // seccion vivienda ------------------------------------------------
11572                            if(tema.tema === 3){
11573                                // console.log(tema);
11574                                if(containerViviendas === null){
11575                                    containerViviendas = DIV.cloneNode(true);
11576                                    tableViviendas = TABLE.cloneNode(true); 
11577                                    tableViviendas.id = "tableViviendas";
11578                                    tableViviendas.style.display = "none";
11579                                    tableViviendas.style.marginTop = "10px";
11580                                    theadViviendas = document.createElement("thead");
11581                                    tbodyViviendas = document.createElement("tbody");
11582
11583                                    var divTituloViviendas = DIV.cloneNode(true);                                
11584                                    divTituloViviendas.innerHTML = '<i id="iViviendas" style="font-size:10px;color:#bb0026;vertical-align:middle;padding-right:6px"><span class="inegi-nav-desp enest_t"></span></i>Características de las viviendas';
11585                                    divTituloViviendas.style.padding = "0 0 0 10px";
11586                                    divTituloViviendas.style.cursor = "pointer";
11587                                    divTituloViviendas.onclick = function (e) {
11588                                        $("#tableViviendas").toggle();
11589                                        $(".spanVivienda").toggle();
11590                                        if ($("#iViviendas").html() == '<span class="inegi-nav-desp enest_t"></span>') {
11591                                            $("#iViviendas").html('<span class="inegi-nav-despa enest_t"></span>')
11592                                        } else {
11593                                            $("#iViviendas").html('<span class="inegi-nav-desp enest_t"></span>');
11594                                        }
11595                                    }
11596                                    containerViviendas.appendChild(divTituloViviendas);
11597                                }
11598
11599                                if(tema.valor === "Total"){
11600                                    var tr = TR.cloneNode(true);
11601                                    var th = TH.cloneNode(true);                                
11602                                    th.innerHTML = "Viviendas";
11603                                    th.className = "Th"
11604                                    tr.appendChild(th);
11605                                    var th = TH.cloneNode(true);
11606                                    th.className = "Th"
11607                                    th.innerHTML = tema.valor;
11608                                    tr.appendChild(th);
11609                                    theadViviendas.appendChild(tr);
11610                                    
11611                                } else if(tema.descripcion === "NOTA") {                            
11612                                    var spanNota = DIV.cloneNode(true);
11613                                    spanNota.innerHTML = tema.valor;
11614                                    spanNota.style.fontSize = "11px";  
11615                                    // spanNota.id = "spanVivienda";                                              
11616                                    spanNota.className = "spanVivienda";                                              
11617                                    spanNota.style.display = "none"; 
11618                                    spanNota.style.margin = "0 25px"; 
11619
11620                                } else {
11621                                    var tr = TR.cloneNode(true);
11622                                    var td = TD.cloneNode(true);
11623                                    td.innerHTML = tema.descripcion; 
11624                                    td.style.width = "auto";                       
11625                                    tr.appendChild(td);
11626                                    var td = TD.cloneNode(true);                        
11627                                    td.innerHTML = tema.valor;
11628                                    td.className = "TdV"                                
11629                                    tr.appendChild(td);                                    
11630                                    tbodyViviendas.appendChild(tr)
11631                                }
11632                                tableViviendas.appendChild(theadViviendas);
11633                                tableViviendas.appendChild(tbodyViviendas);
11634                                
11635                                containerViviendas.appendChild(tableViviendas);
11636                                if(spanNota) {
11637                                    arrNotasVivienda.push(spanNota)                                
11638                                }
11639                                if(parametros.secc.indexOf("2") === -1){
11640                                    containerViviendas.style.display = "none";
11641                                }
11642                                LOC_CONTAINER.appendChild(containerViviendas);
11643                            }
11644                        // }
11645
11646                        // if(parametros.secc.indexOf("3") > -1){
11647                            // seccion poblacion ------------------------------------------------
11648                            if(tema.tema === 4){
11649                                if(containerPoblacion === null){
11650                                    containerPoblacion = DIV.cloneNode(true);
11651                                    tablePoblacion = TABLE.cloneNode(true);
11652                                    theadPoblacion = document.createElement("thead");
11653                                    tbodyPoblacion = document.createElement("tbody");
11654                                    tablePoblacion.id = "tablePoblacion";
11655                                    tablePoblacion.style.display = "none";
11656                                    tablePoblacion.style.marginTop = "10px";
11657
11658                                    var divTituloPoblacion = DIV.cloneNode(true);
11659                                    divTituloPoblacion.innerHTML = '<i id="iPoblacion" style="font-size:10px;color:#bb0026;vertical-align:middle;padding-right:6px"><span class="inegi-nav-desp enest_t"></span></i>Características de la población';
11660                                    divTituloPoblacion.style.padding = "0 0 0 10px";
11661                                    divTituloPoblacion.style.cursor = "pointer";
11662                                    divTituloPoblacion.onclick = function (e) {
11663                                        $("#tablePoblacion").toggle();
11664                                        $(".spanPoblacion").toggle();                    
11665                                        if ($("#iPoblacion").html() == '<span class="inegi-nav-desp enest_t"></span>') {
11666                                            $("#iPoblacion").html('<span class="enest_t inegi-nav-despa"></span>')
11667                                        } else {
11668                                            $("#iPoblacion").html('<span class="inegi-nav-desp enest_t"></span>');
11669                                        }
11670                                    }
11671                                    containerPoblacion.appendChild(divTituloPoblacion);
11672                                }
11673
11674                                if(tema.valor === "Total"){
11675                                    var tr = TR.cloneNode(true);
11676                                    var th = TH.cloneNode(true);
11677                                    th.innerHTML = "Población";
11678                                    th.className = "Th"
11679                                    tr.appendChild(th);
11680                                    var th = TH.cloneNode(true);
11681                                    th.className = "Th"
11682                                    th.innerHTML = tema.valor;
11683                                    tr.appendChild(th);
11684                                    theadPoblacion.appendChild(tr);
11685                                    
11686                                } else if(tema.descripcion === "NOTA") {
11687                                    var spanNotaP = DIV.cloneNode(true);
11688                                    spanNotaP.innerHTML = tema.valor;
11689                                    spanNotaP.style.fontSize = "11px";                        
11690                                    spanNotaP.className = "spanPoblacion";  
11691                                    spanNotaP.style.display = "none"; 
11692                                    spanNotaP.style.margin = "0 25px";                      
11693                                } else {
11694                                    var tr = TR.cloneNode(true);
11695                                    var td = TD.cloneNode(true);
11696                                    td.innerHTML = tema.descripcion;                        
11697                                    tr.appendChild(td);
11698                                    var td = TD.cloneNode(true);                        
11699                                    td.innerHTML = tema.valor;
11700                                    td.className = "TdV";
11701                                    tr.appendChild(td);
11702                                    tbodyPoblacion.appendChild(tr)
11703                                }
11704                                tablePoblacion.appendChild(theadPoblacion);
11705                                tablePoblacion.appendChild(tbodyPoblacion);
11706
11707                                containerPoblacion.appendChild(tablePoblacion);
11708                                if(spanNotaP){
11709                                    arrNotasPoblacion.push(spanNotaP);
11710                                } 
11711                                if(parametros.secc.indexOf("3") === -1){
11712                                    containerPoblacion.style.display = "none";
11713                                }    
11714                                LOC_CONTAINER.appendChild(containerPoblacion);
11715                            }
11716                        // }
11717
11718                        // if (parametros.secc.indexOf("4") > -1) {
11719                            // seccion entorno urbano ------------------------------------------------
11720                            if(tema.tema === 2){
11721
11722                                if(containerUrbano === null){
11723                                    containerUrbano = DIV.cloneNode(true);
11724                                    tableUrbano = TABLE.cloneNode(true);
11725                                    theadUrbano = document.createElement("thead");
11726                                    tbodyUrbano = document.createElement("tbody");
11727                                    tableUrbano.id = "tableUrbano";
11728                                    tableUrbano.style.display = "none";
11729                                    tableUrbano.style.marginTop = "10px";
11730                                    
11731
11732                                    var divTituloUrbano = DIV.cloneNode(true);
11733                                    divTituloUrbano.innerHTML = '<i id="iUrbano" style="font-size:10px;color:#bb0026;vertical-align:middle;padding-right:6px"><span class="inegi-nav-desp enest_t"></span></i>Entorno Urbano';
11734                                    divTituloUrbano.style.padding = "0 0 0 10px";
11735                                    divTituloUrbano.style.cursor = "pointer";
11736                                    
11737                                    divTituloUrbano.onclick = function (e) {
11738                                        $("#tableUrbano").toggle();
11739                                        $(".spanUrbano").toggle();                    
11740                                        if ($("#iUrbano").html() == '<span class="inegi-nav-desp enest_t"></span>') {
11741                                            $("#iUrbano").html('<span class="enest_t inegi-nav-despa"></span>')
11742                                        } else {
11743                                            $("#iUrbano").html('<span class="inegi-nav-desp enest_t"></span>');
11744                                        }
11745                                    }
11746                                    containerUrbano.appendChild(divTituloUrbano);
11747                                }
11748
11749                                if(isHeader == 0){                                    
11750                                    var tr = TR.cloneNode(true);
11751                                    var th = TH.cloneNode(true);
11752                                    th.innerHTML = tema.descripcion;
11753                                    th.className = "Th"
11754                                    tr.appendChild(th);
11755                                    for(var c = 0; c < tema.valor.length; c++){
11756
11757                                        var th = TH.cloneNode(true);
11758                                        th.className = "Th"
11759                                        th.innerHTML = tema.valor[c];
11760                                        tr.appendChild(th);
11761                                    }
11762                                    theadUrbano.append(tr);  
11763                                    isHeader++;                                  
11764                                    
11765                                } else if(tema.descripcion === "NOTA") {
11766                                    var spanNotaU = DIV.cloneNode(true)                                    
11767                                    spanNotaU.innerHTML =  tema.valor[0];
11768                                    spanNotaU.style.fontSize = "11px";                        
11769                                    spanNotaU.className = "spanUrbano";                        
11770                                    spanNotaU.style.display = "none";  
11771                                    spanNotaU.style.margin = "0 25px";                       
11772                                } else {
11773                                    var tr = TR.cloneNode(true);
11774                                    var td = TD.cloneNode(true);
11775                                    td.innerHTML = tema.descripcion;                                                                            
11776                                    tr.appendChild(td);
11777                                    for(var c = 0; c < tema.valor.length; c++){
11778                                        var td = TD.cloneNode(true);                        
11779                                        td.innerHTML = tema.valor[c];
11780                                        td.className = "TdV";
11781                                        tr.appendChild(td);
11782                                    }
11783                                    tbodyUrbano.appendChild(tr)
11784                                }
11785                                tableUrbano.appendChild(theadUrbano);
11786                                tableUrbano.appendChild(tbodyUrbano);
11787
11788                                containerUrbano.appendChild(tableUrbano);
11789                                if(spanNotaU){
11790                                    // containerUrbano.appendChild(spanNotaU);
11791                                    arrNotasEntornoUrbano.push(spanNotaU);
11792                                }
11793                                if(parametros.secc.indexOf("4") === -1){
11794                                    containerUrbano.style.display = "none";
11795                                }    
11796                                LOC_CONTAINER.appendChild(containerUrbano);
11797                            }
11798                        // }
11799
11800                        // if(parametros.secc.indexOf("5") > -1){
11801                            // seccion Loc5000 ------------------------------------------------
11802                            if(tema.tema > 5 ){
11803                                // if(temaTmp !== tema.tema && tema.descripcion !== "TITULO" && tema.descripcion !== "NOTA" && !tema.descripcion.includes("Fuente")){                                
11804                                if(temaTmp !== tema.tema){                                
11805                                    // if(tema.descripcion !== "NOTA"){
11806                                        temaTmp = tema.tema;                                                                
11807                                        // crear lista para nuevo tema
11808                                        containerUl = DIV.cloneNode(true);  
11809                                        ulLoc5000 = UL.cloneNode(true);
11810                                        ulLoc5000.className = "list-group";
11811                                        ulLoc5000.style.padding = "0px";
11812                                        ulLoc5000.style.width = "90%";//"67%"; // para las listas fichas un width acncho fijo
11813                                        ulLoc5000.style.margin = "10px 0 0 25px";
11814                                        ulLoc5000.style.listStyleType = "none";
11815                                        ulLoc5000.id = "listTema"+ tema.tema;
11816                                        ulLoc5000.style.display = "none";
11817                                        // area titulo 
11818                                        var divTituloUl = DIV.cloneNode(true);
11819                                        divTituloUl.innerHTML = '<i id="iLoc_' + tema.tema +'" style="font-size:10px;color:#bb0026;vertical-align:middle;padding-right:6px"><span class="inegi-nav-desp enest_t"></span></i>' + tema.desc_tema;                                
11820                                        divTituloUl.style.padding = "0 0 0 10px";
11821                                        divTituloUl.style.cursor = "pointer";
11822                                        divTituloUl.onclick = function (e) {
11823                                            var t = $(this).find("i")[0].id.split("iLoc_")[1];
11824                                            $("#listTema" + t).toggle();
11825                                            if ($("#iLoc_" + t).html() == '<span class="inegi-nav-desp enest_t"></span>') {
11826                                                $("#iLoc_" + t).html('<span class="inegi-nav-despa enest_t"></span>')
11827                                            } else {
11828                                                $("#iLoc_" + t).html('<span class="inegi-nav-desp enest_t"></span>');
11829                                            }
11830                                        }
11831                                        containerUl.appendChild(divTituloUl);
11832
11833                                }                               
11834                                if(tema.descripcion === "TITULO"){
11835                                    var liInfo = LI.cloneNode(true);
11836                                    liInfo.style.backgroundColor = "#f9f9f9";
11837                                    liInfo.style.color = "#157fcc";
11838                                    liInfo.style.padding = "4px 0";                                    
11839                                    liInfo.style.paddingLeft = "10px;"
11840                                    liInfo.className = "cls-title";
11841                                    var span = SPAN.cloneNode(true);
11842                                    span.style.fontWeight = "bold";
11843                                    span.innerHTML = tema.valor;
11844                                    span.style.padding = "0px 10px";
11845                                    liInfo.appendChild(span);       
11846                                    
11847                                    ulLoc5000.appendChild(liInfo); 
11848                                    containerUl.appendChild(ulLoc5000);
11849                                    LOC_CONTAINER.appendChild(containerUl);
11850
11851                                } else if(tema.descripcion === "NOTA"){ 
11852                                        spanNotaLoc5000 = DIV.cloneNode(true);
11853                                        spanNotaLoc5000.innerHTML = "* "+tema.valor;
11854
11855                                        spanNotaLoc5000.style.fontSize = "11px";                                                                                                
11856                                        $(ulLoc5000).append(spanNotaLoc5000)
11857
11858                                } else {
11859                                    var liInfo = LI.cloneNode(true);
11860                                    liInfo.className = "list-group-item";
11861                                    liInfo.style.borderLeft = "0";
11862                                    liInfo.style.borderRight = "0";
11863                                    liInfo.style.padding = "4px 15px";
11864                                    var span = SPAN.cloneNode(true);
11865                                    span.innerHTML = "&emsp;&emsp;"+ tema.descripcion+":";
11866                                    span.style.fontWeight = "bold";
11867                                    span.style.padding = "0px 10px";
11868                                    liInfo.appendChild(span);
11869                                    var span = SPAN.cloneNode(true);
11870                                    span.innerHTML = tema.valor;
11871                                    liInfo.appendChild(span); 
11872                                    
11873                                    ulLoc5000.appendChild(liInfo); 
11874                                    containerUl.appendChild(ulLoc5000);
11875                                    if(parametros.secc.indexOf("5") === -1){
11876                                        containerUl.style.display = "none";
11877                                    }   
11878                                    LOC_CONTAINER.appendChild(containerUl);
11879                                }
11880
11881                                // if(data[index+1] !== undefined && data[index].tema !== data[index+1].tema){
11882
11883                                //     let details = DETAILS.cloneNode(true);
11884                                //         details.setAttribute("open","open")
11885                                //         details.className = ""; details.style.padding = "0px";
11886                                //         details.style.backgroundColor = "#f9f9f9";
11887                                //     let divItems = UL.cloneNode(true);
11888                                //         divItems.classList.add("list-group")
11889                                //         divItems.style.minHeight =  "300px"
11890                                //         divItems.style.maxHeight = "300px"
11891                                //         divItems.style.overflowY = "auto"
11892                                //         let summary = SUMMARY.cloneNode(true);
11893                                //         summary.style.backgroundColor = "#f9f9f9"; summary.style.color = "#157fcc"; summary.style.padding = "4px 0"; summary.style.paddingLeft = "10px;"; summary.className = "cls-title"; summary.style.cursor = "pointer";
11894                                        
11895                                //     var btnRequest = document.createElement("button"); 
11896                                //         btnRequest.className = "btn btn-sm";
11896 btnRequest.innerHTML = "mostrar información";
11897
11898                                //         btnRequest.addEventListener("click", (e) => {                                             
11899                                //             e.preventDefault()                                            
11900                                //             btnRequest.innerHTML = "Cargando..."
11901                                //             btnRequest.classList.add("disabled")
11902                                //             requestSCITEL(parametros.areaLocalidad, parametros.periodoLocalidad, tema.tema, (scitelDatos) => {
11903                                //                 //SCITEL
11904                                //                 console.log(scitelDatos)
11905                                //                 if(scitelDatos !== null){
11906
11907                                //                     scitelDatos.forEach(ind => {
11908                                //                         const nombre_indicador = ind.nombre; 
11909                                //                         const valor_indicador = ind.valor === null? "<small>Sin dato</small>" : INTLFormat.format(ind.valor); 
11910                                //                         const frecuencia_indicador = ind.desC_FREC; 
11911
11912                                //                         let liItem = LI.cloneNode(true);
11913                                //                         liItem.classList.add("py-1")
11914                                //                         liItem.style.padding = "4px 53px"
11915                                //                         liItem.innerHTML = '<span class="d-inline"><strong>'+nombre_indicador+' ('+frecuencia_indicador+'):</strong></span> <span class="d-inline">'+ valor_indicador+'</span>'
11916
11917                                //                         divItems.appendChild(liItem)
11918                                //                     });
11919                                //                     details.appendChild(divItems)
11920                                        
11921                                //                     // bloquear boton
11922                                //                     btnRequest.remove()
11923                                //                     summary.style.display = "list-item";
11924
11925                                //                 }
11926                                //             })
11927                                //         })
11928                                       
11929                                        
11930                                //     var spanScitel = SPAN.cloneNode(true);
11931                                //         spanScitel.style.fontWeight = "bold";
11932                                //         spanScitel.style.padding = "0px 10px";
11933
11934                                //         summary.appendChild(spanScitel);     
11935                                //         summary.appendChild(btnRequest);     
11936                                   
11937                                //         spanScitel.innerHTML = 'SCITEL';
11938                                //         details.appendChild(summary)
11939
11940                                //         ulLoc5000.insertBefore(details, spanNotaLoc5000)  
11941                                    
11942                                   
11943                                    
11944                                // }                           
11945                               
11946                            }
11947                        // }
11948                        //nota al pie del contenido 
11949                    }); // termina el forEach
11950
11951                    //inserta notas correspondientes a entorno urbano
11952                    if(arrNotasEntornoUrbano.length > 0){
11953                        for(var n = 0; n < arrNotasEntornoUrbano.length; n++){                        
11954                            tableUrbano.after(arrNotasEntornoUrbano[n]);
11955                        }
11956                    }
11957                    //inserta notas correspondientes a viviendas
11958                    if(arrNotasVivienda.length > 0){
11959                        for(var n = 0; n < arrNotasVivienda.length; n++){
11960                            tableViviendas.after(arrNotasVivienda[n]);
11961                        }
11962                    }
11963                    //inserta notas correspondientes a población
11964                    if(arrNotasPoblacion.length > 0){
11965                        for(var n = 0; n < arrNotasPoblacion.length; n++){
11966                            tablePoblacion.after(arrNotasPoblacion[n]);
11967                        }
11968                    }
11969                   
11970                    $(window).resize(function(e){
11971                        var widthWindow = document.body.clientWidth;
11972                        if(widthWindow >= 480){
11973                            $(".cls-ulInfoLocalidad").find(".cls-block-loc").css({width:"40%"});
11974                            
11975                        } else {                        
11976                            $(".cls-ulInfoLocalidad").find(".cls-block-loc").css({width:"auto"});
11977                            
11978                        }
11979                    })
11980                    var widthWindow = document.body.clientWidth;
11981                        if(widthWindow >= 510){
11982                            $(".cls-ulInfoLocalidad").find(".cls-block-loc").css({width:"40%"});
11983                            
11984                        } else {
11985                            $(".cls-ulInfoLocalidad").find(".cls-block-loc").css({width:"auto"});
11986                            
11987                        }
11988
11989                    // TEMAS Y DATOS SCITEL
11990                    // 30-07-2024
11991                    if(catalogoTemasLocalidad.length > 0){
11992
11993                        //TITULO SECCION
11994                        var tituloTemasLocalidad = DIV.cloneNode(false);
11995                        tituloTemasLocalidad.innerHTML = "<strong>Información SCITEL</strong>";
11996                        tituloTemasLocalidad.style.backgroundColor = "#f1f1f1"
11997                        tituloTemasLocalidad.style.padding = "8px 8px"
11998                        tituloTemasLocalidad.style.marginTop = "10px"
11999                        LOC_CONTAINER.appendChild(tituloTemasLocalidad);
12000
12001                        // insertar titulo SCITEL
12002                        catalogoTemasLocalidad.forEach((temaLocalidad) => {
12003                            let divItemsLocalidad = UL.cloneNode(true);
12004                                divItemsLocalidad.classList.add("list-group")
12005                                divItemsLocalidad.id = "listTemaLoc"+temaLocalidad.id_tema;
12006                                divItemsLocalidad.style.padding = "4px 53px"
12007
12008
12009                            var divTituloTemaLoc = DIV.cloneNode(true);
12010                            divTituloTemaLoc.innerHTML = '<i id="iTemaLoc_' + temaLocalidad.id_tema +'" style="font-size:10px;color:#bb0026;vertical-align:middle;padding-right:6px"><span class="inegi-nav-desp enest_t"></span></i>' + temaLocalidad.nombre;                                
12011                            divTituloTemaLoc.style.padding = "8px 0 0 10px";
12012                            divTituloTemaLoc.style.cursor = "pointer";                            
12013                            
12014                            divTituloTemaLoc.onclick = function (e) {
12015                                var t = $(this).find("i")[0].id.split("iTemaLoc_")[1];
12016                                $("#listTemaLoc" + t).toggle();
12017                                if ($("#iTemaLoc_" + t).html() == '<span class="inegi-nav-desp enest_t"></span>') {
12018                                    $("#iTemaLoc_" + t).html('<span class="inegi-nav-despa enest_t"></span>')
12019                                    if(!divTituloTemaLoc.getAttribute("loaded")){                                    
12020                                        divTituloTemaLoc.setAttribute("loaded",true)
12021                                        let liLoaded = LI.cloneNode(true);
12022                                        liLoaded.innerHTML = "Cargando...";  
12023                                        divItemsLocalidad.appendChild(liLoaded)                                      
12024                                        divTituloTemaLoc.appendChild(divItemsLocalidad)                                      
12025                                        // PETICION Y VALIDAR QUE YA SE CARGARON LOS DATOS
12026                                        requestSCITEL(parametros.areaLocalidad, parametros.periodoLocalidad, temaLocalidad.id_tema, (scitelDatos) => {
12027                                            //SCITEL
12028                                            if(scitelDatos !== null && scitelDatos.length > 0){
12029                                                scitelDatos.forEach(ind => {
12030                                                    const nombre_indicador = ind.nombre; 
12031                                                    const valor_indicador = ind.valor === null? "<small>Sin dato</small>" : INTLFormat.format(ind.valor); 
12032                                                    const frecuencia_indicador = ind.desC_FREC; 
12033                                                    let liItem = LI.cloneNode(true);
12034                                                    liItem.classList.add("list-group-item")
12035                                                    liItem.style.padding = "4px 15px"
12036                                                    liItem.style.borderLeft = 0
12037                                                    liItem.style.borderRight = 0
12038                                                    liItem.innerHTML = '<span class="d-inline"><strong>'+nombre_indicador+' ('+frecuencia_indicador+'):</strong></span> <span class="d-inline">'+ valor_indicador+'</span>'
12039                                                    divItemsLocalidad.appendChild(liItem)
12040                                                });
12041
12042                                            } else {
12043                                                let liItem = LI.cloneNode(true);
12044                                                // liItem.classList.add("list-group-item")
12045                                                liItem.innerHTML = '<i>Sin datos</i>'
12046                                                divItemsLocalidad.appendChild(liItem)
12047                                            }
12048                                            divTituloTemaLoc.appendChild(divItemsLocalidad)
12049                                            liLoaded.style.display = "none"; 
12050
12051                                        })
12052                                    }
12053                                } else {
12054                                    $("#iTemaLoc_" + t).html('<span class="inegi-nav-desp enest_t"></span>');
12055                                }
12056                            }
12057                            LOC_CONTAINER.appendChild(divTituloTemaLoc);
12058                        })
12059                    }
12060
12061                } else if(parametros.modoVisualizacionLocalidades == "2") { // ver en pestañas navegables
12062
12063                    /// ----------- ESTRUCTURA DE DATOS ------------------
12064                    var tmpTema = ""; // guardar el tema temporalmente
12065                    var aTemas = []; // nuevo almacen del tema y sus datos
12066                    var aDatosTema = [] // guarda todos los datos por tema
12067                    
12068                    // -- recordar que el tema: 1 y 2 comparten datos parecidos.
12069                    var index = null;
12070                    var oD = {};
12071                    var l = false;
12072                    data.map(function(t) {
12073                        if(tmpTema != t.tema){ // si el tmpTema es diferente al de la ctual posición, se asigna el nuevo a tmpTema y guarda el objeto tema
12074                            aDatosTema = [];// limpiamos para volver a llenar dependiendo del tema nuevo que se esta leyendo
12075                            tmpTema = t.tema;
12076                            l = false
12077                            if(tmpTema > 5) l = true;
12078                            // -- Generamos un arreglo de temas principales (Nuestras pestañas)
12079                            aTemas.push({tema_id:t.tema, tema:t.desc_tema,loc5000:l,datos:[]});
12080                            index = aTemas.length-1;
12081                            
12082                        } // else {// si el tema es igual al anterior (tmpTema) no guarda el objeto tema, pero si guarda los datos en el tema
12083                        oD = {descripcion:t.descripcion,valor:t.valor}
12084                        aDatosTema.push(oD);               
12085                        aTemas[index].datos = aDatosTema;                    
12086                        
12087                    });
12088                   
12089                    // si existe  el tema 2 fusionar arreglo de datos con el tema 1
12090                    /* var temasCompartidos = aTemas.filter(function(t, index){
12091                        t.index = index;
12092                        return t.tema_id === 0;
12093                    })[0]; */
12094                    var temasCompartidos = aTemas.filter(function(t, index){
12095                        t.index = index;
12096                        return t.tema_id === 1 || t.tema_id === 5;
12097                    });
12098                    var aTemasFinal = [];
12099                    var aIndexesIngore = []; 
12100                    if(temasCompartidos !== undefined && temasCompartidos.length > 1){
12101                        for(var x = 0; x < temasCompartidos.length; x++){
12102                            if(x > 0){
12103                                var aTemaDatosCombinado = aTemas[0].datos.concat(temasCompartidos[x].datos);
12104                                aTemas[0].datos = aTemaDatosCombinado;
12105                                aIndexesIngore.push(temasCompartidos[x].index)
12106                            }
12107                        }
12108                        // pasamos a nuevo arreglos los datos finales
12109                        aTemasFinal = aTemas.filter(function(tema, idx) {
12110                            return aIndexesIngore.indexOf(tema.index) == -1;
12111                        })
12112                    } else {
12113                        aTemasFinal = aTemas;
12114                    }                                   
12115                    
12116                    /// ----------- ARMADO DEL COMPONENTE PESTAÑAS ------------------                   
12117                    
12118                    var divCarruselTemas = document.createElement("div");
12119                    divCarruselTemas.id = "divCarouselTemas_" + parametros.contenedorCuadro;
12120                    LOC_CONTAINER.appendChild(divCarruselTemas);
12121                    // new carouselTemas(divCarruselTemas.id, aTemas, parametros.secc).render()
12122                    new carouselTemas(divCarruselTemas.id, aTemasFinal, parametros.secc, parametros).render()
12123                    
12124                }
12125            }
12126
12127            //callback
12128            callback();
12129
12130            //document.getElementById("divDatos" + parametros.contenedorCuadro).appendChild(LOC_CONTAINER);
12131            $("#tableStat" + parametros.contenedorCuadro).hide();
12132            $("#TableEspacio" + parametros.contenedorCuadro).hide();
12133            $("#divCargaCuadro" + parametros.contenedorCuadro).hide();
12134            $(".clsHover").hover(function(){
12135                $(this).css("background-color", "#ececec");
12136                }, function(){
12137                $(this).css("background-color", "#f9f7f7");
12138            });
12139            $(".cls-tooltip").tooltip(); 
12140        } 
12141        /**
12142         * Petición para obtener los datos de SCITEL por tema/periodo/area
12143         * @param {*} area 
12144         * @param {*} periodo 
12145         * @param {*} tema 
12146         * @param {*} cb 
12147         * @returns 
12148         */
12149        function requestSCITEL(area, periodo, tema, cb){
12150            if(area !== null && periodo !== null && tema !== null){
12151                // tema = "123";
12152                // periodo = "2020";
12153                $.getJSON(C_dominioBuscador+"app/api/indicadores/internalocalidades_v1_1/DatosIndicadoresSCITEL?tema="+tema+"&periodo="+periodo+"&areageo="+area, function (data) {                      
12154                   cb(data)
12155                })                     
12156            } else {
12157                cb(null)
12158            }
12159        }
12160        
12161        /**
12162         * Exportacion XLS de datos localidades (México en cifras) 
12163         * fecha: 17-09-2021
12164         * @param {*} data 
12165         * @param {*} parametros 
12166         */
12167        function exportXLSLocalidades(parametros, data) {
12168
12169            var tableDataType = 'data:application/vnd.ms-excel;base64,';
12170            var template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><meta http-equiv="content-type" content="application/vnd.ms-excel; charset=UTF-8"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table>{table}</table></body></html>'
12171            var base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))) }
12172            var format = function (s, c) { return s.replace(/{(\w+)}/g, function (m, p) { return c[p]; }) }
12173
12174            var htmlContenido = document.getElementById("divDatos"+parametros.contenedorCuadro);  
12175            var nodosContenido = htmlContenido.childNodes[1].childNodes;
12176            var totalNodosContenido = nodosContenido.length;
12177            var divContenido = document.createElement("div");           
12178            var table = document.createElement("table");
12179            var tr = document.createElement("tr");           
12180            var th = document.createElement("th");
12181            var td = document.createElement("td");
12182            
12183            // info localidad
12184            var tableInfo = table.cloneNode(true); 
12185            tableInfo.style.fontFamily = "Arial"; 
12186            tableInfo.style.fontSize = "13px"; 
12187            tableInfo.append(tr.cloneNode(true));
12188
12189            var infoParte1 = nodosContenido.item(0).childNodes.item(0)
12190            var infoParte2 = nodosContenido.item(0).childNodes.item(1)
12191            
12192            for(var i = 0; i < infoParte1.childNodes.length; i++){
12193                var aTexto = infoParte1.childNodes[i].textContent.split(":");
12194                    trInfo = tr.cloneNode(true);
12195                    thInfo = th.cloneNode(true);
12196                        thInfo.colSpan = 2
12197                        thInfo.style.textAlign = "right";
12198                        thInfo.style.backgroundColor = "#dfdfdf";
12199                        thInfo.textContent = aTexto[0]
12200                    tdInfo = td.cloneNode(true);
12201                        tdInfo.colSpan = 4
12202                        tdInfo.textContent = aTexto[1]
12203                        
12204                    trInfo.append(thInfo)
12205                    trInfo.append(tdInfo)
12206                    tableInfo.append(trInfo)
12207            }            
12208            if(infoParte2 !== null){
12209                for(var i = 0; i < infoParte2.childNodes.length; i++){
12210                    var aTexto = infoParte2.childNodes[i].textContent.split(":");
12211                    var trInfo = tr.cloneNode(true);
12212                    var thInfo = th.cloneNode(true);
12213                        thInfo.colSpan = 2
12214                        thInfo.style.textAlign = "right";
12215                        thInfo.style.backgroundColor = "#dfdfdf";
12216                        thInfo.textContent = aTexto[0]
12217                    var tdInfo = td.cloneNode(true);
12218                        tdInfo.colSpan = 4
12219                        tdInfo.textContent = aTexto[1]
12220                        
12221                    trInfo.append(thInfo)
12222                    trInfo.append(tdInfo)
12223                    tableInfo.appendChild(trInfo)
12224                }
12225            }
12226            
12227            // Contenido fichas localidad
12228            var tableInfoListado = table.cloneNode(true); 
12229            tableInfoListado.style.fontFamily = "Arial"; 
12230            tableInfoListado.style.fontSize = "13px"; 
12231            tableInfoListado.append(tr.cloneNode(true)) // espacio o salto de linea
12232
12233            for(var i = 0; i < totalNodosContenido; i++){
12234                if(i > 0){
12235                    // sacamos el titulo de cada seccion
12236                    var sTitulo = nodosContenido[i].childNodes[0].textContent.split(":");
12237                    
12238                    var trInfoC = tr.cloneNode(true);
12239                    var thInfoC = th.cloneNode(true);
12240                    thInfoC.colSpan = 5;
12241                    thInfoC.textContent = sTitulo   ; 
12242                    thInfoC.style.fontSize = "13px";
12243                    thInfoC.style.backgroundColor = "#c8c8c8";                
12244                    trInfoC.append(thInfoC);
12245                    tableInfoListado.appendChild(tr.cloneNode(true));
12246                    var trInfoC2 = tr.cloneNode(true);
12247                    var tdInfoC2 = td.cloneNode(true);
12248                    tdInfoC2.colSpan = 6;
12249                    tableInfoListado.appendChild(trInfoC);
12250                    tableInfoListado.appendChild(trInfoC2);
12251
12252                    // inserta lista o cuadro segun sea el caso del titulo de la seccion
12253                    var tableListaContenido = table.cloneNode(true);
12254                    tableListaContenido.style.fontFamily = "Arial";
12255                    tableListaContenido.style.fontSize = "13px";
12256
12257                     //sacamos el contenido de las secciones
12258                     var ulItems = nodosContenido[i].childNodes;             // 0 => titulo de subseccion        
12259
12260                    // tablas y listas de contenido                    
12261                    if(ulItems[1].tagName === "UL"){
12262                        
12263                        var aLis = ulItems[1].childNodes;
12264                        for(var j = 0; j < aLis.length; j++){
12265                            
12266                            if(aLis[j].className === "cls-title"){ // titulo de la seccion de cada lista interna
12267                                var trInfoC3 = tr.cloneNode(true);
12268                                var tdInfoC4 = td.cloneNode(true);
12269                                var tdInfoC3 = td.cloneNode(true);
12270                                    tdInfoC3.colSpan = 5;
12271                                    tdInfoC3.style.fontSize = "13px";                                    
12272                                    tdInfoC3.style.backgroundColor = "#c8c8c8";
12273                                    tdInfoC3.textContent = " > "+aLis[j].textContent;
12274                                    tdInfoC3.style.fontWeight = "bold";
12275                                    trInfoC3.append(tdInfoC3)
12276                                    tableListaContenido.append(trInfoC3)
12277
12278                            } else if(aLis[j].nodeName === "DETAILS"){
12279                                
12280                                var trInfoC3 = tr.cloneNode(true);
12281                                var spanItems = aLis[j].childNodes // contenido de un LI = 2 <span>
12282                                if(spanItems[1] !== undefined){ // Quiere decir que contiene datos de SCITEL (15-07-2024)
12283
12284                                    // titulo
12285                                    var trInfoC3 = tr.cloneNode(true);
12286                                    var tdInfoC4 = td.cloneNode(true);
12287                                    var tdInfoC3 = td.cloneNode(true);
12288                                        tdInfoC3.colSpan = 5;
12289                                        tdInfoC3.style.fontSize = "13px";                                    
12290                                        tdInfoC3.style.backgroundColor = "#c8c8c8";
12291                                        tdInfoC3.textContent = " > "+spanItems[0].textContent;
12292                                        tdInfoC3.style.fontWeight = "bold";
12293                                        trInfoC3.append(tdInfoC3)
12294                                        tableListaContenido.append(trInfoC3)
12295
12296                                        //lista de items
12297                                        let scitelLi = spanItems[1].childNodes;
12298                                        for(var k = 0; k < scitelLi.length; k++){
12299                                            let spanItems = scitelLi[
12299k].childNodes;
12300                                            var trInfoC3 = tr.cloneNode(true);
12301                                            var thInfoC4 = th.cloneNode(true);
12302                                                thInfoC4.style.textAlign = "right";
12303                                                thInfoC4.style.fontWeight = "bold";
12304                                            var tdInfoC5 = td.cloneNode(true);
12305
12306                                            thInfoC4.textContent = spanItems[0].textContent;
12307                                            tdInfoC5.textContent = spanItems[1] !== undefined ? spanItems[1].textContent : "";
12308                                            trInfoC3.append(thInfoC4)
12309                                            trInfoC3.append(tdInfoC5);
12310                                            tableListaContenido.append(trInfoC3)
12311                                        }
12312                                }
12313
12314                            } else { // LI HTML TAG
12315
12316                                var trInfoC3 = tr.cloneNode(true);
12317                                var spanItems = aLis[j].childNodes // contenido de un LI = 2 <span>
12318                                var thInfoC4 = aLis[j].tagName === "LI"? th.cloneNode(true) : td.cloneNode(true);
12319                                thInfoC4.style.textAlign = "right";
12320                                thInfoC4.style.fontWeight = "normal";
12321                                var tdInfoC5 = td.cloneNode(true);
12322                                if(aLis[j].tagName === "DIV") {thInfoC4.colSpan = 2; thInfoC4.style.textAlign = "left"}
12323                                thInfoC4.textContent = spanItems[0].textContent;
12324                                tdInfoC5.textContent = spanItems[1] !== undefined ? spanItems[1].textContent : "";
12325                                trInfoC3.append(thInfoC4)
12326                                trInfoC3.append(tdInfoC5);
12327                                tableListaContenido.append(trInfoC3)
12328                            }
12329                        }
12330
12331                    } else if(ulItems[1].tagName === "TABLE"){                        
12332                        ulItems[1].style.fontFamily = "Arial";
12333                        ulItems[1].style.fontSize = "13px";
12334                        var tableCLone = ulItems[1].cloneNode(true);
12335                        // actualiza la alineacion de los valores alfanumericos de las tablas de datos de localidades y que se ubiquen a la izquierda
12336                        var tableChildNodes = tableCLone.childNodes[1].childNodes;
12337                        tableChildNodes.forEach(function(tr,idx){
12338                            var celdaNumericas =tableCLone.childNodes[1].childNodes[idx].childNodes;
12339                            celdaNumericas.forEach(function(trc,idc){
12340                                tableCLone.childNodes[1].childNodes[idx].childNodes[idc].style.textAlign = "left"
12341                            })
12342                            
12343                        })
12344                        var trInfoC3 = tr.cloneNode(true);
12345                        var tdInfoC4 = td.cloneNode(true);                        
12346                        tdInfoC4.appendChild(tableCLone);                                
12347                        trInfoC3.append(tdInfoC4)
12348                        tableListaContenido.append(trInfoC3)
12349                   
12350                        // Notas pie de contenido (en tablas es un div, las otras notas se incluyen en el ultimo item de las ul)
12351                        var sNota = nodosContenido[i].childNodes[2] !== undefined? nodosContenido[i].childNodes[2].textContent : "";
12352                        if(sNota !== ""){
12353                            var trNota = tr.cloneNode(true);
12354                            var tdNota = td.cloneNode(true);
12355                            tdNota.colSpan = 4;
12356                            tdNota.style.fontSize = "13px";
12357                            var htmlNota = nodosContenido[i].childNodes[2].textContent;
12358                            htmlNota = htmlNota.replace(/Fuente/i," Fuente")
12359                            htmlNota = htmlNota.replace(/\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s/g, " ");                            
12360                            tdNota.innerHTML = htmlNota
12361                            trNota.append(tdNota);
12362
12363                            tableListaContenido.append(trNota)
12364                        }
12365                    }
12366                    tdInfoC2.append(tableListaContenido);
12367                    trInfoC2.append(tdInfoC2)
12368                }
12369            }
12370            divContenido.append(tableInfo);           
12371            divContenido.style.fontFamily = "Arial";
12372            divContenido.append(tableInfoListado);
12373            var tableResult = '<table style="font-family:\'Arial\'">'
12374                    +'<tr><td colspan="9" align="center" style="font-size:16px;font-weight:bold">
12374'+ getTraductorCuadro(parametros, "Instituto Nacional de Estadística y Geografía") +' (INEGI)</td></tr>'
12375                    +'<tr><td colspan="9" align="center" style="font-size:15px;font-weight:bold">'+ getTraductorCuadro(parametros, "México en Cifras") +' ('+ getTraductorCuadro(parametros, "Localidades") +')</td></tr>'
12376                    // +'<tr><td colspan="9" align="center" style="font-size:15px;font-weight:bold">Localidades</td></tr>'
12377                    +'<tr><td colspan="9" style="font-size:12px;">'+ getTraductorCuadro(parametros,"Fecha de consulta") +': '+ getDateF2().todayFormat +'</td></tr>'             
12378            +'</table>'
12379            var spaceTable = "<table><tr></tr></table>"
12380            var fileName = 'Mexicoencifras_localidades_'+ getDateF2().today +'.xls';
12381            var excelFileURL = document.createElement("a");
12382            document.body.appendChild(excelFileURL);
12383            
12384            var ctx = { worksheet: 'México en cifras', table: tableResult + divContenido.innerHTML}
12385            if(navigator.msSaveOrOpenBlob){
12386                var blob = new Blob(['\ufeff', tableResult], {
12387                    type: TableDataType
12388                });
12389                navigator.msSaveOrOpenBlob( blob, fileName);
12390            }else{
12391                excelFileURL.href = tableDataType + base64(format(template, ctx));
12392                excelFileURL.download = fileName;
12393                excelFileURL.click();
12394            }
12395            
12396        }
12397
12398          /** 
12399         *  LOCALIDADES VERSION UN ARRAY COMPLETO ORDENADO V3
12400         * ACTUALMENTE EN USO
12401         *  Cuadro #18 - Datos de la localidad (metodo: datosLocalidadTema/)
12402         * @param data
12403         * @param parametros
12404         */
12405        function DibujaCuadroTipo18_LocalidadesV3(data, parametros) {
12406            if ($("#divDatos" + parametros.contenedorCuadro)) {
12407                $("#divDatos" + parametros.contenedorCuadro).empty();
12408            }
12409            //  console.log(data);
12410
12411            // estructuras de datos            
12412            var idioma = parametros.idioma;
12413            //elementos HTML para el armado de las secciones
12414            var LOC_CONTAINER = document.createElement("div"); // contenedor principal de localidades
12415            var UL = document.createElement("ul");
12416            var LI = document.createElement("li");            
12417            var SPAN = document.createElement("span");
12418                SPAN.style.display = "inline-block";
12419                SPAN.style.verticalAlign = "middle";
12420            var DIV = document.createElement("div"); 
12421                DIV.style.paddingTop = "8px";
12422            var TABLE = document.createElement("table"); TABLE.className = 'table table-bordered table-responsive table-striped';
12423            TABLE.style.width = "auto";
12424            TABLE.style.margin = "0 25px";
12425            var TR = document.createElement("tr");
12426            var TD = document.createElement("td");
12427            var TH = document.createElement("th");
12428            // console.log(data);
12429
12430
12431            // validacion sino llega ningun dato entonces coloca el nensaje "Sin datos"
12432            if (data.length === 0) {
12433                
12434                var divNodatos = document.createElement("div");
12435                divNodatos.innerHTML = (idioma === "es"? "No se encontraron resultados" : "No found results");
12436                LOC_CONTAINER.appendChild(divNodatos);
12437              
12438            } else {
12439
12440                // tema 1 infolocalidad
12441                var ulInfo = null;
12442                var cAgrupador = 0;
12443                var tmpInfoLocalidad = null;
12444                var divContainerInformacionLocalidad = DIV.cloneNode(true);  
12445                
12446                // temsa 5 loc5000
12447                var ulIdentificacion = null;
12448                var clavesPath = "";
12449                var tmpLocUbicacionGeografica = [];
12450                // var notaFinal = false;
12451                data.forEach(function(tema, index){ // recorre el arreglo completo de datos                    
12452                    if(parametros.secc.indexOf("1") > -1){
12453
12454                        if(tema.tema === 1){
12455                        //  seccion infoLocalidad ------------------------------------------------
12456                            if(ulInfo == null){
12457                                ulInfo = UL.cloneNode(true);
12458                                // ulInfo.style.border = "1px solid #cecece";
12459                                ulInfo.style.padding = "0px";
12460                                ulInfo.style.marginBottom = "0px";
12461                                ulInfo.style.listStyleType = "none";   
12462                            }                 
12463                            if (tema.descripcion.indexOf("Clave de entidad federativa") > -1 || tema.descripcion.indexOf("Clave de municipio") > -1){
12464                                clavesPath = clavesPath + tema.valor;                                
12465                            }
12466                            
12467                            //for(i in infoLocalidad){
12468                                if(cAgrupador == 0){
12469                                    tmpInfoLocalidad = tema;
12470                                    cAgrupador++;
12471                                } else {
12472                                    cAgrupador = 0;
12473                                    var liInfo = LI.cloneNode(true);
12474                                    var span = SPAN.cloneNode(true);
12475                                    span.innerHTML = tema.descripcion+":";                                                                          
12476                                    // span.style.width = "50%";
12477                                    span.style.padding = "0px 10px";
12478                                    span.style.fontWeight = "600";                    
12479                                    liInfo.appendChild(span);
12480                                    var span = SPAN.cloneNode(true);
12481                                    var a = document.createElement("a");
12482                                    if (tmpInfoLocalidad.descripcion.indexOf("localidad") === -1) {
12483                                        a.setAttribute("href", C_dominioBuscador+"app/areasgeograficas?ag=" + clavesPath);
12484                                        a.setAttribute("target","_blank");
12485                                        a.style.cursor = "pointer";
12486                                        // console.log(tema)
12487                                        // console.log(clavesPath);
12488                                        a.innerHTML = (tema.descripcion === "Municipio") ? clavesPath + " " + tema.valor : tmpInfoLocalidad.valor + " " + tema.valor;
12489                                        span.appendChild(a);
12490                                    } else {
12491                                        span.innerHTML = (tema.descripcion === "Localidad") ? clavesPath + tmpInfoLocalidad.valor + " " + tema.valor : tmpInfoLocalidad.valor + " " + tema.valor;
12492                                    }
12493
12494                                    liInfo.appendChild(span); 
12495                                    ulInfo.appendChild(liInfo);                                       
12496                                }
12497                            //}
12498                            divContainerInformacionLocalidad.appendChild(ulInfo)
12499                            // LOC_CONTAINER.appendChild(ulInfo);
12500
12501                        } else if(tema.tema === 5 && tema.descripcion !== "NOTA"){
12502                        // seccion identificacion (en loc5000)------------------------------------------------                        
12503                            if(ulIdentificacion == null){
12504                                ulIdentificacion = UL.cloneNode(true);
12505                                // ulIdentificacion.style.border = "1px solid #cecece";
12506                                ulIdentificacion.style.padding = "0px";
12507                                ulIdentificacion.style.listStyleType = "none";
12508                            }
12509                            if(tema.descripcion === "TITULO"){
12510                            //  var liInfo = LI.cloneNode(true);
12511                            //     liInfo.style.backgroundColor = "#ddd";
12512                            //     liInfo.style.paddingLeft = "10px;"
12513                            //     var span = SPAN.cloneNode(true);
12514                            //     span.innerHTML = Loc5000[i].valor;
12515                            //     span.style.fontWeight = "600";
12516                            //     span.style.padding = "4px 10px";
12517                            //     liInfo.appendChild(span);                            
12518                            } else {
12519                                var liInfo = LI.cloneNode(true);
12520                                var span = SPAN.cloneNode(true);
12521                                if(tema.descripcion.indexOf("Latitud") > -1 || tema.descripcion.indexOf("Longitud") > -1 || tema.descripcion.indexOf("Altitud") > -1){
12522                                    tmpLocUbicacionGeografica.push(tema);
12523                                    if(tmpLocUbicacionGeografica.length === 3){ // si no es coordenada grografica el proceso es normal
12524                                        var valor = "Longitud "+tmpLocUbicacionGeografica[0].valor +", Latitud "+tmpLocUbicacionGeografica[1].valor +", Altitud "+tmpLocUbicacionGeografica[2].valor;
12525                                        span.innerHTML = "Ubicación geográfica:";                                            
12526                                        span.style.padding = "0px 10px";
12527                                        span.style.fontWeight = "600";
12528                                        liInfo.appendChild(span);
12529                                        var span = SPAN.cloneNode(true);                                            
12530                                        span.innerHTML = valor; 
12531                                        liInfo.appendChild(span); 
12532                                        ulIdentificacion.appendChild(liInfo);             
12533                                    }
12534                                } else {
12535                                    span.innerHTML = tema.descripcion+":";
12536                                    // span.style.width = "50%";
12537                                    span.style.padding = "0px 10px";
12538                                    span.style.fontWeight = "600";
12539                                    liInfo.appendChild(span);
12540                                    var span = SPAN.cloneNode(true);
12541                                    if(tema.descripcion.indexOf("Cabecera municipal") > -1){
12542                                        cveLoc = tema.valor.substring(tema.valor.indexOf("(") + 1, tema.valor.length-1); 
12543                                        var a = document.createElement("a");
12544                                        a.setAttribute("href", C_dominioBuscad
12544or+"app/areasgeograficas?ag=" + cveLoc);
12545                                        a.setAttribute("target","_blank");
12546                                        a.style.cursor = "pointer";
12547                                        //invierte valor 
12548                                        var valor = tema.valor;
12549                                        if(valor.indexOf("(") > -1){
12550                                            var valor1 = tema.valor.substring(0, tema.valor.indexOf('(')-1);                                            
12551                                            var valor2 = tema.valor.substring(tema.valor.indexOf('('), tema.valor.length);                                            
12552                                            valor = valor2.replace("(","").replace(")","") + " " + valor1;
12553                                        }
12554                                        a.innerHTML = valor;
12555                                        span.appendChild(a);
12556                                    } else {
12557                                        span.innerHTML = tema.valor;
12558                                    }
12559                                    liInfo.appendChild(span); 
12560                                    ulIdentificacion.appendChild(liInfo);                                                                        
12561                                }
12562                            
12563                            }
12564                            divContainerInformacionLocalidad.appendChild(ulIdentificacion);
12565                        }
12566                        // divContainerInformacionLocalidad.style.border = "1px solid #ddd";
12567                        LOC_CONTAINER.appendChild(divContainerInformacionLocalidad);
12568                    }
12569                });
12570
12571                //viviendas
12572                var containerViviendas = null;
12573                var tableViviendas = null
12574                var theadViviendas = null;
12575                var tbodyViviendas = null;
12576
12577                //poblacion 
12578                var containerPoblacion = null;
12579                var tablePoblacion = null;
12580                var theadPoblacion = null;
12581                var tbodyPoblacion = null;
12582
12583                //urbano
12584                var containerUrbano = null;
12585                var tableUrbano = null;
12586                var theadUrbano = null;
12587                var tbodyUrbano = null;
12588                var isHeader = 0; // variable de control, 0 = es encabezado 0+ son datos (solo para el cuadro en datos urbanos)
12589
12590                // temas mayores al 5
12591                var temaTmp = 0;
12592                var containerUl = null; 
12593                var ulLoc5000 = null;
12594
12595                //arreglo de notas vivienda, poblacion, entorno urbano
12596                var arrNotasVivienda = [];
12597                var arrNotasPoblacion = [];
12598                var arrNotasEntornoUrbano = [];
12599                var spanNotaLoc5000 = "";
12600
12601                data.forEach(function(tema, index){ // recorre el arreglo completo de datos
12602                    
12603                    // console.log(tema);
12604                    /* if(parametros.secc.indexOf("1") > -1){
12605
12606                        if(tema.tema === 1){
12607                        //  seccion infoLocalidad ------------------------------------------------
12608                            if(ulInfo == null){
12609                                ulInfo = UL.cloneNode(true);
12610                                // ulInfo.style.border = "1px solid #cecece";
12611                                ulInfo.style.padding = "0px";
12612                                ulInfo.style.marginBottom = "0px";
12613                                ulInfo.style.listStyleType = "none";   
12614                            }                 
12615                            
12616                            //for(i in infoLocalidad){
12617                                if(cAgrupador == 0){
12618                                    tmpInfoLocalidad = tema;
12619                                    cAgrupador++;
12620                                } else {
12621                                    cAgrupador = 0;
12622                                    var liInfo = LI.cloneNode(true);
12623                                    var span = SPAN.cloneNode(true);
12624                                    span.innerHTML = tema.descripcion+":";                                    
12625                                    // span.style.width = "50%";
12626                                    span.style.padding = "4px 10px";
12627                                    span.style.fontWeight = "600";                    
12628                                    liInfo.appendChild(span);
12629                                    var span = SPAN.cloneNode(true);
12630                                    var a = document.createElement("a");
12631                                    if(tmpInfoLocalidad.descripcion.indexOf("localidad") === -1){
12632                                        a.setAttribute("href","/app/areasgeograficas?ag="+((tmpInfoLocalidad.valor.length == 3)? "0"+tmpInfoLocalidad.valor : tmpInfoLocalidad.valor));
12633                                        a.setAttribute("target","_self");
12634                                        a.style.cursor = "pointer";
12635                                        a.innerHTML = tmpInfoLocalidad.valor + " " + tema.valor;
12636                                        span.appendChild(a);
12637                                    } else {
12638                                        span.innerHTML = tmpInfoLocalidad.valor + " " + tema.valor;
12639                                    }
12640
12641                                    liInfo.appendChild(span); 
12642                                    ulInfo.appendChild(liInfo);                                       
12643                                }
12644                            //}
12645                            divContainerInformacionLocalidad.appendChild(ulInfo)
12646                            // LOC_CONTAINER.appendChild(ulInfo);
12647
12648                        } else if(tema.tema === 5){
12649                        // seccion identificacion (en loc5000)------------------------------------------------
12650                            if(ulIdentificacion == null){
12651                                ulIdentificacion = UL.cloneNode(true);
12652                                // ulIdentificacion.style.border = "1px solid #cecece";
12653                                ulIdentificacion.style.padding = "0px";
12654                                ulIdentificacion.style.listStyleType = "none";
12655                            }
12656                            if(tema.descripcion === "TITULO"){
12657                            //  var liInfo = LI.cloneNode(true);
12658                            //     liInfo.style.backgroundColor = "#ddd";
12659                            //     liInfo.style.paddingLeft = "10px;"
12660                            //     var span = SPAN.cloneNode(true);
12661                            //     span.innerHTML = Loc5000[i].valor;
12662                            //     span.style.fontWeight = "600";
12663                            //     span.style.padding = "4px 10px";
12664                            //     liInfo.appendChild(span);                            
12665                            } else {
12666                                var liInfo = LI.cloneNode(true);
12667                                var span = SPAN.cloneNode(true);
12668                                if(tema.descripcion.indexOf("Latitud") > -1 || tema.descripcion.indexOf("Longitud") > -1 || tema.descripcion.indexOf("Altitud") > -1){
12669                                    tmpLocUbicacionGeografica.push(tema);
12670                                    if(tmpLocUbicacionGeografica.length === 3){ // si no es coordenada grografica el proceso es normal
12671                                        var valor = "Longitud "+tmpLocUbicacionGeografica[0].valor + ", Latitud "+tmpLocUbicacionGeografica[1].valor+", Altitud "+tmpLocUbicacionGeografica[2].valor;
12672                                        span.innerHTML = "Ubicación geográfica:";                                            
12673                                        span.style.padding = "4px 10px";
12674                                        span.style.fontWeight = "600";
12675                                        liInfo.appendChild(span);
12676                                        var span = SPAN.cloneNode(true);                                            
12677                                        span.innerHTML = valor; 
12678                                        liInfo.appendChild(span); 
12679                                        ulIdentificacion.appendChild(liInfo);             
12680                                    }
12681                                } else {
12682
12683                                    span.innerHTML = tema.descripcion+":";
12684                                    // span.style.width = "50%";
12685                                    span.style.padding = "4px 10px";
12686                                    span.style.fontWeight = "600";
12687                                    liInfo.appendChild(span);
12688                                    var span = SPAN.cloneNode(true);
12689                                    if(tema.descripcion.indexOf("Cabecera municipal") > -1){
12690                                        cveLoc = tema.valor.substring(tema.valor.indexOf("(")+1,19); 
12691                                        var a = document.createElement("a");                                                                     
12692                                        a.setAttribute("href","/app/areasgeograficas?ag="+ cveLoc);
12693                                        a.setAttribute("target","_self");
12694                                        a.style.cursor = "pointer";
12695                                        a.innerHTML = tema.valor;
12696                                        span.appendChild(a);
12697                                    } else {
12698                                        span.innerHTML = tema.valor;
12699                                    }
12700                                    liInfo.appendChild(span); 
12701                                    ulIdentificacion.appendChild(liInfo);                                                                        
12702                                }
12703                            
12704                            }
12705                            divContainerInformacionLocalidad.appendChild(ulIdentificacion);
12706                        }
12707                        divContainerInformacionLocalidad.style.border = "1px solid #ddd";
12708                        LOC_CONTAINER.appendChild(divContainerInformacionLocalidad);
12709                    } */
12710                                        
12711                    if(parametros.secc.indexOf("2") > -1){
12712                        var contViviendaCoL = 0;
12713                        // seccion vivienda ------------------------------------------------
12714                        if(tema.tema === 3){
12715                            // console.log(tema);
12716                            if(containerViviendas === null){
12717                                containerViviendas = DIV.cloneNode(true);
12718                                tableViviendas = TABLE.cloneNode(true); 
12719                                tableViviendas.id = "tableViviendas";
12720                                tableViviendas.style.display = "none";
12721                                tableViviendas.style.marginTop = "10px";
12722                                theadViviendas = document.createElement("thead");
12723                                tbodyViviendas = document.createElement("tbody");
12724
12725                                var divTituloViviendas = DIV.cloneNode(true);                                
12726                                divTituloViviendas.innerHTML = '<i id="iViviendas" style="font-size:10px;color:#bb0026;vertical-align:middle;padding-right:6px"><span class="inegi-nav-desp enest_t"></span></i>Características de las viviendas';
12727                                // divTituloViviendas.style.backgroundColor = "#f9f7f7";
12728                                // divTituloViviendas.style.fontWeight = "bold";
12729                                divTituloViviendas.style.padding = "0 0 0 10px";
12730                                // divTituloViviendas.style.marginBottom = "10px";
12731                                divTituloViviendas.style.cursor = "pointer";
12732                                // divTituloViviendas.className = "clsHover";
12733                                divTituloViviendas.onclick = function (e) {
12734                                    // var t = $(this).find("i")[0].id.split("iLoc_")[1];
12735                                    $("#tableViviendas").toggle();
12736                                    $(".spanVivienda").toggle();
12737                                    if ($("#iViviendas").html() == '<span class="inegi-nav-desp enest_t"></span>') {
12738                                        $("#iViviendas").html('<span class="inegi-nav-despa enest_t"></span>')
12739                                    } else {
12740                                        $("#iViviendas").html('<span class="inegi-nav-desp enest_t"></span>');
12741                                    }
12742                                }
12743                                containerViviendas.appendChild(divTituloViviendas);
12744                            }
12745
12746                            if(tema.valor === "Total"){
12747                                var tr = TR.cloneNode(true);
12748                                var th = TH.cloneNode(true);                                
12749                                th.innerHTML = "Viviendas";
12750                                th.className = "Th"
12751                                tr.appendChild(th);
12752                                var th = TH.cloneNode(true);
12753                                th.className = "Th"
12754                                th.innerHTML = tema.valor;
12755                                tr.appendChild(th);
12756                                theadViviendas.appendChild(tr);
12757                                
12758                            } else if(tema.descripcion === "NOTA") {                            
12759                                var spanNota = DIV.cloneNode(true);
12760                                spanNota.innerHTML = tema.valor;
12761                                spanNota.style.fontSize = "11px";  
12762                                // spanNota.id = "spanVivienda";                                              
12763                                spanNota.className = "spanVivienda";                                              
12764                                spanNota.style.display = "none"; 
12765                                spanNota.style.margin = "0 25px"; 
12766
12767                            } else {
12768                                var tr = TR.cloneNode(true);
12769                                var td = TD.cloneNode(true);
12770                                td.innerHTML = tema.descripcion; 
12771                                td.style.width = "auto";                       
12772                                tr.appendChild(td);
12773                                var td = TD.cloneNode(true);                        
12774                                td.innerHTML = tema.valor;
12775                                td.className = "TdV"                                
12776                                tr.appendChild(td);                                    
12777                                tbodyViviendas.appendChild(tr)
12778                            }
12779                            tableViviendas.appendChild(theadViviendas);
12780                            tableViviendas.appendChild(tbodyViviendas);
12781                            
12782                            containerViviendas.appendChild(tableViviendas);
12783                            if(spanNota) {
12784                                // containerViviendas.appendChild(spanNota);
12785                                arrNotasVivienda.push(spanNota)                                
12786                                // tableViviendas.after(spanNota);                                
12787                            }
12788                            LOC_CONTAINER.appendChild(containerViviendas);
12789                        }
12790                    }
12791
12792                    if(parametros.secc.indexOf("3") > -1){
12793                        // seccion poblacion ------------------------------------------------
12794                        if(tema.tema === 4){
12795                            if(con
12795tainerPoblacion === null){
12796                                containerPoblacion = DIV.cloneNode(true);
12797                                tablePoblacion = TABLE.cloneNode(true);
12798                                theadPoblacion = document.createElement("thead");
12799                                tbodyPoblacion = document.createElement("tbody");
12800                                tablePoblacion.id = "tablePoblacion";
12801                                tablePoblacion.style.display = "none";
12802                                tablePoblacion.style.marginTop = "10px";
12803
12804                                var divTituloPoblacion = DIV.cloneNode(true);
12805                                divTituloPoblacion.innerHTML = '<i id="iPoblacion" style="font-size:10px;color:#bb0026;vertical-align:middle;padding-right:6px"><span class="inegi-nav-desp enest_t"></span></i>Características de la población';
12806                                // divTituloPoblacion.style.backgroundColor = "#f9f7f7";
12807                                // divTituloPoblacion.style.fontWeight = "bold";
12808                                divTituloPoblacion.style.padding = "0 0 0 10px";
12809                                // divTituloPoblacion.style.marginBottom = "10px";
12810                                divTituloPoblacion.style.cursor = "pointer";
12811                                // divTituloPoblacion.className = "clsHover";
12812                                // divTituloPoblacion.style.fontSize = "14px";
12813                                divTituloPoblacion.onclick = function (e) {
12814                                    // var t = $(this).find("i")[0].id.split("iLoc_")[1];
12815                                    $("#tablePoblacion").toggle();
12816                                    $(".spanPoblacion").toggle();                    
12817                                    if ($("#iPoblacion").html() == '<span class="inegi-nav-desp enest_t"></span>') {
12818                                        $("#iPoblacion").html('<span class="enest_t inegi-nav-despa"></span>')
12819                                    } else {
12820                                        $("#iPoblacion").html('<span class="inegi-nav-desp enest_t"></span>');
12821                                    }
12822                                }
12823                                containerPoblacion.appendChild(divTituloPoblacion);
12824                            }
12825
12826                            if(tema.valor === "Total"){
12827                                var tr = TR.cloneNode(true);
12828                                var th = TH.cloneNode(true);
12829                                th.innerHTML = "Población";
12830                                // th.innerHTML = tema.descripcion;
12831                                th.className = "Th"
12832                                tr.appendChild(th);
12833                                var th = TH.cloneNode(true);
12834                                th.className = "Th"
12835                                th.innerHTML = tema.valor;
12836                                tr.appendChild(th);
12837                                theadPoblacion.append(tr);
12838                                
12839                            } else if(tema.descripcion === "NOTA") {
12840                                var spanNotaP = DIV.cloneNode(true);
12841                                spanNotaP.innerHTML = tema.valor;
12842                                spanNotaP.style.fontSize = "11px";                        
12843                                spanNotaP.className = "spanPoblacion";  
12844                                spanNotaP.style.display = "none"; 
12845                                spanNotaP.style.margin = "0 25px";                      
12846                            } else {
12847                                var tr = TR.cloneNode(true);
12848                                var td = TD.cloneNode(true);
12849                                td.innerHTML = tema.descripcion;                        
12850                                tr.appendChild(td);
12851                                var td = TD.cloneNode(true);                        
12852                                td.innerHTML = tema.valor;
12853                                td.className = "TdV";
12854                                tr.appendChild(td);
12855                                tbodyPoblacion.appendChild(tr)
12856                            }
12857                            tablePoblacion.appendChild(theadPoblacion);
12858                            tablePoblacion.appendChild(tbodyPoblacion);
12859
12860                            containerPoblacion.appendChild(tablePoblacion);
12861                            if(spanNotaP){
12862                                // containerPoblacion.appendChild(spanNotaP);
12863                                arrNotasPoblacion.push(spanNotaP);
12864                            } 
12865                                
12866                            LOC_CONTAINER.appendChild(containerPoblacion);
12867                        }
12868                    }
12869
12870                    if (parametros.secc.indexOf("4") > -1) {
12871                        // seccion entorno urbano ------------------------------------------------
12872                        if(tema.tema === 2){
12873
12874                            if(containerUrbano === null){
12875                                containerUrbano = DIV.cloneNode(true);
12876                                tableUrbano = TABLE.cloneNode(true);
12877                                theadUrbano = document.createElement("thead");
12878                                tbodyUrbano = document.createElement("tbody");
12879                                tableUrbano.id = "tableUrbano";
12880                                tableUrbano.style.display = "none";
12881                                tableUrbano.style.marginTop = "10px";
12882                                
12883
12884                                var divTituloUrbano = DIV.cloneNode(true);
12885                                // divTituloUrbano.innerHTML = 'Entorno Urbano <i id="iUrbano" class="pull-right" style="font-size:20px;vertical-align:middle;padding-right:10px"><span class="glyphicon glyphicon-chevron-up flecha"></span></i>';;
12886                                divTituloUrbano.innerHTML = '<i id="iUrbano" style="font-size:10px;color:#bb0026;vertical-align:middle;padding-right:6px"><span class="inegi-nav-desp enest_t"></span></i>Entorno Urbano';
12887                                // divTituloUrbano.style.backgroundColor = "#f9f7f7";
12888                                // divTituloUrbano.style.fontWeight = "bold";
12889                                divTituloUrbano.style.padding = "0 0 0 10px";
12890                                // divTituloUrbano.style.marginBottom = "10px";
12891                                divTituloUrbano.style.cursor = "pointer";
12892                                // divTituloUrbano.className = "clsHover";
12893                                
12894                                divTituloUrbano.onclick = function (e) {
12895                                    // var t = $(this).find("i")[0].id.split("iLoc_")[1];
12896                                    $("#tableUrbano").toggle();
12897                                    $(".spanUrbano").toggle();                    
12898                                    if ($("#iUrbano").html() == '<span class="inegi-nav-desp enest_t"></span>') {
12899                                        $("#iUrbano").html('<span class="enest_t inegi-nav-despa"></span>')
12900                                    } else {
12901                                        $("#iUrbano").html('<span class="inegi-nav-desp enest_t"></span>');
12902                                    }
12903                                }
12904                                containerUrbano.appendChild(divTituloUrbano);
12905                            }
12906
12907                            if(isHeader == 0){                                    
12908                                var tr = TR.cloneNode(true);
12909                                var th = TH.cloneNode(true);
12910                                th.innerHTML = tema.descripcion;
12911                                th.className = "Th"
12912                                tr.appendChild(th);
12913                                for(var c = 0; c < tema.valor.length; c++){
12914
12915                                    var th = TH.cloneNode(true);
12916                                    th.className = "Th"
12917                                    th.innerHTML = tema.valor[c];
12918                                    tr.appendChild(th);
12919                                }
12920                                theadUrbano.append(tr);  
12921                                isHeader++;                                  
12922                                
12923                            } else if(tema.descripcion === "NOTA") {
12924                                var spanNotaU = DIV.cloneNode(true);
12925                                spanNotaU.innerHTML =  tema.valor;
12926                                spanNotaU.style.fontSize = "11px";                        
12927                                spanNotaU.className = "spanUrbano";                        
12928                                spanNotaU.style.display = "none";  
12929                                spanNotaU.style.margin = "0 25px";                       
12930                            } else {
12931                                var tr = TR.cloneNode(true);
12932                                var td = TD.cloneNode(true);
12933                                td.innerHTML = tema.descripcion;                                                                            
12934                                tr.appendChild(td);
12935                                for(var c = 0; c < tema.valor.length; c++){
12936                                    var td = TD.cloneNode(true);                        
12937                                    td.innerHTML = tema.valor[c];
12938                                    td.className = "TdV";
12939                                    tr.appendChild(td);
12940                                }
12941                                tbodyUrbano.appendChild(tr)
12942                            }
12943                            tableUrbano.appendChild(theadUrbano);
12944                            tableUrbano.appendChild(tbodyUrbano);
12945
12946                            containerUrbano.appendChild(tableUrbano);
12947                            if(spanNotaU){
12948                                // containerUrbano.appendChild(spanNotaU);
12949                                arrNotasEntornoUrbano.push(spanNotaU);
12950                            }
12951                            LOC_CONTAINER.appendChild(containerUrbano);
12952                        }
12953                    }
12954
12955                    if(parametros.secc.indexOf("5") > -1){
12956                        // seccion Loc5000 ------------------------------------------------
12957                        if(tema.tema > 5){
12958                            if(temaTmp !== tema.tema){                                
12959                                // if(tema.descripcion !== "NOTA"){
12960                                    // console.log(tema);
12961                                    temaTmp = tema.tema;                                                                
12962                                    // crear lista para nuevo tema
12963                                    // if(containerUl == null){
12964                                    containerUl = DIV.cloneNode(true);                                        
12965                                    ulLoc5000 = UL.cloneNode(true);
12966                                    // ulLoc5000.style.border = "1px solid #cecece";
12967                                    ulLoc5000.style.padding = "0px";
12968                                    ulLoc5000.style.width = "67%"; // para las listas fichas un width acncho fijo
12969                                    ulLoc5000.style.margin = "10px 0 0 25px";
12970                                    // ulLoc5000.style.margin = "0 auto"; 
12971                                    ulLoc5000.style.listStyleType = "none";
12972                                    ulLoc5000.id = "listTema"+ tema.tema;
12973                                    ulLoc5000.style.display = "none";
12974                                    // area titulo 
12975                                    var divTituloUl = DIV.cloneNode(true);
12976                                    divTituloUl.innerHTML = '<i id="iLoc_' + tema.tema +'" style="font-size:10px;color:#bb0026;vertical-align:middle;padding-right:6px"><span class="inegi-nav-desp enest_t"></span></i>' + tema.desc_tema;                                
12977                                    // divTituloUl.style.backgroundColor = "#f9f9f9";
12978                                    // divTituloUl.style.fontWeight = "bold";
12979                                    divTituloUl.style.padding = "0 0 0 10px";
12980                                    // divTituloUl.style.marginBottom = "10px";
12981                                    divTituloUl.style.cursor = "pointer";
12982                                    // divTituloUl.className = "clsHover";
12983                                    divTituloUl.onclick = function (e) {
12984                                        var t = $(this).find("i")[0].id.split("iLoc_")[1];
12985                                        $("#listTema" + t).toggle();
12986                                        if ($("#iLoc_" + t).html() == '<span class="inegi-nav-desp enest_t"></span>') {
12987                                            $("#iLoc_" + t).html('<span class="inegi-nav-despa enest_t"></span>')
12988                                        } else {
12989                                            $("#iLoc_" + t).html('<span class="inegi-nav-desp enest_t"></span>');
12990                                        }
12991                                    }
12992                                    containerUl.appendChild(divTituloUl);
12993
12994                                /* } else {
12995                                    console.log(tema);
12996                                    spanNotaLoc5000 = DIV.cloneNode(true);
12997                                    spanNotaLoc5000.innerHTML = "* "+tema.valor;
12998                                } */
12999                            }
13000                            if(tema.descripcion === "TITULO"){
13001                                var liInfo = LI.cloneNode(true);
13002                                liInfo.style.backgroundColor = "#f9f9f9";
13003                                liInfo.style.borderBottom = "1px solid #eae9e9";
13004                                liInfo.style.paddingLeft = "10px;"
13005                                var span = SPAN.cloneNode(true);
13006                                span.style.fontWeight = "bold";
13007                                span.innerHTML = tema.valor;
13008                                span.style.padding = "0px 10px";
13009                                liInfo.appendChild(span);       
13010                                
13011                                ulLoc5000.appendChild(liInfo); 
13012                                containerUl.appendChild(ulLoc5000);
13013                                LOC_CONTAINER.appendChild(containerUl);
13014
13015                            } else if(tema.descripcion === "NOTA"){                                
13016                                    spanNotaLoc5000 = DIV.cloneNode(true);
13017                                    spanNotaLoc5000.innerHTML = "* "+tema.valor;
13018
13019                                    spanNotaLoc5000.style.fontSize = "11px";                                                                                                
13020                                    // spanNotaLoc5000.style.margin = "0 25px";
13021                                    $(ulLoc5000).append(spanNotaLoc5000)
13022
13023                            } else {
13024                                var liInfo = LI.cloneNode(true);
13025                                var span = SPAN.cloneNode(true);
13026                                span.innerHTML = "&emsp;&emsp;"+ tema.descripcion+":";
13027                                span.style.fontWeight = "bold";
13028                                span.style.padding = "0px 10px";
13029                                liInfo.appendChild(span);
13030                                var span = SPAN.cloneNode(true);
13031                                span.innerHTML = tema.valor;
13032                                liInfo.appendChild(span); 
13033                                
13034                                ulLoc5000.appendChild(liInfo); 
13035                                containerUl.appendChild(ulLoc5000);
13036                                LOC_CONTAINER.appendChild(containerUl);
13037                            }
13038                            
13039                            /* if(spanNotaLoc5000){
13040                                console.log(spanNotaLoc5000);
13041                                ulLoc5000.appendChild(spanNotaLoc5000);
13042                                spanNotaLoc5000 = null;
13043                            } */
13044                        }
13045                    }
13046                    //nota al pie del contenido 
13047                });
13047 // termina el forEach
13048
13049                //inserta notas correspondientes a entorno urbano
13050                if(arrNotasEntornoUrbano.length > 0){
13051                    for(var n = 0; n < arrNotasEntornoUrbano.length; n++){                        
13052                        tableUrbano.after(arrNotasEntornoUrbano[n]);
13053                    }
13054                }
13055                //inserta notas correspondientes a viviendas
13056                if(arrNotasVivienda.length > 0){
13057                    for(var n = 0; n < arrNotasVivienda.length; n++){
13058                        tableViviendas.after(arrNotasVivienda[n]);
13059                    }
13060                }
13061                //inserta notas correspondientes a población
13062                if(arrNotasPoblacion.length > 0){
13063                    for(var n = 0; n < arrNotasPoblacion.length; n++){
13064                        tablePoblacion.after(arrNotasPoblacion[n]);
13065                    }
13066                }
13067                
13068               /*  if(notaFinal === true){
13069                    var spanNotaPie = SPAN.cloneNode(true);
13070                    spanNotaPie.innerHTML = "* Sin dato debido a que se levantó cuestionario parcial.";
13071                    spanNotaPie.style.fontSize = "8pt";                
13072                    spanNotaPie.style.textAlign = "justify";                
13073                    spanNotaPie.style.marginTop = "20px";
13074                    LOC_CONTAINER.appendChild(spanNotaPie);
13075                } */
13076            }
13077
13078            document.getElementById("divDatos" + parametros.contenedorCuadro).appendChild(LOC_CONTAINER);
13079            $("#tableStat" + parametros.contenedorCuadro).hide();
13080            $("#TableEspacio" + parametros.contenedorCuadro).hide();
13081            $("#divCargaCuadro" + parametros.contenedorCuadro).hide();
13082            $(".clsHover").hover(function(){
13083                $(this).css("background-color", "#ececec");
13084                }, function(){
13085                $(this).css("background-color", "#f9f7f7");
13086            });
13087        }
13088        /**
13089         *  DATOS DE PRECISION DEPRECATED 
13090         *  Cuadro #errorbar (agregado: 22-05-2019) DEPRECATED DATE: 14-02-2023
13091         * @param datos, parametros
13092         */
13093        aPrecitionRules = [];
13094        function DibujaCuadroTipoPrecision_Deprecated(datos, parametros){
13095            // console.log(datos);
13096            aPrecitionRules = datos.precitionRules;
13097            var notasReglasPrecision = datos.precitionRules && datos.precitionRules.notas !== undefined && datos.precitionRules.notas.length > 0? datos.precitionRules.notas : [];
13098            
13099            var aIndicadores = datos.dimension.indicator.category.label;
13100            var aEntidades = datos.dimension.municipality.category.label;
13101            var aPeriodos = datos.dimension.periods.category.label;
13102            var aValores = datos.value;                
13103            var aRangoError = datos.precition;
13104            //Agregado 09-07-2021
13105            // Ordenamiento de datos para las columnas del cuadro de #precision
13106            // pasa de: [limite inferior, limite superior, coeficiente de variacion, error estandar, intervalo de confianza]
13107            // a esto: [coeficiente de variacion, error estandar, limite inferior, limite superior, intervalo de confianza]
13108            var aRangoErrorTotal = aRangoError.length;
13109            for(var x = 0; x < aRangoErrorTotal; x++){
13110                aRangoError[x].splice(0,0, aRangoError[x][3])
13111                aRangoError[x].splice(0,0, aRangoError[x][3])
13112                
13113                aRangoError[x].splice(4,1)
13114                aRangoError[x].splice(4,1)
13115            }
13116            /* [[39,30,0.45,82919,90],
13117            [48,40,0.39,132919,40],
13118            [40,35,0.29,162919,20],
13119            [41.5,26,0.19,112939,100],
13120            [39.5,27.5,0.79,162919,80],
13121            [43,47,0.50,102919,60],
13122            [40,28,0.35,92919,90],
13123            [42,19,0.10,4919,80],
13124            [46,30,0.80,2919,40],
13125            [45,31,0.30,62919,30],
13126            [48,29,0.20,82919,10],
13127            [47,31,0.50,32919,50],
13128            [50,44,0.60,82919,50],
13129            [51,23,0.25,18919,40],
13130            [47,34,0.85,18219,90]]; */
13131            //Estructura de la tabla base                
13132            var TABLE = document.createElement("table");
13133            TABLE.className = 'table table-bordered table-responsive table-striped';
13134            TABLE.id = "tableStatcontGrafica"+ parametros.contenedorCuadro;
13135            var tHead = (!BROWSER.ie()) ? TABLE.createTHead() : document.createElement("thead");
13136            var tBody = (!BROWSER.ie()) ? TABLE.createTBody() : document.createElement("tbody");
13137            var tRowHead = (!BROWSER.ie()) ? tHead.insertRow() : document.createElement("tr");
13138            var tRowBody = (!BROWSER.ie()) ? tBody.insertRow() : document.createElement("tr");
13139            // console.log(datos);
13140            if(datos.dimension.municipality.category.label.length > 1){ // todas las entidades
13141                console.log("POR ENTIDADDES")
13142            } else { // varios periodos
13143                
13144                //--- ENCABEZADO
13145                /* var titulosEncabezado = (parametros.titulosColumnas != "")? parametros.titulosColumnas.split(",") : ["Periodo","Estimación","Límite inferior", "Límite superior", "Coeficie
13145nte de variación (%)","Error estándar"];
13146                if(parametros.idioma === "en"){
13147                    titulosEncabezado = ["Period","Estimate","Lower limit", "Upper limit", "Coefficient of variation (%)","Standar error"];
13148                } */
13149                var titulosEncabezado = (parametros.titulosColumnas != "")? parametros.titulosColumnas.split(",") : ["Periodo","Estimación","Coeficiente de variación (%)","Error estándar","Límite inferior", "Límite superior"/* ,"Intervalo de confianza" */];
13150                if(parametros.idioma === "en"){
13151                    titulosEncabezado = ["Period","Estimate", "Coefficient of variation (%)","Standard error","Lower limit", "Upper limit"/* ,"Confidence interval" */];
13152                }
13153                var columnasTotales = titulosEncabezado.length;
13154                var renglonesTotales = aValores.length;
13155                
13156                var tdCol = document.createElement("th");
13157                for (var c = 0; c < titulosEncabezado.length; c++) {
13158                    var col = tdCol.cloneNode(true);
13159                    // Agregado: 07-07-2021
13160                    // Agrega llamados letras de los llamados a las notas de datos de precisión
13161                    var notasCols = notasReglasPrecision.filter(function(nota, index){
13162                        return nota.columnas.indexOf(c) > -1;
13163                    })[0]
13164                    var supLetraNota = "";
13165                    if(notasCols !== undefined){
13166                        supLetraNota = ' <sup style="color:#000">'+notasCols.letra+'</sup>'
13167                    }
13168                    col.innerHTML = titulosEncabezado[c] + supLetraNota;
13169                    col.width = ((c == 0 || c == 1) ? 150 : ((c == 1)? 90 : 25 ));
13170                    col.align = "center";
13171                    col.className = "Th";
13172                    tRowHead.appendChild(col);
13173                }    
13174                // --- FILA DE DATOS
13175                var frecuencia = datos.dimension.freq.category.label[0].Value;
13176                var celda = document.createElement("td"); // celda de dato
13177                var renglon = document.createElement("tr"); // renglon
13178                for (var r = 0; r < aPeriodos.length; r++){
13179                    var celdaValor = celda.cloneNode(true);
13180                    var formatoPeriodo = oMESES.getFormatoPeriodo(aPeriodos[r].Value, frecuencia, parametros.idioma, 1);
13181                    celdaValor.innerHTML = formatoPeriodo;
13182                    celdaValor.className = "TdInicioV";
13183                    var f = renglon.cloneNode(true);
13184                    f.appendChild(celdaValor);
13185                    
13186                    var celdaValor2 = celda.cloneNode(true);                       
13187                    var rr = r;                         
13188                    celdaValor2.innerHTML = aValores[rr];   
13189                    
13190                    // revisamos reglas para coeficiente de variacion y si existe aplicamos el color correspondienten
13191                    var sCvColor = "";                            
13192                    if(typeof aRangoError[r][0] != "undefined"){
13193                        if(parametros.idTema != "null" && aPrecitionRules != undefined){ // solo si la columna es Coeficiente de Variación
13194                            oColorAria = setColorCieficienteVariacion(aRangoError[r][0]);
13195                            if(sCvColor !== null && oColorAria.aria !== ""){ // si regreso color valido entonces aplica el color de lo contrario deja el color por default de los cuadros.
13196                                var divTooltip = document.createElement("div");
13197                                divTooltip.innerHTML = celdaValor2.innerHTML
13198                                celdaValor2.innerHTML = "";
13199                                
13200                                celdaValor2.style.backgroundColor = oColorAria.color;
13201                                celdaValor2.setAttribute("aria-label", oColorAria.aria)
13202                                divTooltip.setAttribute("data-placement","top")
13203                                divTooltip.setAttribute("data-original-title",oColorAria.aria)
13204                                divTooltip.setAttribute("data-toggle","tooltipprecision")
13205                                divTooltip.style.cursor = "help"
13206                                celdaValor2.appendChild(divTooltip)
13207                            }
13208                        }
13209                    }
13210                    
13211                    
13212                    celdaValor2.className = "TdV";  
13213                    f.appendChild(celdaValor2);                        
13214                    for(var c = 0; c < columnasTotales; c++){
13215                        if(c < 4){
13216                            if(typeof aRangoError[r][c] != "undefined"){
13217                                var celdaValor3 = celda.cloneNode(true);    
13218                                celdaValor3.innerHTML = aRangoError[r][c] == null? "-" : formatoNumeroMiles(aRangoError[r][c]);                               
13219                                celdaValor3.className = "TdV";
13220                                f.appendChild(celdaValor3);  
13221                            }         
13222                        }                   
13223                    }
13224                    tBody.appendChild(f);
13225                }                  
13226            }
13227            
13228            if (BROWSER.ie) {
13229                tHead.appendChild(tRowHead);
13230                tBody.appendChild(tRowBody);
13231                TABLE.appendChild(tHead);
13232                TABLE.appendChild(tBody);
13233            }
13234            $(function () {
13235                $("#divDatos" + parametros.contenedorCuadro).tooltip({ selector: '[data-toggle=tooltipprecision]' });
13236            })
13237            //render table
13238            document.getElementById("divDatos" + parametros.contenedorCuadro).appendChild(TABLE);
13239            $("#tableStat" + parametros.contenedorCuadro).hide();
13240            $("#TableEspacio" + parametros.contenedorCuadro).hide();    
13241        }
13242        /**
13243         *  DATOS DE PRECISION ACTUALIZADO 
13244         *  Cuadro #errorbar (agregado: 22-05-2019) modificado: 14-02-2023
13245         * @param datos, parametros
13246         */        
13247        function DibujaCuadroTipoPrecision(datos, parametros){
13248            console.log("debug");
13249            var datosPrecision = oCriteriosPrecision.check(datos);       
13250            // var aIndicadores = datos.dimension.indicator.category.label;
13251            // var aEntidades = datos.dimension.municipality.category.label;
13252            var aPeriodos = datos.dimension.periods.category.label;
13253            var aValores = datos.value;                
13254            var aRangoError = datos.precition;
13255            //Agregado 09-07-2021
13256            // Ordenamiento de datos para las columnas del cuadro de #precision
13257            // pasa de: [limite inferior, limite superior, coeficiente de variacion, error estandar, intervalo de confianza]
13258            // a esto: [coeficiente de variacion, error estandar, limite inferior, limite superior, intervalo de confianza]
13259            var aRangoErrorTotal = aRangoError.length;
13260            for(var x = 0; x < aRangoErrorTotal; x++){
13261                aRangoError[x].splice(0,0, aRangoError[x][3])
13262                aRangoError[x].splice(0,0, aRangoError[x][3])
13263                
13264                aRangoError[x].splice(4,1)
13265                aRangoError[x].splice(4,1)
13266            }
13267            /* [[39,30,0.45,82919,90],
13268            [48,40,0.39,132919,40],
13269            [40,35,0.29,162919,20],
13270            [41.5,26,0.19,112939,100],
13271            [39.5,27.5,0.79,162919,80],
13272            [43,47,0.50,102919,60],
13273            [40,28,0.35,92919,90],
13274            [42,19,0.10,4919,80],
13275            [46,30,0.80,2919,40],
13276            [45,31,0.30,62919,30],
13277            [48,29,0.20,82919,10],
13278            [47,31,0.50,32919,50],
13279            [50,44,0.60,82919,50],
13280            [51,23,0.25,18919,40],
13281            [47,34,0.85,18219,90]]; */
13282            //Estructura de la tabla base                
13283            var TABLE = document.createElement("table");
13284            TABLE.className = 'table table-bordered table-responsive table-striped';
13285            TABLE.id = "tableStatcontGrafica"+ parametros.contenedorCuadro;
13286            var tHead = (!BROWSER.ie()) ? TABLE.createTHead() : document.createElement("thead");
13287            var tBody = (!BROWSER.ie()) ? TABLE.createTBody() : document.createElement("tbody");
13288            var tRowHead = (!BROWSER.ie()) ? tHead.insertRow() : document.createElement("tr");
13289            var tRowBody = (!BROWSER.ie()) ? tBody.insertRow() : document.createElement("tr");
13290            // console.log(datos);
13291            if(datos.dimension.municipality !== null && datos.dimension.municipality.category.label.length > 1){ // todas las entidades
13292                console.log("POR ENTIDADDES")
13293            } else { // varios periodos
13294                
13295                //--- ENCABEZADO
13296
13297                var titulosEncabezado = (parametros.titulosColumnas != "")? parametros.titulosColumnas.split(",") : ["Periodo","Estimación","Coeficiente de variación (%)","Error estándar","Límite inferior", "Límite superior"/* ,"Intervalo de confianza" */];
13298                if(parametros.idioma === "en"){
13299                    titulosEncabezado = ["Period","Estimate", "Coefficient of variation (%)","Standard error","Lower limit", "Upper limit"/* ,"Confidence interval" */];
13300                }
13301                var columnasTotales = titulosEncabezado.length;
13302                // var renglonesTotales = aValores.length;
13303                
13304                var tdCol = document.createElement("th");
13305                for (var c = 0; c < titulosEncabezado.length; c++) {
13306                    var col = tdCol.cloneNode(true);
13307                    // Modificado: 05-07-2023
13308                    // var supLetraPrecision = "";
13309                    // Agrega llamados letras como referencia de las notas a pie de cuadro                    
13310                    // if(datosPrecision !== null){
13311                    //     supLetraPrecision = ' <sup style="color:#000">'+ (c === 1? "a/" : ((c === 4 || c === 5)? "b/" : "")) +'</sup>'
13312                    // }
13313                    // col.innerHTML = titulosEncabezado[c] + supLetraPrecision;
13314                    col.innerHTML = titulosEncabezado[c];
13315                    col.width = ((c == 0 || c == 1) ? 150 : ((c == 1)? 90 : 25 ));
13316                    col.align = "center";
13317                    col.className = "Th";
13318                    tRowHead.appendChild(col);
13319                }    
13320                // --- FILA DE DATOS
13321                var frecuencia = datos.dimension.freq.category.label[0].Value;
13322                var celda = document.createElement("td"); // celda de dato
13323                var renglon = document.createElement("tr"); // renglon
13324                for (var r = 0; r < aPeriodos.length; r++){
13325                    var celdaValor = celda.cloneNode(true);
13326                    var formatoPeriodo = oMESES.getFormatoPeriodo(aPeriodos[r].Value, frecuencia, parametros.idioma, 1);
13327                    celdaValor.innerHTML = formatoPeriodo;
13328                    celdaValor.className = "TdInicioV";
13329                    var f = renglon.cloneNode(true);
13330                    f.appendChild(celdaValor);
13331                    
13332                    var celdaValor2 = celda.cloneNode(true);                       
13333                    var rr = r;                         
13334                    celdaValor2.innerHTML = aValores[rr];   
13335                    
13336                    // revisamos reglas para coeficiente de variacion y si existe aplicamos el color correspondienten
13337                    var oColorTooltipPrecision = "";                                                
13338                    if(typeof aRangoError[r][0] != "undefined"){
13339                        if(datosPrecision !== null){ // solo si la columna es Coeficiente de Variación    
13340                            // console.log(aRangoError[r][0]);                        
13341                            // aRangoError[2][0] = "24.50"
13342                            // aRangoError[6][0] = "60.50"
13343                            oColorTooltipPrecision = oCriteriosPrecision.getColorTooltip(aRangoError[r][0], datosPrecision, parametros);
13344                            
13345                            if(oColorTooltipPrecision !== "transparent"){ // si regreso color valido entonces aplica el color de lo contrario deja el color por default de los cuadros.
13346                                var divTooltip = document.createElement("div");
13347                                divTooltip.innerHTML = celdaValor2.innerHTML
13348                                celdaValor2.innerHTML = "";
13349                                
13350                                celdaValor2.style.backgroundColor = oColorTooltipPrecision.color;
13351                                celdaValor2.setAttribute("aria-label", "")
13352                                divTooltip.setAttribute("data-placement","top")
13353                                divTooltip.setAttribute("data-original-title",oColorTooltipPrecision.tooltip)
13354                                divTooltip.setAttribute("data-toggle","tooltipprecision")
13355                                divTooltip.style.cursor = "help"
13356                                celdaValor2.appendChild(divTooltip)
13357                            }
13358                        }
13359                    }
13360                    
13361                    celdaValor2.className = "TdV";  
13362                    f.appendChild(celdaValor2);                        
13363                    for(var c = 0; c < columnasTotales; c++){
13364                        if(c < 4){
13365                            if(typeof aRangoError[r][c] != "undefined"){
13366                                var celdaValor3 = celda.cloneNode(true);    
13367                                celdaValor3.innerHTML = aRangoError[r][c] == null? "-" : formatoNumeroMiles(aRangoError[r][c]);                               
13368                                celdaValor3.className = "TdV";
13369                                f.appendChild(celdaValor3);  
13370                            }         
13371                        }                   
13372                    }
13373                    tBody.appendChild(f);
13374                }                  
13375            }
13376            
13377            if (BROWSER.ie) {
13378                tHead.appendChild(tRowHead);
13379                tBody.appendChild(tRowBody);
13380                TABLE.appendChild(tHead);
13381                TABLE.appendChild(tBody);
13382            }
13383            $(function () {
13384                $("#divDatos" + parametros.contenedorCuadro).tooltip({ selector: '[data-toggle=tooltipprecision]' });
13385            })
13386            //render table
13387            document.getElementById("divDatos" + parametros.contenedorCuadro).appendChild(TABLE);
13388            $("#tableStat" + parametros.contenedorCuadro).hide();
13389            $("#TableEspacio" + parametros.contenedorCuadro).hide();    
13390        }
13391        /**
13392         * Metodo que selecciona el color correspondiente a la condicion segun el valor de coeficiente de variacion.
13393         * Lo utiliza el metodo: DibujaCuadroTipoPrecision (cuadrto tipo: precision) DEPRECATED DATE: 14-02-2023
13394         * @param {*} valor 
13395         * @returns hexadecimal string color (#ffffff)
13396         */
13397        function setColorCieficienteVariacion_Deprecated(valor){
13398            var oColorAria = {};
13399            var vm = aPrecitionRules.condiciones
13400            if( valor >= vm[0].valor_menor && valor < vm[0].valor_mayor){
13401                oColorAria = {color:vm[0].color, aria:vm[0].ariaLabel};
13402                
13403            } else if( valor >= vm[1].valor_menor && valor < vm[1].valor_mayor){
13404                oColorAria = {color:vm[1].color, aria:vm[1].ariaLabel};
13405                
13406            } else if( valor >= vm[2].valor_mayor){
13407                oColorAria = {color:vm[2].color, aria:vm[2].ariaLabel};
13408            } else {
13409                oColorAria = null;
13410            }
13411
13412            return oColorAria;
13413        }
13414        /**
13415         *  ERROR BAR (PRECISION V2)
13416         *  Cuadro #precision2 / #precision3 (agregado: 30-04-2020)
13417         * @param datos, parametros
13418         */
13419        function DibujaCuadroTipoPrecisionV2(datos, parametros) {
13420            // console.log(datos);
13421            var indicadoresNombresFijos = parametros.nombresCategoriasFijas !== ""? parametros.nombresCategoriasFijas.split("|") : "";
13422            var aIndicadores = datos.dimension.indicator.category.label;
13423            var aEntidades = datos.dimension.municipality.category.label;
13424            var aPeriodos = datos.dimension.periods.category.label;
13425            var aValores = datos.value;
13426             var aPrecision = datos.precition;
13427             var nDatos = [];
13428
13429             var periodo = aPeriodos[0].Value;
13430             var frecuencia = datos.dimension.freq.category.label.Value;
13431             var estimacionMesAnio = oMESES.getMesNombre(periodo.split("/")[1], parametros.idioma) + " " + periodo.split("/")[0];
13432          
13433            //Estructura de la tabla base                
13434            var TABLE = document.createElement("table");
13435            TABLE.className = 'table table-bordered table-responsive table-striped';
13436            TABLE.id = "tableStatcontGrafica" + parametros.contenedorCuadro;
13437            var tHead = (!BROWSER.ie()) ? TABLE.createTHead() : document.createElement("thead");
13438            var tBody = (!BROWSER.ie()) ? TABLE.createTBody() : document.createElement("tbody");
13439            var tRowHead = (!BROWSER.ie()) ? tHead.insertRow() : document.createElement("tr");
13440            var tRowBody = (!BROWSER.ie()) ? tBody.insertRow() : document.createElement("tr");
13441
13442            // if (datos.dimension.indicator.category.label.length === 1) { // todas las entidades
13443            // cuadro 2
13444            if (parametros.tipoCuadro === "precision3") { // precision3 - CUADRO 2
13445                 // un solo periodo / varios indicadores
13446                 var mapDatosPrecisionIndicadores = aIndicadores.filter(function(i,idx){
13447                    aPrecision[idx].unshift(aValores[idx])
13448                
13449                    return  i.datos = aPrecision[idx];
13450                }) 
13451                // cruce de datos entre los indicadores tal cual se solicitan desde parametro con los datos de precision y estimado
13452                var aIndicadoresDepurados = parametros.indicadorDepurado.split(",")
13453                nDatos = aIndicadoresDepurados.map(function(ind, index){
13454                    var result = mapDatosPrecisionIndicadores.filter(function(i,idx){
13455                        return (i.Key === "I_"+ind)? i : null;
13456                    }) 
13457                    result[0].id = ind;
13458                    result[0].nombre = indicadoresNombresFijos !== "" ? indicadoresNombresFijos[index] : result[0].Value;
13459                    return result[0];
13460                })
13461               
13462                //--- ENCABEZADO
13463                //  // [limite_inferior,limite_superior,coeficiente_variacion, error_estandar,nivel_confiabilidad] 
13464               // var titulosEncabezado = (parametros.titulosColumnas != "") ? parametros.titulosColumnas.split(",") : ["Periodo", "Valor observado", "Límite inferior", "Límite superior", "Coeficie
13464nte de variación", "Error estándar", "Nivel de confiabilidad"];
13465                var columnasTotales = 4;
13466                var renglonesTotales = aValores.length;
13467                var tdCol = document.createElement("th");
13468
13469                //primer columna 
13470                var td1 = tdCol.cloneNode(true);
13471                td1.innerHTML = "";
13472                td1.style.minWidth = "80px"
13473                td1.style.maxWidth = "150px"
13474                td1.style.width = "150px"
13475                td1.rowSpan = 2;
13476                td1.className = "Th";
13477                td1.align = "center";
13478                //segunda columna grupo
13479                var td2 = tdCol.cloneNode(true);
13480                td2.innerHTML = "Valor observado";
13481                td2.rowSpan = 2;
13482                td2.className = "Th";
13483                td2.align = "center";
13484
13485                //tercer columna
13486                var tdg = tdCol.cloneNode(true);
13487                tdg.colSpan = 3;
13488                tdg.innerHTML = "Estimación "+ estimacionMesAnio;
13489                tdg.className = "Th";
13490                tdg.align = "center";
13491
13492                var tRowSubHead2 = tRowHead.cloneNode(true);
13493                    // 3 columnas principales
13494                    var td3 = tdCol.cloneNode(true);
13495                    td3.innerHTML = "Límite inferior";
13496                    td3.className = "Th";
13497                    td3.align = "center";
13498                    var td4 = tdCol.cloneNode(true);
13499                    td4.innerHTML = "Estimación puntual";
13500                    td4.className = "Th";
13501                    td4.align = "center";
13502                    var td5 = tdCol.cloneNode(true);
13503                    td5.innerHTML = "Límite superior";
13504                    td5.className = "Th";
13505                    td5.align = "center";
13506
13507                var td6 = tdCol.cloneNode(true);
13508                td6.innerHTML = "Error absoluto";
13509                td6.rowSpan = 2;
13510                td6.className = "Th";
13511                td6.align = "center";
13512
13513                //agregamos columnas al tr head
13514                tRowHead.appendChild(td1);
13515                tRowHead.appendChild(td2);
13516                tRowHead.appendChild(tdg);
13517                tRowSubHead2.appendChild(td3);
13518                tRowSubHead2.appendChild(td4);
13519                tRowSubHead2.appendChild(td5);
13520                tRowHead.appendChild(td6);
13521
13522                // --- FILA DE DATOS
13523                var celda = document.createElement("td"); // celda de dato
13524                var renglon = document.createElement("tr"); // renglon
13525                var tnDatos = nDatos.length;
13526                // console.log(nDatos[0].datos);
13527                var control = [1,nDatos[0].datos.length-1,2,];
13528                for (var r = 0; r < tnDatos; r++) {
13529                    var fila = renglon.cloneNode(true);
13530                    
13531                    var celdaPrimerCol = celda.cloneNode(true);
13532                    // celdaPrimerCol.innerHTML = (indicadoresNombresFijos !== "")? indicadoresNombresFijos[r] : nDatos[r].Value;
13533                    celdaPrimerCol.innerHTML = nDatos[r].nombre;
13534                    celdaPrimerCol.className = "TdInicio";
13535                    fila.append(celdaPrimerCol);
13536
13537                    var celdaValorObservadoCol = celda.cloneNode(true);
13538                    celdaValorObservadoCol.innerHTML = formatoDecimalesResultado(nDatos[r].datos[0],2);
13539                    celdaValorObservadoCol.className = "Td";
13540                    fila.append(celdaValorObservadoCol);
13541
13542                    var nValores = nDatos[r].datos;
13543                    var tnValores = nDatos[r].datos.length;
13544                    var inc = 0;
13545                    for (var c = 0; c < tnValores; c++) {
13546                        if(c === 1 || c === 2 || c === tnValores-1){
13547                            var celdaTd = celda.cloneNode(true);
13548                            celdaTd.innerHTML = formatoDecimalesResultado(nValores[control[inc]],2);
13549                            celdaTd.className = "Td";
13550                            fila.append(celdaTd);
13551                            inc++;
13552                        }
13553                    }
13554                 
13555                    tBody.appendChild(fila);
13556                }
13557
13558
13559            } else { // precision2 - CUADRO 1
13560                // un solo periodo / varios indicadores
13561                // console.log(parametros.indicadorDepurado);
13562                // console.log(aIndicadores);
13563            //   console.log(aPrecision)
13564            //   console.log(aValores);
13565
13566              // agregamos datos de precision y estimacion a arreglo de indicadores tal como viene del api
13567                var _val = 0;
13568                var mapDatosPrecisionIndicadores = aIndicadores.filter(function(i,idx){
13569                    // console.log(aValores[idx].replace(/,/g,""));
13570                    // _val = parseFloat(aValores[idx].replace(/,/g,"")); // removemos los separadores ","
13571                    _val = aValores[idx]; // removemos los separadores ","
13572                    aPrecision[idx].unshift(_val)
13573                
13574                    return  i.datos = aPrecision[idx];
13575                })                 
13576                // cruce de datos entre los indicadores tal cual se solicitan desde parametro con los datos de precision y estimado
13577                var aIndicadoresDepurados = parametros.indicadorDepurado.split(",")
13578                nDatos = aIndicadoresDepurados.map(function(ind, index){
13579                    var result = mapDatosPrecisionIndicadores.filter(function(i,idx){
13580                        return (i.Key === "I_"+ind)? i : null;
13581                    }) 
13582                    result[0].id = ind;
13583                    // result[0].nombre = indicadoresNombresFijos[index];
13584                    result[0].nombre = indicadoresNombresFijos !== "" ? indicadoresNombresFijos[index] : result[0].Value;
13585                    return result[0];
13586                })
13587               
13588                //--- ENCABEZADO
13589                //  // [limite_inferior,limite_superior,coeficiente_variacion, error_estandar,nivel_confiabilidad]              
13590                var tdCol = document.createElement("th");
13591
13592                //primer columna 
13593                var td1 = tdCol.cloneNode(true);
13594                td1.innerHTML = "";
13595                td1.style.minWidth = "80px"
13596                td1.rowSpan = 2;
13597                td1.className = "Th";
13598                td1.align = "center";
13599                //segunda columna grupo
13600                var tdg = tdCol.cloneNode(true);
13601                tdg.colSpan = 3;
13602                tdg.innerHTML = "Estimación";
13603                tdg.className = "Th";
13604                tdg.align = "center";
13605
13606                var tRowSubHead2 = tRowHead.cloneNode(true);
13607                    // 3 columnas principales
13608                    var td2 = tdCol.cloneNode(true);
13609                    td2.innerHTML = "Límite inferior";
13610                    td2.className = "Th";
13611                    td2.align = "center";
13612                    var td3 = tdCol.cloneNode(true);
13613                    td3.innerHTML = "Estimación puntual";
13614                    td3.className = "Th";
13615                    td3.align = "center";
13616                    var td4 = tdCol.cloneNode(true);
13617                    td4.innerHTML = "Límite superior";
13618                    td4.className = "Th";
13619                    td4.align = "center";
13620
13621                //agregamos columnas al tr head
13622                tRowHead.appendChild(td1);
13623                tRowHead.appendChild(tdg);
13624                tRowSubHead2.appendChild(td2);
13625                tRowSubHead2.appendChild(td3);
13626                tRowSubHead2.appendChild(td4);
13627                // tRowHead.appendChild(td5);
13628
13629                // --- FILA DE DATOS
13630                var celda = document.createElement("td"); // celda de dato
13631                var renglon = document.createElement("tr"); // renglon
13632                var tnDatos = nDatos.length;
13633                var control = [1,0,2];
13634                var _vals = 0; // para los valores que les quitamos los separadores ","
13635                for (var r = 0; r < tnDatos; r++) {
13636                    var fila = renglon.cloneNode(true);
13637                    
13638                    var celdaPrimerCol = celda.cloneNode(true);
13639                    var pDomNombre = document.createElement("p"); pDomNombre.style.whiteSpace = "normal";
13640                    pDomNombre.innerHTML = nDatos[r].nombre                                 
13641                    celdaPrimerCol.appendChild(pDomNombre);
13642                    celdaPrimerCol.className = "TdInicio";
13643                    fila.append(celdaPrimerCol);
13644                    
13645                    var nValores = nDatos[r].datos;
13646                    var tnValores = nDatos[r].datos.length; 
13647                    var inc = 0;                   
13648                    for (var c = 0; c < tnValores; c++) {
13649                        if(c === 1 || c === 2 || c === tnValores-1){
13650                            var celdaTd = celda.cloneNode(true);                            
13651                            _vals = nValores[control[inc]]; 
13652                           
13653                            celdaTd.innerHTML = formatoNumeroMiles(_vals);
13654                            celdaTd.className = "Td";
13655                            fila.append(celdaTd);
13656                            inc++;
13657                        }
13658                    }
13659                    tBody.appendChild(fila);
13660                }
13661            }       
13662
13663            if (BROWSER.ie) {
13664                tHead.appendChild(tRowHead);
13665                tHead.appendChild(tRowSubHead2);
13666                tBody.appendChild(tRowBody);
13667                TABLE.appendChild(tHead);
13668                TABLE.appendChild(tBody);
13669            }
13670
13671            //render table
13672            document.getElementById("divDatos" + parametros.contenedorCuadro).appendChild(TABLE);
13673            $("#tableStat" + parametros.contenedorCuadro).hide();
13674            $("#TableEspacio" + parametros.contenedorCuadro).hide();
13675        }
13676            
13677            /// <summary> CUADRO #20 - 28-05-2019 (EN PROCESO DE DESARROLLO) </summary>
13678            ///
13679            /// <remarks>   rovalx </remarks>
13680        function DibujaCuadroTipo20(data, parametros) {
13681                var aValores = data.value;
13682                var tValores = data.value.length;
13683                // var aPeriodos = data.dimension.periods.category.label;
13684                var aIndicadores = data.dimension.indicator.category.label;
13685                var aGrupos = parametros.indicadorValorCompuesto.grupos;
13686                var tGrupos = aGrupos.length;
13687                // var cabeceras = DibujaCabecera(data.dimension.indicator.label, arrayPeriodos.length, 2, parametros.contenedorCuadro);
13688                var titulosColumnas = [];
13689                var tColumnas = tValores / tGrupos; // obtenemos el numero de columnas
13690                
13691                if (parametros.titulosColumnas == "") {
13692                    for(var c = 0; c < tColumnas; c++){
13693                        titulosColumnas.push("Concepto "+ c);                        
13694                    }
13695                } else {
13696                    titulosColumnas = parametros.titulosColumnas.split(",");
13697                }
13698                titulosColumnas.unshift("Denominación")                  
13699                var saltosRenglon = titulosColumnas.length;
13700                //ARMADO DE CABECERA CON DOM
13701                //Estructura de la tabla base
13702                var TABLE = document.createElement("table");
13703                TABLE.className = 'table table-bordered table-responsive';
13704                var tHead = (!BROWSER.ie()) ? TABLE.createTHead() : document.createElement("thead");
13705                var tBody = (!BROWSER.ie()) ? TABLE.createTBody() : document.createElement("tbody");
13706                var tRowHead = (!BROWSER.ie()) ? tHead.insertRow() : document.createElement("tr");
13707                var tRowBody = (!BROWSER.ie()) ? tBody.insertRow() : document.createElement("tr");
13708     
13709                //armar las columnas con titulocolumnas dependiendo del parametro mnc
13710                var tdCol = document.createElement("th");            
13711                for (var i = 0; i < saltosRenglon; i++) {                    
13712                    var col = tdCol.cloneNode(true);
13713                    col.innerHTML = titulosColumnas[i];
13714                    col.width = (i == 0) ? 150 : 90;
13715                    col.align = "center";
13716                    col.className = "Th";
13717                    tRowHead.appendChild(col);
13718                }
13719                var aDatos = []; // guarda la estructura de datos usada para dibujar los datos en el cuadro
13720                // arma la estructura de datos para el dibujado del cuadro
13721                var maxCantidadColumnas = parametros.indicadorValorCompuesto.maximaCantidadPorGrupo;
13722                var c = 0;
13723                for (var x = 0; x < tGrupos; x++) {
13724                    var saltos = maxCantidadColumnas;
13725                    var aInds = aGrupos[x].indicadores;
13726                    aGrupos[x].textos = [];
13727                    var rInds = aIndicadores.filter(function(o, index){
13728                        return aInds.indexOf(o.Key.replace("I_","")) != -1;
13729                    });
13730                    if(rInds.length > 0){
13731                        aGrupos[x].textos = rInds;
13732                    }
13733                    aGrupos[x].valores = [];
13734                    for(var v = c; v < tValores; v++){
13735                        if(saltos > 0){
13736                            aGrupos[x].valores.push(aValores[v]);
13737                            saltos--;
13738                        }
13739                    }
13740                    c = c + maxCantidadColumnas;
13741                }        
13742               
13743                //armar datos para dibujar filas+
13744                var tdCol = document.createElement("td");
13745                var row = document.createElement("tr");
13746                var fila = row.cloneNode(true);
13747                for(var x = 0; x < tGrupos; x++){
13748                    var cell = tdCol.cloneNode(true);                                       
13749                    fila = row.cloneNode(true);
13750                    cell.innerHTML = aGrupos[x].titulo;
13751                    fila.appendChild(cell);
13752                    var tVal = aGrupos[x].valores.length;
13753                    var dVal = aGrupos[x].valores;
13754                    for(var y = 0; y < tVal; y++){                        
13755                        var cellx = tdCol.cloneNode(true);
13756                        cellx.innerHTML = dVal[y]; 
13757                        fila.appendChild(cellx);
13758                    }
13759                    
13760                    tBody.append(fila)
13761                }
13762 
13763                if (BROWSER.ie) {
13764                    tHead.appendChild(tRowHead);
13765                    tBody.appendChild(tRowBody);
13766                    TABLE.appendChild(tHead);
13767                    TABLE.appendChild(tBody);
13768                }
13769                
13770                //render table
13771                document.getElementById("divDatos" + parametros.contenedorCuadro).appendChild(TABLE);
13772                $("#tableStat" + parametros.contenedorCuadro).hide();
13773                $("#TableEspacio" + parametros.contenedorCuadro).hide();
13774
13775    
13776                // cabeceras con o sin titulo por parametro
13777               /*  var indiceColumna = 0;
13778                $.each(arrayPeriodos, function (key, val) {
13779                    //if (indexValue == (saltoPeriodos * contadorcolumnas - 1)) {
13780                    valorColumna = PintaTitulosColumnas(parametros.titulosColumnas, val.Value, indiceColumna++);
13781                    cabeceras += '<th class ="Th" bgcolor="#DDD" >' + valorColumna + '</th>';
13782                    contadorcolumnas++;
13783                    //}
13784                    //indexValue++;
13785                });
13786                cabeceras += "</tr>";
13787                tablaInterna += cabeceras;
13788                var datos = data.value;
13789                indexValue = 0;
13790                var renglones = "";
13791                var arrayIndicadores = data.dimension.indicator.category.label;
13792    
13793                var listaRenglones = [];
13794                indexValue = 0;
13795                var contRenglones = 0;
13796                var indicadoresNombreCorto = parametros.nombreCorto == "true" && parametros.nombresCategoriasFijas !== "" ? parametros.nombresCategoriasFijas.split("|") : [];
13797                for (var i = 0; i < arrayIndicadores.length; i++) {
13798                    var bgColor = "white";
13799                    //if (i % 2 == 0) {
13800                    //    var bgColor = "#EFEFEF";
13801                    //}
13802                    var oRenglon = {};
13803                    oRenglon["indicador"] = arrayIndicadores[i].Key.replace("I_", "");
13804                    var value = arrayIndicadores[i].Value;
13805                    if (indicadoresNombreCorto.length > 0) {
13806                        value = indicadoresNombreCorto[i];
13807                    }
13808                    oRenglon["contenido"] = '<td class="TdInicio" id="td_indicador_' + arrayIndicadores[i].Key.replace("I_", "") + '"  >' + value + '</td>';
13809    
13810                    renglones += '<tr><td class="TdInicio" id="td_indicador_' + arrayIndicadores[i].Key.replace("I_", "") + '"  >' + arrayIndicadores[i].Value + '</td>';
13811                    // contadorcolumnas = 0;
13812                    $.each(arrayPeriodos, function (key, val) {
13813    
13814                        //indexValue = saltoPeriodos * contadorcolumnas + i;
13815                        indexValue = contRenglones;
13816                        renglones += '<td  class="Td"  >' + datos[indexValue] + '</td>';
13817    
13818                        oRenglon["contenido"] += '<td  class="Td"  >' + datos[indexValue] + '</td>';
13819                        contRenglones++;
13820                        //    contadorcolumnas++;
13821    
13822                        indexValue++;
13823                    });
13824    
13825                    renglones += '</tr>';
13826                    listaRenglones.push(oRenglon);
13827                }
13828    
13829                // tablaInterna += renglones;
13830                var todosLosIndicadoresPorParametro = parametros.indicadorDepurado.split(",");
13831                for (var i = 0; i < todosLosIndicadoresPorParametro.length; i++) {
13832                    bgColor = "white";
13833                    //if (i % 2 == 0) {
13834                    //     bgColor = "#EFEFEF";
13835                    //}
13836                    var objIndicador = listaRenglones.filter(function (objIndicador) {
13837                        return objIndicador.indicador === todosLosIndicadoresPorParametro[i];
13838                    })[0];
13839    
13840                    if (objIndicador != undefined) {
13841                        var valorRenglon = objIndicador.contenido; //replaceAll("white",bgColor,objIndicador.contenido);
13842                        tablaInterna += "<tr>" + valorRenglon + "</tr>";
13843                    }
13844                }
13845                ReemplazaTabla(tablaInterna, parametros); */
13846            }
13847        }
13848        
13849        var BROWSER = {
13850            ie: function () {
13851                if (navigator.userAgent.search("MSIE") === 0) {
13852                    return false;
13853                } else {
13854                    return true;
13855                }
13856            }
13857        }
13858        /**
13859        * GridComponnent: Manipulación de datos indicadores para su representación en tabla
13860        *
13861        * PARAMETROS CONFIGURACION OPCIONALES: 
13862        *
13863        *  micuadro.grid_configuracion = {
13864            *       header_css:"string",
13865            *       height:int,
13866            *       width:"100%",
13867            *       filters:boolean,
13868            *       paging:boolean,
13869            *       records_page:int,
13870            *       hide_columns:array // [1,4,5,...]
13871            *       fix_columns:array // [1,4,5,...]
13872            *       auto_height_row: true / false  // auto ajusta altura de row al contenido
13873            *   }
13874            * 
13875            * PARAMETROS PARA: Instance.render(columnas_tabla, datos_tabla, parametros);
13876            *      columnas_tabla,     // parametros pasados en el render
13877            *      datos_tabla,        // tipo de grafico seleccionado
13878            *      parametros 			// parametros y confiruacion de la tabla
13879            *
13880            * METODOS:
13881            *      constructor(),      		//inicializador del componente
13882            *      setOcultaElementos(),      	// oculta elementos no necesarios
13883            * 		setColumnas()				// Arega las columnas de la tabla
13884            * 		setDatos()					// Datos a mostrar en la tabla
13885            * 		setConfiguracion()			// Procesa parametros y configuracion para la tabla
13886            * 		handlerPaging()				// agrega paginador si se activa
13887            * 		handlerColumns()			// oculta columnas indicadas por parametros
13888            * 		loadStyles()			    // Carga estilos por grid
13889            *
13890            * *************************************
13891            *      @Created: 10/oct/2017 
13892            *      @Version: 1.0
13893            *      @Author: Rovalx
13894            */
13895            function GridComponent() {
13896                (function constructor(_this) {
13897                    //console.info({ response: "Inicializado!", version: "1.0", description: "Grid Class component to build web componentes", author: "Rovalx" })        
13898                    _this.config = {
13899                        renderTo: null,
13900                        store: null,
13901                        autoRender: false,
13902                        scrollable: true,
13903                        border: true,
13904                        plugins: [{
13905                            ptype: 'bufferedrenderer',
13906                            trailingBufferZone: 20,  //tras el scroll 20
13907                            leadingBufferZone: 50   // delante del scroll 50 renderizados
13908                        }, { ptype: 'gridfilters' }],
13909                        emptyText: 'No hay registros que coincidan',
13910                        enableColumnHide: false,
13911                        enableColumnMove: false,
13912                        sortableColumns: false,
13913                        closeAction: '',
13914                        columnLines: true,
13915                        stripeRows: false,
13916                        viewConfig: {
13917                            selectedItemCls: 'cls-selected-row'
13918                        },
13919                        columns: [], // columnas extjs
13920                        columnas: [], // columnas en bruto            
13921                        header_css: "background-color:#DDD;font-weight:bold;color:none;",
13922                        hide_columns: [], //col                                                                                                                                 umnas ocultas
13923                        fix_columns: [], //columnas fjas
13924                        records_page: 10,
13925                        hide_headers: false,
13926                        wsc: 100, // width subcolumns
13927                        wcp: 250,
13928                        pinHeaders: true // moviles pinned headers on top display           
13929                    }
13930                    _this.store = {};
13931                })(this)
13932                this.setOcultaElementos = function () {
13933                    $("#TableEspacio" + this.config.contenedorCuadro).hide();
13934                    $("#tableStat" + this.config.contenedorCuadro).hide();
13935                }
13936                
13937                this.setColumnas = function (columnas) {
13938                    //console.log("GRID: Columnas en el armador");        
13939                    var _comp = this;
13940                    if (columnas.length > 0) {
13941                        var aColumnsExt = [];
13942                        $.each(columnas, function (index, col) {
13943                            // columnas principales (nivel 1)  
13944                            var colExt = {
13945                                text: col.title,
13946                                width: (["first", "second", "third"].indexOf(col.dataIndex) != -1) ? _comp.config.wcp : (col.subColumns && col.subColumns.length == 0 ? 150 : "auto"),
13947                                dataIndex: col.dataIndex,
13948                                style: _comp.config.header_css,
13949                                //locked: (index == 0) ? true : false,
13950                                sortable: false,
13951                                resizable: false,
13952                                hideable: true,
13953                                lockable: true,
13954                                menuDisabled: true,
13955                                hidden: col.hasOwnProperty("hidden") && col.hidden ? true : false,
13956                                cell: { xtype: "gridcell", encodeHtml: true },
13957                            }
13958                            //lock / bloqueo de columnas segun su posición
13959                            if (_comp.config.fix_columns && _comp.config.fix_columns.indexOf(index) != -1) {
13960                                colExt.locked = true;
13961                            }
13962                            // width columns
13963                            if (_comp.config.width_columns !== undefined && _comp.config.width_columns.length > 0) {
13964                                colExt.width = _comp.config.width_columns[index];
13965                            }
13966                            // align columns
13967                            if (_comp.config.align_columns !== undefined && _comp.config.align_columns.length > 0) {
13968                                colExt.align = _comp.config.align_columns[index];
13969                            }
13970                            // ord (sortable all columns)
13971                            if (_comp.config.ord !== undefined && _comp.config.ord === true) {
13972                                colExt.sortable = true;
13973                            }
13974                            
13975                            // Activa los filtrados por columna string en la primera automaticamente (por default estan activos)
13976                            if (_comp.config.filters) {                                
13977                                colExt.filter = {
13978                                    type: 'string',
13979                                    itemDefaults: {
13980                                        emptyText: 'Buscar...'
13981                                    }
13982                                }
13983                                colExt.menuDisabled = false;
13984                            }
13985                            //agrega las subcolumnas (nivel 2)                                
13986                            if (col.subColumns !== undefined && col.subColumns.length > 0) { // si la columna superior agrupa columnas 
13987                                colExt.columns = [];
13988                                var subcolumnas = col.subColumns;
13989                                $.each(subcolumnas, function (index, subcol) {
13990                                    var defSubcol = {
13991                                        text: subcol.title,
13992                                        dataIndex: subcol.dataIndex,
13993                                        style: _comp.config.header_css,
13994                                        width: _comp.config.wsc,
13995                                        sortable: true,
13996                                        resizable: false,
13997                                        hideable: true,
13998                                        lockable: true,
13999                                        menuDisabled: true,
14000                                        cell: { xtype: "gridcell", encodeHtml: true },
14001                                    }
14002                                    if (subcol.title == undefined) { // si se indicaron titulos para columnas y llegan undefined significa que iran ocultas
14003                                        defSubcol.hidden = true;
14004                                    }
14005                                    if (_comp.config.align_subcolumns !== undefined && _comp.config.align_subcolumns.length > 0) {
14006                                        defSubcol.align = _comp.config.align_subcolumns[index];
14007                                    }
14008                                    if (_comp.config.filters) {
14009                                        defSubcol.filter = {
14010                                            type: 'string',
14011                                            itemDefaults: {
14012                                                emptyText: 'Buscar...'
14013                                            }
14014                                        }
14015                                        defSubcol.menuDisabled = false;
14016                                    }
14017                                    colExt.columns.push(defSubcol);
14018                                });
14019                            }
14020                            aColumnsExt.push(Ext.create("Ext.grid.column.Column", colExt));
14021                        });
14022                        this.config.columns = aColumnsExt;
14023                        
14024                    } else {
14025                        console.log("Error: en las columnas");
14026                    }
14027                    
14028                }
14029                this.setDatos = function (datos) {
14030                    //console.log("GRID: Datos en el armador");
14031                    this.store.data = datos;
14032                }
14033                this.setConfiguracion = function (configuracion) {
14034                    //console.log("GRID: Configuracion");                 
14035                    var config = configuracion.hasOwnProperty("grid_configuracion") ? configuracion.grid_configuracion : {};
14036                    $.extend(this.config, config);
14037                    this.config.renderTo = document.getElementById("divDatos" + configuracion.contenedorCuadro); // id elemento html donde de sibujara la tabla
14038                    this.config.contenedorCuadro = configuracion.contenedorCuadro; // id elemento html donde de sibujara la tabla
14039                    // ord (grid sortable)
14040                    this.config.sortableColumns = config.ord ? config.ord : false;
14041                    //DECLARACION DEL GRID STORE PARA EL MANEJO DE DATOS  /////////////////////////////////////////////////////////////////         
14042                    this.store = {
14043                        autoLoad: true,
14044                        enablePaging: this.config.paging,
14045                        proxy: {
14046                            type: 'memory',
14047                            enablePaging: this.config.paging,
14048                            reader: { type: 'json', root: 'data' }
14049                        },
14050                        data: []
14051                    };
14052                    if (this.store.enablePaging) {
14053                        this.store.pageSize = this.config.records_page;
14054                        this.handlerPaging();
14055                    }
14056                    //ocultar headers
14057                    if (this.config.hide_headers) {
14058                        this.config.hideHeaders = true;
14059                    }
14060                }
14061                this.handlerPaging = function () {
14062                    this.config.bbar = {
14063                        xtype: 'pagingtoolbar',
14064                        displayInfo: true,
14065                        layout: {
14066                            pack: 'right'
14067                        },
14068                        displayMsg: '{0} - {1} de {2}',
14069                        emptyMsg: "Actualmente sin datos"
14070                    }
14071                }
14072                this.handlerColumns = function (grid) {
14073                    // OCULTAR COLUMNAS
14074                    if (this.config.hide_columns !== null) {
14075                        var aColumnasOcultas = this.config.hide_columns
14076                        if (aColumnasOcultas.length > 0) {
14077                            var columns = grid.getColumns(), colsTotal = columns.length;
14078                            for (var x = 0; x < colsTotal; x++) {
14079                                if (aColumnasOcultas.indexOf(x) != -1) columns[x].hide();
14080                            }
14081                        }
14082                    }
14083                }
14084                this.loadStyles = function () {
14085                    if (this.config.auto_height_row) { // permite ajustar la altura de cada row al contenido  si llega true
14086                        var gStyles = "#" + this.config.renderTo.getAttribute("id") + " .x-grid-cell-inner {white-space:normal!important;}";
14087                        var styleDom = document.createElement("style");
14088                        styleDom.innerHTML = gStyles;
14089                        var head = document.head || document.getElementsByTagName('head')[0];
14090                        head.appendChild(styleDom);
14091                    }
14092                    
14093                }
14094                this.render = function (columnas, datos, configuracion) {
14095                    if (typeof Ext == "undefined") {
14096                        $("#tableStat" + configuracion.contenedorCuadro).parent().append($('<div class="bg-warning">
14096Cuadro no disponible por el momento, recargue nuevamente</div>'))
14097                    } else {
14098                        //console.log("GRID: Render")        
14099                        //AQUI LLAMA TODAS LAS FUNCIONES O BIEN SE LE ENVIAN DATOS, CONFIGURACION, COLUMNAS POR PARAMETRO AQUÍ
14100                        this.config.columnas = columnas;
14101                        this.setConfiguracion(configuracion);
14102                        this.setColumnas(columnas);
14103                        this.setDatos(datos);
14104                        //console.log(datos);
14105                        this.loadStyles();
14106                        this.setOcultaElementos();
14107                        //DECLARACION DEL GRID STORE PARA EL MANEJO DE DATOS  /////////////////////////////////////////////////////////////////        
14108                        this.config.store = Ext.create("Ext.data.Store", this.store);
14109                        var grid = Ext.create("Ext.grid.Panel", this.config);
14110                        //hide / show columns from grid
14111                        this.handlerColumns(grid);
14112                        // Agrega evento resize para reajuste de la tabla
14113                        Ext.EventManager.onWindowResize(function (w, h) {
14114                            grid.updateLayout();
14115                        });
14116                    }
14117                }
14118            }
14119            // Metodo FIND para IE (no implemented in JS6)z
14120            if (!Array.prototype.find) {
14121                Array.prototype.find = function (predicate) {
14122                    if (this == null) {
14123                        throw new TypeError('Array.prototype.find called on null or undefined');
14124                    }
14125                    if (typeof predicate !== 'function') {
14126                        throw new TypeError('predicate must be a function');
14127                    }
14128                    var list = Object(this);
14129                    var length = list.length >>> 0;
14130                    var thisArg = arguments[1];
14131                    var value;
14132                    
14133                    for (var i = 0; i < length; i++) {
14134                        value = list[i];
14135                        if (predicate.call(thisArg, value, i, list)) {
14136                            return value;
14137                        }
14138                    }
14139                    return undefined;
14140                };
14141            }            
14142            /**
14143            * Fija el encabezado de los cuadros (sticky-keader)
14144            * @param {any} parametros
14145            */
14146            function FijaEncabezadoTabla(parametros) {
14147                var link = document.createElement('meta');
14148                link.setAttribute('http-equiv', 'X-UA-Compatible');
14149                link.setAttribute("content","IE=11,IE=10,IE=9; IE=8; IE=7; IE=EDGE")
14150                link.content = document.location;
14151                document.getElementsByTagName('head')[0].appendChild(link);
14152                //tableStatc4
14153                $('#tableStat' + parametros.contenedorCuadro).floatThead({
14154                    top: $("#enc_men_in").height(),
14155                    //autoReflow:true,
14156                    responsiveContainer: function ($table) {
14157                        return $table.closest('.table-responsive');
14158                    }
14159                });
14160                $('#tableStat' + parametros.contenedorCuadro).floatThead('reflow');
14161                if (BROWSER.ie) {
14162                    $('#tableStat' + parametros.contenedorCuadro).find("thead > tr").children().addClass("Th");
14163                }
14164            }
14165            /**
14166            * Agrega herrmientas a la tabla: buscador, paginador, ordenamiento por columnas e informacion de registros
14167            * @param {any} parametros
14168            *  Modificado: 20-sept-2018
14169            */
14170            function agregaHerramientasTabla(parametros) {
14171                if (parametros.herramientas !== "") {
14172                    var buscador = (parametros.herramientas.indexOf("bus") > -1) ? true : false;
14173                    var paginador = (parametros.herramientas.indexOf("pag") > -1) ? true : false;
14174                    var ordenamiento = (parametros.herramientas.indexOf("ord") > -1) ? true : false;
14175                    var inf = (parametros.herramientas.indexOf("inf") > -1) ? true : false;
14176                    $('#tableStat' + parametros.contenedorCuadro).DataTable({
14177                        //"pagingType": "full_numbers",
14178                        "searching": buscador,
14179                        "paging": paginador,
14180                        "ordering": ordenamiento,
14181                        "info": inf
14182                    });
14183                    //$('#tableStat' + parametros.contenedorCuadro).removeClass("dataTable")
14184                }
14185            }
14186
14187           
14188/**
14189 *  Carrusel para temas 
14190 *  created: 20/05/2020
14191 * Dirgido a: Cuadros 18
14192 * @param {any} id
14193 * @param {any} datos
14194 * @param {any} a
14195 */
14196var carouselTemas = function (id, datos, a, p) {
14197    (function (_this) {
14198        _this.datos = datos;
14199        _this.id = id;
14200        _this.p = p;
14201        var _a = a || null;
14202        _this.clicked = null;
14203        _this.clickX = null;
14204        _this.scrollLeft = null;
14205        _this.aActive = (_a !== null) ? _a.split(",").map(function(x){ return parseInt(x)}) : [1, 2, 3, 4, 5];
14206        _this.div = document.createElement("div");
14207        _this.ul = document.createElement("ul");
14208            
14209        _this.li = document.createElement("li");
14210        _this.span = document.createElement("span");
14211        return _this;
14212    })(this);
14213
14214    this.render = function () {
14215        if (document.getElementById(this.id)) {
14216            this.html()
14217        } else {
14218            throw "El elemento con el ID: " + this.id + " no existe";
14219        }
14220    }
14221    this.html = function () {
14222        var _this = this;
14223        this.mainContainer = this.div.cloneNode(false);
14224        this.mainContainer.className = "container-fluid"
14225        // this.mainContainer.style.border = "1px solid";
14226
14227        this.divEncabezado = this.div.cloneNode(false);
14228        this.divEncabezado.className = "row";
14229        this.divEncabezado.style.height = "auto";
14230
14231        this.divContenido = this.div.cloneNode(false);
14232        this.divContenido.className = "row carousel-temas-contenido";
14233        this.divContenido.style.borderTop = "1px solid #cccccc";
14234        this.divContenido.style.padding = "20px 15px";
14235
14236        this.mainContainer.appendChild(this.divEncabezado)
14237        this.mainContainer.appendChild(this.divContenido);
14238        document.getElementById(this.id).appendChild(this.mainContainer);
14239
14240        // crea el encabezado y sus elementos principales
14241        this.btnAnt = this.div.cloneNode(false);
14242        this.btnAnt.className = "col-md-1 col-sm-1 col-xs-1 carousel-temas-ant inegi-nav-izq";
14243        this.btnAnt.style.textAlign = "center";
14244        this.btnAnt.style.paddingTop = "10px";
14245        this.btnAnt.style.color = "#e16c32";
14246        this.btnAnt.style.height = "auto";
14247        this.btnAnt.style.cursor = "pointer";
14248        this.btnAnt.addEventListener("click", function (e) {
14249            e.preventDefault();
14250            e.stopPropagation();
14251            _this.moverScrolll("prev");
14252        }, false);
14253
14254        this.btnSig = this.btnAnt.cloneNode(false);
14255        this.btnSig.className = "col-md-1 col-sm-1 col-xs-1 carousel-temas-sig inegi-nav-der";
14256        // this.btnSig.innerHTML = ">";
14257        this.btnSig.style.textAlign = "center";
14258        this.btnSig.style.paddingTop = "10px";
14259        this.btnSig.style.color = "#e16c32";
14260        this.btnSig.style.height = "auto";
14261        this.btnSig.style.cursor = "pointer";
14262        this.btnSig.addEventListener("click", function (e) {
14263            e.preventDefault();
14264            e.stopPropagation();
14265            _this.moverScrolll("next");
14266        }, false);
14267
14268        this.divOpciones = this.div.cloneNode(false);
14269        this.divOpciones.className = "col-md-10 col-sm-10 col-xs-9 carousel-temas-opciones"
14270        this.divOpciones.id = "carouselTemasOpciones_" + this.id;
14271        this.divOpciones.style.overflowX = "hidden";
14272        this.divOpciones.style.overflowY = "hidden";
14273        this.divOpciones.style.padding = "0";
14274        // this.divOpciones.style.height = "40px";
14275
14276        this.divEncabezado.appendChild(this.btnAnt)
14277        this.divEncabezado.appendChild(this.divOpciones)
14278        this.divEncabezado.appendChild(this.btnSig)
14279
14280        this.agregaDatos()
14281
14282
14283    }
14284    this.agregaDatos = function () {
14285        var _this = this;
14286        var tDatos = this.datos.length;
14287        var aDatos = this.datos;
14288
14289        //Encabezado opciones   
14290        var Ul = this.ul.cloneNode(false);
14291        Ul.style.padding = "0";
14292        Ul.id = "ulOpciones_" + this.id;
14293        Ul.style.marginBottom = "10px";
14294        Ul.style.listStyle = "none";
14295        // Ul.style.width = (tDatos * (150 + 4)) + "px"
14296
14297        this.divOpciones.appendChild(Ul);
14298        var totalLi = 0;
14299        var primerElementoCargar = null;
14300        for (var i = 0; i < tDatos; i++) {
14301            if ((this.aActive.indexOf(aDatos[i].tema_id) > -1 && aDatos[i].tema_id == 1) // si 1 muestre la informacion de la localidad
14302                || (this.aActive.indexOf(2) > -1 && aDatos[i].tema_id == 3) // si 2, entonces tema = 3 vivienda
14303                || (this.aActive.indexOf(3) > -1 && aDatos[i].tema_id == 4) // si 3, entonces tema = 4 poblacion
14304                || (this.aActive.indexOf(4) > -1 && aDatos[i].tema_id == 2) // si 3, entonces tema = 2 urbano
14305                || (this.aActive.indexOf(5) > -1 && aDatos[i].tema_id > 5) // si 5, entonces tema > 5 loc5000
14306            ) {
14307                totalLi++;
14308                var li = this.li.cloneNode(false);
14309                var divTexto = this.div.cloneNode(false);
14310                divTexto.style.textAlign = "center";
14311                divTexto.style.padding = "2px 4px";
14312                divTexto.innerHTML = aDatos[i].tema
14313
14314                li.id = "liTema_" + aDatos[i].tema_id
14315                if(totalLi == 1){
14316                     //guarda primer elemento a cargar
14317                    primerElementoCargar = {temaid:aDatos[i].tema_id, index:i};
14318                }
14319                li.style.display = "inline-block";
14320                li.style.verticalAlign = "top";
14321                li.style.color = "#2279c0";
14322                li.style.margin = "0 0px";
14323                li.style.lineHeight = "16px";
14324                li.style.width = "150px";
14325                li.style.height = "auto"; // original 40px
14326                li.style.cursor = "pointer";
14327                // li.style.borderBottom = "3px solid #6f6f6f";
14328                li.setAttribute("data-index", i);
14329                li.setAttribute("data-temaid", aDatos[i].tema_id);
14330                // evento click para mostrar la informacion de cada tema
14331                li.addEventListener("click", function (e) {
14332                    e.preventDefault();
14333                    $(this).siblings().css({ borderBottom: "0px solid #fff", color:"#2279c0", fontWeight:"normal",fontSize:"14px"})
14334                    $(this).css({ borderBottom: "3px solid #5a7999", color:"#000", fontWeight:"bold",fontSize:"13px"})
14335                    _this.mostrarInformacion(e.currentTarget.dataset)
14336                })
14337                $(li).hover(function (e) {
14338                    e.preventDefault();
14339                    $(this).css("backgroundColor", "#f0f0f0");
14340                }, function () {
14341                    $(this).css("backgroundColor", "transparent");
14342                })
14343                li.appendChild(divTexto);
14344                Ul.appendChild(li);
14345            }           
14346           
14347        }
14348        Ul.style.width = (totalLi * (150 + 4)) + "px";
14349
14350         // ejecuta primer elemento a cargar
14351         if(primerElementoCargar !== null){
14352             document.getElementById("liTema_" + primerElementoCargar.temaid).click()
14353        }
14354
14355        //valida cantida de temas para ocultar o mostrar botones de navegacion
14356        if (this.divOpciones.clientWidth > document.getElementById("ulOpciones_" + this.id).clientWidth) {
14357            this.btnAnt.style.visibility = "hidden";
14358            this.btnSig.style.visibility = "hidden";
14359        }
14360        /* if(document.body.clientWidth < 490){
14361            this.dragScroll();
14362        } */
14363    }
14364    this.moverScrolll = function (m) {
14365        var ul = document.getElementById("ulOpciones_" + this.id);
14366        var sizeMov = "=154";
14367        if (m == "next") { sizeMov = "+" + sizeMov; } else { sizeMov = "-" + sizeMov; }
14368        $(ul).parent().animate({ scrollLeft: sizeMov }, 100);
14369    }   
14370    this.dragScroll = function(){
14371        var _this = this;
14372        var ul = document.getElementById("ulOpciones_" + this.id);
14373        this.divOpciones.style.overflowX = "scroll";
14374        $(ul).on({
14375            'mousemove': function(e) { // mouse se movio sobre el elemento
14376                if(!_this.clicked) return;
14377                const x = e.pageX - ul.offsetLeft;
14378                const walk = (x - _this.clickX) * 3; //scroll-fast
14379                ul.scrollLeft = _this.scrollLeft - walk;
14380            },
14381            'mousedown': function(e) { // mouse fue presionado
14382                _this.clicked = true;
14383                ul.style.cursor = "grabbing";
14384                _this.clickX = e.pageX - ul.scrollLeft;
14385                _this.scrollLeft = ul.scrollLeft;
14386            },
14387            'mouseleave': function(){
14388                _this.clicked = false;
14389                ul.style.cursor = "pointer";
14390            },
14391            'mouseup': function() { // mouse fue liberado
14392                _this.clicked = false;
14393                $(ul).css('cursor', 'auto');
14394            }
14395        });
14396    }
14397    this.mostrarInformacion = function (dataset) {        
14398        //removemos del dom todos los elementos dentro del contenido para poder pintar el nuevo.
14399        while (this.divContenido.hasChildNodes()) {
14400            this.divContenido.removeChild(this.divContenido.firstChild);
14401        }
14402        if (dataset.index) {
14403            var index = dataset.index; // posicion del arreglo de datos
14404            var aTema = this.datos[index]; // datos seleccionados a traves del indice / posicion en el arreglo
14405            var aDatos = this.datos[index].datos; // datos seleccionados a traves del indice / posicion en el arreglo
14406            var tDatos = this.datos[index].datos.length; // total de datos seleccionados a traves del indice / posicion en el arreglo
14407            var contenido = this.divContenido; // contenedor de la informacion a mostrar
14408            var urlAreas = C_dominioBuscador+"app/areasgeograficas?ag=";
14409
14410            if (dataset.temaid > 1 && dataset.temaid < 5) {
14411
14412                var TABLA = document.createElement("table");
14413                TABLA.className = "table table-bordered table-responsive table-striped";
14414                var tHead = document.createElement("thead");
14415                var tBody = document.createElement("tbody");
14416                var tr = document.createElement("tr");
14417                var th = document.createElement("th");
14418                var td = document.createElement("td");
14419
14420                TABLA.appendChild(tHead)
14421                TABLA.appendChild(tBody)
14422                this.divContenido.appendChild(TABLA);
14423
14424                for (var x = 0; x < aDatos.length; x++) {
14425                    if (Array.isArray(aDatos[x].valor) && aDatos[x].descripcion != "NOTA") { // tabla varias columnas
14426                        var aColumnas = aDatos[x].valor;
14427                        var renglon = tr.cloneNode(false);
14428                        var primeraCelda = null;
14429                        if (x === 0) { // primer registro son las columnas principales del cuadro
14430                            primeraCelda = th.cloneNode(false);
14431                            primeraCelda.className = "Th";
14432                        } else {
14433                            primeraCelda = td.cloneNode(false);
14434                            primeraCelda.className = "";
14435                        }
14436                        primeraCelda.innerHTML = aDatos[x].descripcion;
14437                        renglon.appendChild(primeraCelda);
14438
14439                        for (var c = 0; c < aColumnas.length; c++) {
14440                            var celda = (x === 0) ? th.cloneNode(false) : td.cloneNode(false);
14441                            celda.innerHTML = aColumnas[c];
14442                            celda.className = (x === 0) ? "Th" : "TdV";
14443                            renglon.appendChild(celda);
14444                        }
14445                        if (x === 0) {
14446                            tHead.appendChild(renglon);
14447                        } else { // filas de datos (cuerpo del cuadro)
14448                            tBody.appendChild(renglon);
14449                        }
14450
14451                    } else if (aDatos[x].valor !== "TITULO" && aDatos[x].descripcion !== "NOTA") { // tabla 2 columnas
14452
14453                        var renglon = tr.cloneNode(false);
14454                        var primeraCelda = null, segundaCelda = null;
14455                        if (x === 0) { // primer registro son las columnas principales del cuadro
14456                            primeraCelda = th.cloneNode(false);
14457                            primeraCelda.className = "Th";
14458                            segundaCelda = th.cloneNode(false);
14459                            segundaCelda.className = "Th";
14460                        } else {
14461                            primeraCelda = td.cloneNode(false);
14462                            primeraCelda.className = "";
14463                            segundaCelda = td.cloneNode(false);
14464                            segundaCelda.className = "TdV";
14465                        }
14466                        primeraCelda.innerHTML = aDatos[x].descripcion;
14467                        segundaCelda.innerHTML = aDatos[x].valor;
14468                        renglon.appendChild(primeraCelda);
14469                        renglon.appendChild(segundaCelda);
14470
14471                        if (x === 0) {
14472                            tHead.appendChild(renglon);
14473                        } else { // filas de datos (cuerpo del cuadro)
14474                            tBody.appendChild(renglon);
14475                        }
14476                    }
14477                }
14478
14479                // INSERTAR NOTAS POR EL TEMA SELECCIONADO EN EL MODO VISUAL 2 POR PESTAÑAS
14480                // modificacion 04-07-2022
14481                // console.log(aDatos);
14482                var aNotasTemaMostrar = aDatos.filter(function(nota){
14483                    return nota.descripcion === "NOTA";
14484                });               
14485                if(aNotasTemaMostrar.length > 0){
14486                    aNotasTemasMostrar = aNotasTemaMostrar.reverse();
14486 // invertimos las notas para coloarlas en el orden correcto
14487                    for (var x = 0; x < aNotasTemaMostrar.length; x++) {
14488                        //preguntamos si el valor de la nota es un arreglo y extraemos el primer valor, si no entonces es un string
14489                        var sNota = Array.isArray(aNotasTemaMostrar[x].valor)? aNotasTemaMostrar[x].valor[0] : aNotasTemaMostrar[x].valor;
14490                        var divNota = this.div.cloneNode(false);
14491                        divNota.style.marginTop = "15px";
14492                        divNota.style.fontSize = "11px";
14493                        divNota.innerHTML = sNota;
14494                        this.divContenido.appendChild(divNota);
14495                    }         
14496                }      
14497
14498            } else { // si tema es 1 y >= 5
14499                var UL = this.ul.cloneNode(false);
14500                UL.className = "list-group"
14501                
14502                /* var aDatosTema1 = tDatos.map(function(tema, idx){
14503                    return tema.
14504                }) */
14505                if(aTema.tema_id === 1){
14506                    var _ulInfoLocalidad = tplInformacionLocalidad(aTema.datos, UL, this.p)                    
14507                    this.divContenido.appendChild(_ulInfoLocalidad);
14508                }
14509              
14510                for (var x = 0; x < tDatos; x++) {
14511                    if (aTema.tema_id !== 1) { // solo para ficha diferente de informacion de localidad
14512                       
14513                        this.divContenido.appendChild(UL);
14514                        if (aDatos[x].descripcion !== "NOTA") {
14515                            var fila = this.li.cloneNode(false);
14516                            fila.className = "list-group-item"
14517                            fila.style.padding = "4px";
14518                            fila.style.borderRight = "0";
14519                            fila.style.borderLeft = "0";
14520
14521                            var titulo = this.span.cloneNode(false);
14522                            titulo.style.verticalAlign = "top";
14523                            titulo.style.display = "inline-block";
14524                            titulo.style.width = "60%";
14525                            titulo.style.fontWeight = "bold"                           
14526                            var valor = this.span.cloneNode(false);
14527                            valor.style.verticalAlign = "top";
14528                            valor.style.display = "inline-block";
14529                            valor.style.width = "40%";
14530
14531                            if (aDatos[x].descripcion === "TITULO") {
14532                                // fila.className = ""
14533                                fila.style.padding = "0px";
14534                                titulo.innerHTML = aDatos[x].valor;
14535                                titulo.style.backgroundColor = "#f9f9f9";
14536                                titulo.style.padding = "4px 6px";
14537                                titulo.style.color = "#157fcc";
14538                                titulo.style.width = "100%";
14539                            } else {
14540                                titulo.innerHTML = "&ensp;&ensp;" + aDatos[x].descripcion + ":&ensp;";
14541                                valor.innerHTML = aDatos[x].valor;
14542                            }
14543
14544                            fila.appendChild(titulo);
14545                            if (aDatos[x].descripcion !== "TITULO") {
14546                                fila.appendChild(valor);
14547                            }
14548                            UL.appendChild(fila)
14549                        }
14550
14551                    }
14552
14553                }
14554
14555                 // INSERTAR NOTAS POR EL TEMA SELECCIONADO EN EL MODO VISUAL 2 POR PESTAÑAS - SOLO PARA LISTADOS
14556                // modificacion 04-07-2022
14557                // console.log(aDatos);
14558                var aNotasListados = aDatos.filter(function(nota){
14559                    return nota.descripcion === "NOTA";
14560                });               
14561                if(aNotasListados.length > 0){
14562                    // console.log(aNotasListados);
14563                    aNotasListados = aNotasListados.reverse();
14563 // invertimos las notas para coloarlas en el orden correcto
14564                    for (var x = 0; x < aNotasListados.length; x++) {
14565                        //preguntamos si el valor de la nota es un arreglo y extraemos el primer valor, si no entonces es un string
14566                        var sNota = Array.isArray(aNotasListados[x].valor)? aNotasListados[x].valor[0] : aNotasListados[x].valor;
14567                        var divNota = this.div.cloneNode(false);
14568                        divNota.style.marginTop = "15px";
14569                        divNota.style.fontSize = "11px";
14570                        divNota.innerHTML = ((sNota.indexOf("*") > -1)? "" : "* ") + sNota;
14571                        this.divContenido.appendChild(divNota);
14572                    }         
14573                }      
14574
14575              /*   if (aDatos[aDatos.length - 1].descripcion === "NOTA") {
14576                    var dNota = aDatos[aDatos.length - 1];
14577                    console.log(dNota)
14578                    var divNota = this.div.cloneNode(false);
14579                    divNota.style.marginTop = "15px";
14580                    divNota.style.fontSize = "11px";
14581                    divNota.innerHTML = Array.isArray(dNota.valor) ? dNota.valor[0] : dNota.valor;
14582                    this.divContenido.appendChild(divNota);
14583
14584                }
14585 */
14586            }
14587
14588
14589        } else {
14590            throw "Error: no se encontró el index para el tema solicitado";
14591        }
14592    }
14593    
14594}
14595/**
14596 * Metodo encargado de armar el template con datos de informacion de la localidad [llamado en: DibujaCuadroTipo18_LocalidadesV4 ]
14597 * @param {*} datos 
14598 * @param {*} ul 
14599 * @returns 
14600 */
14601function tplInformacionLocalidad(datos, ulp, parametros){    
14602    var ul = ulp.cloneNode(true);
14603    ul.className = ul.className + " cls-ulLocalidad";
14604    ul.style.padding = "0px";
14605    ul.style.marginBottom = "0px";
14606    ul.style.listStyleType = "none";   
14607    var li = document.createElement("li");            
14608    var span = document.createElement("span");
14609    span.style.display = "inline-block";
14610    span.style.padding = "0px 0px";
14611    span.style.fontWeight = "600"; 
14612    span.style.width = "40%";                   
14613    span.className = "cls-block-loc";
14614    var a = document.createElement("a");
14615   /*  datos.map(function(tema, index){
14616        console.info(index +" > "+ tema.descripcion + " [ " + tema.valor +" ]");
14617    }) */
14618    // OBTENER LA ENTIDAD FEDERATIVA ---------------------------------------------------------------------------
14619    var oEntidadFederativa = datos.find(function(el) { 
14620        var claveEntidad = datos.find(function(el) { 
14621            return el.descripcion === "Clave de entidad federativa"
14622        })
14623        el.texto = el.valor+" ("+claveEntidad.valor +")";
14624        el.url = C_dominioBuscador + "app/areasgeograficas?ag=" + claveEntidad.valor;
14625        return el.descripcion === "Entidad federativa" || el.descripcion === "Nombre de la entidad federativa";
14626    })
14627    if(oEntidadFederativa !== undefined){
14628        var aEntFed = a.cloneNode(true); aEntFed.innerHTML = oEntidadFederativa.texto;
14629        aEntFed.setAttribute("href", oEntidadFederativa.url); aEntFed.setAttribute("target","_blank"); aEntFed.style.cursor = "pointer";
14630        var spanEntFedLabel = span.cloneNode(true); spanEntFedLabel.innerHTML = getTraductorCuadro(parametros, "Entidad federativa")+":";
14631        var spanEntFedValor = span.cloneNode(true); spanEntFedValor.appendChild(aEntFed); spanEntFedValor.style.fontWeight = "normal"; spanEntFedValor.style.width = "60%";          
14632        var liEntFed = li.cloneNode(true); liEntFed.appendChild(spanEntFedLabel)
14633        liEntFed.appendChild(spanEntFedValor)
14634        ul.appendChild(liEntFed);
14635    }
14636    
14637    // OBTENER MUNICIPIO ---------------------------------------------------------------------------
14638    var oMunicipio = datos.find(function(el) { 
14639        var claveEntidad = datos.find(function(el) { 
14640            return el.descripcion === "Clave de entidad federativa"
14641        })
14642        var claveMpio = datos.find(function(el) { 
14643            return el.descripcion === "Clave de municipio" || el.descripcion === "Clave de municipio o demarcación territorial"
14644        })
14645        el.texto =  el.valor+" ("+claveEntidad.valor + claveMpio.valor +")";
14646        el.url = C_dominioBuscador + "app/areasgeograficas?ag=" + claveEntidad.valor + claveMpio.valor;
14647        return el.descripcion === "Municipio" || el.descripcion === "Municipio o demarcación territorial";
14648    })
14649    var aMunicipio = a.cloneNode(true); aMunicipio.innerHTML = oMunicipio.texto;
14650    aMunicipio.setAttribute("href", oMunicipio.url); aMunicipio.setAttribute("target","_blank"); aMunicipio.style.cursor = "pointer";
14651    var spanMunicipioLabel = span.cloneNode(true); spanMunicipioLabel.innerHTML = getTraductorCuadro(parametros, "Municipio")+":";
14652    var spanMunicipioValor = span.cloneNode(true); spanMunicipioValor.appendChild(aMunicipio); spanMunicipioValor.style.fontWeight = "normal"; spanMunicipioValor.style.width = "60%";
14653    var liMunicipio = li.cloneNode(true); liMunicipio.appendChild(spanMunicipioLabel)
14654    liMunicipio.appendChild(spanMunicipioValor)
14655    ul.appendChild(liMunicipio);
14656    
14657    // OBTENER LOCALIDAD ---------------------------------------------------------------------------
14658    var claveEntidad = null;
14659    var claveMpio = null;
14660    var oLocalidad = datos.find(function(el) { 
14661        claveEntidad = datos.find(function(el) { 
14662            return el.descripcion === "Clave de entidad federativa" 
14663        })
14664        claveMpio = datos.find(function(el) { 
14665            return el.descripcion === "Clave de municipio" || el.descripcion === "Clave de municipio o demarcación territorial"
14666        })
14667        var claveLocalidad = datos.find(function(el) { 
14668            return el.descripcion === "Clave de localidad"
14669        })
14670        el.texto = el.valor + " ("+ claveEntidad.valor + claveMpio.valor + claveLocalidad.valor +")";    
14671        // consultamos la clave en entidad para sacar la clave de la localidad
14672        if(claveLocalidad){
14673            var claveLoc = claveEntidad.texto.substring(claveEntidad.texto.indexOf("(")+1,claveEntidad.texto.length-1);
14674            el.url_localidad = C_dominioBuscador + "app/areasgeograficas?ag=" + claveLoc;
14675        }            
14676        return el.descripcion === "Localidad" || el.descripcion === "Nombre de localidad";
14677    })    
14678
14679    var aLocalidadLink = a.cloneNode(true); aLocalidadLink.setAttribute("href", oLocalidad.url_localidad); aLocalidadLink.setAttribute("target","_blank"); aLocalidadLink.style.cursor = "pointer";
14680    aLocalidadLink.innerHTML = oLocalidad.texto;
14681    var spanLocalidadLabel = span.cloneNode(true); spanLocalidadLabel.innerHTML = getTraductorCuadro(parametros, "Localidad")+":"; spanLocalidadLabel.style.verticalAlign = "top";
14682    var spanLocalidadValor = span.cloneNode(true); spanLocalidadValor.appendChild(aLocalidadLink); spanLocalidadValor.style.fontWeight = "normal"; spanLocalidadValor.style.width = "60%";
14683    // aLocalidadLink.appendChild(spanLocalidadValor)
14684    var liLocalidad = li.cloneNode(true); liLocalidad.appendChild(spanLocalidadLabel)
14685    liLocalidad.appendChild(spanLocalidadValor)
14686    ul.appendChild(liLocalidad);
14687    
14688    // OBTENER UBICACION GEOGRAFICA ---------------------------------------------------------------------------
14689    var oUbicacionGeografica = datos.find(function(el) {                
14690        var oLatitud = datos.find(function(el) { 
14691            return el.descripcion === "Latitud"
14692        })
14693        var oAltitud = datos.find(function(el) { 
14694            return el.descripcion === "Altitud"
14695        })
14696        if(oAltitud && oLatitud){
14697            el.texto = "Longitud " + el.valor +",<br />Latitud "+ oLatitud.valor +",<br />Altitud "+ oAltitud.valor;                
14698        }
14699        return el.descripcion === "Longitud";
14700    })
14701    if(oUbicacionGeografica){
14702        var spanUbicacionGeograficaLabel = span.cloneNode(true); spanUbicacionGeograficaLabel.innerHTML = getTraductorCuadro(parametros, "Ubicación geográfica")+":";  spanUbicacionGeograficaLabel.style.verticalAlign = "top";
14703        var spanUbicacionGeograficaValor = span.cloneNode(true); spanUbicacionGeograficaValor.innerHTML = oUbicacionGeografica.texto; spanUbicacionGeograficaValor.style.fontWeight = "normal"; spanUbicacionGeograficaValor.style.width = "60%";
14704        var liUbicacionGeografica = li.cloneNode(true); liUbicacionGeografica.appendChild(spanUbicacionGeograficaLabel)
14705        liUbicacionGeografica.appendChild(spanUbicacionGeograficaValor)
14706        ul.appendChild(liUbicacionGeografica);
14707    }
14708    
14709    // OBTENER TIPIFICACION (Tipo de localidad habitada) ---------------------------------------------------------------------------
14710    /* var oTipificacion = datos.find(function(el) {                                
14711        return el.descripcion === "Tipo de localidad habitada";
14712    })
14713    var spanTipificacionLabel = span.cloneNode(true);
14713 spanTipificacionLabel.innerHTML = "Tipo de localidad habitada:";
14714    var spanTipificacionValor = span.cloneNode(true); spanTipificacionValor.innerHTML = oTipificacion.valor; spanTipificacionValor.style.fontWeight = "normal"; spanTipificacionValor.style.width = "60%";
14715    var liTipificacion = li.cloneNode(true); liTipificacion.appendChild(spanTipificacionLabel)
14716    liTipificacion.appendChild(spanTipificacionValor)
14717    ul.appendChild(liTipificacion); */
14718    
14719    // OBTENER ES CABECERA MUNICIPAL ---------------------------------------------------------------------------
14720    var oCabeceraMunicipal = datos.find(function(ele) {       
14721        var oNombreCabeceraMunicipal = datos.find(function(el) { 
14722            return el.descripcion === "Clave de la Cabecera Municipal"
14723        })
14724        if(oNombreCabeceraMunicipal){
14725            var ncm = oNombreCabeceraMunicipal.valor.replaceAll(" ","");
14726            var claveCabecera = ncm.substring(ncm.indexOf("(")+1,ncm.length-1);
14727            ele.texto = (oNombreCabeceraMunicipal.valor).substr(0, oNombreCabeceraMunicipal.valor.indexOf("("))
14728            ele.clave_cabecera = claveCabecera;
14729            ele.url_cabecera = C_dominioBuscador + "app/areasgeograficas?ag=" + claveCabecera;
14730        }
14731        return ele.descripcion == "Es Cabecera Municipal";
14732    })
14733    // console.log(oCabeceraMunicipal)
14734
14735    // return;
14736    if(oCabeceraMunicipal){
14737        var spanEscabeceraLabel = span.cloneNode(true); spanEscabeceraLabel.innerHTML = getTraductorCuadro(parametros,"Es cabecera municipal")+":";
14738        var spanEscabeceraValor = span.cloneNode(true); spanEscabeceraValor.innerHTML = oCabeceraMunicipal.valor; spanEscabeceraValor.style.fontWeight = "normal"; spanEscabeceraValor.style.width = "60%";
14739        var liEscabecera = li.cloneNode(true); liEscabecera.appendChild(spanEscabeceraLabel)
14740        liEscabecera.appendChild(spanEscabeceraValor)
14741        ul.appendChild(liEscabecera);
14742        
14743        var aCabeceraMunicipal = a.cloneNode(true); aCabeceraMunicipal.innerHTML = oCabeceraMunicipal.texto+" ("+oCabeceraMunicipal.clave_cabecera +")";
14744        aCabeceraMunicipal.setAttribute("href", oCabeceraMunicipal.url_cabecera); aCabeceraMunicipal.setAttribute("target","_blank"); aCabeceraMunicipal.style.cursor = "pointer";
14745        var spanCabeceraLabel = span.cloneNode(true); spanCabeceraLabel.innerHTML = getTraductorCuadro(parametros, "Cabecera municipal")+":";
14746        var spanCabeceraValor = span.cloneNode(true); spanCabeceraValor.appendChild(aCabeceraMunicipal); spanCabeceraValor.style.fontWeight = "normal"; spanCabeceraValor.style.width = "60%";
14747        var liCabeceraNombre = li.cloneNode(true); liCabeceraNombre.appendChild(spanCabeceraLabel)
14748        liCabeceraNombre.appendChild(spanCabeceraValor)
14749        ul.appendChild(liCabeceraNombre);
14750    }
14751        
14752    // OBTENER NOTA GENERAL---------------------------------------------------------------------------
14753    var oNota = datos.find(function(el) {                                
14754        return el.descripcion === "NOTA";
14755    })
14756    if(oNota){
14757        var spanNota = span.cloneNode(true); spanNota.innerHTML = "<br />* "+oNota.valor;
14758        spanNota.style.fontWeight = "normal"; spanNota.style.width = "100%"; spanNota.style.fontSize = "11px";               
14759        var liNota = li.cloneNode(true); liNota.appendChild(spanNota)
14760        liNota.appendChild(spanNota)
14761        ul.appendChild(liNota);
14762    }
14763    return ul;
14764}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.