/* AGS 92 B2B – NOVINKY v2 (novinky2.js.txt), verzia 2026-09-29a Čo robí: pás „Novinky“ na úvodnej stránke, stránka so všetkými novinkami (#novinky), položka v ľavom menu, štítok NOVINKA / ÚJDONSÁG na kartách v katalógu. Trhy SK, CZ, HU. Dáta: /buxus/docs/novinky.json.txt. Obnovuje ich ADMIN tlačidlom „Obnoviť novinky“ (len na klik, nič sa nespúšťa samo). Novinka = produkt vytvorený v BUXUSe pred ≤ days dňami, aktívny na doméne, skladom, nie OUTLET. Po uplynutí dní zmizne sám. Nastavenie v pätičke PRED týmto skriptom: window.agsNovinky = { mode: 'preview'|'live'|'off', days: 60, position: 'afterFirst'|'top', allow: ['Fiktívna firma pre OZ'], exclude: ['KÓD'] }; preview = vidí admin BUXUSu a účty v allow · live = všetci prihlásení partneri SK/CZ/HU · off = vypnuté. */ (function () { 'use strict'; if (window.__agsN2) return; window.__agsN2 = { version: '2026-09-29a' }; var CFG = Object.assign({ mode: 'preview', days: 60, position: 'afterFirst', allow: ['Fiktívna firma pre OZ'], exclude: [] }, window.agsNovinky || {}); var MKT = (location.pathname.match(/^\/(sk|cz|hu)(\/|$)/) || [])[1]; if (!MKT) return; var FILE = '/buxus/docs/novinky.json.txt'; var KEEP_DAYS = 90; var FEEDS = { sk: { url: 'https://data.ags92.com/xml/sk/all111/SK_VO_NEW_ALL.xml', code: 'CODE', moc: 'PRICEMO', am: 'AKCNAMOC' }, cz: { url: 'https://data.ags92.com/data/all02/CZ_VO_NEW_ALL.xml', code: 'CODE', moc: 'PRICEMO', am: 'AKCNIMOC' }, hu: { url: 'https://data.ags92.com/xml/hu/hu_vo/HU_VO_NEW_ALL.xml', code: 'ITEM_ID', moc: 'RECOMMENDED_RETAIL_PRICE', am: 'SPECIAL_RETAIL_PRICE' } }; var VAT = { sk: 1.23, cz: 1.21, hu: 1.27 }; var T = { sk: { title: 'Novinky', badge: 'NOVINKA', sub: function (n, d) { return n + ' ' + pl(n, 'nový model', 'nové modely', 'nových modelov') + ' za posledných ' + d + ' dní'; }, all: 'Zobraziť všetky', back: 'Späť na úvodnú stránku', every: 'Všetko', stock: 'Skladom', last: 'Posledné kusy', ks: 'ks', vars: function (k) { return '+' + k + ' ' + pl(k, 'variant', 'varianty', 'variantov'); }, vo: 'VO bez DPH', margin: 'marža', na: 'Cenu uvidíte v detaile', moc: 'MOC', other: 'Ostatné', menu: 'Novinky', brand: 'Všetky značky', sort: ['Najnovšie', 'Značka A–Z', 'MOC od najnižšej', 'MOC od najvyššej'], search: 'Hľadať v novinkách…', empty: 'Žiadna novinka nezodpovedá filtru.', detail: 'Detail produktu', found: function (n) { return n + ' ' + pl(n, 'produkt', 'produkty', 'produktov'); } }, cz: { title: 'Novinky', badge: 'NOVINKA', sub: function (n, d) { return n + ' ' + pl(n, 'nový model', 'nové modely', 'nových modelů') + ' za posledních ' + d + ' dní'; }, all: 'Zobrazit všechny', back: 'Zpět na úvodní stránku', every: 'Vše', stock: 'Skladem', last: 'Poslední kusy', ks: 'ks', vars: function (k) { return '+' + k + ' ' + pl(k, 'varianta', 'varianty', 'variant'); }, vo: 'VO bez DPH', margin: 'marže', na: 'Cenu uvidíte v detailu', moc: 'MOC', other: 'Ostatní', menu: 'Novinky', brand: 'Všechny značky', sort: ['Nejnovější', 'Značka A–Z', 'MOC od nejnižší', 'MOC od nejvyšší'], search: 'Hledat v novinkách…', empty: 'Filtru neodpovídá žádná novinka.', detail: 'Detail produktu', found: function (n) { return n + ' ' + pl(n, 'produkt', 'produkty', 'produktů'); } }, hu: { title: 'Újdonságok', badge: 'ÚJDONSÁG', sub: function (n, d) { return n + ' új modell az elmúlt ' + d + ' napban'; }, all: 'Összes újdonság', back: 'Vissza a főoldalra', every: 'Összes', stock: 'Raktáron', last: 'Utolsó darabok', ks: 'db', vars: function (k) { return '+' + k + ' változat'; }, vo: 'nettó nagyker. ár', margin: 'árrés', na: 'Az árat a termékoldalon látja', moc: 'Ajánlott ár', other: 'Egyéb', menu: 'Újdonságok', brand: 'Minden márka', sort: ['Legújabb', 'Márka A–Z', 'Ajánlott ár növekvő', 'Ajánlott ár csökkenő'], search: 'Keresés az újdonságok között…', empty: 'Nincs a szűrésnek megfelelő újdonság.', detail: 'Termék részletei', found: function (n) { return n + ' termék'; } } }; var L = T[MKT]; /* ---------- pomocné ---------- */ function pl(n, a, b, c) { return n === 1 ? a : (n >= 2 && n <= 4 ? b : c); } function ls(k, v) { try { if (v === undefined) return localStorage.getItem(k); localStorage.setItem(k, v); } catch (e) { return null; } } function esc(s) { return String(s == null ? '' : s).replace(/[&<>"]/g, function (c) { return { '&': '&', '<': '<', '>': '>', '"': '"' }[c]; }); } function num(s) { var v = parseFloat(String(s == null ? '' : s).replace(/\s/g, '').replace(',', '.')); return isNaN(v) ? 0 : v; } function money(v) { if (!v && v !== 0) return ''; if (MKT === 'hu') return Math.round(v).toLocaleString('hu-HU') + ' Ft'; if (MKT === 'cz') return v.toLocaleString('cs-CZ', { minimumFractionDigits: 0, maximumFractionDigits: 2 }) + ' Kč'; return v.toFixed(2).replace('.', ',') + ' €'; } function dday(iso) { var d = new Date(String(iso).replace(' ', 'T')); return MKT === 'hu' ? (('0' + (d.getMonth() + 1)).slice(-2) + '. ' + ('0' + d.getDate()).slice(-2) + '.') : (d.getDate() + '. ' + (d.getMonth() + 1) + '.'); } function ymd() { var d = new Date(); return d.getFullYear() + ('0' + (d.getMonth() + 1)).slice(-2) + ('0' + d.getDate()).slice(-2); } function isAdmin() { return !!document.querySelector('.buxus-toolbar-container'); } function partner() { var e = document.querySelector('.header-basic-info h3'); return e ? e.textContent.trim() : ''; } function visible() { if (CFG.mode === 'off' || !partner()) return false; if (CFG.mode === 'live') return true; return isAdmin() || (CFG.allow || []).some(function (a) { return a && partner().indexOf(a) >= 0; }); } function el(html) { var d = document.createElement('div'); d.innerHTML = html.trim(); return d.firstChild; } var ICON = ''; /* ---------- štýly ---------- */ function css() { if (document.getElementById('agn-css')) return; var s = document.createElement('style'); s.id = 'agn-css'; s.textContent = [ '.agn{--t:#14908e;--t2:#22d8d6;--b:#2c5ea8;--ink:#1d2b3a;--mut:#6b7a8c;--line:#e3eaf2;--bg:#f5f9fc;font-family:inherit;color:var(--ink)}', '.agn-box{background:#fff;border:1px solid var(--line);border-radius:12px;margin:0 15px 20px;overflow:hidden;box-shadow:0 1px 3px rgba(20,40,70,.06);position:relative}#agn-home-wrap .agn-box{margin:0 0 20px}', '.agn-head{display:flex;align-items:center;gap:14px;flex-wrap:wrap;padding:14px 18px;background:linear-gradient(100deg,#0f7f86 0%,#1fa6a3 45%,#2c5ea8 100%);color:#fff}', '.agn-title{display:flex;align-items:center;gap:10px}.agn-title h2{margin:0;font-size:21px;font-weight:800;letter-spacing:.6px;text-transform:uppercase;color:#fff}', '.agn-sub{font-size:12.5px;opacity:.9}', '.agn-all{margin-left:auto;display:inline-flex;align-items:center;gap:6px;background:#fff;color:var(--b)!important;border-radius:20px;padding:6px 14px;font-size:12.5px;font-weight:700;text-decoration:none!important;cursor:pointer;box-shadow:0 1px 4px rgba(0,0,0,.15)}', '.agn-all:hover{background:#eef6ff}', '.agn-prev{position:absolute;top:8px;right:8px;background:#ffcc00;color:#333;font:700 10px/1 sans-serif;padding:3px 6px;border-radius:3px;z-index:3}', '.agn-adm{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:12px;color:var(--mut);background:#fbfcfe;border-bottom:1px solid var(--line);padding:7px 18px}', '.agn-adm.stale{background:#fff7e8;color:#8a5a00}.agn-adm b{color:var(--ink)}', '.agn-btn{border:1px solid var(--b);background:#fff;color:var(--b);border-radius:6px;padding:4px 10px;font-size:12px;font-weight:700;cursor:pointer}.agn-btn:hover{background:var(--b);color:#fff}.agn-btn[disabled]{opacity:.5;cursor:wait}', '.agn-bar{flex:1;min-width:120px;height:6px;background:#e6edf5;border-radius:3px;overflow:hidden;display:none}.agn-bar i{display:block;height:100%;width:0;background:linear-gradient(90deg,var(--t),var(--b));transition:width .3s}', '.agn-chips{display:flex;gap:8px;flex-wrap:wrap;padding:12px 18px 4px}', '.agn-chip{border:1px solid var(--line);background:var(--bg);color:#34465a;border-radius:18px;padding:5px 12px;font-size:12px;font-weight:600;cursor:pointer;transition:all .15s}', '.agn-chip span{color:var(--mut);font-weight:500;margin-left:4px}.agn-chip:hover{border-color:var(--t)}', '.agn-chip.on{background:var(--t);border-color:var(--t);color:#fff}.agn-chip.on span{color:#d9fbfa}', '.agn-rail{position:relative;padding:8px 6px 14px}', '.agn-row{display:flex;gap:14px;overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth;padding:6px 12px 10px;scrollbar-width:thin}', '.agn-row::-webkit-scrollbar{height:6px}.agn-row::-webkit-scrollbar-thumb{background:#cfdbe8;border-radius:3px}', '.agn-rail:before,.agn-rail:after{content:"";position:absolute;top:0;bottom:14px;width:28px;z-index:2;pointer-events:none}', '.agn-rail:before{left:0;background:linear-gradient(90deg,#fff,rgba(255,255,255,0))}.agn-rail:after{right:0;background:linear-gradient(270deg,#fff,rgba(255,255,255,0))}', '.agn-arr{position:absolute;top:42%;z-index:3;width:36px;height:36px;border-radius:50%;border:0;background:#fff;box-shadow:0 2px 8px rgba(20,40,70,.25);color:var(--b);font-size:20px;line-height:36px;cursor:pointer}', '.agn-arr:hover{background:var(--b);color:#fff}.agn-arr.l{left:4px}.agn-arr.r{right:4px}', '.agn-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(185px,1fr));gap:16px;padding:12px 18px 20px}', '.agn-card{flex:0 0 196px;scroll-snap-align:start;background:#fff;border:1px solid var(--line);border-radius:10px;overflow:hidden;display:flex;flex-direction:column;transition:transform .15s,box-shadow .15s}', '.agn-card:hover{transform:translateY(-3px);box-shadow:0 8px 22px rgba(20,40,70,.13)}', '.agn-media{position:relative;display:flex;align-items:center;justify-content:center;height:160px;background:#fff;padding:10px;overflow:hidden}', '.agn-media img{max-width:100%;max-height:140px;object-fit:contain;transition:transform .25s}.agn-card:hover .agn-media img{transform:scale(1.06)}', '.agn-pill{position:absolute;top:8px;font:800 10px/1 sans-serif;letter-spacing:.4px;padding:5px 8px;border-radius:12px}', '.agn-new{left:8px;background:var(--t2);color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.12)}.agn-date{right:8px;background:rgba(255,255,255,.92);color:var(--mut);border:1px solid var(--line);font-weight:700}', '.agn-body{padding:10px 12px 12px;display:flex;flex-direction:column;gap:4px;flex:1;border-top:1px solid #f0f4f8}', '.agn-brand{font-size:10.5px;font-weight:800;letter-spacing:.5px;color:var(--t);text-transform:uppercase}', '.agn-name{font-size:12.5px;font-weight:600;line-height:1.35;color:var(--ink)!important;text-decoration:none!important;height:51px;overflow:hidden;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}', '.agn-name:hover{color:var(--b)!important}.agn-code{font-size:10.5px;color:#9aa7b5}', '.agn-price{margin-top:4px;min-height:34px}.agn-price b{font-size:16px;color:var(--b)}.agn-price small{display:block;font-size:10.5px;color:var(--mut)}', '.agn-margin{display:inline-block;margin-left:6px;background:#e7f7ec;color:#16803c;font-size:11px;font-weight:800;border-radius:10px;padding:2px 7px;vertical-align:2px}', '.agn-na{font-size:11px;color:var(--mut)}', '.agn-skel{display:block;height:14px;width:70%;border-radius:4px;background:linear-gradient(90deg,#eef2f6 25%,#f7f9fb 50%,#eef2f6 75%);background-size:200% 100%;animation:agnSh 1.2s infinite}', '.agn-skel+.agn-skel{width:45%;margin-top:5px;height:10px}@keyframes agnSh{to{background-position:-200% 0}}', '.agn-moc{font-size:11.5px;color:var(--mut)}.agn-moc s{color:#c0392b;margin-right:4px}', '.agn-foot{display:flex;justify-content:space-between;align-items:center;gap:6px;margin-top:auto;padding-top:6px;font-size:11px}', '.agn-stock{color:#16803c;font-weight:700}.agn-stock:before{content:"";display:inline-block;width:7px;height:7px;border-radius:50%;background:#22a35a;margin-right:5px;vertical-align:1px}', '.agn-stock.low{color:#b35c00}.agn-stock.low:before{background:#f0a020}.agn-var{color:var(--mut);background:var(--bg);border-radius:8px;padding:2px 6px}', '.agn-tools{display:flex;gap:10px;flex-wrap:wrap;align-items:center;padding:12px 18px 0}', '.agn-tools select,.agn-tools input{border:1px solid var(--line);border-radius:8px;padding:6px 10px;font-size:12.5px;background:#fff;color:var(--ink)}.agn-tools input{min-width:220px;flex:1}', '.agn-count{font-size:12px;color:var(--mut);margin-left:auto}.agn-empty{padding:30px;text-align:center;color:var(--mut)}', '.agn-menu a{background:linear-gradient(100deg,#0f7f86,#1fa6a3)!important;position:relative}', '.agn-cnt{display:inline-block;background:#fff;color:#0f7f86;border-radius:9px;padding:0 7px;margin-left:7px;font-size:11px;font-weight:800;line-height:17px}', '.agn-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:#ffe14d;margin-left:6px;box-shadow:0 0 0 0 rgba(255,225,77,.8);animation:agnPulse 1.8s infinite}', '@keyframes agnPulse{70%{box-shadow:0 0 0 7px rgba(255,225,77,0)}100%{box-shadow:0 0 0 0 rgba(255,225,77,0)}}', '.agn-cb{position:absolute;top:8px;right:8px;z-index:3;background:#22d8d6;color:#fff;font:800 10px/1 sans-serif;letter-spacing:.4px;padding:5px 8px;border-radius:12px;box-shadow:0 1px 3px rgba(0,0,0,.15)}', '@media (max-width:767px){.agn-box{margin:0 0 16px}.agn-head{padding:12px}.agn-card{flex-basis:170px}.agn-grid{grid-template-columns:repeat(2,1fr);gap:10px;padding:10px}}' ].join(''); document.head.appendChild(s); } /* ---------- dáta pre partnera ---------- */ var S = { data: null, list: [], pids: {}, codes: {} }; async function loadData() { try { var r = await fetch(FILE, { cache: 'no-cache' }); if (r.ok) { var t = await r.text(); var j = JSON.parse(t); ls('agn_data', t); return j; } } catch (e) {} try { return JSON.parse(ls('agn_data')); } catch (e) { return null; } } function build(data) { var min = Date.now() - CFG.days * 864e5, ex = {}, groups = {}; (CFG.exclude || []).forEach(function (c) { ex[String(c).trim()] = 1; }); S.pids = {}; S.codes = {}; (data.items || []).forEach(function (it) { if (!it.act || !it.act[MKT] || ex[it.code]) return; if (Date.parse(String(it.c).replace(' ', 'T')) < min) return; S.pids[it.pid] = 1; S.codes[it.code] = 1; if (it.out || !(it.q && it.q[MKT] > 0)) return; var k = it.v || it.code; (groups[k] = groups[k] || []).push(it); }); return Object.keys(groups).map(function (k) { var g = groups[k].slice().sort(function (a, b) { return b.q[MKT] - a.q[MKT]; }), x = g[0]; var c = g.reduce(function (a, b) { return a.c > b.c ? a : b; }).c; return { pid: x.pid, code: x.code, name: (x.t && (x.t[MKT] || x.t.sk)) || x.code, brand: x.b || '', img: x.img, moc: x.moc[MKT] || 0, am: x.am[MKT] || 0, cat: (x.cat && x.cat[MKT]) || L.other, c: c, variants: g.length, stock: g.reduce(function (s, y) { return s + (y.q[MKT] || 0); }, 0) }; }).sort(function (a, b) { return a.c < b.c ? 1 : a.c > b.c ? -1 : b.pid - a.pid; }); } /* ---------- ceny partnera (len viditeľné karty, cache deň) ---------- */ var PK = 'agn_p_' + MKT + '_' + ymd(), P = {}; try { P = JSON.parse(ls(PK) || '{}'); if (P.__u !== partner()) P = { __u: partner() }; } catch (e) { P = { __u: partner() }; } var queue = [], running = 0; function want(card) { var pid = card.getAttribute('data-pid'); if (P[pid]) return paint(card, P[pid]); if (queue.indexOf(pid) < 0) queue.push(pid); pump(); } function pump() { while (running < 2 && queue.length) { (function (pid) { running++; fetch('/' + MKT + '/api/product/' + pid).then(function (r) { return r.json(); }).then(function (j) { var vo = j && j['item-total-price-no-vat']; P[pid] = vo ? { vo: vo, m: j['item-margin-percent-formated'] || '' } : { na: 1 }; }).catch(function () { P[pid] = { na: 1 }; }).then(function () { running--; ls(PK, JSON.stringify(P)); document.querySelectorAll('.agn-card[data-pid="' + pid + '"]').forEach(function (c) { paint(c, P[pid]); }); pump(); }); })(queue.shift()); } } function paint(card, p) { var e = card.querySelector('.agn-price'); if (!e) return; e.innerHTML = p.na ? '' + L.na + '' : '' + money(p.vo) + '' + (p.m ? '' + esc(L.margin + ' ' + p.m) + '' : '') + '' + L.vo + ''; } var IO = 'IntersectionObserver' in window ? new IntersectionObserver(function (es) { es.forEach(function (e) { if (e.isIntersecting) { IO.unobserve(e.target); want(e.target); } }); }, { rootMargin: '150px' }) : null; function watch(root) { root.querySelectorAll('.agn-card').forEach(function (c) { if (IO) IO.observe(c); else want(c); }); } /* ---------- vykreslenie ---------- */ /* HU: generate_page presmeruje na /sk/ a partnera odhlási → na HU odkaz cez vyhľadávanie kódu */ function link(x) { return MKT === 'hu' ? '/hu/keresesi-eredmenyek?term=' + encodeURIComponent(x.code) : '/' + MKT + '/buxus/generate_page.php?page_id=' + x.pid; } function card(x) { var href = link(x), low = x.stock > 0 && x.stock < 5; return '
' + '' + L.badge + '' + dday(x.c) + '' + '
' + esc(x.brand) + '
' + '' + esc(x.name) + '
' + esc(x.code) + '
' + '
' + (x.moc ? '
' + L.moc + ' ' + (x.am && x.am < x.moc ? '' + money(x.moc) + '' + money(x.am) : money(x.moc)) + '
' : '') + '
' + (low ? L.last : L.stock) + ' ' + (x.stock >= 50 ? '50+' : x.stock) + ' ' + L.ks + '' + (x.variants > 1 ? '' + L.vars(x.variants - 1) + '' : '') + '
' + '
'; } function cats(list) { var m = {}; list.forEach(function (x) { m[x.cat] = (m[x.cat] || 0) + 1; }); return [[L.every, list.length]].concat(Object.keys(m).map(function (k) { return [k, m[k]]; }).sort(function (a, b) { return b[1] - a[1]; })); } function adminBar() { if (!isAdmin() || !S.data) return ''; var age = Math.floor((Date.now() - Date.parse(S.data.generated)) / 864e5), stale = age >= 7; if (!S.data.count) return '
🔧 Len pre admina: dáta noviniek ešte nie sú vygenerované.
'; return '
🔧 Len pre admina: dáta z ' + new Date(S.data.generated).toLocaleString('sk-SK') + (age > 0 ? ' (pred ' + age + ' ' + pl(age, 'dňom', 'dňami', 'dňami') + ')' : ' (dnes)') + ' · ' + S.data.count + ' produktov za ' + (S.data.days || KEEP_DAYS) + ' dní' + (stale ? ' · odporúčam obnoviť' : '') + '
'; } var UI = { cat: L.every, brand: '', sort: 0, q: '', full: false }; function strip(mid) { var box = document.getElementById('agn-home'); if (!box) { box = el('
'); var row0 = mid.querySelector('.promobox-row'); if (CFG.position === 'afterFirst' && row0 && row0.children.length) { var wrap = el('
'); wrap.appendChild(box); row0.insertBefore(wrap, row0.children[1] || null); } else mid.insertBefore(box, mid.firstElementChild); } var list = S.list.filter(function (x) { return UI.cat === L.every || x.cat === UI.cat; }); box.innerHTML = (CFG.mode !== 'live' ? '
NÁHĽAD
' : '') + '
' + ICON + '

' + L.title + '

' + L.sub(S.list.length, CFG.days) + '' + L.all + ' (' + S.list.length + ') →
' + adminBar() + '
' + cats(S.list).map(function (c) { return ''; }).join('') + '
' + '
' + list.slice(0, 24).map(card).join('') + '
'; box.querySelectorAll('.agn-chip').forEach(function (b) { b.onclick = function () { UI.cat = b.getAttribute('data-cat'); strip(mid); }; }); var row = box.querySelector('.agn-row'); box.querySelector('.agn-arr.l').onclick = function () { row.scrollLeft -= row.clientWidth * 0.8; }; box.querySelector('.agn-arr.r').onclick = function () { row.scrollLeft += row.clientWidth * 0.8; }; bindAdmin(box); watch(box); } function fullView(mid) { var box = document.getElementById('agn-full'); if (!box) { box = el('
'); mid.insertBefore(box, mid.firstElementChild); } var brands = {}; S.list.forEach(function (x) { if (x.brand) brands[x.brand] = 1; }); box.innerHTML = (CFG.mode !== 'live' ? '
NÁHĽAD
' : '') + '
' + ICON + '

' + L.title + '

' + L.sub(S.list.length, CFG.days) + '← ' + L.back + '
' + adminBar() + '
' + cats(S.list).map(function (c) { return ''; }).join('') + '
' + '
' + '
'; function draw() { var q = UI.q.toLowerCase(), list = S.list.filter(function (x) { return (UI.cat === L.every || x.cat === UI.cat) && (!UI.brand || x.brand === UI.brand) && (!q || (x.name + ' ' + x.code + ' ' + x.brand).toLowerCase().indexOf(q) >= 0); }); if (UI.sort === 1) list.sort(function (a, b) { return a.brand.localeCompare(b.brand) || (a.c < b.c ? 1 : -1); }); if (UI.sort === 2) list.sort(function (a, b) { return (a.am || a.moc) - (b.am || b.moc); }); if (UI.sort === 3) list.sort(function (a, b) { return (b.am || b.moc) - (a.am || a.moc); }); var g = box.querySelector('.agn-grid'); g.innerHTML = list.length ? list.map(card).join('') : '
' + L.empty + '
'; box.querySelector('.agn-count').textContent = L.found(list.length); watch(g); } box.querySelectorAll('.agn-chip').forEach(function (b) { b.onclick = function () { UI.cat = b.getAttribute('data-cat'); box.querySelectorAll('.agn-chip').forEach(function (x) { x.classList.toggle('on', x === b); }); draw(); }; }); box.querySelector('input').oninput = function (e) { UI.q = e.target.value; draw(); }; box.querySelector('[data-f=brand]').onchange = function (e) { UI.brand = e.target.value; draw(); }; box.querySelector('[data-f=sort]').onchange = function (e) { UI.sort = +e.target.value; draw(); }; box.querySelector('.agn-all').onclick = function (e) { e.preventDefault(); location.hash = ''; }; bindAdmin(box); draw(); } function route() { var mid = document.querySelector('#middle_col'); if (!mid) return; var full = /#novinky/.test(location.hash); Array.prototype.forEach.call(mid.children, function (c) { if (c.id !== 'agn-full') c.style.display = full ? 'none' : ''; }); var f = document.getElementById('agn-full'); if (full) { fullView(mid); window.scrollTo(0, mid.getBoundingClientRect().top + window.scrollY - 90); } else { if (f) f.remove(); if (S.list.length || isAdmin()) strip(mid); } } function menu() { if (document.getElementById('agn-menu') || !S.list.length) return; var tops = document.querySelectorAll('#left_col .left-menu-top-item'); if (!tops.length) return; var ref = Array.prototype.find.call(tops, function (e) { return /V[ýy]predaj|V[ýy]prodej|Kiárusítás/i.test(e.textContent); }) || tops[tops.length - 1]; var mi = ref.cloneNode(true); mi.id = 'agn-menu'; mi.classList.add('agn-menu'); var a = mi.querySelector('a'); a.href = '/' + MKT + '#novinky'; a.title = L.menu; a.innerHTML = '' + L.menu + '' + S.list.length + ''; ref.parentNode.insertBefore(mi, ref); } function badges() { document.querySelectorAll('.product-card[data-lazy-product-id]:not([data-agn])').forEach(function (c) { c.setAttribute('data-agn', '1'); var pid = c.getAttribute('data-lazy-product-id'), hit = S.pids[pid]; if (!hit) { var m = (c.textContent.match(/K[oó]d:\s*(\S+)/) || [])[1]; hit = m && S.codes[m]; } if (!hit) return; var im = c.querySelector('.image') || c; if (getComputedStyle(im).position === 'static') im.style.position = 'relative'; var s = document.createElement('span'); s.className = 'agn-cb'; s.textContent = L.badge; im.appendChild(s); }); } /* ---------- obnovenie dát (LEN na klik admina) ---------- */ function parseDetails(html) { var d = new DOMParser().parseFromString(html, 'text/html'), m = {}; d.querySelectorAll('[name^="property["]').forEach(function (e) { var n = e.closest('tr,.form-group,div'), lab = ''; for (var i = 0; i < 3 && n && !lab; i++) { var l = n.querySelector('label,.colon,td'); lab = l ? l.textContent.trim() : ''; n = n.parentElement; } lab = lab.split(/X|\n/)[0].replace(/:$/, '').replace(/\*$/, '').trim(); if (!lab) return; var v = e.type === 'checkbox' ? (e.checked ? 'T' : 'F') : (e.tagName === 'SELECT' ? ((e.selectedOptions[0] || {}).text || '') : e.value); if (e.type === 'hidden' && m[lab] !== undefined) return; if (e.type === 'checkbox' && m[lab] === 'T') return; m[lab] = v; }); return m; } async function loadFeed(k) { var f = FEEDS[k], txt = await fetch(f.url, { cache: 'no-cache' }).then(function (r) { return r.text(); }); var out = {}; new DOMParser().parseFromString(txt, 'text/xml').querySelectorAll('STORECARD').forEach(function (it) { function g(t) { var e = it.getElementsByTagName(t)[0]; return e ? e.textContent.trim() : ''; } var r = { q: num(g('QUANTITY')), moc: num(g(f.moc)), am: num(g(f.am)), cat: g('CATEGORIES').split('|')[0].trim(), img: g('IMAGE'), out: g('PROMO_GROUP') === 'OUTLET' }; out[g(f.code)] = r; var ean = g('EAN'); if (ean) out['EAN:' + ean] = r; }); return out; } async function collect(progress) { progress(3, 'zoznam produktov…'); var rows = [], seen = {}; for (var page = 1; page < 20; page++) { var p = new URLSearchParams(); p.append('page_type_id[]', '33'); p.append('page_state_id[]', '1'); p.append('creation_date_from-type', 'DaysFromToday'); p.append('creation_date_from-number', String(KEEP_DAYS)); p.append('is_submit', '1'); p.append('items_per_page', '500'); if (page > 1) p.append('page', String(page)); var h = await fetch('/buxus/system/search/search.php?' + p.toString()).then(function (r) { return r.text(); }); if (!/form_fulltext_buxus_pages/.test(h)) throw new Error('admin relácia vypršala – prihláste sa do BUXUSu'); var d = new DOMParser().parseFromString(h, 'text/html'), added = 0; d.querySelectorAll('table tr').forEach(function (tr) { var a = tr.querySelector('a[href*="page_details.php?page_id="]'); if (!a) return; var pid = +(a.getAttribute('href').match(/page_id=(\d+)/) || [])[1], c = (tr.textContent.match(/20\d\d-\d\d-\d\d \d\d:\d\d:\d\d/) || [])[0]; if (pid && c && !seen[pid]) { seen[pid] = 1; rows.push({ pid: pid, c: c }); added++; } }); var total = +((h.match(/Nájdených výsledkov:\s*([\d\s]+)/) || [])[1] || '0').replace(/\s/g, ''); if (!added || rows.length >= total) break; } if (!rows.length) throw new Error('nenašiel sa žiadny produkt'); var prev = {}; ((S.data && S.data.items) || []).forEach(function (it) { prev[it.pid] = it; }); var items = rows.map(function (r) { return Object.assign({}, prev[r.pid] || {}, { pid: r.pid, c: r.c }); }); var need = items.filter(function (it) { return !it.code || it.nf || !it.dt || Date.now() - Date.parse(it.dt) > 7 * 864e5; }), done = 0, i = 0; async function worker() { while (i < need.length) { var it = need[i++]; try { var m = parseDetails(await fetch('/buxus/system/page_details.php?page_id=' + it.pid).then(function (r) { return r.text(); })); it.dt = new Date().toISOString().slice(0, 10); it.code = (m['Medzinárodné ID produktu'] || '').trim(); it.ean = (m['EAN'] || '').trim(); it.b = (m['Výrobca'] || '').trim(); it.v = (m['ID skupiny variantov'] || '').trim(); it.t = { sk: m['Titulok'] || m['Názov'] || '', cz: m['Titulok [CZ]'] || '', hu: m['Titulok [HU]'] || '' }; it.act = { sk: m['Aktívny na doméne'] === 'T' && m['Nezobrazovať na doméne'] !== 'T', cz: m['Aktívny na doméne [CZ]'] === 'T' && m['Nezobrazovať na doméne [CZ]'] !== 'T', hu: m['Aktívny na doméne [HU]'] === 'T' && m['Nezobrazovať na doméne [HU]'] !== 'T' }; it.bx = { q: { sk: num(m['Sklad [SK]']), cz: num(m['Sklad [CZ]']), hu: num(m['Sklad [HU]']) }, moc: { sk: num(m['MOC']), cz: num(m['MOC [CZ]']), hu: num(m['MOC [HU]']) }, am: { sk: num(m['Akciová MOC']), cz: num(m['Akciová MOC [CZ]']), hu: num(m['Akciová MOC [HU]']) } }; } catch (e) {} done++; progress(5 + Math.round(done / Math.max(1, need.length) * 70), 'detaily ' + done + '/' + need.length + '…'); } } await Promise.all([worker(), worker(), worker()]); items = items.filter(function (it) { return it.code; }); var feeds = {}, ks = ['sk', 'cz', 'hu']; for (var fi = 0; fi < ks.length; fi++) { progress(78 + fi * 6, 'feed ' + ks[fi].toUpperCase() + '…'); try { feeds[ks[fi]] = await loadFeed(ks[fi]); } catch (e) { feeds[ks[fi]] = null; } } var bc = { sk: {}, cz: {}, hu: {} }; items.forEach(function (it) { it.q = {}; it.moc = {}; it.am = {}; it.cat = {}; it.nf = false; it.out = false; ks.forEach(function (m) { var f = feeds[m] && (feeds[m][it.code] || (it.ean && feeds[m]['EAN:' + it.ean])); if (f) { it.q[m] = Math.min(f.q, 50); it.moc[m] = f.moc; it.am[m] = f.am; it.cat[m] = f.cat; if (f.out) it.out = true; if (f.img) it.img = f.img; if (f.cat && it.b) { var o = bc[m][it.b] = bc[m][it.b] || {}; o[f.cat] = (o[f.cat] || 0) + 1; } } else { if (m === 'sk') it.nf = true; var x = it.bx || { q: {}, moc: {}, am: {} }, r = m === 'hu' ? 1 : 100; it.q[m] = Math.min(x.q[m] || 0, 50); it.moc[m] = x.moc[m] ? Math.round(x.moc[m] * VAT[m] * r) / r : 0; it.am[m] = x.am[m] ? Math.round(x.am[m] * VAT[m] * r) / r : 0; } }); if (!it.img) it.img = 'https://product-images.ags92.com/images/' + encodeURIComponent(it.code) + '.jpg'; }); items.forEach(function (it) { ks.forEach(function (m) { if (!it.cat[m]) { var o = bc[m][it.b] || {}; it.cat[m] = Object.keys(o).sort(function (a, b) { return o[b] - o[a]; })[0] || ''; } }); }); return { generated: new Date().toISOString(), days: KEEP_DAYS, count: items.length, items: items.map(function (it) { return { pid: it.pid, c: it.c, dt: it.dt, code: it.code, ean: it.ean, b: it.b, v: it.v, t: it.t, act: it.act, img: it.img, q: it.q, moc: it.moc, am: it.am, cat: it.cat, out: it.out, nf: it.nf, bx: it.nf ? it.bx : undefined }; }) }; } async function save(text) { var fb = await fetch('/buxus/dhtml/file_browser.php?mode=2').then(function (r) { return r.text(); }); var tok = fb.match(/multipart_params:\s*\{\s*"([a-z0-9_]+)"\s*:\s*"([^"]+)"/i); if (!tok) throw new Error('chýba token Prehliadača dokumentov'); var del = new URLSearchParams(); del.append('operation', 'D'); del.append('file[]', 'novinky.json.txt'); await fetch('/buxus/dhtml/file_browser.php?mode=2', { method: 'POST', body: del }); var fd = new FormData(); fd.append(tok[1], tok[2]); fd.append('directory', ''); fd.append('mode', '2'); fd.append('operation', 'SWFUpload'); fd.append('target', 'x'); fd.append('name', 'novinky.json.txt'); fd.append('uploaded_files', new File([text], 'novinky.json.txt', { type: 'text/plain' })); await fetch('/buxus/dhtml/upload_file.php', { method: 'POST', body: fd }); var chk = await fetch(FILE + '?c=' + Date.now(), { cache: 'no-store' }).then(function (r) { return r.ok ? r.text() : ''; }); if (chk !== text) throw new Error('súbor sa nenahral celý (' + chk.length + ' / ' + text.length + ' znakov)'); } function bindAdmin(box) { var b = box.querySelector('[data-agn-refresh]'); if (!b) return; b.onclick = async function () { var bar = box.querySelector('.agn-bar'), fill = bar.querySelector('i'), msg = box.querySelector('.agn-msg'); b.disabled = true; bar.style.display = 'block'; function progress(p, t) { fill.style.width = p + '%'; msg.textContent = t; } try { var data = await collect(progress); var prevCount = S.data ? S.data.count : 0; if (prevCount && (data.count < prevCount * 0.6)) throw new Error('počet produktov klesol z ' + prevCount + ' na ' + data.count + ' – nič sa neuložilo, skontrolujte BUXUS'); progress(96, 'ukladám…'); await save(JSON.stringify(data)); progress(100, 'hotovo – ' + data.count + ' produktov'); S.data = data; S.list = build(data); ls('agn_data', JSON.stringify(data)); setTimeout(route, 800); } catch (e) { msg.textContent = 'Chyba: ' + e.message; b.disabled = false; } }; } /* ---------- štart ---------- */ async function start() { if (!visible()) return; var data = await loadData(); if (!data || !data.items) { if (!isAdmin()) return; data = { generated: new Date().toISOString(), days: KEEP_DAYS, count: 0, items: [] }; } S.data = data; S.list = build(data); css(); menu(); if (/^\/(sk|cz|hu)\/?$/.test(location.pathname)) { route(); window.addEventListener('hashchange', route); } else if (/#novinky/.test(location.hash)) location.href = '/' + MKT + '#novinky'; badges(); new MutationObserver(badges).observe(document.body, { childList: true, subtree: true }); } window.__agsN2.start = start; window.__agsN2.S = S; window.__agsN2.collect = collect; window.__agsN2.build = build; window.__agsN2.render = function (data) { S.data = data; S.list = build(data); css(); menu(); route(); badges(); }; if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', start); else start(); })();