1/* 2Aviso de navegacion sin cookies. 3 4Cuando el visitante rechaza las cookies en el selector de PD Cookie Consent, la 5libreria bloquea scripts e iframes de terceros (mapas, videos, reCAPTCHA, 6analitica), asi que partes de la web dejan de funcionar sin que el visitante 7sepa por que. Este script muestra una barra fija superior explicandolo, con un 8boton que reabre el selector de cookies. 9 10Como decide si mostrarse: lee la cookie "pd_cc" que escribe PD Cookie Consent. 11 - sin cookie -> el selector no ha arrancado: no 12 - showModal === true -> el modal esta abierto: no 13 - accepted === true -> acepto todo: no 14 - queda algun servicio con actived !== true -> si 15 16El boton no llama a ninguna API de la libreria: le basta con la clase 17"pdcc-open-modal", que PD Cookie Consent atiende con un handler delegado en 18document, asi que funciona aunque el aviso se pinte despues de cargarla. 19 20El aviso se puede cerrar y reaparece en la siguiente pagina. No se guarda nada 21en cookie ni en storage: sin consentimiento no se almacena nada en el cliente. 22*/ 23(function () { 24 'use strict'; 25
26 var ID_AVISO = 'mobAvisoCookies'; 27 var COOKIE = 'pd_cc'; 28 29 // Cabeceras fijas habituales de los temas: si estan ancladas arriba hay que 30 // bajarlas el alto del aviso para no taparlas. 31 var SELECTORES_CABECERA = 'header, .header, #header, .navbar, .navbar-fixed-top, .fixed-top, .sticky-top, #headerFixed, .headerFixed'; 32 33 var TEXTOS = { 34 es: { 35 aviso: 'Estás navegando con las cookies rechazadas: algunos contenidos, como mapas, vÃdeos o formularios, pueden no funcionar.', 36 boton: 'Revisar cookies', 37 cerrar: 'Cerrar aviso' 38 }, 39 ca: { 40 aviso: 'Està s navegant amb les cookies rebutjades: alguns continguts, com ara mapes, vÃdeos o formularis, poden no funcionar.', 41 boton: 'Revisar cookies', 42 cerrar: 'Tancar avÃs' 43 }, 44 en: { 45 aviso: 'You are browsing with cookies rejected: some content, such as maps, videos or forms, may not work.', 46 boton: 'Review cookies', 47 cerrar: 'Close notice' 48 }, 49 eu: { 50 aviso: 'Cookieak baztertuta nabigatzen ari zara: eduki batzuk (mapak, bideoak, inprimakiak) agian ez dira behar bezala kargatuko.', 51 boton: 'Cookieak berrikusi', 52 cerrar: 'Oharra itxi' 53 }, 54 gl: { 55 aviso: 'Estás navegando coas cookies rexeitadas: algúns contidos, como mapas, vÃdeos ou formularios, poden non funcionar.', 56 boton: 'Revisar cookies', 57 cerrar: 'Pechar aviso' 58 } 59 }; 60 61 function textos() { 62 var lang = (document.documentElement.lang || 'es').toLowerCase(); 63 if (lang.indexOf('-') !== -1) lang = lang.split('-')[0]; 64 return TEXTOS[lang] || TEXTOS.es; 65 } 66 67 // Mismo parseo que usa PD Cookie Consent para su propia cookie. 68 function estadoCookies() { 69 var partes = decodeURIComponent(document.cookie).split(';'); 70 for (var i = 0; i < partes.length; i++) { 71 var parte = partes[i]; 72 while (parte.charAt(0) === ' ') parte = parte.substring(1); 73 if (parte.indexOf(COOKIE + '=') === 0) { 74 try { 75 return JSON.parse(parte.substring(COOKIE.length + 1)); 76 } catch (e) { 77 return null; 78 } 79 } 80 } 81 return null; 82 } 83 84 // No se listan en el aviso: solo deciden si queda algo bloqueado. 85 function serviciosBloqueados(estado) { 86 var nombres = []; 87 if (!estado || !estado.blockList || !estado.blockList.length) return nombres; 88 for (var i = 0; i < estado.blockList.length; i++) { 89 var item = estado.blockList[i]; 90 if (!item || item.actived === true) continue; 91 if (item.visible === false) continue; 92 var nombre = typeof item.name === 'string' ? item.name.trim() : ''; 93 if (nombre && nombres.indexOf(nombre) === -1) nombres.push(nombre); 94 } 95 return nombres; 96 } 97 98 function debeMostrarse(estado) { 99 if (!estado) return false; 100 if (estado.showModal === true) return false; 101 if (estado.accepted === true) return false; 102 return serviciosBloqueados(estado).length > 0; 103 } 104 105 // El alto del aviso empuja el contenido: padding en el body y desplazamiento 106 // de las cabeceras que esten fijadas a top: 0. 107 var layout = { paddingOriginal: null, paddingBase: null, cabecerasMovidas: [] }; 108 109 // Descartado por el visitante en esta pagina: no se vuelve a pintar aqui. 110 var descartado = false; 111 var ajustaAlto = null; 112 113 function aplicaDesplazamiento(alto) { 114 var body = document.body; 115 if (layout.paddingOriginal === null) { 116 layout.paddingOriginal = body.style.paddingTop || ''; 117 layout.paddingBase = parseFloat(window.getComputedStyle(body).paddingTop) || 0; 118 } 119 body.style.paddingTop = (layout.paddingBase + alto) + 'px'; 120 121 if (layout.cabecerasMovidas.length) { 122 for (var m = 0; m < layout.cabecerasMovidas.length; m++) { 123 layout.cabecerasMovidas[m].el.style.top = alto + 'px'; 124 } 125 return; 126 } 127 128 var candidatos = document.querySelectorAll(SELECTORES_CABECERA); 129 for (var i = 0; i < candidatos.length; i++) { 130 var el = candidatos[i]; 131 var estilo = window.getComputedStyle(el); 132 if (estilo.position !== 'fixed') continue; 133 if ((parseFloat(estilo.top) || 0) !== 0) continue; 134 layout.cabecerasMovidas.push({ el: el, topOriginal: el.style.top || '' }); 135 el.style.top = alto + 'px'; 136 } 137 } 138 139 function revierteDesplazamiento() { 140 if (layout.paddingOriginal !== null) { 141 document.body.style.paddingTop = layout.paddingOriginal; 142 layout.paddingOriginal = null; 143 layout.paddingBase = null; 144 } 145 for (var i = 0; i < layout.cabecerasMovidas.length; i++) { 146 layout.cabecerasMovidas[i].el.style.top = layout.cabecerasMovidas[i].topOriginal; 147 } 148 layout.cabecerasMovidas = []; 149 } 150 151 function pinta() { 152 var t = textos(); 153 154 var aviso = document.createElement('div'); 155 aviso.id = ID_AVISO; 156 aviso.setAttribute('role', 'region'); 157 aviso.setAttribute('aria-label', t.aviso); 158 159 var inner = document.createElement('div');
160 inner.className = 'mobAvisoCookies-inner'; 161 162 var icono = document.createElement('span'); 163 icono.className = 'mobAvisoCookies-icono'; 164 icono.setAttribute('aria-hidden', 'true'); 165 icono.appendChild(document.createTextNode('!')); 166 167 var texto = document.createElement('p'); 168 texto.className = 'mobAvisoCookies-texto'; 169 texto.appendChild(document.createTextNode(t.aviso)); 170 171 // La clase pdcc-open-modal es lo que hace que PD Cookie Consent reabra el 172 // selector; sin hijos dentro del enlace, porque su handler mira el target 173 // del click. 174 var boton = document.createElement('a'); 175 boton.className = 'mobAvisoCookies-btn pdcc-open-modal'; 176 boton.setAttribute('href', '#'); 177 boton.appendChild(document.createTextNode(t.boton)); 178 179 var cerrar = document.createElement('button'); 180 cerrar.className = 'mobAvisoCookies-cerrar'; 181 cerrar.setAttribute('type', 'button'); 182 cerrar.setAttribute('aria-label', t.cerrar); 183 cerrar.setAttribute('title', t.cerrar); 184 cerrar.innerHTML = '×'; 185 186 inner.appendChild(icono); 187 inner.appendChild(texto); 188 inner.appendChild(boton); 189 inner.appendChild(cerrar); 190 aviso.appendChild(inner); 191 document.body.insertBefore(aviso, document.body.firstChild); 192 193 ajustaAlto = function () { 194 if (!aviso.parentNode) return; 195 aplicaDesplazamiento(aviso.offsetHeight); 196 }; 197 198 cerrar.addEventListener('click', function () { 199 descartado = true; 200 quita(); 201 }); 202 203 ajustaAlto(); 204 window.addEventListener('resize', ajustaAlto); 205 } 206 207 function quita() { 208 var aviso = document.getElementById(ID_AVISO); 209 if (ajustaAlto) { 210 window.removeEventListener('resize', ajustaAlto); 211 ajustaAlto = null; 212 } 213 revierteDesplazamiento(); 214 if (aviso && aviso.parentNode) aviso.parentNode.removeChild(aviso); 215 } 216 217 // Se llama al cargar y cada vez que el visitante toca el selector de cookies. 218 function refresca() { 219 // Con el selector abierto no se toca nada: tapa la pagina entera y 220 // quitar o poner el aviso solo provocaria saltos de layout. 221 if (document.getElementById('pdcc-modal-bg')) return; 222 223 var estado = estadoCookies(); 224 if (!debeMostrarse(estado)) { 225 if (document.getElementById(ID_AVISO)) quita(); 226 return; 227 } 228 if (descartado || document.getElementById(ID_AVISO)) return; 229 pinta(); 230 } 231 232 function init() { 233 // En un iframe (previsualizaciones de landings, embebidos) no pinta nada. 234 try { 235 if (window.top !== window.self) return; 236 } catch (e) { 237 return; 238 } 239 refresca(); 240 241 // PD Cookie Consent solo recarga la pagina al aceptar o al guardar la 242 // configuracion. El boton "Rechazar" (#pdcc-modal-reject) y la X del modal 243 // se limitan a cerrarlo en la misma pagina, asi que sin reevaluar aqui el 244 // aviso no apareceria hasta la siguiente. El setTimeout deja correr antes 245 // el handler de la libreria, que es quien actualiza la cookie. 246 document.addEventListener('click', function (e) { 247 var destino = e.target; 248 if (!destino) return; 249 var id = destino.id || ''; 250 var clases = typeof destino.className === 'string' ? destino.className : ''; 251 if (id.indexOf('pdcc') !== 0 && clases.indexOf('pdcc') === -1) return; 252 window.setTimeout(refresca, 0); 253 }, false); 254 } 255 256 if (document.readyState === 'loading') { 257 document.addEventListener('DOMContentLoaded', init); 258 } else { 259 init(); 260 } 261})();
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.