PageSourceSearch

https://www.scielo.org.mx/documentos/js/observatorio.js

js scielo.org.mx collected 2026-09-24 08:33:17 UTC 47,320 bytes, 720 lines download raw bytes

1
2class_obs = {
3    cons:{
4        _SECCION: 'sección',
5        _TEXTO: 'texto',
6        _RENGLONES: 'renglones encabezado',
7        _NUM_RENGLON: 'num renglón',
8        _NUM_COLUMNA: 'num columna',
9        _AGRUPA: 'agrupa',
10    },
11    tabla: '',
12    tabla_html: '<table id="tbl_revistas" class="stripe row-border order-column nowrap display" style="width:100%; font-size:12px"></table>',
13    th_inter: '<th rowspan="<numrow>" colspan="<numcol>" style="min-width: 150px; max-width: 150px; background-color: <color-fondo>"><div style="width: 100%; text-align: left; white-space: normal;"><tx_text></div></th>',
14    tabla_th_orig: 	'<thead>' +
15                    //'<tr>' +
16                    '<encabezados>' +
17                    //'</tr>' +
18            '</thead>' +
19            '<tbody id="tabla_body">' +
20            '</tbody>' +
21            '<tfoot>' +
22                '<totales>' +
23            '</tfoot>',
24    tabla_th: '',
25    td_inter:'<td style="min-width: 100px; max-width: 100px; background-color: <bcolor>;"><td_text></td>',
26    tabla_tr: '<tr>' +
27        '<td class="all" style="min-width: 100px; max-width: 100px"><primero></td>' +
28        '<tds_inter>
28' +
29    '</tr>',
30    td_inter_fijo:'<td style="min-width: 100px; max-width: 100px; background-color: <bcolor>;"><div style="width: 100%; text-align: left; white-space: normal;"><td_text></div></td>',
31    tabla_tr_fijo: '<tr>' +
32        '<td class="all" style="min-width: 100px; max-width: 100px"><div style="width: 100%; text-align: left; white-space: normal;"><primero></div></td>' +
33        '<tds_inter>' +
34    '</tr>',    
35    tabla_body: '',
36    opcion_busca: '<a class="dropdown-item waves-light waves-effect menu-busca-por" href="#" id="<id>"><opcion></a>',
37    html_opciones : '',
38    html_opciones_select : [],
39    id_buscar: '',
40    opcion_anio: '<a class="dropdown-item waves-light waves-effect menu-anio" href="#" id="<id>"><opcion></a>',
41    html_anios : '',
42    html_anios_select : [],
43    anios: [],
44    anio_select: '',
45    registros: {
46        anios: [],
47        totales: [],
48        columna_total: [],
49        color_total: '',
50        ocultar: [],
51        buscar: {catalogo:[], completo:[]},
52        incluir: {valores:[], texto:[]},
53        completos: [],
54        numerico: [],
55        url: [],
56        paginado:{valores:[]},
57        rencabezado:[],
58        fijas:[],
59        filtro: [],
60        textos: [/*id:'', texto:''*/],
61        row_encabezados: [0],
62        encabezado: []
63    },
64    num_encabezados: 0,
65    DISCOVERY_DOCS: ["https://sheets.googleapis.com/$discovery/rest?version=v4"],
66    SCOPES: ['https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/drive'],
67    datos: function(anio_select=null){
68        class_obs.anios = [];
69        var p_k = '';
70        $.each(env.P_K, function(i,val){
71           p_k += b(val);
72           if(i != env.P_K.length){
73               p_k += '\n';
74           }
75        });
76        
77        var object = {
78                private_key: p_k,
79                client_email: b(env.C_E),
80                scopes: class_obs.SCOPES,
81            };
82        gapi.load("client", async function(){
83            gapi.auth.setToken(await GetAccessTokenFromServiceAccount.do(object));
84            gapi.client.init({
85                discoveryDocs: class_obs.DISCOVERY_DOCS,
86            }).then(function () {
87                //Lectura de hoja de cálculo, se requiere el ID y la hoja de la que leerá
88                gapi.client.sheets.spreadsheets.get({
89                    spreadsheetId: b(env.sIdObs),
90                    //Esta opción es para incluir TODOS los datos
91                    //includeGridData: true
92                }).then(function(response) {
93                    var sheets = response.result.sheets;
94                    
95                    //Obtiene los títulos de las hojas, divide si existe un guión, se queda con la primera parte y aplica un parseInt 
96                    class_obs.anios = sheets.map(function(sheet) {
97                        if( !isNaN(parseInt(sheet.properties.title.split('-')[0])) )
98                            return sheet.properties.title;
99                    });
100                    
101                    //Filtra sólo los años
102                    class_obs.anios = class_obs.anios.filter(function (value) {
103                        return value !== undefined;
104                    });
105                    
106                    //Si no hay año seleccionado, obtiene el más alto
107                    if(anio_select == null){
108                        //anio_select = Math.max(...class_obs.anios);
109                        anio_select = class_obs.anios[class_obs.anios.length-1];
110                    }
111                    
112                    //Obtiene todas las hojas, se usa si se requiere leer TODAS las hojas de una sola pasada, y se pone en "ranges"
113                    var ranges = sheets.map(function(sheet) {
114                        return sheet.properties.title;
115                    });
116
117                    //gapi.client.sheets.spreadsheets.values.batchGet({
118                    gapi.client.sheets.spreadsheets.values.get({
119                        spreadsheetId: b(env.sIdObs),
120                        //ranges: ranges
121                        //Sólo se leerá la configuración
122                        range: 'config'
123                    }).then(function(response) {
124                        class_obs.tabla_body = '';
125                        class_obs.html_opciones = '';
126                        class_obs.html_opciones_select = [];
127                        class_obs.id_buscar = '';
128                        class_obs.registros.ocultar = [];
129                        class_obs.registros.fijas = [];
130                        class_obs.registros.buscar.catalogo = [];
131                        class_obs.registros.buscar.completo = [];
132                        class_obs.registros.incluir.valores = [];
133                        class_obs.registros.numerico = [];
134                        class_obs.registros.url = [];
135                        class_obs.registros.row_encabezados = [];
136                        class_obs.registros.incluir.texto = [];
137                        class_obs.registros.completos = [];
138                        class_obs.registros.filtro = [];
139                        class_obs.num_encabezados = 0;
140                        
141                        $('#buscador').show();
142                        $('#inicio').hide();
143                        $('#mas').show(); 
144                        
145                        var datos_anio = true;
146                        var values = response.result.values;
147
148                                //Corta sólo la primera columna
149                                $.each(values.slice(1), function(i, val){
150                                    try{
151                                        if(val[0] == 'años'){
152                                            class_obs.registros.anios = [];
153                                            var valores = val[1].split(',').map(val_v => val_v.trim());
154                                            class_obs.registros.anios = class_obs.registros.anios.concat(valores);
155                                        }
156                                        if(val[0] == 'totales'){
157                                            var valores = val[1].split(',');
158                                            $.each(class_obs.registros.anios, function(a, vala){
159                                                class_obs.registros.totales[vala] = [];
160                                                class_obs.registros.totales[vala] = class_obs.registros.totales[vala].concat(valores); 
161                                            });
162                                        }
163                                        if(val[0] == 'ocultar'){
164                                            var valores = val[1].split(',');
165                                            $.each(class_obs.registros.anios, function(a, vala){
166                                                class_obs.registros.ocultar[vala] = [];
167                                                class_obs.registros.ocultar[vala] = class_obs.registros.ocultar[vala].concat(valores);
168                                                if(class_obs.registros.ocultar[vala] == ''){
169                                                    class_obs.registros.ocultar[vala] = [];
170                                                }
171                                            });
172                                        }
173                                        if(val[0] == 'buscar'){
174                                            var valores = val[1].split(',');
175                                            $.each(class_obs.registros.anios, function(a, vala){
176                                                class_obs.registros.buscar[vala] = [];
177                                                class_obs.registros.buscar[vala] = class_obs.registros.buscar[vala].concat(valores);
178                                            });
179                                        }
180                                        if(val[0] == 'incluir'){
181                                            var valores = val[1].split(',');
182                                            $.each(class_obs.registros.anios, function(a, vala){
183                                                class_obs.registros.incluir.valores[vala] = [];
184                                                class_obs.registros.incluir.valores[vala] = class_obs.registros.incluir.valores[vala].concat(valores);
185                                            });
186                                        }
187                                        if(val[0] == 'paginado'){
188                                            var valores = val[1].split(',');
189                                            $.each(class_obs.registros.anios, function(a, vala){
190                                                class_obs.registros.paginado.valores[vala] = [];
191                                                class_obs.registros.paginado.valores[vala] = class_obs.registros.paginado.valores[vala].concat(valores);
192                                            });
193                                        }
194                                        if(val[0] == 'columna total'){
195                                            var valores = val[1].split(',');
196                                            class_obs.registros.color_total = val[2];
197                                            $.each(class_obs.registros.anios, function(a, vala){
198                                                class_obs.registros.columna_total[vala] = [];
199                                                class_obs.registros.columna_total[vala] = class_obs.registros.columna_total[vala].concat(valores);
200                                            });
201                                        }
202                                        if(val[0] == 'fijas'){
203                                            var valores = val[1].split(',');
204                                            $.each(class_obs.registros.anios, function(a, vala){
205                                                class_obs.registros.fijas[vala] = [];
206                                                class_obs.registros.fijas[vala] = class_obs.registros.fijas[vala].concat(valores);
207                                            });
208                                        }
209                                        if(val[0] == 'numérico'){
210                                            var valores = val[1].split(',');
211                                            $.each(class_obs.registros.anios, function(a, vala){
212                                                class_obs.registros.numerico[vala] = [];
213                                                $.each(valores, function(i2, val2){
214                                                    if(val2.indexOf('-') !== -1){
215                                                        var rango = val2.split('-');
216                                                        for(var n=parseInt(rango[0]); n<=parseInt(rango[1]); n++){
217                                                                class_obs.registros.numerico[vala].push(n);
218                                                        }
219                                                    }else{
220                                                        class_obs.registros.numerico[vala].push(parseInt(val2));
221                                                    }
222                                                });
223                                            });
224                                        }
225                                        if(val[0] == 'url'){
226                                            var valores = val[1].split(',');
227                                            $.each(class_obs.registros.anios, function(a, vala){
228                                                class_obs.registros.url[vala] = [];
229                                                $.each(valores, function(i2, val2){
230                                                    if(val2.indexOf('-') !== -1){
231                                                        var rango = val2.split('-');
232                                                        for(var n=parseInt(rango[0]); n<=parseInt(rango[1]); n++){
233                                                                class_obs.registros.url[vala].push(n);
234                                                        }
235                                                    }else{
236                                                        class_obs.registros.url[vala].push(parseInt(val2));
237                                                    }
238                                                });
239                                            });
240                                        }
241                                        
242                                        if(val[0] == 'renglones encabezado'){
243                                            var valores = val[1].split(',');
244                                            $.each(class_obs.registros.anios, function(a, vala){
245                                                class_obs.registros.rencabezado[vala] = [];
246                                                class_obs.registros.rencabezado[vala] = class_obs.registros.rencabezado[vala].concat(valores);
247                                            });
248                                        }
249                                        
250                                        if(val[0] == 'grupo'){
251                                            var valores = val[1].split(';');
252                                            $.each(class_obs.registros.anios, function(a, vala){
253                                                if(class_obs.registros.encabezado[vala] == undefined){
254                                                    class_obs.registros.encabezado[vala] = [];
255                                                }
256                                                if(class_obs.registros.encabezado[vala][valores[0]-1] == undefined){
257                                                    class_obs.registros.encabezado[vala][valores[0]-1] = [];
258                                                }
259                                                class_obs.registros.encabezado[vala][valores[0]-1][valores[1]] = valores[2];
260                                            });
261                                        }
262                                        
263                                        if(val[0] == 'texto'){
264                                            var valores = val[1].split(',');
265                                            $.each(class_obs.registros.anios, function(a, vala){
266                                                class_obs.registros.textos[vala] = [];
267                                                class_obs.registros.textos[vala] = class_obs.registros.textos[vala].concat(valores);
268                                                
269                                                
270                                                gapi.client.sheets.spreadsheets.values.get({
271                                                spreadsheetId: b(env.sIdObs),
272                                                range: valores
273                                                }).then(function(responsetxt) {
274                                                    var valuestxt = responsetxt.result.values;
275                                                     $.each(valuestxt, function(itxt, valtxt){
276                                                         if( valtxt[valuestxt[0].indexOf(class_obs.cons._SECCION)] !== undefined ){
277                                                            var obj = {};
278                                                            obj.id = valtxt[valuestxt[0].indexOf(class_obs.cons._SECCION)];
279                                                            obj.texto = valtxt[valuestxt[0].indexOf(class_obs.cons._TEXTO)];
280                                                            class_obs.registros.textos[vala].push(obj);
281                                                        }
282                                                     });
283                                                });
284                                            });
285                                        }
286                                        
287                                    }catch(error){
288                                        console.
288log('Falta algún dato');
289                                    }
290                                });
291                            
292                            for(var e = 0; e < parseInt(class_obs.registros.rencabezado[anio_select][0]); e++){
293                                class_obs.registros.row_encabezados.push(e);
294                                if(class_obs.registros.encabezado[anio_select][e] == undefined){
295                                    class_obs.registros.encabezado[anio_select][e] = [];
296                                }
297                            }
298                            
299                            gapi.client.sheets.spreadsheets.get({
300                                    spreadsheetId: b(env.sIdObs),
301                                    ranges: [anio_select],
302                                    includeGridData: true
303                                }).then(function(response2) {
304                                    var values2 = response2.result.sheets[0].data[0].rowData;
305                                    var anio = anio_select;
306                                    
307                                    class_obs.num_encabezados = 0;
308                                    if(values == undefined){
309                                        datos_anio = false;
310                                    }
311                                    
312                                    //Encabezados
313                                    th_inter = '';
314                                    var tfoot_tr = '';
315                                    var tfoot_inter = '';
316                                    var bfoot = false;
317                                    $.each(values2, function(i, val){
318                                        if(i in class_obs.registros.row_encabezados){
319                                            th_inter += '<tr>';
320                                            var saltar = 0;
321                                            class_obs.num_encabezados = 0;
322                                            //Recorrido de los encabezados
323                                            var conteo_th = 0;
324                                            $.each(val.values, function(i2, val2){
325                                                if(i2 > parseInt(class_obs.registros.totales[anio])-1){
326                                                    return false;
327                                                }
328                                                var val2txt = "";
329                                                var bcolor = "";
330                                                
331                                                if('formattedValue' in val2){
332                                                    val2txt = val2.formattedValue;
333                                                    bcolor = val2.effectiveFormat.backgroundColor;
334                                                    var r = ('red' in bcolor)?bcolor.red:0;
335                                                    var g = ('green' in bcolor)?bcolor.green:0;
336                                                    var b = ('blue' in bcolor)?bcolor.blue:0;
337                                                    bcolor = 'rgb(' + r*255 + ',' + g*255 + ',' + b*255 + ')';
338                                                }
339                                                        
340                                                if(saltar > 0){
341                                                    saltar = saltar - 1;
342                                                    conteo_th++;
343                                                    return;
344                                                }
345                                                //No incluye las columnas quue se indicó ocultar en "config"
346                                                if(class_obs.registros.ocultar[anio].indexOf(String(i2+1)) == -1){
347                                                    //Columnas para buscar
348                                                    if(class_obs.registros.buscar[anio].indexOf(String(i2+1)) != -1){
349                                                        class_obs.html_opciones += class_obs.opcion_busca.replace('<opcion>', val2txt.replaceAll('\n','<br>')).replace('<id>', i2);
350                                                        class_obs.html_opciones_select[i2] = [];
351                                                        class_obs.html_opciones_select[i2].push('<option value=""></option>');
352                                                    }
353                                                    //Columnas que se incluyen en una llamada "Incluído en"
354                                                    if(class_obs.registros.incluir.valores[anio].indexOf(String(i2+1)) != -1){
355                                                        //Sólo ingrsa una vez, para crear una vez el encabezado y contabilizarlo
356                                                        if(class_obs.registros.incluir.texto.length == 0){
357                                                            class_obs.num_encabezados ++;
358                                                            conteo_th++;
359                                                            th_inter += class_obs.th_inter.replace('<tx_text>', "Incluído en");
360                                                        }
361                                                        class_obs.registros.incluir.texto[class_obs.registros.incluir.valores[anio].indexOf(String(i2+1))] = val2txt;
362                                                    }else{
363                                                        class_obs.num_encabezados ++;
364                                                        conteo_th++;
365                                                        th_inter += class_obs.th_inter.replace('<tx_text>', val2txt.replaceAll('\n', '<br>') );
366                                                    }
367
368                                                    var num_col = 1;
369                                                    var num_row = 1;
370
371                                                    //Si la columna está en alguna agrupación
372                                                    if(class_obs.registros.encabezado[anio][i][i2+1] !== undefined){
373                                                        num_col = class_obs.registros.encabezado[anio][i][i2+1];
374                                                        saltar = num_col - 1;
375                                                    }
376
377                                                    th_inter = th_inter.replace('<numcol>', num_col);
378                                                    th_inter = th_inter.replace('<numrow>', num_row);
379                                                    th_inter = th_inter.replace('<color-fondo>', bcolor);
380
381                                                    //Se llega a la última columna encontrada
382                                                    if(i2 == val.values.length-1){
383                                                        console.log('tam:' + conteo_th);
384                                                        //Si hay menos columnas de las especificadas como total, el resto se llena de blancos
385                                                        var revisa_columnas = parseInt(class_obs.registros.totales[anio_select]) - class_obs.registros.ocultar[anio_select].length - conteo_th;
386
387                                                        console.log(revisa_columnas);
388                                                        if(revisa_columnas >0){
389                                                            $.each(new Array(revisa_columnas).fill(''), function(r, rval){
390                                                                th_inter += class_obs.th_inter.replace('<tx_text>', "" ).replace('<numcol>',1).replace('<numrow>',1).replace('<color-fondo>', '');
391                                                            });
392                                                        }
393                                                    }
394                                                }
395                                            });
396                                            th_inter += '</tr>';
397                                            $('#opciones').html(class_obs.html_opciones);
398                                        }else{
399                                            var registro = {};
400                                            var tabla_tr = '';
401                                            var td_inter = '';
402                                            var num_valores = 0;
403                                            var incluido_en = 0;
404                                            var txt_incluido_en = '';
405                                            var primera = -1;
406                                            
407                                            //if(val.values.every(cell => !cell.formattedValue)){
408                                            if(val.values.some(cell => cell.formattedValue)){
409                                                    
410                                            //Recorrido de los valores en cada registro
411                                            $.each(val.values, function(i2, val2){
412												if(i2 > parseInt(class_obs.registros.totales[anio])-1){
413                                                    return false;
414                                                }
415                                                var val2txt = "";
416                                                var bcolor = "";
417                                                
418                                                if('formattedValue' in val2){
419                                                    val2txt = val2.formattedValue;
420                                                    bcolor = val2.effectiveFormat.backgroundColor;
421                                                    var r = ('red' in bcolor)?bcolor.red:0;
422                                                    var g = ('green' in bcolor)?bcolor.green:0;
423                                                    var b = ('blue' in bcolor)?bcolor.blue:0;
424                                                    bcolor = 'rgb(' + r*255 + ',' + g*255 + ',' + b*255 + ')';
425                                                }
426                                                /*if(i2 == 0 && val2txt==""){
427                                                    return false;
428                                                }*/
429                                                //No incluye las columnas quue se indicó ocultar en "config"
430                                                if(class_obs.registros.ocultar[anio].indexOf(String(i2+1)) == -1){
431                                                    primera ++;
432                                                    //if(primera == 0 && (val2txt.indexOf('TOTAL ') !== -1 || val2txt.trim()=='TOTAL' ) ){
433                                                    //    bfoot = true;
434                                                    //}
435                                                    if(primera == 0 && (values2[i+1].values.every(cell => !cell.formattedValue)) ){
436                                                        bfoot = true;
437                                                    }
438                                                    //Columnas para buscar
439                                                    if(class_obs.registros.buscar[anio].indexOf(String(i2+1)) != -1 ){
440                                                        if(['-',''].indexOf(val2txt) == -1){
441                                                            var opcion = '<option value="'+val2txt+'">'+val2txt+'</option>';
442                                                            if( class_obs.html_opciones_select[i2].indexOf(opcion) == -1){
443                                                                class_obs.html_opciones_select[i2].push(opcion);
444                                                            }
445
446                                                        }
447                                                        if(i == values.length-1){
448                                                            class_obs.html_opciones_select[i2].sort();
449                                                        }
450                                                    }
451
452                                                    //Columnas que se incluyen en una sóla llamada "Incluído en"
453                                                    if(class_obs.registros.incluir.valores[anio].indexOf(String(i2+1)) != -1){
454                                                        incluido_en ++;
455                                                        var txt = class_obs.registros.incluir.texto[class_obs.registros.incluir.valores[anio].indexOf(String(i2+1))];
456                                                        txt_incluido_en += (txt_incluido_en.length > 0)?(val2txt.trim() == '1')?(', ' + txt ):'':(val2txt.trim() == '1')?txt:'';
457                                                        if(incluido_en == class_obs.registros.incluir.valores[anio].length){
458                                                            num_valores++;
459                                                            if(bfoot){
460                                                                tfoot_inter += class_obs.td_inter_fijo.replace('<td_text>', txt_incluido_en);
461                                                            }else{
462                                                                td_inter += class_obs.td_inter.replace('<td_text>', txt_incluido_en);
463                                                                registro[i2] = txt_incluido_en;
464                                                            }
465                                                        }
466                                                    }else{
467                                                        if(class_obs.registros.numerico[anio].indexOf(i2+1) != -1){
468                                                            num_valores++;
469                                                            var pre = '';
470                                                            if( val2txt == "" || val2txt == "N/A"){
471                                                                pre = '<span hidden>0.0000000001</span>';
472                                                            }
473                                                            if(primera == 0){
474                                                                if(bfoot){
475                                                                    tfoot_tr = class_obs.tabla_tr_fijo.replace('<primero>', val2txt);
476                                                                }else{
477                                                                    tabla_tr = class_obs.tabla_tr.replace('<primero>', val2txt);
478                                                                }
479                                                            }else{
480                                                                if(bfoot){
481                                                                    tfoot_inter += class_obs.td_inter_fijo.replace('<td_text>', val2txt);
482                                                                }else{
483                                                                    td_inter += class_obs.td_inter.replace('<td_text>', pre + val2txt);
484                                                                }
485                                                            }
486                                                            registro[i2] = val2txt;
487                                                        }else if(class_obs.registros.url[anio].indexOf(i2+1) != -1){
488                                                            num_valores++;
489                                                            var pre = '';
490                                                            var enlaces =''
491                                                            $.each(val2txt.split('\n'), function(i3,val3){
492                                                                enlaces += '<a target="_blank" href="'+val3+'">
492'+val3+'</a><br>';
493                                                            });
494                                                            if(primera == 0){
495                                                                if(bfoot){
496                                                                    tfoot_tr = class_obs.tabla_tr_fijo.replace('<primero>', val2txt);
497                                                                }else{
498                                                                    tabla_tr = class_obs.tabla_tr.replace('<primero>', enlaces);
499                                                                }
500                                                            }else{
501                                                                if(bfoot){
502                                                                    tfoot_inter += class_obs.td_inter_fijo.replace('<td_text>', val2txt);
503                                                                }else{
504                                                                    td_inter += class_obs.td_inter.replace('<td_text>', enlaces);
505                                                                }
506                                                            }
507                                                            registro[i2] = val2txt;
508                                                        }else{
509                                                            num_valores++;
510                                                            if(primera == 0){
511                                                                if(bfoot){
512                                                                    tfoot_tr = class_obs.tabla_tr_fijo.replace('<primero>', val2txt);
513                                                                }else{
514                                                                    tabla_tr = class_obs.tabla_tr.replace('<primero>', val2txt);
515                                                                }
516                                                            }else{
517                                                                if(bfoot){
518                                                                    tfoot_inter += class_obs.td_inter_fijo.replace('<td_text>', val2txt);
519                                                                }else{
520                                                                    td_inter += class_obs.td_inter.replace('<td_text>', val2txt);
521                                                                }
522                                                            }
523                                                            registro[i2] = val2txt;
524                                                        }
525                                                        
526                                                        td_inter = td_inter.replace('<bcolor>', bcolor);
527                                                        tfoot_inter = tfoot_inter.replace('<bcolor>', bcolor);
528                                                        
529                                                    }
530                                                }
531                                            });
532                                            
533                                            
534                                            if(parseInt(class_obs.registros.totales[anio])-1 - num_valores > 0){
535                                                $.each(new Array(parseInt(class_obs.registros.totales[anio])-1 - num_valores).fill(''), function(i2, val2){
536                                                    td_inter += class_obs.td_inter.replace('<td_text>', val2);
537                                                    tfoot_inter += class_obs.td_inter_fijo.replace('<td_text>', val2).replace('<bcolor>', '');
538                                                    //registro[num_valores + i2 + 1] = val2;
539                                                });
540                                            }
541
542                                            class_obs.tabla_body += tabla_tr.replace('<tds_inter>', td_inter);
543                                            if(registro.hasOwnProperty(1))
544                                                class_obs.registros.completos.push(registro);
545                                            }
546                                        }
547                                    });
548                                    class_obs.tabla_th = class_obs.tabla_th_orig.replace('<encabezados>', th_inter);
549                                    class_obs.tabla_th = class_obs.tabla_th.replace('<totales>', tfoot_tr.replace('<tds_inter>', tfoot_inter));
550                                    
551                                    class_obs.html_anios = '';
552                                    var opciones_anio = '';
553                                    $.each(class_obs.anios, function(i, val){
554                                        class_obs.html_anios += class_obs.opcion_anio.replace('<opcion>', val.replaceAll('\n','<br>')).replace('<id>', val);
555                                        if(i == 0){
556                                            opciones_anio = val;
557                                            class_obs.html_anios_select = [];
558                                        }
559                                        var opcion = '<option value="'+val+'">'+val+'</option>';
560                                        class_obs.html_anios_select.push(opcion);
561                                    });
562
563                                    $('#opciones-anio').html(class_obs.html_anios);
564                                    $('#buscar-anio').text(anio);
565
566                                    if(datos_anio){
567                                        class_obs.setTextos(anio_select);
568                                        class_obs.setTabla();
569                                        $('#registros').html("<b>" + (class_obs.registros.completos.length-1) + "</b> Registros encontrados");
570                                        $('#div_tabla').show();
571                                    }else{
572                                        $('#tbl_revistas_wrapper').html('');
573                                        $('#registros').html("Sin registros encontrados");
574                                    }
575                                    
576                                    class_obs.control();
577                                });
578                       
579                    }).catch(function(error) {
580                        console.error('Error al obtener los valores de las hojas:', error);
581                    });
582                }).catch(function(error) {
583                    console.error('Error al obtener las hojas del libro:', error);
584                });
585            });
586        });
587    },
588    setTextos: function(anio_select){
589        $.each(class_obs.registros.textos[anio_select], function(i,val){
590            if(typeof(val) == 'object')
591                $('#'+val.id).html(val.texto.replaceAll('<ul>', '<ul style="padding-left:20px;list-style-type:disc;">').replaceAll('<ul2>', '<ul style="padding-left:20px;list-style-type:circle;">'));
592        });
593    },
594    setTabla: function(){
595        //try{
596            if( class_obs.tabla !== ''){
597                //$('#tbl_revistas_wrapper').html('');
598                class_obs.tabla.destroy();
599            }
600            //if ($.fn.DataTable.isDataTable('#tbl_revistas')) {
601            //    class_obs.tabla.destroy();
602            //}
603            
604            $('#div_tabla').html(class_obs.tabla_html);
605            $('#tbl_revistas').html(class_obs.tabla_th);
606            $('#tabla_body').html(class_obs.tabla_body);
607            
608            var anio = $('#buscar-anio').text();
609
610            var targets = [];
611            for(num = 0; num < parseInt(class_obs.registros.totales[anio][0]) - (class_obs.registros.ocultar[anio].length) ; num++){
612               targets.push(num);
613            };
614
615            var extra={
616                        //pageLength: 15,
617                        deferRender: true,
618                        columnDefs: [
619                            {
620                                render: function (data, type, full, meta) {
621                                    return '<div style="width: 100%; text-align: left; white-space: normal;">' + data + '</div>';
622                                },
623                                targets: targets
624                            }
625                        ],
626                        scrollY:        500,
627                        scrollX:        true,
628                        scrollCollapse: true,
629                        paging:         true,
630                        fixedColumns:   {
631                            leftColumns: parseInt(class_obs.registros.fijas[anio][0])//Le indico que deje fijas solo las 2 primeras columnas
632                        }
633                    };
634                    
635            class_obs.tabla = class_utils.setTabla('tbl_revistas', extra);
636            
637            if(class_obs.registros.paginado.valores[anio][0] == 0){
638                class_obs.tabla.page.len(-1); // Muestra todos los registros en una única página
639                $('.dataTables_paginate').hide(); // Oculta los controles de paginación
640            }else{
641                class_obs.tabla.page.len(class_obs.registros.paginado.valores[anio]);
642            }
643
644            $('.buttons-csv span').html('Descargar .csv');
645            $("#tbl_revistas_filter").off('keyup mouseover').on('keyup mouseover', function(){
646                    $('#registros').html("<b>" + $('#tbl_revistas_info').html().split('total de ')[1].split(' registros')[0] + "</b> Registros encontrados");
647            });
648            
649            $('#tbl_revistas_filter').children("label").first()[0].childNodes[0].nodeValue="Filtrar por:";
650            
651            class_obs.tabla.draw();
652
653        //}catch(error){
654        //    console.log('Error al construir tabla:' + error);
655        //}
656    },
657    control: function(){        
658        $('.menu-busca-por').off('click').on('click', function(e){
659            e.preventDefault();
660            class_obs.id_buscar = this.id;
661            $('#buscar').html(class_obs.html_opciones_select[parseInt(this.id
661)]);
662            $('#buscar-por').text(this.text);
663            $('#buscar').select2({ tags: true, placeholder: "Seleccione una opción", allowClear: true});
664            $('.select2-selection').height('40px');
665            $('.select2-selection').css('padding-top', '5px');
666            $('.select2-selection__arrow').css('top', '5px');
667            $('.select2-container').css('width', '100%');
668            
669        });
670        
671        $('#buscar').off('change').on('change', function(e){
672            //$('#registros').html('');
673            if($('#tbl_revistas_wrapper')[0] == undefined)
674                    $('#tbl_revistas').html('<center><div id="inicio" class="preview" style="font-size: 20px"> <br><br><i class="ti-search"></i>&nbsp;&nbsp;&nbsp;Buscando ...<br><br></div></center>');
675            else
676                    $('#tbl_revistas_wrapper').html('<center><div id="inicio" class="preview" style="font-size: 20px"> <br><br><i class="ti-search"></i>&nbsp;&nbsp;&nbsp;Buscando ...<br><br></div></center>');
677            $('#registros').html('');
678            setTimeout(function(){
679                    class_obs.buscar();
680            }, 1000);
681        });
682        
683        $('.menu-anio').off('click').on('click', function(e){
684            e.preventDefault();
685            $('#buscar-por').text("Buscar por:");
686            $('#buscar').html('');
687            if($('#tbl_revistas_wrapper')[0] == undefined)
688                    $('#tbl_revistas').html('<center><div id="inicio" class="preview" style="font-size: 20px"> <br><br><i class="ti-search"></i>&nbsp;&nbsp;&nbsp;Buscando ...<br><br></div></center>');
689            else
690                    $('#tbl_revistas_wrapper').html('<center><div id="inicio" class="preview" style="font-size: 20px"> <br><br><i class="ti-search"></i>&nbsp;&nbsp;&nbsp;Buscando ...<br><br></div></center>');
691            $('#registros').html('');
692            
693            $('#buscar-anio').text(this.text);
694            class_obs.datos(this.id);
695        });
696    },
697    buscar: function(){
698        class_obs.registros.filtro = class_utils.filter_like_props(class_obs.registros.completos, [class_obs.id_buscar], $('#buscar').val());
699        class_obs.tabla_body = '';
700        $.each(class_obs.registros.filtro, function(i, val){
701            var td_inter = '';
702            var tabla_tr = '';
703            var num_valores = 0;
704            $.each(val, function(i2, val2){
705                num_valores ++;
706                if(i2 == 0){
707                    tabla_tr = class_obs.tabla_tr.replace('<primero>', val2);
708                }else{
709                    td_inter += class_obs.td_inter.replace('<td_text>', val2);
710                }
711            });
712            $.each(new Array(class_obs.num_encabezados - num_valores).fill(''), function(i2, val2){
713                td_inter += class_obs.td_inter.replace('<td_text>', val2);
714            });
715            class_obs.tabla_body += tabla_tr.replace('<tds_inter>', td_inter);
716        });
717        class_obs.setTabla();
718        $('#registros').html("<b>" + (class_obs.registros.filtro.length-1) + "</b> Registros encontrados");
719    }
720};

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.