/**
* 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 += '
';
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 += '
';
highlightTierRow(context, null);
} else if (activeMode === 'box' && discountedQty > 0) {
var tier = findActiveTier(discountedQty, context.tiers);
if (tier) {
var discountedTotal = discountedQty * tier.unit_price;
var totalIfFull = discountedQty * context.basePrice;
html += '';
html += '
' + boxes + ' scatol' + (boxes === 1 ? 'a' : 'e') + ' (' + discountedQty + ' pz) a ' + formatPrice(tier.unit_price) + '/pz :
';
html += '
';
html += '
';
html += '' + discountedQty + ' pz × ' + formatPrice(tier.unit_price) + ' ';
html += '' + formatPrice(discountedTotal) + ' ';
html += '
';
html += '
';
html += 'Totale ';
html += '' + formatPrice(discountedTotal) + ' ';
html += '
';
html += '
';
if (context.showSavings && totalIfFull > discountedTotal) {
var saving = totalIfFull - discountedTotal;
var savingPct = ((saving / totalIfFull) * 100).toFixed(1);
html += '
Risparmi ' + formatPrice(saving) + ' (' + savingPct + '%) rispetto al prezzo pieno di ' + formatPrice(totalIfFull) + '
';
}
html += '
';
highlightTierRow(context, tier);
} else {
highlightTierRow(context, null);
}
} else {
highlightTierRow(context, null);
}
calcEl.innerHTML = html;
updating = false;
}
function highlightTierRow(context, tier) {
if (!context) {
return;
}
var rows = context.container.querySelectorAll('.bfpbox-tiers-table tr[data-tier-qty]');
for (var i = 0; i < rows.length; i++) {
var tierQty = parseInt(rows[i].dataset.tierQty, 10);
rows[i].classList.toggle('bfpbox-tier-active', tier && tierQty === tier.qty);
}
}
function bindHandlers() {
var context = getContext();
if (!context || !context.qtyInput || !context.boxInput || !context.sfusiInput) {
return;
}
if (context.btnBoxPlus && context.btnBoxPlus.dataset.bfpboxBound !== '1') {
context.btnBoxPlus.dataset.bfpboxBound = '1';
context.btnBoxPlus.addEventListener('click', function () {
if (activeMode === 'sfusi') return;
var liveContext = getContext();
if (!liveContext) return;
boxes = parseIntSafe(liveContext.boxInput.value) + 1;
sfusi = 0;
syncQtyInput(liveContext);
updateDisplay();
});
}
if (context.btnBoxMinus && context.btnBoxMinus.dataset.bfpboxBound !== '1') {
context.btnBoxMinus.dataset.bfpboxBound = '1';
context.btnBoxMinus.addEventListener('click', function () {
if (activeMode === 'sfusi') return;
var liveContext = getContext();
if (!liveContext) return;
boxes = parseIntSafe(liveContext.boxInput.value);
if (boxes > 0) {
boxes--;
sfusi = 0;
syncQtyInput(liveContext);
updateDisplay();
}
});
}
if (context.boxInput.dataset.bfpboxBound !== '1') {
context.boxInput.dataset.bfpboxBound = '1';
context.boxInput.addEventListener('change', function () {
if (activeMode === 'sfusi') return;
boxes = parseIntSafe(context.boxInput.value);
sfusi = 0;
syncQtyInput(getContext());
updateDisplay();
});
context.boxInput.addEventListener('input', function () {
clearTimeout(context.boxInput._bfTimer);
context.boxInput._bfTimer = setTimeout(function () {
if (activeMode === 'sfusi') return;
boxes = parseIntSafe(context.boxInput.value);
sfusi = 0;
syncQtyInput(getContext());
updateDisplay();
}, 400);
});
}
if (context.btnSfusiPlus && context.btnSfusiPlus.dataset.bfpboxBound !== '1') {
context.btnSfusiPlus.dataset.bfpboxBound = '1';
context.btnSfusiPlus.addEventListener('click', function () {
if (activeMode === 'box') return;
var liveContext = getContext();
if (!liveContext) return;
sfusi = parseIntSafe(liveContext.sfusiInput.value) + 1;
boxes = 0;
syncQtyInput(liveContext);
updateDisplay();
});
}
if (context.btnSfusiMinus && context.btnSfusiMinus.dataset.bfpboxBound !== '1') {
context.btnSfusiMinus.dataset.bfpboxBound = '1';
context.btnSfusiMinus.addEventListener('click', function () {
if (activeMode === 'box') return;
var liveContext = getContext();
if (!liveContext) return;
sfusi = parseIntSafe(liveContext.sfusiInput.value);
if (sfusi > 0) {
sfusi--;
boxes = 0;
syncQtyInput(liveContext);
updateDisplay();
}
});
}
if (context.sfusiInput.dataset.bfpboxBound !== '1') {
context.sfusiInput.dataset.bfpboxBound = '1';
context.sfusiInput.addEventListener('change', function () {
if (activeMode === 'box') return;
sfusi = parseIntSafe(context.sfusiInput.value);
boxes = 0;
syncQtyInput(getContext());
updateDisplay();
});
context.sfusiInput.addEventListener('input', function () {
clearTimeout(context.sfusiInput._bfTimer);
context.sfusiInput._bfTimer = setTimeout(function () {
if (activeMode === 'box') return;
sfusi = parseIntSafe(context.sfusiInput.value);
boxes = 0;
syncQtyInput(getContext());
updateDisplay();
}, 400);
});
}
if (context.qtyInput.dataset.bfpboxQtyBound !== '1') {
context.qtyInput.dataset.bfpboxQtyBound = '1';
context.qtyInput.addEventListener('change', function () {
if (updating) return;
syncStateFromQtyInput(false);
updateDisplay();
});
context.qtyInput.addEventListener('input', function () {
clearTimeout(context.qtyInput._bfTimer);
context.qtyInput._bfTimer = setTimeout(function () {
if (updating) return;
syncStateFromQtyInput(false);
updateDisplay();
}, 400);
});
}
if (context.addBtn && context.addBtn.dataset.bfpboxSubmitBound !== '1') {
context.addBtn.dataset.bfpboxSubmitBound = '1';
context.addBtn.addEventListener('click', function () {
syncQtyBeforeSubmit();
}, true);
}
}
if (typeof prestashop !== 'undefined') {
prestashop.on('updatedProduct', function () {
setTimeout(function () {
bindHandlers();
syncStateFromQtyInput(true);
updateDisplay();
}, 100);
});
}
window.addEventListener('pageshow', function () {
bindHandlers();
syncStateFromQtyInput(true);
updateDisplay();
});
if (!syncStateFromQtyInput(true)) {
return;
}
bindHandlers();
updateDisplay();
})();
Home
Ταξινόμηση κατά:
Όνομα, Α προς Ω
Φίλτρο
Ενεργά φίλτρα
Τύπος γεύσης: Mistura
clear
Περιεχόμενο φιάλης σε mL: 20
clear
Aroma organico di tabacco coil friendly estratto da foglie di Basma, Virginia, Latakia e Perique
Una miscela balcanica morbida, con sfumature di frutta secca e la speziatura tipica dei tabacchi orientali, leggermente affumicata.
22,03 €
(incl. imposta consumo: 3,04 €)
Aroma organico di tabacco coil friendly estratto da foglie di Basma, Virginia, Latakia e Perique
Una miscela balcanica morbida, con sfumature di frutta secca e la speziatura tipica dei tabacchi orientali, leggermente affumicata.
Χωρίς απόθεμα
Aroma organico di tabacco coil friendly estratto da foglie di Habanos, Dark Fire Cured e Virginia
22,03 €
(incl. imposta consumo: 3,04 €)
Χωρίς απόθεμα
Aroma organico di tabacco coil friendly estratto da foglie di Latakia, Virginia e Katerini
22,03 €
(incl. imposta consumo: 3,04 €)
Aroma organico di tabacco coil friendly estratto da foglie di Latakia, Virginia e Katerini
Χωρίς απόθεμα
Aroma organico di tabacco coil friendly estratto da foglie di Piloto Cubano, Habanos, Mata Fina brasiliano
Ispirato al sigaro cubano, è connotato da note di testa avvolgenti, paglierine e dolciastre. A chiudere si percepisce un retrogusto lievemente fermentato
Vincitore del premio "Miglior liquido al tabacco" al Vapexpro Repubblica Ceca 2024
25,03 €
(incl. imposta consumo: 3,04 €)
Χωρίς απόθεμα
Aroma organico di tabacco coil friendly estratto da foglie di Kentucky e Dark Fire Cured
22,03 €
(incl. imposta consumo: 3,04 €)
Aroma organico di tabacco coil friendly estratto da foglie di Kentucky e Dark Fire Cured
Aroma organico di tabacco coil friendly estratto da foglie di Virginia, Cavendish e Latakia
22,03 €
(incl. imposta consumo: 3,04 €)
Aroma organico di tabacco coil friendly estratto da foglie di Virginia, Cavendish e Latakia
Χωρίς απόθεμα
Aroma organico di tabacco coil friendly estratto da foglie di Cavendish, Burley e Virginia
22,03 €
(incl. imposta consumo: 3,04 €)
check_circle
check_circle