Blizzard 20+40 Longfill
(incl. imposta consumo: 3,04 €)
/** * BF Product Box — Selettore esclusivo scatole / sfusi * Quando l'utente inserisce una quantità in uno dei due campi, * l'altro si offusca e viene disabilitato. Tornando a 0 si riattiva. */ (function () { 'use strict'; var boxes = 0; var sfusi = 0; var updating = false; // 'none' | 'box' | 'sfusi' var activeMode = 'none'; var precision = (typeof prestashop !== 'undefined' && prestashop.currency) ? (prestashop.currency.precision || 2) : 2; function parseIntSafe(value) { var parsed = parseInt(value, 10) || 0; return parsed < 0 ? 0 : parsed; } function getContext() { var container = document.getElementById('bfpbox-container'); if (!container) { return null; } var parsedTiers = []; try { parsedTiers = JSON.parse(container.dataset.tiers || '[]'); } catch (e) { parsedTiers = []; } return { container: container, step: parseInt(container.dataset.step, 10) || 50, basePrice: parseFloat(container.dataset.basePrice) || 0, tiers: parsedTiers, showSavings: container.dataset.showSavings === '1', qtyInput: document.getElementById('quantity_wanted'), boxInput: document.getElementById('bfpbox-box-input'), boxPiecesEl: document.getElementById('bfpbox-box-pieces'), sfusiInput: document.getElementById('bfpbox-sfusi-input'), btnBoxPlus: document.getElementById('bfpbox-box-plus'), btnBoxMinus: document.getElementById('bfpbox-box-minus'), btnSfusiPlus: document.getElementById('bfpbox-sfusi-plus'), btnSfusiMinus: document.getElementById('bfpbox-sfusi-minus'), boxRow: document.getElementById('bfpbox-row-box'), sfusiRow: document.getElementById('bfpbox-row-sfusi'), addBtn: document.querySelector('#add-to-cart-or-refresh [data-button-action="add-to-cart"]'), }; } function getTotal(step) { return (boxes * step) + sfusi; } function round2(val) { var factor = Math.pow(10, precision); return Math.round(val * factor) / factor; } function formatPrice(amount) { amount = round2(amount); if (typeof prestashop !== 'undefined' && prestashop.currency) { var formatted = amount.toFixed(precision); var sign = prestashop.currency.sign || '€'; if (prestashop.currency.format === 1) { return sign + ' ' + formatted; } return formatted + ' ' + sign; } return amount.toFixed(2) + ' €'; } function findActiveTier(discountedQty, tiers) { var active = null; for (var i = 0; i < tiers.length; i++) { if (discountedQty >= tiers[i].qty) { active = tiers[i]; } } return active; } /* ─── Lock / unlock dei campi ─── */ function updateLockState(context) { if (boxes > 0 && sfusi === 0) { activeMode = 'box'; } else if (sfusi > 0 && boxes === 0) { activeMode = 'sfusi'; } else if (boxes === 0 && sfusi === 0) { activeMode = 'none'; } if (context.boxRow && context.sfusiRow) { if (activeMode === 'sfusi') { context.boxRow.classList.add('bfpbox-row-disabled'); context.sfusiRow.classList.remove('bfpbox-row-disabled'); } else if (activeMode === 'box') { context.sfusiRow.classList.add('bfpbox-row-disabled'); context.boxRow.classList.remove('bfpbox-row-disabled'); } else { context.boxRow.classList.remove('bfpbox-row-disabled'); context.sfusiRow.classList.remove('bfpbox-row-disabled'); } } var boxDisabled = (activeMode === 'sfusi'); var sfusiDisabled = (activeMode === 'box'); if (context.boxInput) { context.boxInput.disabled = boxDisabled; } if (context.btnBoxPlus) { context.btnBoxPlus.disabled = boxDisabled; } if (context.btnBoxMinus) { context.btnBoxMinus.disabled = boxDisabled; } if (context.sfusiInput) { context.sfusiInput.disabled = sfusiDisabled; } if (context.btnSfusiPlus) { context.btnSfusiPlus.disabled = sfusiDisabled; } if (context.btnSfusiMinus) { context.btnSfusiMinus.disabled = sfusiDisabled; } } function syncQtyInput(context) { if (!context || !context.qtyInput) { return; } updating = true; context.qtyInput.value = getTotal(context.step); context.qtyInput.dispatchEvent(new Event('change', { bubbles: true })); updating = false; } function syncStateFromQtyInput(resetToZero) { var context = getContext(); if (!context || !context.qtyInput) { return false; } context.qtyInput.setAttribute('min', '0'); if (resetToZero) { boxes = 0; sfusi = 0; context.qtyInput.value = 0; return true; } var qty = parseIntSafe(context.qtyInput.value); if (qty > 0 && context.step > 0 && qty % context.step === 0) { boxes = qty / context.step; sfusi = 0; } else { boxes = 0; sfusi = qty; } return true; } function syncStateFromControls(context) { if (!context) { return; } var liveBoxes = context.boxInput ? parseIntSafe(context.boxInput.value) : boxes; var liveSfusi = context.sfusiInput ? parseIntSafe(context.sfusiInput.value) : sfusi; if (liveBoxes > 0) { liveSfusi = 0; } else if (liveSfusi > 0) { liveBoxes = 0; } boxes = liveBoxes; sfusi = liveSfusi; } function syncQtyBeforeSubmit() { var context = getContext(); if (!context || !context.qtyInput) { return; } syncStateFromControls(context); context.qtyInput.value = getTotal(context.step); } function updateDisplay() { var context = getContext(); if (!context || !context.qtyInput || !context.boxInput || !context.sfusiInput) { return; } if (updating) return; updating = true; context.qtyInput.setAttribute('min', '0'); updateLockState(context); var totalQty = getTotal(context.step); var discountedQty = boxes * context.step; context.boxInput.value = boxes; if (context.boxPiecesEl) { context.boxPiecesEl.textContent = discountedQty > 0 ? '= ' + discountedQty + ' pz' : ''; } context.sfusiInput.value = sfusi; var calcEl = document.getElementById('bfpbox-dynamic-calc'); if (!calcEl) { updating = false; return; } var html = ''; if (context.addBtn) { context.addBtn.disabled = (totalQty < 1); } if (totalQty < 1) { calcEl.innerHTML = ''; highlightTierRow(context, null); updating = false; return; } if (activeMode === 'sfusi' || (activeMode === 'none' && sfusi > 0)) { html += '
' + totalQty + ' pezzi sfusi: ' + formatPrice(totalQty * context.basePrice) + ' (' + formatPrice(context.basePrice) + '/pz a prezzo pieno)
'; var nextTier = context.tiers.length > 0 ? context.tiers[0] : null; if (nextTier) { var boxesNeeded = Math.ceil(nextTier.qty / context.step); html += 'Passa a ' + boxesNeeded + ' scatol' + (boxesNeeded === 1 ? 'a' : 'e') + ' per pagare solo ' + formatPrice(nextTier.unit_price) + '/pz!
'; } html += '' + boxes + ' scatol' + (boxes === 1 ? 'a' : 'e') + ' (' + discountedQty + ' pz) a ' + formatPrice(tier.unit_price) + '/pz:
'; html += 'Risparmi ' + formatPrice(saving) + ' (' + savingPct + '%) rispetto al prezzo pieno di ' + formatPrice(totalIfFull) + '
'; } html += 'Υπάρχουν 22 προϊόντα.