/* AGS 92 B2B – DPH náplasť (iba zobrazenie, nič neposiela na server). * CZ/HU/PL/COM (reverse charge): skrýva sumy "s DPH", stĺpec DPH → 0 %, veta o reverse charge, * riadok "Poštovné a balné" (netto z hlavičky − Základ), oprava AJAX prepočtu "Celková cena bez DPH". * SK (DPH sa účtuje): Základ → Poštovné a balné → Celková bez DPH → DPH 23 % (aj z dopravy) → Celková s DPH; * rovnako v súhrne objednávky. Hodnoty z mini košíka v hlavičke (jediné miesto, ktoré web drží správne). * v2 (30. 9. 2026): SK stĺpec DPH "23.0000" → "23". * v3 (30. 9. 2026): základ = súčet položiek košíka (Počet × Cena MJ), nie riadok "Základ/Podstawa" zo servera – * server pri niektorých položkách základ nezapočíta (PL: 34-423) a riadok dopravy potom ukázal nezmysel * (200,52 zł namiesto 50 zł). Riadok "Základ" sa opraví na súčet položiek. * v4–v5 (30. 9. 2026): základ zo stĺpca "Cena celkom" riadkov (presné, bez zaokrúhlenia ceny MJ); po AJAX prepočte * web do tohto stĺpca dá sumu s DPH (×1,23) – rozpozná sa a prepíše na netto (PL: 1 × 8,00 = "9,84"). * Poštovné sa zaokrúhli na sumu z vety pod košíkom ("…w wysokości 50 PLN"), ak sa líši len o centy. * Vypnutie: odstrániť include z pätičky (Container 22, property[15]). */ (function () { 'use strict'; var lang = (location.pathname.split('/')[1] || '').toLowerCase(); if (!/^(sk|cz|hu|pl|com)$/.test(lang)) return; /* admin a iné: nič */ var SK = lang === 'sk'; /* SK: DPH sa účtuje – iba doplniť dopravu, DPH z dopravy a súčet s DPH */ if (window.__agsDphLoaded) return; window.__agsDphLoaded = true; var NOTES = { cz: 'Ceny jsou uvedeny bez DPH. DPH se neúčtuje – přenesení daňové povinnosti (reverse charge).', hu: 'Az árak ÁFA nélkül értendők. ÁFA nem kerül felszámításra – fordított adózás (reverse charge).', pl: 'Ceny netto. VAT nie jest naliczany – odwrotne obciążenie (reverse charge).', en: 'Prices are net. VAT is not charged – reverse charge.' }; var NET_LABEL = { cz: 'bez DPH', hu: 'ÁFA nélkül', pl: 'netto', en: 'excl. VAT' }; var SHIP_LABEL = { sk: 'Poštovné a balné', cz: 'Poštovné a balné', hu: 'Szállítási és csomagolási díj', pl: 'Koszt dostawy i pakowania', en: 'Shipping & handling' }; var SK_L = { net: 'Celková cena bez DPH', vat: 'DPH 23 %', gross: 'Celková cena s DPH', sumNet: 'Celková suma bez DPH', sumGross: 'Celková suma s DPH' }; var NOTE = NOTES[lang] || NOTES.en; var NETL = NET_LABEL[lang] || NET_LABEL.en; var SHIPL = SHIP_LABEL[lang] || SHIP_LABEL.en; /* "1 325 620 Kč" / "69.97 zł" / "7 945 Ft" → číslo; null ak nič */ function num(s) { s = (s || '').replace(/[^\d.,-]/g, ''); if (!s) return null; if (s.indexOf(',') > -1 && s.indexOf('.') > -1) s = s.replace(/\./g, '').replace(',', '.'); else s = s.replace(',', '.'); var n = parseFloat(s); return isNaN(n) ? null : n; } function fmtLike(sample, n) { /* zachová menu a formát z ukážky ("539 Kč" → "150 Kč", "69.97 zł" → "45.00 zł") */ var dec = /[.,]\d{2}\s*\D*$/.test(sample) ? 2 : 0; var s = n.toFixed(dec).replace('.', /,\d{2}\s*\D*$/.test(sample) ? ',' : '.'); s = s.replace(/\B(?=(\d{3})+(?!\d))/g, ' '); var cur = (sample.match(/[^\d.,\s]+\s*$/) || [''])[0].trim(); return cur ? s + ' ' + cur : s; } var VAT_HDR = /^(DPH|ÁFA|VAT|Sazba DPH|Sadzba DPH|ÁFA kulcs|Stawka VAT|VAT rate)\s*(%|\(%\))?$/i; function txt(e) { return (e && e.textContent || '').replace(/\s+/g, ' ').trim(); } function makeNote(cls) { var d = document.createElement('div'); d.className = 'ags-vat-note ' + (cls || ''); d.setAttribute('style', 'margin:10px 0;padding:8px 12px;border-left:3px solid #4a7bd0;background:#eef3fc;color:#1f3b6e;font-size:13px;line-height:1.4;'); d.textContent = NOTE; return d; } function addNoteAfter(el, key) { if (!el || !el.parentNode) return; if (el.parentNode.querySelector('.ags-vat-note.' + key)) return; el.parentNode.insertBefore(makeNote(key), el.nextSibling); } /* 1. Mini košík v hlavičke (aj po AJAX prepísaní) */ function miniCart() { if (SK) return; var boxes = document.querySelectorAll('#mini-cart, .shopping-cart-small, .eshop-small-cart'); for (var i = 0; i < boxes.length; i++) { var box = boxes[i]; var gross = box.querySelector('.total-price-formated'); var net = box.querySelector('.total-price-no-vat-formated'); if (!gross || !net) continue; var nv = txt(net); if (nv && txt(gross) !== nv) gross.textContent = nv; if (!gross.nextSibling || !gross.nextSibling.classList || !gross.nextSibling.classList.contains('ags-vat-net')) { var lbl = document.createElement('small'); lbl.className = 'ags-vat-net'; lbl.textContent = ' ' + NETL; gross.parentNode.insertBefore(lbl, gross.nextSibling); } /* schovať duplicitný riadok "539 Kč bez DPH" pod tým */ var small = net.closest('small'); if (small && !small.classList.contains('ags-vat-done')) { small.classList.add('ags-vat-done'); var n = small.firstChild; while (n) { var next = n.nextSibling; if (n.nodeType === 1 && n.tagName === 'BR') { n.parentNode.removeChild(n); break; } if (n.nodeType === 3) n.textContent = ''; else if (n.nodeType === 1) n.style.display = 'none'; n = next; } } } } /* 2. Košík: stĺpec DPH → 0 %, riadok "DPH 23%" v súhrne preč, poznámka */ /* SK: stĺpec DPH zjednotiť – ui42 pri niektorých produktoch vypíše "23.0000" namiesto "23" (v2, 30. 9. 2026) */ function skVatCol() { var tables = document.querySelectorAll('table'); for (var t = 0; t < tables.length; t++) { var ths = tables[t].querySelectorAll('thead th'), idx = -1; for (var h = 0; h < ths.length; h++) if (VAT_HDR.test(txt(ths[h]))) { idx = h; break; } if (idx < 0) continue; var rows = tables[t].querySelectorAll('tbody tr'); for (var r = 0; r < rows.length; r++) { var td = rows[r].children[idx]; if (!td || td.tagName !== 'TD' || td.children.length) continue; var v = txt(td), m = v.match(/^(\d+)[.,](\d*?)0+(\s*%?)$/); if (m) td.textContent = (m[2] ? m[1] + ',' + m[2] : m[1]) + m[3]; } } } function cartPage() { if (SK) { skVatCol(); var sk = document.querySelectorAll('table.summary'); for (var q = 0; q < sk.length; q++) skCart(sk[q]); return; } var tables = document.querySelectorAll('table.basket_table'); for (var t = 0; t < tables.length; t++) { var tbl = tables[t]; var ths = tbl.querySelectorAll('thead th'); var idx = -1; for (var h = 0; h < ths.length; h++) if (VAT_HDR.test(txt(ths[h]))) { idx = h; break; } if (idx < 0) continue; var rows = tbl.querySelectorAll('tbody tr'); for (var r = 0; r < rows.length; r++) { var cells = rows[r].children; var td = cells[idx]; if (td && td.tagName === 'TD' && /^\d+([.,]\d+)?\s*%?$/.test(txt(td)) && txt(td) !== '0 %') { td.textContent = '0 %'; td.style.whiteSpace = 'nowrap'; } } } var sums = document.querySelectorAll('table.summary'); for (var s = 0; s < sums.length; s++) { var trs = sums[s].querySelectorAll('tfoot tr, tbody tr'); for (var k = 0; k < trs.length; k++) { var tr = trs[k]; if (tr.style.display === 'none') continue; var hasVat = false; var tds = tr.querySelectorAll('td'); for (var c = 0; c < tds.length; c++) { var cl = ' ' + (tds[c].className || '') + ' '; if (/ vat-\d+-formated /.test(cl)) hasVat = true; } if (hasVat) tr.style.display = 'none'; } shipRow(sums[s]); addNoteAfter(sums[s], 'ags-note-cart'); } } /* Riadok "Poštovné a balné" = Celková cena − Základ (server dopravu nevypisuje, len ju pripočíta) */ /* Zdroj pravdy je netto z mini košíka v hlavičke (netto + doprava; po AJAX prepočte ho web * udržiava správne, kým bunka "Celková cena bez DPH" v košíku po AJAXe dostane sumu s DPH). */ function headerNet() { var el = document.querySelector('#mini-cart .total-price-no-vat-formated, .eshop-small-cart .total-price-no-vat-formated'); return el ? num(txt(el)) : null; } /* základ = súčet položiek košíka. Zdroj: stĺpec "Cena celkom" riadku (presný), kontrola cez Počet × Cena MJ; * ak riadok po AJAX prepočte nesie sumu s DPH (≈ ×1,23), prepočíta sa na netto a bunka sa opraví. null = neistota */ function itemsBase() { var inps = document.querySelectorAll('input.product-amount'), sum = 0, rows = 0; for (var i = 0; i < inps.length; i++) { var tr = inps[i].closest('tr'); if (!tr) continue; var td = inps[i].closest('td'), cells = tr.children, ci = [].indexOf.call(cells, td), unit = null, last = null, lastTd = null; for (var j = ci + 1; j < cells.length; j++) { var t = txt(cells[j]); if (!/\d/.test(t) || /%/.test(t) || cells[j].querySelector('a,button,input')) continue; var v = num(t); if (v === null) continue; if (unit === null) unit = v; else { last = v; lastTd = cells[j]; } } var amt = num(inps[i].value); if (unit === null || amt === null) return null; var exp = amt * unit, val = exp, tol = Math.max(0.02, exp * 0.006); if (last !== null) { if (Math.abs(last - exp) <= tol) val = last; /* netto zo servera (presné) */ else if (Math.abs(last / 1.23 - exp) <= tol) { val = Math.round(last / 1.23 * 100) / 100; if (lastTd) lastTd.textContent = fmtLike(txt(lastTd), val); } /* AJAX dal sumu s DPH */ } sum += val; rows++; } return rows ? Math.round(sum * 100) / 100 : null; } /* poštovné z vety pod košíkom („Pri objednávke do X … vo výške Y“) – 2. suma; null ak veta chýba */ function knownShip() { var els = document.querySelectorAll('body *'); for (var i = 0; i < els.length; i++) { var e = els[i]; if (e.children.length || e.closest('#ags-up')) continue; var t = txt(e); if (!/(objednávke do|objednávce|megrendelés esetén|zamówień|orders)/i.test(t)) continue; var re = /(\d[\d\s\u00a0]*(?:[.,]\d+)?)\s*(?:,-)?\s*(€|Kč|Ft|zł|PLN|EUR|CZK|HUF)/gi, m, v = []; while ((m = re.exec(t))) v.push(num(m[1])); return v.length > 1 && v[1] > 0 ? v[1] : null; } return null; } /* doprava = netto z hlavičky − základ; pri rozdiele do 5 centov oproti vete pod košíkom sa použije suma z vety */ function shipOf(hn, base) { var d = Math.round((hn - base) * 100) / 100, k = knownShip(); return (k !== null && Math.abs(d - k) <= 0.05) ? k : d; } function fixBase(baseTd, base, tol) { var cur = num(txt(baseTd)); if (cur !== null && Math.abs(cur - base) >= tol) baseTd.textContent = fmtLike(txt(baseTd), base); } function headerGross() { /* len SK – na ostatných trhoch je bunka prepísaná na netto */ var el = document.querySelector('#mini-cart .total-price-formated, .eshop-small-cart .total-price-formated'); return el ? num(txt(el)) : null; } function setRow(tbl, cls, refTr, label, val, before) { var row = tbl.querySelector('tr.' + cls); if (!row) { row = refTr.cloneNode(true); row.className = cls; var ct = row.querySelectorAll('td'); for (var ci = 0; ci < ct.length; ci++) if (/formated/.test(ct[ci].className)) ct[ci].className = 'price'; if (before) refTr.parentNode.insertBefore(row, refTr); else refTr.parentNode.insertBefore(row, refTr.nextSibling); } var tds = row.querySelectorAll('td'); if (tds.length < 2) return row; var valTd = row.querySelector('td.price') || tds[tds.length - 1]; if (txt(tds[0]) !== label) tds[0].textContent = label; for (var vi = 1; vi < tds.length; vi++) if (tds[vi] !== valTd && txt(tds[vi])) tds[vi].textContent = ''; if (txt(valTd) !== val) valTd.textContent = val; return row; } function shipRow(tbl) { var baseTd = tbl.querySelector('td[class*="total-price-no-vat-"]'); var totTd = tbl.querySelector('td.total-price-formated'); if (!baseTd || !totTd) return; var baseTr = baseTd.parentNode, totTr = totTd.parentNode; var ib = itemsBase(), base = ib !== null ? ib : num(txt(baseTd)), hn = headerNet(); var old = tbl.querySelector('tr.ags-ship-row'); if (base === null || hn === null || hn < base - 0.004) { if (old) old.parentNode.removeChild(old); return; } var shp = shipOf(hn, base); if (ib !== null) { base = Math.round((hn - shp) * 100) / 100; fixBase(baseTd, base, 0.005); } /* bunka "Celková cena bez DPH" = netto z hlavičky (oprava AJAX prepočtu so sumou s DPH) */ var totNow = num(txt(totTd)); if (totNow !== null && Math.abs(totNow - hn) >= 0.5) totTd.textContent = fmtLike(txt(totTd), hn); if (shp < 0.5) { if (old) old.parentNode.removeChild(old); return; } var val = fmtLike(txt(totTd), shp); if (old) { var c = old.querySelectorAll('td'); if (c[1] && txt(c[1]) !== val) c[1].textContent = val; return; } var row = baseTr.cloneNode(true); row.className = 'ags-ship-row'; var tds = row.querySelectorAll('td'); if (tds.length < 2) return; tds[0].textContent = SHIPL; tds[1].textContent = val; tds[1].className = 'price'; totTr.parentNode.insertBefore(row, totTr); } /* SK košík: Základ → Poštovné → Celková bez DPH → DPH (aj z dopravy) → Celková s DPH */ function skCart(tbl) { var baseTd = tbl.querySelector('td[class*="total-price-no-vat-"]'); var vatTd = tbl.querySelector('td[class^="vat-"], td[class*=" vat-"]'); var totTd = tbl.querySelector('td.total-price-formated'); if (!baseTd || !totTd) return; var ib = itemsBase(), base = ib !== null ? ib : num(txt(baseTd)), hn = headerNet(), hg = headerGross(); if (base === null || hn === null || hg === null || hn < base - 0.004 || hg < hn) return; var shp = shipOf(hn, base); if (ib !== null) { base = Math.round((hn - shp) * 100) / 100; fixBase(baseTd, base, 0.005); } var totTr = totTd.parentNode, baseTr = baseTd.parentNode; var fmt = txt(totTd); /* Celková bez DPH = netto z hlavičky (oprava AJAX prepočtu) */ var totNow = num(fmt); if (totNow !== null && Math.abs(totNow - hn) >= 0.5 / 100) totTd.textContent = fmtLike(fmt, hn); var lbl = totTr.querySelector('td'); if (lbl && txt(lbl) !== SK_L.net) lbl.textContent = SK_L.net; /* Poštovné */ if (shp >= 0.005) setRow(tbl, 'ags-ship-row', baseTr, SHIPL, fmtLike(fmt, shp), false); else { var o = tbl.querySelector('tr.ags-ship-row'); if (o) o.parentNode.removeChild(o); } /* DPH z celku (tovar + doprava) – presunúť za "bez DPH" */ if (vatTd) { var vatTr = vatTd.parentNode; var v = fmtLike(fmt, hg - hn); if (txt(vatTd) !== v) vatTd.textContent = v; var vl = vatTr.querySelector('td'); if (vl && txt(vl) !== SK_L.vat) vl.textContent = SK_L.vat; if (vatTr.previousElementSibling !== totTr) totTr.parentNode.insertBefore(vatTr, totTr.nextSibling); } /* Celková s DPH */ var after = vatTd ? vatTd.parentNode : totTr; var g = tbl.querySelector('tr.ags-gross-row'); if (!g) { g = totTr.cloneNode(true); g.className = 'total-price-row ags-gross-row'; var gc = g.querySelectorAll('td'); for (var gi = 0; gi < gc.length; gi++) if (/formated/.test(gc[gi].className)) gc[gi].className = 'price'; after.parentNode.insertBefore(g, after.nextSibling); } var gt = g.querySelectorAll('td'); var gvTd = g.querySelector('td.price') || gt[gt.length - 1]; if (txt(gt[0]) !== SK_L.gross) gt[0].textContent = SK_L.gross; var gv = fmtLike(fmt, hg); if (txt(gvTd) !== gv) gvTd.textContent = gv; } /* 3. Dodacie údaje: "663 Kč s DPH" preč */ function deliveryPage() { if (SK) return; var g = document.querySelectorAll('.bt-cart-total-total-price.total-price-formated'); for (var i = 0; i < g.length; i++) { g[i].style.display = 'none'; var net = g[i].parentNode && g[i].parentNode.querySelector('.total-price-no-vat-formated'); if (net) addNoteAfter(net, 'ags-note-delivery'); } } /* 4. Súhrn objednávky: poznámka nad tlačidlom OBJEDNAŤ */ function summaryPage() { var f = document.querySelector('input[name="b2_b_summary_form"]'); if (!f) return; var main = document.querySelector('main') || document.body; var tbls = main.querySelectorAll('table.table-striped'); if (!tbls.length) tbls = main.querySelectorAll('table'); var tbl = tbls.length ? tbls[Math.min(1, tbls.length - 1)] : null; /* 2. tabuľka = celková výška objednávky */ if (!tbl) return; if (tbls.length > 1) summaryShipRow(tbls[0], tbl); if (SK) { if (tbls.length > 1) skSummary(tbl); return; } addNoteAfter(tbl, 'ags-note-summary'); } /* SK súhrn: "Celková suma objednávky" → bez DPH, + DPH, + s DPH */ function skSummary(totTbl) { var hn = headerNet(), hg = headerGross(); if (hn === null || hg === null || hg < hn) return; var rows = totTbl.querySelectorAll('tr'), totTr = null, totTd = null; for (var i = 0; i < rows.length; i++) { if (/ags-/.test(rows[i].className)) continue; var tds = rows[i].querySelectorAll('td'); if (tds.length >= 2 && num(txt(tds[tds.length - 1])) !== null) { totTr = rows[i]; totTd = tds[tds.length - 1]; } } if (!totTr) return; var fmt = txt(totTd); var l = totTr.querySelector('td'); if (l && txt(l) !== SK_L.sumNet + ':') l.textContent = SK_L.sumNet + ':'; if (Math.abs(num(fmt) - hn) >= 0.005) totTd.textContent = fmtLike(fmt, hn); var vat = setRow(totTbl, 'ags-vat-row', totTr, SK_L.vat + ':', fmtLike(fmt, hg - hn), false); setRow(totTbl, 'ags-gross-row', vat, SK_L.sumGross + ':', fmtLike(fmt, hg), false); } function summaryShipRow(itemsTbl, totTbl) { var rows = totTbl.querySelectorAll('tr'); var totTr = null, totTd = null; for (var i = 0; i < rows.length; i++) { if (/ags-/.test(rows[i].className)) continue; var tds = rows[i].querySelectorAll('td'); if (tds.length >= 2 && num(txt(tds[tds.length - 1])) !== null) { totTr = rows[i]; totTd = tds[tds.length - 1]; } } if (!totTr) return; var sum = 0, cnt = 0; var itds = itemsTbl.querySelectorAll('tbody tr'); for (var r = 0; r < itds.length; r++) { var c = itds[r].querySelectorAll('td'); if (!c.length) continue; var v = num(txt(c[c.length - 1])); if (v !== null) { sum += v; cnt++; } } var tot = num(txt(totTd)); var old = totTbl.querySelector('tr.ags-ship-row'); if (!cnt || tot === null || tot - sum < 0.5) { if (old) old.parentNode.removeChild(old); return; } var val = fmtLike(txt(totTd), tot - sum); if (old) { var oc = old.querySelectorAll('td'); if (txt(oc[oc.length - 1]) !== val) oc[oc.length - 1].textContent = val; return; } var row = totTr.cloneNode(true); row.className = 'ags-ship-row'; var rt = row.querySelectorAll('td'); rt[0].textContent = SHIPL + ':'; rt[rt.length - 1].textContent = val; totTr.parentNode.insertBefore(row, totTr); } var timer = null; function run() { timer = null; try { miniCart(); cartPage(); deliveryPage(); summaryPage(); } catch (e) { /* fail-open */ } } function schedule() { if (!timer) timer = setTimeout(run, 60); } if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', run); else run(); if (window.MutationObserver) { new MutationObserver(schedule).observe(document.documentElement, { childList: true, subtree: true, characterData: true }); } window.addEventListener('load', run); })();