Estimated Price:€195Final price may vary · VAT included
document.addEventListener(‘DOMContentLoaded’, function () { // ── RADIO BUTTONS: Premium Finishes ────────────────────────────── function initRadioGroups() { document.querySelectorAll(‘.custom-selection-group’).forEach(function (group) { var labels = group.querySelectorAll(‘.wpcf7-list-item-label’); group.querySelectorAll(‘input[type=”radio”]’).forEach(function (input) { if (input.checked) { var lbl = input.closest(‘.wpcf7-list-item’) .querySelector(‘.wpcf7-list-item-label’); if (lbl) lbl.classList.add(‘is-selected’); } }); labels.forEach(function (label) { label.addEventListener(‘click’, function () { labels.forEach(function (l) { l.classList.remove(‘is-selected’); }); label.classList.add(‘is-selected’); var item = label.closest(‘.wpcf7-list-item’); if (item) { var radio = item.querySelector(‘input[type=”radio”]’); if (radio) radio.checked = true; } updatePrice(); }); }); }); } initRadioGroups(); document.addEventListener(‘wpcf7reset’, function () { initRadioGroups(); updatePrice(); }); // ── PRINT BASE CARDS ───────────────────────────────────────────── var cards = document.querySelectorAll(‘#print-base-cards .print-base-card’); cards.forEach(function (card) { card.addEventListener(‘click’, function () { cards.forEach(function (c) { c.classList.remove(‘is-selected’); }); card.classList.add(‘is-selected’); var value = card.getAttribute(‘data-value’); document.querySelectorAll(‘input[name=”print-base”]’).forEach(function (r) { if (r.value === value) r.checked = true; }); updatePrice(); }); }); // ── MULTI-FILE UPLOAD ───────────────────────────────────────────── // Stessa logica dell’originale (click su div → trigger input CF7 nativo) // ma con lista file + pulsante X + contatore, senza DataTransfer multiplo. // Ogni nuovo file selezionato si AGGIUNGE alla lista visiva; // l’input CF7 viene aggiornato con DataTransfer ogni volta. function initUploadZone(areaId, listId, counterId, inputName, maxFiles) { var area = document.getElementById(areaId); var listEl = document.getElementById(listId); var counterEl = document.getElementById(counterId); var cf7Input = document.querySelector(‘input[name=”‘ + inputName + ‘”]’); if (!area || !listEl || !counterEl || !cf7Input) return null; var files = []; // array di File objects function updateCounter() { counterEl.textContent = files.length + ‘ / ‘ + maxFiles; counterEl.classList.toggle(‘limit-reached’, files.length >= maxFiles); } function syncInput() { // Aggiorna l’input CF7 con tutti i file attuali try { var dt = new DataTransfer(); files.forEach(function(f) { dt.items.add(f); }); cf7Input.files = dt.files; } catch(e) {} } function renderList() { listEl.innerHTML = ”; files.forEach(function(file, i) { var item = document.createElement(‘div’); item.className = ‘upload-file-item’; var nameSpan = document.createElement(‘span’); nameSpan.textContent = ‘📎 ‘ + file.name; item.appendChild(nameSpan); var btn = document.createElement(‘button’); btn.type = ‘button’; btn.className = ‘remove-file-btn’; btn.textContent = ‘×’; btn.title = ‘Remove’; (function(idx) { btn.addEventListener(‘click’, function(e) { e.stopPropagation(); files.splice(idx, 1); syncInput(); renderList(); updateCounter(); // Riabilita il drop area se sotto il limite area.style.opacity = ”; area.style.pointerEvents = ”; }); })(i); item.appendChild(btn); listEl.appendChild(item); }); updateCounter(); // Se al limite, oscura il drop area if (files.length >= maxFiles) { area.style.opacity = ‘0.5’; area.style.pointerEvents = ‘none’; } else { area.style.opacity = ”; area.style.pointerEvents = ”; } } function addFile(file) { if (files.length >= maxFiles) return; // Evita duplicati per nome+dimensione var exists = files.some(function(f) { return f.name === file.name && f.size === file.size; }); if (!exists) files.push(file); } // Click sul drop area → apre il file picker CF7 nativo area.addEventListener(‘click’, function() { if (files.length >= maxFiles) return; cf7Input.click(); }); // Quando l’utente seleziona file dal picker cf7Input.addEventListener(‘change’, function() { if (cf7Input.files && cf7Input.files.length > 0) { Array.from(cf7Input.files).forEach(addFile); syncInput(); renderList(); } }); // Drag & drop area.addEventListener(‘dragover’, function(e) { e.preventDefault(); area.classList.add(‘drag-over’); }); area.addEventListener(‘dragleave’, function() { area.classList.remove(‘drag-over’); }); area.addEventListener(‘drop’, function(e) { e.preventDefault(); area.classList.remove(‘drag-over’); if (files.length >= maxFiles) return; Array.from(e.dataTransfer.files).forEach(addFile); syncInput(); renderList(); }); updateCounter(); return { getCount: function() { return files.length; } }; } var inspirationZone = initUploadZone(‘upload-area-inspiration’, ‘list-inspiration’, ‘counter-inspiration’, ‘inspiration-upload’, 3); var bikeZone = initUploadZone(‘upload-area-bike’, ‘list-bike’, ‘counter-bike’, ‘bike-upload’, 5); // ── VALIDAZIONE NUMERI ──────────────────────────────────────────── function onlyNumbers(inputId, errorId) { var input = document.getElementById(inputId); var error = document.getElementById(errorId); if (!input || !error) return; input.addEventListener(‘input’, function() { input.value = input.value.replace(/[^0-9 ]/g, ”); }); input.addEventListener(‘blur’, function() { error.style.display = (input.value.trim() !== ” && /[^0-9 ]/.test(input.value)) ? ‘block’ : ‘none’; }); input.addEventListener(‘focus’, function() { error.style.display = ‘none’; }); } onlyNumbers(‘race-number-field’, ‘error-race-number’); onlyNumbers(‘phone-number’, ‘error-phone-number’); // ── BLOCCA SUBMIT SE ERRORI ─────────────────────────────────────── var form = document.querySelector(‘.wpcf7-form’); if (form) { form.addEventListener(‘submit’, function(e) { var hasError = false; var raceInput = document.getElementById(‘race-number-field’); var phoneInput = document.getElementById(‘phone-number’); if (raceInput && raceInput.value.trim() !== ” && /[^0-9 ]/.test(raceInput.value)) { document.getElementById(‘error-race-number’).style.display = ‘block’; hasError = true; } if (phoneInput && /[^0-9 ]/.test(phoneInput.value)) { document.getElementById(‘error-phone-number’).style.display = ‘block’; hasError = true; } // Bike upload: almeno 1 file obbligatorio var errBike = document.getElementById(‘error-bike-upload’); if (bikeZone && bikeZone.getCount() === 0) { if (errBike) errBike.style.display = ‘block’; hasError = true; } else { if (errBike) errBike.style.display = ‘none’; } if (hasError) e.preventDefault(); }, true); } // ── SYNC MODELLO/ANNO NEI CAMPI NASCOSTI ────────────────────────── var modelSelects = [ ‘beta-list’,’ducati-list’,’fantic-list’,’gasgas-list’,’hmvent-list’, ‘honda-list’,’husqvarna-list’,’kawasaki-list’,’ktm-list’,’rieju-list’, ‘sherco-list’,’suzuki-list’,’tm-list’,’triumph-list’,’yamaha-list’ ]; var yearSelects = [ ‘beta-year’,’ducati-year’,’fantic-year’,’gasgas-year’,’hmvent-year’, ‘honda-year’,’husqvarna-year’,’kawasaki-year’,’ktm-year’,’rieju-year’, ‘sherco-year’,’suzuki-year’,’tm-year’,’triumph-year’,’yamaha-year’ ]; function syncHiddenFields() { var modelHidden = document.getElementById(‘selected-model’); var yearHidden = document.getElementById(‘selected-year’); modelSelects.forEach(function(name) { var sel = document.querySelector(‘select[name=”‘ + name + ‘”]’); if (sel && sel.value && sel.offsetParent !== null) { if (modelHidden) modelHidden.value = sel.value; } }); yearSelects.forEach(function(name) { var sel = document.querySelector(‘select[name=”‘ + name + ‘”]’); if (sel && sel.value && sel.offsetParent !== null) { if (yearHidden) yearHidden.value = sel.value; } }); } modelSelects.concat(yearSelects).forEach(function(name) { var sel = document.querySelector(‘select[name=”‘ + name + ‘”]’); if (sel) sel.addEventListener(‘change’, syncHiddenFields); }); var formEl = document.querySelector(‘.wpcf7-form’); if (formEl) formEl.addEventListener(‘submit’, syncHiddenFields, true); // ── PREZZO IN TEMPO REALE ───────────────────────────────────────── function updatePrice() { var base = document.querySelector(‘input[name=”print-base”]:checked’); var finish = document.querySelector(‘input[name=”premium-finish”]:checked’); var baseVal = base ? base.value : ‘Regular Print’; var finishVal = finish ? finish.value : ‘Gloss’; var price = (finishVal === ‘Multicolor Glitter’) ? (baseVal === ‘Regular Print’ ? 240 : 260) : (baseVal === ‘Regular Print’ ? 195 : 240); var display = document.getElementById(‘live-price’); if (display) display.textContent = ‘€’ + price; var hiddenField = document.getElementById(‘order-price’); if (hiddenField) hiddenField.value = price; } updatePrice(); // ── REDIRECT AL CHECKOUT DOPO INVIO CF7 ────────────────────────── document.addEventListener(‘wpcf7mailsent’, function(event) { if (event.detail.contactFormId == ‘1938’) { var response = event.detail.apiResponse; if (response && response.custom_redirect) { window.location.href = response.custom_redirect; } } }, false); });