Používáme cookies, abychom Vám umožnili pohodlné prohlížení webu a díky analýze provozu webu neustále zlepšovali jeho funkce, výkon a použitelnost. Více informací
(function () {
'use strict';
var TRIDA = 'zt-priceinfo';
var POPISEK = 'Nejnižší cena za posledních 30 dní';
// --------------------------------------------------------------- styly
function vlozStyly() {
if (document.getElementById('zt-priceinfo-css')) return;
var s = document.createElement('style');
s.id = 'zt-priceinfo-css';
s.textContent = [
// sedí uvnitř velkého s cenou → zarovnat na střed textu a zmenšit
// dopad na výšku řádku (line-height:0), aby cena nepodskočila
'.zt-priceinfo-wrap{position:relative;display:inline-flex;vertical-align:middle;',
'margin-left:8px;line-height:0;font-size:0}',
'.zt-priceinfo{width:18px;height:18px;min-width:18px;padding:0;border:1px solid currentColor;',
'border-radius:50%;background:transparent;color:#7a7a7a;font:600 11px/1 Arial,sans-serif;',
'cursor:pointer;display:inline-flex;align-items:center;justify-content:center;opacity:.75}',
'.zt-priceinfo:hover,.zt-priceinfo:focus{opacity:1;color:#333;outline:none}',
'.zt-priceinfo-tip{position:absolute;top:calc(100% + 8px);left:50%;transform:translateX(-50%);',
'z-index:60;min-width:210px;max-width:280px;padding:10px 12px;border-radius:6px;',
'background:#2c2c2c;color:#fff;font:400 13px/1.45 Arial,sans-serif;text-align:left;',
'box-shadow:0 4px 14px rgba(0,0,0,.22);display:none;white-space:normal}',
'.zt-priceinfo-tip.is-open{display:block}',
'.zt-priceinfo-tip::before{content:"";position:absolute;bottom:100%;margin-left:-6px;',
'border:6px solid transparent;border-bottom-color:#2c2c2c}',
'.zt-priceinfo-tip b{display:block;font-weight:700;font-size:15px;margin-top:3px}',
// šipka se posouvá spolu s bublinou (viz dorovnej()), aby po přisazení
// k okraji obrazovky pořád mířila na ikonu
'.zt-priceinfo-tip::before{left:calc(50% - var(--zt-posun,0px))}'
].join('');
document.head.appendChild(s);
}
// ------------------------------------------------------------- pomocné
function text(el) {
return el ? (el.textContent || '').replace(/ /g, ' ').trim() : '';
}
/** Částka do bubliny: přeškrtnutá cena, jinak aktuální. */
function castka(wrap) {
var prekrtnuta = text(wrap.querySelector('.price-standard'));
if (prekrtnuta) return prekrtnuta;
var aktualni = text(wrap.querySelector('.price-final-holder')) ||
text(wrap.querySelector('.price-final'));
return aktualni;
}
/**
* Přisadí bublinu tak, aby se vešla do okna.
* Na úzkém displeji je cena vlevo, takže vystředěná bublina vyjíždí mimo
* obrazovku — proto se posune a šipka se posune o stejný kus zpět.
*/
function dorovnej(tip) {
tip.style.transform = 'translateX(-50%)';
tip.style.setProperty('--zt-posun', '0px');
var r = tip.getBoundingClientRect();
var okraj = 8;
var posun = 0;
if (r.left < okraj) posun = okraj - r.left;
else if (r.right > window.innerWidth - okraj) posun = (window.innerWidth - okraj) - r.right;
posun = Math.round(posun);
if (posun) {
tip.style.transform = 'translateX(calc(-50% + ' + posun + 'px))';
tip.style.setProperty('--zt-posun', posun + 'px');
}
}
function zavriVse(krome) {
var vsechny = document.querySelectorAll('.zt-priceinfo-tip.is-open');
for (var i = 0; i < vsechny.length; i++) {
if (vsechny[i] === krome) continue;
vsechny[i].classList.remove('is-open');
var b = vsechny[i].parentNode.querySelector('.' + TRIDA);
if (b) b.setAttribute('aria-expanded', 'false');
}
}
// ------------------------------------------------------------ vykreslení
function vykresli(wrap) {
var hodnota = castka(wrap);
if (!hodnota) return; // bez ceny nemá bublina smysl
var obal = wrap.querySelector('.zt-priceinfo-wrap');
if (!obal) {
obal = document.createElement('span');
obal.className = 'zt-priceinfo-wrap';
var btn = document.createElement('button');
btn.type = 'button';
btn.className = TRIDA;
btn.textContent = 'i';
btn.setAttribute('aria-label', POPISEK);
btn.setAttribute('aria-expanded', 'false');
var tip = document.createElement('div');
tip.className = 'zt-priceinfo-tip';
tip.setAttribute('role', 'tooltip');
tip.innerHTML = '';
btn.addEventListener('click', function (e) {
e.preventDefault();
e.stopPropagation();
var otevreno = tip.classList.toggle('is-open');
btn.setAttribute('aria-expanded', otevreno ? 'true' : 'false');
if (otevreno) { zavriVse(tip); dorovnej(tip); }
});
obal.appendChild(btn);
obal.appendChild(tip);
// DOVNITŘ elementu s cenou, ne za něj — .price-final je v této šabloně
// blokový, takže vedle položená ikona by spadla na vlastní řádek pod cenu.
var cena = wrap.querySelector('.price-final') || wrap.querySelector('.price-final-holder');
if (cena) {
cena.appendChild(obal);
} else {
wrap.appendChild(obal);
}
}
// GUARD: zapisuj jen při reálné změně, jinak si observer spustí sám sebe
var lEl = obal.querySelector('.zt-priceinfo-l');
var vEl = obal.querySelector('.zt-priceinfo-v');
if (lEl && lEl.textContent !== POPISEK) lEl.textContent = POPISEK;
if (vEl && vEl.textContent !== hodnota) vEl.textContent = hodnota;
}
function projdi() {
var bloky = document.querySelectorAll('.p-final-price-wrapper');
for (var i = 0; i < bloky.length; i++) vykresli(bloky[i]);
}
// -------------------------------------------------------------- start
function start() {
// jen detail produktu
var jeDetail = document.querySelector('.p-detail, .p-info-wrapper') ||
(window.shoptet && window.shoptet.config &&
window.shoptet.config.pageType === 'productDetail');
if (!jeDetail) return;
vlozStyly();
projdi();
document.addEventListener('click', function () { zavriVse(null); });
document.addEventListener('keydown', function (e) {
if (e.key === 'Escape' || e.keyCode === 27) zavriVse(null);
});
// cena se překresluje při přepnutí varianty
var cil = document.querySelector('.p-info-wrapper') || document.body;
try {
var mo = new MutationObserver(function () { projdi(); });
mo.observe(cil, { childList: true, subtree: true, characterData: true });
} catch (e) { /* starý prohlížeč — stačí jednorázové vykreslení */ }
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', start);
} else {
start();
}
})();