PageSourceSearch

https://www.bne.cl/static/scripts/js/common.js?v=3.88.01_20260930090159_

js bne.cl collected 2026-10-03 21:05:17 UTC 11,921 bytes, 345 lines download raw bytes

1/**
2 * Perimite comprobar que el fichero que se va a subir no exceda el tamaño indicado en el segundo parámetro.
3 * Requeire que se le envie como primer parametro el id del inputFile y como segundo el mañano máximo de este en bytes
4 * Como tercer parámetro espera el indice del fichero a comprobar. En caso de singleFile el parámetro siemrpe será cero
5 * y no es necesario enviarlo.
6 */
7function checkFileSize(fileFieldId, maxFileSize, index = 0) {
8    var input = document.getElementById(fileFieldId);
9    if (!input.files) { // This is VERY unlikely, browser support is near-universal
10        console.error("This browser doesn't seem to support the `files` property of file inputs.");
11        return true;
12    } else {
13        var file = input.files[index];
14        if (file.size > maxFileSize) {
15            return false;
16        } else {
17            return true;
18        }
19    }
20}
21
22/**
23 * Perimite comprobar la extension del fichero que se va a subir.
24 */
25function getExtension(fileFieldId, index = 0) {
26    var input = document.getElementById(fileFieldId);
27    if (!input.files) { // This is VERY unlikely, browser support is near-universal
28        console.error("This browser doesn't seem to support the `files` property of file inputs.");
29        return true;
30    } else {
31        var file = input.files[index];
32        var parts = file.name.split('.');
33        return parts[parts.length - 1];
34    }
35}
36
37/**
38 * Registra un como (Comunas) como actualizable a partir del combo de Regiones.
39 * Recibe el id del select de regiones, comunas, y un boolean indicando si se
40 * debe dejar el primer resultado en blanco. También actualiza el combo de
41 * comunas si el de región tiene algún valor (distinto de vacío o -1),
42 * si el último parámetro es true.
43 */
44function registrarComboComunas(idRegiones, idComunas, dejarBlanco) {
45    $("#" + idRegiones).on("change", function() {
46        cambiarSelectComunas(idRegiones, idComunas, dejarBlanco);
47    });
48
49}
50
51/**
52 * Actualiza el select de Comunas en función de la región. Se permite indicar si el primer
53 * valor debe ser blanco
54 */
55function cambiarSelectComunas(idRegiones, idComunas, dejarBlanco) {
56    var valorRegiones = $("#" + idRegiones).val();
57
58    if (!valorRegiones || $.trim(valorRegiones) == "") {
59        limpiarCombo(idComunas);
60    } else {
61        $.getJSON("/data/generic/comunas/" + valorRegiones, function(json) {
62            alimentarSelectJSON(idComunas, json, dejarBlanco);
63        });
64    }
65};
66
67/**
68 * Actualiza el combo indicado, mediante datos JSON de pares 'codigo'/'valor'
69 */
70function alimentarSelectJSON(idSelect, json, dejarBlanco){
71    var listItems = "";
72    if (dejarBlanco) {
73        listItems += "<option value=''></option>";
74    }
75    for (var i = 0; i < json.length; i++) {
76        listItems += "<option value='" + json[i].codigo + "'>" + json[i].valor + "</option>";
77    }
78    $("#" + idSelect).html(listItems);
79}
80
81/**
82 * Deja el combo indicado con una única opción vacía
83 */
84function limpiarSelect(idSelect){
85    $("#" + idSelect).html("<option value=''></option>");
86}
87
88function isUndefined(object)
89{
90    if(object == 'undefined')
91    {
92          return "";
93    }
94    else
95    {
96        return object;
97    }
98
99}
100
101/**
102 * Recibe el id de un span con los atributos:
103 *   - data-dir : parte de usuario de una dirección de email
104 *   - data-server : parte de dominio sin extensión de una dirección de email
105 *   - data-extension : extensión del dominio de la dirección de email
106 * @param idSpan
107 * @returns
108 */
109function establecerEmail(idSpan){
110    var s = $("#" + idSpan);
111    var dir = s.data("dir") + "@" + s.data("server") + "." + s.data("extension");
112    var anchor = "<a href='mailto:" + dir + "'>" + dir + "</a>";
113    s.html(anchor);
114}
115
116/**
117 * Recibe el prefijo de un ''array'' de id de un span con los atributos:
118 *   - data-dir : parte de usuario de una dirección de email
119 *   - data-server : parte de dominio sin extensión de una dirección de email
120 *   - data-extension : extensión del dominio de la dirección de email
121 * El segundo parámetro es el índice inicial
122 * La función recorrerá todos los idSpan comenzando por idSpan1 hasta que no encuentre el siguiente id.
123 * @param idSpan
124 * @returns
125 */
126function establecerEmails(idSpan, startIndex){
127    var i = startIndex;
128    var current = $('#' + idSpan + i);
129    while (current.length){
130        establecerEmail(current.attr('id'));
131        current = $('#' + idSpan + ++i);
132    }
133}
134
135/**
136 * Complemento a establecerEmails cuando el enlace es compuesto (imagen + enlace, por ejemplo). Cambia únicamente el href
137 * del elemento recibido sin generar contenido.
138 * @param idHref
139 * @returns
140 */
141function establecerEmailHref(idHref) {
142    let enlace = $('#' + idHref);
143    let dir = "mailto:" + enlace.data("dir") + "@" + enlace.data("server") + "." + enlace.data("extension");
144    enlace.attr('href', dir);
145}
146
147/**
148 * Lee el CSRF Token del input oculto si existe y lo añade a la request. Si no existe el input que contiene el token, no hace nada.
149 * @param request request de la petición AJAX en la que incluir la cabecera con el token
150 */
151function setXCSRFTokenHeader(request){
152    var hiddenInput = $('input[name=_csrf]');
153    if (hiddenInput.length > 0){
154        request.setRequestHeader("X-CSRF-TOKEN", hiddenInput.val());
155    }
156}
157
158/**
159 * Dadas dos fechas, indica el periodo en meses. en caso de no venir alguna, nos devuelve texto vacio
160 */
161var calcularMeses = function(fechaIni,fechaFin) {
162    var exp;
163    if (fechaIni.trim() && fechaFin.trim()) {
164        var meses;
165        meses = (toDate(fechaFin).getFullYear() - toDate(fechaIni).getFullYear()) * 12;
166        meses -= toDate(fechaIni).getMonth();
167        meses += toDate(fechaFin).getMonth();
168        if(toDate(fechaFin).getDate() < toDate(fechaIni).getDate()){
169            meses -= 1;
170        }
171        if (meses > 0) {
172            exp = meses;
173        } else {
174            exp = 0;
175        }
176    } else {
177        exp = "";
178    }
179    return exp;
180}
181
182function put(data, destUrl, successCallback, errorCallback, alwaysCallback) {
183    _ajax(data, destUrl, 'PUT', successCallback, errorCallback, alwaysCallback);
184}
185
186function get(destUrl, successCallback, errorCallback, alwaysCallback) {
187    _ajax(null, destUrl, 'GET', successCallback, errorCallback, alwaysCallback);
188}
189
190function post(data, destUrl, successCallback, errorCallback, alwaysCallback) {
191    _ajax(data, destUrl, 'POST', successCallback, errorCallback, alwaysCallback);
192}
193
194function delet(destUrl, successCallback, errorCallback, alwaysCallback) {
195    _ajax(null, destUrl, 'DELETE', successCallback, errorCallback, alwaysCallback);
196}
197
198function _ajax(data, destUrl, verb, successCallback, errorCallback, alwaysCallback) {
199    var jqxhr = $.ajax({
200        url : destUrl,
201        type : verb,
202        contentType : "application/json",
203        data : data,
204        beforeSend : function(request) {
205            setXCSRFTokenHeader(request);
206        }
207    }).done(function(data, textStatus, jqXHR) {
208        if (successCallback) {
209            successCallback(data, textStatus, jqXHR);
210        }
211    }).fail(function(jqXHR, textStatus, errorThrown) {
212        if (errorCallback) {
213            errorCallback(jqXHR, textStatus, errorThrown);
214        } else {
215            genericErrorCallback(jqXHR, textStatus, errorThrown);
216        }
217    }).always(function() {
218        if (alwaysCallback) {
219            alwaysCallback();// TODO parámetros
220        }
221    });
222}
223
224//https://stackoverflow.com/a/35713609
225function s2ab(s) {
226    var buf = new ArrayBuffer(s.length);
227    var view = new Uint8Array(buf);
228    for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
229    return buf;
230}
231
232/**
233 * Genera descarga 'offline' de un fichero recibido en B64
234 * @param data
235 * @param filename
236 * @returns
237 */
238function generarDescargaLocalB64(data, filename){
239    var blob = new Blob([s2ab(atob(data))], {
240        type: ''
241    });
242    
243    var link = document.createElement('a');
244    link.href = window.URL.createObjectURL(blob);
245    link.download = filename;
246    link.style.display = 'none';
247
248    document.body.appendChild(link);
249    link.click();
250    document.body.removeChild(link);
251    window.URL.revokeObjectURL(blob);
252}
253
254//https://css-tricks.com/snippets/javascript/htmlentities-for-javascript/
255function htmlEntities(str) {
256    return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;')
257        .replace(/'/g, '&apos;');
258}
259
260/**
261 * Recoge el nombre de enlaces para no ser rastreados
262 * */
263function establecerMailDeferred(idSpan){
264    $(document).ready(function() {
265        establecerEmail(idSpan);
266    });
267}
268
269/**
270 * Crea un contador (dependencia a CountUp.js), permitiendo sobrecargar los valores por defecto 
271 * de la animación. Se debe indicar el ID del elemento que tendrá el texto y el attributo data-count
272 * necesarios para setear los números y coger el valor final del contador. Si se lanzará iniciado y opcionalmente los
273 * parámetros de sobrecarga.
274 * Devuelve el contador creado por si se quiere gestionar posteriormente.
275 * @returns
276 */
277function crearContador(elemId, iniciar, options) {
278    let valorFinal = $('#' + elemId).data('count');
279
280    let contador;
281    if (options) {
282        contador = new CountUp(elemId, valorFinal, options);
283    } else {
284        contador = new CountUp(elemId, valorFinal);
285    }
286    
287    if (iniciar) {
288        contador.start();
289    }
290
291    return contador;
292}
293
294// Dada una fecha, la devuelve sumandole el numero de meses pasador como parametro
295function _addMeses(fecActive, meses) {
296    if (fecActive != "" && meses != "") {
297        var date = new Date(_validDateFormat(fecActive));
298        date.setMonth(date.getMonth() + parseInt(meses));
299        var newdateFecFin = new Date(date.getFullYear(), date.getMonth(), parseInt(date.getDate()));
300        //newdateFecFin.setDate(newdateFecFin.getDate() + parseInt(meses));
301
302        var dd = newdateFecFin.getDate();
303        var mm = newdateFecFin.getMonth() + 1;
304        var y = newdateFecFin.getFullYear();
305
306        return [ dd, mm, y ].join('/');
307    } else {
308        return "";
309    }
310}
311
312// Devuelve la fecha en formato mm/dd/YYYY
313function _validDateFormat(fecActive) {
314    var day = fecActive.split("/")[0];
315    var month = fecActive.split("/")[1];
316    var year = fecActive.split("/")[2];
317    return [ month, day, year ].join('/');
318}
319
320// Reemplaza el patrón window.location.href + setTimeout, que en iOS Safari
321// disparaba el diálogo de descarga al recibir 204 No Content del endpoint.
322// El fetch es fire-and-forget; el callback se invoca cuando termina la
323// petición o tras 1500 ms (lo que ocurra primero) para no quedar colgado
324// en redes mal conectadas.
325function cerrarSesionClaveUnica(callback) {
326    var timeout = new Promise(function(resolve) { setTimeout(resolve, 1500); });
327    var request = fetch('https://accounts.claveunica.gob.cl/api/v1/accounts/app/logout', {
328        method: 'GET', mode: 'no-cors', credentials: 'include'
329    }).catch(function() { /* ignorar errores de red */ });
330    Promise.race([request, timeout]).finally(function() {
331        if (typeof callback === 'function') callback();
332    });
333}
334
335// Método 2 de la guía ClaveÚnica: cierra la sesión SSO con navegación real
336// del navegador y, tras ~1s, continúa al authorize (urlContinuar).
337function prepararLoginClaveUnica(urlContinuar) {
338    if (!urlContinuar) {
339        return;
340    }
341    window.location.href = 'https://accounts.claveunica.gob.cl/api/v1/accounts/app/logout';
342    setTimeout(function() {
343        window.location.href = urlContinuar;
344    }, 1000);
345}

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.