{"id":36,"date":"2025-06-04T06:46:19","date_gmt":"2025-06-04T06:46:19","guid":{"rendered":"https:\/\/caralliancerentals.com\/?page_id=36"},"modified":"2025-07-23T07:56:55","modified_gmt":"2025-07-23T07:56:55","slug":"additional-services","status":"publish","type":"page","link":"https:\/\/caralliancerentals.com\/it\/additional-services\/","title":{"rendered":"Servizi Addizionali"},"content":{"rendered":"        <div class=\"caralliance-services-selection-page\">\n            <!-- Enhanced Page Header -->\n            <div class=\"services-page-header\">\n                <div class=\"page-header-content\">\n                    <h2 class=\"page-title\">Seleziona Servizi Aggiuntivi<\/h2>\n                    <p class=\"page-subtitle\">Personalizza la tua esperienza di noleggio con i nostri servizi aggiuntivi<\/p>\n                <\/div>\n                <div class=\"progress-indicator\">\n                    <div class=\"progress-steps\">\n                        <div class=\"step completed\">\n                            <span class=\"step-number\">1<\/span>\n                            <span class=\"step-label\">Ricerca<\/span>\n                        <\/div>\n                        <div class=\"step completed\">\n                            <span class=\"step-number\">2<\/span>\n                            <span class=\"step-label\">Auto<\/span>\n                        <\/div>\n                        <div class=\"step active\">\n                            <span class=\"step-number\">3<\/span>\n                            <span class=\"step-label\">Servizi<\/span>\n                        <\/div>\n                        <div class=\"step\">\n                            <span class=\"step-number\">4<\/span>\n                            <span class=\"step-label\">Checkout<\/span>\n                        <\/div>\n                    <\/div>\n                <\/div>\n            <\/div>\n            \n            <!-- Enhanced Car Selection Summary -->\n                        <div id=\"car-selection-summary\" class=\"enhanced-car-summary-section\">\n                <div class=\"car-summary-header\">\n                    <h4>Auto Selezionata<\/h4>\n                    <button type=\"button\" class=\"btn-change-car\" id=\"change-car-btn\">\n                        Cambia Auto                    <\/button>\n                <\/div>\n                <div id=\"selected-car-display\" class=\"enhanced-car-display\">\n                    <div class=\"loading\">Loading selected car details...<\/div>\n                <\/div>\n            <\/div>\n                        \n            <!-- Services Selection Form -->\n            <form id=\"caralliance-services-form\" method=\"post\">\n                <input type=\"hidden\" id=\"caralliance_services_nonce\" name=\"caralliance_services_nonce\" value=\"5e3562db50\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/it\/wp-json\/wp\/v2\/pages\/36\" \/>                \n                <!-- Included Services -->\n                <div class=\"services-section included-section\">\n                    <div id=\"included-services\" class=\"service-options\">\n                        <div class=\"loading\">Loading included services...<\/div>\n                    <\/div>\n                <\/div>\n                \n                <!-- Insurance Selection -->\n                <div class=\"services-section insurance-section\">\n                    <h4>Opzioni Assicurative<\/h4>\n                    <div id=\"insurance-options\" class=\"service-options\">\n                        <div class=\"loading\">Caricamento opzioni assicurative...<\/div>\n                    <\/div>\n                <\/div>\n                \n                <!-- Additional Services -->\n                <div class=\"services-section extras-section\">\n                    <h4>Servizi Aggiuntivi e Attrezzature<\/h4>\n                    <div id=\"additional-services\" class=\"service-options\">\n                        <div class=\"loading\">Caricamento servizi aggiuntivi...<\/div>\n                    <\/div>\n                <\/div>\n                \n                <!-- Price Summary -->\n                <div class=\"price-summary-section\">\n                    <h4>Riepilogo Prenotazione<\/h4>\n                    <div id=\"price-breakdown\" class=\"price-breakdown\">\n                        <div class=\"loading\">Calculating prices...<\/div>\n                    <\/div>\n                <\/div>\n                \n                <!-- Action Buttons -->\n                <div class=\"services-actions\">\n                    <button type=\"button\" id=\"back-to-search\" class=\"btn btn-secondary\">\n                        \u2190 Torna alla Ricerca                    <\/button>\n                    <button type=\"button\" id=\"go-to-cart-services\" class=\"btn btn-secondary\">\n                        Vai al CARRELLO                    <\/button>\n                    <button type=\"submit\" id=\"proceed-to-checkout\" class=\"btn btn-primary\">\n                        Procedi al Checkout \u2192                    <\/button>\n                <\/div>\n            <\/form>\n        <\/div>\n        \n        <script type=\"text\/javascript\">\n        jQuery(document).ready(function($) {\n            console.log('CarAlliance: Services selection page initializing...');\n            \n            \/\/ Load booking data from localStorage\n            var bookingData = localStorage.getItem('caralliance_booking_data');\n            \n            if (!bookingData) {\n                console.error('No booking data found in localStorage');\n                window.caralliance.showAlert(caralliance_i18n.no_booking_data_found, 'error');\n                window.location.href = '\/'; \/\/ Redirect to home\n                return;\n            }\n            \n            try {\n                bookingData = JSON.parse(bookingData);\n                console.log('Loaded booking data:', bookingData);\n                \n                \/\/ DEBUG: Show the exact selectedCar object and its properties\n                var selectedCar = bookingData.selected_car;\n                console.log('FULL selectedCar object:', selectedCar);\n                console.log('selectedCar.DaysForPayment type:', typeof selectedCar.DaysForPayment);\n                console.log('selectedCar.DaysForPayment value:', selectedCar.DaysForPayment);\n                console.log('selectedCar.DaysForPayment raw:', JSON.stringify(selectedCar.DaysForPayment));\n                \n                \/\/ Check if DaysForPayment exists in the object\n                console.log('DaysForPayment in selectedCar:', 'DaysForPayment' in selectedCar);\n                console.log('All selectedCar keys:', Object.keys(selectedCar));\n                \n                \/\/ Force recalculation and clear any old pricing data\n                var totalPrice = parseFloat(selectedCar.Amount || 0);\n                var daysForPayment = parseInt(selectedCar.DaysForPayment || 1);\n                var dailyRate = daysForPayment > 0 ? (totalPrice \/ daysForPayment) : totalPrice;\n                var carTotalPrice = totalPrice;\n                \n                console.log('PRICING DEBUG - Services Page BEFORE fix:', {\n                    dailyRate: dailyRate,\n                    daysForPayment: daysForPayment, \n                    carTotalPrice: carTotalPrice,\n                    oldPricing: bookingData.pricing\n                });\n                \n                \/\/ If DaysForPayment is missing or wrong, try to get it from pricing object\n                if (!selectedCar.DaysForPayment || selectedCar.DaysForPayment == 1) {\n                    console.log('DaysForPayment missing or incorrect, checking pricing object...');\n                    if (bookingData.pricing && bookingData.pricing.days_for_payment && bookingData.pricing.days_for_payment > 1) {\n                        daysForPayment = parseInt(bookingData.pricing.days_for_payment);\n                        dailyRate = daysForPayment > 0 ? (totalPrice \/ daysForPayment) : totalPrice;\n                        carTotalPrice = totalPrice;\n                        console.log('Using DaysForPayment from pricing:', daysForPayment);\n                    }\n                }\n                \n                console.log('PRICING DEBUG - Services Page AFTER fix:', {\n                    dailyRate: dailyRate,\n                    daysForPayment: daysForPayment, \n                    carTotalPrice: carTotalPrice\n                });\n                \n                \/\/ Force initialize pricing object with correct calculations\n                bookingData.pricing = {\n                    car_price: carTotalPrice,\n                    daily_rate: dailyRate,\n                    days_for_payment: daysForPayment,\n                    services_price: 0,\n                    total_price: carTotalPrice,\n                    currency: selectedCar.Currency || 'EUR'\n                };\n                \n                \/\/ Force save updated booking data\n                localStorage.setItem('caralliance_booking_data', JSON.stringify(bookingData));\n                \n                console.log('FORCED UPDATE - New pricing data:', bookingData.pricing);\n                \n                \/\/ Display selected car information\n                displaySelectedCarSummary(bookingData.selected_car, bookingData.search_params);\n                \n                \/\/ Load available services\n                loadAvailableServices();\n                \n                \/\/ Force update pricing display\n                updatePricingDisplay(bookingData);\n                \n            } catch (e) {\n                console.error('Error parsing booking data:', e);\n                window.caralliance.showAlert(caralliance_i18n.booking_data_error, 'error');\n                window.location.href = '\/';\n                return;\n            }\n            \n            \/**\n             * Display selected car summary\n             *\/\n            function displaySelectedCarSummary(car, searchParams) {\n                console.log('Displaying car summary:', car);\n                \n                \/\/ Get car image from the localStorage car data\n                var carImage = car.CarModelImageURL || car.imageUrl || car.image_url || car.image || null;\n                console.log('Car image URL:', carImage);\n                \n                var html = '<div class=\"enhanced-selected-car-summary\">';\n                \n                \/\/ Car image and basic info section\n                html += '<div class=\"car-main-info\">';\n                html += '<div class=\"car-image-container\">';\n                if (carImage) {\n                    html += '<img decoding=\"async\" src=\"' + carImage + '\" alt=\"' + (car.ModelName || caralliance_i18n.selected_car_default) + '\" class=\"car-image\">';\n                } else {\n                    html += '<div class=\"car-image-placeholder\">';\n                    html += '<i class=\"fa fa-car fa-3x\"><\/i>';\n                    html += '<\/div>';\n                }\n                html += '<\/div>';\n                \n                html += '<div class=\"car-details\">';\n                html += '<div class=\"car-title-section\">';\n                html += '<h5 class=\"car-model\">' + (car.ModelName || caralliance_i18n.selected_car_default) + '<\/h5>';\n                html += '<span class=\"car-category\">' + (car.CarCategory || '') + '<\/span>';\n                html += '<\/div>';\n                \n                html += '<div class=\"car-features\">';\n                if (car.PassengerCapacity) {\n                    html += '<div class=\"feature-item\"><i class=\"fa fa-users\"><\/i> ' + car.PassengerCapacity + ' ' + caralliance_i18n.passengers + '<\/div>';\n                }\n                if (car.NumberOfDoors) {\n                    html += '<div class=\"feature-item\"><i class=\"fa fa-door-open\"><\/i> ' + car.NumberOfDoors + ' ' + caralliance_i18n.doors + '<\/div>';\n                }\n                if (car.BigBagsCapacity) {\n                    html += '<div class=\"feature-item\"><i class=\"fa fa-suitcase\"><\/i> ' + car.BigBagsCapacity + ' ' + caralliance_i18n.bags + '<\/div>';\n                }\n                html += '<\/div>';\n                html += '<\/div>';\n                \n                \/\/ Calculate total price: daily rate \u00d7 number of days\n                var totalPrice = parseFloat(car.Amount || 0);\n                var daysForPayment = parseInt(car.DaysForPayment || 1);\n                var dailyRate = daysForPayment > 0 ? (totalPrice \/ daysForPayment) : totalPrice;\n                \n                html += '<div class=\"car-pricing-summary\">';\n                html += '<div class=\"price-section\">';\n                html += '<div class=\"daily-rate\">';\n                html += '<span class=\"rate-amount\">' + dailyRate.toFixed(2) + ' ' + (car.Currency || 'EUR') + '<\/span>';\n                html += '<span class=\"rate-period\">' + caralliance_i18n.per_day + '<\/span>';\n                html += '<\/div>';\n                if (daysForPayment > 1) {\n                    html += '<div class=\"total-pricing\">';\n                    html += '<span class=\"duration\">' + daysForPayment + ' ' + caralliance_i18n.days + '<\/span>';\n                    html += '<span class=\"total-amount\">' + totalPrice.toFixed(2) + ' ' + (car.Currency || 'EUR') + '<\/span>';\n                    html += '<\/div>';\n                }\n                html += '<div class=\"tax-note\">' + caralliance_i18n.vat_included + '<\/div>';\n                html += '<\/div>';\n                html += '<\/div>';\n                html += '<\/div>';\n                \n                \/\/ Rental period information\n                html += '<div class=\"rental-info-section\">';\n                html += '<div class=\"rental-period-grid\">';\n                html += '<div class=\"period-item\">';\n                html += '<div class=\"period-label\">' + caralliance_i18n.pickup + '<\/div>';\n                html += '<div class=\"period-details\">';\n                html += '<div class=\"period-datetime\">' + searchParams.pickup_date + ' ' + caralliance_i18n.at + ' ' + searchParams.pickup_time + '<\/div>';\n                html += '<div class=\"period-location\">' + searchParams.pickup_location_name + '<\/div>';\n                html += '<\/div>';\n                html += '<\/div>';\n                html += '<div class=\"period-item\">';\n                html += '<div class=\"period-label\">' + caralliance_i18n.dropoff + '<\/div>';\n                html += '<div class=\"period-details\">';\n                html += '<div class=\"period-datetime\">' + searchParams.dropoff_date + ' ' + caralliance_i18n.at + ' ' + searchParams.dropoff_time + '<\/div>';\n                html += '<div class=\"period-location\">' + searchParams.dropoff_location_name + '<\/div>';\n                html += '<\/div>';\n                html += '<\/div>';\n                html += '<\/div>';\n                html += '<\/div>';\n                \n                $('#selected-car-display').html(html);\n            }\n            \n            \/**\n             * Load available services from localStorage car data\n             *\/\n            function loadAvailableServices() {\n                console.log('Loading services from selected car data...');\n                \n                var bookingData = JSON.parse(localStorage.getItem('caralliance_booking_data') || '{}');\n                \n                if (!bookingData.selected_car) {\n                    console.error('No selected car data found');\n                    $('#insurance-options').html('<div class=\"error\">' + caralliance_i18n.car_data_not_found + '<\/div>');\n                    $('#additional-services').html('<div class=\"error\">' + caralliance_i18n.car_data_not_found + '<\/div>');\n                    return;\n                }\n                \n                var selectedCar = bookingData.selected_car;\n                console.log('Selected car services:', {\n                    included: selectedCar.IncludedServices,\n                    available: selectedCar.AvailableServices\n                });\n                \n                \/\/ Check if car has services data\n                if (!selectedCar.AvailableServices && !selectedCar.IncludedServices) {\n                    console.warn('No services data found for selected car, falling back to API call');\n                    loadAvailableServicesFromAPI();\n                    return;\n                }\n                \n                \/\/ Process and display the car-specific services\n                var servicesData = {\n                    Insurance: [],\n                    Extra: [],\n                    Service: [],\n                    Included: selectedCar.IncludedServices || []\n                };\n                \n                \/\/ Process available services\n                if (selectedCar.AvailableServices && Array.isArray(selectedCar.AvailableServices)) {\n                    selectedCar.AvailableServices.forEach(function(service) {\n                        var serviceType = service.Type || service.type || 'Service';\n                        var serviceName = (service.Name || service.name || service.title || '').toLowerCase();\n                        var serviceDescription = (service.Description || service.description || '').toLowerCase();\n                        var serviceCode = (service.Code || service.code || service.id || '').toLowerCase();\n                        \n                        \/\/ Properly handle MaximumQuantity - preserve null values for unlimited quantities\n                        var maxQuantity = null;\n                        if (service.MaximumQuantity !== null && service.MaximumQuantity !== undefined) {\n                            maxQuantity = service.MaximumQuantity;\n                        } else if (service.maximumQuantity !== null && service.maximumQuantity !== undefined) {\n                            maxQuantity = service.maximumQuantity;\n                        }\n                        \/\/ If both are null\/undefined, leave maxQuantity as null (unlimited)\n                        \n                        var processedService = {\n                            code: service.Code || service.code || service.id,\n                            name: service.Name || service.name || service.title,\n                            additionalName: service.AdditionalName || service.additionalName || '',\n                            additionalCode: service.AdditionalCode || service.additionalCode || '',\n                            description: service.Description || service.description || '',\n                            price: service.Price || service.price || service.Amount || 0,\n                            currency: service.Currency || service.currency || 'EUR',\n                            type: serviceType,\n                            mandatory: service.Mandatory || service.mandatory || false,\n                            MaximumQuantity: maxQuantity\n                        };\n\n                        \/\/ AUTO-DETECT AdditionalCode for age-based and additional driver services\n                        if (!processedService.additionalCode) {\n                            \/\/ Detect Young Driver Fee (YDF) services\n                            if (serviceName.includes('young driver') ||\n                                serviceName.includes('young') ||\n                                serviceName.includes('ydf') ||\n                                serviceName.includes('conducente giovane') ||\n                                serviceName.includes('guidatore giovane') ||\n                                serviceDescription.includes('young driver') ||\n                                serviceDescription.includes('under') ||\n                                serviceCode.includes('ydf') ||\n                                serviceCode.includes('young')) {\n                                \n                                processedService.additionalCode = 'YDF';\n                                console.log('Auto-detected YDF service:', processedService.name);\n                            }\n                            \/\/ Detect Senior\/Older Driver Fee (ODF) services  \n                            else if (serviceName.includes('senior driver') ||\n                                    serviceName.includes('senior') ||\n                                    serviceName.includes('older driver') ||\n                                    serviceName.includes('old driver') ||\n                                    serviceName.includes('odf') ||\n                                    serviceName.includes('conducente anziano') ||\n                                    serviceName.includes('guidatore anziano') ||\n                                    serviceName.includes('conducente senior') ||\n                                    serviceDescription.includes('senior driver') ||\n                                    serviceDescription.includes('older driver') ||\n                                    serviceDescription.includes('over') ||\n                                    serviceCode.includes('odf') ||\n                                    serviceCode.includes('senior') ||\n                                    serviceCode.includes('old')) {\n                                    \n                                processedService.additionalCode = 'ODF';\n                                console.log('Auto-detected ODF service:', processedService.name);\n                            }\n                            \/\/ Detect Additional Driver services (general)\n                            else if (serviceName.includes('additional driver') ||\n                                    serviceName.includes('extra driver') ||\n                                    serviceName.includes('second driver') ||\n                                    serviceName.includes('additional') ||\n                                    serviceName.includes('conducente aggiuntivo') ||\n                                    serviceName.includes('guidatore aggiuntivo') ||\n                                    serviceName.includes('conducente extra') ||\n                                    serviceDescription.includes('additional driver') ||\n                                    serviceDescription.includes('extra driver') ||\n                                    serviceCode.includes('additional_driver') ||\n                                    serviceCode.includes('extra_driver') ||\n                                    serviceCode.includes('second_driver')) {\n                                    \n                                processedService.additionalCode = 'ADDITIONAL_DRIVER';\n                                console.log('Auto-detected Additional Driver service:', processedService.name);\n                            }\n                        }\n                        \n                        \/\/ Categorize services\n                        if (serviceType.toLowerCase().includes('insurance') || serviceType.toLowerCase().includes('assicurazione')) {\n                            servicesData.Insurance.push(processedService);\n                        } else if (serviceType.toLowerCase().includes('extra')) {\n                            servicesData.Extra.push(processedService);\n                        } else {\n                            servicesData.Service.push(processedService);\n                        }\n                    });\n                }\n                \n                console.log('Processed services data:', servicesData);\n                displayServices(servicesData);\n            }\n            \n            \/**\n             * Fallback: Load available services from API (legacy method)\n             *\/\n            function loadAvailableServicesFromAPI() {\n                console.log('Loading available services from API (fallback)...');\n                \n                $('#insurance-options').html('<div class=\"loading\">' + caralliance_i18n.loading_insurance + '<\/div>');\n                $('#additional-services').html('<div class=\"loading\">' + caralliance_i18n.loading_additional_services + '<\/div>');\n                \n                $.ajax({\n                    url: caralliance_ajax.ajax_url,\n                    type: 'POST',\n                    data: {\n                        action: 'caralliance_get_services',\n                        nonce: caralliance_ajax.nonce\n                    },\n                    success: function(response) {\n                        console.log('Services loaded from API:', response);\n                        \n                        if (response.success) {\n                            displayServices(response.data);\n                        } else {\n                            $('#insurance-options').html('<div class=\"error\">' + caralliance_i18n.error_loading_insurance + '<\/div>');\n                            $('#additional-services').html('<div class=\"error\">' + caralliance_i18n.error_loading_services + '<\/div>');\n                        }\n                    },\n                    error: function() {\n                        $('#insurance-options').html('<div class=\"error\">' + caralliance_i18n.connection_error + '<\/div>');\n                        $('#additional-services').html('<div class=\"error\">' + caralliance_i18n.connection_error + '<\/div>');\n                    }\n                });\n            }\n            \n            \/**\n             * Display services in the interface\n             *\/\n            function displayServices(services) {\n                \/\/ Display included services\n                if (services.Included && services.Included.length > 0) {\n                    \/\/ Add header to the included section (same level as other sections)\n                    var $includedSection = $('#included-services').closest('.services-section');\n                    $includedSection.prepend('<h4>' + caralliance_i18n.addon_included_services + '<\/h4>');\n                    \n                    \/\/ Add content to the included services div\n                    var includedHtml = '<div class=\"included-services-list\">';\n                    services.Included.forEach(function(service) {\n                        console.log('Processing included service:', service);\n                        var serviceName = service.Name || service.name || service.title || service.code || caralliance_i18n.included_service_default;\n                        var serviceDesc = service.Description || service.description || '';\n                        \n                        \/\/ Override descriptions for specific service codes\n                        var serviceCode = service.Code || service.code || service.ServiceCode || '';\n                        var additionalCode = service.AdditionalCode || service.additionalCode || '';\n                        console.log('Service code for \"' + serviceName + '\":', serviceCode, 'AdditionalCode:', additionalCode);\n                        \n                        if (additionalCode === 'OHND' || additionalCode === 'OHN') {\n                            serviceName = 'Out Of Hours - Night';\n                        } else if (additionalCode === 'OHD' || additionalCode === 'OHDD') {\n                            serviceName = 'Out Of Hours - Day';\n                        }\n                        \n                        var amountTotal = (typeof service.AmountTotal !== 'undefined') ? parseFloat(service.AmountTotal) : null;\n                        var currency = service.Currency || service.currency || 'EUR';\n                        includedHtml += '<div class=\"included-service-item\">';\n                        includedHtml += '<span class=\"included-icon\">\u2705<\/span>';\n                        includedHtml += '<div class=\"included-service-info\">';\n                        includedHtml += '<div class=\"included-service-name\">' + serviceName;\n                        if (amountTotal !== null && !isNaN(amountTotal)) {\n                            includedHtml += ' (&euro; ' + amountTotal.toFixed(2) + ')';\n                        }\n                        includedHtml += '<\/div>';\n                        if (serviceDesc) {\n                            includedHtml += '<div class=\"included-service-desc\">' + serviceDesc + '<\/div>';\n                        }\n                        includedHtml += '<\/div>';\n                        includedHtml += '<\/div>';\n                    });\n                    includedHtml += '<\/div>';\n                    $('#included-services').html(includedHtml);\n                } else {\n                    \/\/ Add header to the included section (same level as other sections)\n                    var $includedSection = $('#included-services').closest('.services-section');\n                    $includedSection.prepend('<h4>' + caralliance_i18n.addon_included_services + '<\/h4>');\n                    \n                    \/\/ Add default message\n                    $('#included-services').html('<p>' + caralliance_i18n.services_base_included + '<\/p>');\n                }\n                \n                \/\/ Display insurance options\n                if (services.Insurance && services.Insurance.length > 0) {\n                    var insuranceHtml = '';\n                    services.Insurance.forEach(function(service) {\n                        insuranceHtml += createServiceOption(service, 'insurance');\n                    });\n                    $('#insurance-options').html('<div class=\"services-grid\">' + insuranceHtml + '<\/div>');\n                } else {\n                    $('#insurance-options').html('<p>' + caralliance_i18n.no_insurance_available + '<\/p>');\n                }\n                \n                \/\/ Display additional services\n                var additionalHtml = '';\n                if (services.Extra && services.Extra.length > 0) {\n                    services.Extra.forEach(function(service) {\n                        additionalHtml += createServiceOption(service, 'extra');\n                    });\n                }\n                if (services.Service && services.Service.length > 0) {\n                    services.Service.forEach(function(service) {\n                        additionalHtml += createServiceOption(service, 'service');\n                    });\n                }\n                \n                if (additionalHtml) {\n                    $('#additional-services').html('<div class=\"services-grid\">' + additionalHtml + '<\/div>');\n                } else {\n                    $('#additional-services').html('<p>' + caralliance_i18n.no_services_available + '<\/p>');\n                }\n                \n                \/\/ Bind service selection events\n                bindServiceEvents();\n                \n                \/\/ Customize service names with age ranges\n                customizeAgeServiceNames(bookingData);\n                \n                \/\/ Pre-select services if returning from checkout\n                preselectServices(bookingData);\n            }\n            \n            \/**\n             * Pre-select services if returning from checkout\n             *\/\n            function preselectServices(bookingData) {\n                if (!bookingData.selected_services || !Array.isArray(bookingData.selected_services)) {\n                    console.log('No previously selected services found');\n                    return;\n                }\n                \n                console.log('Pre-selecting services:', bookingData.selected_services);\n                \n                \/\/ Wait a bit for services to be rendered\n                setTimeout(function() {\n                    bookingData.selected_services.forEach(function(selectedService) {\n                        var serviceCode = selectedService.code || selectedService;\n                        var additionalCode = selectedService.AdditionalCode || selectedService.additionalCode || '';\n                        var quantity = selectedService.quantity || 1;\n                        \n                        console.log('Loading previously selected service on checkout page:', {\n                            code: serviceCode,\n                            name: selectedService.name,\n                            additionalCode: additionalCode,\n                            quantity: quantity,\n                            fullServiceData: selectedService\n                        });\n                        \n                        \/\/ Build selector to match service more precisely\n                        var selector = 'input[name=\"selected_services[]\"][value=\"' + serviceCode + '\"]';\n                        if (additionalCode) {\n                            selector += '[data-additional-code=\"' + additionalCode + '\"]';\n                        }\n                        \n                        var $checkbox = $(selector);\n                        \n                        \/\/ If no exact match found and we have an additional code, try without it as fallback\n                        if ($checkbox.length === 0 && additionalCode) {\n                            $checkbox = $('input[name=\"selected_services[]\"][value=\"' + serviceCode + '\"]');\n                        }\n                        \n                        if ($checkbox.length > 0) {\n                            console.log('Pre-selecting service:', serviceCode, 'with additional code:', additionalCode, 'quantity:', quantity);\n                            \n                            \/\/ Check the checkbox\n                            $checkbox.prop('checked', true);\n                            \n                            \/\/ Update visual state\n                            var $card = $checkbox.closest('.service-card');\n                            $card.addClass('selected');\n                            \n                            \/\/ Set quantity\n                            var $quantityInput = $card.find('.quantity-input');\n                            if ($quantityInput.length > 0) {\n                                var maxQty = parseInt($quantityInput.attr('max')) || 1;\n                                var validQuantity = Math.min(Math.max(quantity, 1), maxQty);\n                                \n                                console.log('Restoring service quantity:', {\n                                    serviceCode: serviceCode,\n                                    storedQuantity: quantity,\n                                    validQuantity: validQuantity,\n                                    maxQty: maxQty\n                                });\n                                \n                                $quantityInput.val(validQuantity);\n                                updateServiceQuantityDisplay($card, validQuantity);\n                                \n                                \/\/ Show quantity section if quantity > 1\n                                if (validQuantity > 1) {\n                                    $card.find('.service-quantity-section').show();\n                                }\n                                \n                                \/\/ Update quantity button states\n                                var $decreaseBtn = $card.find('.quantity-decrease');\n                                var $increaseBtn = $card.find('.quantity-increase');\n                                $decreaseBtn.prop('disabled', validQuantity <= 1);\n                                $increaseBtn.prop('disabled', validQuantity >= maxQty);\n                                \n                                console.log('Quantity restoration completed for', serviceCode, 'final quantity:', $quantityInput.val());\n                            } else {\n                                console.warn('No quantity input found for service:', serviceCode);\n                            }\n                        } else {\n                            console.warn('Service not found for pre-selection:', serviceCode);\n                        }\n                    });\n                    \n                    \/\/ Update pricing after pre-selection\n                    updatePricingCalculation();\n                }, 500);\n            }\n            \n            \/**\n             * Customize age-related service names with age ranges\n             *\/\n            function customizeAgeServiceNames(bookingData) {\n                console.log('customizeAgeServiceNames called with:', bookingData);\n                \n                if (!bookingData || !bookingData.age_validation) {\n                    console.warn('No age validation data available for service name customization. BookingData:', bookingData);\n                    console.warn('Age validation data:', bookingData ? bookingData.age_validation : 'No booking data');\n                    return;\n                }\n                \n                var ageValidation = bookingData.age_validation;\n                console.log('Age validation data found:', ageValidation);\n                \n                \/\/ Customize YDF service names\n                var youngFrom = ageValidation.YoungDriverAgeFrom || 0;\n                var youngTo = ageValidation.YoungDriverAgeTo || 0;\n                console.log('Young driver age range:', youngFrom, '-', youngTo);\n                \n                if (youngFrom > 0 && youngTo > 0) {\n                    var ageRangeText = ' (' + youngFrom + '-' + youngTo + ' years)';\n                    var fullServiceName = 'Young Driver' + ageRangeText;\n                    console.log('Looking for YDF service cards...');\n                    \n                    var ydfCards = $('.service-card[data-additional-code=\"YDF\"]');\n                    console.log('Found YDF service cards:', ydfCards.length);\n                    \n                    ydfCards.each(function() {\n                        var $serviceCard = $(this);\n                        var $serviceName = $serviceCard.find('.service-name');\n                        var $checkbox = $serviceCard.find('input[type=\"checkbox\"]');\n                        var currentText = $serviceName.text();\n                        \n                        console.log('YDF service current text:', currentText);\n                        \n                        if (currentText === 'Young Driver') {\n                            $serviceName.text(fullServiceName);\n                            $checkbox.attr('data-name', fullServiceName);\n                            console.log('Updated YDF service name to:', fullServiceName);\n                        }\n                    });\n                }\n                \n                \/\/ Customize ODF service names\n                var seniorFrom = ageValidation.SeniorDriverAgeFrom || 0;\n                var seniorTo = ageValidation.SeniorDriverAgeTo || 0;\n                console.log('Senior driver age range:', seniorFrom, '-', seniorTo);\n                \n                if (seniorFrom > 0 && seniorTo > 0) {\n                    var ageRangeText = ' (' + seniorFrom + '-' + seniorTo + ' years)';\n                    var fullServiceName = 'Senior Driver' + ageRangeText;\n                    console.log('Looking for ODF service cards...');\n                    \n                    var odfCards = $('.service-card[data-additional-code=\"ODF\"]');\n                    console.log('Found ODF service cards:', odfCards.length);\n                    \n                    odfCards.each(function() {\n                        var $serviceCard = $(this);\n                        var $serviceName = $serviceCard.find('.service-name');\n                        var $checkbox = $serviceCard.find('input[type=\"checkbox\"]');\n                        var currentText = $serviceName.text();\n                        \n                        console.log('ODF service current text:', currentText);\n                        \n                        if (currentText === 'Senior Driver') {\n                            $serviceName.text(fullServiceName);\n                            $checkbox.attr('data-name', fullServiceName);\n                            console.log('Updated ODF service name to:', fullServiceName);\n                        }\n                    });\n                }\n                \n                console.log('Service name customization completed. Final summary:');\n                console.log('- Young Driver range:', youngFrom + '-' + youngTo + ' years');\n                console.log('- Senior Driver range:', seniorFrom + '-' + seniorTo + ' years');\n            }\n            \n            \/**\n             * Get service icon based on service name\n             *\/\n            function getServiceIcon(serviceName, serviceType) {\n                var name = (serviceName || '').toLowerCase();\n                \n                \/\/ GPS\/Navigation\n                if (name.includes('gps') || name.includes('navigation') || name.includes('navigatore')) {\n                    return '\ud83d\uddfa\ufe0f';\n                }\n                \/\/ WiFi\/Internet\n                if (name.includes('wifi') || name.includes('wi-fi') || name.includes('internet')) {\n                    return '\ud83d\udcf6';\n                }\n                \/\/ Child seats\/Seggiolino\n                if (name.includes('seggiolino') || name.includes('child') || name.includes('seat') || name.includes('bambini') || name.includes('booster')) {\n                    return '\ud83d\udc76';\n                }\n                \/\/ Additional driver\/Conducente\n                if (name.includes('conducente') || name.includes('driver') || name.includes('autista') || name.includes('anziano') || name.includes('giovane')) {\n                    return '\ud83d\udc64';\n                }\n                \/\/ Camera\/Photo equipment\n                if (name.includes('fotocamera') || name.includes('camera') || name.includes('gopro') || name.includes('foto')) {\n                    return '\ud83d\udcf7';\n                }\n                \/\/ Fuel\/Carburante\n                if (name.includes('carburante') || name.includes('fuel') || name.includes('gas') || name.includes('benzina')) {\n                    return '\u26fd';\n                }\n                \/\/ Chains\/Snow equipment\n                if (name.includes('catene') || name.includes('chains') || name.includes('snow') || name.includes('neve')) {\n                    return '\ud83d\udd17';\n                }\n                \/\/ Roof box\/luggage\n                if (name.includes('portapacchi') || name.includes('roof') || name.includes('bagagli') || name.includes('box')) {\n                    return '\ud83e\uddf3';\n                }\n                \/\/ Insurance\n                if (serviceType === 'insurance' || name.includes('assicurazione') || name.includes('insurance') || name.includes('coverage')) {\n                    return '\ud83d\udee1\ufe0f';\n                }\n                \/\/ Cleaning\/Pulizia\n                if (name.includes('pulizia') || name.includes('cleaning') || name.includes('lavaggio')) {\n                    return '\ud83e\uddfd';\n                }\n                \/\/ Delivery\/Consegna\n                if (name.includes('consegna') || name.includes('delivery') || name.includes('domicilio')) {\n                    return '\ud83d\ude9a';\n                }\n                \/\/ Default icons based on type\n                if (serviceType === 'extra') {\n                    return '\u2b50';\n                }\n                if (serviceType === 'service') {\n                    return '\ud83d\udd27';\n                }\n                \/\/ Fallback\n                return '\u2795';\n            }\n            \n            \/**\n             * Create service option HTML (Grid Card Style)\n             *\/\n            function createServiceOption(service, type) {\n                var price = service.price ? parseFloat(service.price).toFixed(2) : '0.00';\n                var currency = service.currency || 'EUR';\n                var icon = getServiceIcon(service.name, type);\n                \n                \/\/ Properly handle MaximumQuantity: null means unlimited, otherwise use the specified value\n                var maxQuantity = null;\n                var hasLimit = false;\n                \n                if (service.MaximumQuantity !== null && service.MaximumQuantity !== undefined) {\n                    maxQuantity = parseInt(service.MaximumQuantity);\n                    hasLimit = true;\n                } else if (service.maximumQuantity !== null && service.maximumQuantity !== undefined) {\n                    maxQuantity = parseInt(service.maximumQuantity);\n                    hasLimit = true;\n                } else if (service.max_quantity !== null && service.max_quantity !== undefined) {\n                    maxQuantity = parseInt(service.max_quantity);\n                    hasLimit = true;\n                }\n                \n                \/\/ For display purposes, use \"unlimited\" when no limit\n                var maxQuantityDisplay = hasLimit ? maxQuantity : 'unlimited';\n                \n                \/\/ Get AdditionalName (case-insensitive check)\n                var additionalName = service.AdditionalName || service.additionalName || '';\n                var name = service.name || '';\n                var additionalCode = service.additionalCode || service.AdditionalCode || '';\n                \n                \/\/ Basic customization - detailed customization happens after DOM is ready\n                if (additionalCode === 'YDF') {\n                    name = 'Young Driver';\n                } else if (additionalCode === 'ODF') {\n                    name = 'Senior Driver';\n                } else if (additionalCode === 'OHD' || additionalCode === 'OHDD') {\n                    name = 'Out Of Hours - Day';\n                } else if (additionalCode === 'OHND' || additionalCode === 'OHN') {\n                    name = 'Out Of Hours - Night';\n                }\n                \n                var showAdditional = false;\n                if (additionalName && name && additionalName.toLowerCase() !== name.toLowerCase()) {\n                    showAdditional = true;\n                }\n                var html = '<div class=\"service-card\" data-service-type=\"' + type + '\" data-service-code=\"' + service.code + '\" data-additional-code=\"' + additionalCode + '\" data-max-quantity=\"' + maxQuantityDisplay + '\" data-has-limit=\"' + hasLimit + '\">';\n                html += '<input type=\"checkbox\" name=\"selected_services[]\" value=\"' + service.code + '\" data-price=\"' + service.price + '\" data-name=\"' + name + '\" data-additional-code=\"' + additionalCode + '\" data-max-quantity=\"' + maxQuantityDisplay + '\" data-has-limit=\"' + hasLimit + '\" style=\"display: none;\">';\n                html += '<div class=\"service-card-content\">';\n                html += '<div class=\"service-icon\">' + icon + '<\/div>';\n                html += '<div class=\"service-info\">';\n                html += '<div class=\"service-name\">' + name + '<\/div>';\n                if (showAdditional) {\n                    html += '<div class=\"service-additional-name\" style=\"font-size:12px;color:#6b7280;margin-bottom:2px;\">' + additionalName + '<\/div>';\n                }\n                \n                \/\/ Override descriptions for specific service codes\n                var serviceDescription = service.description || '';\n                var serviceCode = service.Code || service.code || service.ServiceCode || '';\n                var additionalCode = service.AdditionalCode || service.additionalCode || '';\n                \/\/ Service description mapping is now handled in service name mapping above\n                \/\/ No need to override description for out of hours services\n                \n                if (serviceDescription) {\n                    html += '<div class=\"service-description\">' + serviceDescription + '<\/div>';\n                }\n                html += '<\/div>';\n                html += '<div class=\"service-price\">' + price + ' ' + currency + '<\/div>';\n                html += '<\/div>';\n                \/\/ Add quantity selection section (hidden by default, shown when selected)\n                html += '<div class=\"service-quantity-section\">';\n                html += '<span class=\"quantity-label\">' + (caralliance_i18n.quantity || 'Quantity') + ':<\/span>';\n                html += '<div class=\"quantity-controls\">';\n                html += '<button type=\"button\" class=\"quantity-btn quantity-decrease\" data-service=\"' + service.code + '\" data-additional-code=\"' + additionalCode + '\">-<\/button>';\n                \n                \/\/ Only set max attribute if there's a limit\n                var inputAttributes = 'type=\"number\" class=\"quantity-input\" data-service=\"' + service.code + '\" data-additional-code=\"' + additionalCode + '\" value=\"1\" min=\"1\"';\n                if (hasLimit) {\n                    inputAttributes += ' max=\"' + maxQuantity + '\"';\n                }\n                inputAttributes += ' readonly';\n                html += '<input ' + inputAttributes + '>';\n                \n                html += '<button type=\"button\" class=\"quantity-btn quantity-increase\" data-service=\"' + service.code + '\" data-additional-code=\"' + additionalCode + '\">+<\/button>';\n                html += '<\/div>';\n                \n                \/\/ Show quantity limit only if there is one\n                if (hasLimit && maxQuantity > 1) {\n                    html += '<span class=\"quantity-limit\">' + (caralliance_i18n.max_quantity || 'Max') + ': ' + maxQuantity + '<\/span>';\n                }\n                \/\/ For unlimited quantities (hasLimit = false), show no limit text at all\n                \n                html += '<div class=\"service-total-price\">' + price + ' ' + currency + '<\/div>';\n                html += '<\/div>';\n                html += '<\/div>';\n                return html;\n            }\n            \n            \/**\n             * Bind service selection events\n             *\/\n            function bindServiceEvents() {\n                \/\/ Handle service card clicks (toggle selection)\n                $('.service-card').on('click', function(e) {\n                    \/\/ Don't toggle when clicking on quantity controls\n                    if ($(e.target).closest('.service-quantity-section').length > 0) {\n                        return;\n                    }\n                    \n                    var $card = $(this);\n                    var $checkbox = $card.find('input[type=\"checkbox\"]');\n                    \n                    \/\/ Toggle selection\n                    var isSelected = $checkbox.is(':checked');\n                    $checkbox.prop('checked', !isSelected);\n                    \n                    \/\/ Update visual state\n                    if (!isSelected) {\n                        $card.addClass('selected');\n                        \/\/ Reset quantity to 1 when selecting\n                        $card.find('.quantity-input').val(1);\n                    } else {\n                        $card.removeClass('selected');\n                    }\n                    \n                    \/\/ Update pricing\n                    updatePricingCalculation();\n                    \n                    \/\/ Add animation feedback\n                    $card.addClass('clicked');\n                    setTimeout(function() {\n                        $card.removeClass('clicked');\n                    }, 200);\n                });\n                \n                \/\/ Handle quantity controls\n                $('.quantity-btn').on('click', function(e) {\n                    e.preventDefault();\n                    e.stopPropagation();\n                    \n                    var $btn = $(this);\n                    var serviceCode = $btn.data('service');\n                    var additionalCode = $btn.data('additional-code') || '';\n                    \n                    \/\/ Build selector for matching input with additional code\n                    var inputSelector = '.quantity-input[data-service=\"' + serviceCode + '\"]';\n                    if (additionalCode) {\n                        inputSelector += '[data-additional-code=\"' + additionalCode + '\"]';\n                    }\n                    \n                    var $input = $(inputSelector);\n                    var $card = $btn.closest('.service-card');\n                    var currentQty = parseInt($input.val()) || 1;\n                    \n                    \/\/ Check if service has a limit\n                    var hasLimit = $card.data('has-limit') === true || $card.data('has-limit') === 'true';\n                    var maxQty = hasLimit ? parseInt($input.attr('max')) : null;\n                    var newQty = currentQty;\n                    \n                    if ($btn.hasClass('quantity-increase')) {\n                        \/\/ Only check max limit if hasLimit is true\n                        if (!hasLimit || currentQty < maxQty) {\n                            newQty = currentQty + 1;\n                        }\n                    } else if ($btn.hasClass('quantity-decrease') && currentQty > 1) {\n                        newQty = currentQty - 1;\n                    }\n                    \n                    if (newQty !== currentQty) {\n                        $input.val(newQty);\n                        updateServiceQuantityDisplay($card, newQty);\n                        updatePricingCalculation();\n                    }\n                    \n                    \/\/ Update button states - use the same selector pattern\n                    var decreaseBtnSelector = '.quantity-decrease[data-service=\"' + serviceCode + '\"]';\n                    var increaseBtnSelector = '.quantity-increase[data-service=\"' + serviceCode + '\"]';\n                    if (additionalCode) {\n                        decreaseBtnSelector += '[data-additional-code=\"' + additionalCode + '\"]';\n                        increaseBtnSelector += '[data-additional-code=\"' + additionalCode + '\"]';\n                    }\n                    var $decreaseBtn = $(decreaseBtnSelector);\n                    var $increaseBtn = $(increaseBtnSelector);\n                    \n                    $decreaseBtn.prop('disabled', newQty <= 1);\n                    \/\/ Only disable increase button if there's a limit and we've reached it\n                    $increaseBtn.prop('disabled', hasLimit && newQty >= maxQty);\n                });\n                \n                \/\/ Handle direct quantity input changes\n                $('.quantity-input').on('change', function() {\n                    var $input = $(this);\n                    var serviceCode = $input.data('service');\n                    var additionalCode = $input.data('additional-code') || '';\n                    var $card = $input.closest('.service-card');\n                    var newQty = parseInt($input.val()) || 1;\n                    var minQty = 1;\n                    \n                    \/\/ Check if service has a limit\n                    var hasLimit = $card.data('has-limit') === true || $card.data('has-limit') === 'true';\n                    var maxQty = hasLimit ? parseInt($input.attr('max')) : null;\n                    \n                    \/\/ Validate and clamp quantity\n                    if (newQty < minQty) newQty = minQty;\n                    if (hasLimit && newQty > maxQty) newQty = maxQty;\n                    \n                    $input.val(newQty);\n                    updateServiceQuantityDisplay($card, newQty);\n                    updatePricingCalculation();\n                    \n                    \/\/ Update button states - use same selector pattern as above\n                    var decreaseBtnSelector = '.quantity-decrease[data-service=\"' + serviceCode + '\"]';\n                    var increaseBtnSelector = '.quantity-increase[data-service=\"' + serviceCode + '\"]';\n                    if (additionalCode) {\n                        decreaseBtnSelector += '[data-additional-code=\"' + additionalCode + '\"]';\n                        increaseBtnSelector += '[data-additional-code=\"' + additionalCode + '\"]';\n                    }\n                    var $decreaseBtn = $(decreaseBtnSelector);\n                    var $increaseBtn = $(increaseBtnSelector);\n                    \n                    $decreaseBtn.prop('disabled', newQty <= 1);\n                    \/\/ Only disable increase button if there's a limit and we've reached it\n                    $increaseBtn.prop('disabled', hasLimit && newQty >= maxQty);\n                });\n                \n                \/\/ Handle form submission\n                $('#caralliance-services-form').on('submit', function(e) {\n                    e.preventDefault();\n                    proceedToCheckout();\n                });\n                \n                \/\/ Back to search button\n                $('#back-to-search').on('click', function() {\n                    \/\/ Get booking data from localStorage\n                    var bookingData = JSON.parse(localStorage.getItem('caralliance_booking_data') || '{}');\n                    \n                    if (bookingData.search_params) {\n                        \/\/ Extract search parameters from booking data\n                        var searchParams = bookingData.search_params;\n                        \n                        \/\/ Construct URL with search parameters\n                        var searchUrl = new URL(window.location.origin);\n                        \n                        \/\/ Try to find the search results page URL\n                        $.ajax({\n                            url: caralliance_ajax.ajax_url,\n                            type: 'POST',\n                            data: {\n                                action: 'caralliance_get_search_results_url',\n                                nonce: caralliance_ajax.nonce\n                            },\n                            success: function(response) {\n                                if (response.success && response.data.url) {\n                                    \/\/ Use the configured search results page URL\n                                    searchUrl = new URL(response.data.url);\n                                } else {\n                                    \/\/ Fallback to current page path with \/search-results\n                                    searchUrl.pathname = '\/search-results\/';\n                                }\n                                \n                                \/\/ Add search parameters to URL\n                                searchUrl.searchParams.set('pickup_location', searchParams.pickup_location);\n                                searchUrl.searchParams.set('dropoff_location', searchParams.dropoff_location);\n                                searchUrl.searchParams.set('pickup_date', searchParams.pickup_date);\n                                searchUrl.searchParams.set('dropoff_date', searchParams.dropoff_date);\n                                searchUrl.searchParams.set('pickup_time', searchParams.pickup_time);\n                                searchUrl.searchParams.set('dropoff_time', searchParams.dropoff_time);\n                                \n                                console.log('Redirecting back to search with parameters:', searchUrl.toString());\n                                \n                                \/\/ Redirect to search results page with parameters\n                                window.location.href = searchUrl.toString();\n                            },\n                            error: function() {\n                                \/\/ Fallback: use current domain with \/search-results path\n                                searchUrl.pathname = '\/search-results\/';\n                                searchUrl.searchParams.set('pickup_location', searchParams.pickup_location);\n                                searchUrl.searchParams.set('dropoff_location', searchParams.dropoff_location);\n                                searchUrl.searchParams.set('pickup_date', searchParams.pickup_date);\n                                searchUrl.searchParams.set('dropoff_date', searchParams.dropoff_date);\n                                searchUrl.searchParams.set('pickup_time', searchParams.pickup_time);\n                                searchUrl.searchParams.set('dropoff_time', searchParams.dropoff_time);\n                                \n                                console.log('Fallback redirect to search with parameters:', searchUrl.toString());\n                                window.location.href = searchUrl.toString();\n                            }\n                        });\n                    } else {\n                        \/\/ No search parameters found, go back normally\n                        console.warn('No search parameters found in booking data, using history.back()');\n                        window.history.back();\n                    }\n                });\n                \n                \/\/ Change Car button - redirect to search results with current search parameters\n                $('#change-car-btn').on('click', function() {\n                    \/\/ Get booking data from localStorage\n                    var bookingData = JSON.parse(localStorage.getItem('caralliance_booking_data') || '{}');\n                    \n                    if (bookingData.search_params) {\n                        \/\/ Extract search parameters from booking data\n                        var searchParams = bookingData.search_params;\n                        \n                        \/\/ Construct URL with search parameters\n                        var searchUrl = new URL(window.location.origin);\n                        \n                        \/\/ Try to find the search results page URL\n                        $.ajax({\n                            url: caralliance_ajax.ajax_url,\n                            type: 'POST',\n                            data: {\n                                action: 'caralliance_get_search_results_url',\n                                nonce: caralliance_ajax.nonce\n                            },\n                            success: function(response) {\n                                if (response.success && response.data.url) {\n                                    \/\/ Use the configured search results page URL\n                                    searchUrl = new URL(response.data.url);\n                                } else {\n                                    \/\/ Fallback to current page path with \/search-results\n                                    searchUrl.pathname = '\/search-results\/';\n                                }\n                                \n                                \/\/ Add search parameters to URL\n                                searchUrl.searchParams.set('pickup_location', searchParams.pickup_location);\n                                searchUrl.searchParams.set('dropoff_location', searchParams.dropoff_location);\n                                searchUrl.searchParams.set('pickup_date', searchParams.pickup_date);\n                                searchUrl.searchParams.set('dropoff_date', searchParams.dropoff_date);\n                                searchUrl.searchParams.set('pickup_time', searchParams.pickup_time);\n                                searchUrl.searchParams.set('dropoff_time', searchParams.dropoff_time);\n                                \n                                console.log('Change Car - Redirecting back to search with parameters:', searchUrl.toString());\n                                \n                                \/\/ Redirect to search results page with parameters\n                                window.location.href = searchUrl.toString();\n                            },\n                            error: function() {\n                                \/\/ Fallback: use current domain with \/search-results path\n                                searchUrl.pathname = '\/search-results\/';\n                                searchUrl.searchParams.set('pickup_location', searchParams.pickup_location);\n                                searchUrl.searchParams.set('dropoff_location', searchParams.dropoff_location);\n                                searchUrl.searchParams.set('pickup_date', searchParams.pickup_date);\n                                searchUrl.searchParams.set('dropoff_date', searchParams.dropoff_date);\n                                searchUrl.searchParams.set('pickup_time', searchParams.pickup_time);\n                                searchUrl.searchParams.set('dropoff_time', searchParams.dropoff_time);\n                                \n                                console.log('Change Car - Fallback redirect to search with parameters:', searchUrl.toString());\n                                window.location.href = searchUrl.toString();\n                            }\n                        });\n                    } else {\n                        \/\/ No search parameters found, go back normally\n                        console.warn('Change Car - No search parameters found in booking data, using history.back()');\n                        window.history.back();\n                    }\n                });\n                \n                \/\/ Go to Cart button\n                $('#go-to-cart-services').on('click', function() {\n                    console.log('Go to Cart button clicked');\n                    \n                    \/\/ Find cart page and redirect\n                    $.ajax({\n                        url: caralliance_ajax.ajax_url,\n                        type: 'POST',\n                        data: {\n                            action: 'caralliance_get_cart_page_url',\n                            nonce: caralliance_ajax.nonce\n                        },\n                        success: function(response) {\n                            if (response.success && response.data.url) {\n                                console.log('Redirecting to cart page:', response.data.url);\n                                window.location.href = response.data.url;\n                            } else {\n                                \/\/ Fallback: try common cart page paths\n                                var currentUrl = window.location.href;\n                                var baseUrl = currentUrl.split('?')[0].replace(\/\\\/$\/, '');\n                                var cartUrl = baseUrl.replace(\/\\\/[^\\\/]*$\/, '\/cart');\n                                console.log('Fallback redirect to cart:', cartUrl);\n                                window.location.href = cartUrl;\n                            }\n                        },\n                        error: function() {\n                            console.log('AJAX failed, trying fallback cart URL...');\n                            var currentUrl = window.location.href;\n                            var baseUrl = currentUrl.split('?')[0].replace(\/\\\/$\/, '');\n                            var cartUrl = baseUrl.replace(\/\\\/[^\\\/]*$\/, '\/cart');\n                            window.location.href = cartUrl;\n                        }\n                    });\n                });\n            }\n            \n            \/**\n             * Update pricing display with current selections\n             *\/\n            function updatePricingDisplay(bookingData) {\n                \/\/ Calculate correct car total price: daily rate \u00d7 number of days\n                var selectedCar = bookingData.selected_car;\n                var totalPrice = parseFloat(selectedCar.Amount || 0);\n                var daysForPayment = parseInt(selectedCar.DaysForPayment || 1);\n                var dailyRate = daysForPayment > 0 ? (totalPrice \/ daysForPayment) : totalPrice;\n                var carTotalPrice = totalPrice;\n                \n                var html = '<div class=\"pricing-breakdown\">';\n                html += '<div class=\"price-row\" data-type=\"car\">';\n                html += '<div class=\"price-description\">Auto (' + (selectedCar.ModelName || caralliance_i18n.selected_car_default) + '):<\/div>';\n                html += '<div class=\"price-amount\">' + carTotalPrice.toFixed(2) + ' ' + (selectedCar.Currency || 'EUR') + '<\/div>';\n                html += '<\/div>';\n                html += '<div class=\"price-row services-total\" data-type=\"service\" style=\"display: none;\">';\n                html += '<div class=\"price-description\">' + caralliance_i18n.additional_services + ':<\/div>';\n                html += '<div class=\"price-amount\" id=\"services-total-amount\">0.00 ' + (selectedCar.Currency || 'EUR') + '<\/div>';\n                html += '<\/div>';\n                html += '<div class=\"price-total\">';\n                html += '<span><strong>' + caralliance_i18n.total + ':<\/strong><\/span>';\n                html += '<span id=\"total-amount\"><strong>' + carTotalPrice.toFixed(2) + ' ' + (selectedCar.Currency || 'EUR') + '<\/strong><\/span>';\n                html += '<\/div>';\n                html += '<\/div>';\n                \n                $('#price-breakdown').html(html);\n                \n                \/\/ Update booking data with correct car price\n                bookingData.pricing = bookingData.pricing || {};\n                bookingData.pricing.car_price = carTotalPrice;\n                bookingData.pricing.total_price = carTotalPrice;\n                bookingData.pricing.currency = selectedCar.Currency || 'EUR';\n                localStorage.setItem('caralliance_booking_data', JSON.stringify(bookingData));\n            }\n            \n            \/**\n             * Update service quantity display in the service card\n             *\/\n            function updateServiceQuantityDisplay($card, quantity) {\n                var price = parseFloat($card.find('input[type=\"checkbox\"]').data('price')) || 0;\n                var currency = $card.find('.service-price').text().split(' ')[1] || 'EUR';\n                var totalPrice = (price * quantity).toFixed(2);\n                \n                $card.find('.service-total-price').text(totalPrice + ' ' + currency);\n            }\n            \n            \/**\n             * Update pricing calculation when services change\n             *\/\n            function updatePricingCalculation() {\n                var bookingData = JSON.parse(localStorage.getItem('caralliance_booking_data'));\n                var selectedServices = [];\n                var servicesTotal = 0;\n                \n                \/\/ Calculate correct car total price: daily rate \u00d7 number of days\n                var selectedCar = bookingData.selected_car;\n                var totalPrice = parseFloat(selectedCar.Amount || 0);\n                var daysForPayment = parseInt(selectedCar.DaysForPayment || 1);\n                var dailyRate = daysForPayment > 0 ? (totalPrice \/ daysForPayment) : totalPrice;\n                var carTotalPrice = totalPrice;\n                \n                $('input[name=\"selected_services[]\"]:checked').each(function() {\n                    var price = parseFloat($(this).data('price')) || 0;\n                    var name = $(this).data('name');\n                    var code = $(this).val();\n                    var additionalCode = $(this).data('additional-code') || $(this).attr('data-additional-code') || '';\n                    var $card = $(this).closest('.service-card');\n                    var quantity = parseInt($card.find('.quantity-input').val()) || 1;\n                    var totalServicePrice = price * quantity;\n                    \n                    console.log('Processing selected service:', {\n                        code: code,\n                        name: name,\n                        additionalCode: additionalCode,\n                        price: price,\n                        quantity: quantity,\n                        dataAttributes: {\n                            'data-additional-code': $(this).attr('data-additional-code'),\n                            'data()': $(this).data('additional-code'),\n                            cardAdditionalCode: $card.data('additional-code')\n                        }\n                    });\n                    \n                    var serviceData = {\n                        code: code,\n                        name: name,\n                        price: price,\n                        quantity: quantity,\n                        total_price: totalServicePrice\n                    };\n                    \n                    \/\/ Add AdditionalCode if available (important for YDF\/ODF services)\n                    if (additionalCode) {\n                        serviceData.AdditionalCode = additionalCode;\n                        console.log('Service with AdditionalCode added:', serviceData);\n                    }\n                    \n                    selectedServices.push(serviceData);\n                    servicesTotal += totalServicePrice;\n                });\n                \n                \/\/ Update booking data with correct calculations\n                bookingData.selected_services = selectedServices;\n                bookingData.pricing = bookingData.pricing || {};\n                bookingData.pricing.car_price = carTotalPrice;\n                bookingData.pricing.services_price = servicesTotal;\n                bookingData.pricing.total_price = carTotalPrice + servicesTotal;\n                bookingData.pricing.currency = selectedCar.Currency || 'EUR';\n                \n                \/\/ Save updated data\n                localStorage.setItem('caralliance_booking_data', JSON.stringify(bookingData));\n                \n                \/\/ Update display\n                if (servicesTotal > 0) {\n                    $('.services-total').show();\n                    $('#services-total-amount').text(servicesTotal.toFixed(2) + ' ' + bookingData.pricing.currency);\n                } else {\n                    $('.services-total').hide();\n                }\n                \n                $('#total-amount').html('<strong>' + bookingData.pricing.total_price.toFixed(2) + ' ' + bookingData.pricing.currency + '<\/strong>');\n                \n                console.log('Updated pricing calculation:', {\n                    dailyRate: dailyRate,\n                    daysForPayment: daysForPayment,\n                    carTotalPrice: carTotalPrice,\n                    servicesTotal: servicesTotal,\n                    totalPrice: bookingData.pricing.total_price\n                });\n            }\n            \n            \/**\n             * Proceed to checkout\n             *\/\n            function proceedToCheckout() {\n                var bookingData = JSON.parse(localStorage.getItem('caralliance_booking_data'));\n                \n                console.log('Proceeding to checkout with:', bookingData);\n                \n                \/\/ Find checkout page and redirect\n                findAndRedirectToCheckoutPage();\n            }\n            \n            \/**\n             * Find checkout page and redirect\n             *\/\n            function findAndRedirectToCheckoutPage() {\n                console.log('Looking for checkout page...');\n                \n                \/\/ Try to get checkout page URL from WordPress\n                $.ajax({\n                    url: caralliance_ajax.ajax_url,\n                    type: 'POST',\n                    data: {\n                        action: 'caralliance_get_checkout_page_url',\n                        nonce: caralliance_ajax.nonce\n                    },\n                    success: function(response) {\n                        if (response.success && response.data.url) {\n                            console.log('Redirecting to checkout page:', response.data.url);\n                            window.location.href = response.data.url;\n                        } else {\n                            \/\/ Fallback: look for common checkout page URLs\n                            tryCommonCheckoutUrls();\n                        }\n                    },\n                    error: function() {\n                        console.log('AJAX failed, trying common URLs...');\n                        tryCommonCheckoutUrls();\n                    }\n                });\n            }\n            \n            \/**\n             * Try common checkout page URLs as fallback\n             *\/\n            function tryCommonCheckoutUrls() {\n                var currentUrl = window.location.href;\n                var baseUrl = currentUrl.split('?')[0].replace(\/\\\/$\/, '');\n                \n                \/\/ Try common checkout page paths\n                var commonPaths = [\n                    '\/checkout',\n                    '\/car-checkout', \n                    '\/booking-checkout',\n                    '\/payment',\n                    '\/complete-booking'\n                ];\n                \n                \/\/ Show instruction alert if no checkout page found\n                alert('Per continuare, crea una pagina con lo shortcode [caralliance_checkout]\\n\\nPercorsi suggeriti:\\n' + \n                      commonPaths.map(path => baseUrl + path).join('\\n') + \n                      '\\n\\nOppure vai manualmente alla pagina di checkout.');\n                \n                console.log('No checkout page found. Suggested URLs:', commonPaths.map(path => baseUrl + path));\n            }\n        });\n        <\/script>\n        \n\n\n\n<div style=\"height:60px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":14,"comment_status":"closed","ping_status":"closed","template":"elementor_theme","meta":{"footnotes":""},"class_list":["post-36","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/caralliancerentals.com\/it\/wp-json\/wp\/v2\/pages\/36","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/caralliancerentals.com\/it\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/caralliancerentals.com\/it\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/caralliancerentals.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/caralliancerentals.com\/it\/wp-json\/wp\/v2\/comments?post=36"}],"version-history":[{"count":0,"href":"https:\/\/caralliancerentals.com\/it\/wp-json\/wp\/v2\/pages\/36\/revisions"}],"wp:attachment":[{"href":"https:\/\/caralliancerentals.com\/it\/wp-json\/wp\/v2\/media?parent=36"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}