1/** 2 * Registra la URL visitada en localStorage. 3 * @param {string} storageKey - Clave en localStorage donde se guardan las URLs (JSON array). 4 * @param {number} maxEntries - Máximo número de entradas a mantener (por defecto 50). 5 * 6 * Guarda la URL actual (location.href). Mantiene las entradas más recientes al inicio 7 * y recorta el array si supera `maxEntries`. Maneja JSON de forma segura. 8 */ 9function incrementarVisita(storageKey = 'ids_resources_visited', maxEntries = 50) { 10 try { 11 12 const currentUrl = window.location.href; 13 14 // Extraer el ID: el último segmento de la ruta (después de '/'). 15 const url = new URL(currentUrl); 16 const pathSegments = url.pathname.split('/').filter(Boolean); 17 const currentId = pathSegments.length ? pathSegments[pathSegments.length - 1] : currentUrl; 18 19 // Leer las entradas existentes. 20 const raw = localStorage.getItem(storageKey); 21 let visits = []; 22 23 if (raw) { 24 try { 25 visits = JSON.parse(raw); 26 if (!Array.isArray(visits)) visits = []; 27 } catch (e) { 28 visits = []; 29 } 30 } 31 32 // Añadir el ID al inicio (más reciente primero). 33 visits.unshift(currentId); 34 35 // Evitar duplicados consecutivos. 36 if (visits.length > 1 && visits[0] === visits[1]) visits.shift(); 37 38 // Recortar a maxEntries. 39 if (visits.length > maxEntries) visits = visits.slice(0, maxEntries); 40 41 localStorage.setItem(storageKey, JSON.stringify(visits)); 42 43 // Si hay más de 3 IDs, mostrar modal sólo a usuarios no logueados. 44 if (visits.length > 3) { 45 try { 46 const usuarioLogueado = getCookie('UsuarioLogueado'); 47 if (usuarioLogueado !== '1') mostrarModalExceso(); 48 } catch (e) { 49 mostrarModalExceso(); 50 } 51 } 52 53 } catch (err) { 54 console.error('Error al incrementar la visita:', err); 55 } 56} 57 58/** 59 * Verifica si el DOM contiene alguna de las clases indicadas. 60 * @param {string[]} clasesObjetivo - Lista de nombres de clases a buscar. 61 * @returns {boolean} - True si encuentra alguna clase en el DOM. 62 */ 63function contieneAlgunaClase(clasesObjetivo = []) { 64 return clasesObjetivo.some(clase => document.querySelector(`.${clase}`)); 65} 66 67// Espera a que se cargue el DOM completamente 68document.addEventListener('DOMContentLoaded', () => { 69 const clases = ['MultimediaResourceModel', 'PersonModel', 'OrganizationModel', 'PlaceModel', 'EventModel']; 70 71 if (contieneAlgunaClase(clases)) { 72 incrementarVisita(); 73 } 74}); 75 76/** 77 * Inserta en el DOM el modal de exceso de visitas si no existe ya. 78 */ 79function mostrarModalExceso() { 80 81 // Evitar insertar varias veces. 82 if (document.querySelector('.payment-modal')) return; 83 84 const modalHtml = ` 85 <div class="payment-modal"> 86 <div class="payment-modal_window"> 87 <div class="payment-modal_top is-login"> 88 <p class="payment-modal_title is-login">${$('#MSG_EXCESO_VISITAS').val()} <a href="/" style="text-decoration: underline; color: var(--c-primario); font-weight: 700;">BIME</a>!</p> 89 <p>${$('#MSG_EXCESO_VISITAS_INFO').val()}</p> 90 <p> 91 ${$('#NO_TIENES_CUENTA').val()} 92 <a href="/hazte-miembro" class="is-underline">${$('#REGISTRATE').val()}</a> 93 </p> 94 <div class="w-form"> 95 <form method="post" id="formPaginaLogin" class="login-form formPaginaLogin" action="/login"> 96 <div class="fieldset fieldset01"> 97 <fieldset> 98 <div class="fieldsetContent"> 99 <div class="form-group"> 100 <label for="usuario_Login" class="paragraph-2 is-label">${$('#EMAIL').val()}</label> 101 <input placeholder="${$('#INTRODUCETUCORREOELECTRONICO').val()}" type="text" name="usuario" id="usuario_Login" class="form-control usuario_Login login-form_input w-input"> 102 </div> 103 <div class="form-group"> 104 <label for="password_login" class="control-label paragraph-2 is-label">${$('#CONTRASEÃA').val()}</label> 105 <input placeholder="${$('#INTRODUCETUCONTRASEÃA').val()}" type="password" name="password" id="password_login" class="form-control password_login login-form_input w-input"> 106 </div> 107 <div id="loginError" class="error-wrap loginError"> 108 <div class="ko loginErrorKo" style="display: none;"> 109 <p id="mensajeError">${$('#CLAVEERRONEA').val()}</p> 110 </div> 111 </div> 112 <div id="loginErrorAutenticacionExterna" class="error-wrap loginError"> 113 <div class="ko loginErrorAutenticacionExternaKo" style="display: none;"> 114 <p>${$('#ERRORSERVICIOAUTENTICACION').val()}</p> 115 </div> 116 </div> 117 </div> 118 </fieldset> 119 </div> 120 <div class="fieldset actionButtons fieldset03 actionButtons"> 121 <fieldset> 122 <div class="fieldsetContent"> 123 <div class="login-form_lost-password-container"> 124 <a href="/olvide-password" class="login-form_lost-password-link">${$('#OLVIDOPASSWORD').val()}</a> 125 </div> 126 <input type="button" class="principal submit btn-primary btnSubmit login-form_submit-input w-button" id="btnSubmit" value="${$('#INICIARSESION').val()}"> 127 </div> 128 </fieldset> 129 </div> 130 </form> 131 </div> 132 </div> 133 </div> 134 </div>`; 135 136 const wrapper = document.createElement('div'); 137 wrapper.innerHTML = modalHtml; 138 const modal = wrapper.firstElementChild; 139 document.body.appendChild(modal); 140 141 // Añadir estilos básicos. 142 const style = document.createElement('style'); 143 style.textContent = ` 144 .payment-modal{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,0.6);z-index:9999} 145 .payment-modal_window{background:#fff;border-radius:8px;max-width:720px;width:90%;padding:20px;position:relative} 146 .no-scroll{position:fixed;width:100%;overflow:hidden} 147 `; 148 document.head.appendChild(style); 149 150 // Bloquear scroll. 151 let scrollY = 0; 152 function bloquearScroll() { 153 scrollY = window.scrollY || window.pageYOffset; 154 document.body.style.top = `-${scrollY}px`; 155 document.body.classList.add('no-scroll'); 156 document.addEventListener('wheel', preventDefault, { passive: false }); 157 document.addEventListener('touchmove', preventDefault, { passive: false }); 158 } 159 160 function preventDefault(e) { e.preventDefault(); } 161 162 // Cuando el modal se inserta, bloquear scroll. 163 bloquearScroll(); 164 165 // Conectar el botón de login del modal al método LoggearUsuario. 166 const btnSubmit = modal.querySelector('#btnSubmit'); 167 if (btnSubmit) { 168 btnSubmit.addEventListener('click', function (e) { 169 console.log('[Modal] btnSubmit clicked'); 170 const usuario = modal.querySelector('#usuario_Login') ? modal.querySelector('#usuario_Login').value : ''; 171 const password = modal.querySelector('#password_login') ? modal.querySelector('#password_login').value : ''; 172 LoggearUsuario(usuario, password); 173 }); 174 } else { 175 console.warn('[Modal] btnSubmit not found in modal'); 176 } 177 178 // Permitir enviar con Enter desde los inputs. 179 const inputs = modal.querySelectorAll('#usuario_Login, #password_login');
180 inputs.forEach(input => { 181 input.addEventListener('keydown', function (e) { 182 if (e.key === 'Enter') { 183 e.preventDefault(); 184 console.log('[Modal] Enter pressed in input'); 185 const usuario = modal.querySelector('#usuario_Login') ? modal.querySelector('#usuario_Login').value : ''; 186 const password = modal.querySelector('#password_login') ? modal.querySelector('#password_login').value : ''; 187 LoggearUsuario(usuario, password); 188 } 189 }); 190 }); 191} 192 193function LoggearUsuario(usuario, password) 194{ 195 try { 196 if (typeof $ !== 'undefined' && $.fn) { 197 let formlogin = $('#formPaginaLogin'); 198 formlogin.find('#usuario_Login').val(usuario); 199 formlogin.find('#password_login').val(password); 200 formlogin.submit(); 201 } else { 202 const form = document.getElementById('formPaginaLogin'); 203 if (form) { 204 const userInput = form.querySelector('#usuario_Login'); 205 const passInput = form.querySelector('#password_login'); 206 if (userInput) userInput.value = usuario; 207 if (passInput) passInput.value = password; 208 form.submit(); 209 } else { 210 console.error('LoggearUsuario: formPaginaLogin no encontrado'); 211 } 212 } 213 } catch (e) { 214 console.error('LoggearUsuario error', e); 215 } 216}
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.