(function(){
if (window.kadoBasketDeliveryFixV13 === true) {
console.log("KADO V13 už beží");
return;
}
window.kadoBasketDeliveryFixV13 = true;
var detailCache = {};
var runTimer = null;
function cleanText(s){
return (s || "")
.replace(/\u00a0/g, " ")
.replace(/\s+/g, " ")
.trim();
}
function norm(s){
return cleanText(s)
.toLowerCase()
.normalize("NFD")
.replace(/[\u0300-\u036f]/g, "")
.replace(/\s+/g, " ")
.trim();
}
function isBasketPage(){
return location.href.indexOf("e-basket") !== -1 ||
document.querySelector('[data-selector="basket-item"]') ||
cleanText(document.body.innerText || "").indexOf("Nákupný košík") !== -1;
}
function parseDays(text){
text = cleanText(text);
var match =
text.match(/(?:do\s*)?([0-9]+)\s*[–-]\s*([0-9]+)\s*dní/i) ||
text.match(/(?:do\s*)?([0-9]+)\s*[–-]\s*([0-9]+)\s*dni/i);
if (!match) return null;
return {
min: Number(match[1]),
max: Number(match[2]),
label: Number(match[1]) + "-" + Number(match[2]) + " dní"
};
}
function defaultStoreDays(){
return {
min: 1,
max: 3,
label: "1-3 dní"
};
}
function normalizeUnit(unit){
unit = cleanText(unit || "").toLowerCase();
if (unit === "pár" || unit === "par" || unit === "párov" || unit === "parov") {
return "pár";
}
return "ks";
}
function parseQtyAfter(label, text){
text = cleanText(text);
var rx = new RegExp(label + "\\s*:?\\s*([0-9]+)\\s*(ks|kus|pár|par)?", "i");
var match = text.match(rx);
if (!match) return null;
return {
qty: Number(match[1]) || 0,
unit: normalizeUnit(match[2] || "ks")
};
}
function getQty(row){
var input =
row.querySelector('[data-selector="number-controller-input"]') ||
row.querySelector('input[type="number"]') ||
row.querySelector('input[name^="pocet"]') ||
row.querySelector('input');
if (!input) return 1;
var val = parseInt(input.value || input.getAttribute("value") || "1", 10);
return val > 0 ? val : 1;
}
function getProductLink(row){
var links = Array.from(row.querySelectorAll('a[href]'));
var productLink = links.find(function(a){
var href = a.getAttribute("href") || "";
var text = norm(a.textContent || "");
if (!href) return false;
if (text.indexOf("spat do obchodu") !== -1) return false;
if (text.indexOf("späť do obchodu") !== -1) return false;
if (href.indexOf("javascript:") === 0) return false;
if (href.indexOf("#") === 0) return false;
if (href.indexOf("basket") !== -1) return false;
if (href.indexOf("increase=") !== -1) return false;
if (href.indexOf("decrease=") !== -1) return false;
if (href.indexOf("remove") !== -1) return false;
return true;
});
if (!productLink) return "";
try {
return new URL(productLink.getAttribute("href"), location.origin).href;
} catch(e) {
return "";
}
}
function getProductTitle(row){
var link = Array.from(row.querySelectorAll('a[href]')).find(function(a){
var href = a.getAttribute("href") || "";
var text = cleanText(a.textContent || "");
if (!text) return false;
if (norm(text).indexOf("spat do obchodu") !== -1) return false;
if (norm(text).indexOf("späť do obchodu") !== -1) return false;
if (href.indexOf("basket") !== -1) return false;
if (href.indexOf("remove") !== -1) return false;
return true;
});
if (link) return cleanText(link.textContent || "");
var img = row.querySelector("img[alt]");
if (img) return cleanText(img.getAttribute("alt") || "");
return "";
}
function getBasketRows(){
var rows = Array.from(document.querySelectorAll('[data-selector="basket-item"], .c1380'));
if (!rows.length) {
rows = Array.from(document.querySelectorAll("tr, div")).filter(function(row){
var text = cleanText(row.innerText || row.textContent || "");
return text.indexOf("€") !== -1 &&
/Skladom|Externý sklad|Externy sklad|dodanie/i.test(text) &&
row.querySelector('a[href]');
});
}
var seen = {};
var finalRows = [];
rows.forEach(function(row){
var url = getProductLink(row);
var title = getProductTitle(row);
var text = cleanText(row.innerText || row.textContent || "");
if (!url) return;
if (!title) return;
if (norm(title).indexOf("spat do obchodu") !== -1) return;
if (norm(title).indexOf("späť do obchodu") !== -1) return;
if (!/Skladom|Externý sklad|Externy sklad|dodanie/i.test(text)) return;
var key = url + "|" + title;
if (seen[key]) return;
seen[key] = true;
finalRows.push(row);
});
return finalRows;
}
function findAvailabilitySource(row){
return row.querySelector(".c847.in-stock, .c847") ||
row.querySelector(".kado-basket-stock-v6-holder") ||
row.querySelector(".kado-basket-stock-v5-holder") ||
row.querySelector(".kado-basket-stock-v4") ||
row;
}
function getRowAvailabilityText(row){
var source = findAvailabilitySource(row);
return cleanText(source ? (source.innerText || source.textContent || "") : "");
}
function parseDetailAvailabilityFromHtml(html){
var doc = new DOMParser().parseFromString(html, "text/html");
var nodes = Array.from(doc.querySelectorAll(
".c755.stock, .c755.stock .c757, .c757.in-stock, .c757"
));
var texts = nodes
.map(function(el){
return cleanText(el.innerText || el.textContent || "");
})
.filter(function(text){
if (!text) return false;
if (text.length > 800) return false;
return /Dostupnosť|Dostupnost|Extern|dodanie|Skladom/i.test(text);
});
var best = texts.find(function(text){
return /Extern|dodanie/i.test(text);
}) || texts[0] || "";
return {
text: best,
days: parseDays(best)
};
}
function loadDetail(url){
if (!url) {
return Promise.resolve({
text: "",
days: null
});
}
if (detailCache[url]) return detailCache[url];
detailCache[url] = fetch(url, {
method: "GET",
credentials: "same-origin",
cache: "no-store"
})
.then(function(response){
if (!response.ok) throw new Error("HTTP " + response.status);
return response.text();
})
.then(function(html){
return parseDetailAvailabilityFromHtml(html);
})
.catch(function(){
return {
text: "",
days: null
};
});
return detailCache[url];
}
function getStockParts(row, detailDays){
var qty = getQty(row);
var text = getRowAvailabilityText(row);
var store = parseQtyAfter("Skladom", text);
var external = parseQtyAfter("Extern(?:ý|y) sklad", text);
var hasStoreWord = /Skladom/i.test(text);
var hasExternalWord = /Externý sklad|Externy sklad|dodanie/i.test(text);
var storeQty = store ? store.qty : 0;
var externalQty = external ? external.qty : 0;
var unit = external && external.unit ? external.unit : store && store.unit ? store.unit : "ks";
if (storeQty <= 0 && hasStoreWord && !hasExternalWord) {
storeQty = qty;
}
if (storeQty <= 0 && hasStoreWord && externalQty > 0) {
storeQty = Math.max(0, qty - externalQty);
}
if (externalQty <= 0 && hasExternalWord && detailDays) {
externalQty = Math.max(0, qty - storeQty);
if (externalQty <= 0 && !hasStoreWord) externalQty = qty;
}
return {
qty: qty,
storeQty: storeQty,
externalQty: externalQty,
unit: unit
};
}
function buildAvailabilityHtml(parts, externalDays){
var html = '
';
if (parts.storeQty > 0) {
html +=
'
' +
'' +
'Skladom: ' + parts.storeQty + ' ' + parts.unit + ' ' +
'(1-3 dní)' +
'
';
}
if (parts.externalQty > 0) {
var daysLabel = externalDays && externalDays.label ? externalDays.label : "termín podľa dodávateľa";
html +=
'
' +
'🚚 Externý sklad: ' + parts.externalQty + ' ' + parts.unit + ' ' +
'(' + daysLabel + ')' +
'
';
}
html += '
';
return html;
}
function hideOldAvailability(row){
row.querySelectorAll(
".kado-basket-stock-v4, .kado-basket-stock-v5-holder, .kado-basket-stock-v6-holder, .kado-basket-stock-v12-holder"
).forEach(function(el){
el.style.setProperty("display", "none", "important");
});
var source = row.querySelector(".c847.in-stock, .c847");
if (source) {
source.style.setProperty("display", "none", "important");
}
}
function renderRow(row, html){
var source = findAvailabilitySource(row);
if (!source || !source.parentNode) return;
hideOldAvailability(row);
var holder = row.querySelector(".kado-basket-delivery-v13-holder");
if (!holder) {
holder = document.createElement("div");
holder.className = "kado-basket-delivery-v13-holder";
source.parentNode.insertBefore(holder, source.nextSibling);
}
if (holder.dataset.html === html) return;
holder.innerHTML = html;
holder.dataset.html = html;
}
function ensureStyles(){
if (document.querySelector("#kado-basket-delivery-v13-style")) return;
var style = document.createElement("style");
style.id = "kado-basket-delivery-v13-style";
style.textContent = `
.kado-basket-delivery-v13{
display:block!important;
max-width:270px!important;
font-size:12.5px!important;
line-height:1.25!important;
font-weight:800!important;
text-align:left!important;
white-space:normal!important;
}
.kado-basket-delivery-v13__store{
display:block!important;
color:#15803d!important;
white-space:normal!important;
}
.kado-basket-delivery-v13__external{
display:block!important;
color:#1d4ed8!important;
margin-top:3px!important;
white-space:normal!important;
}
.kado-basket-delivery-v13 strong{
font-weight:900!important;
}
.kado-basket-delivery-v13__dot{
display:inline-block!important;
width:13px!important;
height:13px!important;
border-radius:50%!important;
background:#22c55e!important;
border:1px solid #0f172a!important;
margin-right:6px!important;
vertical-align:-2px!important;
}
.kado-order-delivery-summary-v13{
margin:18px 0 14px 0!important;
padding:12px 16px!important;
border:1px solid #bfdbfe!important;
background:#eff6ff!important;
color:#1e3a8a!important;
border-radius:12px!important;
font-size:14px!important;
line-height:1.35!important;
font-weight:800!important;
max-width:520px!important;
}
.kado-order-delivery-summary-v13 strong{
font-weight:900!important;
}
@media(max-width:768px){
.kado-basket-delivery-v13{
max-width:100%!important;
font-size:12.5px!important;
}
.kado-order-delivery-summary-v13{
max-width:100%!important;
font-size:13.5px!important;
}
}
`;
document.head.appendChild(style);
}
function findCouponAnchor(){
var candidates = Array.from(document.querySelectorAll("body *")).filter(function(el){
var tag = (el.tagName || "").toLowerCase();
if (tag === "script" || tag === "style") return false;
var text = norm(el.textContent || "");
return text.indexOf("mam zlavovy kupon") !== -1 && text.length < 100;
});
if (!candidates.length) return null;
return candidates[0].closest("div, label, tr") || candidates[0];
}
function ensureSummaryBox(label){
var box = document.querySelector(".kado-order-delivery-summary-v13");
if (!box) {
box = document.createElement("div");
box.className = "kado-order-delivery-summary-v13";
}
box.innerHTML = "
Dodanie objednávky: " + label;
var anchor = findCouponAnchor();
if (anchor && anchor.parentNode) {
if (box.parentNode !== anchor.parentNode || box.nextElementSibling !== anchor) {
anchor.parentNode.insertBefore(box, anchor);
}
return;
}
var rows = getBasketRows();
var last = rows[rows.length - 1];
if (last && last.parentNode) {
last.parentNode.insertBefore(box, last.nextSibling);
}
}
function findDeliveryNoteField(){
var fields = Array.from(document.querySelectorAll(
'textarea, input[type="text"], input:not([type])'
));
var byAttr = fields.find(function(field){
var attrs = norm([
field.name || "",
field.id || "",
field.getAttribute("placeholder") || "",
field.getAttribute("aria-label") || "",
field.getAttribute("data-name") || ""
].join(" "));
return attrs.indexOf("termin dodania") !== -1 ||
(attrs.indexOf("termin") !== -1 && attrs.indexOf("dodania") !== -1);
});
if (byAttr) return byAttr;
var labels = Array.from(document.querySelectorAll("body *")).filter(function(el){
var tag = (el.tagName || "").toLowerCase();
if (tag === "script" || tag === "style") return false;
var text = norm(el.textContent || "");
return text.indexOf("termin dodania") !== -1 && text.length < 100;
});
for (var i = 0; i < labels.length; i++) {
var label = labels[i];
var parent = label;
for (var level = 0; level < 5 && parent; level++) {
var field = parent.querySelector && parent.querySelector(
'textarea, input[type="text"], input:not([type])'
);
if (field) return field;
parent = parent.parentElement;
}
}
return null;
}
function setDeliveryNote(label){
var text = "Dodanie objednávky: " + label;
try {
sessionStorage.setItem("kado_delivery_note_v13", text);
localStorage.setItem("kado_delivery_note_v13", text);
} catch(e) {}
var field = findDeliveryNoteField();
if (!field) return;
if (field.value !== text) {
field.value = text;
field.dispatchEvent(new Event("input", { bubbles: true }));
field.dispatchEvent(new Event("change", { bubbles: true }));
if (window.jQuery) {
try {
window.jQuery(field).val(text).trigger("input").trigger("change");
} catch(e) {}
}
}
}
function longestDelivery(list){
if (!list.length) return defaultStoreDays();
list.sort(function(a, b){
if (a.max !== b.max) return a.max - b.max;
return a.min - b.min;
});
return list[list.length - 1];
}
function run(){
if (!isBasketPage()) {
var saved = "";
try {
saved = sessionStorage.getItem("kado_delivery_note_v13") ||
localStorage.getItem("kado_delivery_note_v13") ||
"";
} catch(e) {}
if (saved) {
var label = saved.replace(/^Dodanie objednávky:\s*/i, "");
setDeliveryNote(label);
}
return;
}
ensureStyles();
var rows = getBasketRows();
if (!rows.length) return;
var deliveries = [];
var pending = rows.length;
rows.forEach(function(row){
var url = getProductLink(row);
loadDetail(url).then(function(detail){
var detailDays = detail.days;
var parts = getStockParts(row, detailDays);
var usedDays = defaultStoreDays();
if (parts.externalQty > 0) {
usedDays = detailDays || parseDays(getRowAvailabilityText(row)) || {
min: 99,
max: 99,
label: "termín podľa dodávateľa"
};
}
deliveries.push(usedDays);
renderRow(row, buildAvailabilityHtml(parts, detailDays));
}).finally(function(){
pending--;
if (pending <= 0) {
var longest = longestDelivery(deliveries);
ensureSummaryBox(longest.label);
setDeliveryNote(longest.label);
console.log("KADO V13 hotovo. Dodanie objednávky:", longest.label);
}
});
});
}
function schedule(){
clearTimeout(runTimer);
runTimer = setTimeout(run, 180);
}
run();
document.addEventListener("input", function(e){
if (e.target && e.target.matches('[data-selector="number-controller-input"], input[name^="pocet"], input[type="number"]')) {
schedule();
}
}, true);
document.addEventListener("change", function(e){
if (e.target && e.target.matches('[data-selector="number-controller-input"], input[name^="pocet"], input[type="number"]')) {
schedule();
}
}, true);
document.addEventListener("click", function(e){
if (
e.target.closest('[data-selector="number-controller-minus"]') ||
e.target.closest('[data-selector="number-controller-plus"]') ||
e.target.closest(".c327") ||
e.target.closest(".c1348")
) {
setTimeout(schedule, 80);
setTimeout(schedule, 350);
setTimeout(schedule, 800);
}
}, true);
new MutationObserver(function(){
schedule();
}).observe(document.body, {
childList: true,
subtree: true,
characterData: true
});
})();