Nepremeškajte novinky, akcie a zľavy!
Môžete sa kedykoľvek odhlásiť. Zasielame v priebehu prebiehajúcich akcií
www.pracovneodevykado.sk
www.pracovneodevykado.sk
(function(){
if (window.KADO_BASKET_CLEAN_FINAL_V1 && window.KADO_BASKET_CLEAN_FINAL_V1.destroy) {
window.KADO_BASKET_CLEAN_FINAL_V1.destroy();
}
var API_BASE = "https://api.pracovneodevykado.com/product/stock/";
var detailCache = {};
var stockCache = {};
var timers = [];
var listeners = [];
var observers = [];
var runToken = 0;
function addListener(target, type, fn, opts){
target.addEventListener(type, fn, opts);
listeners.push([target, type, fn, opts]);
}
function addTimer(fn, delay){
var t = setTimeout(fn, delay);
timers.push(t);
return t;
}
function destroy(){
timers.forEach(clearTimeout);
timers = [];
listeners.forEach(function(x){
x[0].removeEventListener(x[1], x[2], x[3]);
});
listeners = [];
observers.forEach(function(o){
try { o.disconnect(); } catch(e) {}
});
observers = [];
}
window.KADO_BASKET_CLEAN_FINAL_V1 = {
destroy: destroy
};
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(/[^\w\s]/g, " ")
.replace(/\s+/g, " ")
.trim();
}
function esc(s){
return String(s || "")
.replace(/&/g, "&")
.replace(//g, ">")
.replace(/"/g, """);
}
function isBasketPage(){
return location.href.indexOf("e-basket") !== -1 ||
document.querySelector('[data-selector="basket-item"]');
}
function injectStyle(){
if (document.getElementById("kado-basket-clean-final-v1-style")) return;
var style = document.createElement("style");
style.id = "kado-basket-clean-final-v1-style";
style.textContent = `
.kado-basket-stock-v4,
.kado-basket-stock-v5-holder,
.kado-basket-stock-v6-holder,
.kado-basket-stock-v12-holder,
.kado-order-delivery-summary-console,
.kado-order-delivery-summary-v12,
.kado-order-delivery-summary-v13 {
display: none !important;
}
.c847.kado-basket-clean-source,
.c847.in-stock.kado-basket-clean-source {
display: none !important;
}
.kado-basket-clean-holder {
display: block !important;
}
.kado-basket-clean-stock {
display: block !important;
max-width: 260px !important;
font-size: 12.5px !important;
line-height: 1.25 !important;
font-weight: 800 !important;
white-space: normal !important;
text-align: left !important;
}
.kado-basket-clean-store {
display: block !important;
color: #15803d !important;
white-space: normal !important;
}
.kado-basket-clean-external {
display: block !important;
color: #1d4ed8 !important;
margin-top: 3px !important;
white-space: normal !important;
}
.kado-basket-clean-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-basket-clean-summary {
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;
box-sizing: border-box !important;
}
.kado-basket-clean-summary strong {
font-weight: 900 !important;
}
@media (max-width: 768px) {
.kado-basket-clean-stock {
max-width: 100% !important;
font-size: 12.5px !important;
}
.kado-basket-clean-summary {
max-width: 100% !important;
font-size: 13.5px !important;
}
}
`;
document.head.appendChild(style);
}
function cleanupOldBasketOutputs(){
document.querySelectorAll(
".kado-order-delivery-summary-console, " +
".kado-order-delivery-summary-v12, " +
".kado-order-delivery-summary-v13, " +
".kado-basket-stock-v4, " +
".kado-basket-stock-v5-holder, " +
".kado-basket-stock-v6-holder, " +
".kado-basket-stock-v12-holder"
).forEach(function(el){
el.remove();
});
document.querySelectorAll(".c847, .c847.in-stock").forEach(function(el){
el.classList.remove(
"kado-basket-stock-v5-source",
"kado-basket-stock-v6-source",
"kado-basket-stock-v12-source",
"kado-basket-stock-v4-finalized"
);
});
}
function getQtyInput(item){
return item.querySelector(
'[data-selector="number-controller-input"], input[type="number"], input[name^="pocet"]'
);
}
function getQty(item){
var input = getQtyInput(item);
if (!input) return 1;
var val = parseInt(input.value || input.getAttribute("value") || "1", 10);
return val > 0 ? val : 1;
}
function findItemFromSource(source){
var p = source;
for (var i = 0; i < 10 && p; i++) {
if (
p.querySelector &&
p.querySelector("a[href]") &&
p.querySelector("img") &&
getQtyInput(p)
) {
return p;
}
p = p.parentElement;
}
return source.closest('[data-selector="basket-item"], .c1380, .c180, tr, li');
}
function getProductLink(item){
var links = Array.from(item.querySelectorAll("a[href]"));
var link = links.find(function(a){
var href = a.getAttribute("href") || "";
if (!href) 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;
if (href.indexOf("oblub") !== -1) return false;
return true;
});
if (!link) return "";
try {
return new URL(link.getAttribute("href"), location.origin).href;
} catch(e) {
return "";
}
}
function getProductTitle(item){
var links = Array.from(item.querySelectorAll("a[href]"));
for (var i = 0; i < links.length; i++) {
var text = cleanText(links[i].textContent || "");
var href = links[i].getAttribute("href") || "";
if (text && href && href.indexOf("basket") === -1 && href.indexOf("remove") === -1) {
return text;
}
}
var img = item.querySelector("img[alt]");
if (img && cleanText(img.getAttribute("alt"))) {
return cleanText(img.getAttribute("alt"));
}
return cleanText(item.textContent || "").slice(0, 120);
}
function getRows(){
var sources = Array.from(document.querySelectorAll(".c847.in-stock, .c847")).filter(function(source){
if (source.closest(".kado-basket-clean-holder")) return false;
var text = cleanText(source.textContent || "");
if (!text) return false;
return /skladom|extern|dodanie|ks|kus|pár|par|PW|Malf|CR\/Dlt|Dlt/i.test(text);
});
var rows = [];
var seen = new Set();
sources.forEach(function(source){
var item = findItemFromSource(source);
if (!item) return;
if (seen.has(item)) return;
if (!getProductLink(item)) return;
if (!getQtyInput(item)) return;
seen.add(item);
rows.push({
item: item,
source: source
});
});
return rows;
}
function normalizeUnit(unit){
unit = cleanText(unit || "").toLowerCase();
if (/pár|par|párov|parov/.test(unit)) return "pár";
return "ks";
}
function detectUnitFromText(text){
return /pár|par|PÁR|PAR/.test(text || "") ? "pár" : "ks";
}
function parseDays(text){
text = cleanText(text);
var m = text.match(/(?:do\s*)?([0-9]+)\s*[–-]\s*([0-9]+)\s*dni/i);
if (!m) return null;
var min = Number(m[1]);
var max = Number(m[2]);
if (!min || !max) return null;
return {
min: min,
max: max,
label: min + "-" + max + " dní"
};
}
function parseExternalFromText(text){
text = cleanText(text);
var days = parseDays(text);
var qty = 0;
var unit = detectUnitFromText(text);
var isMoreThan = false;
var moreMatch = text.match(/>\s*([0-9]+)\s*(ks|kus|KS|KUS|pár|par|PÁR|PAR)/i);
if (moreMatch && moreMatch[1]) {
qty = Number(moreMatch[1]) || 0;
unit = normalizeUnit(moreMatch[2]);
isMoreThan = true;
} else {
var matches = Array.from(text.matchAll(/([0-9]+)\s*(ks|kus|KS|KUS|pár|par|PÁR|PAR)/gi));
if (matches.length) {
var last = matches[matches.length - 1];
qty = Number(last[1]) || 0;
unit = normalizeUnit(last[2]);
}
}
return {
qty: qty,
unit: unit,
days: days,
isMoreThan: isMoreThan
};
}
function parseStoreFromText(text){
text = cleanText(text);
var m = text.match(/Skladom\s*:\s*([0-9]+)\s*ks/i);
if (m && m[1]) return Number(m[1]) || 0;
return /Skladom/i.test(text) ? null : 0;
}
function extractCodeFromHtml(html){
var doc = new DOMParser().parseFromString(html, "text/html");
var sku =
doc.querySelector(".kado-product-code-top__code") ||
doc.querySelector('[itemprop="sku"]') ||
doc.querySelector('[data-product-code]');
if (sku) {
var val =
sku.getAttribute("content") ||
sku.getAttribute("data-product-code") ||
sku.textContent;
if (cleanText(val)) {
return cleanText(val).replace(/[.,;:]$/g, "");
}
}
var text = cleanText(doc.body ? doc.body.innerText : html);
var m =
text.match(/Kód produktu\s*:\s*([A-Za-z0-9_\-\/.]+)/i) ||
text.match(/Kod produktu\s*:\s*([A-Za-z0-9_\-\/.]+)/i);
return m && m[1] ? cleanText(m[1]).replace(/[.,;:]$/g, "") : "";
}
function parseExternalFromDocument(doc){
var texts = [];
var preferred = [
doc.querySelector(".c755.stock .c757.in-stock"),
doc.querySelector(".c755.stock .c757"),
doc.querySelector(".kado-external-stock-box")
].filter(Boolean);
preferred.forEach(function(el){
texts.push(cleanText(el.textContent || ""));
});
Array.from(doc.querySelectorAll("body *:not(script):not(style)")).forEach(function(el){
var text = cleanText(el.textContent || "");
if (!text) return;
if (text.length > 1000) return;
if (
/dodanie/i.test(text) &&
/([0-9]+\s*[–-]\s*[0-9]+\s*dni)/i.test(text) &&
/(?:>\s*[0-9]+|[0-9]+\s*(ks|kus|KS|KUS|pár|par|PÁR|PAR))/i.test(text)
) {
texts.push(text);
}
});
texts = texts
.filter(Boolean)
.sort(function(a, b){
return a.length - b.length;
});
for (var i = 0; i < texts.length; i++) {
var parsed = parseExternalFromText(texts[i]);
if (parsed.qty > 0 || parsed.days) {
return parsed;
}
}
return {
qty: 0,
unit: "ks",
days: null,
isMoreThan: false
};
}
function loadDetailData(url){
if (!url) {
return Promise.resolve({
code: "",
external: {
qty: 0,
unit: "ks",
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("Detail HTTP " + response.status);
return response.text();
})
.then(function(html){
var doc = new DOMParser().parseFromString(html, "text/html");
return {
code: extractCodeFromHtml(html),
external: parseExternalFromDocument(doc)
};
})
.catch(function(){
return {
code: "",
external: {
qty: 0,
unit: "ks",
days: null
}
};
});
return detailCache[url];
}
function loadStock(code){
if (!code) return Promise.resolve(null);
if (stockCache[code]) return stockCache[code];
stockCache[code] = fetch(API_BASE + encodeURIComponent(code), {
method: "GET",
cache: "no-store",
mode: "cors"
})
.then(function(response){
if (!response.ok) throw new Error("Stock HTTP " + response.status);
return response.json();
})
.catch(function(){
return null;
});
return stockCache[code];
}
function storeDelivery(){
return {
min: 1,
max: 3,
label: "1-3 dní"
};
}
function fallbackExternalDelivery(){
return {
min: 3,
max: 10,
label: "3-10 dní"
};
}
function buildStockHtml(qty, storeStock, externalQty, externalUnit, externalDays){
qty = Math.max(1, Number(qty || 1));
storeStock = Math.max(0, Number(storeStock || 0));
externalQty = Math.max(0, Number(externalQty || 0));
var days = externalDays || fallbackExternalDelivery();
var unit = externalUnit || "ks";
var html = '';
if (storeStock > 0) {
var storePart = Math.min(qty, storeStock);
var needExternal = Math.max(0, qty - storePart);
if (needExternal <= 0) {
html +=
'' +
' Skladom' +
' ';
html += ' ';
return html;
}
html +=
'' +
' Skladom: ' +
storePart + ' ks ' +
' ';
if (externalQty > 0) {
var extPart = Math.min(needExternal, externalQty);
html +=
'🚚 Externý sklad: ' +
extPart + ' ' + esc(unit) + ' (' + esc(days.label) + ') ';
}
html += '';
return html;
}
if (externalQty > 0) {
var extOnly = Math.min(qty, externalQty);
html +=
'🚚 Externý sklad: ' +
extOnly + ' ' + esc(unit) + ' (' + esc(days.label) + ') ';
html += '';
return html;
}
html += '';
return html;
}
function renderRow(row, html){
if (!html) return;
var source = row.source;
if (!source || !source.parentNode) return;
source.classList.add("kado-basket-clean-source");
var holder = source.parentNode.querySelector(".kado-basket-clean-holder");
if (!holder) {
holder = document.createElement("div");
holder.className = "kado-basket-clean-holder";
source.parentNode.insertBefore(holder, source.nextSibling);
}
if (holder.dataset.kadoHtml === html) return;
holder.innerHTML = html;
holder.dataset.kadoHtml = html;
}
function findCouponBlock(){
var candidates = Array.from(document.querySelectorAll("label, div, p, span")).filter(function(el){
if (el.closest(".kado-basket-clean-summary")) return false;
var text = norm(el.textContent || "");
return text.indexOf("mam zlavovy kupon") !== -1 && text.length < 140;
});
if (!candidates.length) return null;
candidates.sort(function(a, b){
return (a.textContent || "").length - (b.textContent || "").length;
});
var el = candidates[0];
var p = el;
for (var i = 0; i < 5 && p; i++) {
var text = norm(p.textContent || "");
if (
text.indexOf("mam zlavovy kupon") !== -1 &&
p.querySelector &&
p.querySelector('input[type="checkbox"]')
) {
return p;
}
p = p.parentElement;
}
return el.closest("label, div, p") || el;
}
function renderSummary(longest){
if (!longest || !longest.label) return;
var box = document.querySelector(".kado-basket-clean-summary");
if (!box) {
box = document.createElement("div");
box.className = "kado-basket-clean-summary";
}
box.innerHTML = "Dodanie objednávky: " + esc(longest.label);
var coupon = findCouponBlock();
if (coupon && coupon.parentNode) {
coupon.parentNode.insertBefore(box, coupon);
} else {
var rows = getRows();
if (rows.length) {
var last = rows[rows.length - 1].item;
if (last && last.parentNode) {
last.parentNode.insertBefore(box, last.nextSibling);
}
}
}
try {
localStorage.setItem("kado_order_delivery_term", "Dodanie objednávky: " + longest.label);
} catch(e) {}
}
function setDeliveryNoteIfExists(longest){
if (!longest || !longest.label) return;
var wanted = "Dodanie objednávky: " + longest.label;
var fields = Array.from(document.querySelectorAll(
'textarea, input[type="text"], input:not([type])'
));
var field = fields.find(function(f){
var attrs = norm([
f.name || "",
f.id || "",
f.getAttribute("placeholder") || "",
f.getAttribute("aria-label") || "",
f.getAttribute("data-name") || ""
].join(" "));
return attrs.indexOf("termin dodania") !== -1 ||
(attrs.indexOf("termin") !== -1 && attrs.indexOf("dodania") !== -1);
});
if (!field) return;
if (field.value !== wanted) {
field.value = wanted;
field.dispatchEvent(new Event("input", { bubbles: true }));
field.dispatchEvent(new Event("change", { bubbles: true }));
if (window.jQuery) {
try {
window.jQuery(field).val(wanted).trigger("input").trigger("change");
} catch(e) {}
}
}
}
function chooseLongest(daysList){
var list = daysList.filter(Boolean);
if (!list.length) return null;
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 processRow(row, index, token){
var item = row.item;
var source = row.source;
if (!source.dataset.kadoOriginalCleanText) {
source.dataset.kadoOriginalCleanText = cleanText(source.textContent || "");
}
var originalText = source.dataset.kadoOriginalCleanText || cleanText(source.textContent || "");
var sourceExternal = parseExternalFromText(originalText);
var sourceStore = parseStoreFromText(originalText);
var qty = getQty(item);
var url = getProductLink(item);
var title = getProductTitle(item);
return loadDetailData(url).then(function(detail){
if (token !== runToken) return null;
var code = detail.code || "";
return loadStock(code).then(function(stockData){
if (token !== runToken) return null;
var apiStore = Number(
stockData && typeof stockData.oberonStock !== "undefined"
? stockData.oberonStock
: 0
);
var apiSupplier = Number(
stockData && typeof stockData.supplierStock !== "undefined"
? stockData.supplierStock
: 0
);
var detailExternal = detail.external || {
qty: 0,
unit: "ks",
days: null
};
var storeStock = apiStore > 0
? apiStore
: sourceStore !== null
? sourceStore
: 0;
var externalQty =
Number(detailExternal.qty || 0) > 0
? Number(detailExternal.qty || 0)
: Number(sourceExternal.qty || 0) > 0
? Number(sourceExternal.qty || 0)
: apiSupplier > 0
? apiSupplier
: 0;
var externalUnit =
detailExternal.unit ||
sourceExternal.unit ||
detectUnitFromText(originalText) ||
"ks";
var externalDays =
detailExternal.days ||
sourceExternal.days ||
null;
if (externalQty > 0 && !externalDays) {
externalDays = fallbackExternalDelivery();
}
var html = buildStockHtml(
qty,
storeStock,
externalQty,
externalUnit,
externalDays
);
renderRow(row, html);
var storePart = Math.min(qty, Math.max(0, storeStock));
var needExternal = Math.max(0, qty - storePart);
var usedDelivery = needExternal > 0
? (externalDays || fallbackExternalDelivery())
: storeDelivery();
return {
index: index,
title: title,
qty: qty,
code: code,
storeStock: storeStock,
externalQty: externalQty,
externalDays: externalDays ? externalDays.label : "",
usedDelivery: usedDelivery.label
};
});
});
}
function run(){
if (!isBasketPage()) return;
injectStyle();
cleanupOldBasketOutputs();
runToken++;
var token = runToken;
var rows = getRows();
if (!rows.length) return;
Promise.all(rows.map(function(row, index){
return processRow(row, index, token);
})).then(function(results){
if (token !== runToken) return;
results = results.filter(Boolean);
var longest = chooseLongest(results.map(function(r){
if (!r || !r.usedDelivery) return null;
return parseDays(r.usedDelivery) || storeDelivery();
}));
renderSummary(longest);
setDeliveryNoteIfExists(longest);
console.log("KADO KOŠÍK CLEAN FINAL:", results);
});
}
function scheduleRun(){
addTimer(run, 100);
addTimer(run, 400);
addTimer(run, 900);
addTimer(run, 1600);
}
var scheduleTimer = null;
function scheduleSoftRun(){
clearTimeout(scheduleTimer);
scheduleTimer = setTimeout(run, 220);
}
addListener(document, "input", function(e){
if (e.target && e.target.matches('[data-selector="number-controller-input"], input[type="number"], input[name^="pocet"]')) {
scheduleRun();
}
}, true);
addListener(document, "change", function(e){
if (e.target && e.target.matches('[data-selector="number-controller-input"], input[type="number"], input[name^="pocet"]')) {
scheduleRun();
}
}, true);
addListener(document, "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")
) {
scheduleRun();
}
}, true);
var observer = new MutationObserver(function(){
scheduleSoftRun();
});
observer.observe(document.body, {
childList: true,
subtree: true,
characterData: true
});
observers.push(observer);
scheduleRun();
})();
Obrázky sú ilustračné. Dodávateľ si vyhradzuje právo na typografické chyby. www.pracovneodevykado.sk © 2025, Všetky práva vyhradené.
Potvrďte, prosím, že nejste robot