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.