Comparateur de Prix Épicerie au Québec

Économisez sur votre liste d’épicerie avec notre outil gratuit. Comparez Maxi, Super C, Metro, IGA, Walmart.


🔍

Chargement des spéciaux…

`); win.document.close(); win.print(); }

function render() { let filteredList = db.filter(p => { return (!filters.s || p.name.toLowerCase().includes(filters.s)) && (filters.c === 'all' || p.cat === filters.c) && (filters.st === 'all' || p.store === filters.st); });

if(filters.so === 'asc') filteredList.sort((a,b)=>a.price-b.price); else if(filters.so === 'desc') filteredList.sort((a,b)=>b.price-a.price); else filteredList.sort((a,b)=>a.rnd - b.rnd);

if(!filteredList.length) { els.grid.innerHTML = '

Aucun résultat.

'; els.btnMore.style.display = 'none'; return; }

let html = ''; const listToDisplay = filteredList.slice(0, visibleCount); listToDisplay.forEach((p, i) => { const isFav = favs.some(f => f.sig === p.sig); // Comparaison par Signature html += `

comparer ${p.store}
comparer
${p.name}
${p.quantity}
${p.priceStr}

`;

if ((i + 1) % CONFIG.AD_INTERVAL === 0) { html += `

Publicité

`; } });

els.grid.innerHTML = html; els.btnMore.style.display = filteredList.length > visibleCount ? 'inline-block' : 'none'; runAds(); }

function loadMore() { visibleCount += CONFIG.BATCH_SIZE; render(); }

function runAds() { const scheduler = window.requestIdleCallback || setTimeout; scheduler(() => { const ads = document.querySelectorAll('.adsbygoogle'); ads.forEach(ad => { if(!ad.innerHTML && !ad.getAttribute('data-adsbygoogle-status')) { try{ (window.adsbygoogle = window.adsbygoogle || []).push({}); }catch(e){} } }); }); }

function toggleFav(id) { const product = db.find(x => x.id === id); if(!product) return;

const idx = favs.findIndex(f => f.sig === product.sig); // Comparaison par Signature if(idx > -1) favs.splice(idx, 1); else { product.qty = 1; favs.push({...product}); }

localStorage.setItem('qc_favs_v56_fixed_qty', JSON.stringify(favs)); updateBadge(); render(); if(els.modal.classList.contains('open')) { const mode = els.mTitle.textContent.includes('Comparer') ? 'compare' : 'list'; renderList(mode === 'list' ? favs : null, mode); } }

function compare(id) { const ref = db.find(x => x.id === id); if(!ref) return; const words = ref.name.split(' ').filter(w => w.length > 2).slice(0, 2).map(w=>w.toLowerCase()); let matches = db.filter(p => p.id !== id && words.some(w => p.name.toLowerCase().includes(w))).sort((a,b)=>a.price-b.price).slice(0,5); els.mTitle.textContent = "Comparer : " + ref.name; renderList([ref, ...matches], 'compare'); openModal(); }

function openModal(mode) { if(mode === 'list') { els.mTitle.textContent = "Ma Liste"; renderList(favs, 'list'); } els.modal.classList.add('open'); document.body.classList.add('qc-modal-open'); }

function closeModal() { els.modal.classList.remove('open'); document.body.classList.remove('qc-modal-open'); } function openLB(src) { if(!src) return; els.lbImg.src = src; els.lb.classList.add('open'); document.body.classList.add('qc-modal-open'); } function closeLB() { els.lb.classList.remove('open'); document.body.classList.remove('qc-modal-open'); } function updateBadge() { if(els.cnt) els.cnt.textContent = favs.length; }

function renderStoreSelect() { const stores = [...new Set(db.map(p=>p.store))].sort(); const wrap = document.getElementById('sel-store-wrap'); wrap.innerHTML = `

Magasins

`; const dd = document.getElementById('qc-store-dropdown'); let html = `

Tous

`; stores.forEach(s => { html += `

comparer ${s}

`; }); dd.innerHTML = html; }

function toggleStoreMenu() { document.getElementById('qc-store-dropdown').classList.toggle('open'); } function selectStore(val, label) { filters.st = val; document.getElementById('qc-store-btn-txt').textContent = label; document.getElementById('qc-store-dropdown').classList.remove('open'); visibleCount = CONFIG.BATCH_SIZE; render(); }

function fillSelects() { const cats = [...new Set(db.map(p=>p.cat))].sort(); document.getElementById('sel-cat').innerHTML = '' + cats.map(c => ``).join(''); }

function debounce(fn, delay) { let timer; return (...args) => { clearTimeout(timer); timer = setTimeout(() => fn(...args), delay); }; }

init(); return { loadMore }; })();