/* AGS 92 B2B – NOVINKY v2 (novinky2.js.txt), verzia 2026-09-30d (úvodná stránka aj na /cz/hlavni-stranka a pod. – podľa triedy body „homepage…“, admin má zlepené „homepagewith--toolbar7“; šípky kolotoča nad obrázkom, skryté na okraji; markets; Ostatné na koniec) Č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', markets: ['sk','cz','hu'], allow: ['Fiktívna firma pre OZ'], exclude: ['KÓD'] }; markets = trhy, kde sa Novinky zobrazujú (vypnutie jedného trhu: vynechať ho). 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-30d' }; var CFG = Object.assign({ mode: 'preview', days: 60, position: 'afterFirst', markets: ['sk', 'cz', 'hu'], allow: ['Fiktívna firma pre OZ'], exclude: [] }, window.agsNovinky || {}); var MKT = (location.pathname.match(/^\/(sk|cz|hu)(\/|$)/) || [])[1]; if (!MKT || (CFG.markets || []).indexOf(MKT) < 0) 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;scroll-padding:0 12px;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:82px;z-index:3;transition:opacity .2s;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:6px}.agn-arr.r{right:6px}.agn-arr.off{opacity:0;pointer-events:none}', '.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 '