2024 Volvo V60 Recharge
in Halifax

The amount shown reflects an estimate of the amount that you can expect to pay in Canadian dollars and includes freight and PDI. Taxes are excluded (unless selected otherwise). Photos for illustration purposes only, and may not reflect exact vehicle (including vehicle colour, trim, options, or other specifications). Some data and prices are provided by a third-party and we cannot guarantee their accuracy.
Drivetrain
All Wheel Drive
Engine
Intercooled Turbo Gas/Electric I-4
Transmission
Automatic w/OD
Fuel Type
Gasoline
 
Estimated Fuel Economy
for the 2024 Volvo V60 Recharge
City
8 L/100 km
Highway
7.2 L/100 km
Combined
7.6 L/100 km
Actual mileage may vary with options, driving conditions, driving habits, and vehicle's condition.
Browse the 2024 Volvo V60 Recharge different trims
Indemnification clause
Photos for illustration purposes only, and may not reflect exact vehicle (including vehicle colour, trim, options, or other specifications). Some vehicles may be shown with optional equipment or equipment not available in Canada. Specifications, equipment, options and prices are subject to change without notice. Although we endeavour to ensure that the information contained on this website is accurate, the website provider and the dealership are not responsible for any errors or omissions that may occur from time to time. Some data and prices are provided by a third-party and we cannot guarantee their accuracy. Please contact your dealer for verification or if you would like more information on this vehicle.
front45
Build & Price Your 2024 Volvo V60 Recharge Polestar Engineered Now!
You can build & price your own 2024 Volvo V60 Recharge including the style, color & options to get an exact price, with our promotions and rebates and availability in stock.
starting at $79,600 +Taxes & Licenses
profile
ajax loader2
'; } $(html).appendTo('#slider-pro-12'); newcarDetails.initSlider(); if (videotype.indexOf('avu3d|') != -1){ $('#linkVirtualTour').on('click', function(e){ e.preventDefault(); //takeVirtualTour(); return false; }); if(videosCount == 1){ $('#linkVirtualTour').trigger('click'); } trackVirtualTour(); } else if(videotype.indexOf('mp4|') > -1){ var video = document.getElementById("player"); if(videosCount == 1){ video.addEventListener('canplay', function(){ this.play(); //videoPlay(); }); } else { video.addEventListener("play", function(){ newcarDetails.sliderObject.stopSlideshow(); }, false); } //triggering tracking event trackVideoPlay(); } else if (videotype.indexOf('youtube|') != -1){ //triggering tracking event trackVideoPlay(); //var video = document.getElementById("ytplayer"); //video.addEventListener("onStateChange", videoPlay, false); } if(yt_count > 0){ if(typeof yt_api_started != 'undefined'){ onYouTubeIframeAPIReady(); } yt_api_started = 1; } $('div.slide-arrows a').on('click', function(){ pauseAllVideos(); }); }, setupPictureViewer: function() { //let has360Images = !!document.getElementById('car360ImageViewer'); if(newcarDetails.has360Images){ const viewer = ImageViewer(); //docReadyArr.push(ImageViewer); } else { newcarDetails.initSlider(); } //picture viewer loaded newcarDetails.inInitialLoad = false; }, initSlider: function(){ try { if(newcarDetails.sliderObject != null) newcarDetails.sliderObject.destroy(); let sliderAutoplay = true; if(typeof vdpImageSliderOptions !== 'undefined'){ sliderAutoplay = vdpImageSliderOptions.autoplay; } newcarDetails.sliderObject = $("#slider-pro-12").advancedSlider({ responsive:true, slideshow: sliderAutoplay, width: '100%', height: '100%', skin: 'glossy-curved-black', pauseSlideshowOnHover: 1, slideButtons: 0, swipeMouseDrag: false, lightbox: 1, effectType: 'fade', controlNavThumbs:false, captionToggle: 1, captionSize: gCarSliderDimension.captionSize, captionHideEffect: 'fade', scaleType: 'insideFit', preloadNearbyImages: true }); //$('.slide-wrapper').css('height', gCarSliderDimension.height + 'px'); $('.shadow').height(gCarSliderDimension.captionSize); //this.startSlider(); //$("#firstSliderImg").addClass('fade-out'); if (typeof $('.bandpConfigureNow').attr('class') !== 'undefined') { $('.bandpConfigureNow').show(); } } catch(ex) { console.log(ex.message, ex); } $(window).trigger('resize'); $('a[data-zoom-image]').each(function(){ var zoomLevel = $(this).attr('data-zoom-level'); $(this).closest('li') // tile mouse actions .on("mouseover", function() { if(!$(this).find('a[data-zoom-image]').hasClass('imageChanged')){ $(this).find('a[data-zoom-image] img').attr('src', $(this).find('a[data-zoom-image]').attr('data-zoom-image')); $(this).find('a[data-zoom-image]').addClass('imageChanged'); } $(this).find('a[data-zoom-image] img') .css({ transform: "scale("+zoomLevel+")" }); }) .on("mouseout", function() { $(this).find('a[data-zoom-image] img') .css({ transform: "scale(1)" }); }) .on("mousemove", function(e) { $(this).find('a[data-zoom-image] img') .css({ "transform-origin": ((e.pageX - $(this).offset().left) / $(this).width()) * 100 + "% " + ((e.pageY - $(this).offset().top) / $(this).height()) * 100 + "%" }); }); }); $('img[data-stockimg=1]').each(function(){ var img = $(this); if (img.width() < gCarSliderDimension.width) { img.css('width', gCarSliderDimension.width + 'px') .css('height', 'auto') .css('max-width', gCarSliderDimension.width + 'px') .css('max-height', gCarSliderDimension.height + 'px') .css('margin-left', '-' + (gCarSliderDimension.width / 2) + 'px') .css('margin-top', '-' + (gCarSliderDimension.height / 2) + 'px'); }else { img.closest('li').find('span.stockImgStyle').hide(); } }); }, resetSlider: function(){ $('#SeeVideosPictures').attr('state','2'); newcarDetails.setPictureViewerState(); }, startSlider: function(){ if(newcarDetails.sliderObject){ newcarDetails.sliderObject.startSlideshow(); } }, stopSlider: function(){ if(newcarDetails.sliderObject){ newcarDetails.sliderObject.stopSlideshow(); } }, goToSlide: function(index){ if(newcarDetails.sliderObject){ newcarDetails.sliderObject.gotoSlide(index); } }, getImgSource: function(){ let imgSource = store.get('showOemImages') ? store.get('fields.SHOWROOM_IMAGE_SOURCE_TYPE') || 'chrome' : 'chrome'; return imgSource.toLowerCase(); }, getImagesByColor: function(colorCode){ let imageList = newcarDetails.activeModel.images; let curStyle = newcarDetails.getActiveStyle(); let styleColors = curStyle.colors; let colImages = []; let colorData = null; for(let color of Object.values(styleColors)){ if(color.exteriorManCode.indexOf(colorCode) === 0){ colorData = color; } } //DWP-15124: Use 1-tier site images for GMC vehicles const getGMCImages = colorData =>{ const extSequence = Array.from({ length: 5 }, (_, i) => i + 1); const intSequence = Array.from({ length: 2 }, (_, i) => i + 1); let styleYear = curStyle.year; let styleCode = curStyle.fullcode; colorData = colorData || Object.values(styleColors)[0]; const extColCode = colorCode;//(colorData.exteriorManCode || styleColors[0].exteriorManCode).replace(/\|/g, ''); colorData.interiorColors = Object.values(colorData.interiorColors).filter(color => color.name.indexOf('/') === -1); const intColCode = (colorData.interiorColors[0]?.code || '').replace(/\|/g, ''); let equipCode; for (const optionKey of Object.keys(curStyle.optionHeaders)) { let optionData = curStyle.optionHeaders[optionKey]; if (optionData.kindID !== '16') continue; equipCode = Object.values(optionData.options)[0].code; break; } // Exceptions for some models const exceptions = { '451421': { year: '2025', equip_code: '2WT' } }; styleYear = exceptions[curStyle.id]?.year || styleYear; equipCode = exceptions[curStyle.id]?.equip_code || equipCode; extSequence.reduce((carry, imgNum) => { colImages.push(`https://cgi.gm.com/mmgprod-us/dynres/prove/image.gen?i=${styleYear}/${styleCode}/${styleCode}__${equipCode}/${extColCode}_HTAgmds2.jpg&v=deg0${imgNum}&std=true&country=US&removeCat=&transparentBackgroundPng=true`); }, []); if(intColCode){ intSequence.reduce((carry, imgNum) => { colImages.push(`https://cgi.gm.com/mmgprod-us/dynres/prove/imageinterior.gen?i=${styleYear}/${styleCode}/${styleCode}__${equipCode}/${intColCode}_${extColCode}gmds2.jpg&v=deg0${imgNum}&std=true&country=US&removeCat=&transparentBackgroundPng=true`); }, []); } newcarDetails.activeModel.images = colImages; } const getColorImages = colorData => { if(!colorData) return; colImages = Object.values(colorData.images || Object()); if(colImages.length < 1) return;//Only ignore if no images newcarDetails.activeModel.images.splice(0,3,...colImages); } //DWP-15124: Use 1-tier site images for GMC vehicles const setSliderImg = newcarDetails.getImgSource() === 'gmc' ? getGMCImages : getColorImages; setSliderImg(colorData); }, setSliderImgCol: function(colorCode){ if(!newcarDetails.activeModel) return; let curStyle = newcarDetails.getActiveStyle(); let styleColors = curStyle.colors; let colImages = []; let colorData = null; for(let color of Object.values(styleColors)){ if(color.exteriorManCode.indexOf(colorCode) === 0){ colorData = color; } } newcarDetails.getImagesByColor(colorCode); newcarDetails.resetSlider(); return newcarDetails.activeModel.images; }, loadVehicle: function() { htmlFile = d2cmedia.htmlFile(true); if ($('#textMakeOverride').val().length > 0 && $('#textMakeOverride').val() != '##MAKEOVERRIDE##') { var makeO = $('#textMakeOverride').val(); var modelO = $('#textModelOverride').val(); var yearO = $('#textYearOverride').val(); htmlFile = makeO.replace(/\ /g,'_').replace(/-/g,'_') + '-' + modelO.replace(/\ /g,'_').replace(/-/g,'_') + '-' + yearO.toString(); } var basePath = '/js/json/'; //real js file basePath = '/json/'; // new rendered on the fly json var uri = basePath + ($('#textLanguage').val()=="ENGLISH"? htmlFile + "-en.json": htmlFile + "-fr.json"); var jsonLoadFunction = function (jsonObject) { if (jsonObject != null) { newcarDetails.allStyles = jsonObject.styles; //replace only exterior images to keep original interior images if(newcarDetails.activeModel && newcarDetails.activeModel.images.length > 3){ jsonObject.images.push(...newcarDetails.activeModel.images.slice(3)); } newcarDetails.activeModel = jsonObject; if (newcarDetails.activeModel.styles.length > 0) { newcarDetails.activeModel.styles = newcarDetails.filteredVehicleStyles(newcarDetails.activeModel.styles); newcarDetails.overrideStyleID = newcarDetails.getOverrideStyleId(); newcarDetails.compareStyles = newcarDetails.getStylesToCompare(); newcarDetails.compareStyles.forEach(function (style) { newcarDetails.selectedStyleIDs.push(style.id); }); } var styleIDs = []; for (var i = 0; i < newcarDetails.allStyles.length; i++) { styleIDs.push(newcarDetails.allStyles[i].id); } newcarDetails.getPaymentAdjustments(styleIDs); newcarDetails.getBestPriceBanner(); } //olivier 07-06-2023 //flag it to know the json was loaded and the newcarDetails is initialize newcarDetails.isVehicleJsonLoaded = true; }; // Add cache buster var cb = Math.floor(Math.random()*9999999); uri += "?cb=" + cb; $.ajaxSetup({ cache: false }); $.getJSON(uri, jsonLoadFunction).always(function(res, state) { if(state != 'success' || res.responseText == '' ){ console.log( "Error loading "+uri, arguments ); } //This was moved inside newcarDetails.getPaymentAdjustments //as it does soem async XHR requests and we need to wait for results //newcarDetails.loadUI(); $('#styles-container [data-trim]').on('mouseenter mouseleave', function(e){ var position = $(this)[0].getBoundingClientRect(); var container = $('#styles-container')[0].getBoundingClientRect(); //avoid 'hover lag' when mousing over items //and dont show when outside of visible scroll area if (e.type == 'mouseleave' || ( (position.right < container.left) || position.left > container.right) ) { var currentSpecSheet = $(this).find('.menu-tech-specs'); currentSpecSheet.css('opacity', '0'); currentSpecSheet.css('z-index', '0'); return; } var styleid = $(this).attr('data-styleid') if (styleid){ newcarDetails.showSpecTooltip(styleid, $(this)); } }); }); }, loadUI: function () { // Step 1: load the main car information try { if (newcarDetails.inInitialLoad) { newcarDetails.activeModel.images = []; document.querySelectorAll('#slider-pro-12 li.slide').forEach(slide => { newcarDetails.activeModel.images.push(slide.dataset.image); }); newcarDetails.setupPictureViewer(); inViewExec('#mainCompareView', newcarDetails.drawCompare); } else { } newcarDetails.setupCompareSelect(); newcarDetails.setupTrimGroupsScrolling(); newcarDetails.setupRequestFormLinks(); newcarDetails.drawCompare(); setTimeout(() => $("#firstSliderImg").addClass('fade-out'), 1000); newcarDetails.inInitialLoad = false; } catch (e) { console.error(e); newcarDetails.inInitialLoad = true; } try { if (newcarDetails.activeModel.videos.length == 0 || newcarDetails.activeModel.videos[0].length == 0 || $('#ADMIN_NEW_SHOW_VIDEO_FULLWIDTH').val() == '1') { $('#SeeVideosPicturesContainer').hide(); } else { $('#SeeVideosPicturesContainer').show(); } } catch (ex) { $('#SeeVideosPicturesContainer').hide(); } }, getPaymentAdjustments: async function(styleIDs) { if(!!styleIDs && 0 != styleIDs.length) { await newcarDetails.getCashRebatesForStyleIDs(styleIDs); await newcarDetails.getCustomFeeIncentiveForStyleIDs(styleIDs); await newcarDetails.getEvCashIncentiveForStyleIDs(styleIDs); await newcarDetails.getDefaultPaymentForStyleIDs(styleIDs); } newcarDetails.loadUI(); }, getCustomFeeIncentiveForStyleIDs: async function(styleIDs) { var url = ($('#textLanguage').val()=="ENGLISH"?'/en':'/fr')+'/ajax/getCustomFeeIncentiveForStyleIDs?wswidth=0'; await $.ajax({ url: url, type: 'POST', dataType: 'JSON', data: { styleid: styleIDs }, success: function(data){ newcarDetails.activeModel.customFeeIncentive = data; } }); }, getEvCashIncentiveForStyleIDs: async function(styleIDs) { var url = ($('#textLanguage').val()=="ENGLISH"?'/en':'/fr')+'/ajax/getEvCashIncentiveForStyleIDs?wswidth=0'; await $.ajax({ url: url, type: 'POST', dataType: 'JSON', data: { styleid: styleIDs }, success: function(data){ newcarDetails.activeModel.evCashIncentive = data; } }); }, getCashRebatesForStyleIDs: async function(styleIDs) { var url = ($('#textLanguage').val()=="ENGLISH"?'/en':'/fr')+'/ajax/getCashRebatesForStyleIDs?wswidth=0'; await $.ajax({ url: url, type: 'POST', dataType: 'JSON', data: { styleid: styleIDs, includeCustom: true }, success: function(data){ newcarDetails.activeModel.cashRebate = data; } }); }, getDefaultPaymentForStyleIDs: async function(styleIDs) { var url = ($('#textLanguage').val()=="ENGLISH"?'/en':'/fr')+'/ajax/getDefaultPaymentsForStyleIDs?wswidth=0'; await $.ajax({ url: url, type: 'POST', dataType: 'JSON', data: { styleid: styleIDs }, success: function(data){ newcarDetails.activeModel.defaultPayment = data; } }); }, getActiveStyle: function() { var styleObject = null; for (var i=0;i'); retVal += '' + $('#textHome').val() + ''; var baseURL = window.location.pathname.substring(0,window.location.pathname.lastIndexOf('/')+1); retVal += ' > ' + newcarDetails.activeModel.make + ''; retVal += ' > ' + newcarDetails.activeModel.model + ''; retVal += '
'; $(retVal).appendTo('#historyDiv'); }, setupCompareSelect: function () { const trimMultiSelect = $('#trimTabSelect ul.trimTabs'); trimMultiSelect.find('li').remove(); var initCompare = $('#initcomparestyles').val(); $('#initcomparestyles').val(''); if (typeof initCompare != 'undefined' && initCompare) { newcarDetails.selectedStyleIDs = initCompare.split('|||'); } var selectedGroup = newcarDetails.getSelectedTrimGroup(); if (newcarDetails.selectedStyleIDs.length === 0) { newcarDetails.selectedStyleIDs.push(newcarDetails.activeModel.mainstyle); } let groupStyles = selectedGroup !== "all" ? newcarDetails.filteredVehicleStyles(newcarDetails.activeModel.styles) : newcarDetails.activeModel.styles; groupStyles.forEach(function (style) { // if (selectedGroup !== "all" && selectedGroup !== style.englishTrim) { // return; // } var label = style.CFStyleName; if(newcarDetails.activeModel.make == 'BMW' || newcarDetails.activeModel.make == 'Mercedes-Benz') { label = style.CFModelName + ' ' + style.CFStyleName; } if (['Convertible', 'D?apotable', 'D\xe9capotable'].indexOf(style.CFBodyType) > -1) { label += "(" + style.CFBodyType + ")"; } const escapeHTML = str => str.replace(/[&<>"']/g, char => ({'&': '&', '<': '<', '>': '>', '"': '"', "'": '''}[char])); const titleArr = label.split(' '); var trimTxt1 = '' + escapeHTML(titleArr.slice(0,2).join(' ')) + ''; var trimTxt2 = ''; var addedClass = ''; if(titleArr.length > 2){ addedClass = 'double-row'; trimTxt2 = '' + escapeHTML(titleArr.slice(2).join(' ').replace(',','.')) + ''; } var trimTabHTML = '
' + trimTxt1 + trimTxt2 + '
'; var trimTab = $("
  • ").attr("styleid", style.id); if (newcarDetails.selectedStyleIDs.indexOf(style.id) > -1){ //trimTab.prop("selected", "selected"); trimTab[0].setAttribute("selected", 'selected'); } trimMultiSelect.append(trimTab.html(trimTabHTML)); trimTab.on('click', newcarDetails.selectedCompareStyles); }); newcarDetails.setupTrimGroupsScrolling($('#trimTabSelect')); }, selectedCompareStyles: function(e){ // e.stopPropagation(); var clickedTab = $(e.currentTarget); var clickedID = clickedTab.attr('styleid'); var selectedIDs = newcarDetails.selectedStyleIDs.reverse(); if (selectedIDs.indexOf(clickedID) > -1){ if(1 < selectedIDs.length){ selectedIDs.splice(selectedIDs.indexOf(clickedID), 1); clickedTab.prop('selected', false); } else { return false; } } else { if(4 > selectedIDs.length){ selectedIDs.unshift(clickedID); clickedTab.prop('selected', 'selected'); } else { var disabledSid = selectedIDs.pop(); var unclickedTab = $('ul.trimTabs li[styleid="' + disabledSid + '"]'); unclickedTab.prop('selected', false); selectedIDs.unshift(clickedID); clickedTab.prop('selected', 'selected'); } // if(4 > selectedIDs.length){ // selectedIDs.push(clickedID); // clickedTab.prop('selected', 'selected'); // } else { // return false; // } } newcarDetails.compareStyles = newcarDetails.activeModel.styles .filter( function( style ) { return selectedIDs.indexOf( style.id ) > -1 }); newcarDetails.selectedStyleIDs.reverse(); newcarDetails.drawCompare('selectedCompareStyles'); }, drawCompare: function(FROM) { $('#mainCompareView').empty(); $('#mainEquipCompareView').empty(); if (newcarDetails.compareStyles == null) newcarDetails.compareStyles = new Array(); if (newcarDetails.compareStyles.length == 0) newcarDetails.compareStyles.push(newcarDetails.getActiveStyle()); var createCompareHashes = function(style) { hashedOptions = new Hashtable(); for (var i=0;i 0) { if (value.length>0)value += '/'; value += elVal; } } } if (value.length == 0)value = $('#textNotAvailable').val(); retVal.push({'styleid': newcarDetails.compareStyles[j].id, 'value': value}); } } return retVal; } const getWarrantyInfo = () => { let retVal = new Array(); retVal.push(document.getElementById('textCompareWarranty').value); for(let style of newcarDetails.compareStyles){ if(typeof style.warranty === 'undefined') continue; let value = ''; for(let term in style.warranty){ let val = style.warranty[term]; term = term.replace(/(m\w*\/k\S*\b)/gi, 'km'); //term = term.replace(/(m\w*\/k\w*)/gi, 'km'); value += `
    ${term}: ${val}
    `; } value = `
    ${value}
    `; retVal.push({'styleid': style.id, 'value': value}); } return retVal; } var modelid = newcarDetails.activeModel.id; // step 0: Draw Engine var priceDetails = getCompareEntries( ["textCatPrice"], ["[msrpAllIn]"]); //Only show price section if price is higher than 100 if(parseInt(priceDetails[1].value.replace(/[,$]/g,'')) > 100 && $('#ADMIN_NEW_DONT_SHOW_PRICES').val() != 1 && !$('#ADMIN_NEW_DONT_SHOW_PRICE_MODELS').val().includes(modelid)){ newcarDetails.drawSection('price',$('#textPriceCat').val(),columnTitle, priceDetails); } // step 1: Draw Engine var engineDetails = getCompareEntries( ["textCat41", "textCat42", "textCat48", "textCat49", "textCat81", "textCat804"], ["[41]","[42]", "[48]", "[49]", "[81]", "[804]"]); newcarDetails.drawSection('engine',$('#textEngineCat').val(),columnTitle, engineDetails); // step 2: Draw fuel var fuelDetails = getCompareEntries(["textCat206", "textCat26", "textCat27"], ["[206]","[26]", "[27]"]); newcarDetails.drawSection('fuel',$('#textFuelCat').val(),columnTitle, fuelDetails); if($('#fakeVehicle').val()!=1) { // step 3: Draw tech var techDetails = getCompareEntries(["textCat52", "textCat6", "textCat105", "textCat106"], ["[52]-[53]","[6]", "[105]-[107]","[106]-[108]"]); newcarDetails.drawSection('tech',$('#textTechCat').val(),columnTitle, techDetails); // step 4: Draw wheels var wheelDetails = getCompareEntries(["textCat165", "textCat156", "textCat140"], ["[165]","[156]", "[140]"]); newcarDetails.drawSection('wheel',$('#textWheelCat').val(),columnTitle, wheelDetails); // step 5: Draw security var secDetails = getCompareEntries(["textCat1018", "textCat1228", "textCat1001", "textCat1005", "textCat1062"], ["[1018]","[1228]", "[1001]", "[1005]","[1062]"]); newcarDetails.drawSection('security',$('#textSecCat').val(),columnTitle, secDetails); // step 6: Draw comfort var comfortDetails = getCompareEntries(["textCat1011", "textCat1126", "textCat1180", "textCat1033"], ["[1011]","[1126]", "[1180]", "[1033]"]); newcarDetails.drawSection('comfort',$('#textComfortCat').val(),columnTitle, comfortDetails); // step 7: Draw audio var audioDetails = getCompareEntries(["textCat10689"], ["[10689]"]); newcarDetails.drawSection('audio',$('#textAudioCat').val(),columnTitle, audioDetails); // step 8: Draw warranty var warrantyDetails = getWarrantyInfo(); newcarDetails.drawSection('warranty',document.getElementById('textCompareWarranty').value,columnTitle, warrantyDetails); //interior equipment var textIDs = ["textCatInt21", "textCatInt22", "textCatInt23", "textCatInt24", "textCatInt25", "textCatInt26", "textCatInt27", "textCatInt28", "textCatInt29", "textCatInt43", "textCatInt44"]; var interiorDetailsIDs = ["[21]","[22]", "[23]", "[24]","[25]","[26]", "[27]", "[28]","[29]","[43]", "[44]"]; var interiorDetails = getCompareEntries(textIDs, interiorDetailsIDs, 'cat_interior'); newcarDetails.drawSection('interior', $('#textCompareInt').val(), columnTitle, interiorDetails); //exterior equipment textIDs = ["textCatExt30", "textCatExt31", "textCatExt32", "textCatExt33", "textCatExt34", "textCatExt35", "textCatExt36"]; var exteriorDetailsIDs = ["[30]","[31]", "[32]", "[33]","[34]","[35]", "[36]"]; var exteriorDetails = getCompareEntries(textIDs, exteriorDetailsIDs, 'cat_exterior'); newcarDetails.drawSection('exterior', $('#textCompareExt').val(), columnTitle, exteriorDetails); //mechanical equipment textIDs = ["textCatMech4", "textCatMech6", "textCatMech7", "textCatMech8", "textCatMech10", "textCatMech13", "textCatMech15", "textCatMechMech", "textCatMech20", "textCatMech37", "textCatMech46"]; var mechanicalDetailsIDs = ["[4]","[6]", "[7]", "[8]","[10]","[13]", "[15]", "[17]","[20]","[37]", "[46]"]; var mechanicalDetails = getCompareEntries(textIDs, mechanicalDetailsIDs, 'cat_mechanicals'); newcarDetails.drawSection('mechanicals', $('#textCompareMech').val(), columnTitle, mechanicalDetails); //safety equipment textIDs = ["textCatSafe38", "textCatSafe39", "textCatSafe42"]; var safetyDetailsIDs = ["[38]","[39]", "[42]"]; var safetyDetails = getCompareEntries(textIDs, safetyDetailsIDs, 'cat_safety'); newcarDetails.drawSection('safety', $('#textCompareSafe').val(), columnTitle, safetyDetails); addPromoBtns(); } if($('#vehicleBrochureVisible').val() === '1'){ $('#price_table').parent().css('display', 'flex'); $('#price_table').parent().prepend('
    ' + $('.specsOptions .brochurePoster').parent().html() + '
    '); $('#price_table .divHeading .divCell:first').remove(); $('#price_table .divRow .divCell:first').remove(); $('.brochureCell .brochurePoster').css('display','block'); $('.brochureCell.divCell').css('padding','15px 2.5%'); $('.brochureCell.divCell').css('width','20%'); $('#price_table').css('width','75%'); setTimeout(function(){ //calculate row height which depends of the brochrue height let table_h = $('#price_table').closest('.divTableOuter').height(); let head_h = $('#price_table .divHeading').height(); let row_h = table_h - head_h; $('#price_table .divRow').css('height', row_h + "px"); }, 250); } setVDPCompareToolTip(); }, drawSection: function(section, title, columnTitles, entries) { var titleKey = section + '_title'; var dataKey = section + '_table'; var equipSection = false; var hasPayment = false; switch(section){ case 'interior': case 'exterior': case 'mechanicals': case 'safety': equipSection = true; break; default: break; } var html = "
    "; html += "
    " + title + "
    "; html += "
    "; html += "
    "; html += "
    "; var styleWidthCols, styleWidthFirstCol, styleWidthCell, classTextAlign = ''; if(columnTitles.length == 1 && section != 'price'){ classTextAlign = ' -text-left'; } if(!equipSection){ styleWidthFirstCol = 25; styleWidthCols = (100 - styleWidthFirstCol) / columnTitles.length; html += "
    "; }else{ styleWidthFirstCol = 100 / columnTitles.length; styleWidthCols = styleWidthFirstCol; } var modelid = newcarDetails.activeModel.id; for(var i=0;i'; } html += "
    " + columnTitles[i] + '
    ' + imageThumbnail + "
    "; } html += "
    "; var rows = ''; var cells = ''; var j = 0; for(var i=0; i<= (entries.length); i++){ var classTextAlignFirstCol = ''; styleWidthCell = styleWidthCols; if (i % (columnTitles.length + 1) == 0) { if (i > 0) { if(showRow) rows += "
    " + cells + "
    "; if (i == entries.length) { break; } showRow = false; j++; cells = ''; } if (equipSection == true) { continue; } else { classTextAlignFirstCol = ' -text-left'; styleWidthCell = styleWidthFirstCol; } } var entryValue = entries[i]; if(typeof entries[i] === 'object'){ entryValue = entries[i].value; if(entryValue && entryValue.indexOf('n/') === -1){ showRow = true; } } switch(entryValue){ case "S": entryValue = 'Std'; break; case "O": entryValue = 'Opt'; break; default: break; } var addedAttribute = ''; var discountAmountTooltip = ''; var rebate = 0; var rebatePostTax = 0; var fee = 0; if(section == 'price' && typeof entries[i] === 'object' && (typeof newcarDetails.activeModel.cashRebate !== 'undefined' || typeof newcarDetails.activeModel.customFeeIncentive !== 'undefined' || typeof newcarDetails.activeModel.evCashIncentive !== 'undefined')){ if(typeof newcarDetails.activeModel.cashRebate !== 'undefined'){ discountAmountTooltip += atob(newcarDetails.activeModel.cashRebate[entries[i].styleid]['cash_rebate_note']); discountAmountTooltip = discountAmountTooltip.replace('[##TRIM##]',columnTitles[i - 1]); rebate = newcarDetails.activeModel.cashRebate[entries[i].styleid]['cash_rebate']; rebatePostTax = newcarDetails.activeModel.cashRebate[entries[i].styleid]['cash_rebate_post_tax']; } if(typeof newcarDetails.activeModel.customFeeIncentive !== 'undefined'){ $.each(newcarDetails.activeModel.customFeeIncentive[entries[i].styleid], function(index, value){ if(value.type == 'incentive'){ if(value.postTax == 1){ rebatePostTax += value.cash_amount; } else { rebate += value.cash_amount; discountAmountTooltip += "
    " + ($('body').hasClass('FRENCH') ? atob(value.descFR) : atob(value.descEN)); } } else { fee += value.cash_amount; } }); } if(typeof newcarDetails.activeModel.evCashIncentive !== 'undefined'){ $.each(newcarDetails.activeModel.evCashIncentive[entries[i].styleid], function(index, value){ rebatePostTax += value.amount; discountAmountTooltip += "
    " + ($('body').hasClass('FRENCH') ? decodeURIComponent(escape(atob(value.name_fr))) : decodeURIComponent(escape(atob(value.name_en)))); }); } if(newcarDetails.activeModel.defaultPayment[entries[i].styleid]['payment'] > 0){ hasPayment = true; addedAttribute += " data-type='"+newcarDetails.activeModel.defaultPayment[entries[i].styleid]['type']+"' data-payment='"+newcarDetails.activeModel.defaultPayment[entries[i].styleid]['payment']+"'"; addedAttribute += " data-rate='"+newcarDetails.activeModel.defaultPayment[entries[i].styleid]['rate']+"' data-term='"+newcarDetails.activeModel.defaultPayment[entries[i].styleid]['term']+"'"; addedAttribute += " data-km_allowance='"+newcarDetails.activeModel.defaultPayment[entries[i].styleid]['km_allowance']+"' data-interval='"+newcarDetails.activeModel.defaultPayment[entries[i].styleid]['interval']+"'"; addedAttribute += " data-downpayment='"+newcarDetails.activeModel.defaultPayment[entries[i].styleid]['downpayment']+"'"; addedAttribute += " data-tooltip='"+atob(newcarDetails.activeModel.defaultPayment[entries[i].styleid]['tooltip']).replaceAll("'", "'")+"'"; addedAttribute += " data-calculatedEffectiveRate='"+newcarDetails.activeModel.defaultPayment[entries[i].styleid]['calculatedEffectiveRate']+"'"; } } addedAttribute += "data-fee='"+fee+"' data-cashrebate='"+rebate+"' data-cashRebatePostTax='"+rebatePostTax+"' data-styleid='"+entries[i].styleid+"' data-cashRebateTooltip='"+discountAmountTooltip.replace(/'/g, "'")+"'"; cells += "
    " + entryValue + "
    "; } html += rows; html += "
    "; //close table, outer, wrapper if(section == 'price' && hasPayment){ html += '

    *'+$('#paymentNoticeText').val()+'

    '; } if (typeof $('#' + titleKey).attr('id') != 'undefined') $('#' + titleKey).remove(); if (typeof $('#' + dataKey).attr('id') != 'undefined') $('#' + dataKey).remove(); var divToAppend = (equipSection == true ? 'mainEquipCompareView' : 'mainCompareView'); $(html).appendTo('#' + divToAppend); removeEmptyRows(); }, setupTrimGroupsScrolling: function (container) { container = container || $("#styles-container"); if(container && container.find('.trim-group-list').length > 0) { var scroller = new Scroller(container[0], { listSelector: ".trim-group-list", onUpdateScroll: function () { //DWP-12480: Adjust the positioning of the tech specs popup when scrolling var currentMenuTechSpecs = container.find('.specSheet .menu-tech-specs'); if (currentMenuTechSpecs.length) { var specSheetOriginalLeft = currentMenuTechSpecs.data('original-left'); if (!specSheetOriginalLeft) { specSheetOriginalLeft = currentMenuTechSpecs.position().left; currentMenuTechSpecs.data('original-left', specSheetOriginalLeft); } currentMenuTechSpecs.css('left', specSheetOriginalLeft - this._list.scrollLeft); } } }); } // var list = container.find(".trim-group-list"); // // // if the content is smaller or the same size as the outer width, don't display scrolling // if (list[0].scrollWidth <= list.outerWidth()) { // return; // } // //DWP-12480: set graybox position absolute z-index 1 if there is a scrollbar to prevent trim hover overlapping CTAs // var grayBox = document.querySelector('body#NEWCARDETAILS .graybox'); // if (grayBox && grayBox.style) { // grayBox.style.position = "absolute"; // grayBox.style.zIndex = 1; // } // var scroll = { // position: 0, // speed : 0, // max : (list[0].scrollWidth - list.innerWidth()) + 15, // }; // // var showScroll = function () { // if (list[0].scrollLeft > 0) { // container.find("span[class*='left']").removeClass("hidden"); // } else { // container.find("span[class*='left']").addClass("hidden"); // } // // if (list[0].scrollLeft < scroll.max) { // container.find("span[class*='right']").removeClass("hidden"); // } else { // container.find("span[class*='right']").addClass("hidden"); // } // }; // // showScroll(); // // container.find("span[class*='left']") // .on('mouseover', function () { scroll.speed = -15; }) // .on ('mouseleave', function() { scroll.speed = 0; }); // // container.find("span[class*='right']") // .on('mouseover', function () { scroll.speed = 15; }) // .on ('mouseleave', function() { scroll.speed = 0; }); // // var updateScroll = function () { // if (scroll.speed !== 0) { // scroll.position += scroll.speed / 5; // // if (scroll.position < 0) { // scroll.position = 0; // } // // if (scroll.position > scroll.max) { // scroll.position = scroll.max; // } // // list.scrollLeft(scroll.position); // } // //DWP-12480: Adjust the positioning of the tech specs popup when scrolling // var currentMenuTechSpecs = container.find('.specSheet .menu-tech-specs'); // if (currentMenuTechSpecs.length) { // var specSheetOriginalLeft = currentMenuTechSpecs.data('original-left'); // if (!specSheetOriginalLeft) { // specSheetOriginalLeft = currentMenuTechSpecs.position().left; // currentMenuTechSpecs.data('original-left', specSheetOriginalLeft); // } // currentMenuTechSpecs.css('left', specSheetOriginalLeft - list.scrollLeft()); // } // showScroll(); // window.requestAnimationFrame(updateScroll); // }; // // window.requestAnimationFrame(updateScroll); }, getSelectedTrimGroup: function () { var container = $("#styles-container"); var trimName = container.find("span.active").data("trim"); if(typeof trimName === 'undefined' || trimName == null) { trimName = "all"; } return trimName; }, /** * Filtered vehicle styles * * This method will return a filtered list of styles depending on the selected trim * group (if show all or a specific one) and then will re-order the list according * to their price. * * @param styles * * @return {*} */ filteredVehicleStyles: function (styles) { var group = newcarDetails.getSelectedTrimGroup(); var filteredStyles = styles.filter(function (val) { let cmp = val.englishTrim; //Mazda 2021.5 trim exception let match = val.CFStyleName.match(/(2021[,|.]5)/); if(match){ cmp += (' ' + match[0] || '').replace(',','.'); } return (['all', cmp].includes(group)); }); filteredStyles.sort(function (a, b) { return a.msrpAllIn > b.msrpAllIn; }); return filteredStyles; }, /** * Get override style ID * * This method will find the override style ID if necessary. It will either return the * one in the URL or look for it as a trim group name. When found it will also add the * 'overrideStyleID' attribute to the newcarDetails object. * * @return {any|number} */ getOverrideStyleId: function () { var pathname = window.location.pathname; var htmlFile = decodeURIComponent(pathname.substring(pathname.lastIndexOf('/') + 1)); var group = newcarDetails.getSelectedTrimGroup(); if (htmlFile.indexOf('-id') === -1 && group === "all") { return newcarDetails.getInitialCompareFirstId(); } if (group !== "all") { var styles = newcarDetails.filteredVehicleStyles(newcarDetails.activeModel.styles); return styles[0].id; } var urlStyleID = htmlFile.match("-id(.*).html"); if (urlStyleID === null) { return newcarDetails.getInitialCompareFirstId(); } return urlStyleID[1]; }, getInitialCompareFirstId: function() { if($('#initcomparestyles').length){ var id = $('#initcomparestyles').val().split('|||')[0]; if(id) return id; } return 0; }, getStylesToCompare: function () { // get the first 4 styles in the list var result = newcarDetails.activeModel.styles.slice(0, 4); // if there is an override style, put it first in list if (newcarDetails.overrideStyleID > 0) { result = result.filter( function (val){ return (val.id != newcarDetails.overrideStyleID); }); var style = newcarDetails.activeModel.styles.filter(function (val) { return (val.id == newcarDetails.overrideStyleID); }); if (style.length) { result.unshift(style[0]); } } return result.slice(0, 4); }, getVehicleURL: function (extras) { var make = newcarDetails.activeModel.make; var model = newcarDetails.activeModel.model; var year = newcarDetails.activeModel.year; var extraParam = extras.join(""); if (newcarDetails.overrideStyleID != null && !isNaN(newcarDetails.overrideStyleID) && newcarDetails.overrideStyleID > 0) { make = ($('#textMakeOverride').val() !== '') ? $('#textMakeOverride').val() : make; model = ($('#textModelOverride').val() !== '') ? $('#textModelOverride').val() : model; year = ($('#textYearOverride').val() !== '') ? $('#textYearOverride').val() : year; } make = make.replace(/-/g, '_'); model = model.replace(/[-\s]/g, '_'); if ($('#textLanguage').val() === "ENGLISH") { return year + '-' + make + '-' + model + extraParam + '.html'; } else { return make + '-' + model + '-' + year + extraParam + '.html'; } }, showSpecTooltip: function(styleid, self) { var currentSpecSheet = self.find('.menu-tech-specs'); if (currentSpecSheet && currentSpecSheet.length){ currentSpecSheet.css('opacity', '1'); currentSpecSheet.css('z-index', '12'); return; } var template = $('#menu-specs-template').clone(); $(template).find('.arrow').remove(); $(template).css('display', 'block'); $(template).css('visibility', 'visible'); $(template).css('opacity', '1'); $(template).css('left', '0'); $(template).css('top', '20px'); $(template).css('z-index', '12'); const escapeHTML = str => str.replace(/[&<>"']/g, char => ({'&': '&', '<': '<', '>': '>', '"': '"', "'": '''}[char])); var make = escapeHTML(newcarDetails.activeModel.make); var model = escapeHTML(newcarDetails.activeModel.model); var year = escapeHTML(newcarDetails.activeModel.year); var trimImage = '
    '; $(template).find('h4').after(trimImage); var trim = self.attr('data-trim'); var trimTitle = $('body').hasClass('ENGLISH') ? year + ' ' + model + ' ' + trim : model + ' ' + trim + ' ' + year; $(template).find('h4').css('text-align', 'center'); $(template).find('h4').text(trimTitle); //New VDP page link for trim var specLink = self.find('a').attr('href'); $(template).find('.menu-spec-link').attr('href', specLink); $(template).find('.menu-spec-link').parent().css('text-align', 'center'); //BnP page link for trim var bnpLink = $('#BuildAndPriceActionBoxLink').length ? $('#BuildAndPriceActionBoxLink').attr('href') : ''; if (bnpLink) { var bnpLang = $("html").attr("lang"); var bnpRegex = (bnpLang == 'en' ? /\/build-and-price\/(\d{4}-(\w+)-(\w+).*\.html).*/ : /\/configuration-et-prix\/((\w+)-(\w+)-\d{4}).*\.html/); var bnpMatch = bnpLink.match(bnpRegex); // check if this is local link, if it has this then it's not external. // Support for Ford/Lincoln external BNP if ($("#d2c-bnp-linkrules-textarea").length > 0 && !($("#d2c-bnp-linkrules-textarea").val() == "") && !($("#d2c-bnp-linkrules-textarea").val() == "##LINKRULES##") && (bnpMatch === null)) { $(template).find('.menu-spec-bnp').attr('target', "_blank"); } else { bnpLink = bnpLink.replace('?step=version', ''); bnpLink = bnpLink.replace(/-id[0-9]*/, ''); bnpLink += '?styleid='+styleid; } $(template).find('.menu-spec-bnp').attr('href', bnpLink); var modelTitle = $('body').hasClass('FRENCH') ? escapeHTML(newcarDetails.activeModel.modelfr) : escapeHTML(newcarDetails.activeModel.model); $(template).find('.menu-spec-bnp').html($(template).find('.menu-spec-bnp').html().replace('$MODEL', modelTitle+' '+trim)); $(template).find('.menu-spec-bnp').parent().css('text-align', 'center'); } else { $(template).find('.menu-spec-bnp').parent().remove(); } //Get current style var currentStyle = newcarDetails.getStyleById(styleid); //Price var rpl = $('body').hasClass('FRENCH') ? '$1 ' : '$1,'; var price = parseInt(currentStyle.msrpAllIn); if(typeof newcarDetails.activeModel.customFeeIncentive !== 'undefined'){ $.each(newcarDetails.activeModel.customFeeIncentive[currentStyle.id], function(index, value){ if(value.type == 'incentive'){ /*rebate += value.cash_amount; discountAmountTooltip += "
    " + ($('body').hasClass('FRENCH') ? atob(value.descFR) : atob(value.descEN));*/ } else { price += parseInt(value.cash_amount); } }); } price = Number(price).toFixed(0); var modelid = newcarDetails.activeModel.id; var priceText = price.toString().replace(/(.)(?=(\d{3})+$)/g,rpl); priceText = $('body').hasClass('FRENCH') ? priceText + ' $' : '$'+priceText; if($('#ADMIN_NEW_DONT_SHOW_PRICES').val() == '1' || $('#ADMIN_NEW_DONT_SHOW_PRICE_MODELS').val().includes(modelid)){ priceText = $('#NEW_PRICE_TEXT').val(); } $(template).find('.menu-spec-price').html(priceText); $(template).find('.menu-price-text').text($(template).find('.menu-price-text').text().replace('##MENUYEAR##', currentStyle.year).replace('##MENUMODEL##', currentStyle.name).replace('##MENUTRIM##', currentStyle.trim)); //Horsepower var specHp = newcarDetails.getSpecInfoForStyle(currentStyle, 48); $(template).find('.menu-spec-hp').text(specHp); //Cylinder var specPower = newcarDetails.getSpecInfoForStyle(currentStyle, 42); $(template).find('.menu-spec-power').text(specPower); //Fuel city var specFuelCity = newcarDetails.getSpecInfoForStyle(currentStyle, 26); $(template).find('.menu-spec-fuel-city').text(specFuelCity); //Fuel highway var specFuelHighway = newcarDetails.getSpecInfoForStyle(currentStyle, 27); $(template).find('.menu-spec-fuel-highway').text(specFuelHighway); //Drivetrain var specDrivetrain = newcarDetails.getSpecInfoForStyle(currentStyle, 6); $(template).find('.menu-spec-drivetrain').text(specDrivetrain); //set an initial position, because tabs can horizontally scroll, position will get updated later when scrolling if (self.closest('.trim-group-list').length) { var left = -1 * $('.trim-group-list')[0].scrollLeft; $(template).css('left', left); $(template).data('original-left', left); } self.find('.specSheet').append(template); }, getStyleById: function(styleid){ var retValue = ''; $.each(newcarDetails.allStyles, function(index, value){ if(value.id == styleid){ retValue = value; return false; } }); return retValue; }, getSpecInfoForStyle: function(style, specId){ var retValue = ''; $.each(style.specs, function(index, value){ if(value.id == specId){ retValue = value.value; return false; } }); return retValue; }, getBestPriceBanner: () => { let lang = ($('#activesitelanguage').val() == 'ENGLISH') ? 'en' : 'fr'; // let carData = JSON.stringify({ // make: newcarDetails.activeModel.make, // model: newcarDetails.activeModel.model, // year: newcarDetails.activeModel.year, // styleId : newcarDetails.overrideStyleID || newcarDetails.activeModel.mainstyle, // }); $.ajax({ url: `/${lang}/ajax/getBestPricesBanner`, dataType: 'JSON', type: 'POST', data: { make: newcarDetails.activeModel.make, model: newcarDetails.activeModel.model, year: newcarDetails.activeModel.year, styleId : newcarDetails.overrideStyleID || newcarDetails.activeModel.mainstyle, } }).done( function(data) { let wrapper = document.getElementById('bestPriceBanner'); wrapper.innerHTML = data.html; }); } }; return newcarDetails; })(); function handlePromoBtnClick(){ if($('#promo_title').length>0){ $(document).scrollTop($('#promo_title').offset().top - 100); } if(!Cookies.get('popupFormFilled')){ showPopupWidget(); } } function changeCompareView(view){ if(view == 'specs'){ $('#compareControl div.button_cmp_left').removeClass('button_cmp_inact'); $('#compareControl div.button_cmp_left').addClass('button_cmp_act'); $('#compareControl div.button_cmp_right').removeClass('button_cmp_act'); $('#compareControl div.button_cmp_right').addClass('button_cmp_inact'); $('#mainEquipCompareView').hide(); $('#mainCompareView').show(); } else { removeEmptyRows(); $('#compareControl div.button_cmp_left').removeClass('button_cmp_act'); $('#compareControl div.button_cmp_left').addClass('button_cmp_inact'); $('#compareControl div.button_cmp_right').removeClass('button_cmp_inact'); $('#compareControl div.button_cmp_right').addClass('button_cmp_act'); $('#mainCompareView').hide(); $('#mainEquipCompareView').show(); } } function removeEmptyRows(){ var nonEmptyCols; $('#mainEquipCompareView div.box940_line').each(function(){ nonEmptyCols = 0; $('div', this).each(function(){ nonEmptyCols += (trim($(this).text()) == 'n/d' || trim($(this).text()) == 'n/a' || trim($(this).text()) == '' ? 0 : 1); }); if(nonEmptyCols < 1) $(this).remove(); }); } function submitSpecsNewPdfRequest(){ // Send Mail and open pdf with rebate coupon var subject = $('.emailSubject', '#popupTechSpecsNewDiv').text(); var body = $('.emailBody', '#popupTechSpecsNewDiv').html(); var clientEmail = $("#clientEmail", "#popupTechSpecsNewDiv").val(); var clientPhone = $("#clientSms", "#popupTechSpecsNewDiv").val(); var clientName = $("#clientName", "#popupTechSpecsNewDiv").val(); var make = $('input.brandemail').val() != 'undefined' ? $('input.brandemail').val() : ''; var model = $('input.modelemail').val() != 'undefined' ? $('input.modelemail').val() : ''; var year = $('input.yearemail').val() != 'undefined' ? $('input.yearemail').val() : ''; body = body.replace(/{\$CLIENTEMAIL}/g, clientEmail); body = body.replace(/{\$CLIENTPHONE}/g, clientPhone); body = body.replace(/{\$NAME}/g, clientName); emailHandler.subject = subject; emailHandler.body = body; emailHandler.sendTo = $("#textSendToEmail").val(); emailHandler.sendToADFFormat = $("#textSendToEmailADF").val(); emailHandler.mailID = 'SpecsRequestNew'; emailHandler.userEmail = clientEmail; emailHandler.userPhone = clientPhone; emailHandler.userFirstName = clientName; emailHandler.condition = 'New'; if (make.length > 0) emailHandler.make = make; if (model.length > 0) emailHandler.model = model; if (year.length > 0) emailHandler.year = year; //document.forms['emailmsgfrm_popupTechSpecsNewDiv'].submit(); var thismailSentHandler = getMailSentHandler('_popupTechSpecsNewDiv'); emailHandler.callback = function(Success) { if (Success){ if (typeof thismailSentHandler != 'undefined') { thismailSentHandler.showSuccess(); } } else { if (typeof thismailSentHandler != 'undefined') { thismailSentHandler.showFail(); } } }; emailHandler.sendMail(); // Close new spec popup $("#popupTechSpecsNewDiv").popupize().close(); } function sendSpecsNewPdfRequest(){ $.validity.start(); var isSMS = $("#clientSms", "#popupTechSpecsNewDiv").val().length>0?true:false; if(isSMS){ $("#clientSms", "#popupTechSpecsNewDiv").require().validateMobile(); }else{ $("#clientEmail", "#popupTechSpecsNewDiv").require().validEmailAddress(); } var result = $.validity.end(); if (!result.valid) { alert($('#invalidEmailMessage').val() + '!'); return; } var url = ''; var data = {}; if(!isSMS){ data.email=$("#clientEmail", "#popupTechSpecsNewDiv").val(); url = $('#printPage', "#popupTechSpecsNewDiv").val()+'&email='+data.email; // email lead }else{ url = ($('#textLanguage').val()=="ENGLISH"?'/en':'/fr')+'/ajax/SendSms?wswidth=0'; // sms } data.phone = $("#clientSms", "#popupTechSpecsNewDiv").val(); data.make = $('[name="brand"]').val(); data.model = $('[name="model"]').val(); data.year = $('[name="year"]').val(); $.ajax({ async:false, url: url, data: data, success: function(data){ var res = JSON.parse(data); if(typeof res.message !=='undefined'){ console.log(res.message); // if dealer has no phone number sms supprt no sms will be sent but lead created anyway (submitSpecsNewPdfRequest) } $('#emailSuccessMessage_popupTechSpecsNewDiv span.success').html($('#REQUEST_SENT').val()); submitSpecsNewPdfRequest(); }, failure: function(errMsg) { var msg = saveHandler.failMessage + "\n" + errMsg; console.log('ajax failure',msg); $('#popupTechSpecsNewDiv .close-reveal-modal').trigger('click'); }, error:function (xhr, ajaxOptions, thrownError){ $('#popupTechSpecsNewDiv .close-reveal-modal').trigger('click'); console.log('ajax error',xhr.responseText); } }); } function showSpecsRequestNewPopup() { $("#popupTechSpecsNewDiv").popupize().setTrigger("click").open(); } function onYouTubeIframeAPIReadySlider() { yt_players = {}; $(".ytplayer").each(function() { yt_players[this.id] = new YT.Player(this.id, {events:{'onStateChange': onPlayerStateChange}}); }); } function onYouTubeIframeAPIReady() { if($('#newVdpFullwidthVideoIframe').length == 0){ onYouTubeIframeAPIReadySlider(); } else { onYouTubeIframeAPIReadyFullwidth(); } } function pauseAllVideos(){ $.each(yt_players, function(){ this.pauseVideo(); }); $(".mp4player").each(function(){ $(this)[0].pause(); }); } function trackVideoPlay(event) { var title = $('.brandemail[name="brand"]').val() + '-' + $('.modelemail[name="model"]').val() + '-' + $('.yearemail').val(); var category = 'Videos'; trackEvent(category, 'Neufs', title); } function videoPause(event) { var title = $('.brandemail[name="brand"]').val() + '-' + $('.modelemail[name="model"]').val() + '-' + $('.yearemail').val(); trackEvent('Pause', title); } function videoEnd(event) { var title = $('.brandemail[name="brand"]').val() + '-' + $('.modelemail[name="model"]').val() + '-' + $('.yearemail').val(); trackEvent('Ended', title); } function trackVirtualTour(){ var title = $('.brandemail[name="brand"]').val() + '-' + $('.modelemail[name="model"]').val() + '-' + $('.yearemail').val(); var category = 'Visites virtuelles'; trackEvent(category, 'Neufs', title); } function trackEvent(category, action, title) { //@DWP-10393: 24-11-2022, GA4 wont use send_to, so event will be pushed to all accouns when not mentionning specific one gaTrack('_trackEvent', category, action, title, 1); } function promoAlerts(){ if( $('#promoAlert_enabled').length < 1 || !$('#promoAlert_enabled').val()){ return false; } var promoAlert = { message: $('#promoAlert_msg').val(), redirect: $('#promoAlert_url').val(), bg_color: $('#promoAlert_bgcolor').val().replace('#', ''), txt_color: $('#promoAlert_txtcolor').val() } var hexToRgb = function(hex) { var bigint = parseInt(hex, 16); var r = (bigint >> 16) & 255; var g = (bigint >> 8) & 255; var b = bigint & 255; return r + "," + g + "," + b; } var showMessage = function( message ){ if( $('#sliderPromoAlert').length > 0 ){ $('#sliderPromoAlert').html( 'X' + message); } else { if( $('#slider-pro-12 .slide-wrapper').length > 0 ){ $('#slider-pro-12 .slide-wrapper').append('
    '); $('#sliderPromoAlert').html( '' + message); } } var width = $('.slide-wrapper').width() - 16; // can be 2 sliders (banner slider and wehicle image slider. $('#sliderPromoAlert').css({ position: 'absolute', background: 'rgba(' + hexToRgb(promoAlert.bg_color) + ',0.75)', zIndex: 99, color: promoAlert.txt_color, padding:'8px', top:'0px', right:'0px', left:'0px', cursor:'pointer' }).on('click', function(){ if(promoAlert.redirect.length > 5){ window.location.href = promoAlert.redirect; } else { showPopupWidget() } }); $('#sliderPromoAlert .closeAlert').css({ color: promoAlert.txt_color, 'text-decoration': 'none', 'float': 'right' }).one('click', function(){ $('#sliderPromoAlert').slideUp(); return false; }); return true; } showMessage(promoAlert.message); } window.addEventListener("message", function (e) { if(e.origin !== window.location.origin) return; if(e.data=='gwdBannerClicked'){ dynamicBannerClicked(1); } if(e.data=='gwdBannerClickedInv'){ dynamicBannerClicked(2); } }); function dynamicBannerClicked(action){ var title = $('.brandemail[name="brand"]').val() + '-' + $('.modelemail[name="model"]').val() + '-' + $('.yearemail').val(); //@DWP-10393: 24-11-2022, GA4 wont use send_to, so event will be pushed to all accouns when not mentionning specific one gaTrack('_trackEvent', 'New-VDP-Outbound-clicks', 'Banniere du haut', title); //@DWP-10393: 24-11-2022, GA4 wont use send_to, so event will be pushed to all accouns when not mentionning specific one gaTrack('_trackEvent', 'Cliques Banniere', 'Neuf-VDP', 'Popup', 1); if(action==2){ showInventoryPopup(); }else{ showPopupWidget(); } } function showPopupTrim(trim){ emailHandler.trim = trim; showPopupWidget(); } function addPromoBtns(){ var trimsBtn = []; var price_table = $('#price_table'); $('.divHeading .compareTableTrimTitle', price_table).each(function(i,v){ if(i>0) trimsBtn[i] = $(this).html().replace(/'/g,'\'').replace(/"/g,'\"'); }); $('.divRow .divCell[cell-id!="0"]', price_table).each(function(ii,vv){ var obj = $(this); obj.html( getPriceHTML( obj ) ); if( $('#carPrice').hasClass('strike-price') ) { obj.addClass('strikeadded'); } if($('#promoDiscoverButton').length){ obj.append('
    '+($('body').hasClass('FRENCH')?'Voir offre!':'See offer!')+'
    '); } }); } function getPriceHTML( obj ){ var price = obj.html(); var price = parseFloat(price.replace(/[$,]/g,'')); var fee = obj.attr('data-fee'); fee = parseFloat(fee); price = price + fee; var cashRebate = obj.attr('data-cashrebate'); var cashRebatePostTax = obj.attr('data-cashRebatePostTax'); cashRebate = parseFloat(cashRebate); cashRebatePostTax = parseFloat(cashRebatePostTax); var priceWithRebate = price - cashRebate; var styleid = obj.attr('data-styleid'); //DWP-10535 var luxeTaxeAmount = 0; var noLuxeTaxStyleIdString = $('#NOLUXETAXSTYLEID').val(); var noLuxeTaxStyleId = noLuxeTaxStyleIdString.split('|'); if($('#INCLUDE_LUXURY_TAX_CHECK_NEW').val() == '1' && !noLuxeTaxStyleId.includes(styleid)){ if(priceWithRebate != price && priceWithRebate > 0){ luxeTaxeAmount = getLuxuryTaxAmount(priceWithRebate); priceWithRebate += luxeTaxeAmount; } else { luxeTaxeAmount = getLuxuryTaxAmount(price); price += luxeTaxeAmount; } } var rpl = $('body').hasClass('FRENCH') ? '$1 ' : '$1,'; var priceText = price.toString().replace(/(.)(?=(\d{3})+$)/g,rpl); var cashRebateText = cashRebate.toString().replace(/(.)(?=(\d{3})+$)/g,rpl); cashRebateText = `- ${D2CUtils.Format.toPrice(cashRebateText)}`; var cashRebatePostTaxText = cashRebatePostTax.toString().replace(/(.)(?=(\d{3})+$)/g,rpl); cashRebatePostTaxText = `- ${D2CUtils.Format.toPrice(cashRebatePostTaxText)}`; priceWithRebate = priceWithRebate.toString().replace(/(.)(?=(\d{3})+$)/g,rpl); priceWithRebate =D2CUtils.Format.toPrice(priceWithRebate); var currentIndex = obj.attr('cell-id'); var addedClass = (($('#carPrice').hasClass('strike-price') || $('#carPricePromo').hasClass('strike-price'))) ? 'strike-price' : ''; var html = `${priceText}`; if(cashRebate > 0){ if($('#ADMIN_NEW_DONT_SHOW_REBATE').val() != 1){ html += ''+cashRebateText+''; } var addedClassRebate = (($('#carPrice').hasClass('strike-price') || $('#carPricePromo').hasClass('strike-price')) && 0) ? 'class="strike-price"' : ''; html += ''+priceWithRebate+''; } if($('#INCLUDE_LUXURY_TAX_CHECK_NEW').val() == '1' && luxeTaxeAmount > 0){ var luxeTaxDisclaimerText = $('#INCLUDE_LUXURY_TAX_CHECK_NEW_TEXT').val(); var luxeTaxeAmountText = luxeTaxeAmount.toString().replace(/(.)(?=(\d{3})+$)/g,rpl); luxeTaxeAmountText = $('body').hasClass('FRENCH') ? luxeTaxeAmountText + ' $' : '$'+luxeTaxeAmountText; html += '
    '+luxeTaxDisclaimerText+' ' + luxeTaxeAmountText+'
    '; } if($('#ADMIN_PRICE_DISCLAIMER_NEW_CHECK').val() == 1 && $('#ADMIN_PRICE_DISCLAIMER_NEW_TEXT').val() != ''){ var priceDisclaimerText = $('#ADMIN_PRICE_DISCLAIMER_NEW_TEXT').val(); html += '
    '+priceDisclaimerText+'
    '; } if(cashRebatePostTax > 0 && $('#ADMIN_NEW_DONT_SHOW_REBATE').val() != 1){ var rebateText = $('body').hasClass('FRENCH') ? 'Rabais au comptant jusqu\'à : ' : 'Cash rebate up to : '; html += ''+rebateText+'
    '+cashRebatePostTaxText+'
    '; } var payment = obj.attr('data-payment'); payment = parseFloat(payment); if(payment > 0){ if($('#roundPayment').val() == '1'){ payment = Math.round(payment); payment = payment.toFixed(0); } else { payment = payment.toFixed(2); } payment = payment.replace(/\.([0-9]*)/,function( a, b ){ return ''+b+''; }); var term = obj.attr('data-term'); var interval = obj.attr('data-interval'); var type = obj.attr('data-type'); var rate = obj.attr('data-rate'); var downpayment = obj.attr('data-downpayment'); var calculatedeffectiverate = obj.attr('data-calculatedeffectiverate'); var effectiveRateHTML = ''; if ((calculatedeffectiverate - rate) > 0) { calculatedeffectiverate = ''+calculatedeffectiverate+' %'; let effectiveRateText = (activeLang == 'ENGLISH' ? calculatedeffectiverate+ ' APR' : 'Taux '+calculatedeffectiverate); effectiveRateHTML='
    ( ' + effectiveRateText + ' )
    '; } if ($('#paymentCalculatorStrikePayment').val() == '1' && $('#paymentCalculatorStrikePaymentOption').val() == 'blur'){ payment = ''+payment+''; } var taxeText = $('#disclaimerPriceText').val() != '' ? $('#disclaimerPriceText').val() : '+tx'; var line1Text = type == 'leasing' ? ($('body').hasClass('FRENCH') ? 'Location '+term+' mois' : 'Leasing '+term+' months') : ($('body').hasClass('FRENCH') ? 'Financement '+term+' mois' : 'Financing '+term+' months'); var intervalText = interval == 'weekly' ? ($('body').hasClass('FRENCH') ? 'sem' : 'week') : (interval == 'biweekly' ? ($('body').hasClass('FRENCH') ? '2sem' : '2weeks') : ($('body').hasClass('FRENCH') ? 'mois' : 'month')); var line3Text = `${taxeText}/${intervalText} ${downpayment}` + ($('body').hasClass('FRENCH') ? 'comptant' : 'down payment'); var line1 = '
    '+line1Text+'
    '; var line2 = '
    ' + payment + ' @ '+ rate +' %*'+effectiveRateHTML+'
    '; var line3 = '
    '+line3Text+'
    '; html += '
    '; html += '
    '+line1+line2+line3+'
    '; } return html; } $(document).ready(function() { $(".paymentCalculatorVDP").darkTooltip({ theme: 'light', trigger: 'hover', animation: 'flipIn' }); addPromoBtns(); if($('BODY.isFullWidthPage').length > 0) { if (window.innerWidth > 1300) { gCarSliderDimension.width = 800; gCarSliderDimension.height = 600; gCarSliderDimension.videoHeight = 75; } $(window).on('resize', function () { if (window.innerWidth > 1300) { gCarSliderDimension.width = 800; gCarSliderDimension.height = 600; gCarSliderDimension.videoHeight = 75; } else { gCarSliderDimension.width = 640; gCarSliderDimension.height = 480; gCarSliderDimension.videoHeight = 100; } }); } if($('#fakeVehicle').val()==1 || $('#ADMIN_NEW_DONT_SHOW_PRICE_MODELS').val().includes($('#currentModelId').val())) { powVars = undefined; $('#pullouts').remove(); } (new Form()).maskPhone('#popupTechSpecsDiv #clientSms, #popupTechSpecsNewDiv #clientSms'); var logQualifiedVDP = function(){ if ( typeof activeUserProfileMng != 'undefined' && typeof activeUserProfileMng.logPageViewEvent != 'undefined') { activeUserProfileMng.logPageViewEvent('QUALIFIED_VDP', 'NEW'); } } //log QUALIFIED_VDP page view if page time is over 30sec. setTimeout(logQualifiedVDP, 30000); $('#topBannerImage').on('click',function(e){ var title = $('.brandemail[name="brand"]').val() + '-' + $('.modelemail[name="model"]').val() + '-' + $('.yearemail').val(); //@DWP-10393: 24-11-2022, GA4 wont use send_to, so event will be pushed to all accouns when not mentionning specific one gaTrack('_trackEvent', 'New-VDP-Outbound-clicks', 'Banniere du haut', title); }); if(Cookies.get('inventoryNewPopupShown')==1){ $("#usedInventoryNewPage").show(); } if(typeof $('#usedInventoryNewPage').html() !="undefined" && $('#usedInventoryNewPage').html().length > 10){ $('#inventory_button').show(); }else{ $('#inventory_button').hide(); } try{ Cookies.remove("activevehicle", "/"); $('img[errorimg]').on('error', function(){ this.src = $(this).attr('errorimg'); }); }catch(ex){ console.log( ex.message, ex ); } newcarDetails.loadVehicle(); yt_players = {}; setTimeout( promoAlerts, 5000); if($('#promoDiscoverButton').length){ var promoBtnText = $('#promoDiscoverButton').find('b').find('m1').text().trim(); promoBtnText = promoBtnText ? promoBtnText : $('#promoDiscoverButton').text().trim(); gaTrack('b._trackEvent', 'New VDP CTA', promoBtnText, "Button views", 1); gaTrack('c._trackEvent', 'New VDP CTA', promoBtnText, "Button views", 1); $('#promoDiscoverButton').on('click', function(){ gaTrack('b._trackEvent', 'New VDP CTA', promoBtnText, "Button clicks", 1); gaTrack('c._trackEvent', 'New VDP CTA', promoBtnText, "Button clicks", 1); }); } //DWP-4170 Tracking New VDP's based on standard or full-width page and user screen resolution var pageWidth = window.screen.availWidth; var pageType = $('#isFullWidthPageNewVDP').val() == '1' ? 'Wide VDP' : 'Normal VDP'; if(pageWidth > 1200){ pageType = '>1200px - '+pageType; } else { pageType = '<1200px - Normal VDP'; } var buttonPosition = $('#newVDPButtonPosition').val(); var dealerName = $('#newVDPDealerName').val(); gaTrack("b._trackEvent", "New-VDP-Desktop-Layout-CR", pageType+'-'+buttonPosition, dealerName+'-'+pageType+'-PageView', 1); gaTrack("c._trackEvent", "New-VDP-Desktop-Layout-CR", pageType+'-'+buttonPosition, dealerName+'-'+pageType+'-PageView', 1); ////DWP-4246 Get new VDP used car related to the make model of the page var urlParams = getUrlVars(); if (urlParams.hasOwnProperty('modelnoyear') && urlParams['modelnoyear'] == 'yes'){ initNewVDPUsedCarByMakeModel(); $('#modelNoYearSectionList li').on('click', function(){ var section = $(this).attr('data-section'); getNewVDPUsedCarByMakeModel(section, false); $('.modelnoyearButtonList li').removeClass('modelnoyearButtonSelected'); $(this).addClass('modelnoyearButtonSelected'); }); } setCashRebateToolTip(); //Move tradesii widget in new VDP if($('.tradesii-root').text().length > 0){ setTradesiiVDP(); } else { setTimeout(function(){ setTradesiiVDP(); }, 2000) } //Move new tradesii widget in new VDP if($('.av_tradein_root').text().length > 0){ setNewTradesiiVDP(); } else { setTimeout(function(){ setNewTradesiiVDP(); }, 2000) } }); //Move tradesii widget in new VDP function setTradesiiVDP() { if ($('.tradesii-root').text().length == 0) return; $('#EvalActionBoxLink').hide(); $('#newVDPDoubleBar').before($('.tradesii-root')); $('.tradesii-root').hide(); $('.tradesii-root').prop('hidden', false); $('.tradesii-widget-xs-float-collapse').remove(); $('.tradesii-root').css('margin', '10px auto 20px'); $('.tradesii-root').css('display', 'table'); $('.tradesii-root').css('position', 'relative'); $('.tradesii-root').css('bottom', '0'); $('.tradesii-root').css('left', '0'); $('.tradesii-root').css('z-index', '10'); if(window.innerWidth > 1300 && $('BODY.isFullWidthPage').length > 0 && $('BODY.isPageFullWidthEnabled').length > 0){ //full width $('.tradesii-widget-xs-float').css('width', '329px'); } else { $('.tradesii-widget-xs-float').css('width', '275px'); $('.tradesii-widget__header-text').css('padding-left', '0'); $('.tradesii-widget__header-text').css('margin-left', '-10px'); } $('.tradesii-root').show(); } //Move new tradesii widget in new VDP function setNewTradesiiVDP() { if ($('.av_tradein_root').text().length == 0) return; $('#EvalActionBoxLink').hide(); $('#newVDPDoubleBar').before($('.av_tradein_root')); $('.av_tradein_root').hide(); $('.av_tradein_root').prop('hidden', false); $('.tradesii-widget-xs-float-collapse').remove(); $('.av_tradein_root').css('margin', '10px auto 20px'); $('.av_tradein_root').css('display', 'table'); $('.av_tradein_root').css('position', 'relative'); $('.av_tradein_root').css('bottom', '0'); $('.av_tradein_root').css('left', '0'); $('.av_tradein_root').css('z-index', '10'); if(window.innerWidth > 1300 && $('BODY.isFullWidthPage').length > 0 && $('BODY.isPageFullWidthEnabled').length > 0){ //full width $('.tradesii-widget-xs-float').css('width', '352px'); } else { $('.tradesii-widget-xs-float').css('width', '275px'); $('.tradesii-widget__header-text').css('padding-left', '0'); $('.tradesii-widget__header-text').css('margin-left', '-10px'); } $('.av_tradein_root').show(); } function setCashRebateToolTip(){ try { var gravity = $('.newVdpActions').hasClass('west') ? 'west' : 'east'; var message = $('#carPriceDiscToolTip').attr('data-tooltip'); $('#carPriceDiscToolTip').darkTooltip({ content: message, gravity: gravity, theme: 'light', trigger: 'hover', animation: 'flipIn' }); var message = $('#carPriceDiscToolTipIcon').attr('data-tooltip'); $('#carPriceDiscToolTipIcon').darkTooltip({ content: message, gravity: gravity, theme: 'light', trigger: 'hover', animation: 'flipIn' }); if($('.cashRebatePostTaxAmount').length){ var messagePostTax = $('.cashRebatePostTaxAmount').attr('data-tooltip'); $('.cashRebatePostTaxAmount').darkTooltip({ content: messagePostTax, gravity: gravity, theme: 'light', trigger: 'hover', animation: 'flipIn' }); } var messagePayment = $('.paymentWrapper').attr('data-tooltip'); $('.paymentWrapper').darkTooltip({ content: messagePayment, gravity: gravity, theme: 'light', trigger: 'hover', animation: 'flipIn' }); var messagePayment = $('.vdpPaymentTooltip').attr('data-tooltip'); $('.vdpPaymentTooltip').darkTooltip({ content: messagePayment, gravity: gravity, theme: 'light', trigger: 'hover', animation: 'flipIn' }); var messagePayment = $('.vdpInfoTooltip').attr('data-tooltip'); $('.vdpInfoTooltip').darkTooltip({ content: messagePayment, gravity: gravity, theme: 'light', trigger: 'hover', animation: 'flipIn' }); var messageFee = $('#carPriceInitialToolTipIcon').attr('data-tooltip'); $('#carPriceInitialToolTipIcon').darkTooltip({ content: messageFee, gravity: gravity, theme: 'light', trigger: 'hover', animation: 'flipIn' }); } catch(err) { } setPaymentTooltipsUsedSrp(); } function setPaymentTooltipsUsedSrp(){ $(document).on('mouseenter mouseleave', '.carBoxOuter', function(){ try { if($(this).data('tooltipCreated')) { return false; } $(this).data('tooltipCreated', 1); var messagePayment = $(this).find('.divCarPaymentContainerTooltip').attr('data-tooltip'); if(messagePayment){ messagePayment = atob(messagePayment); messagePayment = $('