/** * AutoTorino - Blocco Veicolo (Prenotazione/Acquisto) * @version 1.0.0 * @requires jQuery * @requires Magento_Ui/js/modal/modal */ (function() { 'use strict'; /** * Inizializza il modulo quando il DOM e le dipendenze sono pronte */ function initBloccoVeicolo() { try { // Verifica prerequisiti if (!document.querySelector('.product-info-main')) { console.info('Blocco Veicolo: non siamo in una pagina prodotto'); return; } // Esegui inizializzazione setupBloccoVeicolo(); } catch (error) { console.error('Errore inizializzazione Blocco Veicolo:', error); } } /** * Setup principale del blocco veicolo */ function setupBloccoVeicolo() { const urlSearchParams = new URLSearchParams(window.location.search); const productInfoMain = document.querySelector('.product-info-main'); const tabPredefined = document.querySelector('.actions.tabs-actions'); const tabPredefined2 = document.querySelector('.row--technical__actions'); const tabPredefined3 = document.querySelector('#contact-form .contact-product-info .info-wrapper'); const tabPredefined4 = document.querySelector('.product-info-main .left-page-container .product-info-stock-sku'); if (!productInfoMain) return; // Analizza disponibilità servizi const availability = checkServicesAvailability(); // Estrai dati prodotto const productData = extractProductData(); if (!productData) { console.warn('Blocco Veicolo: dati prodotto non completi'); return; } // Fix prezzo fixPriceDisplay(productData.sku); // Fix FAQ fixFAQLinks(); // Genera labels e URLs const labels = generateLabels(productData, availability); const urls = generateShopUrls(productData); // Genera HTML bottoni const buttonHTML = generateButtonHTML(availability); // Inserisci bottoni nel DOM insertButtons(buttonHTML, tabPredefined, tabPredefined2, tabPredefined3, tabPredefined4); // Inizializza modal initModal(availability, labels, productData, urls, urlSearchParams); // Push eventi Analytics pushAnalyticsEvents(availability); } /** * Verifica disponibilità servizi (Prenotazione/Acquisto) */ function checkServicesAvailability() { const containers = document.querySelectorAll('.services-carousel'); let checkPrenotabile = 0; let checkAcquistabile = 0; containers.forEach(container => { const elements = container.querySelectorAll('.text'); elements.forEach(element => { if (element.textContent.includes('Prenotazione')) { checkPrenotabile++; } if (element.textContent.includes('Acquisto')) { checkAcquistabile++; } }); }); return { checkPrenotabile, checkAcquistabile }; } /** * Estrae dati prodotto dal DOM */ function extractProductData() { try { const getTextContent = (selector) => { const el = document.querySelector(selector); return el ? el.innerHTML.trim() : ''; }; const immagine = getTextContent('.product-info .image-placeholder'); const sku = getTextContent('.product-info-stock-sku .product.attribute.sku .value'); const marchio = getTextContent('.product-info-stock-sku .product.attribute.brand .value'); const modello = getTextContent('.product-info-stock-sku .product.attribute.modello .value'); const condizione = getTextContent('.product.attribute.tipo .value'); const versione = getTextContent('.page-title-wrapper.product h1.page-title span'); const prezzo = getTextContent('.catalog-product-view .tabs .tab-header .product-info .product-price-info'); const tipo_veicolo = getTextContent('.breadcrumbs .item:first-child a'); // Sede veicolo let sede = false; const elementSede = document.querySelector('.contactus-car-location-city'); if (elementSede) { sede = elementSede.innerHTML.trim(); } else { const sedeVeicolo = document.querySelector('.sede_veicolo'); if (sedeVeicolo) { sedeVeicolo.classList.add('pagebuilder-hidden'); } } return { immagine, sku, marchio, modello, condizione, versione, prezzo, sede, tipo_veicolo }; } catch (error) { console.error('Errore estrazione dati prodotto:', error); return null; } } /** * Fix visualizzazione prezzi */ function fixPriceDisplay(sku) { const accordionTitleElement = document.querySelector('.product-info-main .left-page-container .accordion-title.main-title span'); const accordionOriginalPrice = document.querySelector('.product-info-main .left-page-container .special-price .original-price'); if (!accordionTitleElement || !accordionOriginalPrice) return; const isPrezzoAutotorino = accordionTitleElement.textContent.includes('PREZZO AUTOTORINO:'); const isUsato = sku[0] === 'U'; if (isPrezzoAutotorino) { if (!isUsato) { // Rimuovi elementi per N/Z const removeEl1 = document.querySelector('.product-info-main .left-page-container .special-price .original-price'); const removeEl2 = document.querySelector('.product-info-main .left-page-container .special-price .discount'); if (removeEl1) removeEl1.remove(); if (removeEl2) removeEl2.remove(); } else { // Cambia label per U if (accordionOriginalPrice.textContent.includes('Prezzo di vendita: ')) { const specialPriceElement = document.querySelector('.product-info-main .left-page-container .special-price .original-price span'); if (specialPriceElement) { accordionOriginalPrice.innerHTML = "Prezzo precedente: " + specialPriceElement.innerHTML + ""; } } } } else { if (!isUsato) { // Cambia label per N/Z if (accordionOriginalPrice.textContent.includes('Prezzo di vendita: ')) { const specialPriceElement = document.querySelector('.product-info-main .left-page-container .special-price .original-price span'); if (specialPriceElement) { accordionOriginalPrice.innerHTML = "Prezzo di listino: " + specialPriceElement.innerHTML + ""; } } } } } /** * Fix link FAQ */ function fixFAQLinks() { if (typeof jQuery === 'undefined') return; jQuery(document).ready(function($) { $('.price-validity-condition .moretext').each(function() { var text = $(this).html(); var newText = text.replace( /https:\/\/www\.autotorino\.it\/faq\/categoria\/acquista-online/g, 'FAQ Acquista online.' ); $(this).html(newText); }); }); } /** * Genera labels dinamiche */ function generateLabels(productData, availability) { const { marchio, modello, condizione, versione, sede, tipo_veicolo, sku } = productData; const { checkPrenotabile, checkAcquistabile } = availability; const condizioneMap = { 'Usato': 'Usati', 'Nuovo': 'Nuovi', 'KM 0': 'Km 0', 'Aziendale': 'Aziendali' }; const tipoVeicoloIntro1Map = { 'Auto': "l'auto giusta", 'Moto': "la moto giusta", 'Veicoli commerciali': "il veicolo commerciale giusto" }; const tipoVeicoloIntro2Map = { 'Auto': "l'auto", 'Moto': "la moto", 'Veicoli commerciali': "il veicolo commerciale" }; const tipoVeicoloSedeMap = { 'Auto': "L'auto", 'Moto': "La moto", 'Veicoli commerciali': "Il veicolo" }; return { veicolo: marchio + " " + modello, condizione: condizioneMap[condizione] || "", tipo_veicolo_intro1: tipoVeicoloIntro1Map[tipo_veicolo] || "", tipo_veicolo_intro2: tipoVeicoloIntro2Map[tipo_veicolo] || "", tipo_veicolo_sede: tipoVeicoloSedeMap[tipo_veicolo] || "", sede: sede ? "nella sede di " + sede + "" : "", ritiro: (sku[0] === 'U') ? "ritiro in ogni sede" : "", versione: versione ? versione.replace(new RegExp('^' + modello), '') : '' }; } /** * Genera URLs shop */ function generateShopUrls(productData) { const { sku, marchio, modello, condizione } = productData; return { prenota: "https://prenotazioni.autotorino.it/GestioneOrdini/Prenotazione/" + sku, acquista: "https://prenotazioni.autotorino.it/GestioneOrdini/Acquisto/" + sku }; } /** * Genera HTML bottoni basato su disponibilità */ function generateButtonHTML(availability) { const { checkPrenotabile, checkAcquistabile } = availability; let html = { main: '', scroll: '', contact: '', mobile: '' }; const iconImg = 'icona-prenota'; // Solo Prenota if (checkPrenotabile > 0 && checkAcquistabile === 0) { html.main = `
`; html.scroll = ``; html.contact = `
`; html.mobile = generateMobileHTML('PRENOTA PER 48 ORE', iconImg); } // Solo Acquista if (checkPrenotabile === 0 && checkAcquistabile > 0) { html.main = `
`; html.scroll = ``; html.contact = `
`; html.mobile = generateMobileHTML('ACQUISTA ONLINE', iconImg); } // Entrambi if (checkPrenotabile > 0 && checkAcquistabile > 0) { html.main = `
`; html.scroll = ``; html.contact = `
`; html.mobile = generateMobileHTML('ACQUISTA O PRENOTA', iconImg); } return html; } /** * Helper per HTML mobile */ function generateMobileHTML(label, iconImg) { return `
RICHIEDI INFORMAZIONI
`; } /** * Inserisce bottoni nel DOM */ function insertButtons(html, tab1, tab2, tab3, tab4) { if (tab1 && html.main) tab1.insertAdjacentHTML('afterbegin', html.main); if (tab2 && html.scroll) tab2.insertAdjacentHTML('afterbegin', html.scroll); if (tab3 && html.contact) tab3.insertAdjacentHTML('beforeend', html.contact); if (tab4 && html.mobile) tab4.insertAdjacentHTML('afterend', html.mobile); // Fix label mobile const requestInfoSpan = document.querySelector('.row--technical__actions .request-info span:last-child'); const requestInfo = document.querySelector('.row--technical__actions .request-info'); if (requestInfoSpan && requestInfo) { requestInfoSpan.classList.add('pagebuilder-mobile-hidden'); requestInfo.insertAdjacentHTML('beforeend', "CHIEDI INFO"); } } /** * Inizializza modal con require.js */ function initModal(availability, labels, productData, urls, urlSearchParams) { if (typeof require === 'undefined') { console.error('Blocco Veicolo: require.js non disponibile'); return; } const { checkPrenotabile, checkAcquistabile } = availability; const { marchio, modello, condizione, versione, prezzo, immagine, sede } = productData; let modalTitle = "Acquista o Prenota"; if (checkPrenotabile > 0 && checkAcquistabile === 0) modalTitle = "Prenota per 48 ore"; if (checkPrenotabile === 0 && checkAcquistabile > 0) modalTitle = "Acquista online"; require(['jquery', 'Magento_Ui/js/modal/modal'], function($, modal) { var options = { type: 'popup', responsive: true, title: modalTitle, modalClass: 'modal-blocco', buttons: [] }; var blocco = modal(options, $('#blocca-offerta')); // Event handlers $(".action-blocco").on('click', function(e) { e.preventDefault(); $("#blocca-offerta").modal("openModal"); $('.modal-popup.modal-blocco').removeClass('modal-slide').addClass('_inner-scroll'); }); $('.action-abbandona').on('click', function() { $("#blocca-offerta").modal("closeModal"); }); // Tab prenota mobile $('.tabs-prenota .btn.cta.request-info').click(function(e) { e.preventDefault(); $('.row.row--technical .btn.cta.request-info').click(); $('.contact-selector--by.contact-selector--by__email.tab-1').click(); }); $('.tabs-prenota .btn.action-blocco').click(function(e) { e.preventDefault(); $('.row.row--technical .btn.action-blocco').click(); }); // Imposta URLs $('.gotoshop .prenota .link').attr({ 'href': urls.prenota, 'target': '_blank', 'title': "Prenota per 48 ore " + marchio + " " + modello + " " + condizione }); $('.gotoshop .acquista .link').attr({ 'href': urls.acquista, 'target': '_blank', 'title': "Acquista " + marchio + " " + modello + " " + condizione }); // Analytics $('.gotoshop .acquista .link').on('click', function() { if (window.dataLayer) { dataLayer.push({ event: 'inizio_flusso', event_category: 'vendita' }); } }); $('.gotoshop .prenota .link').on('click', function() { if (window.dataLayer) { dataLayer.push({ event: 'inizio_flusso', event_category: 'prenotazione' }); } }); // Popola labels modal $('.pl_marchio').text(marchio); $('.pl_condizione').text(condizione); $('.pl_sede').text(sede || ''); $('.pl_veicolo').text(labels.veicolo); $('.pl_versione').html(versione); $('.pl_prezzo').html(prezzo); $('.pl_image').html(immagine); $('.pl_tipo_veicolo_intro1').text(labels.tipo_veicolo_intro1); $('.pl_tipo_veicolo_intro2').text(labels.tipo_veicolo_intro2); $('.pl_tipo_veicolo_sede').text(labels.tipo_veicolo_sede); if (labels.ritiro) { $('.pl_ritiro').append('
  • ' + labels.ritiro + '
  • '); } if (!sede) { $('.blocco-comefunziona .sede_veicolo').hide(); } // Gestione tab setupTabs(checkPrenotabile, checkAcquistabile); // Auto-open modal se parametro presente if (urlSearchParams.has('modal') && urlSearchParams.get('modal') === 'blocco' && checkPrenotabile > 0) { window.addEventListener("load", function() { $("#blocca-offerta").modal("openModal"); $('.modal-popup.modal-blocco').removeClass('modal-slide').addClass('_inner-scroll'); }); } }); } /** * Setup tabs acquista/prenota */ function setupTabs(checkPrenotabile, checkAcquistabile) { if (typeof jQuery === 'undefined') return; jQuery(document).ready(function($) { // Click handler tabs $('.bl-tab-button').on('click', function() { const tabId = $(this).data('tab'); $('.bl-tab-button').removeClass('active'); $('.bl-tab-pane').removeClass('active'); $('.gotoshop .trigger').removeClass('active'); $('.blocco-comefunziona.supporto td h5').removeClass('active'); $(this).addClass('active'); $('#' + tabId).addClass('active'); $('.gotoshop .trigger.' + tabId).addClass('active'); $('.blocco-comefunziona.supporto td.faqLabel h5[data-tab="' + tabId + '"]').addClass('active'); }); // Fix tab visibility if (checkPrenotabile > 0 && checkAcquistabile === 0) { // Solo prenota $('#blocca-offerta .bl-tab-button[data-tab="tb-acquista"]').remove(); $('#blocca-offerta .bl-tab-button[data-tab="tb-prenota"]').addClass('active'); $('#blocca-offerta .trigger.acquista').remove(); $('#blocca-offerta .trigger.prenota').addClass('active'); $('#blocca-offerta .bl-tab-pane[id="tb-acquista"]').remove(); $('#blocca-offerta .bl-tab-pane[id="tb-prenota"]').addClass('active'); $('#blocca-offerta .faqLabel h5[data-tab="tb-acquista"]').remove(); $('#blocca-offerta .faqLabel h5[data-tab="tb-prenota"]').addClass('active'); } if (checkPrenotabile === 0 && checkAcquistabile > 0) { // Solo acquista $('#blocca-offerta .bl-tab-button[data-tab="tb-prenota"]').remove(); $('#blocca-offerta .bl-tab-button[data-tab="tb-acquista"]').addClass('active'); $('#blocca-offerta .trigger.prenota').remove(); $('#blocca-offerta .trigger.acquista').addClass('active'); $('#blocca-offerta .bl-tab-pane[id="tb-prenota"]').remove(); $('#blocca-offerta .bl-tab-pane[id="tb-acquista"]').addClass('active'); $('#blocca-offerta .faqLabel h5[data-tab="tb-prenota"]').remove(); $('#blocca-offerta .faqLabel h5[data-tab="tb-acquista"]').addClass('active'); } }); } /** * Push eventi analytics */ function pushAnalyticsEvents(availability) { if (!window.dataLayer) return; const { checkPrenotabile, checkAcquistabile } = availability; if (checkPrenotabile > 0 && checkAcquistabile === 0) { dataLayer.push({ event: 'prenotazione_disponibile' }); } else if (checkPrenotabile === 0 && checkAcquistabile > 0) { dataLayer.push({ event: 'acquisto_disponibile' }); } else if (checkPrenotabile > 0 && checkAcquistabile > 0) { dataLayer.push({ event: 'prenotazione_acquisto_disponibili' }); } } // ======================================== // INIZIALIZZAZIONE // ======================================== /** * Avvia quando il DOM è pronto */ if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initBloccoVeicolo); } else { initBloccoVeicolo(); } })();