(function (){
'use strict';
var C=window.CMB||{};
var LS_KEY='cmb_indice_v3';
var LS_REC='cmb_recientes';
var TTL=10 * 60 * 1000;
var MOVIL=window.matchMedia('(max-width: 899px)');
var IDX=null, cargando=null, vocab=null, ui=null;
var st={
q: '', base: [], res: [], grupos: [], cats: [], corregido: false, relajado: '',
filtro: { cat: '', marca: '', oferta: false }, orden: 'rel',
limite: 30, activo: -1, abierto: false, historial: false, enviado: ''
};
function norm(s){
return String(s==null ? '':s).toLowerCase().normalize('NFD').replace(/[̀-ͯ]/g, '')
.replace(/[^a-z0-9]+/g, ' ').trim();
}
function compact(s){ return norm(s).replace(/ /g, ''); }
function esc(s){
return String(s==null ? '':s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
}
function money(v){
var p=Number(v).toFixed(2).split('.');
return '$' + p[0].replace(/\B(?=(\d{3})+(?!\d))/g, C.mil||'.') + (C.dec||',') + p[1];
}
function nf(n){ return Number(n).toLocaleString('es-EC'); }
function precioDe(it){ return it.o > 0 ? it.o:it.p; }
function descuento(it){ return it.o > 0&&it.p > 0 ? Math.round((it.p - it.o) / it.p * 100):0; }
function imgUrl(it){ return it.i ? (/^https?:/.test(it.i) ? it.i:IDX.base + it.i):''; }
function imgGrande(it){ return it.g ? (/^https?:/.test(it.g) ? it.g:IDX.base + it.g):imgUrl(it); }
function linkDe(it){ return (C.home||'') + it.u; }
var SYN={
inalambrico: ['wireless', 'bluetooth', 'inalambrica'], inalambrica: ['wireless', 'bluetooth', 'inalambrico'],
wireless: ['inalambrico', 'inalambrica'],
audifono: ['audifonos', 'auricular', 'auriculares', 'headset', 'headphone', 'headphones', 'earbuds', 'diadema'],
audifonos: ['audifono', 'auricular', 'auriculares', 'headset', 'headphone', 'headphones', 'earbuds', 'diadema'],
auricular: ['audifono', 'audifonos', 'headset', 'auriculares'], auriculares: ['audifono', 'audifonos', 'headset', 'auricular'],
headset: ['audifono', 'audifonos', 'auricular', 'auriculares'],
teclado: ['keyboard'], keyboard: ['teclado'], raton: ['mouse'],
laptop: ['portatil', 'notebook'], portatil: ['laptop', 'notebook'], notebook: ['laptop', 'portatil'],
computadora: ['pc', 'computador', 'desktop', 'cpu'], computador: ['pc', 'computadora', 'desktop'],
grafica: ['video', 'gpu'], gpu: ['grafica', 'video'],
monitor: ['pantalla', 'display'], pantalla: ['monitor'],
parlante: ['parlantes', 'bocina', 'speaker', 'altavoz'], parlantes: ['parlante', 'bocina', 'speaker'],
bocina: ['parlante', 'speaker'], speaker: ['parlante', 'bocina'],
webcam: ['camara'], camara: ['webcam', 'cam'],
impresora: ['printer', 'multifuncion'], printer: ['impresora'],
solido: ['ssd'], ssd: ['solido'], memoria: ['ram'], ram: ['memoria'],
cargador: ['charger', 'adaptador'], charger: ['cargador'],
silla: ['chair'], chair: ['silla'],
case: ['gabinete', 'chasis', 'torre'], gabinete: ['case', 'chasis'], chasis: ['case', 'gabinete'],
fuente: ['psu'], psu: ['fuente'], procesador: ['cpu'], cpu: ['procesador'],
mousepad: ['pad', 'alfombrilla'], alfombrilla: ['mousepad', 'pad'],
celular: ['telefono', 'smartphone'], telefono: ['celular', 'smartphone'],
tablet: ['tableta'], tableta: ['tablet'], router: ['enrutador'], enrutador: ['router'],
disco: ['hdd', 'ssd'], tinta: ['ink'], cable: ['cables']
};
function preparar(d){
d.items=d.items||[];
d.cats=d.cats||[];
d.items.forEach(function (it){
it._n=' ' + norm(it.n) + ' ';
it._x=' ' + norm([it.s, it.t, it.b].join(' ')) + ' ';
it._s=compact(it.s);
});
d.cats.forEach(function (c){ c._n=' ' + norm(c[0]) + ' '; });
var conFoto=d.items.filter(function (it){ return it.i&&it.p > 0; });
var ofertas=conFoto.filter(function (it){ return it.o > 0; }).sort(function (a, b){
return (descuento(b) - descuento(a))||((b.k||0) - (a.k||0));
});
d.top=(ofertas.length >=4 ? ofertas:conFoto.slice().sort(function (a, b){ return b.id - a.id; })).slice(0, 10);
d.topTitulo=ofertas.length >=4 ? 'Ofertas destacadas':'Recién llegados';
IDX=d;
vocab=null;
return d;
}
function leerCache(){
try {
var c=JSON.parse(localStorage.getItem(LS_KEY)||'null');
return c&&c.d&&c.d.items ? c:null;
} catch (e){ return null; }}
function descargar(){
return fetch(C.indice, { credentials: 'omit' }).then(function (r){
if(!r.ok) throw new Error('indice ' + r.status);
return r.json();
}).then(function (d){
try { localStorage.setItem(LS_KEY, JSON.stringify({ t: Date.now(), d: d })); } catch (e){}
return preparar(d);
});
}
function cargar(){
if(IDX) return Promise.resolve(IDX);
if(cargando) return cargando;
var c=leerCache();
if(c){
preparar(c.d);
if(Date.now() - c.t > TTL) descargar().then(function (){ if(st.abierto) buscar(st.q); }).catch(function (){});
return Promise.resolve(IDX);
}
cargando=descargar().catch(function (e){ cargando=null; throw e; });
return cargando;
}
function alternativas(tok){
var out=[[tok, 1]], base=tok;
if(tok.length > 4&&/es$/.test(tok)){ base=tok.slice(0, -2); out.push([base, 1]); }
if(tok.length > 3&&/s$/.test(tok)) out.push([tok.slice(0, -1), 1]);
(SYN[tok]||SYN[base]||[]).forEach(function (s){ out.push([s, 0.8]); });
return out;
}
function puntajeToken(it, alts){
var best=0;
for (var i=0; i < alts.length; i++){
var a=alts[i][0], w=alts[i][1], s=0;
if(it._n.indexOf(' ' + a)===0) s=10;
else if(it._n.indexOf(' ' + a)!==-1) s=6;
else if(/\d/.test(a)&&a.length >=2&&it._n.indexOf(a)!==-1) s=4;
if(a.length >=3&&it._s){
if(it._s===a) s=Math.max(s, 30);
else if(it._s.indexOf(a)!==-1) s=Math.max(s, 8);
}
if(!s&&it._x.indexOf(' ' + a)!==-1) s=3;
s *=w;
if(s > best) best=s;
}
return best;
}
function correr(tokens, grupos, qn){
var res=[], qc=qn.replace(/ /g, '');
for (var i=0; i < IDX.items.length; i++){
var it=IDX.items[i], total=0, ok=true;
for (var j=0; j < grupos.length; j++){
var s=puntajeToken(it, grupos[j]);
if(!s){ ok=false; break; }
total +=s;
}
if(!ok) continue;
if(it._s&&it._s===qc) total +=100;
if(tokens.length > 1&&it._n.indexOf(' ' + qn)!==-1) total +=8;
total +=Math.min(it.v||0, 50) / 50;
total -=it._n.length / 400;
it._score=total;
res.push(it);
}
return res.sort(function (a, b){ return b._score - a._score; });
}
function lev(a, b, max){
if(Math.abs(a.length - b.length) > max) return max + 1;
var prev=[], cur, i, j;
for (j=0; j <=b.length; j++) prev[j]=j;
for (i=1; i <=a.length; i++){
cur=[i];
var minRow=i;
for (j=1; j <=b.length; j++){
cur[j]=Math.min(prev[j] + 1, cur[j - 1] + 1, prev[j - 1] + (a[i - 1]===b[j - 1] ? 0:1));
if(cur[j] < minRow) minRow=cur[j];
}
if(minRow > max) return max + 1;
prev=cur;
}
return prev[b.length];
}
function corregir(tok){
if(tok.length < 4||/\d/.test(tok)) return [];
if(!vocab){
var set={};
IDX.items.forEach(function (it){
(it._n + it._x).split(' ').forEach(function (w){ if(w.length >=3) set[w]=1; });
});
vocab=Object.keys(set);
}
var max=tok.length >=7 ? 2:1, out=[];
for (var i=0; i < vocab.length&&out.length < 6; i++){
if(lev(tok, vocab[i].slice(0, tok.length + 1), max) <=max) out.push([vocab[i], 0.6]);
}
return out;
}
function buscar(q){
st.q=q;
st.activo=-1;
st.limite=30;
var qn=norm(q);
if(!IDX||qn.length < 2){ st.base=[]; st.res=[]; st.cats=[]; st.corregido=false; pintar(); return; }
var tokens=qn.split(' ').filter(Boolean).slice(0, 8);
var grupos=tokens.map(alternativas);
var res=correr(tokens, grupos, qn);
st.corregido=false;
if(!res.length){
var hubo=false;
grupos=tokens.map(function (t, i){
var extra=corregir(t);
if(extra.length) hubo=true;
return grupos[i].concat(extra);
});
if(hubo){ res=correr(tokens, grupos, qn); st.corregido=res.length > 0; }}
st.relajado='';
if(!res.length&&tokens.length > 1){
for (var k=tokens.length - 1; k >=0&&!res.length; k--){
var tk=tokens.filter(function (_, i){ return i!==k; });
var gk=grupos.filter(function (_, i){ return i!==k; });
res=correr(tk, gk, tk.join(' '));
if(res.length){ st.relajado=tk.join(' '); grupos=gk; }}
}
st.grupos=grupos;
st.base=res;
st.cats=IDX.cats.filter(function (c){
return grupos.every(function (g){ return g.some(function (a){ return c._n.indexOf(' ' + a[0])!==-1; });});
}).slice(0, 2);
if(st.filtro.cat&&!res.some(function (it){ return it.c===st.filtro.cat; })) st.filtro.cat='';
if(st.filtro.marca&&!res.some(function (it){ return it.b===st.filtro.marca; })) st.filtro.marca='';
filtrar();
}
function filtrar(){
var f=st.filtro;
var res=st.base.filter(function (it){
return (!f.cat||it.c===f.cat)&&(!f.marca||it.b===f.marca)&&(!f.oferta||it.o > 0);
});
if(st.orden!=='rel'){
res=res.slice().sort(function (a, b){
var pa=precioDe(a)||Infinity, pb=precioDe(b)||Infinity;
return st.orden==='asc' ? pa - pb:(precioDe(b)||-1) - (precioDe(a)||-1);
});
}
st.res=res;
st.activo=MOVIL.matches||!res.length ? -1:0;
pintar();
}
function facetas(){
var cats={}, marcas={}, ofertas=0;
st.base.forEach(function (it){
if(it.c) cats[it.c]=(cats[it.c]||0) + 1;
if(it.b) marcas[it.b]=(marcas[it.b]||0) + 1;
if(it.o > 0) ofertas++;
});
var top=function (o, n){
return Object.keys(o).map(function (k){ return [k, o[k]]; })
.sort(function (a, b){ return b[1] - a[1]; }).slice(0, n);
};
return { cats: top(cats, 4), marcas: top(marcas, 5).filter(function (m){ return m[1] > 1||st.filtro.marca===m[0]; }), ofertas: ofertas };}
function svg(d, w){
return '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="' + (w||2) + '" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">' + d + '</svg>';
}
var I={
lupa: svg('<circle cx="11" cy="11" r="7"/><path d="m20 20-3.5-3.5"/>', 2.2),
atras: svg('<path d="m15 18-6-6 6-6"/>', 2.4),
x: svg('<path d="M18 6 6 18M6 6l12 12"/>', 2.2),
mas: svg('<path d="M12 5v14M5 12h14"/>', 2.6),
ok: svg('<path d="M20 6 9 17l-5-5"/>', 2.6),
reloj: svg('<circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2"/>'),
flecha: svg('<path d="M5 12h14M13 6l6 6-6 6"/>', 2.2),
bolsa: svg('<path d="M6 7h12l1 13H5L6 7z"/><path d="M9 7a3 3 0 0 1 6 0"/>'),
img: svg('<rect x="3" y="3" width="18" height="18" rx="3"/><circle cx="9" cy="9" r="2"/><path d="m21 15-4-4-9 9"/>', 1.6)
};
function crearUI(){
if(ui) return ui;
var ov=document.createElement('div');
ov.className='cmb-ov';
ov.hidden=true;
ov.innerHTML =
'<div class="cmb-back" data-cerrar></div>' +
'<div class="cmb-box" role="dialog" aria-modal="true" aria-label="Buscar productos">' +
'<header class="cmb-top">' +
'<button type="button" class="cmb-ico cmb-atras" data-cerrar aria-label="Cerrar">' + I.atras + '</button>' +
'<label class="cmb-field">' +
'<span class="cmb-field-ico">' + I.lupa + '</span>' +
'<input type="search" class="cmb-input" placeholder="Buscar productos, marcas o códigos" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" enterkeyhint="search" aria-label="Buscar productos" role="combobox" aria-expanded="true" aria-controls="cmb-lista" aria-autocomplete="list">' +
'<button type="button" class="cmb-limpiar" aria-label="Borrar búsqueda" hidden>' + I.x + '</button>' +
'</label>' +
'<button type="button" class="cmb-kbd" data-cerrar aria-label="Cerrar"><kbd>esc</kbd></button>' +
'</header>' +
'<div class="cmb-tools" hidden></div>' +
'<div class="cmb-main">' +
'<div class="cmb-list" id="cmb-lista" role="listbox" aria-label="Resultados"></div>' +
'<aside class="cmb-prev" aria-live="polite"></aside>' +
'</div>' +
'<footer class="cmb-foot"><span><kbd>↑</kbd><kbd>↓</kbd> navegar</span><span><kbd>↵</kbd> abrir</span><span><kbd>esc</kbd> cerrar</span><span class="cmb-foot-sp"></span><span class="cmb-foot-n"></span></footer>' +
'</div>' +
'<div class="cmb-toast" role="status" aria-live="polite" hidden></div>';
document.body.appendChild(ov);
ui={
ov: ov, box: ov.querySelector('.cmb-box'), input: ov.querySelector('.cmb-input'),
limpiar: ov.querySelector('.cmb-limpiar'), tools: ov.querySelector('.cmb-tools'),
list: ov.querySelector('.cmb-list'), prev: ov.querySelector('.cmb-prev'),
n: ov.querySelector('.cmb-foot-n'), toast: ov.querySelector('.cmb-toast')
};
var t=null;
ui.input.addEventListener('input', function (){
var v=ui.input.value;
ui.limpiar.hidden = !v;
clearTimeout(t);
t=setTimeout(function (){
if(IDX) buscar(v);
else { st.q=v; pintar(); cargar().then(function (){ buscar(ui.input.value); }).catch(errorCarga); }}, 40);
});
ui.limpiar.addEventListener('click', function (){
ui.input.value=''; ui.limpiar.hidden=true;
st.filtro={ cat: '', marca: '', oferta: false }; st.orden='rel';
buscar(''); ui.input.focus();
});
ui.input.addEventListener('keydown', teclas);
ov.addEventListener('click', function (e){
var el;
if((el=e.target.closest('[data-agregar]'))){ e.preventDefault(); e.stopPropagation(); agregar(+el.getAttribute('data-agregar'), el); return; }
if(e.target.closest('[data-cerrar]')){ e.preventDefault(); cerrar(); return; }
if((el=e.target.closest('[data-f]'))){
var tipo=el.getAttribute('data-f'), val=el.getAttribute('data-v')||'';
if(tipo==='oferta') st.filtro.oferta = !st.filtro.oferta;
else st.filtro[tipo]=st.filtro[tipo]===val ? '':val;
filtrar(); return;
}
if(e.target.closest('[data-mas]')){ st.limite +=30; pintarLista(); return; }
if((el=e.target.closest('[data-reciente]'))){
ui.input.value=el.getAttribute('data-reciente'); ui.limpiar.hidden=false; buscar(ui.input.value); ui.input.focus(); return;
}
if(e.target.closest('[data-borrar-recientes]')){ try { localStorage.removeItem(LS_REC); } catch (x){} pintar(); return; }
if(e.target.closest('.cmb-row, .cmb-card, .cmb-ver')) registrar(st.q);
});
ov.addEventListener('change', function (e){
if(e.target.matches('.cmb-orden')){ st.orden=e.target.value; filtrar(); }});
ui.list.addEventListener('mousemove', function (e){
if(MOVIL.matches) return;
var row=e.target.closest('.cmb-row');
if(!row) return;
var i=+row.getAttribute('data-i');
if(i!==st.activo){ st.activo=i; marcarActivo(false); }});
return ui;
}
function teclas(e){
if(e.key==='ArrowDown'||e.key==='ArrowUp'){
e.preventDefault();
var max=Math.min(st.res.length, st.limite) - 1;
if(max < 0) return;
st.activo=e.key==='ArrowDown' ? Math.min(max, st.activo + 1):Math.max(0, st.activo - 1);
marcarActivo(true);
}else if(e.key==='Enter'){
e.preventDefault();
var it=st.res[st.activo >=0 ? st.activo:0];
if(it&&(st.activo >=0||st.res.length===1)){ registrar(st.q); location.href=linkDe(it); }
else if(st.res.length){ registrar(st.q); ui.input.blur(); }}else if(e.key==='Escape'){
e.preventDefault(); cerrar();
}}
function marcarActivo(scroll){
var rows=ui.list.querySelectorAll('.cmb-row');
rows.forEach(function (r){
var on=+r.getAttribute('data-i')===st.activo;
r.classList.toggle('is-on', on);
r.setAttribute('aria-selected', on ? 'true':'false');
if(on){ ui.input.setAttribute('aria-activedescendant', r.id); if(scroll) r.scrollIntoView({ block: 'nearest' });}});
pintarPrevia();
}
function resaltar(nombre){
var alts=[];
st.grupos.forEach(function (g){ g.forEach(function (a){ if(a[0].length >=2) alts.push(a[0]); });});
if(!alts.length||norm(st.q).length < 2) return esc(nombre);
return nombre.split(/(\s+)/).map(function (w){
if(!w.trim()) return w;
var n=norm(w);
return alts.some(function (a){ return n.indexOf(a)===0; }) ? '<mark>' + esc(w) + '</mark>':esc(w);
}).join('');
}
function precioHtml(it, grande){
if(!(it.p > 0)) return '<span class="cmb-consultar">Consultar precio</span>';
var d=descuento(it);
return '<span class="cmb-precio' + (grande ? ' is-lg':'') + '"><b>' + money(precioDe(it)) + '</b>' +
(it.o > 0 ? '<s>' + money(it.p) + '</s>':'') + (d >=1 ? '<em>-' + d + '%</em>':'') + '</span>';
}
function stockHtml(it){
if(it.k==null) return '<span class="cmb-stock is-ok">Disponible</span>';
if(it.k <=2) return '<span class="cmb-stock is-low">' + (it.k===1 ? 'Última unidad':'Últimas ' + it.k + ' unidades') + '</span>';
return '<span class="cmb-stock is-ok">Disponible · ' + nf(it.k) + ' unidades</span>';
}
function thumb(it, cls){
var u=imgUrl(it);
return '<span class="' + cls + '">' + (u ? '<img src="' + esc(u) + '" alt="" loading="lazy" decoding="async">':I.img) + '</span>';
}
function btnAgregar(it, conTexto){
if(!(it.p > 0)) return '';
return '<button type="button" class="' + (conTexto ? 'cmb-btn cmb-btn-dark':'cmb-add') + '" data-agregar="' + it.id + '" aria-label="Agregar ' + esc(it.n) + ' al carrito">' +
(conTexto ? I.bolsa + '<span>Agregar al carrito</span>':I.mas) + '</button>';
}
function filaHtml(it, i){
var meta=[it.b, it.c].filter(Boolean).map(esc).join(' · ');
return '<a class="cmb-row' + (i===st.activo ? ' is-on':'') + '" id="cmb-r' + i + '" data-i="' + i + '" role="option" aria-selected="' + (i===st.activo) + '" href="' + esc(linkDe(it)) + '">' +
thumb(it, 'cmb-thumb') +
'<span class="cmb-info">' +
(meta ? '<span class="cmb-kicker">' + meta + '</span>':'') +
'<span class="cmb-name">' + resaltar(it.n) + '</span>' +
'<span class="cmb-line">' + precioHtml(it) + (it.k!=null&&it.k <=2 ? '<span class="cmb-pill-low">' + (it.k===1 ? 'Última':'Últimas ' + it.k) + '</span>':'') + '</span>' +
'</span>' +
btnAgregar(it, false) +
'</a>';
}
function tarjetaHtml(it){
return '<a class="cmb-card" href="' + esc(linkDe(it)) + '">' +
thumb(it, 'cmb-card-img') +
'<span class="cmb-card-name">' + esc(it.n) + '</span>' +
precioHtml(it) +
btnAgregar(it, false) +
'</a>';
}
function recientes(){
try { return JSON.parse(localStorage.getItem(LS_REC)||'[]'); } catch (e){ return []; }}
function registrar(q){
q=String(q||'').trim();
if(q.length < 2) return;
try {
var r=recientes().filter(function (x){ return norm(x)!==norm(q); });
r.unshift(q);
localStorage.setItem(LS_REC, JSON.stringify(r.slice(0, 6)));
} catch (e){}
if(st.enviado!==q&&typeof window.gtag==='function'){
st.enviado=q;
try { window.gtag('event', 'search', { search_term: q });} catch (e){}}
}
function pintar(){
if(!ui) return;
var q=norm(st.q);
ui.box.classList.toggle('is-empty', q.length < 2);
if(!IDX){ pintarCargando(); return; }
if(q.length < 2){ pintarInicio(); return; }
pintarTools();
pintarLista();
}
function pintarCargando(){
ui.tools.hidden=true;
var sk='';
for (var i=0; i < 5; i++) sk +='<div class="cmb-row is-sk"><span class="cmb-thumb cmb-shimmer"></span><span class="cmb-info"><span class="cmb-shimmer" style="width:40%;height:10px"></span><span class="cmb-shimmer" style="width:85%;height:14px"></span><span class="cmb-shimmer" style="width:30%;height:14px"></span></span></div>';
ui.list.innerHTML=sk;
ui.prev.innerHTML='';
ui.n.textContent='';
}
function pintarInicio(){
ui.tools.hidden=true;
var rec=recientes(), h='';
if(rec.length){
h +='<section class="cmb-sec"><div class="cmb-sec-h"><h3>Recientes</h3><button type="button" class="cmb-link" data-borrar-recientes>Borrar</button></div><div class="cmb-recents">' +
rec.map(function (r){ return '<button type="button" class="cmb-recent" data-reciente="' + esc(r) + '">' + I.reloj + '<span>' + esc(r) + '</span></button>'; }).join('') + '</div></section>';
}
if(MOVIL.matches&&IDX.top.length){
h +='<section class="cmb-sec"><div class="cmb-sec-h"><h3>' + IDX.topTitulo + '</h3></div><div class="cmb-carousel">' + IDX.top.map(tarjetaHtml).join('') + '</div></section>';
}
h +='<section class="cmb-sec"><div class="cmb-sec-h"><h3>Explorar categorías</h3></div><div class="cmb-cats">' +
IDX.cats.slice(0, MOVIL.matches ? 10:12).map(function (c){
return '<a class="cmb-cat" href="' + esc((C.home||'') + c[1]) + '"><span>' + esc(c[0]) + '</span><small>' + nf(c[2]) + '</small></a>';
}).join('') + '</div></section>';
ui.list.innerHTML=h;
ui.prev.innerHTML=IDX.top.length
? '<div class="cmb-prev-top"><h3>' + IDX.topTitulo + '</h3>' + IDX.top.slice(0, 6).map(function (it){
return '<a class="cmb-mini" href="' + esc(linkDe(it)) + '">' + thumb(it, 'cmb-mini-img') +
'<span class="cmb-mini-info"><span class="cmb-mini-name">' + esc(it.n) + '</span>' + precioHtml(it) + '</span></a>';
}).join('') + '</div>'
: '';
ui.n.textContent=nf(IDX.items.length) + ' productos disponibles';
}
function pintarTools(){
var fc=facetas(), f=st.filtro, h='';
var chip=function (tipo, val, label, n, on){
return '<button type="button" class="cmb-chip' + (on ? ' is-on':'') + '" data-f="' + tipo + '" data-v="' + esc(val) + '">' + esc(label) + (n!=null ? '<small>' + nf(n) + '</small>':'') + '</button>';
};
if(fc.ofertas) h +=chip('oferta', '', 'Ofertas', fc.ofertas, f.oferta);
fc.cats.forEach(function (c){ if(fc.cats.length > 1||f.cat) h +=chip('cat', c[0], c[0], c[1], f.cat===c[0]); });
fc.marcas.forEach(function (m){ h +=chip('marca', m[0], m[0], m[1], f.marca===m[0]); });
h='<div class="cmb-chips">' + h + '</div>' +
'<label class="cmb-sort"><span>Ordenar</span><select class="cmb-orden" aria-label="Ordenar">' +
'<option value="rel"' + (st.orden==='rel' ? ' selected':'') + '>Relevancia</option>' +
'<option value="asc"' + (st.orden==='asc' ? ' selected':'') + '>Menor precio</option>' +
'<option value="desc"' + (st.orden==='desc' ? ' selected':'') + '>Mayor precio</option>' +
'</select></label>';
ui.tools.innerHTML=h;
ui.tools.hidden = !st.base.length;
}
function pintarLista(){
var q=st.q.trim();
if(!st.base.length){
ui.list.innerHTML='<div class="cmb-empty"><span class="cmb-empty-ico">' + I.lupa + '</span><b>Sin resultados para "' + esc(q) + '"</b>' +
'<span>Revisa cómo está escrito o prueba con la marca o el código del producto.</span></div>' +
'<section class="cmb-sec"><div class="cmb-sec-h"><h3>Explorar categorías</h3></div><div class="cmb-cats">' +
IDX.cats.slice(0, 8).map(function (c){ return '<a class="cmb-cat" href="' + esc((C.home||'') + c[1]) + '"><span>' + esc(c[0]) + '</span><small>' + nf(c[2]) + '</small></a>'; }).join('') + '</div></section>';
ui.prev.innerHTML='';
ui.n.textContent='';
return;
}
var h='';
if(st.relajado) h +='<div class="cmb-note">No encontramos <b>"' + esc(q) + '"</b>. Te mostramos resultados para <b>"' + esc(st.relajado) + '"</b>.</div>';
else if(st.corregido) h +='<div class="cmb-note">Mostrando resultados parecidos a <b>"' + esc(q) + '"</b></div>';
if(st.cats.length&&!st.filtro.cat){
h +=st.cats.map(function (c){
return '<a class="cmb-catlink" href="' + esc((C.home||'') + c[1]) + '"><span>Ver toda la categoría <b>' + esc(c[0]) + '</b></span><small>' + nf(c[2]) + ' productos</small>' + I.flecha + '</a>';
}).join('');
}
if(!st.res.length){
h +='<div class="cmb-empty is-sm"><b>Ningún resultado con estos filtros</b><span>Quita un filtro para ver más.</span></div>';
}else{
h +=st.res.slice(0, st.limite).map(filaHtml).join('');
if(st.res.length > st.limite) h +='<button type="button" class="cmb-more" data-mas>Mostrar más (' + nf(st.res.length - st.limite) + ')</button>';
}
ui.list.innerHTML=h;
ui.list.scrollTop=0;
ui.n.textContent=st.res.length===1 ? '1 resultado':nf(st.res.length) + ' resultados';
pintarPrevia();
}
function pintarPrevia(){
if(MOVIL.matches) return;
var it=st.res[st.activo];
if(!it){ ui.prev.innerHTML=''; return; }
var u=imgUrl(it);
ui.prev.innerHTML =
'<div class="cmb-pv">' +
'<a class="cmb-pv-img" href="' + esc(linkDe(it)) + '" tabindex="-1">' + (u ? '<img src="' + esc(imgGrande(it)) + '" alt="">':I.img) +
(descuento(it) >=1 ? '<span class="cmb-pv-badge">-' + descuento(it) + '%</span>':'') + '</a>' +
(it.b ? '<span class="cmb-kicker">' + esc(it.b) + '</span>':'') +
'<h4 class="cmb-pv-name">' + esc(it.n) + '</h4>' +
'<span class="cmb-pv-meta">' + [it.c, it.s ? 'Código ' + it.s:''].filter(Boolean).map(esc).join(' · ') + '</span>' +
precioHtml(it, true) +
stockHtml(it) +
'<div class="cmb-pv-actions">' + btnAgregar(it, true) +
'<a class="cmb-btn cmb-btn-line cmb-ver" href="' + esc(linkDe(it)) + '">Ver producto' + I.flecha + '</a></div>' +
'</div>';
}
function errorCarga(){
if(!ui) return;
ui.list.innerHTML='<div class="cmb-empty"><b>No se pudo cargar el buscador</b><span>Revisa tu conexión e intenta de nuevo.</span></div>';
}
function agregar(id, btn){
if(btn.classList.contains('is-busy')) return;
btn.classList.add('is-busy');
var body=new URLSearchParams();
body.append('product_id', id);
body.append('quantity', 1);
fetch((C.home||'') + '/?wc-ajax=add_to_cart', {
method: 'POST', credentials: 'same-origin',
headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' }, body: body
}).then(function (r){ return r.json(); }).then(function (d){
if(!d||d.error) throw new Error('add');
btn.classList.remove('is-busy');
btn.classList.add('is-done');
var prevHtml=btn.innerHTML;
btn.innerHTML=btn.classList.contains('cmb-add') ? I.ok:I.ok + '<span>Agregado</span>';
setTimeout(function (){ btn.classList.remove('is-done'); btn.innerHTML=prevHtml; }, 1800);
if(window.jQuery){
try {
if(d.fragments) window.jQuery.each(d.fragments, function (k, v){ window.jQuery(k).replaceWith(v); });
window.jQuery(document.body).trigger('added_to_cart', [d.fragments, d.cart_hash, window.jQuery(btn)]);
} catch (e){}}
var it=IDX.items.filter(function (x){ return x.id===id; })[0];
aviso('<b>Agregado al carrito</b><span>' + esc(it ? it.n:'') + '</span>', C.carrito);
}).catch(function (){
btn.classList.remove('is-busy');
var it=IDX.items.filter(function (x){ return x.id===id; })[0];
if(it) location.href=linkDe(it);
});
}
var tAviso=null;
function aviso(html, link){
ui.toast.innerHTML='<span class="cmb-toast-ok">' + I.ok + '</span><span class="cmb-toast-txt">' + html + '</span>' +
(link ? '<a href="' + esc(link) + '">Ver carrito</a>':'');
ui.toast.hidden=false;
setTimeout(function (){ ui.toast.classList.add('is-on'); }, 16);
clearTimeout(tAviso);
tAviso=setTimeout(function (){
ui.toast.classList.remove('is-on');
setTimeout(function (){ ui.toast.hidden=true; }, 200);
}, 3200);
}
function enfocar(){
ui.input.focus({ preventScroll: true });
setTimeout(function (){ if(st.abierto&&document.activeElement!==ui.input) ui.input.focus({ preventScroll: true });}, 120);
setTimeout(function (){ if(st.abierto&&document.activeElement!==ui.input) ui.input.focus({ preventScroll: true });}, 360);
}
function cerrarMenuElementor(){
var b=document.querySelector('.elementor-popup-modal .dialog-close-button');
if(b&&b.offsetParent!==null) b.click();
}
function abrir(texto){
crearUI();
if(st.abierto){ enfocar(); return; }
cerrarMenuElementor();
st.abierto=true;
ui.ov.hidden=false;
document.documentElement.classList.add('cmb-lock');
setTimeout(function (){ ui.ov.classList.add('is-on'); }, 16);
if(typeof texto==='string'&&texto.trim()){ ui.input.value=texto; ui.limpiar.hidden=false; }
enfocar();
try { history.pushState({ cmb: 1 }, ''); st.historial=true; } catch (e){}
pintar();
cargar().then(function (){ buscar(ui.input.value); }).catch(errorCarga);
}
function cerrar(desdeHistorial){
if(!st.abierto) return;
st.abierto=false;
ui.ov.classList.remove('is-on');
document.documentElement.classList.remove('cmb-lock');
setTimeout(function (){ if(!st.abierto) ui.ov.hidden=true; }, 220);
if(st.historial&&!desdeHistorial){ st.historial=false; try { history.back(); } catch (e){}}
st.historial=false;
}
window.addEventListener('popstate', function (){ if(st.abierto) cerrar(true); });
MOVIL.addEventListener&&MOVIL.addEventListener('change', function (){ if(st.abierto) pintar(); });
function botonesCabecera(){
document.querySelectorAll('.elementor-location-header .elementor-widget-hfe-cart').forEach(function (cart){
var prev=cart.previousElementSibling;
if(prev&&prev.classList.contains('cmb-trigger-wrap')) return;
var w=document.createElement('div');
w.className='cmb-trigger-wrap';
w.innerHTML='<button type="button" class="cmb-trigger" aria-label="Buscar productos">' + I.lupa +
'<span class="cmb-trigger-txt">Buscar productos</span><kbd class="cmb-trigger-kbd">/</kbd></button>';
cart.parentNode.insertBefore(w, cart);
});
}
var SEL_VIEJO='.dgwt-wcas-search-input, .dgwt-wcas-search-form input[type="search"]';
document.addEventListener('focusin', function (e){
if(e.target.matches&&e.target.matches(SEL_VIEJO)){ var v=e.target.value; e.target.blur(); abrir(v); }}, true);
document.addEventListener('submit', function (e){
if(e.target.matches&&e.target.matches('.dgwt-wcas-search-form')){
e.preventDefault();
var i=e.target.querySelector('input[type="search"], input[name="s"]');
abrir(i ? i.value:'');
}}, true);
document.addEventListener('click', function (e){
var t=e.target.closest&&e.target.closest('.cmb-trigger, .cmb-abrir, a[href="#buscar"], .dgwt-wcas-search-submit, .dgwt-wcas-ico-magnifier-handler');
if(t){ e.preventDefault(); abrir(); }});
document.addEventListener('keydown', function (e){
var el=document.activeElement||{};
var escribiendo=/INPUT|TEXTAREA|SELECT/.test(el.tagName||'')||el.isContentEditable;
if(!st.abierto&&((e.key==='/'&&!escribiendo)||((e.metaKey||e.ctrlKey)&&e.key.toLowerCase()==='k'))){
e.preventDefault(); abrir();
}});
function iniciar(){
botonesCabecera();
if('MutationObserver' in window){
var h=document.querySelector('.elementor-location-header');
if(h) new MutationObserver(botonesCabecera).observe(h, { childList: true, subtree: true });
}
var pre=function (){ cargar().catch(function (){});};
if('requestIdleCallback' in window) requestIdleCallback(pre, { timeout: 4000 });else setTimeout(pre, 2000);
document.addEventListener('pointerover', function (e){ if(e.target.closest&&e.target.closest('.cmb-trigger')) pre(); }, { passive: true });
}
if(document.readyState==='loading') document.addEventListener('DOMContentLoaded', iniciar);
else iniciar();
})();