(function(){
var NL=String.fromCharCode(10);
var C=[['Limpiadores e higiene',/limpiador|limpieza|higiene|syndet|gel de ducha|gel limpiador|aceite limpiador|aceite de ducha|agua micelar|gel moussant|gel purificante|gel de ba/i],
['Champús y capilar',/champ|capilar|cuero cabelludo|ampolla|anaphase|pilexil|lambdapil|dercos|kertyol|iraltone|triphasic|aminexil/i],
['Emolientes e hidratantes',/emoliente|hidratante|urea|bálsamo|loción|leche|relipidizante|cerave|cetaphil|ceramol|xémose|atoderm|lipikar|xeracalm|atopicontrol|exomega|stelatopia|restoraderm|ureadin|urearepair|xérial|akerat/i],
['Fotoprotección',/fotoprotec|spf|solar|eryfotona|anthelios|heliocare|photoderm|bariésun|capital soleil|sun secure|fusion water|fusion fluid|active unify/i],
['Barrera y oclusivos',/barrera|pañal|óxido de zinc|pasta al agua|vaselina|aquaphor|mitosyl|1er change|babynaturals|bariéderm|trigopax|abcderm/i],
['SOS y antipicor',/sos|antipicor|anti-picor|bruma|hidrogel|spray calmante|pruriced/i],
['Reparadores y cicatriz',/reparador|cicalfate|cicaplast|cicabio|cicavit|epitheliale|cicastim|cicadiane|dermalibour|cicatriz|cytelium/i],
['Antitranspirantes',/antitranspirante|hidrosis|driosec|dryses|spirial|clinical control/i],
['Despigmentantes',/despigment|neoretin|azelac|mela b3|anti-pigment|thiamidol|discoloration|dépiwhite|pigment zero|d-clar|iklen|spot corrector/i],
['Medidas y consejos',/^hábito|^técnica|^consejo|^regla|^qué |^evitar|^preset|^medidas|desencadenante|^protección y|^higiene, aireado|^secado|^normas|^rutina mínima|^lo que queda|^onicólisis · medidas/i],
['Tratamiento específico',/./]];
function ct(t){for(var i=0;i<C.length;i++){if(C[i][1].test(t))return C[i][0];}return 'Tratamiento específico';}
function br(n){var m=n.replace(/^[^·]*·\s*/,'').trim().split(/\s+/)[0];if(/^la$/i.test(m))return 'La Roche-Posay';return m.replace(/[®,:].*$/,'');}
function tg(s){s=s.toLowerCase();var t=[];
 if(/sin perfume|sin conservantes|envase estéril|piel sensible|intolerante/.test(s))t.push('piel sensible');
 if(/lactante|bebé|pediátric|desde 0 meses/.test(s))t.push('pediátrico');
 if(/embarazo|posparto|gestante/.test(s))t.push('embarazo');
 if(/oil-free|no comedog/.test(s))t.push('no comedogénico');
 if(/urea \d|salicílico|queratol/.test(s))t.push('queratolítico');
 return t;}
var D=[],el,R=[],s={p:0,c:0,r:0,q:'',b:'',v:'f'};
function e(x){return String(x).split('&').join('&amp;').split('<').join('&lt;');}
function tx(p){return p.n+NL+NL+p.f.map(function(f){return (f[0]?f[0]+': ':'')+f[1];}).join(NL+NL);}
function cp(t,b,l){var k=function(){b.textContent='Copiado';b.classList.add('ok');setTimeout(function(){b.textContent=l;b.classList.remove('ok');},1500);};
 var fb=function(){var a=document.createElement('textarea');a.value=t;document.body.appendChild(a);a.select();try{document.execCommand('copy');k();}catch(x){}document.body.removeChild(a);};
 if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(t).then(k).catch(fb);}else{fb();}}
function ps(doc){var o=[];
 doc.querySelectorAll('details.drx-macro-detail').forEach(function(d){
  var nm=((d.querySelector('summary')||{}).textContent||'').trim();if(!nm)return;var pr=[];
  d.querySelectorAll('.drx-cosmo').forEach(function(c){
   var t=c.querySelector('.drx-cosmo__tag');if(!t)return;var f=[];
   c.querySelectorAll('p').forEach(function(p){if(p.querySelector('button'))return;
    var b=p.querySelector('b.drx-f');
    if(b){f.push([b.textContent.trim(),p.textContent.slice(b.textContent.length).trim()]);}
    else{var q=p.textContent.trim();if(q)f.push(['',q]);}});
   if(!f.length)return;var n=t.textContent.trim(),all=n+' '+f.map(function(x){return x[1];}).join(' ');
   pr.push({n:n,f:f,c:ct(n+' '+all.slice(0,240)),b:br(n),t:tg(all),
    pa:(f.filter(function(x){return /pauta/i.test(x[0]);})[0]||['',''])[1],
    du:(f.filter(function(x){return /duraci/i.test(x[0]);})[0]||['',''])[1]});});
  if(pr.length)o.push({p:nm,id:d.id,prods:pr});});
 o.sort(function(a,b){return a.p.localeCompare(b.p,'es');});return o;}
function hs(){var c=D[s.p];if(c)history.replaceState(null,'','#'+encodeURIComponent(c.p)+'~'+s.c+'~'+s.r);}
function fh(){var h=decodeURIComponent((location.hash||'').replace(/^#/,''));if(!h)return false;
 var a=h.split('~'),i=D.map(function(x){return x.p.toLowerCase();}).indexOf(a[0].toLowerCase());
 if(i<0)return false;s.p=i;s.c=+a[1]||0;s.r=+a[2]||0;return true;}
function rd(){
 var L=D.filter(function(x){if(!s.q)return true;var q=s.q.toLowerCase();
  return x.p.toLowerCase().indexOf(q)>-1||x.prods.some(function(p){return (p.n+' '+p.b).toLowerCase().indexOf(q)>-1;});});
 var nav='',lt='';
 L.forEach(function(x){var A=x.p.charAt(0).toUpperCase();
  if(A!==lt){lt=A;nav+='<div class="dc-letter">'+A+'</div>';}
  nav+='<button class="dc-item'+(D.indexOf(x)===s.p?' on':'')+'" data-i="'+D.indexOf(x)+'">'+e(x.p)+'<span>'+x.prods.length+'</span></button>';});
 var cu=D[s.p]||D[0];
 var pool=cu.prods.filter(function(p){return !s.b||p.b===s.b;});if(!pool.length){pool=cu.prods;s.b='';}
 var cs=[];pool.forEach(function(p){if(cs.indexOf(p.c)<0)cs.push(p.c);});cs.sort(function(a,b){return a.localeCompare(b,'es');});
 if(s.c>=cs.length)s.c=0;
 var inc=pool.filter(function(p){return p.c===cs[s.c];});if(s.r>=inc.length)s.r=0;
 var pr=inc[s.r];
 var bs=[];cu.prods.forEach(function(p){if(bs.indexOf(p.b)<0)bs.push(p.b);});bs.sort();
 var tray='<div class="dc-tray"><b>Rutina</b>'+(R.length?R.map(function(x,i){return '<span class="it">'+e(x.n)+'<i data-r="'+i+'">✕</i></span>';}).join(''):'<span style="opacity:.85;font-size:12.5px">añada productos con “Añadir a la rutina” para entregar una pauta completa</span>')+
  (R.length?'<button class="dc-rc">Copiar rutina ('+R.length+')</button><button class="dc-rp gh">Imprimir</button><button class="dc-rx gh">Vaciar</button>':'')+'</div>';
 var tools='<div class="dc-tools"><select class="dc-b"><option value="">Todas las marcas ('+bs.length+')</option>'+bs.map(function(b){return '<option'+(b===s.b?' selected':'')+'>'+e(b)+'</option>';}).join('')+'</select><button class="dc-vf'+(s.v==='f'?' on':'')+'">Ficha</button><button class="dc-vt'+(s.v==='t'?' on':'')+'">Tabla comparativa</button><button class="dc-sh">Copiar enlace</button></div>';
 var body;
 if(s.v==='t'){body='<table class="dc-tab"><tr><th>Producto</th><th>Categoría</th><th>Pauta</th><th>Duración</th></tr>'+pool.map(function(p){var ci=cs.indexOf(p.c),pi=pool.filter(function(z){return z.c===p.c;}).indexOf(p);
  return '<tr data-c="'+ci+'" data-p="'+pi+'"><td><b>'+e(p.n)+'</b></td><td>'+e(p.c)+'</td><td>'+e(p.pa||'—')+'</td><td>'+e(p.du||'—')+'</td></tr>';}).join('')+'</table>';}
 else{body='<div class="dc-tabs"><span class="lb">Categoría</span>'+cs.map(function(c,i){return '<button class="dc-c'+(i===s.c?' on':'')+'" data-i="'+i+'">'+e(c)+' ('+pool.filter(function(p){return p.c===c;}).length+')</button>';}).join('')+'</div>'+
  '<div class="dc-tabs"><span class="lb">Producto</span>'+inc.map(function(p,i){return '<button class="dc-p'+(i===s.r?' on':'')+'" data-i="'+i+'">'+e(p.n)+'</button>';}).join('')+'</div>'+
  '<div class="dc-card"><h3>'+e(pr.n)+'</h3>'+(pr.t.length?'<div class="dc-tags">'+pr.t.map(function(t){return '<span>'+e(t)+'</span>';}).join('')+'</div>':'')+
  pr.f.map(function(f){return '<p class="dc-f">'+(f[0]?'<b>'+e(f[0])+'</b>':'')+e(f[1])+'</p>';}).join('')+
  '<button class="dc-copy">Copiar para el paciente</button><button class="dc-add">Añadir a la rutina</button><br><a class="dc-link" href="/macros/#'+cu.id+'">Ver macro completa →</a></div>';}
 el.innerHTML='<div class="dc-bar"><input class="dc-search" placeholder="Buscar patología, producto o marca…" value="'+e(s.q)+'"><span class="dc-count">'+D.length+' patologías · '+D.reduce(function(a,x){return a+x.prods.length;},0)+' productos</span></div>'+tray+
  '<div class="dc-layout"><div class="dc-list">'+nav+'</div><div class="dc-panel"><h2 class="dc-h">'+e(cu.p)+'</h2><p class="dc-sub">'+pool.length+' opciones · '+cs.length+' categorías'+(s.b?' · '+e(s.b):'')+'</p>'+tools+body+'</div></div>';
 bd(cu,pr);}
function bd(cu,pr){
 var q=el.querySelector('.dc-search');
 q.addEventListener('input',function(){s.q=this.value;rd();var n=el.querySelector('.dc-search');n.focus();n.setSelectionRange(n.value.length,n.value.length);});
 el.querySelectorAll('.dc-item').forEach(function(b){b.addEventListener('click',function(){s.p=+this.dataset.i;s.c=0;s.r=0;hs();rd();});});
 el.querySelectorAll('.dc-c').forEach(function(b){b.addEventListener('click',function(){s.c=+this.dataset.i;s.r=0;hs();rd();});});
 el.querySelectorAll('.dc-p').forEach(function(b){b.addEventListener('click',function(){s.r=+this.dataset.i;hs();rd();});});
 var sb=el.querySelector('.dc-b');if(sb)sb.addEventListener('change',function(){s.b=this.value;s.c=0;s.r=0;rd();});
 var vf=el.querySelector('.dc-vf');if(vf)vf.addEventListener('click',function(){s.v='f';rd();});
 var vt=el.querySelector('.dc-vt');if(vt)vt.addEventListener('click',function(){s.v='t';rd();});
 var sh=el.querySelector('.dc-sh');if(sh)sh.addEventListener('click',function(){cp(location.origin+location.pathname+'#'+encodeURIComponent(cu.p),sh,'Copiar enlace');});
 el.querySelectorAll('table.dc-tab tr[data-c]').forEach(function(t){t.addEventListener('click',function(){s.c=+this.dataset.c;s.r=+this.dataset.p;s.v='f';hs();rd();});});
 var c1=el.querySelector('.dc-copy');if(c1)c1.addEventListener('click',function(){cp(tx(pr),c1,'Copiar para el paciente');});
 var ad=el.querySelector('.dc-add');if(ad)ad.addEventListener('click',function(){if(!R.some(function(x){return x.n===pr.n;}))R.push(pr);rd();});
 el.querySelectorAll('.dc-tray i[data-r]').forEach(function(i){i.addEventListener('click',function(){R.splice(+this.dataset.r,1);rd();});});
 var rc=el.querySelector('.dc-rc');if(rc)rc.addEventListener('click',function(){
  cp('PAUTA DERMOCOSMÉTICA — '+cu.p+NL+NL+R.map(function(p,i){return (i+1)+'. '+tx(p);}).join(NL+NL+'———'+NL+NL),rc,'Copiar rutina ('+R.length+')');});
 var rp=el.querySelector('.dc-rp');if(rp)rp.addEventListener('click',function(){var w=window.open('','_blank');
  w.document.write('<html><head><title>Pauta dermocosmética</title><style>body{font-family:Segoe UI,Arial,sans-serif;color:#16232e;max-width:720px;margin:28px auto;padding:0 18px;line-height:1.5}h1{color:#0f4c81;font-size:20px;border-bottom:2px solid #0f4c81;padding-bottom:8px}h2{font-size:15px;color:#0f4c81;margin:22px 0 6px}p{margin:4px 0;font-size:13.5px}b{color:#5f7c93;font-size:11px;letter-spacing:.08em;text-transform:uppercase;display:block}</style></head><body><h1>Pauta dermocosmética · '+e(cu.p)+'</h1>'+R.map(function(p){return '<h2>'+e(p.n)+'</h2>'+p.f.map(function(f){return '<p>'+(f[0]?'<b>'+e(f[0])+'</b>':'')+e(f[1])+'</p>';}).join('');}).join('')+'<p style="margin-top:26px;font-size:11px;color:#8a6d2f">Revisar siempre indicación, contraindicaciones, interacciones, ficha técnica y contexto individual.</p></body></html>');
  w.document.close();setTimeout(function(){w.print();},350);});
 var rx=el.querySelector('.dc-rx');if(rx)rx.addEventListener('click',function(){R=[];rd();});}
function init(){el=document.getElementById('drx-dc-app')||document.getElementById('drx-dc');if(!el)return;
 el.id='drx-dc';el.innerHTML='<p style="color:#5f7c93">Cargando dermocosmética…</p>';
 fetch('/macros/',{credentials:'omit'}).then(function(r){return r.text();}).then(function(t){
  D=ps(new DOMParser().parseFromString(t,'text/html'));
  if(!D.length){el.innerHTML='<p>No se han podido cargar los datos.</p>';return;}
  fh();rd();
  window.addEventListener('hashchange',function(){if(fh())rd();});
  document.addEventListener('keydown',function(ev){if(/input|select|textarea/i.test(ev.target.tagName||''))return;
   if(ev.key==='ArrowDown'||ev.key==='ArrowUp'){var n=s.p+(ev.key==='ArrowDown'?1:-1);
    if(n>=0&&n<D.length){s.p=n;s.c=0;s.r=0;hs();rd();ev.preventDefault();}}});
 }).catch(function(){el.innerHTML='<p>No se han podido cargar los datos.</p>';});}
if(document.readyState==='complete'){init();}else{window.addEventListener('load',init);}
})();
