PageSourceSearch

https://www.alcaldiapitalito.gov.co/mod/Bloques/js/bloqueHeader.js?nxcache=1728313783

js alcaldiapitalito.gov.co collected 2026-09-25 04:17:04 UTC 11,648 bytes, 342 lines download raw bytes

1// function googleTranslateElementInit() {
2
3//     new google.translate.TranslateElement(
4//         { pageLanguage: 'es', autoDisplay: false },
5//         'google_translate_element'
6//     );
7
8//     let cookieGoogtrans = document.cookie.match(/googtrans=(.*?)(;|$)/g);
9
10//     if (cookieGoogtrans && cookieGoogtrans.length > 1) {
11//         console.warn("¡Hay duplicadas!");
12//     }
13
14//     window.onunload = function () {
15//         killDobleTranslateCookie();
16//     };
17
18//     if (document.readyState === "complete") {
19//         interval = setInterval(() => {
20//             killDobleTranslateCookie();
21//             clearInterval(interval);
22//         }, 1000);
23//     } else {
24//         window.addEventListener("load", function () {
25//             interval = setInterval(() => {
26//                 killDobleTranslateCookie();
27//                 clearInterval(interval);
28//             }, 1000);
29//         }, false);
30//     }
31// }
32
33// function killDobleTranslateCookie() {
34//     const host = window.location.hostname;
35
36//     // Elimina variantes previas
37//     document.cookie = "googtrans=; path=/; domain=" + host + "; expires=Thu, 01 Jan 1970 00:00:01 GMT;";
38//     document.cookie = "googtrans=; path=/; domain=." + host + "; expires=Thu, 01 Jan 1970 00:00:01 GMT;";
39
40//     let pathname = window.location.pathname;
41//     if (pathname !== '' && pathname !== '/') {
42//         document.cookie = "googtrans=; path=" + pathname + "; expires=Thu, 01 Jan 1970 00:00:01 GMT;";
43//     }
44
45//     // Detecta protocolo
46//     const isHttps = window.location.protocol === "https:";
47//     let attrs = "path=/";
48//     if (isHttps) {
49//         attrs += "; samesite=None; secure";
50//     } else {
51//         attrs += "; samesite=Lax";
52//     }
53
54//     // Expiración en 9 horas
55//     const expires = new Date(Date.now() + 9 * 60 * 60 * 1000).toUTCString();
56//     attrs += "; expires=" + expires;
57
58//     // Idioma dinámico
59//     let idioma = "es";
60//     const match = document.cookie.match(/idioma=([^;]+)/);
61//     if (match) {
62//         idioma = match[1];
63//     } else if (document.documentElement.lang) {
64//         idioma = document.documentElement.lang;
65//     }
66
67//     // Construye valor dinámico
68//     let cookieValue = "/es/" + idioma;
69
70//     // Recrea cookie normalizada
71//     document.cookie = "googtrans=" + cookieValue + "; domain=" + host + "; " + attrs;
72// }
73
74/**
75 * 1. Inicializador de Google Translate (GLOBAL)
76 */
77window.googleTranslateElementInit = function() {
78    console.log("Motor de Google inicializadooo.");
79    if (typeof google !== 'undefined' && google.translate) {
80        new google.translate.TranslateElement({
81            pageLanguage: 'es', 
82            autoDisplay: false
83        }, 'google_translate_element');
84    }
85}
86
87
88$(document).ready(function () {
89
90    function aplicarInterfaz(lang) {
91        // 1. Normalizamos a Mayúsculas (para que coincida con data-lang="ES" o "EN")
92        const searchLang = lang.toUpperCase().trim();
93        
94        // 2. IMPORTANTE: Quitamos la clase de TODOS los botones primero
95        // Esto asegura que si había uno oculto, se vuelva a mostrar
96        $(".idiomaHiper").removeClass("lang_active");
97        
98        // 3. Buscamos el botón que debe ocultarse (el idioma actual)
99        const botonParaOcultar = $(`.idiomaHiper[data-lang="${searchLang}"]`);
100        
101        if (botonParaOcultar.length > 0) {
102            console.warn("Ocultando");
103            //  añadir esta clase, ya el  CSS del heade.css (.lang_active { display: none; }) hará el resto
104            botonParaOcultar.addClass("lang_active");
105        }
106
107        // 4.  lógica del body para estilos adicionales
108        $("body").removeClass(function (index, className) {
109            return (className.match(/(^|\s)translate_\S+/g) || []).join(' ');
110        });
111        $("body").addClass("translate_" + lang.toLowerCase());
112    }
113
114    function gestionarCookiesYTraduccion(lang) {
115        const cleanLang = lang.toLowerCase();
116        const googleValue = `/es/${cleanLang}`;
117        const hostname = window.location.hostname;
118        const isSecure = window.location.protocol === 'https:';
119
120        const domainParts = hostname.split('.');
121        let parentDomain = '';
122        if (domainParts.length > 2) {
123            parentDomain = '.' + domainParts.slice(-2).join('.');
124        } else {
125            parentDomain = hostname;
126        }
127
128        // --- LIMPIEZA TOTAL ---
129        const cookiesToClean = ['googtrans', 'idioma'];
130        cookiesToClean.forEach(cookieName => {
131            document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;
132            if (parentDomain) {
133                document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; domain=${parentDomain};`;
134            }
135        });
136
137        // --- CREACIÓN SEGURA ---
138        const exdate = new Date();
139        exdate.setTime(exdate.getTime() + (24 * 60 * 60 * 1000));
140        const expires = "expires=" + exdate.toUTCString();
141        
142        // Atributos de seguridad ajustados
143        let cookieAttributes = `; ${expires}; path=/; SameSite=Lax${isSecure ? '; Secure' : ''}`;
144        if (parentDomain) {
145            cookieAttributes += `; domain=${parentDomain}`;
146        }
147
148        document.cookie = `googtrans=${googleValue}${cookieAttributes}`;
149        document.cookie = `idioma=${cleanLang}${cookieAttributes}`;
150        
151        console.log(`Cookie establecida (${isSecure ? 'HTTPS' : 'HTTP'}):`, googleValue);
152    }
153
154     /**
155     * Evento Click: Recarga Forzada con Carga Fresca
156     */
157    /**
158     * Evento Click: Traducción por Polling (Sin recargar)
159     */
160    document.addEventListener('click', function(e) {
161        const btn = e.target.closest('.idiomaHiper');
162        
163        if (btn) {
164            e.preventDefault();
165            const lang = btn.getAttribute('data-lang').toLowerCase();
166            
167            // 1. Guardar Cookies y Aplicar Interfaz
168            gestionarCookiesYTraduccion(lang);
169            aplicarInterfaz(lang);
170
171            let intentos = 0;
172            const intervalo = setInterval(() => {
173                intentos++;
174                const combo = document.querySelector('.goog-te-combo');
175                
176                // Verificamos si el componente de Google Translate existe
177                if (combo) {
178                    combo.value = lang;
179                    combo.dispatchEvent(new Event('change'));
180                    
181                    // Si el valor cambió, paramos el intervalo
182                    if (combo.value === lang) {
183                        clearInterval(intervalo);
184                    }
185                }
186
187                // Si tras 5 segundos no carga, detenemos para no saturar
188                if (intentos > 25) { 
189                    clearInterval(intervalo);
190                    console.warn("Google Translate tardó demasiado en responder.");
191                }
192            }, 200); // Revisa cada 200ms
193        }
194    }, true);
195
196    // Inicialización al cargar la página
197    const getCookie = (name) => {
198        const value = `; ${document.cookie}`;
199        const parts = value.split(`; ${name}=`);
200        if (parts.length === 2) return parts.pop().split(';').shift();
201    };
202    
203    const idiomaActual = getCookie('idioma') || 'es';
204    console.log(idiomaActual);
205    
206    aplicarInterfaz(idiomaActual);
207});
208
209/** end funcion lenguaje **/
210
211$(document).ready(function () {
212
213
214    $('#modifica').validate({
215        rules: {
216
217            tipo_enlace_logo: {
218                required: true
219            },
220            tipoVistaHeader: {
221                required: true
222            },
223            buscarHeader: {
224                required: true
225            },
226            personalizar_enlace_logo: {
227                required: true
228            }
229        },
230        messages: {
231            tipo_enlace_logo: {
232                required: "Selecciona un tipo de enlace para el logo."
233            },
234            tipoVistaHeader: {
235                required: "Selecciona el tipo de vista para el encabezado."
236            },
237            buscarHeader: {
238                required: "Selecciona el buscador principal."
239            },
240            personalizar_enlace_logo: {
241                required: "Ingresa el enlace personalizado."
242            }
243        },
244        errorElement: 'div',
245        errorPlacement: function (error, element) {
246            if (element.attr("name") === "logo") {
247                error.appendTo($('#errores'));
248            } else {
249                error.addClass('invalid-feedback');
250                error.insertAfter(element);
251            }
252        },
253        highlight: function (element, errorClass, validClass) {
254            $(element).addClass('is-invalid').removeClass('is-valid');
255            $(element).closest('.form-group').addClass('has-error');
256        },
257        unhighlight: function (element, errorClass, validClass) {
258            $(element).removeClass('is-invalid').addClass('is-valid');
259            $(element).closest('.form-group').removeClass('has-error');
260        },
261        onfocusout: function (element) {
262            this.element(element);
263        }
264    });
265});
266$(document).ready(function () {
267    const imagenExisteFlag = $('#imagen_previa_existe').val();
268
269    const tieneImagenPrevia = imagenExisteFlag === '1';
270
271
272
273    $('#tipo_enlace_logo').change(function () {
274        let opcSelect = $(this).val();
275        if (opcSelect == 'EP') {
276            $('.personalizar_enlace_logo_div').removeClass('hidden');
277        } else {
278            $('.personalizar_enlace_logo_div').addClass('hidden');
279        }
280    });
281
282    $('#modifica').validate({
283        rules: {
284            logo: {
285                required: function () {
286                    return !tieneImagenPrevia;
287                },
288            },
289            tipo_enlace_logo: {
290                required: true
291            },
292            tipoVistaHeader: {
293                required: true
294            },
295            buscarHeader: {
296                required: true
297            },
298            personalizar_enlace_logo: {
299                required: true
300            }
301        },
302        messages: {
303            logo: {
304                required: "Selecciona una imagen o logo.",
305                accept: "El archivo debe ser una imagen (JPG, PNG, GIF, etc.)."
306            },
307            tipo_enlace_logo: {
308                required: "Selecciona un tipo de enlace para el logo."
309            },
310            tipoVistaHeader: {
311                required: "Selecciona el tipo de vista para el encabezado."
312            },
313            buscarHeader: {
314                required: "Selecciona el buscador principal."
315            },
316            personalizar_enlace_logo: {
317                required: "Ingresa el enlace personalizado."
318            }
319        },
320        errorElement: 'div',
321        errorPlacement: function (error, element) {
322            if (element.attr("name") === "logo") {
323                error.appendTo($('#errores'));
324            } else {
325                error.addClass('invalid-feedback');
326                error.insertAfter(element);
327            }
328        },
329        highlight: function (element, errorClass, validClass) {
330            $(element).addClass('is-invalid').removeClass('is-valid');
331            $(element).closest('.form-group').addClass('has-error');
332        },
333        unhighlight: function (element, errorClass, validClass) {
334            $(element).removeClass('is-invalid').addClass('is-valid');
335            $(element).closest('.form-group').removeClass('has-error');
336        },
337        onfocusout: function (element) {
338            this.element(element);
339        }
340    });
341});
342

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.