1(()=>{ 2 const widgets=[...document.querySelectorAll('[data-doctoralia]')];let loaded=false,automatic=true; 3 const origin='https://www.doctoralia.es'; 4 const observer='IntersectionObserver' in window?new IntersectionObserver(entries=>{ 5 if(automatic&&entries.some(entry=>entry.isIntersecting)){observer.disconnect();load();} 6 },{rootMargin:'150px 0px'}):null; 7 function fallback(message){ 8 for(const widget of widgets){widget.querySelector('.mbs-doctoralia-fallback').hidden=false;widget.dataset.state='error';widget.querySelector('[data-doctoralia-placeholder]').hidden=false;widget.querySelector('[data-doctoralia-status]').textContent=message;widget.querySelector('[data-doctoralia-load]').hidden=false;} 9 } 10 function load(){ 11 if(loaded)return; 12 let valid=0; 13 for(const widget of widgets){ 14 const facility=widget.dataset.facility,type=widget.dataset.widgetType; 15 if(!/^[a-z0-9-]+$/.test(facility)||!/^facility-calendar(?:-listing)?(?:-with-saas-only)?$/.test(type))continue; 16 const anchor=document.createElement('a');anchor.href=widget.querySelector('a').href;anchor.textContent='MediBilbao Salud';anchor.dataset.zlWidgetFacility=facility;anchor.dataset.zlwType=type;anchor.dataset.placement='inline';anchor.dataset.zlwA11yTitle='Disponibilidad y reserva de cita · MediBilbao Salud'; 17 widget.querySelector('[data-doctoralia-frame]').append(anchor);widget.dataset.state='loading';widget.querySelector('[data-doctoralia-load]').hidden=true;valid++; 18 } 19 if(!valid)return fallback('Consulta la agenda en Doctoralia.'); 20 loaded=true; 21 const script=document.createElement('script');script.id='zl-facility-widget';script.src=origin+'/platform/js/widget.js';script.async=true;script.dataset.mbsDoctoralia=''; 22 script.addEventListener('error',()=>{loaded=false;script.remove();for(const widget of widgets)widget.querySelector('[data-doctoralia-frame]').replaceChildren();fallback('No se pudo cargar la agenda. Puedes reintentarlo o abrir Doctoralia.');}); 23 document.head.append(script); 24 } 25 function watch(widget){ 26 const styles=document.querySelector('link[data-mbs-full-styles]'); 27 const start=()=>{if(automatic){if(observer)observer.observe(widget);else load();}}; 28 if(styles&&styles.media!=='all')styles.addEventListener('load',start,{once:true});else start(); 29 } 30 for(const widget of widgets){ 31 widget.querySelector('[data-doctoralia-load]').addEventListener('click',load); 32 new MutationObserver(()=>{ 33 const frame=widget.querySelector('iframe'); 34 if(frame&&!frame.dataset.mbsObserved){frame.dataset.mbsObserved='';frame.addEventListener('load',()=>{if(!frame.isConnected)return;widget.querySelector('.mbs-doctoralia-fallback').hidden=true;widget.dataset.state='ready';widget.querySelector('[data-doctoralia-placeholder]').hidden=true;});} 35 }).observe(widget.querySelector('[data-doctoralia-frame]'),{childList:true,subtree:true}); 36 watch(widget); 37 } 38 39 function withdraw(){ 40 automatic=false;observer?.disconnect(); 41 for(const widget of widgets)widget.querySelector('[data-doctoralia-frame]').replaceChildren(); 42 document.querySelector('script[data-mbs-doctoralia]')?.remove();loaded=false;fallback('Calendario externo desactivado.'); 43 } 44 document.addEventListener('mbs:external-withdraw',withdraw); 45 document.addEventListener('mbs:consent',event=>{if(!event.detail?.advertising)withdraw();}); 46})();
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.