/**
* 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
Ταξινόμηση κατά:
Όνομα, Α προς Ω
Φίλτρο
Ενεργά φίλτρα
Διαθεσιμότητα: Μη διαθέσιμο
clear
Περιεχόμενο φιάλης σε mL: 10
clear
Χωρίς απόθεμα
Aroma organico di tabacco coil friendly estratto da foglie di Avana
Χωρίς απόθεμα
Aroma orginico 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 Basma e Prilep, aromatizzato con tè nero giapponese
Liquido pronto 10 ml organico coil friendly
Estratto da foglie di Basma, Prilep, aromatizzato con tè nero giapponese
Basi 10 mL con nicotina composte da 30% Glicole Propilenico EP e 70% Glicerina E422 secondo indicazioni in etichetta.
Basi 10 mL con nicotina composte da 50% Glicole Propilenico EP e 50% Glicerina E422 secondo indicazioni in etichetta.
Χωρίς απόθεμα
Aroma organico di tabacco coil friendly estratto da foglie di Burley e Virginia, aromatizzato con cappuccino
Χωρίς απόθεμα
Aroma organico di tabacco coil friendly estratto da foglie di Burley
Liquido pronto 10 ml organico coil friendly
Estratto da foglie di Burley
Χωρίς απόθεμα
Aroma organico di tabacco coil friendly estratto da foglie di Habanos, Dark Fire Cured e Virginia
Χωρίς απόθεμα
Aroma organico di tabacco coil friendly estratto da foglie di Latakia, Virginia e Katerini
Χωρίς απόθεμα
Aroma organico di tabacco coil friendly estratto da foglie di Latakia, aromatizzato con caramello salato e crema bavarese
11,51 €
(incl. imposta consumo: 1,52 €)
Χωρίς απόθεμα
Aroma organico di tabacco coil friendly estratto da foglie di Latakia, aromatizzato con caramello salato e crema bavarese
Χωρίς απόθεμα
Aroma organico di tabacco coil friendly estratto da foglie di Virginia e Burley, aromatizzato con banana, cocco e yogurt
Χωρίς απόθεμα
Aroma organico di tabacco coil friendly estratto da foglie di Burley, Cavendish e Virginia, aromatizzato con Calvados (distillato di sidro di mele, prodotto in Normandia, in Francia)
Χωρίς απόθεμα
Frutto della Passione - Συμπυκνωμένο άρωμα με βάση PG, προς αραίωση σε βάση με ή χωρίς νικοτίνη. Τυπική αναλογία αραίωσης 10%.
9,01 €
(incl. imposta consumo: 1,52 €)
Χωρίς απόθεμα
Golden Cavendish. Aroma organico concentrato estratto dal tabacco. Flacone contenente 10 mL. Utilizzare per prodotti da svapo diluito preferibilmente al 10%.
Χωρίς απόθεμα
Habanos Grand Reserve. Aroma organico concentrato estratto dal tabacco. Flacone contenente 10 mL. Utilizzare per prodotti da svapo diluito preferibilmente al 10%.
Χωρίς απόθεμα
Aroma organico di tabacco coil friendly estratto da foglie di Kentucky
11,51 €
(incl. imposta consumo: 1,52 €)
Χωρίς απόθεμα
Aroma organico di tabacco coil friendly estratto da foglie di Kentucky
check_circle
check_circle