{"version":3,"sources":["utils.js","Helpers/summaryconstants.js","stories/helpers/httpRequest.js","Services/ApiService.js","Services/Cache.js","Services/PostCache.js","Services/TcciService.js","Helpers/gtmHelper.js","Services/OcaService.js","financeUtils.js","Helpers/summarycalculator.js","Helpers/BuildHelper.js","Helpers/navhelper.js","Helpers/helpers.js","Components/1_Atoms/Svg/Svg.js","Components/3_Organisms/Nav/Nav.js","Components/3_Organisms/Modal/Modal.js","Components/1_Atoms/Button/Button.js","Components/2_Molecules/Tabs/TabsMenu.js","Components/3_Organisms/Modal/Modal_50_50.js","Helpers/tooltipHelper.js","Components/1_Atoms/Tooltip/Tooltip.js","Components/2_Molecules/AccessoryCard/AccessoryCard.js","Components/2_Molecules/Collapse/CollapseLegal.js","Components/3_Organisms/Pricing/Pricing.js","Components/3_Organisms/Modal/PreOrderModal.js","Components/3_Organisms/Alert/Alert.js","Components/3_Organisms/AccessoriesList/AccessoriesList.js","Components/2_Molecules/Jelly/Jelly.js","Components/5_Pages/Vehicles/Vehicles.js","Components/2_Molecules/360View/360View.js","Components/2_Molecules/360InteriorView/360InteriorView.js","Components/3_Organisms/360Container/360Container.js","Components/2_Molecules/Collapse/Collapse.js","Components/3_Organisms/TrimList/TrimList.js","Components/5_Pages/Trim/Trim.js","Components/2_Molecules/Collapse/CollapseList.js","Components/3_Organisms/Modal/OcaModal.js","Components/3_Organisms/Modal/ReserveModal.js","Components/3_Organisms/Financial/Financial.js","Components/2_Molecules/SpecsItem/SpecsItem.js","Components/3_Organisms/BuildSpecs/BuildSpecs.js","Components/3_Organisms/Accessories/Accessories.js","Components/2_Molecules/Collapse/CollapseSpecs.js","Components/3_Organisms/FeaturedSpecs/FeaturedSpecs.js","Components/3_Organisms/Packs/Packs.js","Components/5_Pages/Summary/Summary.js","Components/2_Molecules/EngineCard/EngineCard.js","Components/2_Molecules/PackageCard/PackageCard.js","Components/5_Pages/Option/Option.js","Components/2_Molecules/ColourCard/ColourCard.js","Components/5_Pages/Colours/Colours.js","Components/2_Molecules/WheelCard/WheelCard.js","Components/3_Organisms/WheelsList/WheelsList.js","Components/3_Organisms/WheelsImageContainer/WheelsImageContainer.js","Components/5_Pages/Wheels/Wheels.js","Components/5_Pages/Connectivity/Connectivity.js","Components/2_Molecules/Collapse/CollapseFinance.js","Components/2_Molecules/FinanceOptions/FinanceOptions.js","Components/2_Molecules/Collapse/CollapseLease.js","Components/2_Molecules/Collapse/CollapseLeaseMileage.js","Components/2_Molecules/LeaseOptions/LeaseOptions.js","Components/2_Molecules/CashOptions/CashOptions.js","Components/3_Organisms/Modal/TradeInModal.js","Components/2_Molecules/PricePayment/PricePayment.js","Components/5_Pages/Payments/Payments.js","Components/5_Pages/Protection/Protection.js","App.js","reportWebVitals.js","i18n.js","index.js"],"names":["getLang","document","querySelector","content","getProvince","window","location","href","includes","sessionStorage","getItem","dealerVars","JSON","parse","dealerProvinceCode","setCursorWaiting","isWaiting","style","cursor","getLoading","isLoading","t","bnp_under_maintenance","className","ReactHtmlParser","getMazdaFeesAndLeviesDetailTitle","title","getParams","str","queryString","keyValPairs","params","replace","length","pairNum","split","key","push","getApiBaseUrl","host","indexOf","process","getBaseUrl","protocol","get360Data","visual","exterior","interior","extCode","code","interiors","default_exterior","intCode","exteriors","baseAssetPath","file_path","imageAmount","end_index","filename_prefix","imageName","include_in_360","imagePath","find","currInt","filename","imagePathInterior","formatPrice","amount","noRounding","undefined","isNaN","fractions","locale","Number","toLocaleString","currency","minimumFractionDigits","maximumFractionDigits","convertNum","num","getFinanceWeekly","rate","term","testRate","result","Math","pow","getLeaseBiWeeklyFromOptions","ceil","getLeaseBiWeeklyFromMsrp","financialObj","subtotal","adminServiceFees","endValueLease","residual","element","goToTop","body","scrollTop","documentElement","getIncentiveDisplayName","incentive","type","getDisplayableProvinceName","toLowerCase","buildLegalContent","legalContentObject","legalIncentiveObject","legalContent","map","item","copy","hideCmsHiddenBlock","shownBlocks","querySelectorAll","forEach","e","classList","remove","add","hiddenBlocks","hideCmsFooterHiddenBlock","getCmsAwardsBlockFromCMS","year","carline","outerHTML","updateLanguageLink","languageLink","getElementById","hash","newLanguage","text","hashIndexPosition","substring","newHash","SummaryConstants","handleRequest","url","data","a","axios","method","headers","responseData","handleJsonRequest","ApiService","language","province","mockedModels","some","startsWith","mock","require","Object","assign","financial","this","model_years","model","insertMockData","url_slug","dataToReturn","trims","trim","models","option","packageCode","based_on","model_code","optionCode","fullModelCode","requestData","stringify","buildId","dealerId","NodeCache","Cache","_cache","stdTTL","cache","flushAll","res","queryParams","bodyParams","ReferenceError","Array","isArray","TypeError","queryObject","bodyObject","req","config","keys","elem","set","get","PostCache","cachedUrls","_axios","_cachedUrls","cacheable","cached","Promise","resolve","status","statusText","request","providerCalls","post","response","queryKeys","TcciService","postCache","summaryCalculator","SelectedColourExterior","SelectedColourInterior","totalAccessoriesResidualValue","entries","SelectedAccessories","accessory","residualValue","residual_value","round","Identifier","QuoteResponse","setCachedUrls","requestOptions","console","log","withFees","withRebates","productKey","loyaltyChecked","graduateChecked","militaryChecked","firstTimeOwnerChecked","selectedAnnualMileage","SelectedModel","FinancialInfo","mazdaCashIncentive","incentive_programs","filter","fee","price","loyaltyPriceRate","LoyaltyChecked","x","rate_value","loyaltyPrice","cash_value","graduatePrice","GraduateChecked","value","militaryPrice","MilitaryChecked","firstTimeOwnerPrice","FirstTimeOwnerChecked","incentives","calculatedFinance","specialIncentives","modelCode","SelectedPackage","option_code","annualMileage","baseMSRP","msrp","options","SelectedWheel","SelectedNonModelPackage","SelectedWarrantyPackage","SelectedConnectedVehiclePackage","SelectedAddedProtectionPackage","SelectedAppearanceProtectionPlansPackage","accessories","total","totalMSRP","exciseTax","freight","pde","acTax","amvic","omvic","tireStewardshipFee","oil","tradeInVal","parseInt","_tradeInValue","maxDownPayment","DownPaymentValue","downPaymentValue","TradeInValue","IncludeFees","balanceToFinance","calculatedLease","leaseEndValue","balanceToFinanceNoFees","leaseEndValueNoFees","parseFloat","toFixed","getResidualTotal","_downPaymentValue","leaseServiceFees","firstTimeOwner","buildBodyJson","leaseObject","weekly","Lease","Quote","WeeklyPayment","biWeekly","BiWeeklyPayment","monthly","MonthlyPayment","weeklyWithTaxes","WeeklyPaymentWithTaxes","biWeeklyWithTaxes","BiWeeklyPaymentWithTaxes","monthlyWithTaxes","MonthlyPaymentWithTaxes","leaseRate","LeaseRate","Freight","Pde","airConditioningTax","AirConditioningTax","omvicFee","OmvicFee","amvicFee","AmvicFee","TireStewardshipFee","oilFilterFee","OilFilterFee","ppsa","Ppsa","leaseDealerServiceFee","LeaseDealerServiceFee","leaseRateDiscounted","LeaseRateDiscounted","isLoyaltyCustomer","IsLoyaltyCustomer","hasError","HasError","capitalizedCost","CapitalizedCost","residualAmount","ResidualAmount","loanObject","Loan","costOfBorrowing","CostOfBorrowingWithoutTaxes","costOfBorrowingWithTaxes","CostOfBorrowing","aprRate","AprRate","loanPeriod","LoanPeriod","aprRateDiscounted","AprRateDiscounted","loanAmount","LoanAmount","gstAmount","GstAmount","pstAmount","PstAmount","GTMHelper","pushToGTMDataLayer","dataLayer","err","isSimple","showPrevious","selectedVehicle","steps","GTMData","step","action","CurrentStep","event","previous","PreviousStep","engine","_selectedColourInterior","_selectedColourExterior","wheel","_selectedWheel","_selectedAccessories","name","calculatedCash","OcaService","lease","loan","ocaRetry","NaN","oca_url","delay","ms","setTimeout","financeType","default360","_selectedExteriorColour","_colours","static_content_base_path","_current360Rotation","filename_suffix","_ocaService","cashPrice","_language","payment","balanceToFinanceWithFeesTaxed","Program_End_datetime","downPayment","apr","sellingPrice","monthlyDepreciation","totalInterestCost","interestFactor","baseMonthlyPayment","gstHSTRate","gstHSTAmountOnRental","totalMonthlyPayment","adjustedCapitalizedCost","PSTRate","PSTAmount","gtmHelper","updateSingleLineFromFinancialProvider","trackingID","cookie","pop","shift","trackingParam","bnsParam","at","balanceToFinanceWithFeesWithRebatesTaxed","balanceToLeaseWithFeesWithRebatesTaxed","setGTM","payload","vehicle","exitUrl","open","RATE","periods","present","future","guess","y0","y1","x0","epsMax","x1","f","i","abs","exp","SummaryCalculator","_allDataIsLoaded","_apiService","_tcciService","Date","getFullYear","selectedLanguage","_availableTrims","_selectedModelYear","_selectedTrim","_selectedTrimIndex","_loyaltyChecked","_militaryChecked","_graduateChecked","_firstTimeOwnerChecked","_accessoriesValue","_annualMileage","_financeTerm","_leaseTerm","_financeTermIndex","_leaseTermIndex","_pstRate","_gstRate","_financialInfo","_initialFinancial","_engineAndDrivetrain","_selectedModelIndex","_selectedModel","_packages","_selectedPackage","_selectedNonModelPackage","_selectedWarrantyPackage","_selectedConnectedVehiclePackage","_selectedAddedProtectionPackage","_selectedAppearanceProtectionPackage","_selectedPackageIndex","_selectedNonModelPackageIndex","_selectedWarrantyIndex","_selectedConnectedVehicleIndex","_selectedAddedProtectionIndex","_selectedAppearanceProtectionIndex","_selectedAppearanceProtectionPlanPackageIndex","_selectedColourInteriorIndex","_selectedColourExteriorIndex","_allowedColoursExterior","_wheels","_selectedWheelIndex","_accessories","_categories","_selectedCategory","_incentives","_includeFees","_includeTaxes","_includeRebates","_currentStep","_previousStep","_showFinancePrice","_currentCalculatedCash","_currentPurchaseMethod","_instance","setItem","Constants","SelectedTrim","getFinanceObjectWithCalculations","tempValue","SelectedTrimIndex","AvailableTrim","trim_type","setSelectedModelIndex","EngineAndDrivetrain","finance","loadEngineAndDrivetrain","SelectedModelIndex","loadPackages","loadColours","loadWheels","loadAccessories","loadPayments","loadSummary","loadSpecsData","SelectedAppearanceProtectionIndex","loanVals","leaseVals","setOcaData","financeValues","financeTerm","leaseValues","leaseTerm","ocaField","bnsValues","QuoteItems","Key","Value","hasData","financeTermToBeDisplayed","leaseTermToBeDisplayed","forceContactDealer","loanHasError","getLoanResponsesHasError","leaseHasError","getLeaseResponsesHasError","objectsArray","every","obj","hasCommunicationError","hasDataError","updateAllLineFromFinancialProvider","FinanceTerm","FinanceTermIndex","LeaseTerm","LeaseTermIndex","updateSingleLeaseLineItem","updateSingleLoanLineItem","sendDataToService","IncludeRebates","AnnualMileage","getTemporaryLeaseResponse","GstPercentage","PstRate","extractLeaseData","extraDataResponse","downPaymentLeaseEndValue","getResidualAmountFromLeaseData","getTemporaryLoanResponse","extractLoanData","updateAllLoanLinesFromFinancialProvider","updateAllLeaseLinesFromFinancialProvider","all","financeElement","extractedData","index","findIndex","newObject","catch","leaseElement","packages","Packages","default_option","pack","SelectedPackageIndex","universalPackages","SelectedNonModelPackageIndex","warrantyPackages","package_type","SelectedWarrantyIndex","connectivityPackage","connected_services","subscription","subscriptionindex","SelectedConnectedVehicleIndex","added_protection","plans","planIndex","SelectedAddedProtectionIndex","appearanceProtectionPlan","appearance_protection","SelectedAppearanceProtectionPlansIndex","packageIndex","appearanceProtectionPlansPackage","SelectedColourInteriorIndex","Colours","SelectedColourExteriorIndex","InitialFinancial","Wheels","wheels","SelectedWheelIndex","SelectedCategory","toString","removeItem","IncludeTaxes","isProvinceAllowedToIncludeRebates","Current360Rotation","toLocaleLowerCase","reset","isRetailerMode","RecalculateFinancialInfo","Incentives","getIncentives","defaultTrimIndex","loadTrims","getDefaultTrimIndex","trimIndex","setSelectedTrimIndex","modelIndex","setSelectedPackageIndex","getBuildDataById","build_data","tradeInValue","includeTaxes","includeFees","includeRebates","selectedNonModelPackageIndex","selectedWarrantyIndex","selectedConnectedVehicleIndex","selectedAddedProtectionIndex","selectedAppearanceProtectionIndex","selectedAppearanceProtectionPlanPackageIndex","loadVehicleData","getAccessories","accessoriesData","parsed","parseAccessoriesData","All","acc","part_number","msg","reject","getVehicles","then","error","getTrims","trimData","SelectedModelYear","model_year","getEngineAndDrivetrain","getPackages","allowedExteriors","id","getColours","defaultInteriorColour","defaultExteriorColour","Colour","AllowedColoursExterior","getAllowedExteriorsIds","allowed_exteriors","getWheels","Accessories","getPayments","foundIndex","getSummary","colours","connectivity","protection","payments","summary","reloadStoredData","vehicles","getSpecificationsData","specifications","hasDefaultInteriorColorSelected","selectedInteriorColour","hasDefaultExteriorColorSelected","selectedExteriorColour","showWarningMessage","xs","reduce","rv","plainTitle","mazda","yearName","modelName","trimName","sup","toUpperCase","RegExp","loadFromFinancialProvider","financeTermIndex","leaseTermIndex","accessoriesValue","package","warranty","connectedVehicle","addedProtection","appearanceProtection","fees","cashCalculator","loanCalculator","leaseCalculator","minDownPayment","getMaxDownPayment","tempIncentives","cashObj","tax","getTax","getOptions","feesAndLevies","getFeesAndLeaves","getIncentivesObj","mazdaRetailCash","mazda_retail_cash","evRebates","getEvRebate","mazdaPrice","displayedTotal","nonTaxableInc","nonTaxable","taxableInc","taxable","evRebate","cash","subTotal","subtotalTaxed","subtotalTaxes","subtotalFees","subtotalWithFees","subtotalWithFeesTaxed","subtotalWithFeesTaxes","incentiveRebates","subtotalWithIncentiveRebates","subtotalWithIncentiveRebatesAndEvRebates","subtotalWithIncentiveRebatesAndEvRebatesTaxed","subtotalWithIncentiveRebatesAndEvRebatesTaxes","feesRebates","subtotalWithFeesWithRebates","subtotalWithFeesWithRebatesAndEvRebates","subtotalWithFeesWithRebatesTaxed","subtotalWithFeesWithRebatesTaxes","leaseObj","rewards","getRewardsList","downPaymentTax","kilometersLeaseValue","subtotalWithRebates","subtotalWithRebatesTaxed","balanceToLease","balanceToLeaseWithFees","balanceToLeaseWithRebates","balanceToLeaseWithFeesWithRebates","resudualObj","moneyFactor","money_factor","moneyFactorObj","financeObj","subtotalWithoutTradInAndDownPayment","balanceToFinanceTaxed","balanceToFinanceWithFees","balanceToFinanceWithRebates","balanceToFinanceWithRebatesTaxed","balanceToFinanceWithFeesWithRebates","ExteriorColorInParam","InteriorColorInParam","accessoriesObj","accessorie","total_residual_value","detail","selectedWheel","selectedPackage","selectedNonModelPackage","selectedWarrantyPackage","selectedConnectedVehiclePackage","interiorColour","exteriorColour","model_option_package","universal_package","warranty_package","connected_vehicle_package","selectedPackageIndex","tpms","install_cost","inCashCalculation","leaseMode","feesObj","feeAndLevies","that","el","getSupValueFromFee","feesObjFiltered","incentivesList","loyalty","checked","grad_award","military","first_time_owner","rewardsList","incentivesKeysNonTaxable","isCashCalculation","incentivesKeysTaxable","incentivesObj","details","incentiveKey","getGstRate","getPstRate","ev_rebates","rebate","filteredLeaseItems","leaseItem","leaseProRatedRebate","filteredFinanceItems","financeItem","financeProRatedRebate","calculateTaxes","hasEvFinancingTaxes","tax_cash","lease_federal_tax","lease_provincial_tax","lease_tax","popularData","formatedData","popular","groupBy","adminFees","retailCash","bnp_retailer_mode","urlParams","getDealerDataById","dealerData","dealerName","provinceCode","province_code","create","getPrototypeOf","getOwnPropertyDescriptors","shallowClone","isPreOrder","preOrder","modelOption","BuildHelper","cookies","Cookies","useEffect","clear","loadVehicleDataByBuildId","path","encode","String","reload","navigateUrl","origin","pathname","loadPreBuildData","NavHelper","returnDef","getDealerId","currentStep","lang","navTranslation","getUrlSlug","openModal","targetId","modal","setAttribute","focus","titleCase","word","charAt","slice","join","Svg","size","colour","svg_list","svgColour","svg_classname","Nav","nav","props","useTranslation","i18n","useParams","React","useState","ShowFinancePrice","navHelper","setStep","isOpen","setIsOpen","tabList","getNavContent","tabs","setTabs","tab","active","activeTab","setActiveTab","innerWidth","isMobile","setIsMobile","navRef","useRef","navigate","useNavigate","useSearchParams","setSearchParams","reloadTabs","current","contains","mzMenu","triggerStickySubmenu","mzFunc","mzTabs","waitForEl","components","init","subNav","adjustActiveTabPosition","scrollY","alertAni","play","permAlertAni","menuAni","handleTabClick","tabIndex","uri","HandleSelectAVehicleClick","preventDefault","selectVehiclesLinkLink","addEventListener","ref","onClick","textDesktop","role","textMobile","allow_oca","handleOcaClick","width","getCurrentActiveTabIndex","showNav","Modal","modalContent","modalId","handleClose","defaultProps","Button","primary","backgroundColor","label","disabled","icon","iconBefore","iconAfter","svg_className","rotation","mode","disabling","before","after","displayIcon","btnBackground","TabsMenu","menus","menuItems","sort","y","v","menu","Modal_50_50","image","imageMobile","imageAlt","setIsModalOpen","setModalImage","src","alt","TooltipHelper","tooltip","tooltips","Tooltip","TooltipName","TooltipText","TooltipClasses","toggle","setToggle","tooltipHeight","setTooltipHeight","isTop","setTop","isAnimating","setIsAnimating","didInit","setInit","toolRef","tooltipHelper","tooltipText","getTooltip","toggleCollapse","time","initHeight","tooltipCont","tooltipWidth","left","top","tooltipLeft","getBoundingClientRect","tooltipBottom","bottom","tooltipRight","pricingHeight","offsetHeight","innerHeight","gsap","transformOrigin","fromTo","autoAlpha","height","onUpdate","enableAni","to","onComplete","parentElement","right","onMouseEnter","matchMedia","matches","onMouseLeave","AccessoryCard","Accessory","Selected","HandleSelectedAccessory","HandleLearnMore","isPopular","showFinancePrice","modalOpen","setModalOpen","price_week","totalCost","installationText","totalPriceText","base_msrp","getTooltipText","description","CollapseLegal","ColCarText1","ColBoxText","Pricing","builtLabel","buttonLabel","builtPrice","loanLabel","loanPrice","leaseLabel","financeLabel","HandleNextClick","setLegalModalOpen","HandleShowFinanceClick","saveLabel","setPreorderModalOpen","financialInfo","setFinancialInfo","setShowFinancePrice","app","resizeObserver","ResizeObserver","calculatePriceBarPosition","mazdaFooter","mazdaPricing","scrollElement","update","setForceUpdate","isFooterOnViewport","clientHeight","getComputedStyle","transform","distance","vHeight","scrollPosition","pageYOffset","offsetTop","offsetParent","howMuchFooterIsVisible","handleTogglePrice","toggleType","handlePreOrderClick","handleContactDealerLinkClick","targetModal","heading","textContent","removeEventListener","unobserve","observe","getLoanRate","getResponsesHasError","loanElement","getLeaseRate","getLoanWeekly","weeklyPayment","getLeaseWeekly","handleQCEVD_LinkClick","target","contactRoute","getCashPrice","financePricing","cashPricing","CurrentCalculatedCash","random","isSelectionPreOrder","hasBreak","PreOrderModal","isReactFormsAppLoaded","initReactFormsApp","message","dealer_code","Alert","Id","Desc","textDisplayed","setTextDisplayed","setTooltipCont","alertRef","tempHtml","incentives_banner","getTextDisplay","splice","AccessoriesList","setNav","tabsRef","setVisibleLeftArrow","setVisibleRightArrow","legalModalOpen","setAccessories","categories","setCategories","selectedAccessories","setSelectedAccessories","selectedCategory","setSelectedCategory","preorderOpen","setTabsNextAndPrevButtons","offsetWidth","scrollWidth","scrollLeft","clientWidth","b","bandA","bandB","comparison","handleSelectedAccessory","rawData","hasAlertBar","isDataLoaded","Categories","toRender","VehicleTitle","category","isactive","decodeURI","search","Jelly","topLabel","carName","carModel","carPrice","carFeatures","carImg","carImgHover","jellieHaveIcons","icon1","icon2","icon3","btnLabel","isComingSoon","displayFeatures","feature","iconType","icon_type","VehiclePage","setResponse","vehicleLegal","setVehicleLegal","tabsContainerRef","loading","setLoading","visibleTab","setVisibleTab","loadVehicles","requestResponse","loadVehiclesLegal","requestLegalResponse","newLocation","history","pushState","executeTasks","Cats","previous_model","previusModelTab","Model","stripedHtml","CategoryNumb","cat","carCont","display","is_coming_soon","coming_soon_data","top_copy","setTopLabel","highlighted_features","URLSearchParams","handleModelClick","onMouseOver","handleModelOver","onMouseOut","handleModelOut","jelly_path","jelly","jelly_hover","providerRetry","currentLocation","urlWithoutQueryParams","replaceState","closest","jellySib","HasFinancialProviderError","class","ApiUrl","ThreeSixtyView","imageList","setImageList","ts","trigger","setTrigger","imageCount","setImageCount","draggableIsReady","setDraggableIsReady","preventScroll","stopPropagation","set360Height","container","subnav","pricing","imageCont","controls","incentivebar","alert","offsetAlert","permAlert","offsetPermAlert","viewHeight","dataset","images","getImages","setInterval","Draggable","clearInterval","lockAxis","force3D","zIndexBoost","currentPos","minimumMovement","onDragStart","onDrag","isDragging","deltaX","vars","onDragEnd","ThreeSixtyInteriorView","panoramaIsReady","offsetMenu","PhotoSphereViewer","interiorEl","innerHTML","fullScreen","createElement","appendChild","mzImage360","showPanorama","enablePanorama","ThreeSixtyContainer","imageIsLoading","vehicleTrimName","setTrimName","active360","setActive360","setIsLoading","activeView","toggleView","Collapse","ColCarText1Button","ColCarText2","ColCarText3","ColCarImg","isExpanded","setExpandedIndex","LegalContent","showCheck","collapseRef","mzAnimator","setHeight","animateHeight","heightOrigin","$el","collapseTarget","scrollWindow","topScroll","scroll","behavior","TrimList","setSelectedTrim","selectedTrim","trimsData","setTrimsData","expandedIndex","listRef","handleTrimClick","getAttribute","setListMaxHeight","maxHeight","submenu","pricingBar","foundLeaseTermIndex","foundFinanceIndex","setTermIndex","displayWarning","trimContent","highlitedfeatureList","featureItem","featureListTitle","feature_list_title","featureList","feature_list","getTrimDataContent","thumbnail","jellyContents","isJellyPathConform","getImage","button","getTrimButton","legalArr","legal","getLegalContent","alert_features","hideLeaseInCard","is_popular","TrimsPage","setImages","is360Loading","setIs360Loading","firstEmptyDataLoad","setFirstEmptyDataLoad","fromTrimSelection","setFromTrimSelection","dataNeedUpdate","setDataNeedUpdate","selectedTrimIndex","set360images","SetSelectedColorsFromParams","extArray","nextStep","SelectedTrimUrlSlug","DefaultTrimUrlSlug","handleSelectTrim","handleShowFinanceClick","toHideBlocks","hideShownCmsBlock","vehiclePageUri","getContent","CollapseList","CollapseClasses","ColClassPrice","ColPrices","collapse","OcaModal","ocaService","ReserveModal","getDealerVars","Financial","openCollapsable","setOpenCollapsable","reserveOpen","setReserveModalOpen","ocaOpen","setOcaModalOpen","setFinanceType","pathToPayment","feesChecked","setFeesChecked","taxesChecked","setTaxesChecked","rebatesChecked","setRebatesChecked","dataDisplayed","selectedBox","setSelectedBox","setFinanceTermIndex","setLeaseTermIndex","currentIncentives","inclusionCheck","Obj","handleReserveYoursClick","PurchaseMethod","CurrentPurchaseMethod","openGetLocal","financeClick","isEnglish","provinceName","en","fr","scrollIntoView","executeTask","defaultChecked","htmlFor","hasLoanRatePercentageDiscount","getLoanBiWeekly","getLoanMonthly","getLoanInformationalAprRate","hasLeaseRatePercentageDiscount","mileage","kmFormat","convertKM","getAnnualMileageText","getLeaseBiWeekly","getLeaseMonthly","getLeaseInformationalAprRate","optionList","getOptionList","floor","getWheelsDetails","getWheelsPrice","connectedPrice","getConnectivityDetails","list","getAccessoriesDetails","getAccessoriesTooltipText","getAccessoriesPrice","SelectedAppearanceProtectionPlan","getProtectionDetails","feesAndLeviesToDisplay","getMazdaFeesAndLeviesDetails","getCreditsDetails","SpecsItem","SpecsItemModelStriped","SpecsItemName","SpecsItemModel","SpecsItemEditUrl","useHTML","isPackage","BuildSpecs","componentRef","defaultEngineUrl","defaultPackageUrl","defaultDrivetrain","setDefaultDrivetrain","defaultEngine","setDefaultEngine","defaultPackages","setDefaultPackage","selectedTrimUrl","selectedModel","selectedModelUrl","selectedPackageUrl","selectedColoursInt","selectedColoursExt","selectedColoursUrl","selectedWheelUrl","selectedConnectivity","selectedAddedProtection","selectedAppearanceProtection","isWide","drivetrain","defaultEngineRequest","defaultPackagesRequest","packageName","getPackageName","handleAddAccessoriesClick","availableAccessories","List","Index","EditButton","CollapseSpecs","currID","FeaturedSpecs","show_brochure","showBrochure","specsPDF","genereatePDFURL","brochurePDF","isSpec","pdfType","innerAttr","tableHtml","table","Title","Data","getTableSpecs","Packs","shortLang","SummaryPage","buildSpecsRef","hasScrolled","setHasScrolled","openSpecificationCollapsable","dealerID","setDealerID","setIsRetailerMode","showCmsFooterHiddenBlock","isFindDealerForm","formEl","block","selectedExterior","selectedInterior","intervalRef","generateStaticVehicleImg","offsetY","duration","scrollTo","marginTop","imagePlaceHolder","EngineCard","HandleSelectedModel","modelData","engineCost","short_description","transmission","dangerouslySetInnerHTML","__html","PackageCard","Package","PopContent","ButContent","ButStyle","ButSelectedContent","HandleSelectedPackage","SelectedIndex","HandleRemovePackage","HasCollapse","isUniversal","displayPriceCalculation","displayConnectedServicePriceCalculation","packageData","setPackageData","packageCost","getPackageDesc","packageDesc","packageArr","features","setSelectedPackage","removeSelectedPackage","subtitle","spanCont","showPrice","Options","selectedModelIndex","updateAddressBar","urlPrefix","hostname","handleSelectedPackage","handleRemovePackage","handleSelectedModel","ColourCard","Disabled","HandleSelectedColour","isExterior","colourData","API_URL_BASE_PATH","new","selectedColourInteriorIndex","setSelectedColourInteriorIndex","selectedColourExteriorIndex","setSelectedColourExteriorIndex","handleSelectedColourInterior","defaultExteriorId","handleSelectedColourExterior","showWarning","overflow","WheelCard","Wheel","HandleSelectedWheel","languageText","basePrice","tpmsText","installText","totalText","WheelsList","DisabledIndexes","defaultWheelSize","parceWheelsData","wheelsData","setWheelsData","sizes","initWheelTab","selectedWheelsSize","setSelectedWheelsSize","getWarningMessage","warningMessage","setWarningMessage","handleSelectedWheel","newSize","newMessage","selected","HASDEFAULTWHEELSIZE","defaultSize","hasDefaultWheelSize","getWheelSizeSuffix","suffix","WheelsImageContainer","imageBackgroundCar","imageForegroundWheel","selectedWheelObject","bgImage","setbgImage","fgImage","setfgImage","selectedWheelIndex","setSelectedWheelIndex","selectedColor","useMemo","storageColor","yearSlug","carlineSlug","trimSlug","wheelImageBaseURL","bgImagePath","replaceAll","fgImagePath","overlay_image_suffix","default_wheels_size","Connectivity","connectModalOpen","setConnectModalOpen","carouselInit","setCarouselInit","setSelectedConnectedVehicleIndex","setConnectivityPackage","baseTarget","contentHeight","visibleHeight","handleSelectedConnectedVehiclePackage","handleRemoveConnectedVehiclelPackage","image_folder","image_extension","getConnectivityImagePath","mzCarousel","carousel_cta_text","slideContent","carousel","setBullets","getModalImagePath","set5050","setSlides","setCarousel","CollapseFinance","dropdownCallback","selectCallback","setSelectedFinanceOption","collapseOpenContent","setCollapseOpenContent","isCollapsed","setIsCollapsed","hasRatePercentageDiscount","getFinanceOptions","onChange","itemClick","discount","getDisplayedRate","FinanceOptions","showDetailedPricing","toggleShowDetailedPricing","financeDetailRef1","financeDetailRef2","financeDetailRef3","setCurrentIncentives","fromClick","collapse1","collapse2","collapse3","financeDropdown","financeTermSelect","hasResponseError","getInformationalRate","warrantyPrice","getCostOfBorrowing","CollapseLease","setSelectedLeaseOption","getLeaseOptions","CollapseLeaseMileage","callback","setSelectedLeasesMileage","collapseClosedContent","setCollapseClosedContent","setCurrentAnnuelMileage","ClosedContent","LeaseOptions","leaseDetailRef1","leaseDetailRef2","leaseDetailRef3","leaseDropdown","leaseTermSelect","leaseMileageItemClick","annualMileageValue","currentTarget","getDisplayedFee","firstPaymentTaxes","getWeeklyPrice","getBiWeeklyPrice","getMonthlyPrice","totalPayable","getTotalPayable","firstPayment","getFirstPayment","totalDue","getTotalDue","CashOptions","TradeInModal","checkTradeInValue","PricePayment","setDownPaymentInput","onBlurDownPaymentInput","setTradeInInput","onBlurTradeInInput","setLoyaltyChecked","setGraduateChecked","setMilitaryChecked","setFirstTimeOwnerChecked","tradeInLink","isTradeOpen","setIsTradeOpen","isFirstTimeOwnerGreyOut","isLoyaltyGreyOut","placeholder","onBlur","setMoneyInput","PaymentsPage","selectedFinanceOption","selectedLeaseOption","includeFeesChecked","setIncludeFeesChecked","includeTaxesChecked","setIncludeTaxesChecked","includeRebatesChecked","setIncludeRebatesChecked","setTradeInValue","setDownPaymentValue","searchParams","DEBUG_MODE","val","tempVal","delete","paymentCats","paymentTabs","paymentBlocks","paymentTabsContent","price_payments_callout","disclaimerMessage","getAdminFeeDisclaimerSection","Protection","baseURL","collapseRefProtection","collapseRefAppearance","protectionExpanded","setProtectionExpanded","appearanceExpanded","setAppearanceExpanded","setSelectedAddedProtectionIndex","addedProtectionSection","setAddedProtectionSection","appearanceDropDown","setAppearanceDropDown","appearanceSelection","setAppearanceSelection","prepareAddedProtectionSection","addedProtectionPackageList","plan","handleSelectedAddedProtectionPackage","getAddedProtectionPackage","handleRemoveAddedProtectionPackage","getCurrentAddedProtectionPackage","setSelectedAppearanceProtectionIndex","setSelectedAppearanceProtectionPlansIndex","getAppearanceProtectionSection","getAppearanceProtectionTermsDropDown","getAppearanceProtectionList","handleRemoveAppearanceProtectionPlansPackage","setExpand","innerContent","expandToggle","terms","appearanceProtectionPlans","term_dropdown_label","defaultValue","handleAppearanceProtectionTerms","fontSize","handleAppearanceProtectionPlansPackage","scrollToID","autoKill","collapseProt","collapseApp","getAddedProtectionIcons","accordion_title","selected_plan_text","iconList","icons","getAppearanceProtectionIcons","App","param","values","build","savedCarline","savedCarYear","currentProvince","requestedProvince","prov_code","getProvinceInUrl","encodeURIComponent","decodeURIComponent","handleSelectChange","select","newProvince","waitScreen","forceReloadVehicle","provCodePattern","updatedUrl","submit","handleLanguageChange","cssFile","scriptFile","rel","head","carYearHash","carlineHash","exact","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","resources","general","GENERAL_EN","VEHICLES_EN","TRIMS_EN","OPTIONS_EN","CONNECTIVITY_EN","PACKAGES_EN","COLOURS_EN","WHEELS_EN","ACCESSORIES_EN","PROTECTION_EN","PAYMENTS_EN","SUMMARY_EN","evGrid","EVGRID_EN","VEHICLES_FR","TRIMS_FR","OPTIONS_FR","PACKAGES_FR","CONNECTIVITY_FR","COLOURS_FR","WHEELS_FR","ACCESSORIES_FR","PROTECTION_FR","PAYMENTS_FR","SUMMARY_FR","EVGRID_FR","use","LanguageDetector","initReactI18next","lng","fallbackLng","debug","whitelist","transKeepBasicHtmlNodesFor","interpolation","escapeValue","ReactDOM","render","StrictMode"],"mappings":"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","file":"static/js/main.e491edd3.chunk.js","sourcesContent":["import ReactHtmlParser from 'react-html-parser';\r\n\r\n//export const lang = document.querySelector('meta[name=\"data-language\"]') ? document.querySelector('meta[name=\"data-language\"]').content === 'en' ? 'en' : 'fr' : 'en';\r\nexport function getLang() {\r\n    return document.querySelector('meta[name=\"data-language\"]') ? document.querySelector('meta[name=\"data-language\"]').content === 'en' ? 'en' : 'fr' : 'en';\r\n}\r\n\r\n//export const province = document.querySelector('meta[name=\"data-region\"]') ? document.querySelector('meta[name=\"data-region\"]').content : 'on';\r\nexport function getProvince() {\r\n    // This is used in the case of retailer\r\n    if ((window.location.href.includes(\"retailer\") || window.location.href.includes(\"localhost\")) \r\n        && sessionStorage.getItem('bnp_dealerVars')) {\r\n        const dealerVars = JSON.parse(sessionStorage.getItem('bnp_dealerVars'));\r\n\r\n        if(dealerVars && dealerVars.dealerProvinceCode)\r\n            return dealerVars.dealerProvinceCode;\r\n    }\r\n\r\n    // Fallback from the cms\r\n    return document.querySelector('meta[name=\"data-region\"]') ? document.querySelector('meta[name=\"data-region\"]').content : 'on';    \r\n}\r\n\r\n// DEPRECATED, TCCI return it in the API response\r\n/*export function getPPSA(term) {\r\n    const ppsaTable = JSON.parse(sessionStorage.getItem('financialObj')).PPSA;\r\n\r\n    let ppsa = 0;\r\n    const sortedPpsa = ppsaTable.sort((a, b) => a.term > b.term)\r\n    sortedPpsa.forEach(ppsaItem => {\r\n        if (ppsaItem.term === term)\r\n            ppsa = ppsaItem.rate;\r\n    });\r\n\r\n    if (!ppsa) {\r\n        for (const ppsaItem of sortedPpsa) {\r\n            if (ppsaItem.term > term) {\r\n                ppsa = ppsaItem.rate;\r\n                break;\r\n            }\r\n        }\r\n    }\r\n\r\n    return ppsa;\r\n}*/\r\n\r\nexport function setCursorWaiting(isWaiting) {\r\n    if (isWaiting)\r\n        document.querySelector(\"html\").style.cursor = \"wait\";\r\n    else\r\n        document.querySelector(\"html\").style.cursor = \"\";\r\n}\r\n\r\nexport function getLoading(isLoading, t) {\r\n    if (!window.bnp_under_maintenance) {\r\n        return (\r\n            <div className={`loading ${isLoading ? 'visible' : ''}`}>\r\n                <h1>{t(\"general:loading\")}</h1>\r\n            </div>\r\n        )\r\n    } else {\r\n        return (\r\n            <div className={`loading ${isLoading ? 'visible' : ''}`}>\r\n                <h5>{ReactHtmlParser(t(\"general:retryMessage\"))}</h5>\r\n            </div>\r\n        )\r\n    }\r\n}\r\n\r\nexport function getMazdaFeesAndLeviesDetailTitle(title, t) {\r\n    switch (title) {\r\n        case \"Administration Fee\":\r\n            return t(\"general:admin_service_fees\"); //\"Administration Fee\"; \r\n        case \"Lease Service Fees\":\r\n            return t(\"general:lease_service_fees\"); //\"Lease Dealer Service Fee\";\r\n        case \"A/C Tax\":\r\n            return t(\"general:ac_tax\"); //\"Air Conditioning Tax\";\r\n        case \"OMVIC\":\r\n            return t(\"general:omvic\"); //\"OMVIC Fee\";\r\n        case \"AMVIC\":\r\n            return t(\"general:amvic\"); //\"AMVIC Fee\";\r\n        case \"Oil\":\r\n            return t(\"general:oil\"); //\"Oil Filter Fee\";\r\n        case \"Tire Shewardship Fee\":\r\n        case \"Tire\":\r\n            return t(\"general:tire\"); //\"Tire Stewardship Fee\";\r\n        case \"PDE\":\r\n            return t(\"general:pde\"); //\"Pre Delivery Inspection Fee\";\r\n        case \"Federal Excise Tax\":\r\n            return t(\"general:federal_excise_tax\");\r\n        case \"Freight\":\r\n            return t(\"general:freight\");\r\n        case \"ppsa\":\r\n            return t(\"general:ppsa\");\r\n\r\n        default:\r\n            return title;\r\n    }\r\n}\r\n\r\nexport function getParams(str) {\r\n    var queryString = str || window.location.href || '';\r\n    var keyValPairs = [];\r\n    var params = {};\r\n    queryString = queryString.replace(/.*?\\?/, \"\");\r\n\r\n    if (queryString.length) {\r\n        keyValPairs = queryString.split('&');\r\n        for (let pairNum in keyValPairs) {\r\n            var key = keyValPairs[pairNum].split('=')[0];\r\n            if (!key.length) continue;\r\n            if (typeof params[key] === 'undefined')\r\n                params[key] = [];\r\n            params[key].push(keyValPairs[pairNum].split('=')[1]);\r\n        }\r\n    }\r\n    return params;\r\n}\r\n\r\n/*\r\n * Return the API Base URL according to which environement we are on.\r\n */\r\nexport function getApiBaseUrl() {\r\n    if (window.location.host.indexOf(\"localhost\") !== -1)\r\n        return process.env.REACT_APP_API_PATH_DEV;\r\n    else if (window.location.host.indexOf(\"dev\") !== -1)\r\n        return process.env.REACT_APP_API_PATH_DEV;\r\n    else if (window.location.host.indexOf(\"mzca02mstrs16bzs001.dxcloud.episerver.net\") !== -1)\r\n        return process.env.REACT_APP_API_PATH_PREPROD;\r\n    else if (window.location.host.indexOf(\"preprod\") !== -1)\r\n        return process.env.REACT_APP_API_PATH_PREPROD;\r\n    else if (window.location.host.indexOf(\"preprod2\") !== -1)\r\n        return process.env.REACT_APP_API_PATH_PREPROD2;\r\n    else\r\n        return process.env.REACT_APP_API_PATH_PROD;\r\n}\r\n\r\nexport function getBaseUrl() {\r\n    if (window.location.host.indexOf(\"localhost\") !== -1)\r\n        return \"https://preprod.mazda.ca\";\r\n    else if (window.location.host.indexOf(\"mzca02mstrs16bzs001.dxcloud.episerver.net\") !== -1)\r\n        return \"https://preprod.mazda.ca\";\r\n    else\r\n        return window.location.protocol + '//' + window.location.host;\r\n}\r\n\r\nexport function get360Data(visual, exterior = null, interior = null) {\r\n    //console.log(visual, exterior, interior);\r\n\r\n    if (visual) {\r\n        const extCode = exterior ? exterior.code : visual.interiors[0].default_exterior.code;\r\n        const intCode = interior ? interior.code : visual.interiors[0].code;\r\n        if (!visual.exteriors[extCode]) {\r\n            return {\r\n                'imagePlaceHolder': getBaseUrl() + process.env.REACT_APP_IMAGE_PLACEHOLDER_PATH\r\n            };\r\n        }\r\n\r\n        const baseAssetPath = getBaseUrl() + process.env.REACT_APP_BASIC_CONTENT_PATH;\r\n        const { file_path, end_index: imageAmount, filename_prefix } = visual.exteriors[extCode][360];\r\n        const imageName = interior && interior.include_in_360 ? `${filename_prefix.replace(\" \", \"-\")}${intCode}-{index}.png` : `${filename_prefix.replace(\" \", \"-\")}{index}.png`;\r\n        const imagePath = baseAssetPath + file_path.replace(\" \", \"-\");\r\n        const { filename } = visual.interiors.find((currInt) => currInt.code === intCode);\r\n\r\n        //const realFileName = interior.include_in_360 ? filename.replace(\".png\",\"\") + intCode + \".png\" : filename;\r\n        //console.log(realFileName);\r\n        const imagePathInterior = baseAssetPath + filename;\r\n\r\n        return {\r\n            imagePathInterior,\r\n            imagePath,\r\n            imageAmount,\r\n            imageName,\r\n        };\r\n    } else {\r\n        return {\r\n            'imagePlaceHolder': getBaseUrl() + process.env.REACT_APP_IMAGE_PLACEHOLDER_PATH\r\n        };\r\n    }\r\n\r\n}\r\n\r\nexport function getUrlParamsObject() {\r\n    if (window.location.search.length)\r\n        return decodeURI(window.location.search)\r\n            .replace('?', '')\r\n            .split('&')\r\n            .map(param => param.split('='))\r\n            .reduce((values, [key, value]) => {\r\n                values[key] = value\r\n                return values\r\n            }, {});\r\n\r\n    return {};\r\n}\r\n\r\nexport function getUrlParams(paramsObject) {\r\n    return Object.keys(paramsObject)\r\n        .map(key => `${key}=${paramsObject[key]}`)\r\n        .join('&');\r\n}\r\n\r\nexport function getThumbnail(visual, model) {\r\n    return;\r\n}\r\n\r\nexport function formatPrice(amount, noRounding) {\r\n    if (amount === undefined || isNaN(amount))\r\n        return '';\r\n\r\n    const fractions = noRounding ? 2 : 0;\r\n\r\n    const locale = getLang() === 'fr' ? 'fr-CA' : 'en-CA';\r\n    return Number(amount).toLocaleString(locale, { style: 'currency', currency: 'CAD', minimumFractionDigits: fractions, maximumFractionDigits: fractions })\r\n}\r\nexport const convertKM = (distance) => {\r\n    const locale = getLang() === 'fr' ? 'fr-CA' : 'en-CA';\r\n    const kmFormat = getLang() === 'fr' ? ' km' : 'KM';\r\n    return Number(distance).toLocaleString(locale, { minimumFractionDigits: 0, maximumFractionDigits: 0 }) + kmFormat;\r\n}\r\nexport const convertNum = (num, fractions) => {\r\n    fractions = fractions === undefined ? 0 : fractions;\r\n    const locale = getLang() === 'fr' ? 'fr-CA' : 'en-CA';\r\n    return Number(num).toLocaleString(locale, { minimumFractionDigits: fractions, maximumFractionDigits: fractions });\r\n}\r\n\r\nexport function getBareWeekly(amount, term) {\r\n    const numberYears = term / 12;\r\n    const numberWeeks = numberYears * 52;\r\n    const result = formatPrice(amount / numberWeeks);\r\n\r\n    if (result === '$NaN')\r\n        return \"\";\r\n    else\r\n        return result;\r\n}\r\n\r\nexport function getFinanceWeekly(amount, rate, term) {\r\n    const testRate = rate / 100;\r\n    const result = formatPrice((amount * (testRate / 52)) / (1 - Math.pow((1 + (testRate / 52)), -((term / 12) * (52)))));\r\n\r\n    //console.log('getFinanceWeekly', amount, rate, term, result);\r\n\r\n    if (result === '$NaN')\r\n        return \"\";\r\n    else\r\n        return result;\r\n}\r\n\r\nexport function getLeaseBiWeeklyFromOptions(amount, rate, term) {\r\n    let result;\r\n\r\n    result = formatPrice(Math.ceil(amount / term * 12 / 26));\r\n\r\n    if (result === '$NaN')\r\n        return \"\";\r\n    else\r\n        return result;\r\n}\r\n\r\nexport function getLeaseBiWeeklyFromMsrp(amount, rate, term) {\r\n    let result;\r\n\r\n    const financialObj = JSON.parse(sessionStorage.getItem('financialObj'));\r\n    \r\n    const subtotal = amount + financialObj.adminServiceFees;\r\n    const residual = financialObj.residual.find(element => element.term === term).rate;\r\n    const kilometersLeaseValue = 0;\r\n    const endValueLease = (subtotal) * ((residual + kilometersLeaseValue) / 100);\r\n\r\n    result = formatPrice(Math.ceil(subtotal - endValueLease) / (term / 12 * 26));\r\n\r\n    if (result === '$NaN')\r\n        return \"\";\r\n    else\r\n        return result;\r\n}\r\n\r\nexport function goToTop() {\r\n    document.body.scrollTop = 0;\r\n    document.documentElement.scrollTop = 0;\r\n}\r\n\r\n\r\nexport function getIncentiveDisplayName(incentive) {\r\n    switch (incentive) {\r\n        case \"loyalty\":\r\n            return getLang() === 'fr' ? \"Programme renouvellement de fidélité Mazda\" : \"Mazda Owner Loyalty Program\";\r\n        case \"military\":\r\n            return getLang() === 'fr' ? \"Programme Mazda pour militaires\" : \"Mazda Military Program\";\r\n        case \"grad_award\":\r\n            return getLang() === 'fr' ? \"Programme de diplômés Mazda\" : \"Mazda Graduate Program Award\";\r\n        case \"first_time_owner\":\r\n            return getLang() === 'fr' ? \"Programme Mazda pour premier propriétaire\" : \"Mazda First Owner Program\";            \r\n        default:\r\n            return incentive.type;\r\n    }\r\n  }\r\n\r\nexport function getDisplayableProvinceName() {\r\n    switch(getProvince().toLowerCase()) {\r\n        case 'on': \r\n            return getLang() === 'en' ? \"Ontario\" : \"de l'Ontario\"\r\n        case 'qc':\r\n            return getLang() === 'en' ? 'Quebec' : \"du Québec\"\r\n        case 'ab':\r\n            return getLang() === 'en' ? 'Alberta' : \"de l'Alberta\"\r\n        case 'bc':\r\n            return getLang() === 'en' ? 'British Columbia' : \"de la Colombie Britanique\"\r\n        case 'mb':\r\n            return getLang() === 'en' ? 'Manitoba' : \"du Manitoba\"\r\n        case 'nb':\r\n            return getLang() === 'en' ? 'New Brunswick' : \"du Nouveau-Brunswick\"\r\n        case 'nl':\r\n            return getLang() === 'en' ? 'Newfoundland' : 'de Terre-Neuve'\r\n        case 'nt':\r\n            return getLang() === 'en' ? 'North-West Territories' : 'du Territoires du nord-ouest'\r\n        case 'ns':\r\n            return getLang() === 'en' ? 'Nova Scotia' : 'de la Nouvelle-Écosse'\r\n        case 'nu':\r\n            return getLang() === 'en' ? 'Nunavut' : \"du Nanavut\"\r\n        case 'pe':\r\n            return getLang() === 'en' ? 'Prince Edward Island' : \"de l'Île-du-Prince-Édouard\"\r\n        case 'sk':\r\n            return getLang() === 'en' ? 'Saskatchewan' : \"du Saskatchewan\"\r\n        case 'yt':\r\n            return getLang() === 'en' ? 'Yukon' : 'du Yukon'\r\n        default:\r\n            return '';\r\n    }\r\n}\r\n\r\nexport function buildLegalContent(legalContentObject, legalIncentiveObject) {\r\n    let legalContent = '';\r\n    if (legalContentObject) {\r\n        legalContentObject.map(item => {\r\n            legalContent += item.copy\r\n        });\r\n    }\r\n\r\n    // Append incentive legal\r\n    if(legalIncentiveObject) {\r\n        legalIncentiveObject.map(item => {\r\n            legalContent += item.copy\r\n        });\r\n    }\r\n\r\n    return legalContent;\r\n}\r\n\r\nexport function hideCmsHiddenBlock() {\r\n    let shownBlocks = document.querySelectorAll('#Awards > .visually-shown');\r\n\r\n    if (shownBlocks) {\r\n        shownBlocks.forEach(function (e) {\r\n            e.classList.remove('visually-shown');\r\n            e.classList.add('visually-hidden');\r\n        });\r\n    }\r\n\r\n    hideCmsFooterHiddenBlock();\r\n}\r\n\r\nexport function showCmsHiddenBlock(carline) {\r\n    let hiddenBlocks = document.querySelectorAll('#BNP_AWARDS > .visually-hidden')//('#Awards > .'+carline+'.visually-hidden');\r\n\r\n    if (hiddenBlocks) {\r\n        hiddenBlocks.forEach(function (e) {\r\n            e.classList.remove('visually-hidden');\r\n            e.classList.add('visually-shown');\r\n        });\r\n    }\r\n}\r\n\r\nexport function hideCmsFooterHiddenBlock() {\r\n    let hiddenBlocks = document.querySelectorAll('.mz-footer.mz-footer--container');\r\n\r\n    if (hiddenBlocks) {\r\n        hiddenBlocks.forEach(function (e) {\r\n            e.classList.remove('visually-shown');\r\n            e.classList.add('visually-hidden');\r\n        });\r\n    }\r\n}\r\n\r\nexport function showCmsFooterHiddenBlock() {\r\n    let hiddenBlocks = document.querySelectorAll('.mz-footer.mz-footer--container');\r\n\r\n    if (hiddenBlocks) {\r\n        hiddenBlocks.forEach(function (e) {\r\n            e.classList.remove('visually-hidden');\r\n            e.classList.add('visually-shown');\r\n        });\r\n    }\r\n}\r\n\r\nexport function getCmsAwardsBlockFromCMS(year, carline) {\r\n    if(!year || !carline) {\r\n        return \"\";\r\n    }\r\n\r\n    let hiddenBlocks = document.querySelector(`#Awards > .${carline}-${year}.visually-hidden`);//('#Awards > .'+carline+'.visually-hidden');\r\n\r\n    if (hiddenBlocks) {\r\n        let text = hiddenBlocks.outerHTML.replace('visually-hidden', '');\r\n        \r\n        // Regular expression to replace src with data-src // fix for the hotlink that doesnt load the lazy load\r\n        const regex = /<img\\s+src=\"([^\"]+)\"\\s+data-src=\"([^\"]+)\"([^>]*)>/g;\r\n\r\n        // Replace src with data-src\r\n        const toReturn = text.replace(regex, '<img src=\"$2\" data-src=\"$2\"$3>');\r\n        //console.log(toReturn);\r\n\r\n        return toReturn;\r\n    }\r\n\r\n    return \"\";\r\n}\r\n\r\nexport function customRound(value, decimals) {\r\n    const factor = Math.pow(10, decimals);\r\n    return Math.ceil(value * factor) / factor;\r\n}\r\n\r\nexport function updateLanguageLink() {\r\n    const languageLink = document.getElementById('region-language-link');\r\n\r\n    // Update the language link (From any submit return)\r\n    if (window.location.hash && languageLink) {\r\n        const newLanguage = languageLink.text;\r\n\r\n        const langCodePattern = /lang_code=[^&]*/;\r\n\r\n        // Remove the old hash\r\n        if (languageLink.href.indexOf('#') !== -1) {\r\n            const hashIndexPosition = languageLink.href.indexOf('#');\r\n\r\n            languageLink.href = languageLink.href.substring(0, hashIndexPosition);\r\n        }\r\n\r\n        // Replace the lang_code parameter\r\n        let newHash = window.location.hash.replace(langCodePattern, `lang_code=${newLanguage}`);\r\n        languageLink.href = languageLink.href + newHash;\r\n            \r\n        //languageLink.href = languageLink.href.replace(langCodePattern, `lang_code=${newLanguage}`);\r\n    }\r\n}\r\n\r\n","export const SummaryConstants = {\r\n    DEBUG: 'DEBUG',\r\n    CurrentStep: 'CurrentStep',\r\n\tPreviousStep: 'PreviousStep',\r\n\r\n\tCurrent360Rotation: 'Current360Rotation',\r\n    SelectedExteriorColour: 'selectedExteriorColour',\r\n    SelectedInteriorColour: 'selectedInteriorColour',\r\n    SelectedColourExteriorIndex: 'SelectedColourExteriorIndex',\r\n    SelectedColourInteriorIndex: 'SelectedColourInteriorIndex',\r\n\r\n    EngineAndDrivetrain: 'EngineAndDrivetrain',\r\n    SelectedModelIndex: 'SelectedModelIndex',\r\n    Packages: 'Packages',\r\n\r\n    Wheels: 'Wheels',\r\n    SelectedWheel: 'selectedWheel',\r\n    SelectedWheelIndex: 'SelectedWheelIndex',\r\n    SelectedAccessories: 'selectedAccessories',\r\n    SelectedWheelSize: 'SelectedWheelSize',\r\n    Accessories: 'Accessories',\r\n\r\n    Colours: 'Colours',\r\n    DefaultExteriorColour: 'defaultExteriorColour',\r\n    DefaultInteriorColour: 'defaultInteriorColour',\r\n\r\n    AllowedColoursExterior: 'AllowedColoursExterior',\r\n\r\n    SelectedModelYear: 'selectedModelYear',\r\n    SelectedTrim: 'selectedTrim',\r\n    SelectedTrimIndex: 'selectedTrimIndex',\r\n    FinancialObj: 'financialObj',\r\n    SelectedModel: 'selectedModel',\r\n    VehicleTitle: 'vehicleTitle',\r\n\r\n    SelectedPackage: 'selectedPackage',\r\n    SelectedNonModelPackage: 'selectedNonModelPackage',\r\n    SelectedWarrantyPackage: 'selectedWarrantyPackage',\r\n    SelectedConnectedVehiclePackage: 'selectedConnectedVehiclePackage',\r\n    SelectedAddedProtectionPackage: 'selectedAddedProtectionPackage',\r\n    SelectedAppearanceProtectionPackage: 'selectedAppearanceProtectionPackage',\r\n    SelectedAppearanceProtectionPlansPackage: 'selectedAppearanceProtectionPlansPackage',\r\n\r\n    SelectedPackageIndex: 'selectedPackageIndex',\r\n    SelectedNonModelPackageIndex: 'selectedNonModelPackageIndex',\r\n    SelectedWarrantyIndex: 'selectedWarrantyIndex',\r\n    SelectedConnectedVehicleIndex: 'selectedConnectedVehicleIndex',\r\n    SelectedAddedProtectionIndex: 'selectedAddedProtectionIndex',\r\n    SelectedAppearanceProtectionIndex: 'selectedAppearanceProtectionIndex',\r\n    SelectedAppearanceProtectionPlanPackageIndex: 'selectedAppearanceProtectionPlanPackageIndex',\r\n\r\n    IncludeFees: 'includeFees',\r\n    IncludeRebates: 'includeRebates',\r\n    IncludeTaxes: 'includeTaxes',\r\n\r\n    ShowFinancePrice: 'showFinancePrice',\r\n\r\n    UrlSlugObjectTrims: 'urlSlugObjectTrims',\r\n    UrlSlugObjectEngineAndDrivetrain: 'urlSlugObjectEngineAndDrivetrain',\r\n    UrlSlugObjectPackage: 'urlSlugObjectPackage',\r\n    UrlSlugObjectColour: 'urlSlugObjectColour',\r\n    UrlSlugObjectWheels: 'urlSlugObjectWheels',\r\n    UrlSlugObjectAccessories: 'urlSlugObjectAccessories',\r\n    UrlSlugObjectPayments: 'urlSlugObjectPayments',\r\n\r\n    FinanceTermIndex: 'FinanceTermIndex',\r\n    LeaseTermIndex: 'LeaseTermIndex',\r\n    FinanceTerm: 'FinanceTerm',\r\n    LeaseTerm: 'LeaseTerm',\r\n\r\n\r\n    LoyaltyChecked: 'LoyaltyChecked',\r\n    GraduateChecked: 'GraduateChecked',\r\n    MilitaryChecked: 'MilitaryChecked',\r\n    FirstTimeOwnerChecked: 'FirstTimeOwnerChecked',\r\n\r\n    TradeInValue: 'TradeInValue',\r\n    DownPaymentValue: 'DownPaymentValue',\r\n    \r\n    LegalVehicles: 'LegalVehicles',\r\n    LegalTrims: 'LegalTrims',\r\n    LegalEngineAndDrivetrain: 'LegalEngineAndDrivetrain',\r\n    LegalOption: 'LegalOption',\r\n    LegalPackage: 'LegalPackage',\r\n    LegalConnectivity: 'LegalConnectivity',\r\n    LegalColours: 'LegalColours',\r\n    LegalWheels: 'LegalWheels',\r\n    LegalAccessories: 'LegalAccessories',\r\n    LegalProtections: 'LegalProtections',\r\n    LegalPaymentInformation: 'LegalPaymentInformation',\r\n    LegalSummary: 'LegalSummary',\r\n    SpecificationData: 'SpecificationData',\r\n\r\n    InitialFinance: 'InitialFinance',\r\n    SelectedVehicle: 'SelectedVehicle',\r\n    AvailableTrim: 'AvailableTrim',\r\n\r\n    PPSA: 'PPSA',\r\n    AllDataIsLoaded: 'AllDataIsLoaded',\r\n\r\n    HasFinancialProviderError: 'HasFinancialProviderError',\r\n    AnnualMileage : 'AnnualMileage'\r\n}","import axios from 'axios';\r\n\r\nexport async function handleRequest(type, url, data) {\r\n    const responseData = await axios({\r\n            method: type,\r\n            url: url,\r\n            data: data,\r\n            headers: {\r\n                'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',\r\n            }\r\n        });\r\n\r\n    return responseData.data;\r\n}\r\n\r\nexport async function handleJsonRequest(type, url, data) {\r\n    const responseData = await axios({\r\n            method: type,\r\n            url: url,\r\n            data: data,\r\n            headers: {\r\n                'Content-Type': 'application/json',\r\n            }\r\n        });\r\n\r\n    return responseData.data;\r\n}","import { handleRequest, handleJsonRequest } from '../stories/helpers/httpRequest';\r\nimport { getApiBaseUrl } from '../utils';\r\n\r\nexport default class ApiService {\r\n    language = \"\";\r\n    province = \"\";\r\n\r\n    insertMockData(year, carline, data) {\r\n        const mockedModels = [...window.mockedModels];\r\n        \r\n        const startsWithAny = mockedModels.some(str => carline.startsWith(str) && year === \"2025\");\r\n\r\n        if (startsWithAny) {\r\n            const mock = require('./financialMock.json');\r\n            Object.assign(data.financial, mock);\r\n        }\r\n\r\n        return data;\r\n    }\r\n\r\n    constructor() {\r\n    }\r\n\r\n    /*\r\n     * Step 1 - Get vehicles\r\n     */\r\n    async getVehicles() {\r\n        const url = `${getApiBaseUrl()}/api/ModelYears?prov_code=${this.province}&lang_code=${this.language}`;\r\n\r\n        const data = await handleRequest('get', url, {});\r\n\r\n        // FOR MOCK         \r\n        data.data.model_years.forEach(model => {\r\n            this.insertMockData(model.year.url_slug, model.carline.url_slug, model);\r\n        })\r\n\r\n        return data.data;\r\n    }\r\n\r\n    /*\r\n     * Step 2 - Get trims\r\n     */\r\n    async getTrims(year, carline) {\r\n\r\n        const url = `${getApiBaseUrl()}/api/Trims/${year}/${carline}/?prov_code=${this.province}&lang_code=${this.language}`;\r\n\r\n        const data = await handleRequest('get', url, {});\r\n\r\n        let dataToReturn = data.data;\r\n        // FOR MOCK \r\n        data.data.trims.forEach(trim => {        \r\n            this.insertMockData(year, carline, trim);\r\n        })\r\n\r\n        return dataToReturn;\r\n    }\r\n\r\n    /*\r\n     * Step 3 - Get engine and drivetrain\r\n     */\r\n    async getEngineAndDrivetrain(year, carline, trim) {\r\n        const url = `${getApiBaseUrl()}/api/EngineModels/${year}/${carline}/${trim}/?prov_code=${this.province}&lang_code=${this.language}`;\r\n\r\n        const data = await handleRequest('get', url, {});\r\n        // FOR MOCK \r\n        this.insertMockData(year, carline,data.data.trim);\r\n\r\n        data.data.models.forEach(model => {\r\n            this.insertMockData(year, carline, model);\r\n        })\r\n\r\n\r\n        return data.data;\r\n    }\r\n\r\n    /*\r\n     * Step 4 - Get packages\r\n     */\r\n    async getPackages(model, option) {\r\n\r\n        const url = `${getApiBaseUrl()}/api/Packages/${model}/${option}/?prov_code=${this.province}&lang_code=${this.language}`;\r\n\r\n        let data = await handleRequest('get', url, {});\r\n\r\n        //Object.assign(data.data, mockProtection);\r\n\r\n        return data.data;\r\n    }\r\n\r\n    /*\r\n     * Step 5 - Get colours\r\n     */\r\n    async getColours(model, packageCode) {\r\n        const url = `${getApiBaseUrl()}/api/Colors/${model}/${packageCode}?prov_code=${this.province}&lang_code=${this.language}`;\r\n\r\n        const data = await handleRequest('get', url, {});\r\n        // FOR MOCK \r\n        this.insertMockData(data.data.year.url_slug, data.data.carline.url_slug, data.data);\r\n\r\n        return data.data;\r\n    }\r\n\r\n    /*\r\n     * Step 6 - Get wheels\r\n     */\r\n    async getWheels(model, packageCode) {\r\n        const url = `${getApiBaseUrl()}/api/Wheels/${model}/${packageCode}?prov_code=${this.province}&lang_code=${this.language}`;\r\n\r\n        const data = await handleRequest('get', url, {});\r\n        this.insertMockData(data.data.year.url_slug, data.data.carline.url_slug, data.data);        \r\n\r\n        return data.data;\r\n    }\r\n\r\n    /*\r\n     * Step 7 - Get accessories\r\n     */\r\n    async getAccessories(model, packageCode) {\r\n        const url = `${getApiBaseUrl()}/api/Accessories/${model}/${packageCode}?prov_code=${this.province}&lang_code=${this.language}`;\r\n\r\n        const data = await handleRequest('get', url, {});\r\n        this.insertMockData(data.data.year.url_slug, data.data.carline.url_slug, data.data);\r\n\r\n        return data.data;\r\n    }\r\n\r\n    /*\r\n     * Step 8 - Get payments\r\n     */\r\n    async getPayments(model, packageCode) {\r\n        const url = `${getApiBaseUrl()}/api/Financial/${model}/${packageCode}?prov_code=${this.province}&lang_code=${this.language}`;\r\n\r\n        const data = await handleRequest('get', url, {});\r\n\r\n        const mockedModels = [...window.mockedModels];\r\n        \r\n        const startsWithAny = mockedModels.some(str => data.data.based_on.model_code.startsWith(str));\r\n\r\n        if (startsWithAny) {\r\n            // FOR MOCK\r\n            const mock = require('./financialMock.json');\r\n            Object.assign(data, mock);\r\n        }        \r\n\r\n\r\n        return data.data;\r\n\r\n    }\r\n\r\n    /*\r\n     * Step 9 - Get summary\r\n     */\r\n    async getSummary(model, packageCode) {\r\n        const url = `${getApiBaseUrl()}/api/BuildSummaryLegal/${model}/${packageCode}?prov_code=${this.province}&lang_code=${this.language}`;\r\n\r\n        const data = await handleRequest('get', url, {});\r\n\r\n        return data.data;\r\n    }\r\n\r\n    /*\r\n     * Complement Data - Get model specfication data\r\n     */\r\n    async getSpecificationsData(model, optionCode) {\r\n        const url = `${getApiBaseUrl()}/api/specs?lang_code=${this.language}`;\r\n\r\n        var fullModelCode = model + \"/\" + optionCode;\r\n        const requestData = JSON.stringify({ \"cars\": [fullModelCode] });\r\n\r\n        const data = await handleJsonRequest('POST', url, requestData);\r\n\r\n        return data.data;\r\n\r\n    }\r\n\r\n    /*\r\n     * Get build data by build id.\r\n     */\r\n    async getBuildDataById(buildId) {\r\n        const url = `${getApiBaseUrl()}/api/BuildYourMazda/${buildId}`;\r\n        const data = await handleJsonRequest('GET', url, {});\r\n        return data;\r\n    }\r\n\r\n\r\n    /*\r\n     * Get the dealer data by dealer id.\r\n     */\r\n    async getDealerDataById(dealerId) {\r\n        const url = `${getApiBaseUrl()}/api/Dealers/${dealerId}`;\r\n        const data = await handleJsonRequest('GET', url, {});\r\n        return data;\r\n    }\r\n\r\n}","const NodeCache = require('node-cache');\r\n\r\nexport default class Cache {\r\n    _cache;\r\n\r\n    constructor() {\r\n        this._cache = new NodeCache({\r\n            stdTTL: 900 // standard in seconds\r\n        });\r\n    }\r\n\r\n    flushAll () {\r\n        this.cache.flushAll()\r\n    }\r\n\r\n    set (res, queryParams, bodyParams, url) {\r\n        if (!res) {\r\n          throw new ReferenceError('you must pass a response object')\r\n        }\r\n    \r\n        if (Array.isArray(queryParams) && typeof queryParams !== 'undefined') {\r\n          throw new TypeError('queryParams must be an object or unset')\r\n        }\r\n    \r\n        if (!Array.isArray(bodyParams) && typeof bodyParams !== 'undefined') {\r\n          throw new TypeError('bodyParams must be an array or unset')\r\n        }\r\n    \r\n        // if (res.config.url[0] !== '/') {\r\n        //   res.config.url = '/' + res.config.url\r\n        // }\r\n    \r\n        if (!Array.isArray(queryParams) || Array.isArray(bodyParams)) {\r\n          const queryObject = {}\r\n          const bodyObject = {}\r\n          const req = res.data\r\n    \r\n    \r\n          if (!Array.isArray(queryParams) && res.config.params) {\r\n            Object.keys(queryParams).forEach(key => {\r\n              queryObject[key] = res.config.params[key]\r\n            })\r\n          }\r\n    \r\n          if (Array.isArray(bodyParams)) {\r\n            bodyParams.forEach(elem => {\r\n              bodyObject[elem] = req[elem]\r\n            })\r\n          }\r\n    \r\n          this._cache.set(url + '-' + bodyParams[0], res.data)\r\n    \r\n        } else {\r\n          this._cache.set(url, res.data)\r\n        }\r\n    \r\n      }\r\n      \r\n      get (url, body, config, queryParams, bodyParams) {\r\n        if (!url) {\r\n          throw new ReferenceError('you must pass a response object')\r\n        }\r\n    \r\n        if ((Array.isArray(body) || typeof body !== 'object') && typeof body !== 'undefined') {\r\n          throw new TypeError('body must be an object or unset')\r\n        }\r\n    \r\n        if ((Array.isArray(config) || typeof config !== 'object') && typeof config !== 'undefined') {\r\n          throw new TypeError('config must be an object or unset')\r\n        }\r\n    \r\n        if (Array.isArray(queryParams) && typeof queryParams !== 'undefined') {\r\n          throw new TypeError('queryParams must be an object or unset')\r\n        }\r\n    \r\n        if (!Array.isArray(bodyParams) && typeof bodyParams !== 'undefined') {\r\n          throw new TypeError('bodyParams must be an array or unset')\r\n        }\r\n    \r\n        // if (url[0] !== '/') {\r\n        //   url = '/' + url\r\n        // }\r\n    \r\n        if (!Array.isArray(queryParams) || Array.isArray(bodyParams)) {\r\n          const queryObject = {}\r\n          const bodyObject = {}\r\n    \r\n    \r\n          if (!Array.isArray(queryParams) && config && config.params) {\r\n            Object.keys(queryParams).forEach(key => {\r\n              queryObject[key] = config.params[key]\r\n            })\r\n          }\r\n    \r\n          if (Array.isArray(bodyParams) && body) {\r\n            bodyParams.forEach(elem => {\r\n              bodyObject[elem] = body[elem]\r\n            })\r\n          }\r\n          return this._cache.get(url + '-' + bodyParams[0])\r\n        } else if (!config && typeof url === 'object') {\r\n          return this._cache.get(url.url)\r\n        }\r\n    \r\n        return this._cache.get(url)\r\n    \r\n      }      \r\n}","import Cache from './Cache';\r\n\r\nexport default class PostCache {\r\n    _axios = null;\r\n    _cachedUrls = null;\r\n    _cache = null;\r\n\r\n    constructor(axios, cachedUrls) {\r\n        this._axios = axios;\r\n        this._cache = new Cache();\r\n\r\n        if (!axios) {\r\n            throw new ReferenceError('You must pass axios or axios instance')\r\n        }\r\n\r\n\r\n    }\r\n\r\n    setCachedUrls(cachedUrls) {\r\n        this._cachedUrls = cachedUrls;\r\n\r\n        if (!cachedUrls) {\r\n            throw new ReferenceError('c\\'mon, man')\r\n        }\r\n\r\n        if (!Array.isArray(cachedUrls)) {\r\n            throw new TypeError('the cached urls must be an array')\r\n        }\r\n\r\n        if (cachedUrls.some(elem => {\r\n            if (!elem) {\r\n                return true\r\n            }\r\n\r\n            if (Array.isArray(elem)) {\r\n                return true\r\n            }\r\n\r\n            if (typeof elem === 'object') {\r\n                if (!elem.url) {\r\n                    return true\r\n                }\r\n            } else if (typeof elem !== 'string') {\r\n                return true\r\n            }\r\n        })) {\r\n            throw new TypeError('Please, provide only objects (with a url) or a string')\r\n        }\r\n    }\r\n\r\n    async post(url, body, config) {\r\n        if (!body) {\r\n            throw ReferenceError('You must provide a body for a post request (even if it is empty)')\r\n        }\r\n\r\n        if (typeof body !== 'object' || Array.isArray(body)) {\r\n            throw TypeError('The body must be an object (even if it is empty)')\r\n        }\r\n\r\n        let cacheable = false\r\n\r\n        this._cachedUrls.forEach(elem => {\r\n            if (typeof elem === 'string') {\r\n                if (url.includes(elem)) {\r\n                    cacheable = elem\r\n                }\r\n            } else {\r\n                if (url.includes(elem.url)) {\r\n                    cacheable = elem\r\n                }\r\n            }\r\n        })\r\n\r\n        if (cacheable) {\r\n            let cached = null\r\n\r\n            if (typeof cacheable === 'string') {\r\n                cached = this._cache.get(cacheable)\r\n            } else {\r\n                cached = this._cache.get(cacheable.url, body, config, cacheable.queryParams, cacheable.bodyParams)\r\n            }\r\n\r\n            if (cached) {\r\n                return Promise.resolve({\r\n                    data: cached,\r\n                    status: 200,\r\n                    statusText: 'OK',\r\n                    headers: {},\r\n                    request: {}\r\n                })\r\n            } else {\r\n\r\n                if(!window.providerCalls)\r\n                    window.providerCalls = 1;\r\n                else\r\n                    window.providerCalls += 1;\r\n    \r\n                //console.log(`PROVIDER # OF CALLS SO FAR ${window.providerCalls}`);\r\n                \r\n                const response = await this._axios.post(url, body, config)\r\n                this._cache.set(response, cacheable.queryParams, cacheable.bodyParams, url)\r\n\r\n                return response\r\n            }\r\n        }\r\n\r\n        return this._axios.post(url, body, config)\r\n    }\r\n\r\n    async get(url, config) {\r\n\r\n        let cacheable = false\r\n\r\n        this._cachedUrls.forEach(elem => {\r\n            if (typeof elem === 'string') {\r\n                if (url.includes(elem)) {\r\n                    cacheable = elem\r\n                }\r\n            } else {\r\n                if (url.includes(elem.url)) {\r\n                    cacheable = elem\r\n                }\r\n            }\r\n        })\r\n\r\n        if (cacheable) {\r\n            let cached = null\r\n            const queryKeys = {}\r\n\r\n            if (typeof cacheable === 'string') {\r\n                cached = this._cache.get(cacheable)\r\n            } else {\r\n\r\n                if (cacheable.queryParams) {\r\n                    if (Array.isArray(cacheable.queryParams) && config) {\r\n                        cacheable.queryParams.forEach(elem => {\r\n                            queryKeys[elem] = config.params[elem]\r\n                        })\r\n                    } else if (config) {\r\n                        throw new TypeError('QueryParams must be an array')\r\n                    }\r\n                }\r\n                if (Object.keys(queryKeys).length > 0) {\r\n                    cached = this._cache.get(url, undefined, config, queryKeys, undefined)\r\n                } else {\r\n                    cached = this._cache.get(cacheable)\r\n                }\r\n            }\r\n\r\n            if (cached) {\r\n                return Promise.resolve({\r\n                    data: cached,\r\n                    status: 200,\r\n                    statusText: 'OK, cached',\r\n                    headers: {},\r\n                    request: {}\r\n                })\r\n            } else {\r\n                const response = await this._axios.get(url, config)\r\n                if (Object.keys(queryKeys).length > 0) {\r\n                    this._cache.set(response, queryKeys, undefined, url)\r\n                } else {\r\n                    this._cache.set(response)\r\n                }\r\n                return response\r\n            }\r\n        }\r\n\r\n        return this._axios.get(url, config)\r\n    }\r\n\r\n    flushAll() {\r\n        this._cache.flushAll()\r\n    }\r\n}","import axios from 'axios';\r\nimport PostCache from './PostCache';\r\nimport { getBaseUrl } from '../utils';\r\nimport { SummaryConstants as Constants } from '../Helpers/summaryconstants';\r\n\r\nexport default class TcciService {\r\n    language = \"\";\r\n    province = \"\";\r\n    postCache = null;\r\n\r\n    constructor() {\r\n        this.postCache = new PostCache(axios);\r\n    }\r\n\r\n\r\n    /*\r\n        Calculate the total residual value on the color and accessories\r\n    */\r\n    getResidualTotal(summaryCalculator) {\r\n        if (!summaryCalculator.SelectedColourExterior || !summaryCalculator.SelectedColourInterior) {\r\n            return 0;\r\n        }\r\n\r\n        //let extColorValue = summaryCalculator.SelectedColourExterior.price ? summaryCalculator.SelectedColourExterior.price : 0;\r\n        //let intColorValue = summaryCalculator.SelectedColourInterior.price ? summaryCalculator.SelectedColourInterior.price : 0;\r\n\r\n        let totalAccessoriesResidualValue = 0;\r\n\r\n        let accesories = Object.entries(summaryCalculator.SelectedAccessories);\r\n        accesories.forEach((accessory) => {\r\n            const residualValue = Number(accessory[1].residual_value ? accessory[1].residual_value : 0);\r\n\r\n            // Fix arithmetic error when adding accessories residual value and we ended up with a bunch of 0000000001 at the end\r\n            totalAccessoriesResidualValue = Math.round((Number(totalAccessoriesResidualValue) + residualValue) * 100) / 100;\r\n        })\r\n\r\n        let residualTotal = Math.round((totalAccessoriesResidualValue) * 100) / 100;\r\n        \r\n        //console.log(residualTotal, extColorValue, intColorValue, accessoriesValue);\r\n        return residualTotal;\r\n    }\r\n\r\n    /*\r\n        Handle the reqest sent to provider and has a post cache object to not send multiple time the same post \r\n    */\r\n    async handleRequest(url, data) {\r\n        const mockedModels = [...window.mockedModels];\r\n\r\n        const startsWithAny = mockedModels.some(str => data.Identifier.startsWith(str));\r\n\r\n        if (startsWithAny) {\r\n            const mock = require('./tcciMock.json');\r\n            return mock.QuoteResponse;\r\n        }\r\n\r\n        const cachedUrls = [\r\n            {\r\n                url: url,\r\n                bodyParams: [JSON.stringify(data)],\r\n            },\r\n        ]\r\n        this.postCache.setCachedUrls(cachedUrls);\r\n\r\n        const requestOptions = {\r\n            headers: {\r\n                'Content-Type': 'application/json',\r\n                'x-requested-with': 'XMLHttpRequest'\r\n            },\r\n            body: JSON.stringify(data)\r\n        };\r\n\r\n        try {\r\n            const responseData = await this.postCache.post(url, data, requestOptions);\r\n\r\n            return responseData.data.QuoteResponse;\r\n        } catch (err) {\r\n            console.log('Failed to fetch data from payment provider:', err);\r\n\r\n            return {}; //return await this.handleRequest(url, data);\r\n        }\r\n    }\r\n\r\n\r\n    /*\r\n        build the body to be sent to provider to retrieve the information\r\n\r\n        it depends of the summarycalculator object, note that some parameter has started to be decoupled from the summarycalculator object in preparation for the refactoring\r\n\r\n        productKey param can be both / loan / lease\r\n    */\r\n    buildBodyJson(summaryCalculator, withFees, withRebates, productKey, term, loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked, selectedAnnualMileage = 0) {\r\n        if (!summaryCalculator) {\r\n            return {}\r\n        }\r\n\r\n        if (!summaryCalculator.SelectedModel) {\r\n            return {}\r\n        }\r\n\r\n        const financialObj = summaryCalculator.FinancialInfo;\r\n\r\n        const mazdaCashIncentive = financialObj.incentive_programs.filter((fee) => fee.title === 'mazda_retail_cash').length ? summaryCalculator.FinancialInfo.incentive_programs.filter((fee) => fee.title === 'mazda_retail_cash')[0].price : 0;\r\n\r\n        const loyaltyPriceRate = (loyaltyChecked ? loyaltyChecked : summaryCalculator.LoyaltyChecked) ? financialObj.incentive_programs.find(x => x.type === \"loyalty\").rate_value : 0;\r\n        const loyaltyPrice = (loyaltyChecked ? loyaltyChecked : summaryCalculator.LoyaltyChecked) ? financialObj.incentive_programs.find(x => x.type === \"loyalty\").cash_value : 0;\r\n        const graduatePrice = (graduateChecked ? graduateChecked : summaryCalculator.GraduateChecked) ? financialObj.incentive_programs.find(x => x.type === \"grad_award\").value : 0;\r\n        const militaryPrice = (militaryChecked ? militaryChecked : summaryCalculator.MilitaryChecked) ? financialObj.incentive_programs.find(x => x.type === \"military\").value : 0;\r\n        const firstTimeOwnerPrice = (firstTimeOwnerChecked ? firstTimeOwnerChecked : summaryCalculator.FirstTimeOwnerChecked) ? financialObj.incentive_programs.find(x => x.type === \"first_time_owner\").value : 0;\r\n\r\n        // DO NOT ADD THE EV RABATE INCENTIVE IN, THIS IS CALCULATED BY THE FLAG ISEV ON PROVIDER SIDE\r\n        const incentives = mazdaCashIncentive + graduatePrice + militaryPrice + firstTimeOwnerPrice + financialObj.calculatedFinance.specialIncentives;\r\n\r\n        const modelCode = summaryCalculator.SelectedModel.model_code;\r\n        const packageCode = summaryCalculator.SelectedPackage.option_code;\r\n\r\n        //content += `<li class=\"mz-finance-options__financial-element\"><span><label for=\"annualMileage\">${t(\"annual_km_16000\")}</label><input type=\"hidden\" name=\"annualMileage\" value=\"3\"} id=\"ultra_kilometer_lease\"/></span></li>`;\r\n        //content += `<li class=\"mz-finance-options__financial-element\"><span><label for=\"annualMileage\">${t(\"annual_km_20000\")}</label><input type=\"hidden\" name=\"annualMileage\" value=\"2\"} id=\"low_kilometer_lease\"/></span></li>`;\r\n        //content += `<li class=\"mz-finance-options__financial-element\"><span><label for=\"annualMileage\">${t(\"annual_km_24000\")}</label><input type=\"hidden\" name=\"annualMileage\" value=\"0\"} id=\"standard_kilometer_lease\"/></span></li>`;\r\n        // TODO : MOVE THIS INTO THE UTILITY CLASS FOR REUSABILITY WITH LEASE OPTIONS\r\n        let annualMileage = '24000';\r\n        switch (selectedAnnualMileage) {\r\n            case 3:\r\n                annualMileage = '16000';\r\n                break;\r\n            case 2:\r\n                annualMileage = '20000';\r\n                break;\r\n            case 0:\r\n            default:\r\n                annualMileage = '24000';\r\n        }\r\n\r\n        const baseMSRP = Math.round((summaryCalculator.SelectedModel.financial.msrp \r\n            + summaryCalculator.SelectedPackage.financial.msrp\r\n            + (summaryCalculator.SelectedColourExterior ? summaryCalculator.SelectedColourExterior.price : 0)\r\n            + (summaryCalculator.SelectedColourInterior ? summaryCalculator.SelectedColourInterior.price : 0)) * 100) / 100;\r\n\r\n        const options = summaryCalculator.SelectedWheel ? summaryCalculator.SelectedWheel.price : 0 //financialObj.calculatedFinance.options.total  // Wheels\r\n            + summaryCalculator.SelectedNonModelPackage.financial.msrp\r\n            + summaryCalculator.SelectedWarrantyPackage.financial.msrp // Warranty \r\n            + summaryCalculator.SelectedConnectedVehiclePackage.financial.msrp // Connected Vehicle \r\n            + summaryCalculator.SelectedAddedProtectionPackage.financial.msrp // Added Protection\r\n            + summaryCalculator.SelectedAppearanceProtectionPlansPackage.financial.msrp // Appearance Protection\r\n            + financialObj.calculatedFinance.accessories.total; // Accesories  \r\n\r\n        const totalMSRP = summaryCalculator.SelectedModel.financial.msrp\r\n            + summaryCalculator.SelectedPackage.financial.msrp // Actual Car packages          \r\n            + options\r\n            + financialObj.exciseTax + financialObj.freight + financialObj.pde\r\n            + (withFees ? financialObj.acTax + financialObj.amvic + financialObj.omvic + financialObj.tireStewardshipFee + financialObj.oil : 0);\r\n\r\n        // TODO: MOVE THIS LOGIC INTO THE SUMMARYCALCULATOR BUSINESS LOGIC CLASS\r\n        // Validate that trade-in value doesn't exceed max amount\r\n        let tradeInVal = parseInt(summaryCalculator._tradeInValue, 10);\r\n        // Tradein : Min: 0 , Max:  (TotalMSRP-10000) \r\n        if (parseInt(tradeInVal) > financialObj.maxDownPayment) {\r\n            tradeInVal = financialObj.maxDownPayment;\r\n            summaryCalculator.DownPaymentValue = 0;\r\n        } else if (parseInt(tradeInVal) + financialObj.downPaymentValue > financialObj.maxDownPayment) {\r\n            summaryCalculator.DownPaymentValue = financialObj.maxDownPayment - parseInt(tradeInVal);\r\n        }\r\n\r\n        if (typeof tradeInVal === 'string' && tradeInVal.length > 0) {\r\n            summaryCalculator.TradeInValue = `$${tradeInVal}`;\r\n        } else {\r\n            summaryCalculator.TradeInValue = tradeInVal;\r\n        }\r\n\r\n        // Check if the balance is under 7500$, if so update the downpayment\r\n        if (summaryCalculator.IncludeFees ? (financialObj.calculatedFinance.balanceToFinance < 7500 || financialObj.calculatedLease.leaseEndValue < 3000) : (financialObj.calculatedFinance.balanceToFinanceNoFees < 7500 || financialObj.calculatedLease.leaseEndValueNoFees < 3000)) {\r\n            summaryCalculator.TradeInValue = 0;\r\n            summaryCalculator.DownPaymentValue = 0;\r\n        }\r\n\r\n        return {\r\n            \"Identifier\": `${modelCode}${packageCode}`, //`VXLP84AA00`\r\n            \"BaseMSRP\": Number.parseFloat(Number.parseFloat(baseMSRP).toFixed(2)),\r\n            \"ConfiguredOptions\": Number.parseFloat(Number.parseFloat(options).toFixed(2)),\r\n            \"TotalMSRP\": Number.parseFloat(Number.parseFloat(totalMSRP).toFixed(2)),\r\n            \"Province\": `${this.province}`,\r\n            \"TotalResidualizedOptions\": Number.parseFloat(Number.parseFloat(this.getResidualTotal(summaryCalculator)).toFixed(2)),\r\n            \"Parameters\": {\r\n                \"ProductKey\": productKey, //\"both/loan/lease\",\r\n                \"Downpayment\": Number.parseFloat(Number.parseFloat(summaryCalculator._downPaymentValue).toFixed(2)),\r\n                \"TradeInValue\": Number.parseFloat(Number.parseFloat(summaryCalculator._tradeInValue).toFixed(2)),\r\n                \"TradeInOwed\": 0,\r\n                \"LeaseTerm\": productKey === 'lease' ? Number.parseInt(term) : 0,\r\n                \"LoanTerm\": productKey === 'loan' ? Number.parseInt(term) : 0,\r\n                \"AnnualMileage\": Number.parseFloat(annualMileage),\r\n                \"Freight\": Number.parseFloat(financialObj.freight),\r\n                \"PDE\": Number.parseFloat(Number.parseFloat(financialObj.pde).toFixed(2)),\r\n                \"ACTax\": withFees ? Number.parseFloat(financialObj.acTax) : 0,\r\n                \"FederalExciseTax\": Number.parseFloat(financialObj.exciseTax), //`${withFees ? exciseTax : 0}\r\n                \"LeaseServiceFees\": productKey === 'lease' ? Number.parseFloat(financialObj.leaseServiceFees) : 0,\r\n                \"FinanceAdminFee\": productKey === 'loan' ? (withFees ? Number.parseFloat(financialObj.adminServiceFees) : 0) : 0,\r\n                \"AMVICFee\": withFees ? Number.parseFloat(Number.parseFloat(financialObj.amvic).toFixed(2)) : 0,\r\n                \"OMVICFee\": withFees ? Number.parseFloat(Number.parseFloat(financialObj.omvic).toFixed(2)) : 0,\r\n                \"TireStewardshipFee\": withFees ? Number.parseFloat(Number.parseFloat(financialObj.tireStewardshipFee).toFixed(2)) : 0,\r\n                \"OilFilterFee\": withFees ? Number.parseFloat(Number.parseFloat(financialObj.oil).toFixed(2)) : 0,\r\n                \"IsEV\": withRebates,\r\n                \"CashIncentive\": Number.parseFloat(Number.parseFloat(incentives).toFixed(2)),\r\n                \"WeeklyPayment\": true,\r\n                \"BiWeeklyPayment\": true,\r\n                \"MonthlyPayment\": true,\r\n                \"MazdaAddedProtection\": 0,\r\n                \"MazdaWearProtection\": 0,\r\n                \"IsLoyaltyCustomer\": loyaltyChecked ? true : false,\r\n                \"LoyaltyRateReduction\": loyaltyChecked ? Number.parseFloat(loyaltyPriceRate) : 0,\r\n                \"LoyaltyCashIncentive\": loyaltyChecked ? Number.parseFloat(Number.parseFloat(loyaltyPrice).toFixed(2)) : 0,\r\n            }\r\n        }\r\n    }\r\n\r\n    /*\r\n        Send the data to the retrieval http service and handle some basic status error.\r\n        \r\n        TODO : Handle all the returned error during the refactoring phase\r\n    */\r\n    async sendDataToService(summaryCalculator, withFees, withRebates, productKey, term, loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwner, selectedAnnualMileage) {\r\n        const url = `${getBaseUrl()}${process.env.REACT_APP_TCCI_API_PATH}`;\r\n        const data = this.buildBodyJson(summaryCalculator, withFees, withRebates, productKey, term, loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwner, selectedAnnualMileage);\r\n\r\n        if (Object.keys(data).length === 0) {\r\n            console.log('No data to send to the TCCI service');\r\n            return {};\r\n        }\r\n\r\n        const response = await this.handleRequest(url, data);\r\n\r\n        return response;\r\n    }\r\n\r\n    /*\r\n        Extract the lease data from the response\r\n    */\r\n    async extractLeaseData(response) {\r\n        const leaseObject = {};\r\n\r\n        leaseObject.weekly = response[0].Lease.Quote.WeeklyPayment;\r\n        leaseObject.biWeekly = response[0].Lease.Quote.BiWeeklyPayment;\r\n        leaseObject.monthly = response[0].Lease.Quote.MonthlyPayment;\r\n        leaseObject.weeklyWithTaxes = response[0].Lease.Quote.WeeklyPaymentWithTaxes;\r\n        leaseObject.biWeeklyWithTaxes = response[0].Lease.Quote.BiWeeklyPaymentWithTaxes;\r\n        leaseObject.monthlyWithTaxes = response[0].Lease.Quote.MonthlyPaymentWithTaxes;\r\n\r\n        // Generic information\r\n        leaseObject.leaseRate = response[0].Lease.Quote.LeaseRate\r\n        leaseObject.freight = response[0].Lease.Quote.Freight;\r\n        leaseObject.pde = response[0].Lease.Quote.Pde;\r\n        leaseObject.airConditioningTax = response[0].Lease.Quote.AirConditioningTax;\r\n        leaseObject.omvicFee = response[0].Lease.Quote.OmvicFee;\r\n        leaseObject.amvicFee = response[0].Lease.Quote.AmvicFee;\r\n        leaseObject.tireStewardshipFee = response[0].Lease.Quote.TireStewardshipFee;\r\n        leaseObject.oilFilterFee = response[0].Lease.Quote.OilFilterFee;\r\n        leaseObject.ppsa = response[0].Lease.Quote.Ppsa;\r\n        leaseObject.leaseDealerServiceFee = response[0].Lease.Quote.LeaseDealerServiceFee;\r\n        leaseObject.leaseRateDiscounted = response[0].Lease.Quote.LeaseRateDiscounted;\r\n        leaseObject.isLoyaltyCustomer = response[0].Lease.Quote.IsLoyaltyCustomer;\r\n        leaseObject.hasError = response[0].Lease.HasError;\r\n        leaseObject.capitalizedCost = response[0].Lease.Quote.CapitalizedCost;\r\n        leaseObject.residualAmount = response[0].Lease.Quote.ResidualAmount;\r\n\r\n        return leaseObject;\r\n    }\r\n\r\n    /*\r\n        Extract the loan data from the response\r\n    */\r\n    async extractLoanData(response) {\r\n        const loanObject = {};\r\n\r\n        loanObject.weekly = response[0].Loan.Quote.WeeklyPayment;\r\n        loanObject.biWeekly = response[0].Loan.Quote.BiWeeklyPayment;\r\n        loanObject.monthly = response[0].Loan.Quote.MonthlyPayment;\r\n        loanObject.weeklyWithTaxes = response[0].Loan.Quote.WeeklyPaymentWithTaxes;\r\n        loanObject.biWeeklyWithTaxes = response[0].Loan.Quote.BiWeeklyPaymentWithTaxes;\r\n        loanObject.monthlyWithTaxes = response[0].Loan.Quote.MonthlyPaymentWithTaxes;\r\n        loanObject.costOfBorrowing = Number(response[0].Loan.Quote.CostOfBorrowingWithoutTaxes);\r\n        loanObject.costOfBorrowingWithTaxes = Number(response[0].Loan.Quote.CostOfBorrowing);\r\n\r\n        // GENERIC\r\n        loanObject.freight = response[0].Loan.Quote.Freight;\r\n        loanObject.pde = response[0].Loan.Quote.Pde;\r\n        loanObject.airConditioningTax = response[0].Loan.Quote.AirConditioningTax;\r\n        loanObject.omvicFee = response[0].Loan.Quote.OmvicFee;\r\n        loanObject.amvicFee = response[0].Loan.Quote.AmvicFee;\r\n        loanObject.tireStewardshipFee = response[0].Loan.Quote.TireStewardshipFee;\r\n        loanObject.oilFilterFee = response[0].Loan.Quote.OilFilterFee;\r\n        loanObject.ppsa = response[0].Loan.Quote.Ppsa;\r\n        loanObject.aprRate = response[0].Loan.Quote.AprRate;\r\n        //loanObject.aprRate = this.FinancialInfo.calculatedFinance.financeValues[this.FinanceTermIndex].aprRate ? Number(this.FinancialInfo.calculatedFinance.financeValues[this.FinanceTermIndex].aprRate).toFixed(2) : \"\";\r\n        loanObject.loanPeriod = response[0].Loan.Quote.LoanPeriod; // TERM\r\n        loanObject.aprRateDiscounted = response[0].Loan.Quote.AprRateDiscounted;\r\n        //loanObject.aprRateDiscounted = this.FinancialInfo.calculatedFinance.financeValues[this.FinanceTermIndex].aprRateDiscounted ? Number(this.FinancialInfo.calculatedFinance.financeValues[this.FinanceTermIndex].aprRateDiscounted).toFixed(2) : \"\";\r\n        loanObject.isLoyaltyCustomer = response[0].Loan.Quote.IsLoyaltyCustomer;\r\n        loanObject.loanAmount = response[0].Loan.Quote.LoanAmount;\r\n        loanObject.hasError = response[0].Loan.Quote.HasError;\r\n\r\n        loanObject.gstAmount = response[0].Loan.Quote.GstAmount;\r\n        loanObject.pstAmount = response[0].Loan.Quote.PstAmount;\r\n\r\n        return loanObject;\r\n    }\r\n\r\n    getResidualAmountFromLeaseData(response) {\r\n        if(response && response.length > 0)\r\n            return response[0].Lease.Quote.ResidualAmount;\r\n        else\r\n            return 0;\r\n    }\r\n}","/* global dataLayer */\r\n\r\nimport { useTranslation } from \"react-i18next\";\r\nimport SummaryCalculator from './summarycalculator';\r\n\r\nexport default class GTMHelper {\r\n\tpushToGTMDataLayer\t= (data) =>{\r\n\t\ttry {\r\n\t      window.dataLayer.push(data);\r\n\t    } catch (err) {\r\n\t      console.log('Error: dataLayer is not found in pushToGTMDataLayer().', data)\r\n\t    }\r\n\t}\r\n    setGTM(data, isSimple, showPrevious) {\r\n\t\t// UNIT TEST CASE : Don't run the GTM.\r\n\t\tif(!window.summaryCalculator)\r\n\t\t\treturn;\r\n\r\n\t\tconst summaryCalculator = window.summaryCalculator;\r\n\t\tconst selectedVehicle = summaryCalculator.selectedVehicle;\r\n\t\tconst steps = [\r\n\t\t\t'vehicles',\r\n\t\t\t'trim',\r\n\t\t\t'options',\r\n\t\t\t'colour',\r\n\t\t\t'wheels',\r\n\t\t\t'connectivity',\r\n\t\t\t'accessories',\r\n\t\t\t'protections',\r\n\t\t\t'payments',\r\n\t\t\t'summary'\r\n\t\t]\r\n\t\tconst GTMData = data;\r\n\r\n\t\tGTMData.step = GTMData.action === 'Next Step' ? steps[summaryCalculator.CurrentStep+1] : steps[summaryCalculator.CurrentStep];\r\n\t\tif(GTMData.action === 'Step'){\r\n\t\t\tGTMData.event = 'BnP - Step ' + GTMData.step;\r\n\t\t} else {\r\n\t\t\tGTMData.event = 'BnP - ' + GTMData.action;\r\n\t\t}\r\n\t\tif(showPrevious) GTMData.previous = steps[summaryCalculator.PreviousStep]\r\n\t\tif(!isSimple){\r\n\t\t\tGTMData.model = selectedVehicle.model;\r\n\t\t\tGTMData.trim = selectedVehicle.trim;\r\n\t\t\tGTMData.model = selectedVehicle.carline;\r\n\t\t\tGTMData.engine = selectedVehicle.model;\r\n\t\t\tGTMData.year = selectedVehicle.year;\r\n\t\t\tGTMData.interior = summaryCalculator._selectedColourInterior?.code !== undefined ? summaryCalculator._selectedColourInterior?.code : '';\r\n\t\t\tGTMData.exterior = summaryCalculator._selectedColourExterior?.code !== undefined ? summaryCalculator._selectedColourExterior?.code : '';\r\n\t\t\tGTMData.wheel = summaryCalculator._selectedWheel?.title !== undefined ? summaryCalculator._selectedWheel?.title : '';\r\n\t\t\tif(steps[summaryCalculator.PreviousStep] === 'wheels' && GTMData.wheel === '')  GTMData.wheel = 'No Selection';\r\n\t\t\tGTMData.accessories = summaryCalculator._selectedAccessories.length > 0 ? summaryCalculator._selectedAccessories.map(({ name }) => name) : '';\r\n\t\t\tif(summaryCalculator.FinancialInfo) GTMData.price = summaryCalculator.FinancialInfo.calculatedCash.subtotal;\r\n\t\t}\r\n\t\tdelete GTMData.action;\r\n\t\tthis.pushToGTMDataLayer(GTMData)\r\n    }\r\n\r\n}","import axios from 'axios';\r\nimport PostCache from './PostCache';\r\nimport { getBaseUrl } from '../utils';\r\n\r\nimport GTMHelper from '../Helpers/gtmHelper';\r\n\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nexport default class OcaService {\r\n    lease = {};\r\n    loan = {};\r\n    province = \"\";\r\n    postCache = null;\r\n\r\n    constructor() {\r\n        this.postCache = new PostCache(axios);\r\n    }\r\n\r\n    /*\r\n        Handle the reqest sent to OCA and has a post cache object to not send the same post multiple times\r\n    */\r\n    async handleRequest(url, data) {\r\n        const cachedUrls = [];  \r\n        this.postCache.setCachedUrls(cachedUrls);\r\n\r\n        const requestOptions = {\r\n            headers: {\r\n                'Content-Type': 'application/json',\r\n                'x-requested-with': 'XMLHttpRequest'\r\n            },\r\n            body: JSON.stringify(data)\r\n        };\r\n\r\n        // TEMPORARY MESURE UNTIL BNS HAS FOUND THE BUG\r\n       try\r\n       {\r\n            const responseData = await this.postCache.post(url, data, requestOptions);\r\n\r\n            window.ocaRetry === undefined || window.ocaRetry === NaN ? window.ocaRetry = 0: window.ocaRetry++;\r\n           \r\n            // Do we have data, if so reset the retry counter \r\n            if (responseData.data && responseData.data.oca_url.length > 0) {\r\n                window.ocaRetry = 0\r\n                return responseData.data;\r\n            }\r\n\r\n            if (window.ocaRetry < 15) {\r\n                const delay = ms => new Promise(res => setTimeout(res, ms));\r\n                console.log('try again because it failed');\r\n\r\n                await delay(500);\r\n\r\n                return await this.handleRequest(url, data); \r\n            }\r\n       } catch {\r\n           console.log('try again because it failed');\r\n\r\n           return await this.handleRequest(url, data);\r\n       }       \r\n    }\r\n\r\n    /*\r\n        build the body to be sent to OCA to retrieve url\r\n\r\n       endpoint requirements can be found here...\r\n       https://confluence.uhub.biz/pages/resumedraft.action?draftId=516591718&draftShareId=cf0565da-a3f2-45c0-b0de-811b21a89d2b&\r\n    */\r\n    buildBodyJson(summaryCalculator, financeType) {\r\n\r\n        if (!summaryCalculator) {\r\n            return {}\r\n        }\r\n\r\n        const default360 = summaryCalculator._selectedExteriorColour['360'];\r\n        const financialInfo = summaryCalculator.FinancialInfo;\r\n\r\n        if(financeType === 'loan'){\r\n            return {\r\n                \"data\": {\r\n                    \"payload\": {\r\n                        \"vehicle\":{\r\n                            \"year\":Number(summaryCalculator.selectedVehicle.year), // consider that half years exists for mazda\r\n                            \"make\":\"Mazda\",\r\n                            \"model\":ReactHtmlParser(sessionStorage.getItem('plainTitle')),\r\n                            \"trim\":summaryCalculator.selectedVehicle.trim,\r\n                            \"imageUrl\": `${summaryCalculator._colours.visual.static_content_base_path}${default360.file_path}${default360.filename_prefix}${summaryCalculator._current360Rotation}${default360.filename_suffix}`, // same image as the one on the summary page\r\n                            \"buildLink\": `https://www.mazda.ca/en/shopping/build-and-price/#/${summaryCalculator._colours.carline.url_slug}/${summaryCalculator._colours.year.url_slug}/`,\r\n                            \"msrp\":summaryCalculator._ocaService.loan.cashPrice\r\n                        },\r\n                        \"tradeIn\":{\r\n                            \"tradeInValue\":summaryCalculator._tradeInValue,\r\n                            \"amountOwedOnTrade\":0\r\n                        },\r\n                        \"loanType\": financeType, // lease or loan\r\n                        \"language\": summaryCalculator._language + \"-CA\",\r\n                        \"loan\":{\r\n                            \"cashPrice\":summaryCalculator._ocaService.loan.cashPrice,\r\n                            \"rate\": summaryCalculator._ocaService.loan.rate,\r\n                            \"term\":Number(summaryCalculator._ocaService.loan.term),\r\n                            \"payment\": Number(summaryCalculator._ocaService.loan.payment),\r\n                            \"financeAmount\":Number(summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceWithFeesTaxed),\r\n                            \"programEndDateTime\":summaryCalculator._ocaService.loan.Program_End_datetime,\r\n                            \"downPayment\": Number(summaryCalculator._ocaService.loan.downPayment),\r\n                            \"apr\":Number(summaryCalculator._ocaService.loan.apr)\r\n                        }\r\n                    },\r\n                    \"expiration\": \"600s\"\r\n                }\r\n            }\r\n        }else{\r\n            return {\r\n                \"data\": {\r\n                    \"payload\": {\r\n                        \"vehicle\":{\r\n                            \"year\":Number(summaryCalculator.selectedVehicle.year),\r\n                            \"make\":\"Mazda\",\r\n                            \"model\":ReactHtmlParser(sessionStorage.getItem('plainTitle')),\r\n                            \"trim\":summaryCalculator.selectedVehicle.trim,\r\n                            \"imageUrl\": `${summaryCalculator._colours.visual.static_content_base_path}${default360.file_path}${default360.filename_prefix}${summaryCalculator._current360Rotation}${default360.filename_suffix}`,\r\n                            \"buildLink\": `https://www.mazda.ca/en/shopping/build-and-price/#/${summaryCalculator._colours.carline.url_slug}/${summaryCalculator._colours.year.url_slug}/`,\r\n                            \"msrp\":summaryCalculator._ocaService.lease.sellingPrice\r\n                        },\r\n                        \"tradeIn\":{\r\n                            \"tradeInValue\":summaryCalculator._tradeInValue,\r\n                            \"amountOwedOnTrade\":0\r\n                        },\r\n                        \"loanType\": financeType, // lease or loan\r\n                        \"language\": summaryCalculator._language + \"-CA\",\r\n                        \"lease\":{\r\n                            \"sellingPrice\": summaryCalculator._ocaService.lease.sellingPrice,\r\n                            \"residualValue\": summaryCalculator._ocaService.lease.residualValue,\r\n                            \"term\":Number(summaryCalculator._ocaService.lease.term),\r\n                            \"monthlyDepreciation\":summaryCalculator._ocaService.lease.monthlyDepreciation,\r\n                            \"totalInterestCost\":summaryCalculator._ocaService.lease.totalInterestCost * summaryCalculator._ocaService.lease.term,\r\n                            \"interestFactor\":summaryCalculator._ocaService.lease.interestFactor,\r\n                            \"baseMonthlyPayment\":summaryCalculator._ocaService.lease.baseMonthlyPayment * summaryCalculator._ocaService.lease.term,\r\n                            \"gstHSTRate\":  summaryCalculator._ocaService.lease.gstHSTRate,\r\n                            \"gstHSTAmountOnRental\": summaryCalculator._ocaService.lease.gstHSTAmountOnRental,\r\n                            \"totalMonthlyPayment\":summaryCalculator._ocaService.lease.totalMonthlyPayment,\r\n                            \"adjustedCapitalizedCost\":summaryCalculator._ocaService.lease.adjustedCapitalizedCost,\r\n                            \"PSTRate\": summaryCalculator._ocaService.lease.PSTRate,\r\n                            \"PSTAmount\":summaryCalculator._ocaService.lease.PSTAmount,\r\n                            \"programEndDateTime\":summaryCalculator._ocaService.lease.Program_End_datetime,\r\n                            \"downPayment\": Number(summaryCalculator._ocaService.lease.downPayment),\r\n                            \"apr\":Number(summaryCalculator._ocaService.lease.apr.toFixed(2))\r\n                        }\r\n                    },\r\n                    \"expiration\": \"600s\"\r\n                }\r\n            }\r\n        }\r\n    }\r\n    \r\n    /*\r\n        Send the data to the retrieval http service and handle some basic status error.\r\n        \r\n        TODO : Handle all the returned error during the refactoring phase\r\n    */\r\n    async sendDataToService(summaryCalculator, financeType) {\r\n        const gtmHelper = new GTMHelper();\r\n\r\n        //get current loan/lease vals\r\n        await summaryCalculator.updateSingleLineFromFinancialProvider();\r\n\r\n        const url = `${getBaseUrl()}${process.env.REACT_APP_OCA_API_PATH}`;\r\n        const data = this.buildBodyJson(summaryCalculator, financeType);\r\n        const response = await this.handleRequest(url, data);\r\n\r\n        if (response.oca_url.length > 0) {\r\n            const hardcodedCid = `cid=mazda-credit-application`;\r\n            const trackingID = document.cookie.split('; _ga=').pop().split(';').shift(); \r\n            const trackingParam = trackingID.length > 1 ? `&gcid=${trackingID}`:'';\r\n            const bnsParam = `&appid=${response.oca_url.split('/').at(-1)}`;\r\n\r\n            const price = financeType === 'loan' ? summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceWithFeesWithRebatesTaxed : summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithFeesWithRebatesTaxed\r\n            //gtm tracking\r\n            gtmHelper.setGTM({'action':`OCA - Modal Submit ${financeType === 'loan' ? 'Finance' : 'Lease'}`,'year': data.data.payload.vehicle.year,'model': ReactHtmlParser(summaryCalculator.selectedVehicle.carline), 'trim': data.data.payload.vehicle.trim, 'price' : Math.round(price), 'application ID' : response.oca_url.split('/').at(-1)}, true, false);\r\n\r\n            const exitUrl=`${response.oca_url}?${hardcodedCid}${trackingParam}${bnsParam}`;\r\n            setTimeout(() => {\r\n                window.open(exitUrl, '_blank');\r\n            })\r\n        }else{\r\n            console.log('**** FAILED TO SEND DATA TO OCA ****',  response);\r\n        }\r\n    }\r\n\r\n}\r\n","import ReactHtmlParser from 'react-html-parser';\r\n\r\n/**\r\n * Calculates the interest rate given the number of periods, payment, present value, future value, and type of interest.\r\n * \r\n * @param {number} periods - The number of periods.\r\n * @param {number} payment - The payment made each period.\r\n * @param {number} present - The present value, i.e. the initial amount borrowed.\r\n * @param {number} future - The future value, i.e. the amount to be paid back.\r\n * @param {number} type - The type of interest, where 0 is nominal, 1 is effective.\r\n * @param {number} [guess] - The initial guess for the interest rate.\r\n * @returns {number} The interest rate.\r\n */\r\nexport function RATE(periods, payment, present, future, type, guess) {\r\n    guess = (guess === undefined) ? 0.01 : guess; // Set the initial guess\r\n    future = (future === undefined) ? 0 : future; // Set the future value\r\n    type = (type === undefined) ? 0 : type; // Set the type of interest\r\n\r\n    // Set maximum epsilon for end of iteration\r\n    var epsMax = 1e-10;\r\n\r\n    // Set maximum number of iterations\r\n    var iterMax = 10;\r\n\r\n    // Implement Newton's method\r\n    var y, y0, y1, x0, x1 = 0, // Initialise variables\r\n        f = 0,\r\n        i = 0;\r\n    var rate = guess;\r\n    if (Math.abs(rate) < epsMax) {\r\n        y = present * (1 + periods * rate) + payment * (1 + rate * type) * periods + future;\r\n    } else {\r\n        f = Math.exp(periods * Math.log(1 + rate));\r\n        y = present * f + payment * (1 / rate + type) * (f - 1) + future;\r\n    }\r\n    y0 = present + payment * periods + future;\r\n    y1 = present * f + payment * (1 / rate + type) * (f - 1) + future;\r\n    i = x0 = 0;\r\n    x1 = rate;\r\n    while ((Math.abs(y0 - y1) > epsMax) && (i < iterMax)) {\r\n        rate = (y1 * x0 - y0 * x1) / (y1 - y0);\r\n        x0 = x1;\r\n        x1 = rate;\r\n        if (Math.abs(rate) < epsMax) {\r\n            y = present * (1 + periods * rate) + payment * (1 + rate * type) * periods + future;\r\n        } else {\r\n            f = Math.exp(periods * Math.log(1 + rate));\r\n            y = present * f + payment * (1 / rate + type) * (f - 1) + future;\r\n        }\r\n        y0 = y1;\r\n        y1 = y;\r\n        ++i;\r\n    }\r\n    return rate;\r\n};\r\n\r\n/**\r\n * Calculates the payment amount per period based on the interest rate, number of payments, present value, future value, and type of interest.\r\n *\r\n * @param {number} rate_per_period - The interest rate per period.\r\n * @param {number} number_of_payments - The total number of payments.\r\n * @param {number} present_value - The initial amount borrowed.\r\n * @param {number} future_value - The future value to be paid back.\r\n * @param {number} type - The type of interest (0 for nominal, 1 for effective).\r\n * @return {number} The payment amount per period.\r\n */\r\nexport function PMT(rate_per_period, number_of_payments, present_value, future_value, type){\r\n    future_value = typeof future_value !== 'undefined' ? future_value : 0;\r\n    type = typeof type !== 'undefined' ? type : 0;\r\n\r\n\tif(rate_per_period != 0.0){\r\n\t\t// Interest rate exists\r\n\t\tvar q = Math.pow(1 + rate_per_period, number_of_payments);\r\n\t\treturn -(rate_per_period * (future_value + (q * present_value))) / ((-1 + q) * (1 + rate_per_period * (type)));\r\n\r\n\t} else if(number_of_payments != 0.0){\r\n\t\t// No interest rate, but number of payments exists\r\n\t\treturn -(future_value + present_value) / number_of_payments;\r\n\t}\r\n\r\n\treturn 0;\r\n}","import React from 'react';\r\nimport { SummaryConstants as Constants } from './summaryconstants';\r\nimport ApiService from '../Services/ApiService';\r\nimport TcciService from '../Services/TcciService';\r\nimport OcaService from '../Services/OcaService';\r\nimport { getLang, getProvince, formatPrice, getParams, buildLegalContent, customRound } from '../utils';\r\nimport { RATE } from '../financeUtils';\r\nimport GTMHelper from './gtmHelper';\r\n\r\n// import format currency\r\n\r\n/*\r\nTODO: THERE IS A MIX OF THREE KIND OF LAYER HERE THAT NEED TO BE SPLITTED\r\n- STRING MANIPULATION UTILS\r\n- JSON PARSING\r\n- OBJECT MODEL WITH BROWSER RULES (SESSION STORAGE)\r\n\r\nREFACTOR:\r\n- PROVINCE RETRIEVAL AND INSERT INTO THE CLASS OBJECT INSTEAD OF SINGLE METHOD\r\n*/\r\nexport default class SummaryCalculator {\r\n    _myInstance;\r\n    _allDataIsLoaded = false;\r\n\r\n    _apiService = null;\r\n    _tcciService = null;\r\n\r\n    selectedVehicle = {\r\n        year: new Date().getFullYear(),\r\n        carline: '',\r\n        trim: '',\r\n        model: null,\r\n        packageCode: null,\r\n    }\r\n    selectedLanguage = \"\";\r\n\r\n    _availableTrims = null;\r\n    _selectedModelYear = null;\r\n\r\n    _selectedTrim = null;\r\n    _selectedTrimIndex = 0;\r\n\r\n    _tradeInValue = 0;\r\n    _downPaymentValue = 0;\r\n    _loyaltyChecked = false;\r\n    _militaryChecked = false;\r\n    _graduateChecked = false;\r\n    _firstTimeOwnerChecked = false;\r\n    _accessoriesValue = 0;\r\n    _annualMileage = 0;\r\n    _financeTerm = null;\r\n    _leaseTerm = null;\r\n    _financeTermIndex = 0;\r\n    _leaseTermIndex = 0;\r\n\r\n    _pstRate = 0;\r\n    _gstRate = 0;\r\n\r\n    _financialInfo = null;\r\n    _initialFinancial = null;\r\n\r\n    _engineAndDrivetrain = null;\r\n    _selectedModelIndex = 0;\r\n    _selectedModel = null;\r\n    _packages = null;\r\n    _selectedPackage = {\r\n        financial: {\r\n            msrp: 0\r\n        }\r\n    };\r\n    _selectedNonModelPackage = {\r\n        financial: {\r\n            msrp: 0\r\n        }\r\n    };\r\n    _selectedWarrantyPackage = {\r\n        financial: {\r\n            msrp: 0\r\n        }\r\n    };\r\n    _selectedConnectedVehiclePackage = {\r\n        financial: {\r\n            msrp: 0\r\n        }\r\n    };\r\n    _selectedAddedProtectionPackage = {\r\n        financial: {\r\n            msrp: 0\r\n        }\r\n    };\r\n    _selectedAppearanceProtectionPackage = {\r\n        financial: {\r\n            msrp: 0\r\n        }\r\n    };\r\n\r\n    _selectedPackageIndex = null;\r\n    _selectedNonModelPackageIndex = null;\r\n    _selectedWarrantyIndex = null;\r\n    _selectedConnectedVehicleIndex = null;\r\n    _selectedAddedProtectionIndex= null;\r\n    _selectedAppearanceProtectionIndex = 0;\r\n    _selectedAppearanceProtectionPlanPackageIndex = null;\r\n\r\n    _current360Rotation = 18;\r\n    _colours = null;\r\n    _selectedColourInterior = null;\r\n    _selectedColourInteriorIndex = -1;\r\n    _selectedColourExterior = null;\r\n    _selectedColourExteriorIndex = -1;\r\n    _allowedColoursExterior = [];\r\n    _wheels = null;\r\n    _selectedWheel = null;\r\n    _selectedWheelIndex = null;\r\n    _accessories = null;\r\n    _selectedAccessories = [];\r\n    _categories = null;\r\n    _selectedCategory = null;\r\n\r\n    _incentives = null;\r\n    _annualMileage = 2;\r\n    _includeFees = true;\r\n    _includeTaxes = false;\r\n    _includeRebates = false;\r\n\r\n    _currentStep = 0;\r\n    _previousStep = -1;\r\n\r\n    _language = \"en\";\r\n\r\n    _showFinancePrice = true;\r\n    _currentCalculatedCash = 0;\r\n\r\n    _currentPurchaseMethod = null;\r\n\r\n    constructor() {\r\n        // Create a singleton pattern\r\n        if (SummaryCalculator._instance) {\r\n            return SummaryCalculator._instance\r\n        }\r\n        SummaryCalculator._instance = this;\r\n\r\n        this._language = getLang();\r\n\r\n        this._apiService = new ApiService();\r\n        this._apiService.language = this._language;\r\n        this._apiService.province = getProvince();\r\n\r\n        this._tcciService = new TcciService();\r\n        this._tcciService.language = this._language;\r\n        this._tcciService.province = getProvince();\r\n\r\n        this._ocaService = new OcaService();\r\n        this._ocaService.province = getProvince();\r\n    }\r\n\r\n    get ShowFinancePrice() {\r\n        return this._showFinancePrice;\r\n    }\r\n\r\n    set ShowFinancePrice(value) {\r\n        this._showFinancePrice = value;\r\n        sessionStorage.setItem(Constants.ShowFinancePrice, JSON.stringify(this._showFinancePrice));\r\n    }\r\n\r\n    get CurrentCalculatedCash() {\r\n        return this._currentCalculatedCash;\r\n    }\r\n\r\n    set CurrentCalculatedCash(value) {\r\n        this._currentCalculatedCash = value;\r\n    }\r\n\r\n    //for sending Get local price specific button select to dealer (Finance/Lease/Cash)\r\n    get CurrentPurchaseMethod() {\r\n        return this._currentPurchaseMethod;\r\n    }\r\n\r\n    set CurrentPurchaseMethod(value) {\r\n        this._currentPurchaseMethod = value;\r\n    }\r\n\r\n    get CurrentStep() {\r\n        return this._currentStep;\r\n    }\r\n    get PreviousStep() {\r\n        return this._previousStep;\r\n    }\r\n\r\n    set CurrentStep(value) {\r\n        const gtmHelper = new GTMHelper();\r\n\r\n        this._currentStep = value;\r\n        sessionStorage.setItem(Constants.CurrentStep, this._currentStep);\r\n        if (this._previousStep != this._currentStep) {\r\n            gtmHelper.setGTM({ 'action': 'Step' }, false, true);\r\n            this._previousStep = this._currentStep;\r\n            sessionStorage.setItem(Constants.PreviousStep, this._previousStep);\r\n        }\r\n    }\r\n\r\n    get Current360Rotation() {\r\n        return this._current360Rotation;\r\n    }\r\n\r\n    set Current360Rotation(value) {\r\n        this._current360Rotation = value;\r\n        sessionStorage.setItem(Constants.Current360Rotation, this._current360Rotation);\r\n    }\r\n\r\n    get AvailableTrim() {\r\n        return this._availableTrims;\r\n    }\r\n\r\n    set AvailableTrim(value) {\r\n        this._availableTrims = value;\r\n        sessionStorage.setItem(Constants.AvailableTrim, JSON.stringify(value));\r\n    }\r\n\r\n    get SelectedModelYear() {\r\n        return this._selectedModelYear;\r\n    }\r\n\r\n    set SelectedModelYear(value) {\r\n        this._selectedModelYear = value;\r\n        sessionStorage.setItem(Constants.SelectedModelYear, JSON.stringify(this._selectedModelYear));\r\n    }\r\n\r\n    get SelectedTrim() {\r\n        return this._selectedTrim;\r\n    }\r\n\r\n    set SelectedTrim(value) {\r\n        this._selectedTrim = value;\r\n        sessionStorage.setItem(Constants.SelectedTrim, JSON.stringify(this._selectedTrim));\r\n    }\r\n\r\n    get SelectedTrimIndex() {\r\n        return this._selectedTrimIndex;\r\n    }\r\n\r\n    set SelectedTrimIndex(value) {\r\n        this._selectedTrimIndex = value;\r\n        sessionStorage.setItem(Constants.SelectedTrimIndex, value);\r\n\r\n        this.SelectedTrim = this._availableTrims.trims[this._selectedTrimIndex];\r\n        sessionStorage.setItem(Constants.UrlSlugObjectTrims, JSON.stringify({ 'year': this.selectedVehicle.carline, 'carline': this.selectedVehicle.carline }));\r\n\r\n        const financial = this._availableTrims.trims[this._selectedTrimIndex].financial;\r\n        this.FinancialInfo = this.getFinanceObjectWithCalculations(financial, '', '', false, false, false, false, null, null);\r\n    }\r\n\r\n    /*\r\n    * This is the entry method that prefetch all the remaining data\r\n    */\r\n    async setSelectedTrimIndex(value) {\r\n        //this._selectedTrimIndex = value?value:this._selectedTrimIndex;\r\n        const tempValue = value !== null ? value : this._selectedTrimIndex;\r\n\r\n        this.SelectedTrimIndex = tempValue;\r\n\r\n        sessionStorage.setItem(Constants.UrlSlugObjectTrims, JSON.stringify({ 'year': this.selectedVehicle.year, 'carline': this.selectedVehicle.carline }));\r\n\r\n        this.selectedVehicle.trim = this.AvailableTrim.trims[tempValue].trim_type.url_slug;\r\n        this.selectedVehicle.model = this.AvailableTrim.trims[tempValue].financial.based_on.model_code;\r\n        this.selectedVehicle.packageCode = this.AvailableTrim.trims[tempValue].financial.based_on.option_code;\r\n        sessionStorage.setItem(Constants.SelectedVehicle, JSON.stringify(tempValue));\r\n\r\n        await this.setSelectedModelIndex(0);\r\n\r\n        await this.updateSingleLineFromFinancialProvider();\r\n    }\r\n\r\n    get FinancialInfo() {\r\n        return this._financialInfo;\r\n    }\r\n\r\n    set FinancialInfo(value) {\r\n        this._financialInfo = value;\r\n        sessionStorage.setItem(Constants.FinancialObj, JSON.stringify(value));\r\n    }\r\n\r\n    get SelectedTrimUrlSlug() {\r\n        return this._availableTrims.trims[this._selectedTrimIndex].trim_type.url_slug;\r\n    }\r\n\r\n    get DefaultTrimUrlSlug() {\r\n        return this._availableTrims.trims[0]?.trim_type?.name;\r\n    }\r\n\r\n    get DefaultTrim() {\r\n        return this._availableTrims.trims[0];\r\n    }\r\n\r\n    get EngineAndDrivetrain() {\r\n        return this._engineAndDrivetrain;\r\n    }\r\n\r\n    set EngineAndDrivetrain(value) {\r\n        this._engineAndDrivetrain = value;\r\n\r\n        sessionStorage.setItem(Constants.EngineAndDrivetrain, JSON.stringify(value));\r\n    }\r\n\r\n    get SelectedModelIndex() {\r\n        return this._selectedModelIndex;\r\n    }\r\n\r\n    get SelectedModel() {\r\n        return this._selectedModel;\r\n    }\r\n\r\n    set SelectedModel(value) {\r\n        this._selectedModel = value;\r\n\r\n        sessionStorage.setItem(Constants.SelectedModel, JSON.stringify(value));\r\n\r\n        sessionStorage.setItem(Constants.VehicleTitle, this.SelectedModel.title);\r\n    }\r\n\r\n    set SelectedModelIndex(value) {\r\n        this._selectedModelIndex = value;\r\n        sessionStorage.setItem(Constants.SelectedModelIndex, value);\r\n\r\n        this.SelectedModel = this.EngineAndDrivetrain.models[this._selectedModelIndex];\r\n\r\n        const finance = this.SelectedModel.financial;\r\n        this.FinancialInfo = this.getFinanceObjectWithCalculations(finance, '', '', false, false, false, false, null, null);\r\n    }\r\n\r\n    async setSelectedModelIndex(value) {\r\n        await this.loadEngineAndDrivetrain(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim);\r\n\r\n        this.SelectedModelIndex = value;\r\n\r\n        await this.loadPackages(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n        await this.loadColours(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n        await this.loadWheels(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n        await this.loadAccessories(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n        await this.loadPayments(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n        await this.loadSummary(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n        await this.loadSpecsData(this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n        // RESET THE APPEARANCE PROTECTION DROP DOWN\r\n        if(!this.SelectedAppearanceProtectionIndex) {\r\n            this.SelectedAppearanceProtectionIndex = 0;\r\n        }\r\n\r\n        sessionStorage.setItem(Constants.AllDataIsLoaded, this._allDataIsLoaded = true);\r\n    }\r\n\r\n    //store some values from BNS call to send back to BNS OCA\r\n    setOcaValues(loanVals, leaseVals) {\r\n        let key;\r\n\r\n        //loan / finance values\r\n        if (loanVals !== null) {\r\n            this.setOcaData('loan', 'cashPrice', loanVals, 'TotalMsrp');\r\n            this.setOcaData('loan', 'rate', loanVals, 'AprRate');\r\n            this._ocaService.loan.rate = this.FinancialInfo.calculatedFinance.financeValues[this.FinancialInfo.financeTerm].rate * 100;\r\n            this.setOcaData('loan', 'term', loanVals, 'LoanPeriod');\r\n            this.setOcaData('loan', 'payment', loanVals, 'MonthlyPaymentWithTaxes');\r\n            this.setOcaData('loan', 'financeAmount', loanVals, 'LoanAmount');\r\n            this._ocaService.loan.Program_End_datetime = loanVals.Program_End_datetime;\r\n            this.setOcaData('loan', 'downPayment', loanVals, 'DownPayment');\r\n            this.setOcaData('loan', 'apr', loanVals, 'AprRate');\r\n        }\r\n\r\n        //lease values\r\n        if (leaseVals !== null) {\r\n            this.setOcaData('lease', 'sellingPrice', leaseVals, 'TotalMsrp');\r\n            this.setOcaData('lease', 'residualValue', leaseVals, 'ResidualAmount');\r\n            this.setOcaData('lease', 'term', leaseVals, 'Term');\r\n            this.setOcaData('lease', 'monthlyDepreciation', leaseVals, 'MonthlyDepriciation');\r\n            this.setOcaData('lease', 'totalInterestCost', leaseVals, 'MonthlyInterestCost');\r\n            this.setOcaData('lease', 'interestFactor', leaseVals, 'InterestFactor');\r\n            this.setOcaData('lease', 'baseMonthlyPayment', leaseVals, 'MonthlyPayment');\r\n            this.setOcaData('lease', 'gstHSTRate', leaseVals, 'GstAmount');\r\n            this.setOcaData('lease', 'gstHSTAmountOnRental', leaseVals, 'GstAmount');\r\n            this.setOcaData('lease', 'totalMonthlyPayment', leaseVals, 'MonthlyPaymentWithTaxes');\r\n            this.setOcaData('lease', 'adjustedCapitalizedCost', leaseVals, 'CapitalizedCost');\r\n            this.setOcaData('lease', 'PSTRate', leaseVals, 'PstRate');\r\n            this.setOcaData('lease', 'PSTAmount', leaseVals, 'PstAmount');\r\n            this._ocaService.lease.Program_End_datetime = leaseVals.Program_End_datetime;\r\n            this.setOcaData('lease', 'downPayment', leaseVals, 'DownPayment');\r\n            //this.setOcaData('loan', 'apr', leaseVals, 'AprRate');\r\n            //this._ocaService.lease.apr =  this.getInformationalLeaseAprRate(true);\r\n            this._ocaService.lease.apr = this.FinancialInfo.calculatedLease.leaseValues[this.FinancialInfo.leaseTerm].rate * 100;\r\n        }\r\n    }\r\n    setOcaData(financeType, ocaField, bnsValues, key) {\r\n        this._ocaService[financeType][ocaField] = bnsValues.QuoteItems.filter(filterByID)[0].Value;\r\n\r\n        function filterByID(item) {\r\n            if (item.Key == key) {\r\n                return true;\r\n            }\r\n        }\r\n    }\r\n\r\n    hasFinancialProviderData() {\r\n        var hasData = true;\r\n        const financeTermToBeDisplayed = [12, 24, 36, 48, 60, 72, 84];\r\n        const leaseTermToBeDisplayed = [36, 39, 42, 45, 48, 51, 54, 57, 60];\r\n\r\n        this.FinancialInfo.calculatedFinance.financeValues.forEach((element) => {\r\n            if (financeTermToBeDisplayed.includes(element.term)) {\r\n                if (!element.weekly) {\r\n                    hasData = false;\r\n                }\r\n            }\r\n        });\r\n\r\n        this.FinancialInfo.calculatedLease.leaseValues.forEach((element) => {\r\n            if (leaseTermToBeDisplayed.includes(element.term)) {\r\n                if (!element.biWeekly) {\r\n                    hasData = false;\r\n                }\r\n            }\r\n        });\r\n\r\n        return hasData;\r\n    }\r\n\r\n    /*\r\n        Return the temporary loan response\r\n    */    \r\n    getTemporaryLoanResponse() {\r\n        const mock = require('./loanMock.json');\r\n        return mock;\r\n    }\r\n\r\n    /*\r\n        Return the temporary lease response\r\n    */\r\n    getTemporaryLeaseResponse() {\r\n        const mock = require('./leaseMock.json');\r\n        return mock;\r\n    }\r\n\r\n    /*\r\n        Return has an error for both loan and lease and also\r\n        when the window.forceContactDealer is set\r\n    */    \r\n    getResponsesHasError() {\r\n        if (window.forceContactDealer)\r\n            return true;\r\n        else {\r\n            const loanHasError = this.getLoanResponsesHasError();\r\n            const leaseHasError = this.getLeaseResponsesHasError();\r\n\r\n            return (loanHasError || leaseHasError);\r\n        }\r\n    }\r\n\r\n    /*\r\n        Look in the array if there is any data error by comparing all the biweekly values\r\n\r\n        Note: There is a special case in the array when the data are not fetched yet, so we include the missing biWeekly property\r\n    */    \r\n    hasDataError(objectsArray) {\r\n        return objectsArray.every(obj => {\r\n            return obj.monthly === objectsArray[0].monthly || !('monthly' in obj)\r\n        });\r\n    }\r\n\r\n    /*\r\n        Return if the loan response has an error\r\n\r\n        This include communication and data errors\r\n    */    \r\n    getLoanResponsesHasError() {\r\n        const hasCommunicationError = this.FinancialInfo.calculatedFinance.financeValues.some(element => element.hasError);\r\n        const hasDataError = this.hasDataError(this.FinancialInfo.calculatedFinance.financeValues);\r\n\r\n        //console.log(hasAnyError, hasDataError);\r\n        return hasCommunicationError || hasDataError;\r\n    }\r\n\r\n    /*\r\n        Return if the lease response has an error\r\n\r\n        This include communication and data errors\r\n    */    \r\n    getLeaseResponsesHasError() {\r\n        const hasCommunicationError = this.FinancialInfo.calculatedLease.leaseValues.some(element => element.hasError);\r\n        const hasDataError = this.hasDataError(this.FinancialInfo.calculatedLease.leaseValues);\r\n\r\n        //console.log(hasAnyError, hasDataError);\r\n        return hasCommunicationError || hasDataError;\r\n    }\r\n\r\n    /*\r\n        Update the data from financial provider for both loan and lease\r\n    */\r\n    async loadFromFinancialProvider() {\r\n        // Load data\r\n        await this.updateAllLineFromFinancialProvider();\r\n    }\r\n\r\n    /*\r\n        Update the data from financial provider for the selected Finance / Lease term\r\n    */\r\n    async updateSingleLineFromFinancialProvider() {\r\n        this.FinanceTerm = this.FinancialInfo.apr[this.FinanceTermIndex].term;\r\n        this.LeaseTerm = this.FinancialInfo.lease[this.LeaseTermIndex].term;\r\n\r\n        await this.updateSingleLeaseLineItem();\r\n\r\n        await this.updateSingleLoanLineItem();\r\n\r\n        this.FinancialInfo = this.FinancialInfo;        \r\n    }\r\n\r\n    /*\r\n        Update the data from financial provider for the selected Lease term\r\n    */    \r\n    async updateSingleLeaseLineItem() {\r\n        if(!this.FinancialInfo || !this.FinancialInfo.calculatedLease || !this.FinancialInfo.calculatedLease.leaseValues)\r\n            return;\r\n\r\n        let response = await this._tcciService.sendDataToService(this, this.IncludeFees, this.IncludeRebates, \"lease\", this.LeaseTerm, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.AnnualMileage);\r\n\r\n        // Skip unforseen error by return a temporary empty response\r\n        if (!response || Object.keys(response).length === 0) {\r\n            console.log('Response was empty returning temporary lease response');\r\n            response = this.getTemporaryLeaseResponse();\r\n        }\r\n\r\n        // Set taxes on refresh\r\n        sessionStorage.setItem('FinancialProvider_GST', response[0].Lease.Quote.GstPercentage);\r\n        this._gstRate = response[0].Lease.Quote.GstPercentage;\r\n        \r\n        sessionStorage.setItem('FinancialProvider_PST', response[0].Lease.Quote.PstRate)\r\n        this._pstRate = response[0].Lease.Quote.PstRate;\r\n\r\n        this.FinancialInfo.calculatedLease.leaseValues[this.LeaseTermIndex] = {...this.FinancialInfo.calculatedLease.leaseValues[this.LeaseTermIndex], ...await this._tcciService.extractLeaseData(response)};\r\n\r\n        if (this.AnnualMileage !== 0) {\r\n            const extraDataResponse = await this._tcciService.sendDataToService(this, this.IncludeFees, this.IncludeRebates, \"lease\", this.LeaseTerm, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, 0);\r\n        \r\n            this.FinancialInfo.calculatedLease.leaseValues[this.LeaseTermIndex].downPaymentLeaseEndValue = this._tcciService.getResidualAmountFromLeaseData(extraDataResponse);\r\n        } else {\r\n            this.FinancialInfo.calculatedLease.leaseValues[this.LeaseTermIndex].downPaymentLeaseEndValue = this._tcciService.getResidualAmountFromLeaseData(response);\r\n        }\r\n    }\r\n\r\n    /*\r\n        Update the data from financial provider for the selected Loan term\r\n    */    \r\n    async updateSingleLoanLineItem() {\r\n        if(!this.FinancialInfo || !this.FinancialInfo.calculatedFinance || !this.FinancialInfo.calculatedFinance.financeValues)\r\n            return;\r\n\r\n        let response = await this._tcciService.sendDataToService(this, this.IncludeFees, this.IncludeRebates, \"loan\", this.FinanceTerm, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.AnnualMileage);\r\n\r\n        // Skip unforseen error by return a temporary empty response\r\n        if (!response || Object.keys(response).length === 0) {\r\n            console.log('Response was empty returning temporary loan response');\r\n            response = this.getTemporaryLoanResponse();\r\n        }\r\n        \r\n        this.FinancialInfo.calculatedFinance.financeValues[this.FinanceTermIndex] = {...this.FinancialInfo.calculatedFinance.financeValues[this.FinanceTermIndex], ...await this._tcciService.extractLoanData(response)};\r\n\r\n        // TODO: SET OCA, NOT IN THE FIRST DELIVERY OF TCCI\r\n        //this.setOcaValues(response[0].Loan, leaseReponse[0].Lease);\r\n    }\r\n\r\n    /*\r\n        Update all the line from the financial provider with an specific array term. Do not change array term, it has been selected by marketing team\r\n\r\n        NOTE: This function is recommended instead of single line update for UI performance reason\r\n    */\r\n    async updateAllLineFromFinancialProvider() {\r\n        await this.updateAllLoanLinesFromFinancialProvider();\r\n        await this.updateAllLeaseLinesFromFinancialProvider();\r\n    }\r\n\r\n    /*\r\n        Update all the lines for loans from the financial provider\r\n    */\r\n    async updateAllLoanLinesFromFinancialProvider() {\r\n        const financeTermToBeDisplayed = [24, 36, 48, 60, 72, 84];\r\n\r\n        if(!this.FinancialInfo || !this.FinancialInfo.calculatedFinance || !this.FinancialInfo.calculatedFinance.financeValues)\r\n            return;\r\n\r\n        // Do Financing differently from Leasing as the term can be different between the two\r\n        await Promise.all(this.FinancialInfo.calculatedFinance.financeValues.map(async (financeElement) => {\r\n            if (!financeTermToBeDisplayed.includes(financeElement.term))\r\n                return; // skip those that we don't need the data, ultimate hack to save the day\r\n\r\n            let response = await this._tcciService.sendDataToService(this, this.IncludeFees, this.IncludeRebates, \"loan\", financeElement.term, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.AnnualMileage);\r\n\r\n            // Look for error from non data from Payment provider\r\n            if (!response || Object.keys(response).length === 0) {\r\n                console.log('Response was empty returning temporary loan response');\r\n                response = this.getTemporaryLoanResponse();\r\n            }\r\n\r\n            let extractedData = await this._tcciService.extractLoanData(response);\r\n\r\n            //this.setOcaValues(response[0].Loan, null);\r\n\r\n            // BUGFIX:Update the array. Do not use return, for some reason the array doesn't get updated.\r\n            const index = this.FinancialInfo.calculatedFinance.financeValues.findIndex(x => x.term === financeElement.term);\r\n            const newObject = {...financeElement, ...extractedData};\r\n            this.FinancialInfo.calculatedFinance.financeValues[index] = newObject;\r\n        }))\r\n        .catch(function (err) {\r\n            console.log('A promise failed to resolve while fetching financial provider service financing data', err);\r\n        });\r\n    }\r\n\r\n    /*\r\n        Update all the lines for leases from the financial provider\r\n    */\r\n    async updateAllLeaseLinesFromFinancialProvider() {\r\n        const leaseTermToBeDisplayed = [36, 42, 48, 54, 60];\r\n\r\n        if(!this.FinancialInfo || !this.FinancialInfo.calculatedLease || !this.FinancialInfo.calculatedLease.leaseValues)\r\n            return;\r\n\r\n        await Promise.all(this.FinancialInfo.calculatedLease.leaseValues.map(async (leaseElement) => {\r\n            if (!leaseTermToBeDisplayed.includes(leaseElement.term))\r\n                return; // skip those that we don't need the data, ultimate hack to save the day\r\n                        \r\n            let extractedData = {};\r\n\r\n            // Request for 24000 km used in informational apr (this.AnnualMileage as 0 is 24000 please refer to the annual mileagedrop down)\r\n            if (this.AnnualMileage !== 0) {\r\n                const extraDataResponse = await this._tcciService.sendDataToService(this, this.IncludeFees, this.IncludeRebates, \"lease\", leaseElement.term, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, 0);\r\n            \r\n                extractedData.downPaymentLeaseEndValue = this._tcciService.getResidualAmountFromLeaseData(extraDataResponse)\r\n            }\r\n\r\n            // BUGFIX:Update the array. Do not use return, for some reason the array doesn't get updated.\r\n            const index = this.FinancialInfo.calculatedLease.leaseValues.findIndex(x => x.term === leaseElement.term);\r\n            const newObject = {...leaseElement, ...extractedData};\r\n            this.FinancialInfo.calculatedLease.leaseValues[index] = newObject;\r\n        }));\r\n\r\n        await Promise.all(this.FinancialInfo.calculatedLease.leaseValues.map(async (leaseElement) => {\r\n            if (!leaseTermToBeDisplayed.includes(leaseElement.term))\r\n                return; // skip those that we don't need the data, ultimate hack to save the day\r\n\r\n            let response = await this._tcciService.sendDataToService(this, this.IncludeFees, this.IncludeRebates, \"lease\", leaseElement.term, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.AnnualMileage);\r\n\r\n            // Look for error from non data from Payment provider\r\n            if (!response || Object.keys(response).length === 0) {\r\n                console.log('Response was empty returning temporary lease response');\r\n                response = this.getTemporaryLeaseResponse();\r\n            }\r\n\r\n            // Set taxes\r\n            sessionStorage.setItem('FinancialProvider_GST', response[0].Lease.Quote.GstPercentage)\r\n            this._gstRate = response[0].Lease.Quote.GstPercentage;\r\n\r\n            sessionStorage.setItem('FinancialProvider_PST', response[0].Lease.Quote.PstRate)\r\n            this._pstRate = response[0].Lease.Quote.PstRate;\r\n\r\n            let extractedData = await this._tcciService.extractLeaseData(response);\r\n            \r\n            if (this.AnnualMileage === 0) {\r\n                extractedData.downPaymentLeaseEndValue = this._tcciService.getResidualAmountFromLeaseData(response);\r\n            }\r\n\r\n            // TODO: SET OCA, NOT IN THE FIRST DELIVERY OF TCCI\r\n            //this.setOcaValues(null, response[0].Lease);\r\n\r\n            // BUGFIX:Update the array. Do not use return, for some reason the array doesn't get updated.\r\n            const index = this.FinancialInfo.calculatedLease.leaseValues.findIndex(x => x.term === leaseElement.term);\r\n            const newObject = {...leaseElement, ...extractedData};\r\n            this.FinancialInfo.calculatedLease.leaseValues[index] = newObject;\r\n        }))\r\n        .catch(function (err) {\r\n            // log that I have an error, return the entire array;\r\n            console.log('A promise failed to resolve while fetching financial provider leasing data', err);\r\n        });\r\n    }\r\n\r\n    get Packages() {\r\n        return this._packages;\r\n    }\r\n\r\n    set Packages(value) {\r\n        this._packages = value;\r\n\r\n        this._packages.packages.forEach((x, index) => {\r\n            if (x.type === 'model_option_package') {\r\n                this._packages.packages[index].financial.msrp = this._packages.packages[index].financial.msrp - this._financialInfo.msrp;\r\n            }\r\n        });\r\n\r\n        sessionStorage.setItem(Constants.Packages, JSON.stringify(this._packages));\r\n    }\r\n\r\n    get SelectedPackage() {\r\n        return this._selectedPackage;\r\n    }\r\n\r\n    set SelectedPackage(value) {\r\n        if (value) {\r\n            this._selectedPackage = value;\r\n\r\n            this.selectedVehicle.packageCode = value.option_code;\r\n            sessionStorage.setItem(Constants.SelectedVehicle, JSON.stringify(this.selectedVehicle));\r\n        } else {\r\n            this._selectedPackage = {\r\n                option_code: this.Packages.default_option.option_code,\r\n                financial: {\r\n                    msrp: 0\r\n                }\r\n            };\r\n\r\n            this.selectedVehicle.packageCode = this.Packages.default_option.option_code\r\n            sessionStorage.setItem(Constants.SelectedVehicle, JSON.stringify(this.selectedVehicle));\r\n        }\r\n\r\n        sessionStorage.setItem(Constants.SelectedPackage, JSON.stringify(this._selectedPackage));\r\n    }\r\n\r\n    get SelectedPackageIndex() {\r\n        return this._selectedPackageIndex;\r\n    }\r\n\r\n    set SelectedPackageIndex(index) {\r\n        this._selectedPackageIndex = index;\r\n        sessionStorage.setItem(Constants.SelectedPackageIndex, this._selectedPackageIndex);\r\n\r\n        if (index !== null && this.Packages.packages.filter(pack => pack.type === 'model_option_package')[index] ?.type === 'model_option_package') {\r\n            this.SelectedPackage = this.Packages.packages.filter(pack => pack.type === 'model_option_package')[index];\r\n        } else {\r\n            this.SelectedPackage = null;\r\n        }\r\n\r\n        this.FinancialInfo = this.getFinanceObjectWithCalculations(this.FinancialInfo, this.TradeInValue, this.DownPaymentValue, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.FinanceTermIndex, this.LeaseTermIndex, this.AnnualMileage);\r\n\r\n\r\n    }\r\n\r\n    /*\r\n        Async method has been added to support financial provider response\r\n    */   \r\n   async setSelectedPackageIndex(index) {\r\n        this.SelectedPackageIndex = index;\r\n\r\n        await this.loadColours(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n        await this.loadWheels(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n        await this.loadAccessories(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n        await this.updateSingleLineFromFinancialProvider();\r\n    }\r\n\r\n    get SelectedNonModelPackageIndex() {\r\n        return this._selectedNonModelPackageIndex;\r\n    }\r\n\r\n    async setSelectedNonModelPackageIndex(index) {\r\n        this.SelectedNonModelPackageIndex = index;\r\n\r\n        await this.updateSingleLineFromFinancialProvider();\r\n    }\r\n\r\n    set SelectedNonModelPackageIndex(index) {\r\n        this._selectedNonModelPackageIndex = index;\r\n        sessionStorage.setItem(Constants.SelectedNonModelPackageIndex, index);\r\n\r\n        const universalPackages = this.Packages.packages.filter(pack => pack.type === 'universal_package');\r\n        if (index !== null && universalPackages) {\r\n            this.SelectedNonModelPackage = universalPackages[index];\r\n        } else {\r\n            this.SelectedNonModelPackage = {\r\n                financial: {\r\n                    msrp: 0\r\n                }\r\n            };\r\n        }\r\n\r\n        this.FinancialInfo = this.getFinanceObjectWithCalculations(this.FinancialInfo, this.TradeInValue, this.DownPaymentValue, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.FinanceTermIndex, this.LeaseTermIndex, this.AnnualMileage);\r\n    }\r\n\r\n    get SelectedNonModelPackage() {\r\n        return this._selectedNonModelPackage;\r\n    }\r\n\r\n    set SelectedNonModelPackage(value) {\r\n        this._selectedNonModelPackage = value;\r\n\r\n        sessionStorage.setItem(Constants.SelectedNonModelPackage, JSON.stringify(value));\r\n    }\r\n\r\n    /* Selected Warranty Index */\r\n    get SelectedWarrantyIndex() {\r\n        return this._selectedWarrantyIndex;\r\n    }\r\n\r\n    async setSelectedWarrantyIndex(index) {\r\n        this.SelectedWarrantyIndex = index;\r\n\r\n        await this.updateSingleLineFromFinancialProvider();\r\n    }\r\n\r\n    set SelectedWarrantyIndex(index) {\r\n        this._selectedWarrantyIndex = index;\r\n        sessionStorage.setItem(Constants.SelectedWarrantyIndex, index);\r\n\r\n        const warrantyPackages = this.Packages.packages.filter(pack => pack.type === 'universal_package' && (pack.package_type === 'Warranty' || pack.package_type === 'Garantie'));\r\n        if (index !== null && warrantyPackages) {\r\n            this.SelectedWarrantyPackage = warrantyPackages[index];\r\n        } else {\r\n            this.SelectedWarrantyPackage = {\r\n                financial: {\r\n                    msrp: 0\r\n                }\r\n            };\r\n        }\r\n\r\n        this.FinancialInfo = this.getFinanceObjectWithCalculations(this.FinancialInfo, this.TradeInValue, this.DownPaymentValue, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.FinanceTermIndex, this.LeaseTermIndex, this.AnnualMileage);\r\n    }\r\n\r\n    get SelectedWarrantyPackage() {\r\n        return this._selectedWarrantyPackage;\r\n    }\r\n\r\n    set SelectedWarrantyPackage(value) {\r\n        this._selectedWarrantyPackage = value;\r\n\r\n        sessionStorage.setItem(Constants.SelectedWarrantyPackage, JSON.stringify(value));\r\n    }\r\n\r\n    /* Selected Connected Vehicle Index */\r\n    get SelectedConnectedVehicleIndex() {\r\n        return this._selectedConnectedVehicleIndex;\r\n    }\r\n\r\n    async setSelectedConnectedVehicleIndex(index) {\r\n        this.SelectedConnectedVehicleIndex = index;\r\n\r\n        await this.updateSingleLineFromFinancialProvider();\r\n    }\r\n\r\n    set SelectedConnectedVehicleIndex(index) {\r\n        this._selectedConnectedVehicleIndex = index;\r\n        sessionStorage.setItem(Constants.SelectedConnectedVehicleIndex, index);\r\n\r\n        const connectivityPackage = this.Packages.connected_services[0];\r\n\r\n        this.SelectedConnectedVehiclePackage = {\r\n            financial: {\r\n                msrp: 0\r\n            }\r\n        };\r\n\r\n        if(!connectivityPackage)\r\n            return;\r\n\r\n        Object.entries(connectivityPackage.subscription).map(([key, value], subscriptionindex) => {\r\n            if(subscriptionindex === index) {\r\n                //console.log('setting subscriptionindex', subscriptionindex);\r\n                this.SelectedConnectedVehiclePackage = value;\r\n            }\r\n        });\r\n        \r\n        this.FinancialInfo = this.getFinanceObjectWithCalculations(this.FinancialInfo, this.TradeInValue, this.DownPaymentValue, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.FinanceTermIndex, this.LeaseTermIndex, this.AnnualMileage);\r\n    }\r\n\r\n    get SelectedConnectedVehiclePackage() {\r\n        return this._selectedConnectedVehiclePackage;\r\n    }\r\n\r\n    set SelectedConnectedVehiclePackage(value) {\r\n        this._selectedConnectedVehiclePackage = value;\r\n\r\n        sessionStorage.setItem(Constants.SelectedConnectedVehiclePackage, JSON.stringify(value));\r\n    }\r\n\r\n    /* Added Protection */\r\n    get SelectedAddedProtectionIndex() {\r\n        return this._selectedAddedProtectionIndex;\r\n    }\r\n\r\n    async setSelectedAddedProtectionIndex(index) {\r\n        this.SelectedAddedProtectionIndex = index;\r\n\r\n        await this.updateSingleLineFromFinancialProvider();\r\n    }\r\n\r\n    set SelectedAddedProtectionIndex(index) {\r\n        this._selectedAddedProtectionIndex = index;\r\n        sessionStorage.setItem(Constants.SelectedAddedProtectionIndex, index);\r\n\r\n        this.SelectedAddedProtectionPackage = {\r\n            financial: {\r\n                msrp: 0\r\n            }\r\n        }        \r\n\r\n        Object.entries(this.Packages.added_protection[0].plans).map(([key, value], planIndex) => {\r\n            if(planIndex === index) {\r\n                //console.log('setting subscriptionindex', subscriptionindex);\r\n                this.SelectedAddedProtectionPackage = value;\r\n            }\r\n        });\r\n                \r\n\r\n        this.FinancialInfo = this.getFinanceObjectWithCalculations(this.FinancialInfo, this.TradeInValue, this.DownPaymentValue, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.FinanceTermIndex, this.LeaseTermIndex, this.AnnualMileage);\r\n    }\r\n\r\n    get SelectedAddedProtectionPackage() {\r\n        return this._selectedAddedProtectionPackage;\r\n    }\r\n    \r\n    set SelectedAddedProtectionPackage(value) {\r\n        this._selectedAddedProtectionPackage = value;\r\n\r\n        sessionStorage.setItem(Constants.SelectedAddedProtectionPackage, JSON.stringify(value));\r\n    }\r\n    /* Added Protection */\r\n\r\n    /* Appearance Protection */\r\n    get SelectedAppearanceProtectionPlan() {\r\n        let appearanceProtectionPlan;\r\n\r\n        Object.entries(this.Packages.appearance_protection[0].plans).map(([key, value], planIndex) => {\r\n            if(planIndex === Number(this.SelectedAppearanceProtectionIndex)) {\r\n                appearanceProtectionPlan = value;\r\n            }\r\n        });\r\n\r\n        return appearanceProtectionPlan;\r\n    }\r\n\r\n    get SelectedAppearanceProtectionIndex() {\r\n        return this._selectedAppearanceProtectionIndex;\r\n    }\r\n\r\n    setSelectedAppearanceProtectionIndex(index) {\r\n        this._selectedAppearanceProtectionIndex = index;\r\n    }\r\n\r\n    set SelectedAppearanceProtectionIndex(index) {\r\n        this._selectedAppearanceProtectionIndex = index;\r\n        sessionStorage.setItem(Constants.SelectedAppearanceProtectionIndex, index);\r\n\r\n        this.SelectedAppearanceProtectionPlansIndex = null;\r\n    }\r\n\r\n\r\n    get SelectedAppearanceProtectionPlansIndex() {\r\n        return this._selectedAppearanceProtectionPlanPackageIndex;\r\n    }\r\n\r\n    async setSelectedAppearanceProtectionPlansIndex(index) {\r\n        this.SelectedAppearanceProtectionPlansIndex = index;\r\n\r\n        await this.updateSingleLineFromFinancialProvider();\r\n    }\r\n\r\n    set SelectedAppearanceProtectionPlansIndex(index) {\r\n        this._selectedAppearanceProtectionPlanPackageIndex = index;\r\n        sessionStorage.setItem(Constants.SelectedAppearanceProtectionPlanPackageIndex, index);\r\n       \r\n        if (index !== null) {\r\n            Object.entries(this.Packages.appearance_protection[0].plans).map(([key, value], planIndex) => {\r\n                if(planIndex === Number(this.SelectedAppearanceProtectionIndex)) {\r\n\r\n                    Object.entries(value.packages).map(([key, appearanceProtectionPlansPackage], packageIndex) => {\r\n                        if(packageIndex === Number(index)) {\r\n                            this.SelectedAppearanceProtectionPlansPackage = appearanceProtectionPlansPackage;  \r\n                            this.SelectedAppearanceProtectionPlansPackage.key = key;            \r\n                        }\r\n                    });\r\n        \r\n                }\r\n            })\r\n\r\n            //const appearanceProtectionPlansPackage = this.Packages.appearance_protection.plans[this._selectedAppearanceProtectionIndex].packages[index];\r\n            //this.SelectedAppearanceProtectionPlansPackage = appearanceProtectionPlansPackage;\r\n        } else {\r\n            this.SelectedAppearanceProtectionPlansPackage = {\r\n                financial: {\r\n                    msrp: 0\r\n                }\r\n            };\r\n        }\r\n\r\n        this.FinancialInfo = this.getFinanceObjectWithCalculations(this.FinancialInfo, this.TradeInValue, this.DownPaymentValue, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.FinanceTermIndex, this.LeaseTermIndex, this.AnnualMileage);\r\n    }\r\n\r\n    get SelectedAppearanceProtectionPlansPackage() {\r\n        return this._selectedAppearanceProtectionPackage;\r\n    }\r\n\r\n    set SelectedAppearanceProtectionPlansPackage(value) {\r\n        this._selectedAppearanceProtectionPackage = value;\r\n        sessionStorage.setItem(Constants.SelectedAppearanceProtectionPlansPackage, JSON.stringify(value));\r\n    }\r\n    /* Appearance Protection */\r\n\r\n    get Colours() {\r\n        return this._colours;\r\n    }\r\n    set Colours(value) {\r\n        this._colours = value;\r\n        sessionStorage.setItem(Constants.Colours, JSON.stringify(value));\r\n\r\n        const financial = value.financial;\r\n        this.FinancialInfo = this.getFinanceObjectWithCalculations(financial, this._tradeInValue, this._downPaymentValue, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.FinanceTermIndex, this.LeaseTermIndex, this.AnnualMileage);\r\n    }\r\n\r\n    set InitialFinancial(value) {\r\n        this._initialFinancial = value;\r\n        sessionStorage.setItem(Constants.InitialFinance, JSON.stringify(value));\r\n    }\r\n    get InitialFinancial() {\r\n        if (sessionStorage.getItem(Constants.InitialFinance)) {\r\n            this._initialFinancial = JSON.parse(sessionStorage.getItem(Constants.InitialFinance));\r\n        }\r\n        return this._initialFinancial;\r\n    }\r\n\r\n    set SelectedColourInterior(value) {\r\n        this._selectedColourInterior = value;\r\n        sessionStorage.setItem(Constants.SelectedInteriorColour, JSON.stringify(value));\r\n\r\n        this.FinancialInfo = this.getFinanceObjectWithCalculations(this.FinancialInfo, this._tradeInValue, this._downPaymentValue, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.FinanceTermIndex, this.LeaseTermIndex, this.AnnualMileage);\r\n    }\r\n\r\n    get SelectedColourInterior() {\r\n        return this._selectedColourInterior;\r\n    }\r\n\r\n    async setSelectedColourInteriorIndex(value) {\r\n        this.SelectedColourInteriorIndex = value;\r\n\r\n        await this.updateSingleLineFromFinancialProvider();\r\n    }\r\n\r\n    set SelectedColourInteriorIndex(value) {\r\n        this._selectedColourInteriorIndex = value;\r\n        sessionStorage.setItem(Constants.SelectedColourInteriorIndex, value);\r\n        this.SelectedColourInterior = this.Colours.visual.interiors[value];\r\n    }\r\n\r\n    get SelectedColourInteriorIndex() {\r\n        return this._selectedColourInteriorIndex;\r\n    }\r\n\r\n    get SelectedColourExterior() {\r\n        return this._selectedColourExterior;\r\n    }\r\n    set SelectedColourExterior(value) {\r\n        this._selectedColourExterior = value;\r\n        sessionStorage.setItem(Constants.SelectedExteriorColour, JSON.stringify(this._selectedColourExterior));\r\n    }\r\n\r\n    /*\r\n        Async methods has been added to support UI interaction which need to wait for the financial provider response\r\n    */\r\n    async setSelectedColourExteriorIndex(value) {\r\n        this.SelectedColourExteriorIndex = value;\r\n\r\n        await this.updateSingleLineFromFinancialProvider();\r\n    }\r\n\r\n    set SelectedColourExteriorIndex(value) {\r\n        this._selectedColourExteriorIndex = value;\r\n        sessionStorage.setItem(Constants.SelectedColourExteriorIndex, value);\r\n        this.SelectedColourExterior = Object.entries(this.Colours.visual.exteriors)[value][1];\r\n\r\n        this.FinancialInfo = this.getFinanceObjectWithCalculations(this.FinancialInfo, this._tradeInValue, this._downPaymentValue, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.FinanceTermIndex, this.LeaseTermIndex, this.AnnualMileage);\r\n    }\r\n\r\n    get SelectedColourExteriorIndex() {\r\n        return this._selectedColourExteriorIndex;\r\n    }\r\n\r\n    set AllowedColoursExterior(value) {\r\n        this._allowedColoursExterior = value;\r\n        sessionStorage.setItem(Constants.AllowedColoursExterior, JSON.stringify(this._allowedColoursExterior));\r\n    }\r\n    get AllowedColoursExterior() {\r\n        return this._allowedColoursExterior;\r\n    }\r\n\r\n    set Wheels(value) {\r\n        this._wheels = value;\r\n        sessionStorage.setItem(Constants.Wheels, JSON.stringify(value));\r\n\r\n        const financial = value.financial;\r\n        this.FinancialInfo = this.getFinanceObjectWithCalculations(financial, this._tradeInValue, this._downPaymentValue, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.FinanceTermIndex, this.LeaseTermIndex, this.AnnualMileage);\r\n    }\r\n    get Wheels() {\r\n        return this._wheels;\r\n    }\r\n\r\n    set SelectedWheel(value) {\r\n        this._selectedWheel = value;\r\n        sessionStorage.setItem(Constants.SelectedWheel, JSON.stringify(value));\r\n\r\n        const financial = this.InitialFinancial;\r\n        this.FinancialInfo = this.getFinanceObjectWithCalculations(financial, this._tradeInValue, this._downPaymentValue, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.FinanceTermIndex, this.LeaseTermIndex, this.AnnualMileage);\r\n    }\r\n\r\n    get SelectedWheel() {\r\n        return this._selectedWheel;\r\n    }\r\n\r\n    set SelectedWheelIndex(value) {\r\n        this._selectedWheelIndex = value;\r\n        sessionStorage.setItem(Constants.SelectedWheelIndex, value);\r\n\r\n        if (value !== null) {\r\n            this.SelectedWheel = Object.entries(this.Wheels.wheels)[value][1];\r\n        } else {\r\n            this.SelectedWheel = null;\r\n        }\r\n    }\r\n\r\n    /*\r\n        Async method has been added to interact from the UI which need to wait for financial provider\r\n    */\r\n    async setSelectedWheelIndex(value) {\r\n        this.SelectedWheelIndex = value;\r\n\r\n        await this.updateSingleLineFromFinancialProvider();\r\n    }\r\n\r\n    get SelectedWheelIndex() {\r\n        return this._selectedWheelIndex;\r\n    }\r\n\r\n    get Accessories() {\r\n        return this._accessories;\r\n    }\r\n\r\n    set Accessories(value) {\r\n        this._accessories = value;\r\n\r\n        sessionStorage.setItem(Constants.Accessories, JSON.stringify(this._accessories));\r\n    }\r\n\r\n    get SelectedAccessories() {\r\n        /*if(!this._selectedAccessories)\r\n            this._selectedAccessories = [];*/\r\n        return this._selectedAccessories;\r\n    }\r\n\r\n    async setSelectedAccessories(value) {\r\n        this.SelectedAccessories = value;\r\n\r\n        await this.updateSingleLineFromFinancialProvider();\r\n    }\r\n\r\n    set SelectedAccessories(value) {\r\n        this._selectedAccessories = value;\r\n\r\n        sessionStorage.setItem(Constants.SelectedAccessories, JSON.stringify(value));\r\n\r\n        const financial = this.InitialFinancial;\r\n        this.FinancialInfo = this.getFinanceObjectWithCalculations(financial, '', '', false, false, false, false, null, null);\r\n\r\n        const gtmHelper = new GTMHelper();\r\n        gtmHelper.setGTM({ 'action': 'Selected Accessories' }, false, false);\r\n    }\r\n\r\n    get Categories() {\r\n        return this._categories;\r\n    }\r\n\r\n    set Categories(value) {\r\n        this._categories = value;\r\n    }\r\n\r\n    get SelectedCategory() {\r\n        return this._selectedCategory;\r\n    }\r\n\r\n\r\n    async setSelectedCategory(value) {\r\n        this.SelectedCategory = value;\r\n    }\r\n\r\n    set SelectedCategory(value) {\r\n        this._selectedCategory = value;\r\n    }\r\n\r\n    get TradeInValue() {\r\n        return formatPrice(this._tradeInValue);\r\n    }\r\n\r\n    set TradeInValue(value) {\r\n        this._tradeInValue = value !== '' ? parseInt(value.toString().replace('$', '')) : 0;\r\n        sessionStorage.setItem(Constants.TradeInValue, JSON.stringify(this._tradeInValue));\r\n    }\r\n\r\n\r\n    get DownPaymentValue() {\r\n        return formatPrice(this._downPaymentValue);\r\n    }\r\n\r\n    set DownPaymentValue(value) {\r\n        this._downPaymentValue = value !== '' ? parseInt(value.toString().replace('$', '')) : 0;\r\n        sessionStorage.setItem(Constants.DownPaymentValue, JSON.stringify(this._downPaymentValue));\r\n    }\r\n\r\n\r\n    get LoyaltyChecked() {\r\n        return this._loyaltyChecked;\r\n    }\r\n\r\n    set LoyaltyChecked(value) {\r\n        this._loyaltyChecked = value;\r\n        sessionStorage.setItem(Constants.LoyaltyChecked, JSON.stringify(value));\r\n    }\r\n\r\n    get GraduateChecked() {\r\n        return this._graduateChecked;\r\n    }\r\n\r\n    set GraduateChecked(value) {\r\n        this._graduateChecked = value;\r\n        sessionStorage.setItem(Constants.GraduateChecked, JSON.stringify(value));\r\n    }\r\n\r\n    get MilitaryChecked() {\r\n        return this._militaryChecked;\r\n    }\r\n\r\n    set MilitaryChecked(value) {\r\n        this._militaryChecked = value;\r\n        sessionStorage.setItem(Constants.MilitaryChecked, JSON.stringify(value));\r\n    }\r\n\r\n    get FirstTimeOwnerChecked() {\r\n        return this._firstTimeOwnerChecked;\r\n    }\r\n\r\n    set FirstTimeOwnerChecked(value) {\r\n        this._firstTimeOwnerChecked = value;\r\n        sessionStorage.setItem(Constants.FirstTimeOwnerChecked, JSON.stringify(value));\r\n    }    \r\n\r\n    get FinanceTermIndex() {\r\n        return this._financeTermIndex;\r\n    }\r\n\r\n    set FinanceTermIndex(value) {\r\n        this._financeTermIndex = value;\r\n        sessionStorage.setItem(Constants.FinanceTermIndex, value);\r\n    }\r\n\r\n    get FinanceTerm() {\r\n        return this._financeTerm;\r\n    }\r\n\r\n    set FinanceTerm(value) {\r\n        if (isNaN(value)) {\r\n            this._financeTerm = null;\r\n            sessionStorage.removeItem(Constants.FinanceTerm);\r\n        } else {\r\n            this._financeTerm = value;\r\n            sessionStorage.setItem(Constants.FinanceTerm, value);\r\n        }\r\n    }\r\n\r\n    get LeaseTermIndex() {\r\n        return this._leaseTermIndex;\r\n    }\r\n\r\n    set LeaseTermIndex(value) {\r\n        this._leaseTermIndex = value;\r\n        sessionStorage.setItem(Constants.LeaseTermIndex, value);\r\n    }\r\n\r\n    get LeaseTerm() {\r\n        return this._leaseTerm;\r\n    }\r\n\r\n    set LeaseTerm(value) {\r\n        if (isNaN(value)) {\r\n            this._leaseTerm = null;\r\n            sessionStorage.removeItem(Constants.LeaseTerm);\r\n        } else {\r\n            this._leaseTerm = value;\r\n            sessionStorage.setItem(Constants.LeaseTerm, value);\r\n        }\r\n    }\r\n\r\n    get Incentives() {\r\n        return this._incentives;\r\n    }\r\n\r\n    set Incentives(value) {\r\n        this._incentives = value;\r\n    }\r\n\r\n    get AnnualMileage() {\r\n        return this._annualMileage;\r\n    }\r\n\r\n    set AnnualMileage(value) {\r\n        this._annualMileage = value;\r\n        sessionStorage.setItem(Constants.AnnualMileage, value);\r\n    }\r\n\r\n    get IncludeFees() {\r\n        return this._includeFees;\r\n    }\r\n\r\n    set IncludeFees(value) {\r\n        this._includeFees = value;\r\n        sessionStorage.setItem(Constants.IncludeFees, value);\r\n    }\r\n\r\n    get IncludeTaxes() {\r\n        return this._includeTaxes;\r\n    }\r\n\r\n    set IncludeTaxes(value) {\r\n        this._includeTaxes = value;\r\n        sessionStorage.setItem(Constants.IncludeTaxes, value);\r\n    }\r\n\r\n    get IncludeRebates() {\r\n        return this._includeRebates;\r\n    }\r\n\r\n    set IncludeRebates(value) {\r\n        this._includeRebates = value;\r\n        sessionStorage.setItem(Constants.IncludeRebates, value)\r\n    }\r\n\r\n    /**\r\n     * Reset\r\n     */\r\n    reset(all = false) {\r\n        this._currentStep = 0;\r\n        const gtmHelper = new GTMHelper();\r\n        if (all) gtmHelper.setGTM({ 'action': 'Reset' }, false, true);\r\n        this._previousStep = 0;\r\n\r\n        this._selectedTrim = null;\r\n        this._selectedTrimIndex = 0;\r\n\r\n        this._tradeInValue = 0;\r\n        this._downPaymentValue = 0;\r\n        this._loyaltyChecked = false;\r\n        this._militaryChecked = false;\r\n        this._graduateChecked = false;\r\n        this._firstTimeOwnerChecked = true;\r\n        this._accessoriesValue = 0;\r\n        this._annualMileage = 2;\r\n\r\n        this._financialInfo = null;\r\n        this._initialFinancial = null;\r\n\r\n        this._engineAndDrivetrain = null;\r\n        this._selectedModelIndex = 0;\r\n        this._selectedModel = null;\r\n        this._packages = null;\r\n\r\n        this._selectedPackageIndex = null;\r\n        this._selectedNonModelPackageIndex = null;\r\n        this._selectedWarrantyIndex = null;\r\n        this._selectedConnectedVehicleIndex = null;\r\n        this._selectedAddedProtectionIndex= null;\r\n        this._selectedAppearanceProtectionIndex = 0;\r\n        \r\n        this._selectedPackage = {\r\n            financial: {\r\n                msrp: 0\r\n            }\r\n        };\r\n        this._selectedNonModelPackage = {\r\n            financial: {\r\n                msrp: 0\r\n            }\r\n        };\r\n        this._selectedWarrantyPackage = {\r\n            financial: {\r\n                msrp: 0\r\n            }\r\n        };\r\n        this._selectedConnectedVehiclePackage = {\r\n            financial: {\r\n                msrp: 0\r\n            }\r\n        };\r\n        this._selectedAddedProtectionPackage = {\r\n            financial: {\r\n                msrp: 0\r\n            }\r\n        };\r\n        this._selectedAppearanceProtectionPackage = {\r\n            financial: {\r\n                msrp: 0\r\n            }\r\n        };                   \r\n\r\n        this._colours = null;\r\n        this._selectedColourInterior = null;\r\n        this._selectedColourInteriorIndex = -1;\r\n        this._selectedColourExterior = null;\r\n        this._selectedColourExteriorIndex = -1;\r\n        this._allowedColoursExterior = [];\r\n        this._wheels = null;\r\n        this._selectedWheel = null;\r\n        this._selectedWheelIndex = null;\r\n        this._accessories = null;\r\n        this._selectedAccessories = [];\r\n        this._categories = null;\r\n        this._selectedCategory = null;\r\n\r\n        this._incentives = null;\r\n        this._annualMileage = 2;\r\n\r\n        this.IncludeFees = true;\r\n\r\n        this.IncludeTaxes = false;\r\n\r\n        if(this.isProvinceAllowedToIncludeRebates())\r\n            this.IncludeRebates = true;\r\n        else\r\n            this.IncludeRebates = false;\r\n\r\n\r\n        this._showFinancePrice = true;\r\n\r\n        if (all) {\r\n            this.Current360Rotation = 18;\r\n\r\n            this._selectedModelYear = null;\r\n            sessionStorage.removeItem(Constants.SelectedModelYear);\r\n\r\n            this._availableTrims = null;\r\n            sessionStorage.removeItem(Constants.AvailableTrim);\r\n            sessionStorage.removeItem(Constants.LegalTrims);\r\n\r\n            this._financeTermIndex = 0;\r\n            this._leaseTermIndex = 0;\r\n            sessionStorage.removeItem(Constants.LeaseTermIndex);\r\n            sessionStorage.removeItem(Constants.FinanceTermIndex);\r\n\r\n            this._allDataIsLoaded = false;\r\n            sessionStorage.removeItem(Constants.AllDataIsLoaded);\r\n\r\n            sessionStorage.removeItem(Constants.SelectedAddedProtectionIndex);\r\n            sessionStorage.removeItem(Constants.SelectedAppearanceProtectionIndex);\r\n            sessionStorage.removeItem(Constants.SelectedAppearanceProtectionPlanPackageIndex);\r\n\r\n            this.LeaseTerm = null;\r\n            this.FinanceTerm = null;\r\n            this.AnnualMileage = 2;\r\n        }\r\n        sessionStorage.removeItem(Constants.Colours);\r\n        sessionStorage.removeItem(Constants.CurrentStep);\r\n        sessionStorage.removeItem(Constants.PreviousStep);\r\n        sessionStorage.removeItem(Constants.SelectedExteriorColour);\r\n        sessionStorage.removeItem(Constants.SelectedWheel);\r\n        sessionStorage.removeItem(Constants.SelectedWheelIndex);\r\n        sessionStorage.removeItem(Constants.SelectedModel);\r\n        sessionStorage.removeItem(Constants.FinancialObj);\r\n        sessionStorage.removeItem(Constants.Packages);\r\n\r\n        sessionStorage.removeItem(Constants.SelectedPackageIndex);\r\n        sessionStorage.removeItem(Constants.SelectedNonModelPackageIndex);\r\n        sessionStorage.removeItem(Constants.SelectedWarrantyIndex);\r\n        sessionStorage.removeItem(Constants.SelectedConnectedVehicleIndex);\r\n        \r\n        \r\n        sessionStorage.setItem(Constants.SelectedPackage, JSON.stringify(this._selectedPackage));\r\n        sessionStorage.setItem(Constants.SelectedNonModelPackage, JSON.stringify(this._selectedNonModelPackage));\r\n        sessionStorage.setItem(Constants.SelectedWarrantyPackage, JSON.stringify(this._selectedWarrantyPackage));\r\n        sessionStorage.setItem(Constants.SelectedConnectedVehiclePackage, JSON.stringify(this._selectedConnectedVehiclePackage));\r\n        sessionStorage.setItem(Constants.SelectedAddedProtectionPackage, JSON.stringify(this._selectedAddedProtectionPackage));\r\n        sessionStorage.setItem(Constants.SelectedAppearanceProtectionPackage, JSON.stringify(this._selectedAppearanceProtectionPackage));\r\n\r\n        sessionStorage.removeItem(Constants.SelectedTrim);\r\n        sessionStorage.removeItem(Constants.SelectedTrimIndex);\r\n        sessionStorage.removeItem(Constants.SelectedInteriorColour);\r\n        sessionStorage.removeItem(Constants.UrlSlugObjectTrims);\r\n        sessionStorage.removeItem(Constants.UrlSlugObjectEngineAndDrivetrain);\r\n        sessionStorage.removeItem(Constants.UrlSlugObjectPackage);\r\n        sessionStorage.removeItem(Constants.UrlSlugObjectColour);\r\n        sessionStorage.removeItem(Constants.UrlSlugObjectWheels);\r\n        sessionStorage.removeItem(Constants.UrlSlugObjectAccessories);\r\n        sessionStorage.removeItem(Constants.UrlSlugObjectPayments);\r\n        sessionStorage.removeItem(Constants.VehicleTitle);\r\n        sessionStorage.removeItem(Constants.SelectedAccessories);\r\n        sessionStorage.removeItem(Constants.TradeInValue);\r\n        sessionStorage.removeItem(Constants.DownPaymentValue);\r\n        sessionStorage.removeItem(Constants.AllowedColoursExterior);\r\n        sessionStorage.removeItem(Constants.LoyaltyChecked);\r\n        sessionStorage.removeItem(Constants.GraduateChecked);\r\n        sessionStorage.removeItem(Constants.MilitaryChecked);\r\n        sessionStorage.removeItem(Constants.FirstTimeOwnerChecked);\r\n        sessionStorage.removeItem(Constants.Accessories);\r\n        sessionStorage.removeItem(Constants.DefaultExteriorColour);\r\n        sessionStorage.removeItem(Constants.DefaultInteriorColour);\r\n        sessionStorage.removeItem(Constants.LegalEngineAndDrivetrain);\r\n        sessionStorage.removeItem(Constants.LegalPackage);\r\n        sessionStorage.removeItem(Constants.LegalColours);\r\n        sessionStorage.removeItem(Constants.LegalWheels);\r\n        sessionStorage.removeItem(Constants.LegalAccessories);\r\n        sessionStorage.removeItem(Constants.LegalPaymentInformation);\r\n        sessionStorage.removeItem(Constants.LegalSummary);\r\n        sessionStorage.removeItem(Constants.EngineAndDrivetrain);\r\n        sessionStorage.removeItem(Constants.SelectedModelIndex);\r\n        sessionStorage.removeItem(Constants.Wheels);\r\n        sessionStorage.removeItem(Constants.SpecificationData);\r\n        sessionStorage.removeItem(Constants.SelectedColourInteriorIndex);\r\n        sessionStorage.removeItem(Constants.SelectedColourExteriorIndex);\r\n        sessionStorage.removeItem(Constants.SelectedVehicle);\r\n        sessionStorage.removeItem(Constants.SelectedWheelSize);\r\n        sessionStorage.removeItem(Constants.InitialFinance);\r\n        sessionStorage.removeItem(Constants.PPSA);\r\n        sessionStorage.setItem(Constants.ShowFinancePrice, JSON.stringify(this._showFinancePrice));\r\n    }\r\n\r\n    /**\r\n     * is data loaded\r\n     */\r\n    isDataLoaded() {\r\n        var toReturn = this._selectedTrim && this._selectedPackage && this._colours && this._allowedColoursExterior && this._selectedAccessories && this._financialInfo && this._allDataIsLoaded;\r\n        //console.log(\"data is loaded\", toReturn);\r\n        return toReturn;\r\n    }\r\n\r\n    /**\r\n     * validate with the url params and if it's different reset the session storage\r\n     */\r\n    hasParamsDifferentThanCurrentSelection(year, carline, trim, model, option) {\r\n        if (this.SelectedTrim === null || this.SelectedModel === null)\r\n            return true;\r\n        else if (this.SelectedTrim.trim_type.url_slug.toLocaleLowerCase() !== trim.toLocaleLowerCase()) {\r\n            this.reset(false);\r\n            this._allDataIsLoaded = false;\r\n            sessionStorage.setItem(Constants.AllDataIsLoaded, this._allDataIsLoaded);\r\n            sessionStorage.removeItem('province');\r\n            console.log('has reset from different param');\r\n            return true;\r\n        } else if (this.SelectedModel.model_code.toLocaleLowerCase() !== model.toLocaleLowerCase()) {\r\n            this.reset(false);\r\n            this._allDataIsLoaded = false;\r\n            sessionStorage.setItem(Constants.AllDataIsLoaded, this._allDataIsLoaded);\r\n            sessionStorage.removeItem('province');\r\n            console.log('has reset from different param');\r\n            return true;\r\n        }\r\n\r\n        return false;\r\n    }\r\n\r\n    /**\r\n     * reload stored data\r\n     */\r\n    reloadStoredData() {\r\n        // Fire this first as it might take more time to resolve\r\n        (async() => {\r\n            const isRetailerMode = await this.isRetailerMode();\r\n            //console.log('FINISHED LOADING DATA FOR IS RETAILER MODE', isRetailerMode, this.getDealerVars());\r\n        })();\r\n\r\n        if (sessionStorage.getItem(Constants.AllDataIsLoaded)) {\r\n            this._allDataIsLoaded = JSON.parse(sessionStorage.getItem(Constants.AllDataIsLoaded));\r\n        }\r\n        if (sessionStorage.getItem(Constants.SelectedVehicle)) {\r\n            this.selectedVehicle = JSON.parse(sessionStorage.getItem(Constants.SelectedVehicle));\r\n        }\r\n        if (sessionStorage.getItem(Constants.CurrentStep)) {\r\n            this._currentStep = JSON.parse(sessionStorage.getItem(Constants.CurrentStep));\r\n        }\r\n        if (sessionStorage.getItem(Constants.PreviousStep)) {\r\n            this._previousStep = JSON.parse(sessionStorage.getItem(Constants.PreviousStep));\r\n        }\r\n        if (sessionStorage.getItem(Constants.SelectedModelYear)) {\r\n            this._selectedModelYear = JSON.parse(sessionStorage.getItem(Constants.SelectedModelYear));\r\n        }\r\n        if (sessionStorage.getItem(Constants.SelectedTrim)) {\r\n            this._selectedTrim = JSON.parse(sessionStorage.getItem(Constants.SelectedTrim));\r\n        }\r\n        if (sessionStorage.getItem(Constants.SelectedTrimIndex)) {\r\n            this._selectedTrimIndex = parseInt(sessionStorage.getItem(Constants.SelectedTrimIndex));\r\n        }\r\n        if (sessionStorage.getItem(Constants.Packages)) {\r\n            this._packages = JSON.parse(sessionStorage.getItem(Constants.Packages));\r\n        }\r\n        if (sessionStorage.getItem(Constants.SelectedPackage)) {\r\n            this._selectedPackage = JSON.parse(sessionStorage.getItem(Constants.SelectedPackage));\r\n        }\r\n        if (sessionStorage.getItem(Constants.SelectedNonModelPackage)) {\r\n            this._selectedNonModelPackage = JSON.parse(sessionStorage.getItem(Constants.SelectedNonModelPackage));\r\n        }\r\n        if (sessionStorage.getItem(Constants.SelectedWarrantyPackage)) {\r\n            this._selectedWarrantyPackage = JSON.parse(sessionStorage.getItem(Constants.SelectedWarrantyPackage));\r\n        }\r\n        if (sessionStorage.getItem(Constants.SelectedConnectedVehiclePackage)) {\r\n            this._selectedConnectedVehiclePackage = JSON.parse(sessionStorage.getItem(Constants.SelectedConnectedVehiclePackage));\r\n        }\r\n        if (sessionStorage.getItem(Constants.SelectedAddedProtectionPackage)) {\r\n            this._selectedAddedProtectionPackage = JSON.parse(sessionStorage.getItem(Constants.SelectedAddedProtectionPackage));\r\n        }             \r\n        if (sessionStorage.getItem(Constants.SelectedAppearanceProtectionPlansPackage)) {\r\n            this._selectedAppearanceProtectionPackage = JSON.parse(sessionStorage.getItem(Constants.SelectedAppearanceProtectionPlansPackage));\r\n        }\r\n\r\n        if (sessionStorage.getItem(Constants.SelectedPackageIndex)) {\r\n            this._selectedPackageIndex = JSON.parse(sessionStorage.getItem(Constants.SelectedPackageIndex));  // Allow null\r\n        }\r\n        if (sessionStorage.getItem(Constants.SelectedNonModelPackageIndex)) {\r\n            this._selectedNonModelPackageIndex = JSON.parse(sessionStorage.getItem(Constants.SelectedNonModelPackageIndex)); // Allow null\r\n        }\r\n        if (sessionStorage.getItem(Constants.SelectedWarrantyIndex)) {\r\n            this._selectedWarrantyIndex = JSON.parse(sessionStorage.getItem(Constants.SelectedWarrantyIndex));  // Allow null\r\n        }\r\n        if (sessionStorage.getItem(Constants.SelectedConnectedVehicleIndex)) {\r\n            this._selectedConnectedVehicleIndex = JSON.parse(sessionStorage.getItem(Constants.SelectedConnectedVehicleIndex)); // Allow null\r\n        }\r\n        if (sessionStorage.getItem(Constants.SelectedAddedProtectionIndex)) {\r\n            this._selectedAddedProtectionIndex = JSON.parse(sessionStorage.getItem(Constants.SelectedAddedProtectionIndex)); // Allow null\r\n        }\r\n        if (sessionStorage.getItem(Constants.SelectedAppearanceProtectionIndex)) {\r\n            this._selectedAppearanceProtectionIndex = JSON.parse(sessionStorage.getItem(Constants.SelectedAppearanceProtectionIndex)); // Allow null\r\n        }        \r\n        if (sessionStorage.getItem(Constants.SelectedAppearanceProtectionPlanPackageIndex)) {\r\n            this._selectedAppearanceProtectionPlanPackageIndex = JSON.parse(sessionStorage.getItem(Constants.SelectedAppearanceProtectionPlanPackageIndex)); // Allow null\r\n        }\r\n        \r\n        if (sessionStorage.getItem(Constants.SelectedWheel)) {\r\n            this._selectedWheel = JSON.parse(sessionStorage.getItem(Constants.SelectedWheel));\r\n        }\r\n        if (sessionStorage.getItem(Constants.SelectedWheelIndex)) {\r\n            this._selectedWheelIndex = parseInt(sessionStorage.getItem(Constants.SelectedWheelIndex));\r\n        }\r\n        if (sessionStorage.getItem(Constants.Wheels)) {\r\n            this._wheels = JSON.parse(sessionStorage.getItem(Constants.Wheels));\r\n        }\r\n        this._engineAndDrivetrain = JSON.parse(sessionStorage.getItem(Constants.EngineAndDrivetrain));\r\n        if (sessionStorage.getItem(Constants.SelectedModel)) {\r\n            this._selectedModel = JSON.parse(sessionStorage.getItem(Constants.SelectedModel));\r\n        }\r\n        if (sessionStorage.getItem(Constants.SelectedModelIndex)) {\r\n            this._selectedModelIndex = parseInt(sessionStorage.getItem(Constants.SelectedModelIndex));\r\n        }\r\n        this._colours = JSON.parse(sessionStorage.getItem(Constants.Colours));\r\n        this._selectedColourExterior = JSON.parse(sessionStorage.getItem(Constants.DefaultExteriorColour));\r\n        this._selectedColourInterior = JSON.parse(sessionStorage.getItem(Constants.DefaultInteriorColour));\r\n        if (sessionStorage.getItem(Constants.SelectedExteriorColour)) {\r\n            this._selectedColourExterior = JSON.parse(sessionStorage.getItem(Constants.SelectedExteriorColour));\r\n        }\r\n        if (sessionStorage.getItem(Constants.SelectedInteriorColour)) {\r\n            this._selectedColourInterior = JSON.parse(sessionStorage.getItem(Constants.SelectedInteriorColour));\r\n        }\r\n        if (sessionStorage.getItem(Constants.AllowedColoursExterior)) {\r\n            this._allowedColoursExterior = JSON.parse(sessionStorage.getItem(Constants.AllowedColoursExterior));\r\n        }\r\n        if (sessionStorage.getItem(Constants.SelectedColourExteriorIndex)) {\r\n            this._selectedColourExteriorIndex = parseInt(sessionStorage.getItem(Constants.SelectedColourExteriorIndex));\r\n        }\r\n        if (sessionStorage.getItem(Constants.SelectedColourInteriorIndex)) {\r\n            this._selectedColourInteriorIndex = parseInt(sessionStorage.getItem(Constants.SelectedColourInteriorIndex));\r\n        }\r\n        if (sessionStorage.getItem(Constants.SelectedAccessories)) {\r\n            this._selectedAccessories = JSON.parse(sessionStorage.getItem(Constants.SelectedAccessories));\r\n        }\r\n        if (sessionStorage.getItem(Constants.InitialFinance)) {\r\n            this._initialFinancial = JSON.parse(sessionStorage.getItem(Constants.InitialFinance));\r\n        }\r\n        if (sessionStorage.getItem(Constants.FinancialObj)) {\r\n            this._financialInfo = JSON.parse(sessionStorage.getItem(Constants.FinancialObj));\r\n        }\r\n        if (sessionStorage.getItem(Constants.LeaseTermIndex)) {\r\n            this._leaseTermIndex = parseInt(sessionStorage.getItem(Constants.LeaseTermIndex));\r\n        }\r\n        if (sessionStorage.getItem(Constants.FinanceTermIndex)) {\r\n            this._financeTermIndex = parseInt(sessionStorage.getItem(Constants.FinanceTermIndex));\r\n        }\r\n        if (sessionStorage.getItem(Constants.LoyaltyChecked)) {\r\n            this._loyaltyChecked = JSON.parse(sessionStorage.getItem(Constants.LoyaltyChecked));\r\n        }\r\n        if (sessionStorage.getItem(Constants.GraduateChecked)) {\r\n            this._graduateChecked = JSON.parse(sessionStorage.getItem(Constants.GraduateChecked));\r\n        }\r\n        if (sessionStorage.getItem(Constants.MilitaryChecked)) {\r\n            this._militaryChecked = JSON.parse(sessionStorage.getItem(Constants.MilitaryChecked));\r\n        }\r\n        if (sessionStorage.getItem(Constants.FirstTimeOwnerChecked)) {\r\n            this._firstTimeOwnerChecked = JSON.parse(sessionStorage.getItem(Constants.FirstTimeOwnerChecked));\r\n        }        \r\n        if (sessionStorage.getItem(Constants.TradeInValue)) {\r\n            this._tradeInValue = JSON.parse(sessionStorage.getItem(Constants.TradeInValue));\r\n        }\r\n        if (sessionStorage.getItem(Constants.DownPaymentValue)) {\r\n            this._downPaymentValue = JSON.parse(sessionStorage.getItem(Constants.DownPaymentValue));\r\n        }\r\n        if (sessionStorage.getItem(Constants.AnnualMileage)) {\r\n            this._annualMileage = parseInt(sessionStorage.getItem(Constants.AnnualMileage));\r\n        }\r\n        if (sessionStorage.getItem(Constants.Accessories)) {\r\n            this._accessories = JSON.parse(sessionStorage.getItem(Constants.Accessories));\r\n        }\r\n        if (sessionStorage.getItem(Constants.IncludeFees)) {\r\n            this._includeFees = JSON.parse(sessionStorage.getItem(Constants.IncludeFees));\r\n        }\r\n        if (sessionStorage.getItem(Constants.IncludeRebates)) {\r\n            this._includeRebates = JSON.parse(sessionStorage.getItem(Constants.IncludeRebates));\r\n        }\r\n        if (sessionStorage.getItem(Constants.IncludeTaxes)) {\r\n            this._includeTaxes = JSON.parse(sessionStorage.getItem(Constants.IncludeTaxes));\r\n        }\r\n        if (sessionStorage.getItem(Constants.AvailableTrim)) {\r\n            this._availableTrims = JSON.parse(sessionStorage.getItem(Constants.AvailableTrim));\r\n        }\r\n        if (sessionStorage.getItem(Constants.FinanceTerm)) {\r\n            this._financeTerm = parseInt(sessionStorage.getItem(Constants.FinanceTerm));\r\n        }\r\n        if (sessionStorage.getItem(Constants.LeaseTerm)) {\r\n            this._leaseTerm = parseInt(sessionStorage.getItem(Constants.LeaseTerm));\r\n        }\r\n        \r\n        this.RecalculateFinancialInfo();\r\n        if (this.FinancialInfo)\r\n            this.Incentives = this.getIncentives(this.FinancialInfo);\r\n\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * Set the default trim index to another one. This function has been introduced to hardcode the GS not beeing available on the the CX-90. HARDCODING IS BAD! \r\n     */\r\n    getDefaultTrimIndex(year, carline, trim, model, packageCode) {\r\n        let defaultTrimIndex = 0;\r\n\r\n        if (year === \"2024\" && (carline === 'CX-90-MHEV' || carline === 'CX-90-PHEV'))\r\n            defaultTrimIndex = 1;\r\n\r\n        if (year === \"2023\" && (carline === 'CX-5'))\r\n            defaultTrimIndex = 1;\r\n\r\n        return defaultTrimIndex;\r\n    }\r\n\r\n    /**\r\n     * Method that cascade and load all the data\r\n     */\r\n    async loadVehicleData(year, carline, trim, model, packageCode) {\r\n        await this.loadTrims(year, carline);\r\n\r\n        const defaultTrimIndex = this.getDefaultTrimIndex(year, carline, trim, model, packageCode);\r\n\r\n        if (trim) {\r\n            const trimIndex = this.AvailableTrim.trims.findIndex(x => x.trim_type.url_slug.toLocaleLowerCase() === trim.toLocaleLowerCase());\r\n            await this.setSelectedTrimIndex(trimIndex > -1 ? trimIndex : defaultTrimIndex);\r\n        } else {\r\n            await this.setSelectedTrimIndex(defaultTrimIndex);\r\n        }\r\n\r\n        if (model) {\r\n            const modelIndex = this.EngineAndDrivetrain.models.findIndex(x => x.model_code.toLocaleLowerCase() === model.toLocaleLowerCase());\r\n            await this.setSelectedModelIndex(modelIndex > -1 ? modelIndex : 0);\r\n        }\r\n\r\n        if (packageCode) {\r\n            const packageIndex = this.Packages.packages.findIndex(x => x.option_code.toLocaleLowerCase() === packageCode.toLocaleLowerCase());\r\n            // HOTFIX! PackageIndex variable need to be null to not force a package selection.\r\n            await this.setSelectedPackageIndex(packageIndex > -1 ? packageIndex : null);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Method that cascade and load all the data by build id.\r\n     */\r\n    async loadVehicleDataByBuildId(buildId) {\r\n\r\n        const data = await this._apiService.getBuildDataById(buildId);\r\n        if (data.status === 200 && data.data) {\r\n\r\n            const { year, carline, trim, tradeInValue, downPaymentValue, loyaltyChecked, militaryChecked, firstTimeOwnerChecked, graduateChecked, annualMileage, financeTerm, leaseTerm, accessories, modelCode, optionCode, includeTaxes, includeFees, includeRebates, SelectedWheelIndex, SelectedColourExteriorIndex, SelectedColourInteriorIndex, selectedNonModelPackageIndex, selectedWarrantyIndex, selectedConnectedVehicleIndex, selectedAddedProtectionIndex, selectedAppearanceProtectionIndex, selectedAppearanceProtectionPlanPackageIndex } = data.data.build_data;\r\n\r\n            this.selectedVehicle.year = year;\r\n            this.selectedVehicle.carline = carline;\r\n            this.selectedVehicle.trim = trim;\r\n\r\n            await this.loadVehicleData(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim);\r\n\r\n            await this.loadPackages(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n            // USING PARSE TO FIX THE 'NULL' instead of NULL            \r\n            if (JSON.parse(selectedNonModelPackageIndex))\r\n                this.SelectedNonModelPackageIndex = JSON.parse(selectedNonModelPackageIndex);\r\n\r\n            if (selectedWarrantyIndex)\r\n                this.SelectedWarrantyIndex = selectedWarrantyIndex;\r\n\r\n            /*if (JSON.parse(selectedConnectedVehicleIndex))\r\n                this.SelectedConnectedVehicleIndex = JSON.parse(selectedConnectedVehicleIndex);\r\n\r\n            if (JSON.parse(selectedAddedProtectionIndex))\r\n                this.SelectedAddedProtectionIndex = JSON.parse(selectedAddedProtectionIndex);\r\n\r\n            if (JSON.parse(selectedAppearanceProtectionIndex) && JSON.parse(selectedAppearanceProtectionPlanPackageIndex)) {\r\n                this.SelectedAppearanceProtectionIndex = JSON.parse(selectedAppearanceProtectionIndex);\r\n                this.SelectedAppearanceProtectionPlanPackageIndex = JSON.parse(selectedAppearanceProtectionPlanPackageIndex);\r\n            }*/\r\n\r\n            await this.loadColours(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n            this.SelectedColourExteriorIndex = SelectedColourExteriorIndex;\r\n            this.SelectedColourInteriorIndex = SelectedColourInteriorIndex;\r\n\r\n            await this.loadWheels(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n            if (SelectedWheelIndex) this.SelectedWheelIndex = SelectedWheelIndex;\r\n\r\n            await this.loadAccessories(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n            const accessoriesData = await this._apiService.getAccessories(modelCode, optionCode);\r\n            if (accessoriesData.accessories && accessories && accessories.length > 0) {\r\n                const parsed = this.parseAccessoriesData(accessoriesData.accessories.accessories);\r\n                if (parsed && parsed.All) {\r\n                    this.SelectedAccessories = parsed.All.filter(acc => accessories.includes(acc.part_number));\r\n                }\r\n            }\r\n\r\n            this.FinancialInfo = await this.getFinanceObjectWithCalculations(\r\n                this.FinancialInfo, this.TradeInValue, this.DownPaymentValue,\r\n                this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, \r\n                this.FinanceTermIndex, this.LeaseTermIndex, annualMileage\r\n            );\r\n\r\n            this.TradeInValue = tradeInValue;\r\n            this.DownPaymentValue = downPaymentValue;\r\n            this.LoyaltyChecked = loyaltyChecked;\r\n            this.GraduateChecked = graduateChecked;\r\n            this.MilitaryChecked = militaryChecked;\r\n            this.FirstTimeOwnerChecked = firstTimeOwnerChecked;\r\n            this.FinanceTermIndex = financeTerm;\r\n            this.LeaseTermIndex = leaseTerm;\r\n            if (annualMileage) this.AnnualMileage = annualMileage;\r\n            if (includeTaxes) this.IncludeTaxes = includeTaxes;\r\n            if (includeFees) this.IncludeFees = includeFees;\r\n            if (includeRebates) this.IncludeRebates = includeRebates;\r\n\r\n            await this.loadPayments(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n            await this.updateSingleLineFromFinancialProvider();\r\n\r\n            return data.data.build_data;\r\n        } else {\r\n            console.log('Error: ', data.msg)\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Presentation page - Select a vehicles\r\n     */\r\n    loadVehicles() {\r\n        return new Promise((resolve, reject) => {\r\n            if (window.bnp_under_maintenance) {\r\n                if (getLang() === \"en\") {\r\n                    const mock = require('../Services/vehiclesMockEn.json');\r\n                    resolve(mock.data);\r\n                } else {\r\n                    const mock = require('../Services/vehiclesMockFr.json');\r\n                    resolve(mock.data);\r\n                }\r\n            } else {\r\n                this._apiService.getVehicles()\r\n                    .then((data) => {\r\n                        resolve(data);\r\n                    }).catch(error => {\r\n                        console.log(error);\r\n                        reject(error);\r\n                    });\r\n            }\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Load Step 1 - Select a trim\r\n     */\r\n    async loadTrims(year, carline) {\r\n        this.selectedVehicle.year = year;\r\n        this.selectedVehicle.carline = carline;\r\n        sessionStorage.setItem(Constants.SelectedVehicle, JSON.stringify(this.selectedVehicle));\r\n\r\n        const trimData = await this._apiService.getTrims(this.selectedVehicle.year, this.selectedVehicle.carline);\r\n\r\n        // Added this patch to redirect to vehicle landing page when we don't receive any trim data array\r\n        if (!trimData || trimData.length === 0) {\r\n            if (this.language === 'fr')\r\n                window.location = '/fr/magasiner/construction-et-prix/';\r\n            else\r\n                window.location = '/en/shopping/build-and-price/';\r\n        }\r\n\r\n        this.SelectedModelYear = trimData.model_year;\r\n\r\n        this.AvailableTrim = trimData;\r\n    }\r\n\r\n    /**\r\n     * Load Step 2 - Select an engine and drivetrain\r\n     */\r\n    async loadEngineAndDrivetrain(year, carline, trim) {\r\n        this.selectedVehicle.year = year;\r\n        this.selectedVehicle.carline = carline;\r\n        this.selectedVehicle.trim = trim;\r\n        sessionStorage.setItem(Constants.SelectedVehicle, JSON.stringify(this.selectedVehicle));\r\n\r\n        const data = await this._apiService.getEngineAndDrivetrain(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim);\r\n\r\n        this.EngineAndDrivetrain = data;\r\n\r\n        sessionStorage.setItem(Constants.UrlSlugObjectEngineAndDrivetrain, JSON.stringify({ 'year': year, 'carline': carline, 'trim': trim }));\r\n    }\r\n\r\n    /**\r\n     * Load Step 3 - Select a package\r\n     */\r\n    async loadPackages(year, carline, trim, model, packageCode) {\r\n        this.selectedVehicle.year = year;\r\n        this.selectedVehicle.carline = carline;\r\n        this.selectedVehicle.trim = trim;\r\n        this.selectedVehicle.model = model;\r\n        this.selectedVehicle.packageCode = packageCode;\r\n        sessionStorage.setItem(Constants.SelectedVehicle, JSON.stringify(this.selectedVehicle));\r\n\r\n        const data = await this._apiService.getPackages(this.selectedVehicle.model, this.selectedVehicle.packageCode);\r\n\r\n        this.Packages = data;\r\n        this.SelectedPackageIndex = null;\r\n        this.SelectedNonModelPackageIndex = null;\r\n        this.SelectedConnectedVehicleIndex = null;\r\n        this.SelectedWarrantyIndex = null;\r\n\r\n        sessionStorage.setItem(Constants.UrlSlugObjectPackage, JSON.stringify({ 'year': year, 'carline': carline, 'trim': trim, 'model': model, 'packageCode': packageCode }));\r\n    }\r\n\r\n    getAllowedExteriorsIds(exteriors) {\r\n        let allowedExteriors = [];\r\n        exteriors.forEach(exterior => {\r\n            allowedExteriors.push(exterior.id);\r\n        });\r\n        return allowedExteriors;\r\n    }\r\n\r\n    /**\r\n     * Load Step 4 - Select the exterior and interior color\r\n     */\r\n    async loadColours(year, carline, trim, model, packageCode) {\r\n        this.selectedVehicle.year = year;\r\n        this.selectedVehicle.carline = carline;\r\n        this.selectedVehicle.trim = trim;\r\n        this.selectedVehicle.model = model;\r\n        this.selectedVehicle.packageCode = packageCode;\r\n        sessionStorage.setItem(Constants.SelectedVehicle, JSON.stringify(this.selectedVehicle));\r\n\r\n        const data = await this._apiService.getColours(this.selectedVehicle.model, this.selectedVehicle.packageCode)\r\n\r\n        this.InitialFinancial = data.financial;\r\n        this.Incentives = this.getIncentives(this.InitialFinancial);\r\n        this.Colours = data;\r\n        sessionStorage.setItem(Constants.UrlSlugObjectColour, JSON.stringify({ 'year': year, 'carline': carline, 'trim': trim, 'model': model, 'packageCode': packageCode }));\r\n\r\n        const defaultInteriorColour = this.Colours.visual.interiors[0];\r\n        const defaultExteriorColour = defaultInteriorColour.default_exterior;\r\n        sessionStorage.setItem(Constants.DefaultInteriorColour, JSON.stringify(defaultInteriorColour));\r\n        sessionStorage.setItem(Constants.DefaultExteriorColour, JSON.stringify(defaultExteriorColour));\r\n\r\n        this.Colours.visual.interiors.map((Colour, index) => {\r\n            if (defaultInteriorColour.id === Colour.id)\r\n                this.SelectedColourInteriorIndex = index;\r\n        });\r\n\r\n        Object.entries(this.Colours.visual.exteriors).map((Colour, index) => {\r\n            if (defaultExteriorColour.id === Colour[1]['id'])\r\n                this.SelectedColourExteriorIndex = index;\r\n        });\r\n\r\n        this.AllowedColoursExterior = this.getAllowedExteriorsIds(this.Colours.visual.interiors[this.SelectedColourInteriorIndex].allowed_exteriors);\r\n    }\r\n\r\n    /**\r\n     * Load Step 5 - Select a wheel\r\n     */\r\n    async loadWheels(year, carline, trim, model, packageCode) {\r\n        this.selectedVehicle.year = year;\r\n        this.selectedVehicle.carline = carline;\r\n        this.selectedVehicle.trim = trim;\r\n        this.selectedVehicle.model = model;\r\n        this.selectedVehicle.packageCode = packageCode;\r\n        sessionStorage.setItem(Constants.SelectedVehicle, JSON.stringify(this.selectedVehicle));\r\n\r\n        const data = await this._apiService.getWheels(model, packageCode);\r\n        //console.log(data);\r\n\r\n        this.InitialFinancial = data.financial;\r\n        this.Wheels = data;\r\n        sessionStorage.setItem(Constants.UrlSlugObjectWheels, JSON.stringify({ 'year': year, 'carline': carline, 'trim': trim, 'model': model, 'packageCode': packageCode }));\r\n    }\r\n\r\n    /**\r\n     * Load Step 6 - Select one or many accessory\r\n     */\r\n    async loadAccessories(year, carline, trim, model, packageCode) {\r\n        this.selectedVehicle.year = year;\r\n        this.selectedVehicle.carline = carline;\r\n        this.selectedVehicle.trim = trim;\r\n        this.selectedVehicle.model = model;\r\n        this.selectedVehicle.packageCode = packageCode;\r\n        sessionStorage.setItem(Constants.SelectedVehicle, JSON.stringify(this.selectedVehicle));\r\n\r\n        const data = await this._apiService.getAccessories(model, packageCode);\r\n\r\n        this.InitialFinancial = data.financial;\r\n\r\n        this.FinancialInfo = this.getFinanceObjectWithCalculations(data.financial, '', '', false, false, false, false, null, null);\r\n        this.Accessories = {\r\n            'data': this.parseAccessoriesData(data.accessories.accessories),\r\n            'title': data.title,\r\n            'rawData': Object.entries(data.accessories.accessories)\r\n        };\r\n        sessionStorage.setItem(Constants.UrlSlugObjectAccessories, JSON.stringify({ 'year': year, 'carline': carline, 'trim': trim, 'model': model, 'packageCode': packageCode }));\r\n    }\r\n\r\n    /**\r\n     * Load Step 7 - Payment information\r\n     */\r\n    async loadPayments(year, carline, trim, model, packageCode) {\r\n        this.selectedVehicle.year = year;\r\n        this.selectedVehicle.carline = carline;\r\n        this.selectedVehicle.trim = trim;\r\n        this.selectedVehicle.model = model;\r\n        this.selectedVehicle.packageCode = packageCode;\r\n        sessionStorage.setItem(Constants.SelectedVehicle, JSON.stringify(this.selectedVehicle));\r\n\r\n        // Preload missing data to set the payment\r\n        if (!this.InitialFinancial) {\r\n            await this.loadColours(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.selectedVehicle.model, this.selectedVehicle.packageCode);\r\n        }\r\n\r\n        const data = await this._apiService.getPayments(model, packageCode);\r\n\r\n        const financial = this.InitialFinancial;\r\n        this.FinancialInfo = this.getFinanceObjectWithCalculations(financial, '', '', false, false, false, false, null, null);\r\n        sessionStorage.setItem(Constants.UrlSlugObjectPayments, JSON.stringify({ 'year': year, 'carline': carline, 'trim': trim, 'model': model, 'packageCode': packageCode }));\r\n\r\n        // Reset the value\r\n        if(getParams()['tve'] === undefined){\r\n            this.TradeInValue = 0;\r\n        } else {\r\n            this.TradeInValue = getParams()['tve'][0];\r\n        }\r\n\r\n        this.DownPaymentValue = 0;\r\n        this.LoyaltyChecked = false;\r\n        this.GraduateChecked = false;\r\n        this.MilitaryChecked = false;\r\n\r\n        // SET DEFAULT VALUE for first time owner when it has a value.  Part of a campaign\r\n        this.FirstTimeOwnerChecked = false; //this.FinancialInfo.incentive_programs.find(x => x.type === \"first_time_owner\").value;\r\n\r\n\r\n\r\n        // Make sure that we have a lease term index value or we set the highest one\r\n        if (this.LeaseTerm) {\r\n            let foundIndex = this.FinancialInfo.lease.findIndex(x => x.term === this.LeaseTerm);\r\n\r\n            if (foundIndex > -1)\r\n                this.LeaseTermIndex = foundIndex;\r\n            else\r\n                this.LeaseTermIndex = this.FinancialInfo.lease.length - 1;\r\n\r\n        } else {\r\n            // HARDCODED RULES ADDED FOR QUEBEC\r\n            if (carline === 'CX-90-PHEV' && getProvince() === 'QC') {\r\n                this.LeaseTermIndex = this.FinancialInfo.lease.findIndex(x => x.term === 36);\r\n            } else {\r\n                this.LeaseTermIndex = this.FinancialInfo.lease.length - 1;\r\n            }\r\n        }\r\n\r\n        if (this.FinanceTerm) {\r\n            let foundIndex = this.FinancialInfo.apr.findIndex(x => x.term === this.FinanceTerm);\r\n            if (foundIndex > -1)\r\n                this.FinanceTermIndex = foundIndex;\r\n            else\r\n                this.FinanceTermIndex = this.FinancialInfo.apr.length - 1;\r\n        } else {\r\n            this.FinanceTermIndex = this.FinancialInfo.apr.length - 1;\r\n        }\r\n\r\n        this.Incentives = this.getIncentives(this.FinancialInfo);\r\n    }\r\n\r\n    /**\r\n     * Load Step 8 - Load the summary. This function should be sooner or later deprecated because we have thw hole object\r\n     */\r\n    async loadSummary(year, carline, trim, model, packageCode) {\r\n        this.selectedVehicle.year = year;\r\n        this.selectedVehicle.carline = carline;\r\n        this.selectedVehicle.trim = trim;\r\n        this.selectedVehicle.model = model;\r\n        this.selectedVehicle.packageCode = packageCode;\r\n        sessionStorage.setItem(Constants.SelectedVehicle, JSON.stringify(this.selectedVehicle));\r\n\r\n        const data = await this._apiService.getSummary(model, packageCode);\r\n        \r\n        // Set new legal\r\n        sessionStorage.setItem(Constants.LegalTrims, JSON.stringify(buildLegalContent(data.trims, data.incentives)));\r\n        sessionStorage.setItem(Constants.LegalOption, JSON.stringify(buildLegalContent(data.options, data.incentives)));\r\n        sessionStorage.setItem(Constants.LegalColours, JSON.stringify(buildLegalContent(data.colours, data.incentives)));\r\n        sessionStorage.setItem(Constants.LegalWheels, JSON.stringify(buildLegalContent(data.wheels, data.incentives)));\r\n        sessionStorage.setItem(Constants.LegalConnectivity, JSON.stringify(buildLegalContent(data.connectivity, data.incentives)));\r\n        sessionStorage.setItem(Constants.LegalAccessories, JSON.stringify(buildLegalContent(data.accessories, data.incentives)));        \r\n        sessionStorage.setItem(Constants.LegalProtections, JSON.stringify(buildLegalContent(data.protection, data.incentives)));\r\n        sessionStorage.setItem(Constants.LegalPaymentInformation, JSON.stringify(buildLegalContent(data.payments, data.incentives)));\r\n        sessionStorage.setItem(Constants.LegalSummary, JSON.stringify(buildLegalContent(data.summary)));\r\n                \r\n        this.reloadStoredData();\r\n    }\r\n\r\n    /**\r\n     * Load Step 8 - Load the summary. This function should be sooner or later deprecated because we have thw hole object\r\n     */\r\n    async loadVehiclesLegal(modelCode, packageCode) {\r\n        if (window.bnp_under_maintenance) {\r\n            if (getLang() === \"en\") {\r\n                const mock = require('../Services/vehiclesLegalMockEn.json');\r\n                return mock.data.vehicles;\r\n            } else {\r\n                const mock = require('../Services/vehiclesLegalMockFr.json');\r\n                return mock.data.vehicles;\r\n            }\r\n        } else {\r\n            // HARDCODING MODEL AND PACKAGE CODE AS IT DOESN'T MATTER FOR THE VEHICLE LANDING PAGE LEGAL\r\n            const data = await this._apiService.getSummary(modelCode, packageCode);\r\n\r\n            // Set new legal\r\n            sessionStorage.setItem(Constants.LegalVehicles, JSON.stringify(buildLegalContent(data.vehicles)));\r\n\r\n            return data.vehicles;\r\n        }\r\n    }    \r\n\r\n    async loadSpecsData(model, packageCode) {\r\n        const data = await this._apiService.getSpecificationsData(model, packageCode);\r\n\r\n        sessionStorage.setItem(Constants.SpecificationData, JSON.stringify(data[0].specifications));\r\n    }\r\n\r\n    hasDefaultInteriorColorSelected() {\r\n        let hasDefaultInteriorColorSelected = false;\r\n\r\n        const selectedInteriorColour = JSON.parse(sessionStorage.getItem(Constants.SelectedInteriorColour));\r\n        if (this.Colours && selectedInteriorColour) {\r\n            // Look if the interior colour isn't a default selection\r\n            const defaultInteriorColour = this.Colours.visual.interiors[0];\r\n            if (defaultInteriorColour.id === selectedInteriorColour.id)\r\n                hasDefaultInteriorColorSelected = true;\r\n        }\r\n\r\n        return hasDefaultInteriorColorSelected;\r\n    }\r\n\r\n    hasDefaultExteriorColorSelected() {\r\n        let hasDefaultExteriorColorSelected = false;\r\n\r\n        const selectedExteriorColour = JSON.parse(sessionStorage.getItem(Constants.SelectedExteriorColour));\r\n        if (this.Colours && selectedExteriorColour) {\r\n            const defaultInteriorColour = this.Colours.visual.interiors[0];\r\n            const defaultExteriorColour = defaultInteriorColour.default_exterior;\r\n            if (defaultExteriorColour.id === selectedExteriorColour.id)\r\n                hasDefaultExteriorColorSelected = true;\r\n        }\r\n\r\n        return hasDefaultExteriorColorSelected;\r\n    }\r\n\r\n    displayWarning() {\r\n        let showWarningMessage = false;\r\n\r\n        switch (this.CurrentStep) {\r\n            case 1: // TRIM\r\n            case 2: // ENGINE AND DRIVETRAIN\r\n                if (this.SelectedPackageIndex != null || this.SelectedNonModelPackageIndex != null || this.SelectedWarrantyIndex != null || this.SelectedConnectedVehicleIndex != null)\r\n                    showWarningMessage = true;\r\n\r\n                if (this.hasDefaultExteriorColorSelected() && this.hasDefaultInteriorColorSelected()) {\r\n                    // console.log('no default color selected');\r\n                } else {\r\n                    showWarningMessage = true;\r\n                }\r\n\r\n                if (this.SelectedAccessories && this.SelectedAccessories.length > 0)\r\n                    showWarningMessage = true;\r\n\r\n                if (this.SelectedWheel)\r\n                    showWarningMessage = true;\r\n                break;\r\n            case 3: // PACKAGES\r\n            case 4: // COLORS\r\n            case 5: // WHEELS:\r\n            case 6: // ACCESSORIES\r\n            default:\r\n                showWarningMessage = false;\r\n        }\r\n\r\n        // if (this._selectedModelIndex > 0 || this._selectedPackageIndex != null || this.SelectedNonModelPackageIndex != null|| this._selectedColourExteriorIndex > 0 || this._selectedColourInteriorIndex > 0)\r\n        //     showWarningMessage = true;\r\n\r\n        return showWarningMessage;\r\n    }\r\n\r\n\r\n    // todo move to utility class\r\n    groupBy(xs, key) {\r\n        return xs.reduce(function (rv, x) {\r\n            (rv[x[key].title] = rv[x[key].title] || []).push(x);\r\n            return rv;\r\n        }, {});\r\n    };\r\n\r\n    get VehicleTitle() {\r\n        let title;\r\n        let plainTitle;\r\n        let mazda = '';\r\n        const yearName = this.EngineAndDrivetrain ?.model_year ?.year ?.title;\r\n        const modelName = this.EngineAndDrivetrain ?.model_year ?.carline ?.title;\r\n        const trimName = this.EngineAndDrivetrain ?.trim ?.trim_type ?.name\r\n        switch (this.CurrentStep) {\r\n            case 7: // payment\r\n            case 1: // trim\r\n            case 2: // engine & drivetrain\r\n            case 3: // packages\r\n            case 4: // colours\r\n            case 5: // wheels\r\n            case 6: // accessories\r\n            default:\r\n                let sup = '';\r\n                if (modelName ?.includes('CX-90') && trimName == 'GS' && yearName === '2024') {\r\n                    sup = '<sup>✦</sup>';\r\n                }\r\n                if (modelName ?.includes('Mazda CX-50 Hybrid') && trimName == 'GS-L' && yearName === '2025') {\r\n                    sup = '<sup>†</sup>';\r\n                }                \r\n\r\n                if (title && !(modelName.toUpperCase().includes(\"MAZDA\")))\r\n                    mazda = 'MAZDA';\r\n                if (this._language === \"en\") {\r\n                    title = `${yearName} ${mazda} ${modelName} ${trimName}${sup} `;\r\n\r\n                } else { // assume that it's french\r\n                    if (modelName === undefined) {\r\n                        title = ``;\r\n                    } else {\r\n                        title = `${mazda} ${modelName} ${trimName} ${yearName}${sup}`; //this.EngineAndDrivetrain?.trim?.title;\r\n                        //plainTitle = `${mazda} ${modelName} ${trimName} ${yearName}`;\r\n                        plainTitle = `${modelName}`;\r\n                    }\r\n                }\r\n                // set title without any other bells and whistles\r\n                plainTitle = `${modelName}`;\r\n                sessionStorage.setItem('plainTitle', plainTitle.replace(new RegExp('mazda ', 'ig'), ''));\r\n                break;\r\n        }\r\n\r\n        if (!title)\r\n            title = sessionStorage.getItem(Constants.VehicleTitle); // Hack for not showing undefined when switching trim\r\n        if (title !== '' && (title === null || title.includes('undefined')))\r\n            return '';\r\n        else\r\n            return title;\r\n    }\r\n\r\n    /**\r\n     * Recalculate the object FinancialInfo used at many place\r\n     */\r\n    async RecalculateFinancialInfo() {\r\n        await this.loadFromFinancialProvider();\r\n\r\n        if (this.FinancialInfo) {\r\n            this.FinancialInfo = this.getFinanceObjectWithCalculations(this.FinancialInfo, this._tradeInValue, this._downPaymentValue, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.FinanceTermIndex, this.LeaseTermIndex, this.AnnualMileage);\r\n        }\r\n        return this.FinancialInfo;\r\n    }\r\n\r\n    /**\r\n     * getFinanceObjectWithCalculations\r\n     */\r\n    getFinanceObjectWithCalculations(financialObj, tradeInValue, downPaymentValue, loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked, financeTermIndex, leaseTermIndex, annualMileage) {\r\n        // Save the financial object initial states in storage for later fetching PPSA\r\n        sessionStorage.setItem(Constants.FinancialObj, JSON.stringify(financialObj));        \r\n\r\n        let accessories = 0;\r\n        if (typeof annualMileage === \"undefined\") {\r\n            annualMileage = 0;\r\n        } else {\r\n            annualMileage = parseInt(annualMileage);\r\n        }\r\n        if (!tradeInValue) tradeInValue = '0';\r\n        tradeInValue = tradeInValue !== '' ? parseInt(tradeInValue.toString().replace('$', '')) : 0;\r\n        if (!downPaymentValue) downPaymentValue = '0';\r\n        downPaymentValue = downPaymentValue !== '' ? parseInt(downPaymentValue.toString().replace('$', '')) : 0;\r\n\r\n        financialObj.tradeInValue = parseInt(tradeInValue);\r\n        financialObj.downPaymentValue = parseInt(downPaymentValue);\r\n        financialObj.loyaltyChecked = loyaltyChecked;\r\n        financialObj.militaryChecked = militaryChecked;\r\n        financialObj.graduateChecked = graduateChecked;\r\n        financialObj.firstTimeOwnerChecked = firstTimeOwnerChecked;\r\n        financialObj.accessoriesValue = accessories;\r\n        financialObj.annualMileage = annualMileage;\r\n        financialObj.financeTerm = financeTermIndex !== null ? financeTermIndex : financialObj.apr.length - 1;\r\n        financialObj.leaseTerm = leaseTermIndex !== null ? leaseTermIndex : financialObj.lease.length - 1;\r\n        financialObj.incentive_programs = financialObj.incentive_programs ? financialObj.incentive_programs : [];\r\n        financialObj.package = this.SelectedPackage;\r\n        financialObj.warranty = this.SelectedWarrantyPackage;\r\n        financialObj.connectedVehicle = this.SelectedConnectedVehiclePackage;\r\n        financialObj.addedProtection = this.SelectedAddedProtectionPackage;\r\n        financialObj.appearanceProtection = this.SelectedAppearanceProtectionPlansPackage;\r\n        \r\n        \r\n        // FEES EXTRACTION\r\n\r\n        financialObj.freight = financialObj.fees.filter((fee) => fee.title === 'Freight').length ? financialObj.fees.filter((fee) => fee.title === 'Freight')[0].price : 0;\r\n        financialObj.pde = financialObj.fees.filter((fee) => fee.title === 'PDE').length ? financialObj.fees.filter((fee) => fee.title === 'PDE')[0].price : 0;\r\n        financialObj.acTax = financialObj.fees.filter((fee) => fee.title === 'A/C Tax').length ? financialObj.fees.filter((fee) => fee.title === 'A/C Tax')[0].price : 0;\r\n        financialObj.exciseTax = financialObj.fees.filter((fee) => fee.title === 'Federal Excise Tax').length ? financialObj.fees.filter((fee) => fee.title === 'Federal Excise Tax')[0].price : 0;\r\n        financialObj.amvic = financialObj.fees.filter((fee) => fee.title === 'AMVIC').length ? financialObj.fees.filter((fee) => fee.title === 'AMVIC')[0].price : 0;\r\n        financialObj.omvic = financialObj.fees.filter((fee) => fee.title === 'OMVIC').length ? financialObj.fees.filter((fee) => fee.title === 'OMVIC')[0].price : 0;\r\n        financialObj.tireStewardshipFee = financialObj.fees.filter((fee) => fee.title === 'Tire Shewardship Fee').length ? financialObj.fees.filter((fee) => fee.title === 'Tire Shewardship Fee')[0].price : 0;\r\n        financialObj.oil = financialObj.fees.filter((fee) => fee.title === 'Oil').length ? financialObj.fees.filter((fee) => fee.title === 'Oil')[0].price : 0;\r\n\r\n        // LEASE AND ADMIN SERVICE FEES ARE THE SAME STARTING 1ST JANUARY 2024 // 595\r\n        financialObj.leaseServiceFees = financialObj.fees.filter((fee) => fee.title === 'Administration Fee').length ? financialObj.fees.filter((fee) => fee.title === 'Administration Fee')[0].price : 0;\r\n        financialObj.adminServiceFees = financialObj.fees.filter((fee) => fee.title === 'Administration Fee').length ? financialObj.fees.filter((fee) => fee.title === 'Administration Fee')[0].price : 0;\r\n\r\n        financialObj.mazdaCashIncentive = financialObj.incentive_programs.filter((fee) => fee.type === 'mazda_retail_cash').length ? financialObj.incentive_programs.filter((fee) => fee.type === 'mazda_retail_cash')[0].value : 0;\r\n\r\n        financialObj.calculatedCash = this.cashCalculator(financialObj, tradeInValue, downPaymentValue, loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked);\r\n        financialObj.calculatedFinance = this.loanCalculator(financialObj, tradeInValue, downPaymentValue, loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked);\r\n        financialObj.calculatedLease = this.leaseCalculator(financialObj, tradeInValue, downPaymentValue, loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked, annualMileage);\r\n       \r\n        financialObj.minDownPayment = 0;\r\n        financialObj.maxDownPayment = this.getMaxDownPayment(financialObj);\r\n        sessionStorage.setItem(Constants.FinancialObj, JSON.stringify(financialObj));\r\n\r\n        return financialObj;\r\n    }\r\n\r\n    /**\r\n     * cashCalculator\r\n     */\r\n    cashCalculator(financialObj, tradeInValue, downPaymentValue, loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked) {\r\n        let tempIncentives = financialObj.incentive_programs.find(element => element.type === \"incentive\");\r\n\r\n        const cashObj = {};\r\n        cashObj.tax = this.getTax();\r\n        cashObj.accessories = this.getAccessories();\r\n        cashObj.options = this.getOptions();\r\n        cashObj.feesAndLevies = this.getFeesAndLeaves(true, false);\r\n        cashObj.incentives = this.getIncentivesObj(loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked, true);\r\n        cashObj.mazdaRetailCash = this.getIncentives(financialObj) ?.mazda_retail_cash ?.value || 0;\r\n        cashObj.specialIncentives = tempIncentives ? tempIncentives.value != null ? tempIncentives.value : 0 : 0;\r\n\r\n        cashObj.evRebates = this.getEvRebate(financialObj);\r\n        cashObj.tradeInValue = parseInt(tradeInValue);\r\n        cashObj.downPaymentValue = parseInt(downPaymentValue);\r\n\r\n        cashObj.mazdaPrice = financialObj.msrp + \r\n        /*financialObj.package.financial.msrp + \r\n        //financialObj.connectedVehicle.financial.msrp + \r\n        /*financialObj.warranty.financial.msrp +  */\r\n        //financialObj.addedProtection.financial.msrp + \r\n        //financialObj.appearanceProtection.financial.msrp +\r\n        cashObj.options.displayedTotal + \r\n        //cashObj.accessories.total + \r\n        financialObj.freight +\r\n        financialObj.pde +\r\n        financialObj.adminServiceFees;\r\n\r\n        const nonTaxableInc = cashObj.incentives.nonTaxable.total + financialObj.mazdaCashIncentive;\r\n        const taxableInc = cashObj.incentives.taxable.total;\r\n        const evRebate = cashObj.evRebates.total.cash;\r\n\r\n        const subTotal = financialObj.msrp \r\n        + cashObj.options.total \r\n        + cashObj.accessories.total \r\n        - cashObj.tradeInValue \r\n        - cashObj.downPaymentValue \r\n        - cashObj.specialIncentives \r\n        - taxableInc \r\n        + financialObj.freight \r\n        + financialObj.pde\r\n        + financialObj.adminServiceFees;\r\n        cashObj.subtotal = subTotal - nonTaxableInc;\r\n        cashObj.subtotalTaxed = subTotal + (subTotal * cashObj.tax) - nonTaxableInc;\r\n        cashObj.subtotalTaxes = subTotal * cashObj.tax;\r\n\r\n        const subtotalFees = subTotal;\r\n        cashObj.subtotalWithFees = subtotalFees - nonTaxableInc + cashObj.feesAndLevies.total;\r\n        cashObj.subtotalWithFeesTaxed = subtotalFees + (subtotalFees * cashObj.tax) - nonTaxableInc + cashObj.feesAndLevies.total;\r\n        cashObj.subtotalWithFeesTaxes = subtotalFees * cashObj.tax;\r\n\r\n        const incentiveRebates = subTotal;\r\n        cashObj.subtotalWithIncentiveRebates = incentiveRebates - nonTaxableInc;\r\n        cashObj.subtotalWithIncentiveRebatesAndEvRebates = incentiveRebates - evRebate - nonTaxableInc;\r\n        cashObj.subtotalWithIncentiveRebatesAndEvRebatesTaxed = incentiveRebates + (incentiveRebates * cashObj.tax) - evRebate - nonTaxableInc;\r\n        cashObj.subtotalWithIncentiveRebatesAndEvRebatesTaxes = incentiveRebates * cashObj.tax;\r\n\r\n        const feesRebates = subTotal;\r\n        cashObj.subtotalWithFeesWithRebates = feesRebates - nonTaxableInc;\r\n        cashObj.subtotalWithFeesWithRebatesAndEvRebates = feesRebates - nonTaxableInc - evRebate +cashObj.feesAndLevies.total;\r\n        cashObj.subtotalWithFeesWithRebatesTaxed = feesRebates + (feesRebates * cashObj.tax) - evRebate - nonTaxableInc + cashObj.feesAndLevies.total;\r\n        cashObj.subtotalWithFeesWithRebatesTaxes = feesRebates * cashObj.tax;\r\n\r\n        return cashObj;\r\n    }\r\n\r\n    /**\r\n     * leaseCalculator\r\n     */\r\n    leaseCalculator(financialObj, tradeInValue, downPaymentValue, loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked, annualMileage) {\r\n        let tempIncentives = financialObj.incentive_programs.find(element => element.type === \"incentive\");\r\n\r\n        const leaseObj = {};\r\n        leaseObj.tax = this.getTax();\r\n        leaseObj.accessories = this.getAccessories();\r\n        leaseObj.options = this.getOptions();\r\n        leaseObj.feesAndLevies = this.getFeesAndLeaves(true, true);\r\n        leaseObj.incentives = this.getIncentivesObj(loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked);\r\n        leaseObj.rewards = this.getRewardsList(loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked);\r\n        leaseObj.mazdaRetailCash = this.getIncentives(financialObj)?.mazda_retail_cash?.value || 0;\r\n        leaseObj.specialIncentives = tempIncentives ? tempIncentives.value != null ? tempIncentives.value : 0 : 0;\r\n\r\n        leaseObj.evRebates = this.getEvRebate(financialObj);\r\n        leaseObj.tradeInValue = parseInt(tradeInValue);\r\n        leaseObj.downPaymentValue = parseInt(downPaymentValue);\r\n        leaseObj.downPaymentTax = leaseObj.downPaymentValue * leaseObj.tax;\r\n        leaseObj.kilometersLeaseValue = annualMileage;\r\n        \r\n        if (!financialObj.calculatedLease || !financialObj.calculatedLease.leaseValues)\r\n            leaseObj.leaseValues = [...financialObj.lease];\r\n        else\r\n            leaseObj.leaseValues = financialObj.calculatedLease.leaseValues;\r\n\r\n        leaseObj.subtotal = financialObj.msrp\r\n            + financialObj.addedProtection.financial.msrp \r\n            + financialObj.appearanceProtection.financial.msrp\r\n            + financialObj.warranty.financial.msrp\r\n            + financialObj.connectedVehicle.financial.msrp\r\n            + leaseObj.options.total\r\n            + leaseObj.accessories.total\r\n            - leaseObj.tradeInValue\r\n            - leaseObj.specialIncentives\r\n            - leaseObj.incentives.taxable.total\r\n            + leaseObj.leaseValues[this.LeaseTermIndex].ppsa\r\n            + financialObj.freight\r\n            + financialObj.pde;\r\n            \r\n\r\n            //total.federal_tax\r\n        //leaseObj.subtotalTaxed = leaseObj.subtotal + (leaseObj.subtotal * leaseObj.tax);\r\n        leaseObj.subtotalWithFees = leaseObj.subtotal + leaseObj.feesAndLevies.total + financialObj.adminServiceFees;\r\n        leaseObj.subtotalWithFeesTaxed = leaseObj.subtotalWithFees + (leaseObj.subtotalWithFees * leaseObj.tax);\r\n        leaseObj.subtotalWithRebates = leaseObj.subtotal - leaseObj.incentives.taxable.total - (leaseObj?.evRebates?.total?.lease ?? 0);\r\n        leaseObj.subtotalWithRebatesTaxed = leaseObj.subtotalWithRebates + (leaseObj.subtotalWithRebates * leaseObj.tax);\r\n        leaseObj.subtotalWithFeesWithRebates = leaseObj.subtotal + leaseObj.feesAndLevies.total + financialObj.adminServiceFees - leaseObj.incentives.taxable.total - (leaseObj?.evRebates?.total?.lease ?? 0);\r\n        leaseObj.subtotalWithFeesWithRebatesTaxed = leaseObj.subtotalWithFeesWithRebates + (leaseObj.subtotalWithFeesWithRebates * leaseObj.tax);\r\n\r\n        leaseObj.balanceToLease = leaseObj.subtotal - leaseObj.incentives.nonTaxable.total - leaseObj.downPaymentValue;\r\n        //leaseObj.balanceToLeaseTaxed = leaseObj.subtotalTaxed - leaseObj.incentives.nonTaxable.total - leaseObj.downPaymentValue;\r\n        leaseObj.balanceToLeaseWithFees = leaseObj.subtotalWithFees - leaseObj.incentives.nonTaxable.total - leaseObj.downPaymentValue;\r\n        //leaseObj.balanceToLeaseWithFeesTaxed = leaseObj.subtotalWithFeesTaxed - leaseObj.incentives.nonTaxable.total - leaseObj.downPaymentValue;\r\n        leaseObj.balanceToLeaseWithRebates = leaseObj.subtotalWithRebates - leaseObj.incentives.nonTaxable.total - leaseObj.downPaymentValue;\r\n        //leaseObj.balanceToLeaseWithRebatesTaxed = leaseObj.subtotalWithRebatesTaxed - leaseObj.incentives.nonTaxable.total - leaseObj.downPaymentValue;+\r\n        leaseObj.balanceToLeaseWithFeesWithRebates = leaseObj.subtotalWithFeesWithRebates - leaseObj.incentives.nonTaxable.total - leaseObj.downPaymentValue;\r\n\r\n        // Used in the price bar\r\n        leaseObj.balanceToLeaseWithFeesWithRebatesTaxed = leaseObj.subtotalWithFeesWithRebatesTaxed - leaseObj.incentives.nonTaxable.total - leaseObj.downPaymentValue;\r\n\r\n\r\n        leaseObj.leaseValues.forEach(leaseElement => {\r\n            leaseElement.residual = financialObj.residual.filter((resudualObj) => resudualObj.term === leaseElement.term)[0].rate;\r\n            \r\n            leaseElement.moneyFactor = financialObj.money_factor.filter((moneyFactorObj) => moneyFactorObj.term === leaseElement.term)[0].rate;\r\n            leaseElement.leaseEndValueNoFees = leaseElement.residualAmount;\r\n            leaseElement.leaseEndValue = leaseElement.residualAmount;\r\n        });\r\n\r\n        return leaseObj;\r\n    }\r\n\r\n    /**\r\n     * loanCalculator\r\n     */\r\n    loanCalculator(financialObj, tradeInValue, downPaymentValue, loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked) {\r\n        let tempIncentives = financialObj.incentive_programs.find(element => element.type === \"incentive\");\r\n\r\n        const financeObj = {};\r\n        financeObj.tax = this.getTax();\r\n        financeObj.accessories = this.getAccessories();\r\n        financeObj.options = this.getOptions();\r\n        financeObj.feesAndLevies = this.getFeesAndLeaves(true, false);\r\n        financeObj.incentives = this.getIncentivesObj(loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked);\r\n        financeObj.evRebates = this.getEvRebate(financialObj);\r\n        financeObj.rewards = this.getRewardsList(loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked);\r\n        financeObj.mazdaRetailCash = this.getIncentives(financialObj)?.mazda_retail_cash?.value || 0;\r\n        financeObj.specialIncentives = tempIncentives ? tempIncentives.value != null ? tempIncentives.value : 0 : 0;\r\n        financeObj.tradeInValue = parseInt(tradeInValue);\r\n        financeObj.downPaymentValue = parseInt(downPaymentValue);\r\n\r\n        if (!financialObj.calculatedFinance || !financialObj.calculatedFinance.financeValues)\r\n            financeObj.financeValues = [...financialObj.apr];\r\n        else\r\n            financeObj.financeValues = financialObj.calculatedFinance.financeValues;\r\n\r\n        // Do not remove this line below, used in Financial Provider!!!\r\n        financeObj.subtotalWithoutTradInAndDownPayment = financialObj.msrp + financialObj.package.financial.msrp + financialObj.warranty.financial.msrp + financialObj.connectedVehicle.financial.msrp + financeObj.options.total + financeObj.accessories.total;\r\n\r\n        financeObj.subtotal = financialObj.msrp \r\n        /*+ financialObj.package.financial.msrp **/ \r\n        + financialObj.addedProtection.financial.msrp \r\n        + financialObj.appearanceProtection.financial.msrp \r\n        + financialObj.connectedVehicle.financial.msrp \r\n        + financialObj.warranty.financial.msrp \r\n        + financeObj.options.total \r\n        + financeObj.accessories.total \r\n        - financeObj.tradeInValue \r\n        - financeObj.specialIncentives \r\n        - financeObj.incentives.taxable.total \r\n        + financialObj.freight \r\n        + financialObj.pde\r\n        + financeObj.financeValues[this.FinanceTermIndex].ppsa\r\n        financeObj.subtotalTaxed = financeObj.subtotal + (financeObj.financeValues[this.FinanceTermIndex].gstAmount + financeObj.financeValues[this.FinanceTermIndex].pstAmount);\r\n        financeObj.subtotalTaxes = financeObj.financeValues[this.FinanceTermIndex].gstAmount + financeObj.financeValues[this.FinanceTermIndex].pstAmount;\r\n\r\n        financeObj.subtotalWithFees = financeObj.subtotal + financeObj.feesAndLevies.total + financialObj.adminServiceFees;\r\n        financeObj.subtotalWithFeesTaxed = financeObj.subtotalWithFees + financeObj.subtotalTaxes\r\n        //financeObj.subtotalWithFeesTaxes = financeObj.subtotalWithFees * financeObj.tax;\r\n\r\n        financeObj.subtotalWithRebates = financeObj.subtotal;\r\n        financeObj.subtotalWithRebatesTaxed = financeObj.subtotalWithRebates + financeObj.subtotalTaxes\r\n        //financeObj.subtotalWithRebatesTaxes = financeObj.subtotalWithRebates * financeObj.tax;\r\n\r\n        financeObj.subtotalWithFeesWithRebates = financeObj.subtotalWithFees;\r\n        financeObj.subtotalWithFeesWithRebatesTaxed = financeObj.subtotalWithFeesWithRebates + financeObj.subtotalTaxes\r\n        //financeObj.subtotalWithFeesWithRebatesTaxes = financeObj.subtotalWithFeesWithRebates * financeObj.tax;\r\n\r\n        financeObj.balanceToFinance = financeObj.subtotal - financeObj.incentives.nonTaxable.total - financeObj.downPaymentValue - financeObj.evRebates.total.finance;\r\n        financeObj.balanceToFinanceTaxed = financeObj.subtotalTaxed - financeObj.incentives.nonTaxable.total - financeObj.downPaymentValue;\r\n        financeObj.balanceToFinanceWithFees = financeObj.subtotalWithFees - financeObj.incentives.nonTaxable.total - financeObj.downPaymentValue;\r\n        financeObj.balanceToFinanceWithFeesTaxed = financeObj.subtotalWithFeesTaxed - financeObj.incentives.nonTaxable.total - financeObj.downPaymentValue;\r\n        financeObj.balanceToFinanceWithRebates = financeObj.subtotalWithRebates - financeObj.incentives.nonTaxable.total - financeObj.downPaymentValue - financeObj.evRebates.total.finance;\r\n        financeObj.balanceToFinanceWithRebatesTaxed = financeObj.subtotalWithRebatesTaxed - financeObj.incentives.nonTaxable.total - financeObj.downPaymentValue - financeObj.evRebates.total.finance;\r\n        financeObj.balanceToFinanceWithFeesWithRebates = financeObj.subtotalWithFeesWithRebates - financeObj.incentives.nonTaxable.total - financeObj.downPaymentValue - financeObj.evRebates.total.finance;\r\n        financeObj.balanceToFinanceWithFeesWithRebatesTaxed = financeObj.subtotalWithFeesWithRebatesTaxed - financeObj.incentives.nonTaxable.total - financeObj.downPaymentValue - financeObj.evRebates.total.finance;\r\n\r\n        return financeObj;\r\n    }\r\n\r\n    get ExteriorColorInParam() {\r\n        let exterior;\r\n\r\n        const params = getParams();\r\n\r\n        if (params['exterior'] && params['exterior'][0])\r\n            exterior = params['exterior'][0];\r\n\r\n        return exterior;\r\n    }\r\n\r\n    get InteriorColorInParam() {\r\n        let interior;\r\n\r\n        const params = getParams();\r\n\r\n        if (params['interior'] && params['interior'][0])\r\n            interior = params['interior'][0];\r\n\r\n        return interior;\r\n    }\r\n\r\n    SetSelectedColorsFromParams() {\r\n        if (this.ExteriorColorInParam !== null && (this.SelectedColourExterior === null || this.SelectedColourExterior.code !== this.ExteriorColorInParam)) {\r\n            //console.log('exteriorColor:', this.ExteriorColorInParam);\r\n            Object.entries(this.Colours.visual.exteriors).map((Colour, index) => {\r\n                if (Colour[1]['code'] === this.ExteriorColorInParam) {\r\n                    this.SelectedColourExteriorIndex = index;\r\n                    //console.log('found the matched ext color!');\r\n                }\r\n            });\r\n        }\r\n\r\n        if (this.InteriorColorInParam !== null && (this.SelectedColourInterior === null || this.SelectedColourInterior.code !== this.InteriorColorInParam)) {\r\n            //console.log('interiorColor:', this.InteriorColorInParam);\r\n            this.Colours.visual.interiors.map((Colour, index) => {\r\n                if (Colour.code === this.InteriorColorInParam) {\r\n                    this.SelectedColourInteriorIndex = index;\r\n                    //console.log('found the matched int color!');\r\n                }\r\n            });\r\n        }\r\n    }\r\n\r\n    /**\r\n     * getAccessories\r\n     */\r\n    getAccessories() {\r\n        const accessoriesObj = JSON.parse(sessionStorage.getItem(Constants.SelectedAccessories));\r\n        let accessories = {};\r\n        accessories.total = Math.round((accessoriesObj !== null ? accessoriesObj.reduce((total, accessorie) => total + accessorie.price, 0) : 0) * 100) / 100;\r\n        accessories.total_residual_value = Math.round((accessoriesObj !== null ? accessoriesObj.reduce((total, accessorie) => total + accessorie.residual_value, 0) : 0) * 100) / 100;\r\n        accessories.detail = accessoriesObj !== null ? { ...accessoriesObj } : {};\r\n        return accessories;\r\n    }\r\n\r\n    /**\r\n     * getOptions\r\n     */\r\n    getOptions() {\r\n        // TODO: WHY ARE WE LOADING FROM SESSION STORAGE WHEN THIS OBJECT HOLDS AND LOAD IT ALREADY ? \r\n        const selectedWheel = JSON.parse(sessionStorage.getItem(Constants.SelectedWheel)) || {};\r\n        let selectedExteriorColour = JSON.parse(sessionStorage.getItem(Constants.DefaultExteriorColour));\r\n        let selectedInteriorColour = JSON.parse(sessionStorage.getItem(Constants.DefaultInteriorColour));\r\n        if (sessionStorage.getItem(Constants.SelectedExteriorColour)) {\r\n            selectedExteriorColour = JSON.parse(sessionStorage.getItem(Constants.SelectedExteriorColour));\r\n        }\r\n        if (sessionStorage.getItem(Constants.SelectedInteriorColour)) {\r\n            selectedInteriorColour = JSON.parse(sessionStorage.getItem(Constants.SelectedInteriorColour));\r\n        }\r\n\r\n        const selectedPackage = this.SelectedPackage;\r\n        const selectedNonModelPackage = this.SelectedNonModelPackage;\r\n        const selectedWarrantyPackage = this.SelectedWarrantyPackage;\r\n        const selectedConnectedVehiclePackage = this.SelectedConnectedVehiclePackage;\r\n\r\n        let options = {};\r\n        // displayedTotal is used in the mazdaPrice\r\n        options.displayedTotal = (selectedInteriorColour?.price ? selectedInteriorColour.price : 0) \r\n        + (selectedExteriorColour?.price ? selectedExteriorColour.price : 0)\r\n        + (selectedNonModelPackage?.financial?.msrp ? selectedNonModelPackage.financial.msrp : 0) \r\n        + (selectedWarrantyPackage?.financial?.msrp ? selectedWarrantyPackage.financial.msrp : 0) \r\n        + (selectedConnectedVehiclePackage?.financial?.msrp ? selectedConnectedVehiclePackage.financial.msrp : 0);\r\n\r\n        options.total = (selectedWheel.price ? selectedWheel.price : 0) +\r\n                        + (selectedExteriorColour && selectedExteriorColour.price ? selectedExteriorColour.price : 0)\r\n                        + (selectedInteriorColour && selectedInteriorColour.price ? selectedInteriorColour.price : 0);\r\n\r\n        options.wheels = selectedWheel;\r\n        options.interiorColour = selectedInteriorColour;\r\n        options.exteriorColour = selectedExteriorColour;\r\n        options.model_option_package = selectedPackage;\r\n        options.universal_package = selectedNonModelPackage;\r\n        options.warranty_package = selectedWarrantyPackage;\r\n        options.connected_vehicle_package = selectedConnectedVehiclePackage;\r\n        return options;\r\n\r\n    }\r\n\r\n    /**\r\n     * getDetailedOptions\r\n     * \r\n     * This version is for the calculated cash which has a separated entry for protection, accessories, connectivty\r\n     */\r\n    getDetailedOptions() {\r\n        const selectedWheel = JSON.parse(sessionStorage.getItem(Constants.SelectedWheel)) || {};\r\n        let selectedExteriorColour = JSON.parse(sessionStorage.getItem(Constants.DefaultExteriorColour));\r\n        let selectedInteriorColour = JSON.parse(sessionStorage.getItem(Constants.DefaultInteriorColour));\r\n        if (sessionStorage.getItem(Constants.SelectedExteriorColour)) {\r\n            selectedExteriorColour = JSON.parse(sessionStorage.getItem(Constants.SelectedExteriorColour));\r\n        }\r\n        if (sessionStorage.getItem(Constants.SelectedInteriorColour)) {\r\n            selectedInteriorColour = JSON.parse(sessionStorage.getItem(Constants.SelectedInteriorColour));\r\n        }\r\n        let selectedPackageIndex = JSON.parse(sessionStorage.getItem(Constants.SelectedPackageIndex));\r\n        let selectedPackage = this.Packages?.packages.filter(pack => pack.type === 'model_option_package');\r\n        if(selectedPackageIndex !== null)\r\n            selectedPackage = selectedPackage[selectedPackageIndex];\r\n\r\n        let selectedNonModelPackageIndex = JSON.parse(sessionStorage.getItem(Constants.SelectedNonModelPackageIndex));\r\n        let selectedNonModelPackage = this.Packages?.packages.filter(pack => pack.type === 'universal_package');\r\n        if(selectedNonModelPackageIndex !== null)\r\n            selectedNonModelPackage = selectedNonModelPackage[selectedNonModelPackageIndex];\r\n\r\n        let selectedWarrantyIndex = JSON.parse(sessionStorage.getItem(Constants.SelectedWarrantyIndex));\r\n        let selectedWarrantyPackage = this.Packages?.packages.filter(pack => pack.type === 'universal_package' && (pack.package_type === 'Warranty' || pack.package_type === 'Garantie'));\r\n        if(selectedWarrantyIndex !== null)\r\n            selectedWarrantyPackage = selectedNonModelPackage[selectedWarrantyIndex];            \r\n\r\n        let selectedConnectedVehicleIndex = JSON.parse(sessionStorage.getItem(Constants.SelectedConnectedVehicleIndex));\r\n        let selectedConnectedVehiclePackage = this.Packages?.packages.filter(pack => pack.type === 'universal_package' && (pack.package_type === 'Connected Vehicle' || pack.package_type === 'Véhicule Connecté'));\r\n        if(selectedConnectedVehicleIndex !== null)\r\n            selectedConnectedVehiclePackage = selectedConnectedVehiclePackage[selectedConnectedVehicleIndex];  \r\n\r\n        let options = {};\r\n        options.displayedTotal = (selectedInteriorColour?.price ? selectedInteriorColour.price : 0) \r\n        + (selectedExteriorColour?.price ? selectedExteriorColour.price : 0) \r\n        + /*(selectedPackage?.financial?.msrp ? selectedPackage.financial.msrp : 0) +*/ (selectedNonModelPackage?.financial?.msrp ? selectedNonModelPackage.financial.msrp : 0) \r\n\r\n        options.total = (selectedInteriorColour?.price ? selectedInteriorColour.price : 0) \r\n        + (selectedExteriorColour?.price ? selectedExteriorColour.price : 0) \r\n        + (selectedWheel.price ? selectedWheel.price : 0) \r\n        + (selectedWheel.tpms ? selectedWheel.tpms : 0)\r\n        + (selectedWheel.install_cost ? selectedWheel.install_cost : 0);\r\n        //+ (selectedConnectedVehiclePackage?.financial?.msrp ? selectedConnectedVehiclePackage.financial.msrp : 0);\r\n\r\n        options.wheels = selectedWheel;\r\n        options.interiorColour = selectedInteriorColour;\r\n        options.exteriorColour = selectedExteriorColour;\r\n        options.model_option_package = selectedPackage;\r\n        options.universal_package = selectedNonModelPackage;\r\n        options.warranty_package = selectedWarrantyPackage;\r\n        options.connected_vehicle_package = selectedConnectedVehiclePackage;        \r\n        return options;\r\n\r\n    }\r\n\r\n    /**\r\n     * getSupValueFromFee\r\n     */\r\n    getSupValueFromFee(fee) {\r\n        let sup = null;\r\n\r\n        switch (fee) {\r\n            case 'A/C Tax':\r\n                sup = '3';\r\n                break;\r\n            case 'Tire':\r\n                sup = '6';\r\n                break;\r\n            case 'OMVIC':\r\n                sup = '4';\r\n                break;\r\n            case 'AMVIC':\r\n                sup = '5';\r\n                break;\r\n            case 'Administration Fee':\r\n                sup = '9';\r\n                break;\r\n            default:\r\n                sup = null;\r\n                break;\r\n        }\r\n        return sup;\r\n    }\r\n\r\n    /**\r\n     * getFeesAndLeaves\r\n     */\r\n    getFeesAndLeaves(inCashCalculation, leaseMode) {\r\n        let feesObj = JSON.parse(sessionStorage.getItem(Constants.FinancialObj)) ?.fees || {};\r\n        let feeAndLevies = {};\r\n        const that = this;\r\n        if (feesObj.length) {\r\n            // Filter and remove freight from the fees calculation\r\n            feesObj = feesObj.filter(function (fee) {\r\n                return fee.title !== 'Freight' && fee.title !== 'Administration Fee' && fee.title !== 'PDE'\r\n            });\r\n\r\n            // Hardcode the sup value to the label - or TRY TO add it to the JSON data.\r\n            feesObj.forEach((el, index) => {\r\n                feesObj[index] = { ...el, 'sup': that.getSupValueFromFee(el.title) }\r\n            })\r\n\r\n            // Add <sup> value to\r\n            if (inCashCalculation) {\r\n                // Filter and remove PDE from the fees calculation in cash calculation and leaving the feesObj intact as it's used for displaying also.\r\n                const feesObjFiltered = feesObj.filter(function (fee) {\r\n                    return fee.title !== 'PDE'\r\n                });\r\n                feeAndLevies.total = feesObjFiltered.reduce((total, fee) => total + fee.price, 0);\r\n            } else {\r\n                feeAndLevies.total = feesObj.reduce((total, fee) => total + fee.price, 0);\r\n            }\r\n\r\n            feeAndLevies.detail = [...feesObj];\r\n        } else {\r\n            feeAndLevies.total = 0;\r\n        }\r\n        return feeAndLevies;\r\n    }\r\n\r\n    /**\r\n     * getRewardsList\r\n     */\r\n    getRewardsList(loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked) {\r\n        const financialObj = JSON.parse(sessionStorage.getItem('financialObj')) || {};\r\n        const rewardKeys = [/*\"loyalty\", */'military', 'grad_award', 'first_time_owner'];\r\n\r\n        // Grab the whole list of current incentives\r\n        let incentivesList = this.getIncentives(financialObj);\r\n        // console.log('[getRewardsList] incentivesList', incentivesList);\r\n\r\n        // Add checked value to corresponding incentives(reward)\r\n        if (loyaltyChecked) {\r\n            incentivesList.loyalty.checked = true;\r\n        }\r\n        if (graduateChecked) {\r\n            incentivesList.grad_award.checked = true;\r\n        }\r\n        if (militaryChecked) {\r\n            incentivesList.military.checked = true;\r\n        }\r\n        if (firstTimeOwnerChecked) {\r\n            incentivesList.first_time_owner.checked = true;\r\n        }        \r\n\r\n        let rewardsList = [];\r\n\r\n        // Keep the `rewards` incentives only - filter out the rest\r\n        rewardKeys.forEach(key => {\r\n            if (incentivesList[key] && incentivesList[key].checked === true) {\r\n                rewardsList.push(incentivesList[key]);\r\n            }\r\n        });\r\n        // console.log('[getRewardsObj] rewardsList', rewardsList);\r\n\r\n        return rewardsList;\r\n    }\r\n\r\n    /**\r\n     * getIncentivesObj\r\n     */\r\n    getIncentivesObj(loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked, isCashCalculation = false) {\r\n        const financialObj = JSON.parse(sessionStorage.getItem('financialObj')) || {};\r\n        const incentivesKeysTaxable = ['connect'];\r\n        let incentivesKeysNonTaxable;\r\n\r\n        // BUSINESS RULE: Loyalty is calculated on cash discount but in financing and leasing it's calculated by TCCI so we exclude it\r\n        if(isCashCalculation)\r\n            incentivesKeysNonTaxable = [\"military\", 'grad_award', \"loyalty\", \"first_time_owner\"];\r\n        else\r\n            incentivesKeysNonTaxable = [\"military\", 'grad_award', /*\"loyalty\",*/ \"first_time_owner\"];\r\n\r\n        let incentives = this.getIncentives(financialObj);\r\n        let incentivesObj = {};\r\n        incentivesObj.taxable = {};\r\n        incentivesObj.taxable.details = [];\r\n        incentivesObj.taxable.total = 0;\r\n        incentivesObj.nonTaxable = {};\r\n        incentivesObj.nonTaxable.details = [];\r\n        incentivesObj.nonTaxable.total = 0;\r\n        if (loyaltyChecked) {\r\n            incentives.loyalty.checked = true;\r\n        }\r\n        if (graduateChecked) {\r\n            incentives.grad_award.checked = true;\r\n        }\r\n        if (militaryChecked) {\r\n            incentives.military.checked = true;\r\n        }\r\n        if (firstTimeOwnerChecked) {\r\n            incentives.first_time_owner.checked = true;\r\n        }\r\n\r\n        incentivesKeysTaxable.map(incentiveKey => {\r\n            if (incentives[incentiveKey] && incentives[incentiveKey].checked === true) {\r\n                incentivesObj.taxable.details.push(incentives[incentiveKey]);\r\n                incentivesObj.taxable.total += incentives[incentiveKey].cash_value ? incentives[incentiveKey].cash_value : incentives[incentiveKey].value;\r\n            }\r\n        });\r\n\r\n        incentivesKeysNonTaxable.map(incentiveKey => {\r\n            if (incentives[incentiveKey] && incentives[incentiveKey].checked === true) {\r\n                incentivesObj.nonTaxable.details.push(incentives[incentiveKey]);\r\n                incentivesObj.nonTaxable.total += incentives[incentiveKey].cash_value ? incentives[incentiveKey].cash_value : incentives[incentiveKey].value;\r\n            }\r\n        });\r\n\r\n        return incentivesObj;\r\n    }\r\n\r\n    /**\r\n     * getEvRebate\r\n     */\r\n    getEvRebate(financeObj) {\r\n        const tax = this.getTax();        \r\n        const federalTax = this.getGstRate();\r\n        const provincialTax = this.getPstRate();\r\n\r\n        let evRebates = {};\r\n        evRebates.total = {\r\n            'cash': 0,\r\n            'lease': 0,\r\n            'finance': 0,\r\n            'federal_tax': 0,\r\n            'provincial_tax': 0,\r\n            'tax': 0,\r\n            'lease_federal_tax': 0,\r\n            'lease_provincial_tax': 0,\r\n            'lease_tax': 0\r\n        }\r\n\r\n        if (!financeObj.apr || !financeObj.lease)\r\n            return evRebates;\r\n\r\n        evRebates.details = [];\r\n\r\n        const evRebateObj = financeObj.ev_rebates;\r\n\r\n        evRebateObj.map(rebate => {\r\n            if(rebate.lease.length === 0 || rebate.apr.length === 0)\r\n                return;\r\n\r\n            const filteredLeaseItems = rebate.lease.filter(leaseItem => Number(leaseItem.term) === Number(this._leaseTerm));\r\n            const leaseProRatedRebate =  filteredLeaseItems.length > 0 ? filteredLeaseItems[0].rate : 0;\r\n            \r\n            const filteredFinanceItems = rebate.apr.filter(financeItem => Number(financeItem.term) === Number(this._financeTerm));\r\n            const financeProRatedRebate = filteredFinanceItems.length > 0 ? filteredFinanceItems[0].rate : 0;\r\n\r\n            const calculateTaxes = this.hasEvFinancingTaxes(getProvince());\r\n            const evRebate = {\r\n                cash: rebate.cash,\r\n                tax_cash: calculateTaxes ? rebate.cash - (rebate.cash / (1 + tax)) : 0,\r\n                lease: rebate.cash * leaseProRatedRebate,\r\n                finance: rebate.cash * financeProRatedRebate,\r\n                title: rebate.province\r\n            }\r\n            evRebates.details.push(evRebate);\r\n\r\n            evRebates.total.cash += evRebate.cash; // this is with taxe include;\r\n            evRebates.total.finance += evRebate.finance; // this is with taxe include;\r\n            evRebates.total.lease += evRebate.lease; // this is with taxe include;\r\n\r\n            if (rebate.province === \"federal\")\r\n                evRebates.total.lease_federal_tax += Math.round((evRebates.total.lease * tax) * 100) / 100;\r\n            else\r\n                evRebates.total.lease_provincial_tax += Math.round((rebate.cash * leaseProRatedRebate * tax) * 100) / 100;\r\n        });\r\n\r\n\r\n        // Calulate the taxes on the sums of all the ev rebates\r\n        evRebates.total.lease_tax = (evRebates.total.lease * tax);\r\n\r\n        return evRebates;\r\n    }\r\n\r\n    /**\r\n     * get incentive list associated with the financial object\r\n     */\r\n    getIncentives(financialObj) {\r\n        let incentives = {};\r\n        if (financialObj.incentive_programs)\r\n            financialObj.incentive_programs.forEach(incentive => {\r\n                incentives[incentive.type] = incentive;\r\n            });\r\n        return incentives;\r\n    }\r\n\r\n    /**\r\n     * parseAccessoriesData\r\n     */\r\n    parseAccessoriesData(accessoriesData) {\r\n        var data = [];\r\n        const popularData = [];\r\n        let formatedData = {};\r\n\r\n        for (const index in accessoriesData) {\r\n            data.push(accessoriesData[index]);\r\n        }\r\n\r\n        data.forEach((accessory, index) => {\r\n            accessory.index = index;\r\n            if (accessory.popular === true) {\r\n                popularData.push(accessory);\r\n            }\r\n        })\r\n\r\n        if (data.length) {\r\n            formatedData = this.groupBy(data, 'category');\r\n            formatedData['All'] = data;\r\n            if (popularData.length > 0) {\r\n                formatedData['Popular'] = popularData;\r\n            }\r\n        }\r\n        return (formatedData);\r\n    }\r\n\r\n    /**\r\n     * getTax - returns the HST from PST and GST\r\n     */\r\n    getTax() {\r\n        const result =  this.getGstRate() + this.getPstRate();\r\n        return result;\r\n    }\r\n\r\n    /**\r\n     * getGstRate - return the gst tax rate\r\n     */\r\n    getGstRate() {\r\n        if (this._gstRate === 0) \r\n            this._gstRate = Number(sessionStorage.getItem('FinancialProvider_GST'));\r\n        \r\n        const result = Number(this._gstRate) / 100;\r\n        return result;\r\n    }\r\n\r\n\r\n    /**\r\n     * getPstRate - return the provincial tax\r\n     */\r\n    getPstRate() {\r\n        if (this._pstRate === 0) \r\n            this._pstRate = Number(sessionStorage.getItem('FinancialProvider_PST'));\r\n\r\n        const result = Number(this._pstRate) / 100;\r\n        return result;\r\n    }\r\n\r\n    /*\r\n     *   This is the new version of the Loan Informational APR calculation.\r\n     */\r\n    getLoanInformationalAprRate() {\r\n        const financeElement = this.FinancialInfo.calculatedFinance.financeValues[this.FinanceTermIndex];\r\n\r\n        const term = financeElement.term;\r\n        \r\n        const monthly = financeElement.monthly;\r\n      \r\n        const capitalizedCost = financeElement.loanAmount;\r\n\r\n        const adminFees = getProvince() === \"QC\" ?  this.FinancialInfo.adminServiceFees : 0;        \r\n\r\n        const result = RATE(term, monthly, -capitalizedCost +adminFees, 0, 0);\r\n\r\n        const toReturn = Number(result * 12 * 100);\r\n\r\n        return toReturn;\r\n        //return customRound(result * 12 * 100, 2);\r\n    }\r\n\r\n\r\n      \r\n    /*\r\n     *   This is the new version of the Lease Informational APR calculation.\r\n     */\r\n    getLeaseInformationalAprRate() {\r\n        const leaseElement = this.FinancialInfo.calculatedLease.leaseValues[this.LeaseTermIndex];\r\n\r\n        const term = leaseElement.term;\r\n        \r\n        const monthly = leaseElement.monthly;\r\n      \r\n        const capitalizedCost = leaseElement.capitalizedCost;\r\n\r\n        const adminFees = getProvince() === \"QC\" ?  this.FinancialInfo.adminServiceFees : 0;\r\n\r\n        const retailCash = this.FinancialInfo.calculatedLease.mazdaRetailCash;\r\n\r\n        const leaseEndValue = leaseElement.leaseEndValue;\r\n\r\n        const result = RATE(term, monthly, -capitalizedCost +adminFees + retailCash, Number(leaseEndValue), 1);\r\n\r\n        //return customRound(result * 12 * 100, 2);\r\n        return Number(result * 12 * 100);\r\n    }\r\n\r\n    /*\r\n     * getMaxDownPayment / tradeIn\r\n     *\r\n     */\r\n    getMaxDownPayment(financialObj) {\r\n        if(!this.FinancialInfo)\r\n            return 0;\r\n\r\n        if(!this.SelectedModel)\r\n            return 0;\r\n\r\n        if(!this.SelectedPackage)\r\n            return 0;\r\n\r\n        const freight = this.FinancialInfo.fees.filter((fee) => fee.title === 'Freight').length ? this.FinancialInfo.fees.filter((fee) => fee.title === 'Freight')[0].price : 0;\r\n        const pde = this.FinancialInfo.fees.filter((fee) => fee.title === 'PDE').length ? this.FinancialInfo.fees.filter((fee) => fee.title === 'PDE')[0].price : 0;\r\n        const acTax = this.FinancialInfo.fees.filter((fee) => fee.title === 'A/C Tax').length ? this.FinancialInfo.fees.filter((fee) => fee.title === 'A/C Tax')[0].price : 0;\r\n        const exciseTax = this.FinancialInfo.fees.filter((fee) => fee.title === 'Federal Excise Tax').length ? this.FinancialInfo.fees.filter((fee) => fee.title === 'Federal Excise Tax')[0].price : 0;\r\n        const amvic = this.FinancialInfo.fees.filter((fee) => fee.title === 'AMVIC').length ? this.FinancialInfo.fees.filter((fee) => fee.title === 'AMVIC')[0].price : 0;\r\n        const omvic = this.FinancialInfo.fees.filter((fee) => fee.title === 'OMVIC').length ? this.FinancialInfo.fees.filter((fee) => fee.title === 'OMVIC')[0].price : 0;\r\n        const tireStewardshipFee = this.FinancialInfo.fees.filter((fee) => fee.title === 'Tire Shewardship Fee').length ? this.FinancialInfo.fees.filter((fee) => fee.title === 'Tire Shewardship Fee')[0].price : 0;\r\n        const oil = this.FinancialInfo.fees.filter((fee) => fee.title === 'Oil').length ? this.FinancialInfo.fees.filter((fee) => fee.title === 'Oil')[0].price : 0;\r\n\r\n        const mazdaCashIncentive = this.FinancialInfo.incentive_programs.filter((fee) => fee.title === 'mazda_retail_cash').length ? this.FinancialInfo.incentive_programs.filter((fee) => fee.title === 'mazda_retail_cash')[0].price : 0;\r\n\r\n        // LEASE AND ADMIN SERVICE FEES ARE THE SAME STARTING 1ST JANUARY 2024 // 595\r\n        //const leaseServiceFees = summaryCalculator.FinancialInfo.fees.filter((fee) => fee.title === 'Administration Fee').length ? summaryCalculator.FinancialInfo.fees.filter((fee) => fee.title === 'Administration Fee')[0].price : 0;\r\n        const adminServiceFees = this.FinancialInfo.fees.filter((fee) => fee.title === 'Administration Fee').length ? this.FinancialInfo.fees.filter((fee) => fee.title === 'Administration Fee')[0].price : 0;\r\n        \r\n        // Loyalty can be percentage or cash amount reduction. Excluding for now\r\n        const loyaltyValue = this.LoyaltyChecked ? this.FinancialInfo.incentive_programs.find(x => x.type === \"loyalty\").cash_value : 0;\r\n        const graduatePrice = this.GraduateChecked ? this.FinancialInfo.incentive_programs.find(x => x.type === \"grad_award\").value : 0;\r\n        const militaryPrice= this.MilitaryChecked ? this.FinancialInfo.incentive_programs.find(x => x.type === \"military\").value : 0;\r\n        const firstTimeOwnerPrice = this.FirstTimeOwnerChecked ? this.FinancialInfo ? this.FinancialInfo.incentive_programs.find(x => x.type === \"first_time_owner\").value : 0 : 0;\r\n\r\n        const incentives = mazdaCashIncentive + graduatePrice + militaryPrice + firstTimeOwnerPrice + this.FinancialInfo.calculatedFinance.specialIncentives;\r\n\r\n        const options = financialObj.calculatedFinance.options.total  // Colors +Wheels\r\n                        //+ this.SelectedNonModelPackage.financial.msrp\r\n                        //+ this.SelectedWarrantyPackage.financial.msrp // Warranty \r\n                        //+ this.SelectedConnectedVehiclePackage.financial.msrp // Connected Vehicle \r\n                        + financialObj.calculatedFinance.accessories.total; // Accessories\r\n\r\n        const totalMSRP = this.SelectedModel.financial.msrp\r\n            + this.SelectedPackage.financial.msrp // Actual Car packages          \r\n            + options\r\n            + exciseTax + freight + pde // Excise is 100$ hardcoded in the excel sheet, freight can vary. \r\n            + (this.IncludeFees ? acTax + amvic + omvic + tireStewardshipFee + oil : 0);\r\n\r\n        // Fetch residual value from the calls\r\n        const element = financialObj.calculatedLease.leaseValues.find(x => x.term === 36);\r\n\r\n        const maxDownPayment = totalMSRP\r\n        + adminServiceFees\r\n        + element.ppsa\r\n        - incentives\r\n        - this.FinancialInfo.calculatedLease.evRebates.total.lease\r\n        - (element.downPaymentLeaseEndValue ? element.downPaymentLeaseEndValue : 0) // Use this variable for the 24000 km annual mileage\r\n        - 100;\r\n\r\n        console.log(\"maxDownPayment\", maxDownPayment);\r\n        return maxDownPayment;\r\n    }    \r\n    \r\n    /*\r\n     * isRetailerMode - checks if we are in a retailer mode\r\n     *\r\n     */    \r\n    async isRetailerMode() {\r\n        if(!window.bnp_retailer_mode) {\r\n            // FLUSH THE DEALER VARS (Fix issue of dealer map stuck with the dealer vars one)\r\n            sessionStorage.removeItem('bnp_dealerVars');\r\n            \r\n            return false;\r\n        }\r\n\r\n        const urlParams = getParams();\r\n        if (urlParams['DealerID']) {\r\n            // Fix use case that we switch from different iframe session from switching dealers website\r\n            if(sessionStorage.getItem('bnp_dealerVars')) {\r\n                const dealerVars = JSON.parse(sessionStorage.getItem('bnp_dealerVars'));\r\n                if(dealerVars.dealerId !== urlParams['DealerID'][0])\r\n                    sessionStorage.removeItem('bnp_dealerVars');\r\n            }\r\n\r\n            if(!sessionStorage.getItem('bnp_dealerVars')) {\r\n                const dealerId = urlParams['DealerID'][0];\r\n                const dealerData = await this._apiService.getDealerDataById(dealerId);\r\n                if (dealerData.data) {\r\n                    const dealerName = dealerData.data.name;\r\n                    const provinceCode = dealerData.data.province.province_code;\r\n\r\n                    console.log(dealerId, dealerName, provinceCode);\r\n                    const dealerVars = JSON.stringify({dealerId: dealerId, dealerName: dealerName, dealerProvinceCode: provinceCode})\r\n                    sessionStorage.setItem('bnp_dealerVars', dealerVars);\r\n\r\n                    this.province = provinceCode;\r\n                    this._apiService.province = provinceCode;\r\n                    this._tcciService.province = provinceCode;\r\n                }\r\n            }\r\n        } else {\r\n            // FLUSH THE DEALER VARS (Fix issue of dealer map stuck with the dealer vars one)\r\n            sessionStorage.removeItem('bnp_dealerVars');\r\n        }\r\n\r\n        return window.bnp_retailer_mode;\r\n    }\r\n\r\n    getDealerVars() {\r\n        if (sessionStorage.getItem('bnp_dealerVars')) {\r\n            return JSON.parse(sessionStorage.getItem('bnp_dealerVars'));\r\n        } else {\r\n            //console.log('something went wrong with DealerVars')\r\n            return null;\r\n        }\r\n    }\r\n    \r\n    // TODO : move to utils class\r\n    shallowClone(obj) {\r\n        return Object.create(\r\n            Object.getPrototypeOf(obj),\r\n            Object.getOwnPropertyDescriptors(obj)\r\n        );\r\n    }\r\n\r\n    /*\r\n    * This has been added as a patch as the use state doesnt reflect update the object correctly in its memory reference\r\n    */\r\n    getInstance() {\r\n        return this.shallowClone(this);\r\n    }\r\n\r\n    /**\r\n     * is province allowed to include EV rebates\r\n     * @returns {boolean}\r\n     */\r\n    isProvinceAllowedToIncludeRebates() {\r\n        const province = getProvince();\r\n        switch(province) {\r\n            case \"BC\":\r\n            case \"AB\":\r\n            case \"SK\":\r\n            case \"MB\":\r\n            case \"ON\":\r\n            case \"QC\":\r\n                //return true; // RECOMMENTED AS PER TICKET WTCANMAZDAINT-4030\r\n            case \"NB\":\r\n            case \"NS\":\r\n            case \"PE\":\r\n            case \"NL\":\r\n            case \"YT\":\r\n            case \"NT\":\r\n            default:\r\n                return false;\r\n        }\r\n    }\r\n\r\n    /**\r\n    * Return if the financed EV is taxable in that province\r\n    */\r\n    hasEvFinancingTaxes(province) {\r\n        console.log(\"hasEvFinancingTaxes province\", province);\r\n\r\n        switch (province) {\r\n            case \"QC\":\r\n                return false;\r\n            case \"BC\":\r\n            default:\r\n                return true;\r\n        }\r\n    }    \r\n    \r\n    isSelectionPreOrder() {\r\n        let isPreOrder = false;\r\n\r\n        if( !this.SelectedModel || !this.SelectedPackage )\r\n            return isPreOrder;\r\n\r\n        const model_code = this.SelectedModel.model_code;\r\n        const option_code = this.SelectedPackage.option_code;\r\n\r\n        if(window.preOrder) {\r\n            window.preOrder.forEach((item) => {\r\n                if (item.modelCode === model_code && item.modelOption === option_code) {\r\n                    isPreOrder = true;\r\n                }                \r\n            });\r\n        }\r\n\r\n        return isPreOrder;\r\n    }\r\n\r\n    async forceReloadVehicle(value) {\r\n        //this._needReload = value\r\n\r\n        if (this.selectedVehicle.carline) {\r\n            // Trigger the whole vehicle reload\r\n            await this.loadVehicleData(this.selectedVehicle.year, \r\n                this.selectedVehicle.carline, \r\n                this.selectedVehicle.trim, \r\n                this.selectedVehicle.model, \r\n                this.selectedVehicle.packageCode);\r\n\r\n            await this.loadFromFinancialProvider();\r\n\r\n            // Force the reset\r\n            window.SummaryCalculator = this;\r\n        }\r\n    }\r\n}\r\n","import React, { useEffect } from 'react'\r\nimport PropTypes from 'prop-types'\r\nimport SummaryCalculator from './summarycalculator';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport Cookies from 'universal-cookie';\r\n\r\n// Load build data by build id and redirect to Summary page.\r\nfunction BuildHelper({ buildId }) {\r\n  //const navigate = useNavigate();\r\n  const cookies = new Cookies();\r\n\r\n  useEffect(() => {\r\n    // Load build data if \"build\" param is passed.\r\n    const loadPreBuildData = async (buildId) => {\r\n      try {\r\n        const summaryCalculator = new SummaryCalculator();\r\n        summaryCalculator.reset(true);\r\n\t\t    sessionStorage.clear();\r\n        const data = await summaryCalculator.loadVehicleDataByBuildId(buildId);\r\n        if (data) {\r\n          const { year, carline, trim, modelCode, optionCode, province } = data;\r\n\r\n          if (province !== sessionStorage.getItem('province')) {\r\n            // mdp7-pref\r\n            console.log(`setting the mdp7-pref to p=${province}`);\r\n            cookies.remove('mdp7-pref');\r\n            cookies.set('mdp7-pref' ,`p=${province}`, {\r\n              path: '/',\r\n              encode: String\r\n            });\r\n            sessionStorage.setItem('province', province);\r\n            window.location.reload();\r\n          }\r\n\r\n          const navigateUrl = `${window.origin}${window.location.pathname}#/${year}/${carline}/${trim}/${modelCode}/${optionCode}/summary`;\r\n          window.location.href = navigateUrl;\r\n          return false;\r\n        }\r\n        console.log('failed to retrieve vehicle data from build id ', buildId);\r\n        const navigateUrl = `${window.origin}${window.location.pathname}#/`;\r\n        window.location.href = navigateUrl;\r\n        return false;\r\n      } catch (err) {\r\n        console.log(err);\r\n      }\r\n    }\r\n\r\n    loadPreBuildData(buildId);\r\n  }, [])\r\n\r\n  return <div className=\"mz-spinner\">LOADING ...</div>;\r\n}\r\n\r\nBuildHelper.propTypes = {\r\n  buildId: PropTypes.string.isRequired\r\n}\r\n\r\nexport default BuildHelper","import ReactHtmlParser from 'react-html-parser';\r\nimport { getLang, getProvince } from '../utils';\r\n\r\nexport default class NavHelper {\r\n\tgetDealerId() {\r\n\t\t//summaryCalculator.getDealerVars() ? summaryCalculator.getDealerVars().dealerId : null;\r\n\t\tif (window.bnp_retailer_mode && sessionStorage.getItem('bnp_dealerVars')) {\r\n\t\t\tconst dealerVars = JSON.parse(sessionStorage.getItem('bnp_dealerVars'));\r\n\t\t\treturn dealerVars.dealerId;\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t}\r\n\tgetUrlSlug(returnDef) {\r\n\t\tlet summaryCalculator = window.summaryCalculator;\r\n\r\n\t\tconst year = returnDef ? '' : summaryCalculator.selectedVehicle.year;\r\n\t\tconst carline = returnDef ? '' : summaryCalculator.selectedVehicle.carline;\r\n\t\tconst trim = returnDef ? '' : summaryCalculator.selectedVehicle.trim ?? summaryCalculator.AvailableTrim.trims[0].trim_type.url_slug;\r\n\t\tconst dealerId = this.getDealerId();\r\n\t\tlet model = '';\r\n\t\tlet packageCode = '';\r\n\t\t\r\n\t\tmodel = summaryCalculator.selectedVehicle.model === null ? '' : summaryCalculator.selectedVehicle.model;\r\n\t\t//model = model === '' ? summaryCalculator.AvailableTrim.trims[0].financial.based_on.model_code : '';\r\n\r\n\t\tpackageCode = summaryCalculator.selectedVehicle.packageCode === null ? '' :  summaryCalculator.selectedVehicle.packageCode;\r\n\t\t//packageCode = packageCode === '' ? summaryCalculator.selectedVehicle.packageCode : '';\r\n\r\n\t\t//return `/${year}/${carline}?prov_code=${province}&lang_code=${lang}`; // trim\r\n\t\treturn `/${year}/${carline}/${trim}?prov_code=${getProvince()}&lang_code=${getLang()}${dealerId ? `&DealerID=${dealerId}` : ''}`; // engine and drivetrain\r\n\t\treturn `/${year}/${carline}/${trim}/${model}/${packageCode}?prov_code=${getProvince()}&lang_code=${getLang()}`; // package\r\n\t}\r\n\tgetNavContent( t, returnDef){\r\n\t\tlet summaryCalculator = window.summaryCalculator;\r\n\r\n\t\tconst currentStep = returnDef ? '' : summaryCalculator.CurrentStep;\r\n\t\tconst year = returnDef ? '' : summaryCalculator.selectedVehicle.year;\r\n\t\tconst carline = returnDef ? '' : summaryCalculator.selectedVehicle.carline;\r\n\t\tconst trim = returnDef ? '' : summaryCalculator.selectedVehicle.trim ?? summaryCalculator.AvailableTrim.trims[0].trim_type.url_slug;\r\n\r\n\t\tlet model = '';\r\n\t\tlet packageCode = '';\r\n\t\t\r\n\t\tmodel = summaryCalculator.selectedVehicle.model === null ? '' : summaryCalculator.selectedVehicle.model;\r\n\t\t//model = model === '' ? summaryCalculator.AvailableTrim.trims[0].financial.based_on.model_code : '';\r\n\r\n\t\tpackageCode = summaryCalculator.selectedVehicle.packageCode === null ? '' :  summaryCalculator.selectedVehicle.packageCode;\r\n\t\t//packageCode = packageCode === '' ? summaryCalculator.selectedVehicle.packageCode : '';\r\n\r\n\t\tconst province = getProvince();\r\n\t\tconst lang = getLang();\r\n\t\tconst dealerId = this.getDealerId();\r\n\t\t\r\n\t\tconst navTranslation = [\r\n\t\t\t\"general:nav_trim\",\r\n\t\t\t\"general:nav_options\",\r\n\t        \"general:nav_colour\",\r\n\t\t\t\"general:nav_wheels\",\r\n\t\t\t\"general:nav_connectivity\",\r\n\t\t\t\"general:nav_accessories\",\r\n\t\t\t\"general:nav_protection\",\r\n\t        \"general:nav_payments\",\r\n\t        \"general:nav_summary\",\r\n\t        \"general:nav_start_over\",\r\n\t        \"general:nav_start_over_mobile\"\r\n\t    ];\r\n\t\tconst tabs = {\r\n\t\t\t'tabList': [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"text\": ReactHtmlParser(t(navTranslation[0])),\r\n\t\t\t\t\t\"active\": currentStep === 1,\r\n\t\t\t\t\t\"uri\": `/${year}/${carline}?prov_code=${province}&lang_code=${lang}${dealerId ? `&DealerID=${dealerId}` : ''}`\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"text\": ReactHtmlParser(t(navTranslation[1])),\r\n\t\t\t\t\t\"active\": currentStep === 2,\r\n\t\t\t\t\t\"uri\": this.getUrlSlug(returnDef)\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"text\": ReactHtmlParser(t(navTranslation[2])),\r\n\t\t\t\t\t\"active\": currentStep === 3,\r\n\t\t\t\t\t\"uri\": `/${year}/${carline}/${trim}/${model}/${packageCode}/colours?prov_code=${province}&lang_code=${lang}${dealerId ? `&DealerID=${dealerId}` : ''}`\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"text\": ReactHtmlParser(t(navTranslation[3])),\r\n\t\t\t\t\t\"active\": currentStep === 4,\r\n\t\t\t\t\t\"uri\": `/${year}/${carline}/${trim}/${model}/${packageCode}/wheels?prov_code=${province}&lang_code=${lang}${dealerId ? `&DealerID=${dealerId}` : ''}`\r\n\t\t\t\t},\r\n/*\t\t\t\t{\r\n\t\t\t\t\t\"text\": ReactHtmlParser(t(navTranslation[4])),\r\n\t\t\t\t\t\"active\": currentStep === 5,\r\n\t\t\t\t\t\"uri\": `/${year}/${carline}/${trim}/${model}/${packageCode}/connectivity?prov_code=${province}&lang_code=${lang}`\r\n\t\t\t\t},*/\r\n\t\t\t\t{\r\n\t\t\t\t\t\"text\": ReactHtmlParser(t(navTranslation[5])),\r\n\t\t\t\t\t\"active\": currentStep === 6,\r\n\t\t\t\t\t\"uri\": `/${year}/${carline}/${trim}/${model}/${packageCode}/accessories?prov_code=${province}&lang_code=${lang}${dealerId ? `&DealerID=${dealerId}` : ''}`\r\n\t\t\t\t},\r\n/*\t\t\t\t{\r\n\t\t\t\t\t\"text\": ReactHtmlParser(t(navTranslation[6])),\r\n\t\t\t\t\t\"active\": currentStep === 7,\r\n\t\t\t\t\t\"uri\": `/${year}/${carline}/${trim}/${model}/${packageCode}/protections?prov_code=${province}&lang_code=${lang}`\r\n\t\t\t\t},*/\r\n\t\t\t\t{\r\n\t\t\t\t\t\"text\": ReactHtmlParser(t(navTranslation[7])),\r\n\t\t\t\t\t\"active\": currentStep === 8,\r\n\t\t\t\t\t\"uri\": `/${year}/${carline}/${trim}/${model}/${packageCode}/payments?prov_code=${province}&lang_code=${lang}${dealerId ? `&DealerID=${dealerId}` : ''}`\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"text\": ReactHtmlParser(t(navTranslation[8])),\r\n\t\t\t\t\t\"active\": currentStep === 9,\r\n\t\t\t\t\t\"uri\": `/${year}/${carline}/${trim}/${model}/${packageCode}/summary?prov_code=${province}&lang_code=${lang}${dealerId ? `&DealerID=${dealerId}` : ''}`\r\n\t\t\t\t},\r\n\t\t\t],\r\n\r\n\t\t\t\"selectVehiclesLinkLink\": {\r\n\t\t\t\t\"textDesktop\": t(navTranslation[9]),\r\n\t\t\t\t\"textMobile\": t(navTranslation[9]),\r\n\t\t\t\t\"uri\": `/${dealerId ? `&DealerID=${dealerId}` : ''}`\r\n\t\t\t}\r\n\r\n\t\t}\r\n\t\treturn tabs;\r\n\t}\r\n}","\r\n// Open a modal.\r\nexport const openModal = (targetId, content) => {\r\n  const modal = document.getElementById(targetId);\r\n  if (modal) {\r\n    modal.setAttribute('aria-hidden', 'false');\r\n    // Focus the first element within the modal.\r\n    const focusable_selectors = 'a[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), *[tabindex]';\r\n    modal.querySelector(focusable_selectors).focus();\r\n    // Make the body unscrollable.\r\n    document.body.classList.add('disabled');\r\n  }\r\n}\r\n\r\n// Scroll to element using gsap (loaded in Core)\r\nexport const scrollTo = (options) => {\r\n  if (window.gsap) {\r\n    window.gsap.to(window, {\r\n      duration: .5,\r\n      scrollTo: options\r\n    });\r\n  } else {\r\n    console.error('gsap is not found in scrollTo()');\r\n  }\r\n}\r\n\r\n// Convert text to title case.\r\nexport const titleCase = (str) => {\r\n  if (!str) return;\r\n  return str.toLowerCase().split(' ').map(function(word) {\r\n      return (word.charAt(0).toUpperCase() + word.slice(1));\r\n  }).join(' ');\r\n}\r\n","import React from 'react';\r\n\r\nexport const Svg = ({ size, colour, svg_list, svg_classname, ...props }) => {\r\n    const svgColour = colour != undefined ? `mz-svg--${colour}` : null;\r\n    \r\n    return (\r\n        <i  style={{'fontSize': (size) + 'rem'}} className={['mz-svg', svgColour, `mz-svg-${svg_list}`].join(' ')}></i>\r\n    );\r\n};","/* global mzFunc, mzMenu, mzTabs */\r\n\r\nimport React from 'react';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport PropTypes from 'prop-types';\r\nimport { useNavigate, useParams, useSearchParams } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport NavHelper from '../../../Helpers/navhelper';\r\nimport { openModal, scrollTo } from '../../../Helpers/helpers';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\nimport { updateLanguageLink } from '../../../utils';\r\n\r\nexport const Nav = ({ summaryCalculator = window.summaryCalculator, nav, ...props }) => {\r\n    const { t, i18n } = useTranslation(['general', 'summary']);\r\n\r\n    const { year, carline, trim, model, packageCode } = useParams();\r\n    const [showFinancePrice, setShowFinancePrice] = React.useState(summaryCalculator.ShowFinancePrice);\r\n    \r\n    const gtmHelper = new GTMHelper();\r\n    \r\n    const navHelper = new NavHelper();\r\n    const [step, setStep] = React.useState(summaryCalculator.CurrentStep)\r\n    const [isOpen, setIsOpen] = React.useState(false);\r\n    const [tabs, setTabs] = React.useState(nav != null ? nav.tabList : navHelper.getNavContent(t, true).tabList);\r\n    const [activeTab, setActiveTab] = React.useState(tabs ?.filter(tab => tab.active === true)[0]);\r\n    const [isMobile, setIsMobile] = React.useState(window.innerWidth < 1024);\r\n    const navRef = React.useRef(null);\r\n    const navigate = useNavigate();\r\n    const [searchParams, setSearchParams] = useSearchParams();\r\n\r\n    React.useEffect(() => {\r\n        try {\r\n            // When Nav is re-mounted, run sticky submenu init function in Core\r\n            // unless it's already processed by Core/menu.js .\r\n            const isStickySubmenuProcessed = navRef.current.classList.contains('js-processed');\r\n            if (!isStickySubmenuProcessed) {\r\n                if (window.mzMenu && window.mzMenu.triggerStickySubmenu !== undefined) {\r\n                    window.mzMenu.triggerStickySubmenu();\r\n                }\r\n            }\r\n        } catch (err) {\r\n            console.error(err)\r\n        }\r\n        if(typeof mzFunc === 'object' && typeof mzTabs === 'object'){\r\n            mzFunc.waitForEl('.mzBuildandPrice nav .mz-tabs').then(function(components){\r\n                mzTabs.init(components);\r\n                setTimeout(()=>{\r\n                    const subNav = document.querySelector('.App-container nav .mz-tabs-menu')\r\n                    if(subNav)\r\n                        mzTabs.adjustActiveTabPosition(subNav, subNav.querySelector('.active'));\r\n                },500)\r\n            });\r\n        }\r\n        reloadTabs();\r\n    }, [nav])\r\n\r\n    function reloadTabs() {\r\n        //console.log('load data', nav)\r\n        //if(summaryCalculator._allDataIsLoaded) setNav(navHelper.getNavContent(t)); // nav from parameter\r\n        setTabs(nav != null ? nav.tabList : navHelper.getNavContent(t, true).tabList);\r\n        setStep(summaryCalculator.CurrentStep);\r\n    }\r\n\r\n\r\n    React.useEffect(() => {\r\n        reloadTabs();\r\n    }, [summaryCalculator._allDataIsLoaded])\r\n\r\n    React.useEffect(() => {\r\n        reloadTabs();\r\n        if(typeof mzMenu === 'object' && window.scrollY === 0){\r\n            mzMenu.alertAni?.play();\r\n            mzMenu.permAlertAni?.play();\r\n            mzMenu.menuAni?.play();\r\n        }\r\n        //updateLanguageLink();\r\n    }, [summaryCalculator.CurrentStep])\r\n\r\n    function showNav() {\r\n        //const selectVehiclesLinkLink = tabs;\r\n        updateLanguageLink();\r\n        \r\n        const handleTabClick = (tabIndex) => {\r\n            tabs.map(function (tab, index) {\r\n                if (index === tabIndex) {\r\n                    tab.active = true;\r\n\r\n\r\n                } else {\r\n                    tab.active = false;\r\n                }\r\n                return tab;\r\n            });\r\n\r\n            setTabs(tabs);\r\n            setActiveTab(tabs.filter(tab => tab.active === true)[0]);\r\n            if (isMobile) {\r\n                if (isOpen) {\r\n                    setIsOpen(false);\r\n                    document.querySelector('body').classList.remove('disabled');\r\n                } else {\r\n                    setIsOpen(true);\r\n                    document.querySelector('body').classList.add('disabled');\r\n                }\r\n            }\r\n\r\n            if (tabs[tabIndex])\r\n                navigate(tabs[tabIndex].uri);\r\n            else // Gracefully recover to home /\r\n                navigate('/');\r\n            \r\n            //HandleTabClick(tabs[tabIndex].uri)\r\n        }\r\n        const HandleClose = () => {\r\n            setIsOpen(false);\r\n            document.querySelector('body').classList.remove('disabled');\r\n        }\r\n        const handleResize = () => {\r\n            setIsMobile(window.innerWidth < 1024);\r\n            setIsOpen(false);\r\n            document.querySelector('body').classList.remove('disabled');\r\n        }\r\n\r\n        window.addEventListener('resize', handleResize)\r\n\r\n        const getCurrentActiveTabIndex = (tabs, activeTab) => {\r\n            if (!tabs && !tabs.length > 0) return 0;\r\n            return tabs.indexOf(activeTab) + 1;\r\n        }\r\n\r\n        function HandleSelectAVehicleClick(e) {\r\n            e.preventDefault();\r\n            document.querySelector('body').classList.remove('disabled');\r\n            navigate(nav.selectVehiclesLinkLink.uri);\r\n        }\r\n\r\n        const handleOcaClick = (e) => {\r\n            e.preventDefault();\r\n            setIsOpen(false);\r\n            document.querySelector('body').classList.remove('disabled');\r\n            \r\n            if (window.location.href.indexOf('/payments') > 0) {\r\n                setSearchParams({'oca':''});\r\n                setTimeout(() => {\r\n                    setSearchParams({'oca':'1'});\r\n                }, 10);\r\n            }else{\r\n                navigate(nav.tabList[6].uri + '&oca=1');\r\n            }\r\n            const price = summaryCalculator._showFinancePrice ? summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceWithFeesWithRebatesTaxed : summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithFeesWithRebatesTaxed;\r\n            gtmHelper.setGTM({'action':`OCA - Mobile Nav`,'year': year,'model': carline, 'trim': summaryCalculator.selectedVehicle.trim ?? summaryCalculator.AvailableTrim.trims[0].trim_type.url_slug, 'price' : Math.round(price)}, true, false);\r\n        }\r\n\r\n        return (\r\n                <nav\r\n                    className={isOpen ? 'mz-navigation mz-sticky-submenu mz-navigation__open' : 'mz-navigation mz-sticky-submenu'}\r\n                    ref={navRef}\r\n                    {...props}\r\n                >\r\n                    <div className=\"mz-container mz-navigation__wrapper\">\r\n                        <div className=\"mz-full-width mz-navigation__inner\">\r\n                            <div className=\"mz-navigation__reload\">\r\n                                <a className=\"mz-navigation__reload-link\" onClick={(e) => {\r\n                                    HandleSelectAVehicleClick(e);\r\n                                }} >\r\n                                    <Svg\r\n                                        colour=\"grey\"\r\n                                        size={1.3}\r\n                                        svg_list=\"refresharrow\"\r\n                                    />\r\n                                    <span className=\"mz-navigation__reload-text\" onClick={(e) => {\r\n                                        HandleSelectAVehicleClick(e);\r\n                                    }}>{nav !== null ? nav.selectVehiclesLinkLink.textDesktop : navHelper.getNavContent(t, true).selectVehiclesLinkLink.textDesktop}</span>\r\n                                </a>\r\n                            </div>\r\n                            {!isMobile &&\r\n                                <>\r\n                                    <div className=\"mz-tabs\">\r\n                                        <div className=\"mz-tabs-menu\">\r\n                                            <div className=\"mz-tabs-menu-container\">\r\n                                                <div className=\"mz-tabs-menu-inner\">\r\n                                                    {tabs.map((tab, index) => {\r\n                                                        return (<a key={index} role=\"tab\" className={tab.active ? \"mz-tabs-tab active nav--sm\" : \"mz-tabs-tab nav--sm\"} onClick={() => handleTabClick(index)}>\r\n                                                            {tab.text}\r\n                                                        </a>)\r\n                                                    })}\r\n                                                </div>\r\n                                                <div className=\"mz-tabs-menu--left\"><i className=\"mz-svg mz-svg--grey mz-svg-chevron mz-svg--rotate180\"></i></div>\r\n                                                <div className=\"mz-tabs-menu--right\"><i className=\"mz-svg mz-svg--grey mz-svg-chevron\"></i></div>\r\n                                            </div>\r\n                                        </div>\r\n                                    </div>\r\n                                </>\r\n                            }\r\n\r\n                            {isMobile &&\r\n                                <><li role=\"tab\" className=\"mz-navigation__navlist-tab mz-navigation__navlist-tab-close\" onClick={() => HandleClose()}>\r\n                                    {t(\"close\")}\r\n                                    <Svg\r\n                                        colour=\"black\"\r\n                                        size={1}\r\n                                        svg_list=\"chevron_small\"\r\n                                    />\r\n                                </li>\r\n                            \r\n                                <ul className=\"mz-navigation__navlist\">\r\n                                    <li role=\"tab\" className=\"mz-navigation__navlist-tab mz-navigation__navlist-tab-select-vehicle\" onClick={(e) => HandleSelectAVehicleClick(e)}>{nav ?.selectVehiclesLinkLink ?.textMobile}\r\n                                    </li>\r\n                                    {tabs.map((tab, index) => {\r\n                                        return (<li key={index} role=\"tab\" className={tab.active ? \"mz-navigation__navlist-tab mz-navigation__navlist-tab-selected\" : \"mz-navigation__navlist-tab\"} onClick={() => handleTabClick(index)}>\r\n                                            {tab.text}\r\n                                            {tab.active ? <Svg\r\n                                                colour=\"black\"\r\n                                                size={1}\r\n                                                svg_list=\"chevron_small\"\r\n                                            /> : null}\r\n                                        </li>);\r\n                                    })\r\n                                }\r\n                                {window.allow_oca ?\r\n                                <li className=\"mz-navigation__oca-tab\" onClick={(e) => handleOcaClick(e)}  title={t('summary:btn_apply_for_financing')}>\r\n                                    <div>\r\n                                        <Svg\r\n                                            colour=\"grey\"\r\n                                            size={1.2}\r\n                                            svg_list=\"applytofinance\"\r\n                                        />\r\n                                        <span>{ReactHtmlParser(t('general:ocaPriceBar'))}</span>\r\n                                    </div>\r\n                                </li>: null}\r\n                            </ul>\r\n                            </>}\r\n                        </div>\r\n                        <div className=\"mz-navigation__progress\">\r\n                            <div style={{ width: `${(getCurrentActiveTabIndex(tabs, activeTab) / nav ?.tabList ?.length) * 100}%` }}></div>\r\n                        </div>\r\n                    </div>\r\n                </nav>\r\n        );\r\n\r\n    }\r\n    return (<>{showNav()}</>)\r\n};\r\n\r\n// Nav.propTypes = {\r\n//     HandleTabClick: PropTypes.func,\r\n// }\r\n\r\n// Nav.defaultProps = {\r\n//     HandleTabClick: (uri) => {\r\n//     },\r\n// };","import React from 'react';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\nimport PropTypes from 'prop-types';\r\n\r\nexport const Modal = ({modalContent, isOpen, modalId, handleClose, ...props }) => {\r\n    const [isModalOpen, setIsModalOpen] = React.useState(isOpen);\r\n    return (\r\n        <div className=\"mz-modal modal\" id={modalId} aria-hidden={!isOpen}>\r\n            <div className=\"wrapper\">\r\n                <div className=\"mz-modal__container\">\r\n                    <div className=\"mz-modal__content\">\r\n                        <button className=\"mz-modal__close\" aria-label=\"Close Modal\" onClick={() => {\r\n\t\t\t\t\t\t\tdocument.querySelector('body').classList.remove('disabled');\r\n\t\t\t\t\t\t\thandleClose(false)\r\n\t\t\t\t\t\t}}>\r\n                            <Svg\r\n                                colour=\"grey\"\r\n                                size={1.93}\r\n                                svg_list=\"x\"\r\n                            />\r\n                        </button>\r\n                        <div className=\"mz-modal__text-container\">\r\n                            { ReactHtmlParser (modalContent) }\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    );\r\n};\r\n\r\nModal.propTypes = {\r\n    HandleTabClick: PropTypes.func,\r\n}\r\n\r\nModal.defaultProps = {\r\n    handleClose: () => {\r\n    },\r\n};","import React from 'react';\r\nimport { Svg } from '../Svg/Svg';\r\nimport PropTypes from 'prop-types';\r\n\r\nexport const Button = ({ primary, backgroundColor, label, disabled, icon, iconBefore, iconAfter, svg_className, colour, rotation, size, svg_list, ...props }) => {\r\n    const mode = primary ? 'mz-btn--primary' : 'mz-btn--secondary';\r\n    const disabling = disabled ? true : false;\r\n    const before = iconBefore ? true : false;\r\n    const after = iconAfter ? true : false;\r\n    const displayIcon = icon ? true : false;\r\n    // const iconBtn = icon ? true : false;\r\n    //mz-link-icon-positon--right\r\n    \r\n    const btnBackground = backgroundColor != undefined ? `mz-btn--${backgroundColor}` : null ;\r\n        return (\r\n            <button\r\n                type=\"button\"\r\n                className={['mz-btn', btnBackground, mode].join(' ')}\r\n                disabled={disabling}\r\n\r\n                {...props}\r\n            >   \r\n                <span className={displayIcon && before ? 'mz-link-icon-positon--left' :  displayIcon && after ? 'mz-link-icon-positon--right': null}>\r\n                    {displayIcon && before \r\n                        ? <Svg  \r\n                            colour={colour}\r\n                            rotation={rotation}\r\n                            size={size}\r\n                            svg_list={svg_list}\r\n                        /> : ''}\r\n                    {label}\r\n                    {displayIcon && after \r\n                        ? <Svg  \r\n                            colour={colour}\r\n                            rotation={rotation}\r\n                            size={size}\r\n                            svg_list={svg_list}\r\n                        /> : ''}\r\n                </span>\r\n                \r\n            </button>\r\n        );\r\n};\r\n\r\nButton.propTypes = {\r\n    primary: PropTypes.bool,\r\n    backgroundColor: PropTypes.string,\r\n    icon: PropTypes.bool,\r\n    iconBefore: PropTypes.bool,\r\n    iconAfter: PropTypes.bool,\r\n    label: PropTypes.string.isRequired,\r\n    onClick: PropTypes.func,\r\n    colour: PropTypes.string,\r\n    size: PropTypes.number,\r\n    svg_list: PropTypes.string,\r\n};\r\n    \r\nButton.defaultProps = {\r\n    backgroundColor: null,\r\n    icon: false,\r\n    iconBefore: false,\r\n    iconAfter: false,\r\n    primary: true,\r\n    onClick: undefined,\r\n    disabled: false,\r\n};\r\n    \r\n    \r\nexport default Button;","import React, { useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\n// Tabs that has the same HTML as the CORE's tabs\r\n// to use JS attached to it in Core.\r\nexport const TabsMenu = ({ className, menus }) => {\r\n    const ref = useRef(null)\r\n\tconst { t, i18n } = useTranslation(['general']);\r\n\r\n\tlet menuItems = menus;\r\n    menuItems.sort(function(x,y){ return x.label == 'Popular' ? -1 : y.label == 'Popular' ? 1 : 0; });\r\n\r\n    useEffect(() => {\r\n        // Init the tabs using mzTabs.init() from Core.\r\n        if (window.mzTabs && typeof window.mzTabs.init === 'function') {\r\n            if (ref.current) {\r\n                window.mzTabs.init([ref.current]);\r\n            }\r\n        }\r\n    }, [])\r\n\r\n\tfor (let v of menuItems){\r\n\t\tif(v.label === 'Popular') v.label=t('popular');\r\n\t\tif(v.label === 'All') v.label=t('all');\r\n\t}\r\n\r\n    return (\r\n        <div className={`mz-tabs ${className}`} ref={ref}>\r\n            <div className=\"mz-tabs-menu\">\r\n                <div className=\"mz-tabs-menu-container\">\r\n                    <div className=\"mz-tabs-menu-inner\">\r\n                        {\r\n                            menuItems.map((menu) => (\r\n                                <a\r\n                                    key={menu.id}\r\n                                    className={`mz-tabs-tab interactive ${menu['isactive'] ==='true' ? 'active' : ''}`}\r\n                                    {...menu}\r\n                                >\r\n                                    {menu.label}\r\n                                </a>\r\n                            ))\r\n                        }\r\n                    </div>\r\n                </div>\r\n                <div className=\"mz-tabs-menu--left\"><i className=\"mz-svg mz-svg--grey mz-svg-chevroncarousel mz-svg--rotate180\"></i></div>\r\n                <div className=\"mz-tabs-menu--right\"><i className=\"mz-svg mz-svg--grey mz-svg-chevroncarousel\"></i></div>\r\n            </div>\r\n        </div>\r\n    );\r\n}\r\n\r\nTabsMenu.propTypes = {\r\n    menus: PropTypes.array.isRequired,\r\n    className: PropTypes.string,\r\n}","import React from 'react';\r\nimport ReactHtmlParser from 'react-html-parser'; \r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\nimport { getBaseUrl } from '../../../utils';\r\n\r\nexport const Modal_50_50 = ({title, copy, image, imageMobile, imageAlt, isOpen, modalId, setIsModalOpen, ...props }) => {\r\n    const [modalImage, setModalImage] = React.useState(window.innerWidth < 768?imageMobile:image);\r\n    const imagePath = getBaseUrl() + process.env.REACT_APP_BASIC_CONTENT_PATH;\r\n    const handleResize = () =>{\r\n        if(window.innerWidth < 768){\r\n            setModalImage(imageMobile);\r\n        } else {\r\n            setModalImage(image);\r\n        }\r\n    }\r\n    window.addEventListener('resize', handleResize);\r\n    \r\n    return (\r\n        <div className=\"mz-modal mz-modal--non-sticky-top mz-modal-fifty-fifty\" id={modalId} aria-hidden={!isOpen}>\r\n            <div className=\"mz-modal__inner mz-container\">\r\n                <div className=\"mz-modal__wrapper mz-full-width\">\r\n                    <div className=\"mz-modal__close\">\r\n                        <button\r\n                            className=\"mz-modal-close-button reset\"\r\n                            aria-label=\"Close Modal\"\r\n                            onClick={() => {\r\n                                document.querySelector('html').classList.remove('inactive');\r\n                                setIsModalOpen(false)\r\n                            }}\r\n                        >\r\n                            <Svg\r\n                                colour=\"grey\"\r\n                                size={1.875}\r\n                                svg_list=\"x\"\r\n                            />\r\n                        </button>\r\n                    </div>\r\n                    <div className=\"mz-modal__content\">\r\n                        <div className=\"mz-5050\">\r\n                            <div className=\"mz-container unconstrained mz-5050-container full-width no-gutter-between-cols\">\r\n                                <div className=\"mz-5050-left mz-5050-content\">\r\n                                    <div className=\"mz-image-nolazy mz-image\">\r\n                                        <img src={`${imagePath}/accessories/${image}`} alt={imageAlt}/>\r\n                                    </div>\r\n                                </div>\r\n                                <div className=\"mz-5050-right mz-5050-content\">\r\n                                    <div className=\"mz-5050-text-wrapper text--left\">\r\n                                        <h3 className=\"mz-5050__title\">{title}</h3>\r\n                                        <div className=\"paragraph\">{ ReactHtmlParser (copy) }</div>\r\n                                    </div>\r\n                                </div>\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    );\r\n};\r\n\r\nexport default Modal_50_50;","import ReactHtmlParser from 'react-html-parser';\r\nimport { getLang } from '../utils';\r\n\r\nexport default class TooltipHelper {\r\n    getTooltip(tooltip, incentives, vehicle, rate) {\r\n        const language = getLang();\r\n\r\n        const tooltips = {\r\n\t\t\t\"purchase_price\":{\r\n\t\t        \"en\":`Price shown includes delivery charges (charge includes freight and pre-delivery inspection), dealer administration fee, levies, fees, and all applicable charges (excluding HST and/or GST/PST). Payments shown do not include applicable taxes. To see the vehicle’s total price or payments with sales tax, please click “include taxes in price option” in the payment breakdown or summary page. Charges may vary by Dealer. Please contact your <a href=\"/en/shopping/find-a-retailer/\">local retailer</a> for more information.`,\r\n\t\t        \"fr\":`Le prix indiqué comprend les frais de livraison (pour le transport et l’inspection avant livraison), les frais de gestion du détaillant, les redevances, les droits et tous les frais applicables (à l’exception de la TVH et/ou de la TPS/TVP). Les versements indiqués ne comprennent pas les taxes applicables. Pour voir le prix total du véhicule ou les versements incluant la taxe de vente, veuillez cliquer sur l’option « Inclure les taxes dans le prix » sur la page des détails du prix ou du récapitulatif. Les frais peuvent varier selon le détaillant. Veuillez contacter <a href=\"/fr/shopping/Trouver-un-concessionnaire/\">votre détaillant</a> pour plus d’informations.`\r\n\t\t    },\r\n\t\t    \"downpayment\":{\r\n\t\t        \"en\":\"Lease down payment (with trade-in) may not reduce Capitalized Cost lower than $3,000 over Residual Value. Minimum balance to finance is $7,500.\",\r\n\t\t        \"fr\":\"Pour une location (avec échange), l'acompte ne peut réduire le coût en capital plus bas que <span class=nowrap>3 000 $</span> au-dessus de la valeur résiduelle. Le solde minimum à financer est de 7 500 $.\"\r\n\t\t    },\r\n\t\t\t\"detailedprice_mazdaprice\":{\r\n\t\t\t   \"en\":\"This is the price of your vehicle. It includes any chosen options, plus any accessories you have selected. It excludes fees, levies, credits, down payment and taxes. This price is for informational purposes only and is not an offer. Certain changes (including specifications, prices and availability) may not be reflected. Price will include general freight (cost to move vehicle from factory to dealership) and PDI (Pre-Delivery Inspection - this includes inspection, washes and any top-ups of fluids). Your Mazda retailer may sell for less and is the best source for complete and current information.\",\r\n\t\t\t   \"fr\":\"Il s'agit du prix de votre véhicule incluant les options choisies ainsi que les accessoires que vous avez sélectionnés. Il exclut les frais, les prélèvements, les crédits, l'acompte et les taxes. Ce prix est fourni à titre d'information seulement et ne constitue pas une offre. Certains changements (incluant les spécifications, les prix et la disponibilité) peuvent ne pas être reflétés. Le prix comprend les coûts de transport du véhicule de l'usine au détaillant et l'inspection prélivraison (incluant l'inspection finale, les lavages et les remplissages de liquides). Votre détaillant Mazda peut vendre à un prix inférieur et constitue la meilleure source d'information complète et à jour.\"\r\n\t\t   },\r\n\t\t   \"detailedprice_feesandlevies\":{\r\n\t\t\t\t\"en\":\"These are some of the fees and levies charged by Mazda and other regulators associated with your vehicle purchase. Your local retailer may charge additional fees, insurance, licence, sales taxes and, if applicable, lien registration as well as other fees and are not included.\",\r\n\t\t\t\t\"fr\":\"Il s'agit de certains des frais et prélèvements facturés par Mazda et d'autre organismes de réglementation associés à l'achat de votre véhicule. Votre détaillant pourrait exiger des frais supplémentaires. L'assurance, l'immatriculation, les taxes de vente et, le cas échéant, l'enregistrement de privilège ainsi que d'autres frais ne sont pas inclus.\"\t\t\t   \r\n\t\t\t},\r\n\t\t\t\"detailedprice_taxes\":{\r\n\t\t\t   \"en\":`Applicable sales tax included in the payment breakdown or summary are based on your location selection. Applicable taxes may vary. Please contact your <a href=\"/en/shopping/find-a-retailer/\">local retailer</a> for more information.`,\r\n\t\t\t   \"fr\":`Les taxes de vente applicables incluses dans les détails du prix ou le récapitulatif varient selon l’emplacement sélectionné. Les taxes applicables peuvent varier. Veuillez contacter <a href=\"/fr/shopping/Trouver-un-concessionnaire/\">votre détaillant</a> pour plus d’informations.`\r\n\t\t\t},\r\n\t\t\t\"detailedprice_credit\":{\r\n\t\t\t   \"en\":\"Amounts in this section contribute to reducing the purchase price of your vehicle. Additionally, when you trade in a vehicle, you will receive a tax benefit as the amount you receive for your trade-in is used to reduce the purchase price before sales tax is applied.\",\r\n\t\t\t   \"fr\":\"Les montants indiqués dans cette section contribuent à réduire le prix d'achat de votre véhicule. De plus, lorsque vous échangez un véhicule, vous bénéficiez d'un avantage fiscal, dans la mesure où le montant que vous recevez en échange de votre véhicule est utilisé pour réduire le prix d'achat avant l'application de la taxe de vente.\"\r\n\t\t\t},\r\n\t\t\t\"detailedprice_downpayment\":{\r\n\t\t\t   \"en\":\"A down payment is the money you can choose to pay up front that will reduce the amount of money borrowed on a lease or finance purchase. The larger the down payment, the lower your individual payments will be.\",\r\n\t\t\t   \"fr\":\"Un acompte est une somme d'argent que vous pouvez choisir de payer à l'avance et qui réduira le montant de l'argent emprunté pour une location ou un achat financé. Plus le montant de l'acompte est élevé, plus vos paiements individuels seront bas.\"\r\n\t\t   },\r\n\t\t   \"ev_rebate_federal\":{\r\n\t\t\t   \"en\": `Federal Rebate: <a href=\"https://tc.canada.ca/en/road-transportation/innovative-technologies/zero-emission-vehicles/incentives-purchasing-zero-emission-vehicles\" target=\"_blank\">Incentives for Zero-Emission Vehicles Program (iZEV)</a>: Get up to ${incentives} towards the purchase of new ${vehicle}.`,\r\n\t\t\t  \"fr\": `Rabais du gouvernement fédéral  : <a href=\"https://tc.canada.ca/fr/transport-routier/technologies-novatrices/vehicules-zero-emission/incitatifs-achat-vehicules-zero-emission\" target=\"_blank\">Incitatif pour le programme des véhicules zéro émissions (IVZE)</a> : Obtenez jusqu'à ${incentives} pour l'achat d'un nouveau ${vehicle}.`\r\n\t\t   },\r\n\t\t\t\"ev_rebates_BC\":{\r\n\t\t\t\t\"en\": `Provincial Rebate: <a href=\"https://goelectricbc.gov.bc.ca/\" target=\"_blank\">CleanBC Go Electric Vehicle Rebate Program</a>: Get up to ${incentives} towards the purchase of a new ${vehicle}, and up to $350 to install a level 2 home charging station in a single-family home. <br>Provincial Rebate:<a href=\"https://electricvehicles.bchydro.com/incentives/charger-rebates/home\" target=\"_blank\">BC Hydro EV Charger Rebate Program</a>: Up to $350 towards the purchase and installation of a level 2 home charging station.`,\r\n\t\t\t\t\"fr\": `Rabais du gouvernement provincial :  <a href=\"https://goelectricbc.gov.bc.ca/\" target=\"_blank\">Programme de rabais CleanBC Go Electric</a>: Obtenez jusqu'à ${incentives} pour l'achat d'un nouveau ${vehicle}, et jusqu’à 350 $ pour installer une borne de recharge résidentielle de niveau 2 dans une maison unifamiliale.<br>Rabais du gouvernement provincial : <a href=\"https://electricvehicles.bchydro.com/incentives/charger-rebates/home\" target=\"_blank\">BC Hydro EV Charger Rebate Program</a> : Jusqu'à 350 $ pour l'achat et l'installation d'une borne de recharge à domicile de niveau 2.`\r\n\t\t  \t},\r\n\t\t  \t\"ev_rebates_NB\":{\r\n\t\t\t\t\"en\": `Provincial Rebate: <a href=\"https://www.nbpower.com/en/products-services/electric-vehicles/plug-in-nb/electric-vehicle-rebates/\" target=\"_blank\">Plug-In NB Rebate Program</a>: Get up to ${incentives} towards the purchase of a new ${vehicle}. <br>Residents who receive a vehicle rebate through the Plug-In NB Rebate Program are eligible to claim 50% of the cost to purchase and install one new level 2 EV charger, up to a maximum of $750.`,\r\n\t\t   \t\t\"fr\": `Rabais provincial : <a href=\"https://www.nbpower.com/fr/products-services/electric-vehicles/plug-in-nb/electric-vehicle-rebates/\" target=\"_blank\">Programme NBranché</a> : Obtenez jusqu’à <nobr>${incentives}</nobr> de rabais à l’achat d’un ${vehicle} neuf.<br> Les résidents qui bénéficient d’un rabais dans le cadre du programme NBranché peuvent également réclamer 50 % du coût d’achat et d’installation d’une borne de recharge à domicile de niveau 2 neuve, jusqu’à un maximum de <nobr>750 $</nobr>. `\r\n\t\t\t},\r\n\t\t\t\"ev_rebates_NL\":{\r\n\t\t\t\t\"en\": `Provincial Rebate: <a href=\"https://takechargenl.ca/evs/choosing-an-ev/available-incentives/\" target=\"_blank\">NL Hydro EV Rebate Program</a>: Get up to ${incentives} towards the purchase of a new ${vehicle}.`,\r\n\t\t   \t\t\"fr\": `Rabais provincial : <a href=\"https://takechargenl.ca/evs/choosing-an-ev/available-incentives/\" target=\"_blank\">Programme de rabais pour VÉ de NL Hydro</a> : Obtenez jusqu’à ${incentives} de rabais à l’achat d’un ${vehicle} neuf.`\r\n\t\t\t},\r\n\t\t\t\"ev_rebates_NS\":{\r\n\t\t\t\t\"en\": `Provincial Rebate: <a href=\"https://evassist.ca/rebates/\" target=\"_blank\">The Electrify Nova Scotia Rebate Program</a>: Get up to ${incentives} towards the purchase of a new ${vehicle}.`,\r\n\t\t   \t\t\"fr\": `Rabais provincial : <a href=\"https://evassist.ca/rebates/\" target=\"_blank\">Programme d’électrification de la Nouvelle-Écosse</a> : Obtenez jusqu’à ${incentives} de rabais à l’achat d’un ${vehicle} neuf.`\r\n\t\t\t},\r\n\t\t\t\"ev_rebates_PE\":{\r\n\t\t\t\t\"en\": `Provincial Rebate: <a href=\"https://www.princeedwardisland.ca/en/information/environment-energy-and-climate-action/electric-vehicle-incentive\" target=\"_blank\">PEI Universal EV Incentive</a>: Get up to ${incentives} towards the purchase of a new ${vehicle}, as well as a free level 2 charger (installation not included).`,\r\n\t\t   \t\t\"fr\": `Rabais provincial : <a href=\"https://www.princeedwardisland.ca/fr/information/environnement-energie-et-action-climatique/electric-vehicle-incentive\" target=\"_blank\">Incitatif universel pour VÉ de l’Île-du-Prince-Édouard</a> : Obtenez jusqu’à <nobr>${incentives}</nobr> de rabais à l’achat d’un ${vehicle} neuf, ainsi qu’une borne de recharge de niveau 2 gratuite (installation non comprise).`\r\n\t\t\t},\r\n\t\t  \t\"ev_rebates_QC\":{\r\n\t\t\t\t\"en\": `<div><a href=\"https://www.quebec.ca/en/transports/electric-transportation/financial-assistance-electric-vehicle/new-vehicle/eligible-new-vehicles\" target=\"_blank\">Roulez Vert Program</a>: Get up to ${incentives} towards the purchase of a new ${vehicle} and up to $600 to install a home charging station. </div><br><div><a href=\"https://www.quebec.ca/en/transports/electric-transportation/financial-assistance-electric-vehicle/charging/home-charging-station/choose\" target=\"_blank\">Home Charging Station Rebate</a>: Up to $600 towards the purchase and installation of a level 2 home charging station.</div>`,\r\n\t\t\t\t\"fr\": `<div><a href=\"https://www.quebec.ca/transports/transport-electrique/aide-financiere-vehicule-electrique/vehicule-neuf/vehicules-admissibles\" target=\"_blank\">Programme Roulez vert</a>: Obtenez jusqu'à ${incentives} pour l'achat d'un nouveau ${vehicle} et jusqu’à 600 $ pour installer une borne de recharge résidentielle.</div><br><div><a href=\"https://www.quebec.ca/transports/transport-electrique/aide-financiere-vehicule-electrique/recharge/borne-domicile/choix-bornes-admissibles\" target=\"_blank\">Remboursement pour une borne à domicile</a> : Jusqu'à 600 $ pour l'achat et l'installation d'une borne de recharge à domicile de niveau.</div>`\r\n\t\t\t},\r\n\t\t\t\"ev_rebates_MB\":{\r\n\t\t\t\t\"en\": `<div><a href=\"https://evrebate.mpi.mb.ca/?lang=en\" target=\"_blank\">Manitoba Electric Vehicle Rebate Program</a>: Get up to $4,000 towards the purchase of a new ${vehicle}</div>`,\r\n\t\t\t\t\"fr\": `<div><a href=\"https://evrebate.mpi.mb.ca/?lang=fr\" target=\"_blank\">Programme de remboursement à l’achat ou à la location d’un véhicule électrique du Manitoba</a>: Obtenez jusqu’à 4 000 $ de rabais à l’achat d’un ${vehicle} neuf.</div>`\r\n\t\t\t},\r\n\t\t\t\"ev_rebates_YT\":{\r\n\t\t\t\t\"en\": `Provincial Rebate: Get up to ${incentives} towards the purchase of a new ${vehicle}.`,\r\n\t\t   \t\t\"fr\": `Rabais provincial : Obtenez jusqu’à ${incentives} de rabais à l’achat d’un ${vehicle} neuf.`\r\n\t\t\t},\r\n\t\t   \"incentives\":{\r\n\t\t\t   \"en\": `Payments shown include a $${incentives} Current Incentive. Contact your <a href=\"/en/shopping/find-a-retailer/\">local Mazda retailer</a> for details.`,\r\n\t\t\t   \"fr\": `Les paiements indiqués incluent l\\'offre incitatives actuelle de  ${incentives} $. Communiquez avec <a href=\"/fr/shopping/Trouver-un-concessionnaire/\">votre détaillant Mazda </a> pour les détails.`\r\n\t\t   },\r\n\t\t   \"mazda_cash_incentive\": {\r\n\t\t\t\"en\": `Mazda Retail Cash is applicable to cash purchase deals only and: (i) cannot be combined with lease or finance offers; (ii) will be deducted from the negotiated vehicle price before taxes; (iii) has no cash surrender or other value; and (iv) cannot be applied to past transactions. Conditions apply.`,\r\n\t\t\t\"fr\": `L’incitatif au comptant de Mazda s’applique uniquement aux transactions d’achat au comptant et : (i) ne peut être combiné à des offres à la location ou au financement; (ii) sera déduit du prix négocié du véhicule avant taxes; (iii) n’a aucune valeur de rachat en espèces ni autre valeur; et (iv) ne peut être appliqué aux transactions passées. Des conditions s’appliquent.`\r\n\t\t   },\r\n\t\t    \"ownerloyaltyprogram\":{\r\n\t\t\t\t\"en\": `Current Mazda owners may be eligible to receive up to a ${rate}% rate discount off finance rates, up to a ${rate}% rate discount off lease rates, or up to a ${incentives} cash discount. The most advantageous Mazda Owner Loyalty Program discount (as determined by Mazda) will be automatically applied below. Please contact your <a href=\"/en/shopping/find-a-retailer/\">local Mazda retailer</a> for more details.`,\r\n\t\t\t\t\"fr\": `Les propriétaires actuels d’un véhicule Mazda peuvent bénéficier d’une réduction du taux de financement à l’achat allant jusqu’à ${rate} %, d’une réduction du taux à la location allant jusqu’à ${rate} % ou d’un rabais au comptant allant jusqu’à ${incentives}. La réduction la plus avantageuse du Programme de fidélité du propriétaire Mazda (telle que déterminée par Mazda) sera automatiquement appliquée ci-dessous. Contactez <a href=\"/fr/shopping/Trouver-un-concessionnaire/\">votre détaillant Mazda</a> pour plus de détails.`\r\n\t\t    },\r\n\t\t    \"graduate\":{\r\n\t\t        \"en\":`Recent graduates from an eligible university or college are eligible to receive a discount on the purchase of a new, unused or certified pre-owned vehicle. <a href=\"https://www.mazda.ca/en/shopping-tools/programs/graduate/\" target=\"_blank\">View eligible schools.</a>`,\r\n\t\t        \"fr\":`Les nouveaux diplômés de certains collèges ou universités accrédités sont admissibles à recevoir un rabais à l'achat d'un véhicule neuf ou non encore utilisé, ou d'un véhicule d'occasion certifié. <a href=\"https://www.mazda.ca/fr/magasiner/incitatifs-programmes-speciaux/diplome/\" target=\"_blank\">Voir les écoles accréditées.</a>`\r\n\t\t    },\r\n\t\t    \"military\":{\r\n\t\t        \"en\":`Active military personnel, veterans, reservists may be eligible to receive a discount on a new Mazda vehicle. Contact your <a href=\"/en/shopping/find-a-retailer/\">local Mazda retailer</a> for full details.`,\r\n\t\t        \"fr\":`Le personnel militaire en activité, les anciens combattants et les réservistes, pourraient être admissibles à un rabais sur un véhicule Mazda neuf. Communiquez avec <a href=\"/fr/shopping/Trouver-un-concessionnaire/\">votre détaillant Mazda </a> pour plus de détails.`\r\n\t\t    },\r\n\t\t    \"first_time_owner\":{\r\n\t\t        \"en\":`$750 Upgrade to Mazda incentive (“<strong>Incentive</strong>”) is available on new and previously unregistered 2024 CX-5 models that are purchased or financed/leased (on approved credit) from an authorized Mazda dealer in Canada. Certain conditions apply. See Mazda.ca or your local Mazda dealer for details.<sup>10</sup>`,\r\n\t\t        \"fr\":`L’incitatif de 750 $ pour passer à Mazda (« <strong>incitatif</strong> ») est offert sur les modèles CX-5 2024 neufs et non immatriculés précédemment achetés ou financés/loués (sur approbation du crédit) auprès d’un détaillant Mazda autorisé au Canada. Certaines conditions s’appliquent. Détails sur Mazda.ca ou auprès de votre détaillant Mazda.<sup>10</sup>` \r\n\t\t    },\r\n\t\t\t\"promo_apr\":{\r\n\t\t\t\t\"en\": `The rate selected is a special promotional rate. Alternatively, you can take advantage of cash purchase incentives that cannot be combined with the special promotional rate and your Informational APR would be as outlined above.`,\r\n\t\t\t\t\"fr\": `Le taux sélectionné est un taux promotionnel spécial. Si vous profitez plutôt des offres à l’achat au comptant qui ne peuvent être combinées avec le taux promotionnel spécial, votre TAP informatif serait celui indiqué ci-dessus.`\r\n\t\t\t}\r\n\r\n\r\n        }\r\n\r\n\t\tif(tooltips[tooltip] !== undefined){\r\n        \treturn ReactHtmlParser(tooltips[tooltip][language]);\r\n\t\t}else{\r\n\t\t\treturn  tooltip + ' no tooltip found.';\r\n\t\t}\r\n    }\r\n}","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { useRef, useEffect, useState } from 'react';\r\n\r\nimport TooltipHelper from '../../../Helpers/tooltipHelper';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nexport const Tooltip = ({ TooltipName, TooltipText, incentives, vehicle, rate, TooltipClasses, ...props }) => {\r\n\tconst [toggle, setToggle] = useState(false);\r\n\tconst [tooltipHeight, setTooltipHeight] = useState(null)\r\n\tconst [isTop, setTop] = useState(null);\r\n\tconst [isAnimating, setIsAnimating] = useState(false)\r\n\tconst [didInit, setInit] = useState(false);\r\n\tconst toolRef = useRef();\r\n\tconst tooltipHelper = new TooltipHelper();\r\n\tconst gtmHelper = new GTMHelper();\r\n\r\n\tconst tooltipText = TooltipName ? tooltipHelper.getTooltip(TooltipName, incentives, vehicle, rate) : TooltipText;\r\n\t\r\n\tuseEffect(() =>{\r\n\t\tconst tooltip = toolRef.current;\r\n\t\tif(typeof window.gsap === 'object' && !didInit && !tooltipHeight && tooltip && toggle){\r\n\t\t\tconst initHeight=tooltip.querySelector('.mz-tooltip__text').offsetHeight;\r\n\t\t\tsetTooltipHeight(initHeight)\r\n\t\t\tsetInit(true);\r\n\t\t\ttoggleCollapse(tooltip, 0.3, initHeight);\r\n        }else if(didInit){\r\n            toggleCollapse(tooltip, 0.3);\r\n        }\r\n\t}, [toggle]);\r\n\r\n\tfunction toggleCollapse(tooltip, time, initHeight=tooltipHeight){\r\n\t\tif(!isAnimating){\r\n\t\t\tconst tooltipCont = tooltip.querySelector('.mz-tooltip__text');\r\n\t\t\tconst tooltipWidth = 300;\r\n\t\t\ttooltipCont.style.left='';\r\n\t\t\ttooltipCont.style.top='';\r\n\t\t\tconst tooltipLeft = tooltipCont.getBoundingClientRect().left;\r\n\t\t\tconst tooltipBottom = tooltipCont.getBoundingClientRect().bottom;\r\n\t\t\tconst tooltipRight = tooltipLeft + tooltipWidth;\r\n\r\n\t\t\tconst pricingHeight =  document.querySelector('.mz-pricing') !== null ? document.querySelector('.mz-pricing').offsetHeight : 0;\r\n\r\n\t\t\tif(toggle){\r\n\t\t\t\tif(tooltipBottom + initHeight > (window.innerHeight - pricingHeight)){\r\n\t\t\t\t\ttooltip.classList.add('reverse');\r\n\t\t\t\t\twindow.gsap.set(tooltipCont,{top:-10, transformOrigin:'bottom center'})\r\n\t\t\t\t\twindow.gsap.fromTo(tooltipCont, time,{autoAlpha:0, height:0},{autoAlpha:1, height:initHeight, onUpdate: function(){\r\n\t\t\t\t\t\t\tif(parseInt(tooltipCont.style.top, 10) <= -(initHeight - 20)){\r\n\t\t\t\t\t\t\t\ttooltipCont.style.top = -(initHeight - 10)+ 'px'\r\n\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\ttooltipCont.style.top = -(tooltipCont.offsetHeight + 10)+ 'px';\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t\t\tsetTop(true);\r\n\t\t\t\t}else{\r\n\t\t\t\t\ttooltip.classList.remove('reverse');\r\n\t\t\t\t\twindow.gsap.set(tooltipCont,{top:'6px', transformOrigin:'top center'})\r\n\t\t\t\t\twindow.gsap.fromTo(tooltipCont, time,{autoAlpha:0, height:0},{autoAlpha:1,height:initHeight})\r\n\t\t\t\t\tsetTop(false);\r\n\t\t\t\t}\r\n\t\t\t}else{\r\n\t\t\t\tsetIsAnimating(true)\r\n\t\t\t\tif(isTop){\r\n\t\t\t\t\t\twindow.gsap.to(tooltipCont, time,{autoAlpha:0, height:0, onComplete:enableAni, transformOrigin:'bottom center', onUpdate: function(){\r\n\t\t\t\t\t\t\tif(parseInt(tooltipCont.style.top, 10) >= -10){\r\n\t\t\t\t\t\t\t\ttooltipCont.style.top = '-10px'\r\n\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\ttooltipCont.style.top = -(tooltipCont.offsetHeight + (tooltip.parentElement.offsetHeight *2)) + 'px';\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t\t}else{\r\n\t\t\t\t\twindow.gsap.to(tooltipCont, time,{autoAlpha:0, height:0, onComplete:enableAni, transformOrigin:'top center'})\r\n\t\t\t\t}\r\n\t\t\t\tfunction enableAni(){\r\n\t\t\t\t\tsetIsAnimating(false);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif(tooltipRight > window.innerWidth){\r\n\t\t\t\ttooltipCont.style.left='auto';\r\n\t\t\t\ttooltipCont.style.right= '-20px';\r\n\t\t\t}else if(tooltipLeft < 0){\r\n\t\t\t\ttooltipCont.style.left='-20px';\r\n\t\t\t\ttooltipCont.style.right= 'auto';\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tconst toolClick = (e)=>{\r\n\t\tif(!isAnimating){\r\n\t\t\tsetToggle(!toggle);\r\n\t\t}\r\n\t}\r\n\r\n\t\r\n\r\n\treturn (\r\n\t\ttooltipText !== undefined &&\r\n\t\t\t<div className={\r\n\t\t\t\ttoggle\r\n\t\t\t\t? \"mz-tooltip is-expanded\"\r\n\t\t\t\t: \"mz-tooltip\"\r\n\t\t\t}\r\n\t\t\t{...props}\r\n\t\t\tref={toolRef}\r\n\t\t\tonClick={(e) => {\r\n\t\t\t\ttoolClick(e);\r\n\t\t\t\tgtmHelper.setGTM({'action':'Tooltip', 'Tooltip': TooltipName}, true, false);\r\n\t\t\t}}\r\n\t\t\tonMouseEnter={(e)=>{\r\n\t\t\t\tif(window.matchMedia(\"(min-width: 1025px)\").matches){\r\n\t\t\t\t\tif(!isAnimating){\r\n\t\t\t\t\t\tsetToggle(true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tgtmHelper.setGTM({'action':'Tooltip', 'Tooltip': TooltipName}, true, false);\r\n\t\t\t\t}\r\n\t\t\t}}\r\n\t\t\tonMouseLeave={(e) =>{\r\n\t\t\t\tif(window.matchMedia(\"(min-width: 1025px)\").matches){\r\n\t\t\t\t\tif(!isAnimating){\r\n\t\t\t\t\t\tsetToggle(false);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}}>\r\n\t\t\t\t{TooltipClasses &&\r\n\t\t\t\t\t<i className={TooltipClasses + ' mz-svg mz-svg-info'}></i>\r\n\t\t\t\t}\r\n\t\t\t\t{!TooltipClasses &&\r\n\t\t\t\t\t<i className=\"mz-svg mz-svg--grey mz-svg-info\"></i>\r\n\t\t\t\t}\r\n\t\t\t\t<span className=\"mz-tooltip__text label label--tight\" >\r\n\t\t\t\t\t<div>\r\n\t\t\t\t\t\t{tooltipText}\r\n\t\t\t\t\t\t<div onClick={() => setToggle(!toggle)} className=\"mz-tooltip__close\">\r\n\t\t\t\t\t\t<i className=\"mz-svg mz-svg-x\"></i>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</span>\r\n\t\t\t</div>\r\n\t);\r\n};\r\n\r\nTooltip.propTypes = {\r\n\tTooltipText: PropTypes.string,\r\n\tTooltipClasses: PropTypes.string,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Modal_50_50 from '../../3_Organisms/Modal/Modal_50_50';\r\nimport { getLang, formatPrice, getBaseUrl, getFinanceWeekly, getLeaseBiWeeklyFromOptions, pushToGTMDataLayer } from '../../../utils';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { titleCase } from '../../../Helpers/helpers';\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport { Tooltip } from '../../1_Atoms/Tooltip/Tooltip';\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nexport const AccessoryCard = ({ Accessory, Selected, HandleSelectedAccessory, HandleLearnMore, isPopular, showFinancePrice, ...props }) => {\r\n\tconst [modalOpen, setModalOpen] = React.useState(false);\r\n    const { t, i18n } = useTranslation(['accessories', 'general']);\r\n\tconst gtmHelper = new GTMHelper();\r\n\r\n    //const [selected] = React.useState(Selected);\r\n    const financial = JSON.parse(sessionStorage.getItem(Constants.FinancialObj));\r\n    const financeTermIndex = parseInt(sessionStorage.getItem(Constants.FinanceTermIndex));\r\n    const leaseTermIndex = parseInt(sessionStorage.getItem(Constants.LeaseTermIndex));\r\n    const financeTerm = parseInt(sessionStorage.getItem(Constants.FinanceTerm));\r\n    const leaseTerm = parseInt(sessionStorage.getItem(Constants.LeaseTerm));\r\n\r\n    function setSelectedAccessory() {\r\n        HandleSelectedAccessory(Accessory.index)\r\n    }\r\n\r\n    const imagePath = getBaseUrl() + process.env.REACT_APP_BASIC_CONTENT_PATH;\r\n\r\n    function HandleLearnMore() {\r\n        setModalOpen(!modalOpen);\r\n        document.querySelector('html').classList.add('inactive');\r\n\t\tgtmHelper.setGTM({'action':'Open Modal','modal': 'Accessory Learn More'}, true, false);\r\n    }\r\n\r\n    function closeModal() {\r\n        setModalOpen(false);\r\n    }\r\n\r\n    function getTooltipText(Accessory) {\r\n        const lang = getLang();\r\n        const totalCost = formatPrice(Accessory.price, true);\r\n        const priceIncludesText = lang == 'en' ? 'Includes' : 'Contient';\r\n        const installationText = lang === 'en' ? 'Installation cost' : 'Coûts d\\'installation';\r\n        const totalPriceText = lang === 'en' ? 'Total price' : 'Prix totaux';\r\n    \r\n        let text = `${priceIncludesText}:`;\r\n            text += `<br>${Accessory.name}: ${formatPrice(Accessory.base_msrp, true)}`;\r\n            text += Accessory.install_cost ? `<br>${installationText}: ${formatPrice(Accessory.install_cost, true)}` : '';\r\n            text += `<hr>${totalPriceText}:${totalCost}`;\r\n        return text;\r\n    }\r\n\r\n    function accessoryTotalCost(){\r\n        return Accessory.price + Accessory.install_cost ? Accessory.price + Accessory.install_cost : 0;\r\n    }\r\n\r\n    return (\r\n        <>\r\n        {Accessory ? <>\r\n        <div className={`accessory-card ${Selected?'accessory-card-selected':''}`}>\r\n            <div className=\"accessory-card__content\">\r\n\t\t\t\t{Accessory.popular === true && !isPopular ? <p className=\"accessory-card__popular label\">{t(\"popular\")}</p> : null}\r\n                <img className=\"accessory-card__img\" alt={Accessory.name} src={`${imagePath}/accessories/${Accessory.image}`} onClick={() => HandleLearnMore()} />\r\n                <span className={ Selected ? \"accessory-card__selected-indicator selected\" : \"accessory-card__selected-indicator\"}><i className=\"mz-svg mz-svg--white mz-svg-checkmark\"></i></span>\r\n                <div className=\"accessory-card__info\">\r\n                    <h3 className=\"accessory-card__title\">{titleCase(Accessory.name)}</h3>\r\n                </div>\r\n\t\t\t\t<div className=\"accessory-card__CTAs\">\r\n                    <p className=\"accessory-card__price\">{Accessory.price!==0?`+ ${formatPrice(Accessory.price)}`:''} {Accessory.price_week !== null ? <span>{Accessory.price!==0?\r\n                        `(${showFinancePrice?\r\n                            `${getFinanceWeekly(Accessory.price, financial.calculatedFinance.financeValues[financeTermIndex].aprRate, financial.calculatedFinance.financeValues[financeTermIndex].term)}${t(\"general:week\")}`:\r\n                            `${getLeaseBiWeeklyFromOptions(Accessory.price, financial.calculatedLease.leaseValues[leaseTermIndex].leaseRate, financial.calculatedLease.leaseValues[leaseTermIndex].term)}${t(\"general:bi_week\")}`})`:''}<sup>1</sup><Tooltip TooltipText={ReactHtmlParser(getTooltipText(Accessory))} /></span> : t(\"with_installation\")}\r\n                            \r\n                    </p>\r\n\t\t\t\t\t<button className={Selected ? 'mz-btn mz-btn--primary accessory-card__select-button':'mz-btn mz-btn--primary accessory-card__select-button mz-btn--red'} onClick={() => setSelectedAccessory()}><span>{ Selected ? t(\"remove\"): t(\"accessories:add_to_build\")}</span></button>\r\n\t\t\t\t\t<div className=\"accessory-card__learn-more-button\"> <a className=\"mz-link label text--grey\" onClick={() => HandleLearnMore()}>{t(\"accessories:learn_more\")}</a></div>\r\n\t\t\t\t</div>\r\n            </div>\r\n        </div>\r\n        <Modal_50_50 title={Accessory.name} copy={Accessory.description} image={Accessory.image} imageMobile={Accessory.image} imageAlt={Accessory.name} modalId={Accessory.id} isOpen={modalOpen} setIsModalOpen={closeModal} />\r\n        </>: null}</>\r\n    )\r\n\r\n}\r\n\r\n\r\nexport default AccessoryCard;\r\n\r\nAccessoryCard.propTypes = {\r\n    HandleSelectedAccessory: PropTypes.func,\r\n    HandleLearnMore: PropTypes.func,\r\n}\r\n\r\nAccessoryCard.defaultProps = {\r\n    HandleSelectedAccessory: () => { },\r\n    HandleLearnMore: () => { },\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nexport const CollapseLegal = ({ColCarText1, ColBoxText, key, ...props }) => {\r\n\tconst gtmHelper = new GTMHelper();\r\n\t\r\n    const [toggle, setToggle] = React.useState(false);\r\n\r\n    return (\r\n        <div className=\"mz-collapse mz-collapse--legal\" key={key}>\r\n            <button\r\n                onClick={() =>{\r\n\t\t\t\t\t setToggle(!toggle)\r\n\t\t\t\t\t gtmHelper.setGTM({'action':'Collapse', 'type': 'Legal', 'value': toggle}, true , false);\r\n\t\t\t\t }}\r\n                className=\"mz-collapse__button\"\r\n            >\r\n                <div className=\"mz-collapse__cartext-container\">\r\n                    <p className=\"mz-collapse__text\">{ColCarText1}</p>\r\n                    <i className={ toggle ? \"mz-svg mz-svg-chevron open\" : \"mz-svg mz-svg-chevron\"}></i>\r\n                </div>\r\n            </button>\r\n            <div className={ toggle ? \"mz-collapse__box visible\" : \"mz-collapse__box\"}>{ ReactHtmlParser (ColBoxText) }</div>\r\n        </div>\r\n    )\r\n}\r\n\r\nCollapseLegal.propTypes = {\r\n    ColCarText1: PropTypes.string,\r\n    ColBoxText: PropTypes.string,\r\n}\r\n\r\nCollapseLegal.defaultProps = {\r\n    ColCarText1: 'Legal',\r\n    ColBoxText: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.',\r\n}\r\n\r\nexport default CollapseLegal;","import React, { useState, useEffect }  from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useNavigate, useParams, useSearchParams } from 'react-router-dom';\r\n\r\nimport { formatPrice, getLang, convertNum, getProvince } from '../../../utils'\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport NavHelper from '../../../Helpers/navhelper';\r\nimport { openModal, scrollTo } from '../../../Helpers/helpers';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport Button from '../../1_Atoms/Button/Button';\r\n\r\nexport const Pricing = ({ builtLabel, builtPrice, loanLabel, loanPrice, buttonLabel, leaseLabel, financeLabel, HandleNextClick, setLegalModalOpen, HandleShowFinanceClick, saveLabel, summaryCalculator = window.summaryCalculator, setPreorderModalOpen, ...props }) => {\r\n    //const summaryCalculator = window.summaryCalculator;\r\n    const { year, carline, trim, model, packageCode } = useParams();\r\n\r\n    const lang= getLang();\r\n    const navigate = useNavigate();\r\n    const navHelper = new NavHelper();\r\n\r\n    const [financialInfo, setFinancialInfo] = React.useState(summaryCalculator.FinancialInfo);\r\n    const [showFinancePrice, setShowFinancePrice] = React.useState(summaryCalculator.ShowFinancePrice);\r\n    const [currentMileage] = React.useState(summaryCalculator.AnnualMileage);\r\n    const includeFees = sessionStorage.getItem(Constants.IncludeFees) === 'true';\r\n    const includeRebates = sessionStorage.getItem(Constants.IncludeRebates) === 'true';\r\n    const includeTaxes = sessionStorage.getItem(Constants.IncludeTaxes) === 'true';\r\n    const app = document.querySelector('.App');\r\n    const { t, i18n } = useTranslation(['general']);\r\n    const resizeObserver = new ResizeObserver(() => {\r\n        calculatePriceBarPosition();\r\n    })\r\n    const mazdaFooter = document.querySelector('.mz-footer');\r\n    const mazdaPricing = document.querySelector('.mz-pricing');\r\n    const scrollElement = document.querySelector('.scroll-content');\r\n\tconst gtmHelper = new GTMHelper();\r\n\r\n    const [ocaOpen, setOcaModalOpen] = React.useState(false);\r\n    const [financeType, setFinanceType] = React.useState(false);\r\n    \r\n    const [searchParams, setSearchParams] = useSearchParams();\r\n\r\n    const [update, setForceUpdate] =  useState('');\r\n\r\n    window.removeEventListener('scroll', calculatePriceBarPosition);\r\n    window.removeEventListener('resize', calculatePriceBarPosition);\r\n\r\n    if (resizeObserver && app)\r\n        resizeObserver.unobserve(app);\r\n\r\n    if (mazdaFooter && mazdaPricing) {\r\n        window.addEventListener('scroll', calculatePriceBarPosition, false);\r\n        window.addEventListener('resize', calculatePriceBarPosition, false);\r\n        resizeObserver.observe(app);\r\n    }\r\n\r\n    function calculatePriceBarPosition(e) {\r\n        if (!scrollElement) {\r\n            if (!isFooterOnViewport()) {\r\n                mazdaPricing.style.bottom = \"0px\";\r\n            } else {\r\n                mazdaPricing.style.bottom = `${howMuchFooterIsVisible()}px`;\r\n            }\r\n        } else {\r\n            if (isFooterOnViewport()) {\r\n                mazdaPricing.style.bottom = `${mazdaFooter.offsetHeight}px`;\r\n            } else {\r\n                mazdaPricing.style.bottom = `${scrollElement.clientHeight - window.innerHeight - parseFloat(window.getComputedStyle(scrollElement).transform.split(\", \")[5].replace(')', '')) * -1}px`;\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n\r\n    function handleTogglePrice(e) {\r\n        e.preventDefault();\r\n        //const auxshowFinancePrice = !showFinancePrice\r\n        summaryCalculator.ShowFinancePrice = !showFinancePrice;\r\n        setShowFinancePrice(summaryCalculator.ShowFinancePrice);\r\n\r\n\r\n        if(HandleShowFinanceClick)\r\n            HandleShowFinanceClick(summaryCalculator.ShowFinancePrice);\r\n\r\n\t\tconst toggleType = summaryCalculator.ShowFinancePrice === false ? 'lease':'finance'\r\n\t\tgtmHelper.setGTM({'action':'Switch Financing','finance type': toggleType}, true, false);\r\n    }\r\n\r\n    function isFooterOnViewport() {\r\n        const { top, bottom } = mazdaFooter.getBoundingClientRect()\r\n        const vHeight = (window.innerHeight || document.documentElement.clientHeight);\r\n\r\n        return (\r\n            (top > 0 || bottom > 0) &&\r\n            top < vHeight\r\n        );\r\n    }\r\n\r\n    function howMuchFooterIsVisible() {\r\n        var distance = 0;\r\n        let elem = document.querySelector('.mz-footer');\r\n        const vHeight = window.innerHeight;\r\n        const scrollPosition = window.pageYOffset | document.body.scrollTop;\r\n        do {\r\n            distance += elem.offsetTop;\r\n            elem = elem.offsetParent;\r\n        } while (elem);\r\n\r\n        if (scrollPosition > (distance - vHeight)) {\r\n            return scrollPosition - (distance - vHeight);\r\n        } else {\r\n            return 0;\r\n        }\r\n    }\r\n\r\n    function handlePreOrderClick() {\r\n        document.querySelector('body').classList.add('disabled');\r\n        setPreorderModalOpen(true);\r\n        \r\n    }\r\n\r\n    function handleContactDealerLinkClick(e) {\r\n        e.preventDefault();\r\n        console.log(lang)\r\n        gtmHelper.setGTM({'action':'Open Modal','modal': 'Contact Dealer'}, true, false);\r\n        const targetModal = document.getElementById('mz-react-send-build-to-dealer-modal');\r\n        if (targetModal && summaryCalculator) {\r\n            if (summaryCalculator.SelectedColourExteriorIndex !== 'null' && summaryCalculator.Colours !== null) {\r\n                const heading = targetModal.querySelector('.mz-send-build-to-dealer__vehicle-name');\r\n                if (heading) {\r\n                    heading.textContent = lang === 'en' ? summaryCalculator._selectedModelYear.year.title + ' ' + ReactHtmlParser(summaryCalculator._selectedModelYear.carline.title) : ReactHtmlParser(summaryCalculator._selectedModelYear.carline.title) + ' ' + summaryCalculator._selectedModelYear.year.title;\r\n                }\r\n            }\r\n            openModal('mz-react-send-build-to-dealer-modal');\r\n        }\r\n    }\r\n\r\n    const handleOcaClick = (e) => {\r\n        e.preventDefault();\r\n        document.querySelector('body').classList.remove('disabled');\r\n        if (window.location.href.indexOf('/payments') > 0) {\r\n            setSearchParams({'oca':''});\r\n            setTimeout(() => {\r\n                setSearchParams({'oca':'1'});\r\n            }, 10);\r\n        }else{\r\n            navigate(navHelper.getNavContent(t).tabList[5].uri + '&oca=1');\r\n        }\r\n        const price = summaryCalculator._showFinancePrice ? summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceWithFeesWithRebatesTaxed : summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithFeesWithRebatesTaxed;\r\n        gtmHelper.setGTM({'action':`OCA - Footer`,'year': year, 'model': carline, 'trim': summaryCalculator.selectedVehicle.trim ?? summaryCalculator.AvailableTrim.trims[0].trim_type.url_slug, 'price' : Math.round(price)}, true, false);\r\n    }\r\n\r\n    const getLoanRate = () => {\r\n        if(summaryCalculator.getResponsesHasError())\r\n            return '-'; \r\n\r\n        const loanElement = summaryCalculator.FinancialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex];\r\n        if (Number.parseFloat(loanElement.aprRate) !== Number.parseFloat(loanElement.aprRateDiscounted))\r\n            return convertNum(loanElement.aprRateDiscounted,2) + '%';\r\n        else\r\n            return convertNum(loanElement.aprRate,2) + '%';\r\n    }\r\n\r\n    const getLeaseRate = () => {\r\n        if(summaryCalculator.getResponsesHasError())\r\n            return '-';\r\n\r\n        const leaseElement = summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex];\r\n        if (Number.parseFloat(leaseElement.leaseRate) !== Number.parseFloat(leaseElement.leaseRateDiscounted))\r\n            return convertNum(leaseElement.leaseRateDiscounted,2) + '%';\r\n        else\r\n            return convertNum(leaseElement.leaseRate,2) + '%';\r\n    }\r\n\r\n    const getLoanWeekly = () => {\r\n        if(summaryCalculator.getResponsesHasError())\r\n            return '-';\r\n\r\n        const loanElement = financialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex];\r\n        const weeklyPayment = loanElement[summaryCalculator.IncludeTaxes ? 'weeklyWithTaxes' : 'weekly'];\r\n\r\n        if( weeklyPayment === 0 || weeklyPayment === '0')\r\n            return '-';\r\n\r\n        return formatPrice(weeklyPayment);\r\n    }\r\n\r\n    const getLeaseWeekly = () => {\r\n        if(summaryCalculator.getResponsesHasError())\r\n            return '-';\r\n                \r\n        const leaseElement = financialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex]\r\n        const weeklyPayment = leaseElement[summaryCalculator.IncludeTaxes ? 'biWeeklyWithTaxes' : 'biWeekly'];\r\n\r\n        if( weeklyPayment === 0 || weeklyPayment === '0')\r\n            return '-';\r\n\r\n        return formatPrice(weeklyPayment);\r\n\r\n    }    \r\n\r\n    function getQCEVDisclaimerSection(){\r\n        if(summaryCalculator.IncludeRebates && getProvince() === 'QC' && summaryCalculator.FinancialInfo?.ev_rebates?.length){\r\n             return (\r\n                 <>  \r\n                     <div class=\"mz-QC-EV-disclaimer text--grey label\">\r\n                         {ReactHtmlParser(t(\"general:QCEVDisclaimer\"))}\r\n                         \r\n                     </div>\r\n                     \r\n                 </>\r\n             )\r\n        }\r\n     }\r\n     function handleQCEVD_LinkClick(e){\r\n        if(e.target.id === 'QCEVD_link'){\r\n            e.preventDefault();\r\n            const contactRoute = `/${year}/${carline}/${summaryCalculator.SelectedTrim.trim_type.url_slug}/${summaryCalculator.SelectedModel.model_code}/${summaryCalculator.SelectedModel.option_code}/summary?contactDealer`;\r\n            navigate(contactRoute);\r\n        }\r\n     }\r\n\r\n     function hasBreak(){\r\n        if(lang === 'fr')\r\n            return (<br/>)\r\n     }\r\n\r\n    function getCashPrice(){\r\n        let financePricing = null;\r\n        let cashPricing = null;\r\n        if(includeFees){\r\n            if(includeTaxes){\r\n                if(includeRebates){\r\n                    financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceWithFeesWithRebatesTaxed : financialInfo.calculatedLease.balanceToLeaseWithFeesWithRebatesTaxed;\r\n                    cashPricing = financialInfo.calculatedCash.subtotalWithFeesWithRebatesTaxed;\r\n                }else{\r\n                    financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceWithFeesTaxed : financialInfo.calculatedLease.balanceToLeaseWithFees;\r\n                    cashPricing = financialInfo.calculatedCash.subtotalWithFeesTaxed;\r\n                }\r\n            }else{\r\n                if(includeRebates){\r\n                    financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceWithFeesWithRebates : financialInfo.calculatedLease.balanceToLeaseWithFeesWithRebates;\r\n                    cashPricing = financialInfo.calculatedCash.subtotalWithFeesWithRebatesAndEvRebates;\r\n                }else{\r\n                    financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceWithFees : financialInfo.calculatedLease.balanceToLeaseWithFees\r\n                    cashPricing = financialInfo.calculatedCash.subtotalWithFees;\r\n                }\r\n            }\r\n        }else{\r\n            if(includeTaxes){\r\n                if(includeRebates){\r\n                    financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceWithRebatesTaxed : financialInfo.calculatedLease.balanceToLeaseWithRebates;\r\n                    cashPricing = financialInfo.calculatedCash.subtotalWithIncentiveRebatesAndEvRebatesTaxed;\r\n                }else{\r\n                    financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceTaxed : financialInfo.calculatedLease.balanceToLease;\r\n                    cashPricing = financialInfo.calculatedCash.subtotalTaxed;\r\n                }\r\n            }else{\r\n                if(includeRebates){\r\n                    financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceWithRebates : financialInfo.calculatedLease.balanceToLeaseWithRebates;\r\n                    cashPricing = financialInfo.calculatedCash.subtotalWithIncentiveRebatesAndEvRebates;\r\n                }else{\r\n                    financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinance : financialInfo.calculatedLease.balanceToLease;\r\n                    cashPricing = financialInfo.calculatedCash.subtotal;\r\n                }\r\n            }\r\n        }\r\n\r\n        //for get local price form to grab\r\n        summaryCalculator.CurrentCalculatedCash = formatPrice(cashPricing, true);\r\n\r\n        return (<span className='mmz-cahs-options__price'>{formatPrice(financePricing)}</span>);\r\n    }\r\n    React.useEffect(() => {\r\n        (async () => {\r\n            if(summaryCalculator._selectedModel !== null) {\r\n                document.addEventListener('click',handleQCEVD_LinkClick);\r\n                \r\n                setFinancialInfo(await summaryCalculator.RecalculateFinancialInfo());\r\n        \r\n                setForceUpdate(Math.random());\r\n            }\r\n        })();\r\n    }, [\r\n        summaryCalculator.FinancialInfo?.calculatedFinance, \r\n        summaryCalculator.FinancialInfo?.calculatedLease,\r\n        summaryCalculator._tradeInValue, \r\n        summaryCalculator._downPaymentValue,\r\n        summaryCalculator.LoyaltyChecked, \r\n        summaryCalculator.GraduateChecked, \r\n        summaryCalculator.MilitaryChecked,\r\n        summaryCalculator.FirstTimeOwnerChecked,\r\n    ]);\r\n\r\n    useEffect(() => {\r\n        console.log('refreshing pricebar section');\r\n    }, [update]);\r\n    \r\n    if(!financialInfo)\r\n        return (<></>);\r\n    else\r\n    return (\r\n        <>\r\n            <div\r\n                className='mz-pricing'\r\n                {...props}\r\n            >\r\n                <Button\r\n                    className=\"mz-btn mz-btn--legal text--grey\"\r\n                    label={t(\"general:legal\")}\r\n                    backgroundColor=\"grey\"\r\n                    colour=\"grey\"\r\n                    icon={true}\r\n                    iconAfter={true}\r\n                    svg_className=\"\"\r\n                    svg_list=\"plus\"\r\n                    size={0.6}\r\n                    onClick={() => {\r\n                        document.querySelector('body').classList.add('disabled');\r\n                        setLegalModalOpen(true)\r\n                        gtmHelper.setGTM({'action':'Open Modal','modal': 'legal'}, true, false);\r\n                    }}\r\n                />            \r\n                <div className=\"mz-pricing__container\">\r\n                    <div className=\"mz-pricing__built\">{builtLabel}<span className=\"mz-pricing__built--price\">\r\n                        {getCashPrice()}\r\n                    </span></div>\r\n                    <div className=\"mz-pricing__lease\">\r\n                        {showFinancePrice ? t(\"general:finance\") : t(\"general:lease\")}: {showFinancePrice ? summaryCalculator.FinanceTerm : summaryCalculator.LeaseTerm}{t(\"general:pricing_bar_label\")} {showFinancePrice ? getLoanRate() : getLeaseRate()}\r\n\r\n                        <span className=\"mz-pricing__lease--price\">{showFinancePrice ? getLoanWeekly()+t(\"general:weekly\") : getLeaseWeekly()+t(\"general:bi_weekly\")}</span>\r\n                    </div>\r\n                    {window.allow_oca ? \r\n                    <div className=\"mz-pricing__options\">\r\n                    <div><a className=\"mz-link label\" onClick={(e) => {\r\n                            handleOcaClick(e);\r\n                        }}  >{ReactHtmlParser(t('general:ocaPriceBar'))}</a></div>\r\n                        <a className=\"mz-link label\" href=\"\" onClick={handleTogglePrice}>{showFinancePrice ? leaseLabel : financeLabel}</a>\r\n                    </div> :\r\n                    <div className=\"mz-pricing__options no_oca\" >\r\n                        <a className=\"mz-link label\" href=\"\" onClick={handleTogglePrice}>{showFinancePrice ? leaseLabel : financeLabel}</a>\r\n                    </div>\r\n                    }\r\n                    <Button\r\n                        className=\"mz-btn mz-btn--primary mz-btn--red\"\r\n                        primary={true}\r\n                        backgroundColor=\"red\"\r\n                        colour=\"white\"\r\n                        label={buttonLabel}\r\n                        icon={true}\r\n                        iconAfter={true}\r\n                        svg_className=\"\"\r\n                        svg_list=\"chevron_small\"\r\n                        size={0.8}\r\n                        onClick={() => {\r\n                            HandleNextClick();\r\n                        }}\r\n                    />\r\n                    <div className=\"mz-pricing__dealer\">\r\n                        <div>\r\n                            {summaryCalculator.isSelectionPreOrder() ?\r\n                            <a className=\"mz-link label\" onClick={handlePreOrderClick} style={{cursor:'pointer'}}>{ReactHtmlParser(t(\"general:pre_order\"))}</a>\r\n                            :\r\n                            <a className=\"mz-link label\" onClick={handleContactDealerLinkClick} style={{cursor:'pointer'}}>{ReactHtmlParser(t(\"general:get_local_price\"))}</a>}\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n                <div className=\"mz-pricing__built mz-mobile\">{ReactHtmlParser(t('general:price_as_built_m'))}\r\n                    <span className=\"mz-pricing__built--price mz-mobile\">\r\n                        {getCashPrice()}\r\n                    </span>\r\n                    <div className=\"mz-pricing__dealer\">\r\n                    {summaryCalculator.isSelectionPreOrder() ?\r\n                        <a className=\"mz-link label\" onClick={handlePreOrderClick} style={{cursor:'pointer'}}>{ReactHtmlParser(t(\"general:pre_order\"))}</a>\r\n                        :\r\n                        <a className=\"mz-link label\" onClick={handleContactDealerLinkClick} style={{cursor:'pointer'}}>{ReactHtmlParser(t(\"general:get_local_price\"))}</a>\r\n                    }\r\n                    </div>\r\n                </div>\r\n                <div className=\"mz-pricing__lease mz-mobile\">\r\n                    {showFinancePrice ? t(\"general:finance\") : t(\"general:lease\")}: {hasBreak()} {showFinancePrice ? summaryCalculator.FinanceTerm : summaryCalculator.LeaseTerm}{t(\"general:pricing_bar_label\")} {showFinancePrice ? getLoanRate() : getLeaseRate()}\r\n\r\n                    <span className=\"mz-pricing__lease--price mz-mobile\">{showFinancePrice ? getLoanWeekly()+t(\"general:weekly\") : getLeaseWeekly()+t(\"general:bi_weekly\")}</span>\r\n\r\n                    <div>\r\n                        {window.allow_oca ? \r\n                        <>\r\n                            <a className=\"mz-link label nowrap\" onClick={(e) => handleOcaClick(e)}  >{ReactHtmlParser(t('general:ocaPriceBar'))}</a> \r\n                            <br/> \r\n                        </>\r\n                        : \"\" }\r\n                        <a className=\"mz-link label nowrap\" href=\"#\" onClick={handleTogglePrice}>{showFinancePrice ? leaseLabel : financeLabel}</a></div>\r\n                </div>\r\n            \r\n                <Button\r\n                    className=\"mz-btn mz-btn--primary mz-btn--red mz-mobile\"\r\n                    primary={true}\r\n                    backgroundColor=\"red\"\r\n                    label={buttonLabel}\r\n                    icon={true}\r\n                    iconAfter={true}\r\n                    colour=\"white\"\r\n                    svg_className=\"\"\r\n                    svg_list=\"chevron_small\"\r\n                    size={0.8}\r\n                    onClick={() => HandleNextClick()}\r\n                />\r\n               \r\n            </div>\r\n        </>\r\n     );\r\n};\r\n\r\n\r\n// Pricing.propTypes = {\r\n//     HandleTabClick: PropTypes.func,\r\n// }\r\n\r\n// Pricing.defaultProps = {\r\n//     HandleTabClick: () => {\r\n//     },\r\n// };","import React from 'react';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\nimport PropTypes from 'prop-types';\r\n\r\nexport const PreOrderModal = ({modalContent, isOpen, modalId, handleClose, ...props }) => {\r\n    const summaryCalculator = window.summaryCalculator;\r\n    const { t } = useTranslation(['summary', 'general']);\r\n\r\n    React.useEffect(() => {\r\n        if(isOpen){        \r\n            // Skip if this is the first time loading it because App.js takes care of it.\r\n            //redraw on dealer id change\r\n            if (window.isReactFormsAppLoaded && typeof window.initReactFormsApp === 'function') {\r\n                window.initReactFormsApp();\r\n            }\r\n        }\r\n    }, [isOpen]);\r\n\r\n    window.addEventListener(\"message\", function (e) { \r\n        if (e.data.type === \"formEvent\") {\r\n           if(e.data.origin === 'preOrder'){\r\n                sessionStorage.setItem('preorder',  e.data.message.dealer_code);\r\n                //handlePreOrderClick();\r\n           }\r\n\r\n        }\r\n    });\r\n\r\n    return (\r\n        <div className=\"mz-modal modal\" id=\"preorderModal\" aria-hidden={!isOpen}>\r\n            <div className=\"wrapper\">\r\n                <div className=\"mz-modal__container\">\r\n                    <div className=\"mz-modal__content\">\r\n                        <button className=\"mz-modal__close\" aria-label=\"Close Modal\" onClick={() => {\r\n\t\t\t\t\t\t\tdocument.querySelector('body').classList.remove('disabled');\r\n\t\t\t\t\t\t\thandleClose(false)\r\n\t\t\t\t\t\t}}>\r\n                            <Svg\r\n                                colour=\"grey\"\r\n                                size={1.93}\r\n                                svg_list=\"x\"\r\n                            />\r\n                        </button>\r\n                        <div className=\"mz-modal__text-container\">\r\n                            {isOpen &&\r\n                                <>  \r\n                                    <div className=\"mz-container\">\r\n                                        <div className=\"mz-full-width\">\r\n                                            <h3 style={{'paddingTop':'50px'}}>{t('general:pre_order')}</h3>\r\n                                        </div>\r\n                                    </div>\r\n                                    <div className=\"mzReactForms\">\r\n                                        <input type=\"hidden\" data-mz-form-field-name=\"formType\" value=\"PreOrder\" />\r\n                                        <input type=\"hidden\" data-mz-form-field-name=\"isPreorderModal\" value=\"true\"/>\r\n                                        <input type=\"hidden\" data-mz-form-field-name=\"modelCode\" value={summaryCalculator.selectedVehicle.model}/>\r\n                                        <input type=\"hidden\" data-mz-form-field-name=\"modelOption\" value={summaryCalculator.selectedVehicle.packageCode}/>\r\n                                        {sessionStorage.getItem('preorder') &&\r\n                                            <>\r\n                                                <input type=\"hidden\" data-mz-form-field-name=\"dealerId\" value={sessionStorage.getItem('preorder')}/>\r\n                                            </>\r\n                                        }\r\n                                        <input type=\"hidden\" data-mz-form-field-name=\"source\" value=\"WR\" />\r\n                                        <input type=\"hidden\" data-mz-form-field-name=\"formDisclaimer\" value={t(\"form_disclaimer_retailer\")}/>\r\n                                        <div className=\"mz-react-forms-root\"></div>\r\n                                    </div>\r\n                                </>\r\n                            }\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    );\r\n};\r\n\r\nPreOrderModal.propTypes = {\r\n    HandleTabClick: PropTypes.func,\r\n}\r\n\r\nPreOrderModal.defaultProps = {\r\n    handleClose: () => {\r\n    },\r\n};","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { useRef } from 'react';\r\n\r\nimport { Tooltip } from '../../1_Atoms/Tooltip/Tooltip';\r\n\r\nexport const Alert = ({Id, Desc, ...props }) => {\r\n    const [textDisplayed, setTextDisplayed] = React.useState(null);\r\n    const [tooltipCont, setTooltipCont] = React.useState(null);\r\n    const alertRef = useRef();\r\n\r\n    let summaryCalculator = window.summaryCalculator\r\n\r\n    const getTextDisplay = () => {\r\n        if(Desc)\r\n            return Desc;\r\n\r\n        switch(summaryCalculator._currentStep) {\r\n            case 1:\r\n                if(summaryCalculator?._selectedModelYear?.incentives_banner)\r\n                    return summaryCalculator?._selectedModelYear?.incentives_banner;\r\n            default:                \r\n                if(summaryCalculator?._selectedTrim?.incentives_banner)\r\n                    return summaryCalculator?._selectedTrim?.incentives_banner;\r\n\r\n                if(summaryCalculator?._selectedModelYear?.incentives_banner)\r\n                    return summaryCalculator?._selectedModelYear?.incentives_banner;\r\n        }\r\n\r\n    }\r\n    \r\n    React.useEffect(() => {\r\n        //console.log('ALERT BAR DISPLAY TEXT CHANGED');\r\n\r\n        let tempHtml = getTextDisplay();\r\n        tempHtml = tempHtml?.includes('<ToolTip>') ? tempHtml.split('<ToolTip>') : tempHtml;\r\n        if(Array.isArray(tempHtml)){\r\n            setTooltipCont(tempHtml[1]);\r\n            tempHtml.splice(1, 1);\r\n            tempHtml = tempHtml.join(' ');\r\n        }\r\n        setTextDisplayed(tempHtml);\r\n    }, [summaryCalculator._selectedModelYear, summaryCalculator._selectedTrim]);\r\n\r\n\r\n    if(!textDisplayed) \r\n        return <></>;\r\n    \r\n    function insertTooltip(){\r\n        return (<Tooltip TooltipText={ReactHtmlParser(tooltipCont)} TooltipClasses=\"mz-svg--white\" />)\r\n    }\r\n    return (\r\n        <div className=\"mz-alert__item\" id={Id} ref={alertRef}>\r\n            {!tooltipCont &&  ReactHtmlParser(textDisplayed)}\r\n            {tooltipCont && \r\n                <p>\r\n                    {ReactHtmlParser(textDisplayed)}\r\n                    {insertTooltip()}\r\n                </p>\r\n            }\r\n        </div>\r\n    );\r\n};\r\n\r\nexport default Alert;\r\n\r\nAlert.propTypes = {\r\n    Id: PropTypes.string,\r\n    Desc: PropTypes.string,\r\n}\r\n\r\nAlert.defaultProps = {\r\n    Id:  'AlertID',\r\n    Desc: '',\r\n};","import React from \"react\";\r\nimport PropTypes from 'prop-types';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nimport { setTabsNextAndPrevButtons, goToTop, setCursorWaiting, hideCmsHiddenBlock, getLoading} from '../../../utils'\r\n\r\nimport SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport NavHelper from '../../../Helpers/navhelper';\r\n\r\nimport Button from '../../1_Atoms/Button/Button';\r\nimport { TabsMenu } from \"../../2_Molecules/Tabs/TabsMenu\";\r\nimport AccessoryCard from '../../2_Molecules/AccessoryCard/AccessoryCard'\r\nimport CollapseLegal from '../../2_Molecules/Collapse/CollapseLegal';\r\nimport { Nav } from '../../3_Organisms/Nav/Nav';\r\nimport { Pricing } from '../../3_Organisms/Pricing/Pricing';\r\nimport { Modal } from '../../3_Organisms/Modal/Modal';\r\nimport { PreOrderModal } from '../../3_Organisms/Modal/PreOrderModal';\r\nimport { Alert } from '../../3_Organisms/Alert/Alert';\r\n\r\nexport const AccessoriesList = ({ HandleSelectedAccessory, ...props }) => {\r\n    const summaryCalculator = window.summaryCalculator;\r\n    const [nav, setNav] = React.useState(null);\r\n    const { year, carline, trim, model, packageCode } = useParams();\r\n    const navigate = useNavigate();\r\n    const leftArrowRef = React.useRef();\r\n    const rightArrowRef = React.useRef();\r\n    const tabsContainerRef = React.useRef();\r\n    const tabsRef = React.useRef();\r\n    const [visibleLeftArrow, setVisibleLeftArrow] = React.useState(false);\r\n    const [visibleRightArrow, setVisibleRightArrow] = React.useState(false);\r\n    const legalContent = JSON.parse(sessionStorage.getItem(Constants.LegalAccessories));\r\n    const [legalModalOpen, setLegalModalOpen] = React.useState(false);\r\n    const { t, i18n } = useTranslation(['accessories', 'general']);\r\n    const [accessories, setAccessories] = React.useState(null);\r\n    const [categories, setCategories] = React.useState(null);\r\n    const [selectedAccessories, setSelectedAccessories] = React.useState(summaryCalculator.SelectedAccessories);\r\n    const [selectedCategory, setSelectedCategory] = React.useState(summaryCalculator.SelectedCategory);\r\n    const [showFinancePrice, setShowFinancePrice] = React.useState(summaryCalculator.ShowFinancePrice);\r\n\r\n    const [preorderOpen, setPreorderModalOpen] = React.useState(false);\r\n\r\n\tconst gtmHelper = new GTMHelper();\r\n\tconst navHelper = new NavHelper();\r\n\r\n    hideCmsHiddenBlock();\r\n    \r\n    function handleArrowLeftClick(e) {\r\n        e.preventDefault();\r\n        tabsRef.current.scroll(tabsRef.current.scrollLeft - 50, 0);\r\n        setTabsNextAndPrevButtons();\r\n    }\r\n\r\n    function handleArrowRightClick(e) {\r\n        e.preventDefault();\r\n        tabsRef.current.scroll(tabsRef.current.scrollLeft + 50, 0);\r\n        setTabsNextAndPrevButtons();\r\n    }\r\n\r\n    function setTabsNextAndPrevButtons() {\r\n        if (tabsRef?.current?.offsetWidth < tabsRef?.current?.scrollWidth) {\r\n            if (tabsRef.current.scrollLeft === 0 && !((tabsRef.current.scrollWidth - tabsRef.current.clientWidth) == tabsRef.current.scrollLeft)) {\r\n                setVisibleRightArrow(true);\r\n                setVisibleLeftArrow(false);\r\n            } else if ((tabsRef.current.scrollWidth - tabsRef.current.clientWidth) == tabsRef.current.scrollLeft) {\r\n                setVisibleRightArrow(false);\r\n                setVisibleLeftArrow(true);\r\n            } else {\r\n                setVisibleRightArrow(true);\r\n                setVisibleLeftArrow(true);\r\n            }\r\n        } else {\r\n            setVisibleRightArrow(false);\r\n            setVisibleLeftArrow(false);\r\n        }\r\n        return;\r\n    }\r\n\r\n    function handleArrowLeftClick(e) {\r\n        e.preventDefault();\r\n        tabsRef.current.scroll(tabsRef.current.scrollLeft - 50, 0);\r\n        setTabsNextAndPrevButtons();\r\n    }\r\n\r\n    function handleArrowRightClick(e) {\r\n        e.preventDefault();\r\n        tabsRef.current.scroll(tabsRef.current.scrollLeft + 50, 0);\r\n        setTabsNextAndPrevButtons();\r\n    }\r\n\r\n\t//sort popular to first item\r\n\tfunction isPopular(a, b){\r\n\t\tconst bandA = a.toUpperCase();\r\n\t\tconst bandB = b.toUpperCase();\r\n\r\n\t\tlet comparison = 0;\r\n\t\tif (bandA === 'POPULAR') {\r\n\t\t\tcomparison = -1;\r\n\t\t} else if(bandA > bandB){\r\n\t\t\tcomparison = 1;\r\n\t\t} else if(bandA < bandB){\r\n\t\t\tcomparison = -1;\r\n\t\t}\r\n\t\treturn comparison;\r\n    }\r\n\r\n    summaryCalculator.CurrentStep = 6;\r\n\r\n    React.useEffect(async () => {\r\n        if (!summaryCalculator.isDataLoaded()) {\r\n            await summaryCalculator.loadVehicleData(year, carline, trim, model, packageCode);\r\n\r\n            setNav(null);\r\n        } else if (summaryCalculator.Categories === null) {\r\n            summaryCalculator.Categories = Object.keys(summaryCalculator.Accessories.data).sort(isPopular);\r\n\r\n            setCategories(summaryCalculator.Categories);\r\n        } else if (summaryCalculator.SelectedCategory === null) {\r\n            summaryCalculator.SelectedCategory = \"Popular\";\r\n\r\n            setSelectedCategory(summaryCalculator.SelectedCategory);\r\n        } else if (nav === null) {\r\n            const toRender = navHelper.getNavContent(t);\r\n            setNav(toRender);            \r\n            //setNav(navHelper.getNavContent(year, carline, trim, model, packageCode, summaryCalculator.CurrentStep, t));\r\n\r\n            if (tabsRef.current) {\r\n                tabsRef.current.removeEventListener('scroll', setTabsNextAndPrevButtons);\r\n                tabsRef.current.addEventListener('scroll', setTabsNextAndPrevButtons, true);\r\n                window.removeEventListener('resize', setTabsNextAndPrevButtons);\r\n                window.addEventListener('resize', setTabsNextAndPrevButtons);\r\n\r\n                setTabsNextAndPrevButtons();\r\n            }        \r\n        }\r\n\r\n        // Force first redraw\r\n        if (accessories === null)\r\n        {\r\n            setAccessories(summaryCalculator.Accessories);\r\n        }\r\n\r\n    }, [summaryCalculator, selectedAccessories, selectedCategory, accessories, categories]);\r\n\r\n    async function handleSelectedAccessory(index) {\r\n        setCursorWaiting(true);\r\n\r\n        if (summaryCalculator.SelectedAccessories.findIndex(obj => obj.index === index) === -1) {\r\n            const accessory = summaryCalculator.Accessories.rawData[index][1];\r\n\r\n            let selectedAccessories = summaryCalculator.SelectedAccessories;\r\n            selectedAccessories.push(accessory);\r\n\r\n            await summaryCalculator.setSelectedAccessories(selectedAccessories);\r\n        } else {\r\n            await summaryCalculator.setSelectedAccessories(summaryCalculator.SelectedAccessories.filter((value) => value.index != index));\r\n        }\r\n\r\n        // Force update, this is a hack!\r\n        setSelectedAccessories( Math.random() ); //setSelectedAccessories(summaryCalculator.SelectedAccessories);\r\n\r\n        setCursorWaiting(false);\r\n    }\r\n\r\n    function nextStep() {\r\n        goToTop();\r\n        //navigate(`/${year}/${carline}/${trim}/${model}/${packageCode}/protections${decodeURI(window.location.search)}`);\r\n        navigate(`/${year}/${carline}/${trim}/${model}/${packageCode}/payments${decodeURI(window.location.search)}`);\r\n    }\r\n\r\n    function handleShowFinanceClick(value) {\r\n        setShowFinancePrice(value);\r\n    }\r\n\r\n    function hasAlertBar() {\r\n        return summaryCalculator?._selectedModelYear?.incentives_banner;\r\n    }\r\n\r\n    return (\r\n        <>\r\n            {getLoading(false, t)}\r\n            <Nav nav={nav} />\r\n            <div className={`${hasAlertBar() ? 'mz-top-nav-spacing' : ''}`}>\r\n            <Alert />\r\n\r\n                <div className={`accessories-list ${hasAlertBar() ? '' : 'mz-top-nav-spacing'}`}>\r\n                    {summaryCalculator.Accessories && summaryCalculator.Accessories.title ? <h5 className={`accessories-list__title ${hasAlertBar() ? 'no-top-margin' : ''}`}>{ReactHtmlParser(summaryCalculator.VehicleTitle)} {t(\"accessories:title\")}</h5> : null}\r\n                    {summaryCalculator.Accessories && summaryCalculator.Accessories.data && Object.keys(summaryCalculator.Accessories.data).length !== 0 ? <><br/><div><p className=\"mz-flex-2 caption text--grey text--center\">{ReactHtmlParser(t(\"accessories:titleLegal\"))}</p></div></> : null}\r\n                    {\r\n                        (summaryCalculator.Categories && summaryCalculator.SelectedCategory) && (\r\n                            <TabsMenu\r\n                                className=\"mz-bg--off-white\"\r\n                                menus={summaryCalculator.Categories.map((category, key) => ({\r\n                                    id: key,\r\n                                    isactive: category === summaryCalculator.SelectedCategory ? 'true': '',\r\n                                    label: category,\r\n                                    onClick: async () => {\r\n                                        await summaryCalculator.setSelectedCategory(summaryCalculator.Categories[key]);\r\n                                        setSelectedCategory(summaryCalculator.Categories[key]);\r\n\r\n                                        gtmHelper.setGTM({'action':'Tab Click', 'accessory tab': summaryCalculator.Categories[key]}, true , false);\r\n                                    }\r\n                                }))}\r\n                            />\r\n                        )\r\n                    \r\n                    }\r\n                    <div className='accessories-list__tab-content'>\r\n                        {summaryCalculator.Accessories && summaryCalculator.Accessories.data ?.All && summaryCalculator.SelectedCategory ?\r\n                            summaryCalculator.Accessories.data[summaryCalculator.SelectedCategory].map((accessory, key) =>\r\n                                <AccessoryCard Accessory={accessory} Selected={summaryCalculator.SelectedAccessories ? summaryCalculator.SelectedAccessories.findIndex(obj => obj.index === accessory.index) !== -1 : ''} HandleSelectedAccessory={handleSelectedAccessory} key={key} isPopular={summaryCalculator.SelectedCategory === 'Popular' ? true : false} showFinancePrice={showFinancePrice}></AccessoryCard>)\r\n                            : null}\r\n                    </div>\r\n                    {summaryCalculator.Accessories && summaryCalculator.Accessories.data && Object.keys(summaryCalculator.Accessories.data).length === 0 ? <p className=\"accessories-list__not-found\">{t(\"accessories:no_accessorie_found\")}</p> : null}\r\n                    <div className=\"mz-legal mz-mobile\">\r\n                        <Button\r\n                            className=\"mz-btn mz-btn--legal text--grey\"\r\n                            label={t(\"general:legal\")}\r\n                            backgroundColor=\"grey\"\r\n                            colour=\"grey\"\r\n                            icon={true}\r\n                            iconAfter={true}\r\n                            svg_className=\"\"\r\n                            svg_list=\"plus\"\r\n                            size={0.6}\r\n                            onClick={() => {\r\n                                document.querySelector('body').classList.add('disabled');\r\n                                setLegalModalOpen(true)\r\n                            }}\r\n                        />\r\n                    </div>\r\n                </div>\r\n            </div>\r\n\r\n            <Pricing builtLabel={t(\"general:price_as_built\")} builtPrice=\"$\" loanLabel={t(\"general:loan_label\")} loanPrice=\"$\" /*optionsRoute={`/${year}/${carline}/${trim}/${model}/${packageCode}/payments${decodeURI(window.location.search)}`} optionsLabel=\"See options\"*/ saveLabel={t(\"general:save_build\")}\r\n                leaseLabel={t(\"general:show_lease_price\")} financeLabel={t(\"general:show_finance_price\")} buttonLabel={t(\"general:next_payments\")} summaryCalculator={summaryCalculator}\r\n                HandleNextClick={nextStep} setLegalModalOpen={setLegalModalOpen} HandleShowFinanceClick={handleShowFinanceClick} setPreorderModalOpen={setPreorderModalOpen}  />\r\n            <Modal modalContent={legalContent} isOpen={legalModalOpen} handleClose={setLegalModalOpen} modalId='legalModal' />\r\n            <PreOrderModal isOpen={preorderOpen} handleClose={setPreorderModalOpen}></PreOrderModal> \r\n        </>\r\n    )\r\n}\r\n\r\n\r\nexport default AccessoriesList;\r\n\r\nAccessoriesList.propTypes = {\r\n    HandleSelectedAccessory: PropTypes.func,\r\n}\r\n\r\nAccessoriesList.defaultProps = {\r\n    HandleSelectedAccessory: () => { },\r\n};","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { formatPrice } from '../../../utils'\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nexport const Jelly = ({topLabel, carName, carModel, carPrice, carFeatures, carImg, carImgHover, jellieHaveIcons, icon1, icon2, icon3, btnLabel, onClick, isComingSoon, ...props }) => {\r\n    const { t, i18n } = useTranslation(['vehicles', 'general']);    \r\n    const displayFeatures = carFeatures.map((feature, key) => {\r\n\r\n\t\tlet iconType = feature.icon_type;\r\n        iconType = iconType==='seat'? 'seats' : iconType;\r\n\t\ticonType = iconType==='awd'? 'drivetrain' : iconType;\r\n\t\tfeature.icon_type = iconType; //Pass it back into the array.\r\n\r\n        return (\r\n            <div className=\"mz-icon-text \" key={key}>\r\n                <div className=\"mz-icon-text-icon\">\r\n                    <i className={\"mz-svg mz-svg-feature_\"+feature.icon_type}/>\r\n                </div>\r\n                <div className=\"mz-icon-text-text\">{ReactHtmlParser(feature.content)}</div>\r\n            </div>\r\n        )\r\n    })\r\n\r\n    return (\r\n        <div\r\n            className={ isComingSoon ? 'mz-jelly disabled' :'mz-jelly'}\r\n            {...props}\r\n            onClick={() => onClick()}\r\n        >\r\n            {topLabel ? <span className=\"mz-jelly-top paragraph\">{topLabel}</span> : <span className=\"mz-jelly-top\">&nbsp;</span>}\r\n            <div className={ isComingSoon ? 'mz-jelly-container disabled' :'mz-jelly-container'} >\r\n                <div className=\"mz-image mz-jelly-image\">\r\n                    <img className=\"lazy\" src={carImg} alt={'Car image'}/>\r\n                </div>\r\n                <div className=\"mz-image mz-jelly-image--hover\">\r\n                    <img className=\"lazy\" src={carImgHover} alt={'Car image angled'}/>\r\n\r\n                </div>\r\n            </div>\r\n            <div className={ isComingSoon ? 'mz-jelly-content disabled' :'mz-jelly-content'}>\r\n                <h5>{ReactHtmlParser(carName)}</h5>\r\n                \r\n                <div>{carModel} { !isComingSoon && carPrice > 0 ? `-  ${t(\"jelly_starting_at\")}  ${formatPrice(carPrice)} `:''} { isComingSoon ? '' : <sup>1</sup>}</div>\r\n            </div>\r\n            <div className=\"mz-jelly-iconslist\">{displayFeatures}</div>\r\n        </div>\r\n    );\r\n};\r\n\r\nJelly.propTypes = {\r\n    jellieHaveIcons: PropTypes.bool,\r\n    icon1: PropTypes.bool,\r\n    icon2: PropTypes.bool,\r\n    icon3: PropTypes.bool,\r\n    topLabel: PropTypes.string,\r\n    carName: PropTypes.string,\r\n    carModel: PropTypes.string,\r\n    carFeatures: PropTypes.array,\r\n    // carPrice: PropTypes.string,\r\n    carImg: PropTypes.string,\r\n    carImgHover: PropTypes.string,\r\n    btnLabel: PropTypes.string,\r\n    onClick: PropTypes.func,\r\n}\r\n\r\nJelly.defaultProps = {\r\n    jellieHaveIcons: true,\r\n    icon1: true,\r\n    icon2: true,\r\n    icon3: true,\r\n    topLabel: '',\r\n    carName: '',\r\n    carModel: '',\r\n    carPrice: '',\r\n    carFeatures: [\r\n        {\r\n            \"content\": \"5\",\r\n            \"icon_type\": \"seats\"\r\n        },\r\n        {\r\n            \"content\": \"Available AWD\",\r\n            \"icon_type\": \"awd\"\r\n        },\r\n        {\r\n            \"content\": \"Available Turbo Engine\",\r\n            \"icon_type\": \"turbo\"\r\n        }\r\n    ],\r\n    carImg: '',\r\n    carImgHover: '',\r\n    btnLabel: 'BUILD YOURS',\r\n    onClick: undefined,\r\n}\r\n\r\nexport default Jelly;","//tabs driven by core js.\r\n/* global mzFunc mzTabs */\r\n\r\nimport React, { useEffect, useState, useRef } from \"react\";\r\nimport PropTypes from 'prop-types';\r\nimport { useNavigate } from \"react-router-dom\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n//import NavHelper from '../../../Helpers/navhelper';\r\n\r\nimport Button from '../../1_Atoms/Button/Button';\r\nimport { Jelly } from '../../2_Molecules/Jelly/Jelly';\r\nimport { Modal } from '../../3_Organisms/Modal/Modal';\r\nimport { PreOrderModal } from '../../3_Organisms/Modal/PreOrderModal';\r\nimport { getLang, getProvince, hideCmsHiddenBlock, updateLanguageLink, getLoading, getApiBaseUrl } from '../../../utils';\r\n\r\nexport const VehiclePage = ({summaryCalculator = window.summaryCalculator, ...props }) => {\r\n    const [response, setResponse] = useState({ model_years: [], categories: {} });\r\n    const [vehicleLegal, setVehicleLegal] = useState([{ copy: '' }]);\r\n    \r\n    const leftArrowRef = useRef();\r\n    const rightArrowRef = useRef();\r\n    const tabsRef = useRef();\r\n    const tabsContainerRef = useRef();\r\n    const [loading, setLoading] = useState(true);\r\n    const [visibleTab, setVisibleTab] = useState('2158');\r\n    const [visibleLeftArrow, setVisibleLeftArrow] = useState(false);\r\n    const [visibleRightArrow, setVisibleRightArrow] = useState(false);\r\n\tconst [legalModalOpen, setLegalModalOpen] = React.useState(false);\r\n    const navigate = useNavigate();\r\n    const { t, i18n } = useTranslation(['vehicles', 'general']);\r\n\r\n\tconst gtmHelper = new GTMHelper();\r\n\t//const navHelper = new NavHelper();\r\n\r\n    summaryCalculator.CurrentStep = 0;\r\n\r\n    hideCmsHiddenBlock();\r\n\r\n    useEffect(() => {\r\n        async function executeTasks() {\r\n            // This is needed to have the right vehicle landing page for retailers which are per province\r\n            const isRetailerMode = await summaryCalculator.isRetailerMode();\r\n\r\n            const requestResponse = await summaryCalculator.loadVehicles();\r\n            const requestLegalResponse = await summaryCalculator.loadVehiclesLegal(\"JXTN84\", \"AA00\");\r\n\r\n            setResponse(requestResponse);\r\n            setVehicleLegal(requestLegalResponse);\r\n\r\n            setLoading(false);\r\n            summaryCalculator.reset(true);\r\n\r\n\t\t\tif(typeof mzFunc === 'object' && typeof mzTabs === 'object'){\r\n\t\t\t\tmzFunc.waitForEl('.mzBuildandPrice .mz-tabs').then(function(components){mzTabs.init(components);});\r\n\t\t\t}\r\n\r\n            // Rewrite the top navigation to not have the hash in the URL\r\n            if(window.location.hash) {\r\n                const newLocation = window.location.origin + window.location.pathname.replace('/#/', '');\r\n                window.history.pushState({}, document.title, newLocation);\r\n            }\r\n        }\r\n\r\n        executeTasks();\r\n\r\n        // Used the CMS language change as this page doesn't include the NAV bar\r\n        updateLanguageLink();\r\n    }, []);\r\n\r\n    const Cats = Object.keys(response.categories).map((item, key) => {\r\n        return (\r\n            <a\r\n                onClick={() => {\r\n\t\t\t\t\tsetVisibleTab(response.categories[item].id);\r\n\t\t\t\t\tgtmHelper.setGTM({'action':'Tab Click','vehicle tab': response.categories[item].title}, true, false);\r\n\t\t\t\t}}\r\n                key={response.categories[item].id}\r\n\t\t\t\tclassName={visibleTab === response.categories[item].id ? \"mz-tabs-tab interactive active\" : \"mz-tabs-tab interactive\"}\r\n\t\t\t>\r\n                {response.categories[item].title}\r\n            </a>\r\n        )\r\n    })\r\n\r\n    const PreviusModel = response.model_years.filter(item => item.previous_model === true);\r\n\r\n    if (PreviusModel.length) {\r\n        const previusModelTab = <a\r\n            onClick={() => {\r\n\t\t\t\tsetVisibleTab('previus_model')\r\n\t\t\t\tgtmHelper.setGTM({'action':'Tab Click', 'vehicle tab': 'Previous Model'}, true , false);\r\n\t\t\t}}\r\n            key='previus_model'\r\n            className={visibleTab === 'previus_model' ? \"mz-tabs-tab interactive active\" : \"mz-tabs-tab interactive\"}\r\n        >\r\n            {getLang() ==='en' ? 'Previous Models' : 'MODÈLES PRÉCÉDENTS'}\r\n        </a>;\r\n\r\n        Cats.push(previusModelTab);\r\n    }\r\n\r\n    const Model = response.model_years.map((item, key) => {\r\n        const stripedHtml = item.description.replace(/(<([^>]+)>)/gi, \"\");\r\n        const CategoryNumb = item.carline.categories.map((cat, key) => {\r\n\r\n            if (cat.id === visibleTab && item.previous_model === false) {\r\n                return cat.id\r\n            } if (visibleTab === 'previus_model' && item.previous_model === true) {\r\n                return 'previus_model'\r\n            } else {\r\n                return null\r\n            }\r\n        })\r\n\r\n\t\tconst setTopLabel = ()=>{\r\n\t\t\tlet topLabel= item.is_coming_soon ? item.coming_soon_data.top_copy : null;\r\n\t\t\ttopLabel=item.top_copy ? item.top_copy : topLabel;\r\n\r\n\t\t\treturn topLabel;\r\n\t\t}\r\n\r\n\t\tconst carCont = getLang() ==='en' ?  `${item.year.title} ${item.carline.title}` : `${item.carline.title} ${item.year.title}`;\r\n\r\n        return (\r\n            <div key={key} className=\"mz-tabs__list\" style={CategoryNumb.includes(visibleTab) ? {} : { display: 'none' }}>\r\n                <Jelly\r\n                    topLabel={setTopLabel()}\r\n                    carName={visibleTab === 'previus_model' ? carCont : item.carline.title}\r\n                    carModel={stripedHtml}\r\n                    carFeatures={item.highlighted_features}\r\n                    carPrice={item.financial.msrp}\r\n                    btnLabel=\"Design yours\"\r\n                    isComingSoon={item.is_coming_soon}\r\n                    onClick={() => {\r\n                        if(!item.is_coming_soon){\r\n                            const urlParams = new URLSearchParams(window.location.search);\r\n                            urlParams.set('prov_code', getProvince());\r\n                            urlParams.set('lang_code', getLang());\r\n                            //summaryCalculator.SelectedModelYear = item;\r\n                            window.providerCalls = 0;\r\n                            handleModelClick(`/${item.year.url_slug}/${item.carline.url_slug}/?${decodeURI(urlParams)}`);\r\n                            gtmHelper.setGTM({'action':'Vehicle Click', 'model': item.carline.url_slug, 'year': item.year.url_slug}, true , false);\r\n                        }\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tonMouseOver={(e) => handleModelOver(e)}\r\n\t\t\t\t\tonMouseOut={(e) => handleModelOut(e)}\r\n                    carImg={`${item.visual.static_content_base_path}${item.visual.jelly_path}${item.visual.jelly}`}\r\n                    carImgHover={`${item.visual.static_content_base_path}${item.visual.jelly_path}${item.visual.jelly_hover}`}\r\n                />\r\n            </div>\r\n        )\r\n    })\r\n\r\n    const handleModelClick = navigateUrl => {\r\n        window.ocaRetry = 0\r\n        window.providerRetry = 0\r\n\r\n        // PATCH ADDED FOR Having twice dealerID in URL and causing some session storage switch issue\r\n        const currentLocation = window.location;\r\n        const currentUrl = currentLocation.origin + currentLocation.pathname + currentLocation.hash;\r\n        const urlWithoutQueryParams = currentUrl.split('?')[0];\r\n        window.history.replaceState(null, 'React App', urlWithoutQueryParams);\r\n\r\n        navigate(navigateUrl)\r\n    };\r\n\tconst handleModelOver =  (e) => {\r\n\t\tconst jellyContent = e.target.closest('.mz-tabs__content');\r\n\t\tconst jellySibArr = jellyContent.querySelectorAll('.mz-jelly')\r\n\t\t\tjellySibArr.forEach(jellySib =>{\r\n\t\t\t\tif(e.target !== jellySib){\r\n\t\t\t\tif(!jellySib.classList.contains('active') && jellySib.classList.contains('mz-jelly')){\r\n\t\t\t\t\tjellySib.classList.add('fade');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n    };\r\n\tconst handleModelOut =  (e) => {\r\n\t\tconst jellyContent = e.target.closest('.mz-tabs__content');\r\n\t\tconst jellySibArr = jellyContent.querySelectorAll('.mz-jelly')\r\n\t\t\tjellySibArr.forEach(jellySib =>{\r\n\t\t\t\tif(e.target !== jellySib){\r\n\t\t\t\tif(!jellySib.classList.contains('active') && jellySib.classList.contains('mz-jelly')){\r\n\t\t\t\t\tjellySib.classList.remove('fade');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t};\r\n\r\n    if (loading) {\r\n        return (\r\n            <div className=\"mz-spinner\">{t(\"loading\")}</div>\r\n        )\r\n    }\r\n\r\n\r\n    const HasFinancialProviderError = JSON.parse(sessionStorage.getItem(Constants.HasFinancialProviderError));\r\n\r\n    return (\r\n        <>\r\n        {getLoading(loading, t)}\r\n        <div className=\"wrapper\">\r\n            <div className=\"mz-vehicles mz-container\">\r\n                {HasFinancialProviderError ? <h3 class=\"error\">{t(\"general:service_error\")}</h3>: ''}\r\n                <h2>{t(\"app_title\")}</h2>\r\n                <h5>{t(\"select_a_model\")}</h5>\r\n                <div className=\"mz-tabs\" ref={tabsContainerRef}>\r\n\t\t\t\t\t<div className=\"mz-tabs-menu\">\r\n\t\t\t\t\t\t<div className=\"mz-tabs-menu-container\">\r\n\t\t\t\t\t\t   <div className=\"mz-tabs-menu-inner\">\r\n                            \t{Cats}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<div className=\"mz-tabs-menu--left\"><i className=\"mz-svg mz-svg--grey mz-svg-chevroncarousel mz-svg--rotate180\"></i></div>\r\n\t\t\t\t\t\t<div className=\"mz-tabs-menu--right active\"><i className=\"mz-svg mz-svg--grey mz-svg-chevroncarousel\"></i></div>\r\n                    </div>\r\n                    <div className=\"mz-tabs__content\">\r\n                        {Model}\r\n                    </div>\r\n                </div>\r\n\t\t\t\t<div className=\"mz-legal\">\r\n\t                <Button\r\n\t                    className=\"mz-btn mz-btn--legal text--grey\"\r\n\t                    label={t(\"general:legal\")}\r\n\t                    backgroundColor=\"grey\"\r\n                        colour=\"grey\"\r\n\t                    icon={true}\r\n\t                    iconAfter={true}\r\n\t                    svg_className=\"\"\r\n\t                    svg_list=\"plus\"\r\n\t                    size={0.6}\r\n\t                    onClick={() => {\r\n\t\t\t\t\t\t\tdocument.querySelector('body').classList.add('disabled');\r\n\t\t\t\t\t\t\tsetLegalModalOpen(true);\r\n\t\t\t\t\t\t\tgtmHelper.setGTM({'action':'Open Modal','modal': 'legal'}, true, false);\r\n\t\t\t\t\t\t}}\r\n\t                />\r\n\t            </div>\r\n\t\t\t\t<Modal modalContent={vehicleLegal[0].copy} isOpen={legalModalOpen} handleClose={setLegalModalOpen} modalId='legalModal' />\r\n            </div>\r\n        </div>\r\n    </>\r\n    )\r\n};\r\n\r\nVehiclePage.propTypes = {\r\n    ApiUrl: PropTypes.string,\r\n}\r\n\r\nVehiclePage.defaultProps = {\r\n    ApiUrl: `${getApiBaseUrl()}/api/ModelYears?prov_code=${getProvince()}&lang_code=${getLang()}`,\r\n}\r\n","/* global Draggable, mzFunc */\r\n\r\nimport React, { useEffect, useState, useRef } from 'react';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nexport const ThreeSixtyView = ({ imagePath, imageAmount, imageName, isLoading, ...props }) => {\r\n\tconst [summaryCalculator = new SummaryCalculator().reloadStoredData(), setSummaryCalculator] = React.useState();\r\n\tconst [imageList, setImageList] = React.useState(null)\r\n    const ts = useRef();\r\n\tconst [trigger, setTrigger] = React.useState(ts.current)\r\n\tconst [imageCount, setImageCount] = React.useState(1);\r\n\tconst [draggableIsReady, setDraggableIsReady] = React.useState(false);\r\n\tconst gtmHelper = new GTMHelper();\r\n\r\n    const getImages = ()=>{\r\n        let images ='';\r\n        for(let i=1;i<=parseInt(imageAmount);i++){\r\n            images+=`<img src=\"${imagePath}${imageName.replace('{index}', i)}\" />`;\r\n        }\r\n        return images;\r\n    }\r\n\r\n    function preventScroll(e) {\r\n        e.stopPropagation();\r\n        return false;\r\n    }\r\n\tfunction enableDraggable(){\r\n\t\t//console.log(!ts, !ts.current, trigger == undefined)\r\n\t\tif(!ts || !ts.current || trigger == undefined)\r\n\t\t\treturn;\r\n\r\n\t\t//console.log('enableDraggable', imageCount)\r\n\r\n\t\tif(typeof Draggable == 'function'){\r\n\t\t\tDraggable.create(trigger, {\r\n\t\t\t\ttype: \"x\",\r\n\t\t\t\tlockAxis: true,\r\n\t\t\t\tforce3D: true,\r\n\t\t\t\tzIndexBoost: false,\r\n\t\t\t\tcurrentPos: summaryCalculator.Current360Rotation,\r\n\t\t\t\tminimumMovement: 2, // moves more than 2px to be interpreted as a drag.\r\n\t\t\t\tonDragStart: function () {\r\n\t\t\t\t\tthis.target.classList.add('dragging')\r\n\t\t\t\t\tgtmHelper.setGTM({'action':'Drag Exterior'}, false , false);\r\n\t\t\t\t},\r\n\t\t\t\tonDrag: function () {\r\n\t\t\t\t\t// there is an extra drag event fired on mouse up that has x = 0, so check this.isDragging to skip that last one\r\n\t\t\t\t\tif (this.isDragging) {\r\n\t\t\t\t\t\tlet target = this.target;\r\n\t\t\t\t\t\tlet deltaX = this.deltaX;\r\n\r\n\t\t\t\t\t\t// When dragged forward (right)\r\n\t\t\t\t\t\tif (deltaX > 0) {\r\n\t\t\t\t\t\t\tif (this.vars.currentPos === imageCount - 1) {\r\n\t\t\t\t\t\t\t\tthis.vars.currentPos = 0;\r\n\t\t\t\t\t\t\t} else if (this.vars.currentPos < imageCount - 1) {\r\n\t\t\t\t\t\t\t\tthis.vars.currentPos += 1;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t// When dragged backward (left)\r\n\t\t\t\t\t\telse if (deltaX < 0) {\r\n\t\t\t\t\t\t\tif (this.vars.currentPos === 0) {\r\n\t\t\t\t\t\t\t\tthis.vars.currentPos = imageCount - 1;\r\n\t\t\t\t\t\t\t} else if (this.vars.currentPos > 0) {\r\n\t\t\t\t\t\t\t\tthis.vars.currentPos -= 1;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\ttarget.style.transform = `translate(-${this.vars.currentPos * 100}%, 0)`;\r\n\t\t\t\t\t\tsummaryCalculator.Current360Rotation=this.vars.currentPos;\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tonDragEnd: function () {\r\n\t\t\t\t\tthis.target.classList.remove('dragging')\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\ttrigger.style.transform = `translate(-${summaryCalculator.Current360Rotation * 100}%, 0)`;\r\n\t\t}\r\n\t}\r\n\twindow.addEventListener('resize', set360Height);\r\n\r\n\tfunction set360Height(){\r\n\t\tconst container = document.querySelector('.mz-360-container');\r\n\t\tconst subnav =  document.querySelector('.mz-sticky-submenu');\r\n\t\tconst pricing = document.querySelector('.mz-pricing');\r\n\t\tconst imageCont = document.querySelector('.mz-360-image-container');\r\n\t\tconst title = document.querySelector('.mz-360-container__tittle');\r\n\t\tconst controls = document.querySelector('.mz-360-container__controls');\r\n\t\tconst incentivebar = document.querySelector('.mz-alert__item'); // Red alert bar\r\n\t\tif(imageCont !== null && controls !== undefined && container){\r\n\t\t\tif(window.innerWidth > 1023 && subnav !== undefined && pricing !== undefined && pricing != null){\r\n\t\t\t\tconst alert = mzFunc ? mzFunc.offsetAlert : 0;\r\n\t\t\t\tconst permAlert = mzFunc ? mzFunc.offsetPermAlert : 0;\r\n\t\t\t\tconst menu = document.querySelector('.mz-menu');\r\n\t\t\t\tlet viewHeight = window.innerHeight - ( alert + permAlert + (menu ? menu.clientHeight : 0) + (subnav ? subnav.clientHeight : 0) + (pricing ? pricing.clientHeight : 0) + (incentivebar ? incentivebar.clientHeight : 0));\r\n\t\t\t\t//viewHeight = viewHeight<450? 450 : viewHeight;\r\n\t\t\t\timageCont.style.height= (viewHeight - (title.clientHeight + (controls ? controls.clientHeight : 0))) +'px';\r\n\t\t\t\tcontainer.dataset['height']=imageCont.style.height;\r\n\t\t\t}else{\r\n\t\t\t\tcontainer.dataset['height']=imageCont.clientHeight + 'px';\r\n\t\t\t\timageCont.style.height=null;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\tReact.useEffect(() => {\r\n\t\tsetImageList(getImages());\r\n\r\n\t\tif(ts.current?.querySelector('.mz-images-rotator-content')){\r\n\t\t\tsetTrigger(ts.current.querySelector('.mz-images-rotator-content'));\r\n\t\t\tsetImageCount(trigger?.querySelectorAll('img')?.length);\r\n\t\t}\r\n\r\n\t\tif(!draggableIsReady){\r\n\t\t\tconst ref = setInterval(() => {\r\n\t\t\t\tif(typeof Draggable == 'function' && imageCount > 1) {\r\n\t\t\t\t\tsetDraggableIsReady(true);\r\n\t\t\t\t\tclearInterval(ref);\r\n\t\t\t\t}\r\n\t\t\t}, 100);\r\n\t\t}\r\n\t}, [imageName, imageList, imageCount, isLoading]);\r\n\t\r\n\tReact.useEffect(() => {\r\n\t\tset360Height();\r\n\t\tenableDraggable();\r\n\t\tts.current.addEventListener(\"wheel\", preventScroll);\r\n\t\tts.current.addEventListener(\"scroll\", preventScroll);\r\n\t}, [draggableIsReady]);\r\n\t\t\r\n    return (\r\n        <div className=\"mz-360-image-container\" ref={ts}>\r\n\t\t\t<div className=\"mz-images-rotator-inner\">\r\n      \t\t\t<div className=\"mz-images-rotator-content\">\r\n\t\t\t\t\t{!imageList ? <img src=\"/globalassets/mazda-canada/build-and-price/360_loadinganimation.gif\" /> : ReactHtmlParser(imageList)}\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n        </div>\r\n    )\r\n}\r\n\r\nexport default ThreeSixtyView; ","/*global mzFunc, mzImage360, PhotoSphereViewer */\r\n\r\nimport React from 'react';\r\n\r\nimport { Pannellum } from \"pannellum-react\";\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\n\r\nexport const ThreeSixtyInteriorView = ({ imagePath, ...props }) => {\r\n\tconst gtmHelper = new GTMHelper();\r\n\tconst [panoramaIsReady, setPanoramaIsReady] = React.useState(false);\r\n\r\n\twindow.addEventListener('resize', set360Height);\r\n\r\n\tfunction set360Height(){\r\n\t\tconst container = document.querySelector('.mz-360-container');\r\n\t\tconst subnav =  document.querySelector('.mz-sticky-submenu');\r\n\t\tconst pricing = document.querySelector('.mz-pricing');\r\n\t\tconst imageCont = document.querySelector('.mz-360-image-container__interior');\r\n\t\tconst title = document.querySelector('.mz-360-container__tittle');\r\n\t\tconst controls = document.querySelector('.mz-360-container__controls');\r\n\t\tif(imageCont !== null && controls !== undefined && container){\r\n\t\t\tif(window.innerWidth > 1023 && subnav !== undefined && pricing !== undefined && pricing != null){\r\n\t\t\t\tconst alert = mzFunc ? mzFunc.offsetAlert : 0;\r\n\t\t\t\tconst permAlert = mzFunc ? mzFunc.offsetPermAlert : 0;\r\n\t\t\t\tconst menu = mzFunc ? mzFunc.offsetMenu : 0;\r\n\t\t\t\tlet viewHeight = window.innerHeight - ( alert + permAlert + menu + (subnav ? subnav.clientHeight : 0) + (pricing ? pricing.clientHeight : 0));\r\n\t\t\t\t//viewHeight = viewHeight<450? 450 : viewHeight;\r\n\t\t\t\timageCont.style.height= (viewHeight - (title.clientHeight + (controls ? controls.clientHeight : 0))) +'px';\r\n\t\t\t\tcontainer.dataset['height']=imageCont.style.height;\r\n\t\t\t}else{\r\n\t\t\t\t//container.dataset['height']=imageCont.clientHeight + 'px';\r\n\t\t\t\timageCont.style.height=window.innerHeight/3 +'px';\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfunction enablePanorama(){\r\n\t\tconst interiorEl = document.querySelector('.mz-360-image-container__interior');\r\n\t\tset360Height();\r\n\t\tinteriorEl.innerHTML='';\r\n\t\tconsole.log(document.getElementById('interiorModal'))\r\n\t\tif(!document.getElementById('interiorModal')){\r\n\t\t\tconst fullScreen = document.createElement('div');\r\n\t\t\tfullScreen.classList.add('mz-modal');\r\n\t\t\tfullScreen.id='interiorModal';\r\n\t\t\tfullScreen.setAttribute('aria-hidden', 'true');\r\n\t\t\tdocument.body.appendChild(fullScreen);\r\n\t\t}\r\n\t\tconsole.log(document.getElementById('interiorModal'))\r\n\t\tmzImage360.showPanorama(interiorEl, imagePath);\r\n\t}\r\n\r\n\tReact.useEffect(() => {\r\n\t\tif(!panoramaIsReady){\r\n\t\t\tconst ref = setInterval(() => {\r\n\t\t\t\tif(typeof PhotoSphereViewer == 'object') {\r\n\t\t\t\t\tenablePanorama();\r\n\t\t\t\t\tclearInterval(ref);\r\n\t\t\t\t}\r\n\t\t\t}, 100);\r\n\t\t}\t\t\r\n\t}, [imagePath]);\r\n\r\n\t// <Pannellum\r\n\t// \t        width=\"100%\"\r\n\t// \t        height={set360Height()}\r\n\t// \t        image={imagePath}\r\n\t// \t        pitch={-15}\r\n\t// \t        yaw={-90}\r\n\t// \t        autoLoad={true}\r\n\t// \t\t\tmouseZoom={false}\r\n\t// \t\t\tkeyboardZoom={false}\r\n\t// \t\t\tshowZoomCtrl={false}\r\n\t// \t\t\tshowFullscreenCtrl={true}\r\n\t// \t\t\torientationOnByDefault={false}\r\n\t// \t\t\tonMousedown={(evt)=>gtmHelper.setGTM({'action':'Drag Interior'}, true , false)}\r\n\t// \t\t\tonTouchstart={(evt)=>gtmHelper.setGTM({'action':'Drag Interior'}, true , false)}\r\n\t// \t    >\r\n\t// \t    </Pannellum>\r\n\r\n\treturn(\r\n\t\t<div className=\"mz-360-image-container__interior\">\r\n\t\t    \r\n\t\t</div>\r\n\t)\r\n}\r\n\r\nexport default ThreeSixtyInteriorView;","import React from 'react';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport ThreeSixtyView from '../../2_Molecules/360View/360View';\r\nimport ThreeSixtyInteriorView from '../../2_Molecules/360InteriorView/360InteriorView';\r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\n\r\nexport const ThreeSixtyContainer = ({ imagePathInterior, imagePath, imageAmount, imageName, trimName, imageIsLoading, ...props }) => {\r\n    const [vehicleTrimName, setTrimName] = React.useState(trimName);\r\n    const [active360, setActive360] = React.useState('exterior');\r\n    //const [isModalOpen, setIsModalOpen] = React.useState(false);\r\n    const [isLoading, setIsLoading] = React.useState(false);\r\n    const { t, i18n } = useTranslation(['general']);\r\n\tconst gtmHelper = new GTMHelper();\r\n\r\n    function toggleView() {\r\n        var activeView = active360 === 'interior' ? 'exterior' : 'interior';\r\n        setActive360(activeView);\r\n\t\tgtmHelper.setGTM({'action':'Change 360 View', '360 View': activeView}, true , false);\r\n    }\r\n\r\n    // This will launch only if trimName value has chaged.\r\n    React.useEffect(() => {\r\n        setTrimName(trimName);\r\n\r\n        setIsLoading(imageIsLoading);\r\n    }, [trimName, imagePath, imageIsLoading]);\r\n\r\n    return (\r\n        <div className='mz-360-container'>\r\n            <h2 className=\"mz-360-container__tittle\">{ReactHtmlParser(vehicleTrimName ? vehicleTrimName : '')}</h2>\r\n                {active360 === 'interior' ? <ThreeSixtyInteriorView imagePath={imagePathInterior}></ThreeSixtyInteriorView>\r\n                    : <ThreeSixtyView imagePath={imagePath} imageAmount={imageAmount} imageName={imageName} isLoading={isLoading}></ThreeSixtyView>}\r\n                <div className=\"mz-360-container__controls\">\r\n                    <button className=\"mz-360-container__controls-button mz-360-container__controls-button-drag-copy\">\r\n                        <Svg\r\n                            colour=\"grey\"\r\n                            svg_list=\"threesixty\"\r\n                            svg_classname=\"threesixty\"\r\n                        />\r\n                        {t(\"general:drag_to_view_360\")}\r\n                    </button>\r\n                    <div className=\"mz-360-container__controls-actions\">\r\n                        <button className=\"mz-360-container__controls-button interactive\" onClick={() => toggleView()}>\r\n                            <Svg\r\n                                colour=\"grey\"\r\n                                svg_list={active360 !== 'interior' ? 'steeringwheel' : 'carexterior'}\r\n                            />\r\n                            {active360 !== 'interior' ? t(\"general:interior_view_360\") : t(\"general:exterior_view_360\")}\r\n                        </button>\r\n                    </div>\r\n                </div>\r\n        </div>\r\n\r\n    )\r\n}\r\n\r\nexport default ThreeSixtyContainer;","import React, { useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nexport const Collapse = ({ ColCarText1, ColCarText1Button, ColCarText2, ColCarText3, ColCarImg, ColBoxText, Selected, isPopular, isExpanded, setExpandedIndex, LegalContent, index, showCheck, ...props }) => {\r\n    const [toggle, setToggle] = React.useState(false);\r\n    const { t, i18n } = useTranslation(['trims']);\r\n    const collapseRef = useRef(null);\r\n\r\n    useEffect(() =>{\r\n         if(typeof window.mzAnimator === 'object'){\r\n            function setHeight(){\r\n                window.mzAnimator.animateHeight(collapseRef.current, 'TrimCollapse' + index, 'init')\r\n               // console.log('init',collapseRef.current, index, window.mzAnimator.heightOrigin['TrimCollapse' + index])\r\n                if(window.mzAnimator.heightOrigin['TrimCollapse' + index] === 0){\r\n                    setTimeout(setHeight, 100);\r\n                }\r\n            }\r\n            setHeight()\r\n         }\r\n    },[]);\r\n    \r\n    useEffect(() =>{\r\n        window.mzAnimator.animateHeight(collapseRef.current, 'TrimCollapse' + index, isExpanded)\r\n        //console.log('isExpanded',collapseRef.current, index, window.mzAnimator.heightOrigin['TrimCollapse' + index], isExpanded)\r\n    },[isExpanded]);\r\n\r\n    return (\r\n        <div className={`mz-collapse ${Selected ? 'mz-collapse-selected' : ''}`}>\r\n            <div\r\n                onClick={(e) => {\r\n                    const $el = e.target;\r\n\r\n                    console.log($el, 'button.mz-trims-list__select-trim-button')\r\n\r\n                    if ($el.matches('button.mz-trims-list__select-trim-button')) {\r\n                        return;\r\n                    }\r\n\r\n                    if (isExpanded !== null && setExpandedIndex !== null && index !== null) {\r\n                        if (isExpanded === true) {\r\n                            setExpandedIndex(null);\r\n                        } else {\r\n                            setExpandedIndex(index);\r\n\t\t\t\t\t\t\tsetTimeout(()=>{\r\n\t\t\t\t\t\t\t\tconst collapseTarget = e.target.closest('.mz-collapse');\r\n\t\t\t\t\t\t\t\tif(collapseTarget){\r\n\t\t\t\t\t\t\t\t\tconst scrollWindow = document.querySelector('.mz-trims-list');\r\n\t\t\t\t\t\t\t\t\tconst topScroll = collapseTarget.offsetTop;\r\n\t\t\t\t\t\t\t\t\tscrollWindow.scroll({\r\n\t\t\t\t\t\t\t\t\t  top:topScroll,\r\n\t\t\t\t\t\t\t\t\t  behavior: 'smooth'\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t},1000);\r\n                        }\r\n                    } else {\r\n                        setToggle(!toggle);\r\n                    }\r\n                }}\r\n                className=\"mz-collapse__button\"\r\n            >\r\n                {showCheck &&\r\n                    <div className=\"mz-check-indicator\"><i className=\"mz-svg mz-svg--white mz-svg-checkmark\"></i></div>\r\n                }\r\n                <div className=\"mz-collapse__button-flex-container\">\r\n                    <img className=\"mz-collapse__carimg\" src={ColCarImg} alt={ColCarText1}/>\r\n                    <div className=\"mz-collapse__cartext-container\">\r\n                        {isPopular ? <p className=\"mz-collapse__cartext mz-collapse__cartext--popular\">{t(\"popular\")}</p> : null}\r\n                        <p className=\"mz-collapse__cartext mz-collapse__cartext--1\">{ReactHtmlParser(ColCarText1)}</p>\r\n                        <p className=\"mz-collapse__cartext mz-collapse__cartext--2\">{ColCarText2}<sup>1</sup><span className=\"mz-collapse__cartext mz-collapse__cartext--3\">{`${ColCarText3}`}</span></p>\r\n                    </div>\r\n                    <i className={isExpanded ? \"mz-svg mz-svg-chevron open\" : \"mz-svg mz-svg-chevron\"}></i>\r\n                </div>\r\n                {ReactHtmlParser(LegalContent)}\r\n\r\n                <div className= {isExpanded  ? \"mz-collapse__button-flex-container mz-collapse__content-box visible mz-trims-list__hr\" :  \"mz-collapse__button-flex-container mz-collapse__content-box\"} ref={collapseRef}>\r\n                    {ReactHtmlParser(ColBoxText)}\r\n                </div>\r\n                {ReactHtmlParser(ColCarText1Button)}\r\n\r\n            </div>\r\n            <div className=\"mz-collapse__box\">{ReactHtmlParser(ColBoxText)}</div>\r\n        </div>\r\n    )\r\n}\r\n\r\nCollapse.propTypes = {\r\n    ColCarImg: PropTypes.string,\r\n    ColCarText1: PropTypes.string,\r\n    ColCarText2: PropTypes.string,\r\n    ColCarText3: PropTypes.string,\r\n    ColBoxText: PropTypes.string,\r\n    ColCarText1Button: PropTypes.string,\r\n    isExpanded: PropTypes.bool,\r\n    setExpandedIndex: PropTypes.func,\r\n    index: PropTypes.number\r\n}\r\n\r\nCollapse.defaultProps = {\r\n    ColCarImg: 'https://via.placeholder.com/100x60',\r\n    ColCarText1: 'CX-5 GX',\r\n    ColCarText2: '$XX,XXX',\r\n    ColCarText3: '($XXX/wk)',\r\n    ColBoxText: 'Pellentesque in ipsum id orci porta dapibus. Curabitur arcu erat, accumsan id imperdiet et, porttitor at sem. Nulla porttitor accumsan tincidunt. Cras ultricies ligula sed magna dictum porta. Nulla quis lorem ut libero malesuada feugiat. Curabitur arcu erat, accumsan id imperdiet et, porttitor at sem. Quisque velit nisi, pretium ut lacinia in, elementum id enim. Nulla porttitor accumsan tincidunt. Sed porttitor lectus nibh. Proin eget tortor risus.',\r\n    ColCarText1Button: null,\r\n    isExpanded: null,\r\n    setExpandedIndex: null,\r\n    index: null\r\n\r\n}\r\n\r\nexport default Collapse;","import React from 'react';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { formatPrice, getFinanceWeekly, getLeaseBiWeeklyFromMsrp } from '../../../utils';\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\n\r\nimport Button from '../../1_Atoms/Button/Button';\r\nimport Collapse from '../../2_Molecules/Collapse/Collapse';\r\n\r\nexport const TrimList = ({ trims, setSelectedTrim, selectedTrim, setLegalModalOpen, showFinancePrice, ...props }) => {\r\n    const summaryCalculator = window.summaryCalculator;\r\n    const [trimsData, setTrimsData] = React.useState([]);\r\n    let [financeTerm, setFinanceTerm] = React.useState(parseInt(sessionStorage.getItem(Constants.FinanceTerm)));\r\n    let [leaseTerm, setLeaseTerm] = React.useState(parseInt(sessionStorage.getItem(Constants.LeaseTerm)));\r\n    const [expandedIndex, setExpandedIndex] = React.useState(null);\r\n    const listRef = React.useRef();\r\n    const { t, i18n } = useTranslation(['trims']);\r\n    const handleTrimClick = e => {\r\n        const $el = e.target;\r\n        if ($el.matches('button.mz-trims-list__select-trim-button')) {\r\n            e.stopPropagation();\r\n            const index = Number($el.getAttribute('data-index'));\r\n            setSelectedTrim(index);\r\n        }\r\n    };\r\n\r\n    const setTermIndex = ()=>{\r\n        // Fetch the selected term or select the last one\r\n        let foundLeaseTermIndex = summaryCalculator.FinancialInfo.lease.findIndex(x => x.term === leaseTerm);\r\n        if(!leaseTerm || foundLeaseTermIndex === -1)\r\n            foundLeaseTermIndex = summaryCalculator.FinancialInfo.lease.length - 1;\r\n        setLeaseTerm = summaryCalculator.FinancialInfo.lease[foundLeaseTermIndex].term;\r\n\r\n        let foundFinanceIndex = summaryCalculator.FinancialInfo.apr.findIndex(x => x.term === financeTerm);\r\n        if(!financeTerm || foundFinanceIndex === -1)\r\n            foundFinanceIndex = summaryCalculator.FinancialInfo.apr.length - 1;\r\n        setFinanceTerm = summaryCalculator.FinancialInfo.apr[foundFinanceIndex].term;\r\n    }\r\n\r\n    React.useEffect(() =>{\r\n        document.addEventListener('click', handleTrimClick);\r\n\r\n        if(summaryCalculator.FinancialInfo){\r\n            setTermIndex()\r\n        }\r\n\r\n        setTrimsData(trims);\r\n\r\n        if (listRef.current) {\r\n            window.removeEventListener('resize', setListMaxHeight);\r\n            window.addEventListener('resize', setListMaxHeight);\r\n            setListMaxHeight();\r\n        }\r\n\r\n        return () => {\r\n            document.removeEventListener('click', handleTrimClick);\r\n          };\r\n    },[trims,  summaryCalculator.FinancialInfo, summaryCalculator.FinancialInfo?.calculatedCash, summaryCalculator.FinancialInfo?.calculatedFinance, summaryCalculator.FinancialInfo?.calculatedLease]);\r\n\r\n    function isJellyPathConform(jelly)\r\n    {\r\n        if(!jelly)\r\n            return false;\r\n\r\n        var jellyContents = jelly.split('-');\r\n\r\n        // Validate that we have a trim\r\n        if(jellyContents && !jellyContents[jellyContents.length - 2])\r\n            return false;\r\n        else\r\n            return true;\r\n    }\r\n\r\n    function getImage(trim) {\r\n        const imagePath = trim.visual.static_content_base_path;\r\n        //const key = Object.keys(trim.visual.exteriors)[0];\r\n\r\n        if (isJellyPathConform(trim.visual.jelly)) {\r\n            // Patch for the value received from the backend that has a space in.\r\n            return `${imagePath}${trim.visual.jelly_path}${trim.visual.jelly.replace(/ /g, \"-\")}`;\r\n        } else {\r\n            // Patch for when the jelly hasn't been set in the api correctly (i.e. missing a trim like this `2022-MAZDA3--TAB.png`;)\r\n            return `${imagePath}${trim.visual.jelly_path}${trim.title.replace(/ /g, '-')}-TAB.png`;\r\n        }\r\n    }\r\n\r\n    function getLegalContent(legalArr){\r\n        let legalContent = '';\r\n        legalArr.map((legal, index) => {\r\n            const icon = legal.icon_type === 'disclaimer' ? 'disclaimer' : 'feature_' + legal.icon_type;\r\n            legalContent += `\r\n            <div class=\"mz-trims-list__legal\"><i class=\"mz-svg mz-svg--grey mz-svg-${icon}\" style=\"font-size: 2rem;\"></i>\r\n            <p>${legal.content}</p></div>`;\r\n        })\r\n        return legalContent;\r\n    }\r\n\r\n    function getTrimDataContent(item, index) {\r\n        let highlitedfeatureList = '<ul class=\"mz-trims-list__highlited-feature-list\">';\r\n        item.highlighted_features.forEach(feature => {\r\n            let featureItem = '<li class=\"mz-trims-list__highlited-feature-item\">';\r\n            featureItem += `<i class=\"mz-svg mz-svg--grey mz-svg-feature_${feature.icon_type} mz-i-undefined\" style=\"font-size: 1.85rem;\"></i>`;\r\n            featureItem += `<p>${feature.content}</p></li>`;\r\n            highlitedfeatureList += featureItem;\r\n        });\r\n        highlitedfeatureList += '</ul>';\r\n        const featureListTitle = item.feature_list_title?`<h3 class=\"mz-trims-list__include-features-title\">${item.feature_list_title}</h3>`:'';\r\n        let featureList = '<ul class=\"mz-trims-list__feature-list\">';\r\n\r\n        item.feature_list.forEach(feature => {\r\n            let featureItem = '<li class=\"mz-trims-list__featurei-item\">';\r\n            featureItem += `<p>${feature.content}</p></li>`;\r\n            featureList += featureItem;\r\n        });\r\n        featureList += '</ul>';\r\n\r\n        //const selectTrimButton = index === selectedTrim?`<button class=\"mz-btn mz-btn--secondary mz-trims-list__select-trim-button\" data-index=\"${index}\"  disabled=\"true\"><span class=\"mz-trims-list__select-trim-button-selected\"><i class=\"mz-svg mz-svg--white mz-svg-checkmark mz-i-undefined\"></i></span>${t(\"general:button_selected\")}</button>`: `<button class=\"mz-btn mz-btn--secondary mz-trims-list__select-trim-button\"  data-index=\"${index}\">${t(\"btn_select_this_trim\")}</button>`;\r\n\r\n        const content = highlitedfeatureList + featureListTitle + featureList;\r\n        return content;\r\n    }\r\n\r\n    function getTrimButton(item, index) {\r\n        const selectTrimButton = index === selectedTrim?`<button class=\"mz-btn mz-btn--primary mz-trims-list__select-trim-button mz-trims-list__select-trim-button-header\" data-index=\"${index}\" disabled=\"disabled\"><span>${t(\"general:button_selected\")}</span></button>`: `<button class=\"mz-btn mz-btn--primary mz-btn--red mz-trims-list__select-trim-button mz-trims-list__select-trim-button-header\"  data-index=\"${index}\"><span>${t(\"btn_select_this_trim\")}</span></button>`;\r\n        return selectTrimButton;\r\n    }\r\n\r\n    function setListMaxHeight(){\r\n        if (listRef.current)\r\n            if (window.innerWidth < 1025) {\r\n                listRef.current.style.maxHeight = 'unset';\r\n            } else {\r\n                const incentivebar = document.querySelector('.mz-alert__item'); // Red alert bar\r\n\t\t\t\tconst submenu=document.querySelector(\".mz-sticky-submenu\");\r\n\t\t\t\tconst pricingBar=\r\n                listRef.current.style.height = `${window.innerHeight - (submenu?.offsetTop + document.querySelector(\".mz-sticky-submenu\")?.offsetHeight + document.querySelector(\".mz-pricing\")?.offsetHeight + (incentivebar ? incentivebar.offsetHeight : 0) + 40)}px`;\r\n\t\t\t\tif(!submenu || !pricingBar){\r\n\t\t\t\t\tsetTimeout(setListMaxHeight, 100);\r\n\t\t\t\t}\r\n            }\r\n\r\n    }\r\n\r\n    if(!summaryCalculator.FinancialInfo.calculatedFinance)\r\n        return (<></>)\r\n    else\r\n    return (\r\n        <div className=\"mz-trims-list\" ref ={listRef}>\r\n            <h2 className=\"mz-trims-list__title\">{t(\"select_a_trim\")}</h2>\r\n            {summaryCalculator.displayWarning() ? <div className=\"mz-alert-message paragraph paragraph--tight\">\r\n                <i className=\"mz-svg mz-svg-warning mz-svg--red\"></i>&nbsp;\r\n                <span className=\"mz-alert-message__text\">{t(\"warning_change_trim\")}</span>\r\n            </div> : null}\r\n            {trimsData.map((trim, index) => {\r\n                const trimContent = getTrimDataContent(trim, index);\r\n                const thumbnail = getImage(trim);\r\n                const button = getTrimButton(trim, index);\r\n                const legalContent = getLegalContent(trim.alert_features);\r\n                return <Collapse key={index} Selected={selectedTrim === index} ColCarText1={trim.title} ColCarText1Button={button} showCheck={index === selectedTrim ? true : false} ColCarText2={`${formatPrice(trim.financial.msrp)}`} ColCarText3={\r\n                    `${showFinancePrice?\r\n                        `(${getFinanceWeekly(trim.financial.msrp, summaryCalculator.FinancialInfo?.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].aprRate, summaryCalculator.FinancialInfo?.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].term)}${t(\"general:week\")})`:\r\n                        !window.hideLeaseInCard ? `(${getLeaseBiWeeklyFromMsrp(trim.financial.msrp, summaryCalculator.FinancialInfo?.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].leaseRate, summaryCalculator.FinancialInfo?.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].term)}${t(\"general:bi_week\")})` : ''\r\n                    }`} LegalContent={legalContent} ColCarImg={thumbnail} ColBoxText={trimContent} isPopular={trim.is_popular} index={index} isExpanded={expandedIndex === index} setExpandedIndex={setExpandedIndex}>        \r\n                </Collapse>\r\n\t\t\t})}\r\n            <div className=\"mz-legal mz-mobile\">\r\n            <Button\r\n                className=\"mz-btn mz-btn--legal text--grey\"\r\n                label={t(\"general:legal\")}\r\n                colour=\"grey\"\r\n                icon={true}\r\n                iconAfter={true}\r\n                svg_className=\"\"\r\n                svg_list=\"plus\"\r\n                size={0.6}\r\n                onClick={() => {\r\n\t\t\t\t\tdocument.querySelector('body').classList.add('disabled');\r\n\t\t\t\t\tsetLegalModalOpen(true)\r\n\t\t\t\t}}\r\n            />\r\n            </div>\r\n        </div>\r\n    )\r\n}\r\n\r\n\r\nexport default TrimList;","import React, { useState } from 'react';\r\nimport { useNavigate, useParams } from 'react-router-dom'\r\nimport { data } from 'cheerio/lib/api/attributes';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { get360Data, goToTop, getLoading, setCursorWaiting } from '../../../utils';\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport NavHelper from '../../../Helpers/navhelper';\r\nimport ThreeSixtyContainer from '../../3_Organisms/360Container/360Container';\r\nimport TrimList from '../../3_Organisms/TrimList/TrimList'\r\nimport { Pricing } from '../../3_Organisms/Pricing/Pricing';\r\nimport { Modal } from '../../3_Organisms/Modal/Modal';\r\nimport { PreOrderModal } from '../../3_Organisms/Modal/PreOrderModal';\r\nimport { Nav } from '../../3_Organisms/Nav/Nav';\r\nimport { Alert } from '../../3_Organisms/Alert/Alert';\r\n\r\nexport const TrimsPage = ({summaryCalculator = window.summaryCalculator, ...props }) => {\r\n    const { year, carline } = useParams();\r\n\r\n    const [images, setImages] = useState({});\r\n    const navigate = useNavigate();\r\n    const [loading, setLoading] = useState(true);\r\n    const [is360Loading, setIs360Loading] = useState(true);    \r\n    const [firstEmptyDataLoad, setFirstEmptyDataLoad] = useState(false);\r\n    const [fromTrimSelection, setFromTrimSelection] = useState(false);\r\n    const [dataNeedUpdate, setDataNeedUpdate] = useState(false);\r\n    const legalContent = JSON.parse(sessionStorage.getItem(Constants.LegalTrims));\r\n    const [legalModalOpen, setLegalModalOpen] = useState(false);\r\n    const [showFinancePrice, setShowFinancePrice] = React.useState(summaryCalculator.ShowFinancePrice);\r\n    const [selectedTrimIndex, setSelectedTrimIndex] = useState(null);\r\n    const { t, i18n } = useTranslation(['trims', 'general']);\r\n    const [nav, setNav] = React.useState(null);\r\n\r\n    const [preorderOpen, setPreorderModalOpen] = React.useState(false);\r\n\r\n    const navHelper = new NavHelper();\r\n\tconst gtmHelper = new GTMHelper();\r\n        \r\n    summaryCalculator.CurrentStep = 1;\r\n    \r\n    function set360images() {\r\n        if(!summaryCalculator.Colours)\r\n            return;\r\n\r\n        if (!Object.keys(images).length) {\r\n            summaryCalculator.SetSelectedColorsFromParams();\r\n\r\n            if (summaryCalculator.SelectedColourExteriorIndex > -1 && summaryCalculator.Colours) {\r\n                const extArray = Object.entries(summaryCalculator.Colours.visual.exteriors);\r\n                setImages(get360Data(summaryCalculator.Colours.visual, extArray[summaryCalculator.SelectedColourExteriorIndex][1], summaryCalculator.Colours.visual.interiors[summaryCalculator.SelectedColourInteriorIndex]));\r\n                setIs360Loading(false);\r\n            } else if (summaryCalculator.AvailableTrim) {\r\n                setImages(get360Data(summaryCalculator.AvailableTrim.trims[summaryCalculator.SelectedTrimIndex].visual));\r\n                setIs360Loading(false);\r\n            }\r\n        }\r\n    }\r\n\r\n    function nextStep() {\r\n\t\tlet url;\r\n        if (summaryCalculator.SelectedTrim) {\r\n            goToTop();\r\n            url=`/${year}/${carline}/${summaryCalculator.SelectedTrimUrlSlug}${decodeURI(window.location.search)}`;\r\n        } else {\r\n            goToTop();\r\n            url=`/${year}/${carline}/${summaryCalculator.DefaultTrimUrlSlug}${decodeURI(window.location.search)}`;\r\n        }\r\n\t\tnavigate(url);\r\n\t\tgtmHelper.setGTM({'action':'Next Step'}, true , false);\r\n    }\r\n\r\n    async function handleSelectTrim(index) {\r\n        setImages({});\r\n\r\n        setFromTrimSelection(true);\r\n\r\n        setSelectedTrimIndex(index);\r\n\r\n        setDataNeedUpdate(true);\r\n    }\r\n\r\n    function hideShownCmsBlock() {\r\n        let toHideBlocks = document.querySelectorAll('.mz-footer.visually-shown');\r\n        if (toHideBlocks) {\r\n            toHideBlocks.forEach(function (e) {\r\n                e.classList.remove('visually-shown');\r\n                e.classList.add('visually-hidden');\r\n            });\r\n        }\r\n    }\r\n\r\n    hideShownCmsBlock();\r\n\r\n    goToTop();\r\n\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n    React.useEffect(() => {\r\n        async function executeTasks() {\r\n            if (window.bnp_under_maintenance)\r\n                return;\r\n                \r\n            if (!firstEmptyDataLoad) {\r\n                setCursorWaiting(true);\r\n\r\n                setFirstEmptyDataLoad(true);\r\n\r\n                if (!summaryCalculator.isDataLoaded()) {\r\n                    summaryCalculator.reset(false);\r\n\r\n                    await summaryCalculator.loadVehicleData(year, carline);\r\n\r\n                    if (JSON.parse(sessionStorage.getItem(Constants.HasFinancialProviderError)) === true) {\r\n                        const vehiclePageUri = `/${decodeURI(window.location.search)}`;\r\n                        navigate(vehiclePageUri)\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    setImages({});\r\n                }\r\n\r\n                setSelectedTrimIndex(summaryCalculator.SelectedTrimIndex);\r\n\r\n                setDataNeedUpdate(true);\r\n\r\n                setLoading(false);\r\n\r\n                setCursorWaiting(false);\r\n            }\r\n\r\n            if (!loading) {\r\n                if (dataNeedUpdate) {\r\n                    setDataNeedUpdate(false);\r\n\r\n                    setLoading(true);\r\n\r\n                    if (selectedTrimIndex !== summaryCalculator.SelectedTrimIndex) {\r\n                        setCursorWaiting(true);\r\n\r\n                        if( fromTrimSelection ) {\r\n                            summaryCalculator.reset(false);\r\n                            setFromTrimSelection(false);\r\n                        }\r\n\r\n                        await summaryCalculator.setSelectedTrimIndex(selectedTrimIndex);\r\n\r\n\t\t\t\t\t\tgtmHelper.setGTM({'action':'Trim Change'}, false, false);\r\n\r\n                        setCursorWaiting(false);\r\n                    }\r\n\r\n                    const toRender = navHelper.getNavContent(t);\r\n                    setNav(toRender);\r\n\r\n                    if (Object.keys(images).length === 0) {\r\n                        set360images();\r\n                    }\r\n\r\n                    setLoading(false);\r\n                }\r\n            }\r\n        }\r\n\r\n        executeTasks();\r\n    }, [summaryCalculator, loading, dataNeedUpdate, images, selectedTrimIndex, is360Loading]);\r\n\r\n    function handleShowFinanceClick(value) {\r\n        summaryCalculator.ShowFinancePrice = value;\r\n        setShowFinancePrice(value);\r\n    }\r\n\r\n    function getContent() {\r\n        return (\r\n            <div className=\"mz-trims-page mz-top-nav-spacing grid-no-gutter-sm\">\r\n                <Nav nav={nav} />\r\n                <Alert />\r\n                {summaryCalculator.AvailableTrim && summaryCalculator.AvailableTrim?.trims?.length ?\r\n                    <div key='0' className=\"mz-full-width mz-trims-page__content general-content\">\r\n                        <div className=\"mz-trims-page__content-left\"> \r\n                             <ThreeSixtyContainer imagePathInterior={images.imagePathInterior} imagePath={images.imagePath} imageAmount={images.imageAmount} imageName={images.imageName} trimName={summaryCalculator.VehicleTitle} imageIsLoading={is360Loading} />\r\n                        </div>\r\n                        <div className=\"mz-trims-page__content-right right-container\">\r\n                            <TrimList trims={summaryCalculator.AvailableTrim.trims} setSelectedTrim={handleSelectTrim} selectedTrim={summaryCalculator.SelectedTrimIndex} setLegalModalOpen={setLegalModalOpen} showFinancePrice={showFinancePrice}/>\r\n                        </div>\r\n                    </div>\r\n                    : null}\r\n\r\n                {summaryCalculator.AvailableTrim && summaryCalculator.AvailableTrim?.trims?.length ?\r\n                    <Pricing builtLabel={t(\"general:price_as_built\")} builtPrice=\"$\" loanLabel={t(\"general:loan_label\")} loanPrice=\"$\"\r\n                        leaseLabel={t(\"general:show_lease_price\")} financeLabel={t(\"general:show_finance_price\")} buttonLabel={t(\"general:next_options\")} saveLabel={t(\"general:save_build\")}\r\n                        HandleNextClick={nextStep} setLegalModalOpen={setLegalModalOpen} HandleShowFinanceClick={handleShowFinanceClick} setPreorderModalOpen={setPreorderModalOpen} /> : null}\r\n                <Modal modalContent={legalContent} isOpen={legalModalOpen} handleClose={setLegalModalOpen} modalId='legalModal' />\r\n                <PreOrderModal isOpen={preorderOpen} handleClose={setPreorderModalOpen}></PreOrderModal> \r\n            </div>\r\n        )\r\n    }\r\n\r\n    return (\r\n        <>\r\n            {getLoading(loading, t)}\r\n            {getContent()}\r\n        </>\r\n    )\r\n}\r\n\r\nexport default TrimsPage;","import React from 'react';\r\nimport { useRef, useEffect } from 'react';\r\n\r\nimport PropTypes from 'prop-types';\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport { Tooltip } from '../../1_Atoms/Tooltip/Tooltip';\r\n\r\nexport const CollapseList = ({CollapseClasses, ColCarText1, ColBoxText, TooltipName, TooltipText, ColClassPrice, ColPrices, id, ...props }) => {\r\n\r\n\tconst gtmHelper = new GTMHelper();\r\n    const [toggle, setToggle] = React.useState(false);\r\n    const collapseRef = useRef();\r\n    const [didInit, setInit] = React.useState(false);\r\n\r\n    useEffect(() =>{\r\n        const collapse = collapseRef.current; \r\n        \r\n        if(typeof window.mzAnimator === 'object' && !didInit && toggle){\r\n            window.mzAnimator.animateHeight(collapse, 'CollapseList' + id, 'init')\r\n            setInit(true);\r\n            toggleCollapse(collapse);\r\n        }else{\r\n            toggleCollapse(collapse);\r\n        }\r\n   },[toggle, didInit]);\r\n\r\n   useEffect(() =>{\r\n       // Force a rerender to fix the height since the content has chanegd\r\n       setInit(false);\r\n   },[ColBoxText]);\r\n\r\n   function toggleCollapse(collapse){\r\n        if(toggle){\r\n            window.mzAnimator.animateHeight(collapse, 'CollapseList' + id, true)\r\n        }else if(toggle === false){\r\n            window.mzAnimator.animateHeight(collapse, 'CollapseList' + id, false)\r\n        }\r\n   }\r\n\r\n    return (\r\n        <div className=\"mz-collapse mz-collapse--list\">\r\n            <button\r\n                onClick={() =>{\r\n\t\t\t\t\tsetToggle(!toggle);\r\n\t\t\t\t\tgtmHelper.setGTM({'action':'Collapse', 'type': 'Cash ' + ColCarText1, 'value': toggle}, true , false);\r\n\t\t\t\t}}\r\n                className={CollapseClasses}\r\n            >\r\n                <div className=\"mz-collapse__cartext-container\">\r\n                    <div className=\"mz-collapse__text\">\r\n                        {ReactHtmlParser(ColCarText1)}\r\n                        {TooltipName !=='' && TooltipName !== undefined ?<Tooltip TooltipName={TooltipName}/>:<Tooltip TooltipText={TooltipText}/>}\r\n                    </div>\r\n                </div>\r\n                <i className={ toggle ? \"mz-svg mz-svg-chevron_small open  mz-svg--grey paragraph\" : \"mz-svg mz-svg-chevron_small  mz-svg--grey\"} style={{'fontSize': '1rem'}}></i>\r\n                <span className={ColClassPrice}>{ColPrices}</span>\r\n            </button>\r\n            <div className=\"mz-collapse__box visible\" ref={collapseRef}>{ ReactHtmlParser (ColBoxText) }</div>\r\n        </div>\r\n    )\r\n}\r\n\r\nCollapseList.propTypes = {\r\n    CollapseClasses: PropTypes.string,\r\n    ColCarText1: PropTypes.string,\r\n    ColBoxText: PropTypes.string,\r\n    TooltipName: PropTypes.string,\r\n    ColPrices: PropTypes.string,\r\n    ColClassPrice: PropTypes.string,\r\n}\r\n\r\nCollapseList.defaultProps = {\r\n    CollapseClasses: 'mz-collapse__button',\r\n    ColCarText1: 'Term: 60 months @2.95%',\r\n    ColPrices: '$XX,XXX',\r\n    ColClassPrice: 'mz-collapse__price',\r\n    ColBoxText: 'Pellentesque in ipsum id orci porta dapibus. Curabitur arcu erat, accumsan id imperdiet et, porttitor at sem. Nulla porttitor accumsan tincidunt. Cras ultricies ligula sed magna dictum porta. Nulla quis lorem ut libero malesuada feugiat. Curabitur arcu erat, accumsan id imperdiet et, porttitor at sem. Quisque velit nisi, pretium ut lacinia in, elementum id enim. Nulla porttitor accumsan tincidunt. Sed porttitor lectus nibh. Proin eget tortor risus.',\r\n}\r\n\r\nexport default CollapseList;","import React from 'react';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport OcaService from '../../../Services/OcaService';\r\n\r\nimport Button from '../../1_Atoms/Button/Button';\r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\n\r\nexport const OcaModal = ({financeType, handleClose, isOpen, ...props }) => {\r\n    const summaryCalculator = window.summaryCalculator;\r\n    const { t, i18n } = useTranslation(['general']);\r\n\r\n    const ocaService = new OcaService();\r\n\r\n    \r\n    function handleExit(e){\r\n        ocaService.sendDataToService(summaryCalculator, financeType);\r\n    }\r\n    return (\r\n        <div className=\"mz-modal modal\" id=\"ocaModal\" aria-hidden={!isOpen}>\r\n            <div className=\"wrapper\">\r\n                <div className=\"mz-modal__container\">\r\n                    <div className=\"mz-modal__content\">\r\n                        <button className=\"mz-modal__close\" aria-label=\"Close Modal\" onClick={() => {\r\n                                handleClose(false)\r\n                                document.querySelector('body').classList.remove('disabled');\r\n                            }}>\r\n                                <Svg\r\n                                    colour=\"grey\"\r\n                                    size={1.93}\r\n                                    svg_list=\"x\"\r\n                                />\r\n                        </button>\r\n                        <div className=\"mz-modal__text-container\">\r\n                            <h3 className=\"text--center\">{t(\"general:ocaTitle\")}</h3>\r\n                            <div className=\"mz-spacer mz-spacer-s\"></div>\r\n                            <p className=\"text--center\">{t(\"general:ocaContent\")}</p>\r\n                            <div className=\"mz-spacer mz-spacer-s\"></div>\r\n                            <div className=\"mz-container-flex\">\r\n                                <Button\r\n                                    className=\"mz-btn mz-btn--primary mz-btn--red\"\r\n                                    label={t(\"general:ocaButton\")}\r\n                                    colour=\"white\"\r\n                                    icon={true}\r\n                                    iconAfter={true}\r\n                                    svg_className=\"\"\r\n                                    svg_list=\"chevron_small\"\r\n                                    size={0.8}\r\n                                    onClick={(e) => {\r\n                                        handleClose(false);\r\n                                        document.querySelector('body').classList.remove('disabled');\r\n                                        handleExit(e);\r\n                                    }}\r\n                                />\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    )\r\n}\r\n\r\nOcaModal.defaultProps = {\r\n    handleClose: () => {\r\n    },\r\n};\r\n\r\n","import React from 'react';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\nimport PropTypes from 'prop-types';\r\n\r\nexport const ReserveModal = ({modalContent, isOpen, modalId, handleClose, ...props }) => {\r\n    const summaryCalculator = window.summaryCalculator;\r\n    const { t } = useTranslation(['summary', 'general']);\r\n    //const [reserveOpen, setReserveOpen] = React.useState(isOpen);\r\n\r\n    React.useEffect(() => {\r\n        // Restart React Forms app.\r\n        // Skip if this is the first time loading it because App.js takes care of it.\r\n        if (window.isReactFormsAppLoaded && typeof window.initReactFormsApp === 'function') {\r\n            window.initReactFormsApp();\r\n        }\r\n    }, [isOpen]);\r\n\r\n    return (\r\n        <div className=\"mz-modal modal\" id={modalId} aria-hidden={!isOpen}>\r\n            <div className=\"wrapper\">\r\n                <div className=\"mz-modal__container\">\r\n                    <div className=\"mz-modal__content\">\r\n                        <button className=\"mz-modal__close\" aria-label=\"Close Modal\" onClick={() => {\r\n\t\t\t\t\t\t\tdocument.querySelector('body').classList.remove('disabled');\r\n\t\t\t\t\t\t\thandleClose(false)\r\n\t\t\t\t\t\t}}>\r\n                            <Svg\r\n                                colour=\"grey\"\r\n                                size={1.93}\r\n                                svg_list=\"x\"\r\n                            />\r\n                        </button>\r\n                        <div className=\"mz-modal__text-container\">\r\n                            {isOpen &&\r\n                                <>\r\n                                    <h3>{t(\"title_reserve_yours\")}</h3>\r\n                                    <div className=\"mzReactForms\">\r\n                                        <input type=\"hidden\" data-mz-form-field-name=\"formType\" value=\"ReserveYourMazda\"/>\r\n                                        <input type=\"hidden\" data-mz-form-field-name=\"modelCode\" value={summaryCalculator.selectedVehicle.model}/>\r\n                                        <input type=\"hidden\" data-mz-form-field-name=\"modelOption\" value={summaryCalculator.selectedVehicle.packageCode}/>\r\n                                        <input type=\"hidden\" data-mz-form-field-name=\"dealerId\" value={summaryCalculator.getDealerVars().dealerId}/>\r\n                                        <input type=\"hidden\" data-mz-form-field-name=\"initStepTopContents\" value=\"mz-hero\"/>\r\n                                        <input type=\"hidden\" data-mz-form-field-name=\"lastStepBottomContents\" value=\"mz-content-cards|mz-tool-icons\"/>\r\n                                        <input type=\"hidden\" data-mz-form-field-name=\"source\" value=\"WD\"/>\r\n                                        <input type=\"hidden\" data-mz-form-field-name=\"formDisclaimer\" value={t(\"form_disclaimer_retailer\")}/>\r\n                                        <div className=\"mz-react-forms-root\"></div>\r\n                                    </div>\r\n                                </>\r\n                            }\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    );\r\n};\r\n\r\nReserveModal.propTypes = {\r\n    HandleTabClick: PropTypes.func,\r\n}\r\n\r\nReserveModal.defaultProps = {\r\n    handleClose: () => {\r\n    },\r\n};","import React from 'react';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\n\r\nimport { formatPrice, getBaseUrl, getMazdaFeesAndLeviesDetailTitle, convertKM, convertNum, getLang, getProvince, getDisplayableProvinceName } from '../../../utils';\r\n\r\nimport { openModal } from '../../../Helpers/helpers';\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport { Tooltip } from '../../1_Atoms/Tooltip/Tooltip';\r\nimport { Button } from '../../1_Atoms/Button/Button';\r\nimport { CollapseList } from '../../2_Molecules/Collapse/CollapseList';\r\nimport { OcaModal } from '../../3_Organisms/Modal/OcaModal';\r\nimport { ReserveModal } from '../../3_Organisms/Modal/ReserveModal';\r\nimport { PreOrderModal } from '../../3_Organisms/Modal/PreOrderModal';\r\n\r\nexport const Financial = ({\r\n    openCollapsable,\r\n    setOpenCollapsable,\r\n    ...props }) => {\r\n\r\n    const gtmHelper = new GTMHelper();\r\n    \r\n    const { year, carline, trim, model, packageCode } = useParams();\r\n\r\n    const { t, i18n } = useTranslation(['summary', 'payments', 'general']);\r\n    \r\n    const [reserveOpen, setReserveModalOpen] = React.useState(false);\r\n    const [preorderOpen, setPreorderModalOpen] = React.useState(false);\r\n\r\n    const [ocaOpen, setOcaModalOpen] = React.useState(false);\r\n    const [financeType, setFinanceType] = React.useState(false);\r\n    const [getLocalOpen, setGetLocalOpen] = React.useState(false);\r\n\r\n    let payment = sessionStorage.getItem(Constants.UrlSlugObjectPayments);\r\n    let pathToPayment = '';\r\n\r\n    if(payment) {\r\n        payment = JSON.parse(payment);\r\n        pathToPayment = '/'+payment.year+'/'+payment.carline+'/'+payment.trim+'/'+payment.model+'/'+payment.packageCode+'/payments?prov_code='+getProvince();\r\n    } else {\r\n        pathToPayment = '/'+year+'/'+carline+'/'+trim+'/'+model+'/'+packageCode+'/payments?prov_code='+getProvince();\r\n    }\r\n\r\n    const navigate = useNavigate();\r\n    const [summaryCalculator = new SummaryCalculator().reloadStoredData(), setSummaryCalculator] = React.useState();\r\n    const [feesChecked, setFeesChecked] = React.useState(summaryCalculator.IncludeFees);\r\n    const [taxesChecked, setTaxesChecked] = React.useState(summaryCalculator.IncludeTaxes);\r\n    const [rebatesChecked, setRebatesChecked] = React.useState(summaryCalculator.IncludeRebates);\r\n    const [dataDisplayed, setDataDisplayed] = React.useState(false);\r\n    const [selectedBox, setSelectedBox] = React.useState(null);\r\n\r\n    const [financeTermIndex, setFinanceTermIndex] = React.useState(0);\r\n    const [leaseTermIndex, setLeaseTermIndex] = React.useState(0);\r\n\r\n    const financeTerm = summaryCalculator.FinanceTerm ? summaryCalculator.FinanceTerm  : summaryCalculator.FinancialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].term;\r\n    const leaseTerm = summaryCalculator.LeaseTerm ? summaryCalculator.LeaseTerm: summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].term;\r\n    const currentIncentives = summaryCalculator.FinancialInfo.incentive_programs.find(element => element.type === \"incentive\");\r\n\r\n    const inclusionCheck = async (event) => {\r\n        if(event.target.id === 'fees') {\r\n            summaryCalculator.IncludeFees = !summaryCalculator.IncludeFees;\r\n            await summaryCalculator.RecalculateFinancialInfo();\r\n            setFeesChecked(!feesChecked);\r\n\r\n            gtmHelper.setGTM({'action':'Checkbox', 'type': 'Include fees', 'value': feesChecked}, true , false);\r\n        }\r\n        if(event.target.id === 'taxes') {\r\n            summaryCalculator.IncludeTaxes = !summaryCalculator.IncludeTaxes;\r\n            await summaryCalculator.RecalculateFinancialInfo();\r\n            setTaxesChecked(!taxesChecked)\r\n\r\n            gtmHelper.setGTM({'action':'Checkbox', 'type': 'Include taxes', 'value': taxesChecked}, true , false);\r\n        }\r\n        if(event.target.id === 'rebates') {\r\n            summaryCalculator.IncludeRebates = !summaryCalculator.IncludeRebates;\r\n            await summaryCalculator.RecalculateFinancialInfo();\r\n            setRebatesChecked(!rebatesChecked);\r\n            \r\n            gtmHelper.setGTM({'action':'Checkbox', 'type': 'Include rebate', 'value': rebatesChecked}, true , false);\r\n        }\r\n    }\r\n\r\n    const Obj = JSON.parse(sessionStorage.getItem(Constants.FinancialObj));\r\n\r\n    const handleEditFinanceLinkClick = (e) => {\r\n        e.preventDefault();\r\n\r\n        navigate(pathToPayment);\r\n    }\r\n\r\n    const handleEditLeaseLinkClick = (e) => {\r\n        e.preventDefault();\r\n\r\n        navigate(pathToPayment);\r\n    }\r\n\r\n    function getOptionList() {\r\n        let optionList = '';\r\n        \r\n        const options = summaryCalculator.FinancialInfo ?.calculatedFinance ?.options;\r\n\r\n        if(options.exteriorColour.price >0){\r\n            optionList += ` <li >\r\n                <p>${t('payments:exterior')} <span>${options.exteriorColour.description}</span></p>\r\n                <span>${formatPrice(options.exteriorColour.price, true)}</span>\r\n            </li>`\r\n        }\r\n        if(options ?.interiorColour.price >0){\r\n            optionList += ` <li>\r\n                <p>${t('payments:interior')} <span>${options.interiorColour.description}</span></p>\r\n                <span>${formatPrice(options.interiorColour.price, true)}</span>\r\n            </li>`\r\n        }\r\n        if(options ?.model_option_package ?.financial ?.msrp >0){\r\n            optionList += ` <li>\r\n                <p>${t('payments:package')} <span>${options.model_option_package.name}</span></p>\r\n                <span>${formatPrice(options.model_option_package.financial.msrp, true)}</span>\r\n            </li>`\r\n        }\r\n\r\n        /*const selectedWarrantyPackage = JSON.parse(sessionStorage.getItem('selectedWarrantyPackage'));\r\n        if(selectedWarrantyPackage != null && selectedWarrantyPackage.name != undefined ){\r\n            const warrantyPrice = (JSON.parse(sessionStorage.getItem('selectedWarrantyPackage')).financial.msrp);\r\n            optionList += ` <li>\r\n                <p>${t(\"payments:warranties\")} <span>${selectedWarrantyPackage.name}</span></p>\r\n                <span>${formatPrice(warrantyPrice, true)}</span>\r\n            </li>`\r\n        }   \r\n        \r\n        const selectedConnectedVehiclePackage = JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage'));\r\n        if(selectedConnectedVehiclePackage != null && selectedConnectedVehiclePackage.title != undefined){\r\n            const connectedPrice = (JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage')).financial.msrp);\r\n            optionList += ` <li>\r\n                <p>${t(\"payments:connected\")} <span style=\"text-transform:lowercase\">${selectedConnectedVehiclePackage.title}</span></p>\r\n                <span>${formatPrice(connectedPrice, true)}</span>\r\n            </li>`\r\n        }\r\n\r\n        const selectedAddedProtectionPackage = summaryCalculator.SelectedAddedProtectionPackage;\r\n        if(selectedAddedProtectionPackage && selectedAddedProtectionPackage.name){\r\n            const selectedAddedProtectionPackagePrice = selectedAddedProtectionPackage.financial.msrp;\r\n            optionList += ` <li>\r\n                <p class=\"desc\">${t(\"payments:added_protection\")} <span style=\"text-transform:lowercase\"> ${selectedAddedProtectionPackage.name}</span></p>\r\n                <span class=\"price\">${formatPrice(selectedAddedProtectionPackagePrice, true)}</span>\r\n            </li>`\r\n        }        \r\n\r\n        const appearanceProtectionPlan = summaryCalculator.SelectedAppearanceProtectionPlan;\r\n        const selectedAppearanceProtectionPlansPackage = summaryCalculator.SelectedAppearanceProtectionPlansPackage; JSON.parse(sessionStorage.getItem('selectedAppearanceProtectionPlansPackage'));\r\n        if(appearanceProtectionPlan.name && selectedAppearanceProtectionPlansPackage.name){\r\n            const selectedAppearanceProtectionPlansPackagePrice = selectedAppearanceProtectionPlansPackage.financial.msrp;\r\n            optionList += ` <li>\r\n                <p class=\"desc\">${t(\"payments:appearance_protection\")} <span style=\"text-transform:lowercase\">${appearanceProtectionPlan.name} ${selectedAppearanceProtectionPlansPackage.name}</span></p>\r\n                <span class=\"price\">${formatPrice(selectedAppearanceProtectionPlansPackagePrice, true)}</span>\r\n            </li>`\r\n        }\r\n\r\n\r\n        if(options.wheels.price >0){\r\n            optionList += ` <li>\r\n                <p><span>${options.wheels.title}</span></p>\r\n                <span>${formatPrice(options.wheels.price, true)}</span>\r\n            </li>`\r\n        }*/\r\n\r\n        return optionList;\r\n    }\r\n        \r\n    function getMazdaPriceDetails() {\r\n        // TODO : CHECK IF WEED ANYTHING - TO WILL FROM VIET\r\n        //<li><p>${t(\"payments:accessories\")}${t(\"payments:accLegal\")}</p><span>${formatPrice(summaryCalculator.FinancialInfo.calculatedCash.accessories.total, true)}</span></li>\r\n        return `<ul>\r\n                    <li><p>${getMazdaFeesAndLeviesDetailTitle(\"Administration Fee\", t)}<sup>9</sup></p><span>${formatPrice(summaryCalculator.FinancialInfo.adminServiceFees, true)}</span></li>\r\n                    <li><p>${t(\"payments:msrp\")}</p><span>${formatPrice(summaryCalculator.SelectedModel.financial.msrp, true)}</span></li>\r\n                    ${getOptionList()}\r\n                    <li><p>${t(\"payments:freight\")}</p><span>${formatPrice(summaryCalculator.FinancialInfo.freight, true)}</span></li>\r\n                    <li><p>${t(\"general:pde\")}</p><span>${formatPrice(summaryCalculator.FinancialInfo.pde, true)}</span></li>\r\n                </ul>`;\r\n    }\r\n\r\n    function getWheelsDetails() {\r\n        const options = summaryCalculator.FinancialInfo ?.calculatedFinance ?.options;\r\n\r\n        return `<ul>\r\n                    <li><p>${`4x ${options.wheels.title}`}</p><span>${formatPrice(options.wheels.base_msrp, true)}</span></li>\r\n                    <li><p>${`4x ${t(\"payments:tpms\")}`}</p><span>${formatPrice(options.wheels.tpms, true)}</span></li>\r\n                    <li><p>${t(\"payments:installation\")}</p><span>${formatPrice(options.wheels.install_cost, true)}</span></li>\r\n                </ul>`;\r\n    }\r\n\r\n    function getConnectivityDetails() {\r\n        const selectedConnectedVehiclePackage = JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage'));\r\n        if(selectedConnectedVehiclePackage != null && selectedConnectedVehiclePackage.title != undefined){\r\n            const connectedPrice = (JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage')).financial.msrp);\r\n\r\n            return `<ul>\r\n                        <li><p>${`${selectedConnectedVehiclePackage.title}`}</p><span>${formatPrice(connectedPrice, true)}</span></li>\r\n                    </ul>`;\r\n        }\r\n\r\n        return '';\r\n    }\r\n    \r\n    function getAccessoriesDetails() {\r\n        let accessories = sessionStorage.getItem(Constants.SelectedAccessories);\r\n        accessories = JSON.parse(accessories);        \r\n    \r\n        let list = \"<ul>\";\r\n        //console.log(accessories);\r\n        accessories.map((accessory, index) => {\r\n            list += `<li class=\"financial_accessories\"><p>${accessory.name}</p><span>${formatPrice(accessory.base_msrp, true)}</span></li>`\r\n            list += `<li class=\"financial_accessories\"><p>${accessory.name} - Installation</p><span>${formatPrice(accessory.install_cost, true)}</span></li>`\r\n        });\r\n        list += \"</ul>\"\r\n        return list;\r\n    }\r\n\r\n    function getProtectionDetails() {\r\n        let list = \"<ul>\";        \r\n\r\n        if(summaryCalculator.SelectedAddedProtectionPackage.name != undefined ){\r\n            list += `<li><p>${t(\"payments:added_protection\")} <span>${summaryCalculator.SelectedAddedProtectionPackage.name}</span></p><span>${formatPrice(summaryCalculator.SelectedAddedProtectionPackage.financial.msrp, true)}</span></li>`\r\n        }\r\n        if(summaryCalculator.SelectedAppearanceProtectionPlan.name != undefined && summaryCalculator.SelectedAppearanceProtectionPlansIndex !== null) {\r\n\r\n            list += `<li><p>${t(\"payments:appearance_protection\")} <span>${summaryCalculator.SelectedAppearanceProtectionPlansPackage.name} for ${summaryCalculator.SelectedAppearanceProtectionPlan.name}</span></p><span>${formatPrice(summaryCalculator.SelectedAppearanceProtectionPlansPackage.financial.msrp, true)}</span></li>`\r\n        }     \r\n\r\n        list += \"</ul>\"\r\n        return list;\r\n    }\r\n\r\n    function getMazdaFeesAndLeviesDetails() {\r\n        const feesAndLeviesToDisplay = summaryCalculator.FinancialInfo.calculatedCash.feesAndLevies.detail.filter(item => item.title !== 'PDE');\r\n\r\n        return `<ul>\r\n                    ${feesAndLeviesToDisplay.map((fee, index) => `<li key=\"${index}\">\r\n                        <p>${getMazdaFeesAndLeviesDetailTitle(fee.title, t)}${fee.sup ? `<sup>${fee.sup}</sup>` : ''}</p><span>${formatPrice(fee.price, true)}</span>\r\n                        </li>`).join(\"\")}\r\n                </ul>`;\r\n    }\r\n\r\n    function getMazdaFeesAndLeviesPricingWithoutPDE() {\r\n        const total = summaryCalculator.FinancialInfo.calculatedCash.feesAndLevies.detail.filter(item => item.title !== 'PDE').reduce((total, fee) => total + fee.price, 0);\r\n        return total;\r\n    }\r\n\r\n    function getMazdaPrice() {\r\n        return summaryCalculator.FinancialInfo.calculatedCash.mazdaPrice;\r\n    }\r\n\r\n    function getWheelsPrice() {\r\n        const options = summaryCalculator.FinancialInfo ?.calculatedCash ?.options;\r\n\r\n        return options.wheels.price;\r\n    }\r\n\r\n    function getConnectivityPrice() {\r\n        const connectedPrice = (JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage')).financial.msrp);\r\n\r\n        return connectedPrice;\r\n    }\r\n\r\n    function getAccessoriesPrice() {\r\n        const accessories = summaryCalculator.FinancialInfo ?.calculatedCash ?.accessories;\r\n\r\n        return accessories.total;\r\n    }\r\n    \r\n    function getProtectionPrice() {\r\n        const protectionPrice = summaryCalculator.SelectedAddedProtectionPackage.financial.msrp + summaryCalculator.SelectedAppearanceProtectionPlansPackage.financial.msrp;\r\n            \r\n        return protectionPrice;\r\n    }   \r\n\r\n\tfunction getRebatesDetails() {\r\n        return `<ul>\r\n                    ${summaryCalculator.FinancialInfo.calculatedCash.evRebates.details.map((rebate, index) => `<li key=\"${index}\">\r\n                        \t<p class=\"text--green\">${rebate.title==='federal'? t('payments:fed_rebate'):t('payments:prov_rebate') + ' ('+getProvince()+')'}</p><span class=\"text--green\">-${formatPrice(rebate.cash, true)}</span>\r\n                        </li>`).join(\"\")}\r\n                </ul>`;\r\n    }\r\n\r\n    function getCreditsDetails() {\r\n        const currentIncentives = summaryCalculator.FinancialInfo.incentive_programs.find(element => element.type === \"incentive\");\r\n        return `<ul class=\"negative\">\r\n                    ${Obj.calculatedCash.incentives.taxable.details.map((incentive, index) => {\r\n                        const price = incentive.cash_value ? incentive.cash_value : incentive.value;\r\n                            return `<li key=\"${index}\">\r\n                                    <p>${getIncentiveDisplayName(incentive)}</p><span>-${formatPrice(price, true)}</span>\r\n                                </li>`;\r\n                        }).join(\"\")}\r\n                    ${Obj.calculatedCash.incentives.nonTaxable.details.map((incentive, index) => {\r\n                        const price = incentive.cash_value ? incentive.cash_value : incentive.value;\r\n                            return `<li key=\"${index}\">\r\n                                    <p>${getIncentiveDisplayName(incentive)}</p><span>-${formatPrice(price, true)}</span>\r\n                                </li>`;\r\n                        }).join(\"\")}\r\n                    ${currentIncentives && currentIncentives.value > 0 ? `<li>\r\n                        <p>${t(\"payments:current_incentives\")}</p>\r\n                        <span>${currentIncentives?'-':''}${formatPrice(currentIncentives.value, true)}</span>\r\n                    </li>`:''}\r\n                    ${(summaryCalculator.FinancialInfo.mazdaCashIncentive > 0) ? `<li>\r\n                    <p>${t(\"payments:mazda_cash_incentive\")}</p>\r\n                    <span style=\"white-space: nowrap;\">${summaryCalculator.FinancialInfo.mazdaCashIncentive?'-':''}${formatPrice(summaryCalculator.FinancialInfo.mazdaCashIncentive, true)}</span>\r\n                    </li>`:''}\r\n                    <li>\r\n                        <p>${t(\"payments:trade_in\")}<sup>1</sup></p><span>${Obj.tradeInValue>0?'-':''}${formatPrice(Obj.tradeInValue, true)}</span>\r\n                    </li>\r\n                </ul>`;\r\n    }\r\n\r\n    function getIncentiveDisplayName(incentive) {\r\n        switch(incentive.type) {\r\n            case \"loyalty\" :\r\n                return t(\"payments:mazda_owner_loyalty_program\");\r\n            case \"military\":\r\n                return t(\"payments:mazda_military_program\");\r\n            case \"grad_award\":\r\n                return t(\"payments:mazda_graduate_program_award\");\r\n            case \"first_time_owner\":\r\n                return t(\"payments:mazda_first_time_owner\");\r\n            default:\r\n                return incentive.type;\r\n        }\r\n    }\r\n\r\n    function getAnnualMileageText() {\r\n        let mileage = '';\r\n        switch (parseInt(summaryCalculator.AnnualMileage)) {\r\n            case 2:\r\n                mileage = 20000;\r\n                break;\r\n            case 3:\r\n                mileage = 16000;\r\n                break;\r\n            case 0:\r\n                mileage = 24000;\r\n                break;\r\n            default:\r\n                break;\r\n        }\r\n\r\n        return `${convertKM(mileage)}/${t('year')}`;\r\n    }\r\n\r\n\r\n    async function handleReserveYoursClick(PurchaseMethod) {\r\n        const isRetailerMode = await summaryCalculator.isRetailerMode();\r\n        summaryCalculator.CurrentPurchaseMethod = PurchaseMethod;\r\n        if (isRetailerMode) {\r\n                setReserveModalOpen(true);\r\n        } else {\r\n            openGetLocal();\r\n        }\r\n    }\r\n\r\n    function handlePreOrderClick() {\r\n        document.querySelector('body').classList.add('disabled');\r\n        setPreorderModalOpen(true);\r\n    }\r\n\r\n\r\n    function openGetLocal(){\r\n        const lang = getLang();\r\n        gtmHelper.setGTM({'action':'Open Modal','modal': 'Contact Dealer'}, true, false);\r\n\r\n        const targetModal = document.getElementById('mz-react-send-build-to-dealer-modal');\r\n        if (targetModal && summaryCalculator) {\r\n            if (summaryCalculator.SelectedColourExteriorIndex !== 'null' && summaryCalculator.Colours !== null) {\r\n                const heading = targetModal.querySelector('.mz-send-build-to-dealer__vehicle-name');\r\n                if (heading) {\r\n                    heading.textContent = lang === 'en' ? summaryCalculator._selectedModelYear.year.title + ' ' + ReactHtmlParser(summaryCalculator._selectedModelYear.carline.title) : ReactHtmlParser(summaryCalculator._selectedModelYear.carline.title) + ' ' + summaryCalculator._selectedModelYear.year.title;\r\n                }\r\n            }\r\n            openModal('mz-react-send-build-to-dealer-modal');\r\n        }\r\n    }\r\n\r\n    function financeClick(financeType){\r\n        document.querySelector('body').classList.add('disabled');\r\n\t\tsetOcaModalOpen(true);\r\n        setFinanceType(financeType);\r\n\r\n        const price = financeType === 'loan' ? summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceWithFeesWithRebatesTaxed : summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithFeesWithRebatesTaxed;\r\n        gtmHelper.setGTM({'action':`OCA - ${financeType === 'loan' ? 'Finance': 'Lease'} Summary`,'year': year,'model': ReactHtmlParser(carline), 'trim': trim, 'price' : Math.round(price)}, true, false);\r\n    }\r\n\r\n    function getLoanInformationalApr() {\r\n        return summaryCalculator.getResponsesHasError() ? '-' : convertNum(summaryCalculator.getLoanInformationalAprRate(),2) + '%'\r\n    }\r\n\r\n    function getLeaseInformationalApr() {\r\n        return summaryCalculator.getResponsesHasError() ? '-' : convertNum(summaryCalculator.getLeaseInformationalAprRate(),2) + '%'\r\n    }\r\n\r\n    function hasLoanRatePercentageDiscount(financeElement) {\r\n        return (Number.parseFloat(financeElement.aprRate) !== Number.parseFloat(financeElement.aprRateDiscounted));\r\n    }\r\n\r\n    function getLoanRate() {\r\n        const financeElement = summaryCalculator.FinancialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex];\r\n\r\n        if (summaryCalculator.getResponsesHasError() === true)\r\n            return '-';    \r\n        else {\r\n            if (hasLoanRatePercentageDiscount(financeElement))\r\n                return convertNum(financeElement.aprRateDiscounted,2) + '%'\r\n            else\r\n                return convertNum(financeElement.aprRate,2) + '%'\r\n        }         \r\n    }\r\n\r\n    function hasLeaseRatePercentageDiscount(leaseElement) {\r\n        return (Number.parseFloat(leaseElement.leaseRate) !== Number.parseFloat(leaseElement.leaseRateDiscounted));\r\n    }\r\n        \r\n    function getLeaseRate() {\r\n        //return summaryCalculator.getResponsesHasError() ? '-' : convertNum(summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].leaseRate,2) + '%';\r\n        const leaseElement = summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex];\r\n\r\n        if (summaryCalculator.getResponsesHasError() === true)\r\n            return '-';        \r\n        else {\r\n            if (hasLeaseRatePercentageDiscount(leaseElement))\r\n                return convertNum(leaseElement.leaseRateDiscounted,2) + '%'\r\n            else\r\n                return convertNum(leaseElement.leaseRate,2) + '%'\r\n        }        \r\n    }\r\n\r\n    function getLoanWeekly() {\r\n        const financeElement = summaryCalculator.FinancialInfo.calculatedFinance.financeValues[financeTermIndex];\r\n\r\n        return summaryCalculator.getResponsesHasError() ? '-' : formatPrice(financeElement[summaryCalculator.IncludeTaxes ? 'weeklyWithTaxes' : 'weekly']);\r\n    }\r\n\r\n    function getLoanBiWeekly() {\r\n        const financeElement = summaryCalculator.FinancialInfo.calculatedFinance.financeValues[financeTermIndex];\r\n        \r\n        return summaryCalculator.getResponsesHasError() ? '-' : formatPrice(financeElement[summaryCalculator.IncludeTaxes ? 'biWeeklyWithTaxes' : 'biWeekly']);\r\n    }\r\n\r\n    function getLoanMonthly() {\r\n        const financeElement = summaryCalculator.FinancialInfo.calculatedFinance.financeValues[financeTermIndex];\r\n\r\n        return summaryCalculator.getResponsesHasError() ? '-' : formatPrice(financeElement[summaryCalculator.IncludeTaxes ? 'monthlyWithTaxes' : 'monthly']);\r\n    }\r\n\r\n    function getLeaseWeekly() {\r\n        const leaseElement = summaryCalculator.FinancialInfo.calculatedLease.leaseValues[leaseTermIndex];\r\n\r\n        return summaryCalculator.getResponsesHasError() ? '-': formatPrice(leaseElement[summaryCalculator.IncludeTaxes ? 'weeklyWithTaxes' : 'weekly']);\r\n    }\r\n\r\n    function getLeaseBiWeekly() {\r\n        const leaseElement = summaryCalculator.FinancialInfo.calculatedLease.leaseValues[leaseTermIndex];\r\n        \r\n        return summaryCalculator.getResponsesHasError() ? '-' : formatPrice(leaseElement[summaryCalculator.IncludeTaxes ? 'biWeeklyWithTaxes' : 'biWeekly']);\r\n    }\r\n\r\n    function getLeaseMonthly() {\r\n        const leaseElement = summaryCalculator.FinancialInfo.calculatedLease.leaseValues[leaseTermIndex];\r\n\r\n        return summaryCalculator.getResponsesHasError() ? '-' : formatPrice(leaseElement[summaryCalculator.IncludeTaxes ? 'monthlyWithTaxes' : 'monthly']);\r\n    }\r\n    \r\n    React.useEffect(() => {\r\n        setSelectedBox(null);\r\n        if(feesChecked) {\r\n            setSelectedBox('feesCheck');\r\n        }\r\n        if(taxesChecked) {\r\n            setSelectedBox('taxesCheck');\r\n        }\r\n        if(rebatesChecked) {\r\n            setSelectedBox('rebatesCheck');\r\n        }\r\n        if(feesChecked && taxesChecked) {\r\n            setSelectedBox('feestaxes');\r\n        }\r\n        if(feesChecked && rebatesChecked) {\r\n            setSelectedBox('feesrebates');\r\n        }\r\n        if(taxesChecked && rebatesChecked) {\r\n            setSelectedBox('taxesrebates');\r\n        }\r\n        if(feesChecked && taxesChecked && rebatesChecked) {\r\n            setSelectedBox('allCheck');\r\n        }\r\n        \r\n        async function executeTask() {\r\n            await summaryCalculator.RecalculateFinancialInfo();\r\n            setFinanceTermIndex(summaryCalculator.FinancialInfo.calculatedFinance.financeValues.findIndex(x => x.term === financeTerm));\r\n            setLeaseTermIndex(summaryCalculator.FinancialInfo.calculatedLease.leaseValues.findIndex(x => x.term === leaseTerm));\r\n\r\n            document.addEventListener('click',handleContactDealerLinkClick);\r\n        }\r\n        window.addEventListener(\"message\", function (e) { \r\n            if (e.data.type === \"formEvent\") {\r\n               if(e.data.origin==='form'){\r\n    \r\n                    // If the message 'generic' is passed, return & fire generic callback\r\n                    if (e.data.message === \"open\") {\r\n                        setReserveModalOpen(true);\r\n                    }\r\n               }else if(e.data.origin === 'getLocalPrice'){\r\n                    if (e.data.message === \"open\") {\r\n                        openGetLocal();\r\n                    }\r\n               }else if(e.data.origin === 'preOrder'){\r\n                    sessionStorage.setItem('preorder',  e.data.message.dealer_code);\r\n                    handlePreOrderClick();\r\n               }\r\n\r\n            }\r\n        });\r\n        \r\n        executeTask();        \r\n    }, [feesChecked, taxesChecked, dataDisplayed, selectedBox, rebatesChecked])\r\n\r\n\r\n     /* START HORRIBLE HACK */\r\n    /* TODO : MOVE TRANSLATION TEXT IN RESOURCE FILE AND MAKE A GENERIC FUNCTION FOR THE SPECIALITY \"WORD\" */\r\n    function isEnglish() {\r\n        return getLang() === 'en';\r\n    }\r\n    \r\n    function getDisplayableProvinceName() {\r\n        const provinceCode = getProvince().toLowerCase();\r\n        const provinceNames = {\r\n            'on': { en: 'Ontario', fr: 'en Ontario' },\r\n            'qc': { en: 'Quebec', fr: 'au Québec' },\r\n            'ab': { en: 'Alberta', fr: 'en Alberta' },\r\n            'bc': { en: 'British Columbia', fr: 'au Colombie Britanique' },\r\n            'mb': { en: 'Manitoba', fr: 'au Manitoba' },\r\n            'nb': { en: 'New Brunswick', fr: 'au Nouveau-Brunswick' },\r\n            'nl': { en: 'Newfoundland', fr: 'à Terre-Neuve-et-Labrador' },\r\n            'nt': { en: 'North-West Territories', fr: 'à Territoires du nord-ouest' },\r\n            'ns': { en: 'Nova Scotia', fr: 'en Nouvelle-Écosse' },\r\n            'nu': { en: 'Nunavut', fr: 'au Nanavut' },\r\n            'pe': { en: 'Prince Edward Island', fr: \"à l'Île-du-Prince-Édouard\" },\r\n            'sk': { en: 'Saskatchewan', fr: 'en Saskatchewan' },\r\n            'yt': { en: 'Yukon', fr: 'au Yukon' },\r\n        };\r\n    \r\n        const provinceName = provinceNames[provinceCode];\r\n        return provinceName ? provinceName[isEnglish() ? 'en' : 'fr'] : '';\r\n    }\r\n    \r\n    function getAccessoriesTooltipText() {\r\n        const provinceName = getDisplayableProvinceName();\r\n    \r\n        const text = isEnglish()\r\n            ? `Labour for installation is calculated using average labour rates in ${provinceName}.`\r\n            : `Le coût de la main-d'œuvre pour l'installation est calculé en fonction du tarif horaire moyen ${provinceName}.`;\r\n    \r\n        return text;\r\n    }\r\n\r\n    function getTooltipText() {\r\n        const lang = getLang();\r\n        \r\n        return lang === 'en' ? `Labour for installation is calculated using average labour rates in ${getDisplayableProvinceName()}.` : `Le coût de la main-d'œuvre pour l'installation est calculé en fonction du tarif horaire moyen ${getDisplayableProvinceName()}.`;\r\n    }\r\n     /* END HORRIBLE HACK */\r\n\r\n    function getLoanDisplayedRate() {\r\n        const financeElement = summaryCalculator.FinancialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex];\r\n        if (Number.parseFloat(financeElement.aprRate) !== Number.parseFloat(financeElement.aprRateDiscounted))\r\n            return convertNum(financeElement.aprRateDiscounted,2);\r\n        else\r\n            return convertNum(financeElement.aprRate,2);\r\n    }\r\n\r\n    function getLeaseDisplayedRate() {\r\n        // `${convertNum(summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].leaseRate,2)}`\r\n        const leaseElement = summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex];\r\n        if (Number.parseFloat(leaseElement.leaseRate) !== Number.parseFloat(leaseElement.leaseRateDiscounted))\r\n            return convertNum(leaseElement.leaseRateDiscounted,2);\r\n        else\r\n            return convertNum(leaseElement.leaseRate,2);\r\n    }\r\n\r\n    function getQCEVDisclaimerSection(){\r\n        if(summaryCalculator.IncludeRebates && getProvince() === 'QC' && summaryCalculator.FinancialInfo?.ev_rebates?.length){\r\n             return (\r\n                 <>  \r\n                     <div class=\"mz-QC-EV-disclaimer text--grey\">\r\n                         {ReactHtmlParser(t(\"general:QCEVDisclaimer\"))}\r\n                         \r\n                     </div>\r\n                     \r\n                 </>\r\n             )\r\n        }\r\n     }\r\n     function handleContactDealerLinkClick(e){\r\n        if(e.target.id === 'QCEVD_link' && document.getElementById('contactDealer')){\r\n            e.preventDefault();\r\n            console.log(document.getElementById('contactDealer'))\r\n            document.getElementById('contactDealer').scrollIntoView();\r\n        }\r\n     }\r\n\r\n\r\n    return (\r\n        <>\r\n        \r\n        <div className=\"mz-container mz-financial--container\">\r\n            <div className=\"mz-financial--actions mz-financial--actions-alt\">\r\n                <div className=\"actions__wrapper\">\r\n\t\t\t\t\t{summaryCalculator.FinancialInfo.calculatedCash.evRebates.details.length > 0 && summaryCalculator.FinancialInfo.calculatedCash.evRebates.details[0].cash && <div className=\"actions__item\">\r\n\t\t\t\t\t\t<input type=\"checkbox\" value=\"\"  onClick={inclusionCheck} defaultChecked={rebatesChecked} id=\"rebates\" />\r\n\t\t\t\t\t\t<label htmlFor=\"rebates\"> {t(\"payments:checkbox_include_government_rebates\")}</label>\r\n\t\t\t\t\t</div>}\r\n                    <div className=\"actions__item\">\r\n                        <div className=\"mz-form-item mz-form-item--checkbox \">\r\n                            <label className=\"mz-form-item__inner\" htmlFor=\"fees\">\r\n                                {t(\"payments:checkbox_include_fees_and_levies\")}\r\n                                <input type=\"checkbox\" className=\"mz-form-item__checkbox\" id=\"fees\" name=\"fees\"  onClick={inclusionCheck} defaultChecked={feesChecked} value=\"\" />\r\n                                {/* <div className=\"mz-form-item__checkmark\">\r\n                                    <div className=\"mz-svg-wrapper\">\r\n                                        <i className=\"mz-svg mz-svg--black undefined mz-svg-checkmark\"></i>\r\n                                    </div>\r\n                                </div> */}\r\n                            </label>\r\n                        </div>\r\n                    </div>\r\n\r\n                    <div className=\"actions__item\">\r\n                        <div className=\"mz-form-item mz-form-item--checkbox \">\r\n                            <label className=\"mz-form-item__inner\" htmlFor=\"taxes\">\r\n                                {t(\"payments:checkbox_include_taxes_in_prices\")}\r\n                                <input type=\"checkbox\" className=\"mz-form-item__checkbox\" id=\"taxes\" name=\"taxes\" onClick={inclusionCheck} defaultChecked={taxesChecked} value=\"\"/>\r\n                                {/* <div className=\"mz-form-item__checkmark\">\r\n                                    <div className=\"mz-svg-wrapper\">\r\n                                        <i className=\"mz-svg mz-svg--black undefined mz-svg-checkmark\"></i>\r\n                                    </div>\r\n                                </div> */}\r\n                            </label>\r\n                        </div>\r\n                    </div>\r\n\r\n                </div>\r\n            </div>\r\n            <div className=\"mz-financial--left\">\r\n                <div className=\"mz-financial--finance\">\r\n                    <h6>{t(\"general:finance\")}</h6>\r\n                    <p className='mz-financial--finance-terms'>\r\n                        {!summaryCalculator.getResponsesHasError() ?\r\n                        <>\r\n                        <span>{financeTerm} {t(\"payments:months_lowercase\")}</span> <span>{getLoanRate()}</span>\r\n                        </>\r\n                        :\r\n                        <>\r\n                        <p className=\"text--center\">\r\n                            {ReactHtmlParser(t(\"general:generalErrorMessage\"))}\r\n                        </p>\r\n                        </>}\r\n                    </p>\r\n\r\n                    {!summaryCalculator.getResponsesHasError() ?\r\n                    <>\r\n                    <div className=\"periods\">\r\n                        <div className=\"periods--item weekly\">\r\n                            <p>{t(\"payments:weekly\")}</p>\r\n                            <span>{getLoanWeekly()}</span> \r\n                        </div>\r\n                        <div className=\"periods--item bi-weekly\">\r\n                            <p>{t(\"payments:bi_weekly\")}</p>\r\n                            <span>{getLoanBiWeekly()}</span> \r\n                        </div>\r\n                        <div className=\"periods--item Monthly\">\r\n                            <p>{t(\"payments:monthly\")}</p>\r\n                            <span>{getLoanMonthly()}</span> \r\n                        </div>\r\n                    </div>\r\n                    </> \r\n                    : null\r\n                    }       \r\n                    \r\n                    <p>\r\n                        <a className=\"mz-link\" onClick={handleEditFinanceLinkClick}>{t(\"btn_edit_finance_options\")}</a>\r\n                    </p>\r\n                    <div className=\"mz-financial--cta hidden\">\r\n                        {window.allow_oca ? \r\n                        <Button primary={false} label={ReactHtmlParser(String(t(\"summary:btn_apply_for_financing\")))} iconBefore={false} onClick={()=>financeClick('loan')}/>\r\n                        :\r\n                        summaryCalculator.isSelectionPreOrder() ?\r\n                        <Button primary={true} label={String(t(\"btn_pre_order\"))} iconBefore={false} onClick={handlePreOrderClick}/>\r\n                        :\r\n                        <Button primary={true} label={String(t(\"btn_reserve_yours\"))} iconBefore={false} onClick={()=>{handleReserveYoursClick('Finance')}}/>\r\n                        }\r\n                    </div>\r\n                    {!summaryCalculator.getResponsesHasError() ?\r\n                    <div>\r\n                        <span className='mz-financial--finance-infos'>{getLoanInformationalApr()}&nbsp;{t(\"text_information_apr\")} <Tooltip TooltipName=\"promo_apr\"/></span>\r\n                    </div>:null}\r\n                </div>\r\n                <div className=\"mz-financial--lease\">\r\n                    <h6>{t(\"payments:lease\")}</h6>\r\n                    <p className='mz-financial--finance-terms'>\r\n                        {!summaryCalculator.getResponsesHasError() ?\r\n                        <>\r\n                        <span>{leaseTerm} {t(\"payments:months_lowercase\")}</span> <span>{getLeaseRate()}</span><br/><span>{getAnnualMileageText()}</span>\r\n                        </>\r\n                        :\r\n                        <>\r\n                        <p className=\"text--center\">\r\n                            {ReactHtmlParser(t(\"general:generalErrorMessage\"))}\r\n                        </p>\r\n                        </>}\r\n                    </p>\r\n                    {!summaryCalculator.getResponsesHasError() ?\r\n                    <>\r\n                    <div className=\"periods\">\r\n                        <div className=\"periods--item weekly\">\r\n                            <p>{t(\"payments:weekly\")}</p>\r\n                            <span>{getLeaseWeekly()}</span> \r\n                        </div>\r\n                        <div className=\"periods--item bi-weekly\">\r\n                            <p>{t(\"payments:bi_weekly\")}</p>\r\n                            <span>{getLeaseBiWeekly()}</span> \r\n                        </div>\r\n                        <div className=\"periods--item Monthly\">\r\n                            <p>{t(\"payments:monthly\")}</p>\r\n                            <span>{getLeaseMonthly()}</span> \r\n                        </div>\r\n                    </div>\r\n                    </> \r\n                    :\r\n                    null}       \r\n                                        \r\n\r\n                    <p><a className=\"mz-link\" onClick={handleEditLeaseLinkClick}>{t(\"btn_edit_lease_options\")}</a></p>\r\n                    <div className=\"mz-financial--cta hidden\">\r\n                        {window.allow_oca ? \r\n                        <Button primary={false} label={ReactHtmlParser(String(t(\"summary:btn_apply_for_financing\")))} iconBefore={false} onClick={()=>financeClick('lease')}/>\r\n                        :\r\n                        summaryCalculator.isSelectionPreOrder() ?\r\n                        <Button primary={true} label={String(t(\"btn_pre_order\"))} iconBefore={false} onClick={handlePreOrderClick}/>\r\n                        :                        \r\n                        <Button primary={true} label={String(t(\"btn_reserve_yours\"))} iconBefore={false} onClick={()=>{handleReserveYoursClick('Lease')}}/>}\r\n                    </div>\r\n                    {!summaryCalculator.getResponsesHasError() ?\r\n\t\t\t\t\t<div>\r\n                        <span className='mz-financial--finance-infos'>{getLeaseInformationalApr()}&nbsp;{t(\"text_information_apr\")} <Tooltip TooltipName=\"promo_apr\"/></span>\r\n                    </div>:null}\r\n                </div>\r\n            </div>\r\n            <div className=\"mz-financial--right\">\r\n                <h6>{t(\"payments:cash_purchase_price\")}</h6>\r\n                <div>{t(\"purchase_price\")}  <Tooltip TooltipName=\"purchase_price\" /></div>\r\n                {selectedBox === 'feesCheck' && <span className='mz-detailed-price__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalWithFees, true)}</span>}\r\n                {selectedBox === 'taxesCheck' &&<span className='mz-detailed-price__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalTaxed, true)}</span>}\r\n                {selectedBox === 'rebatesCheck' && <span className='mz-detailed-price__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalWithIncentiveRebatesAndEvRebates, true)}</span>}\r\n                {selectedBox === 'feestaxes' && <span className='mz-detailed-price__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalWithFeesTaxed, true)}</span>}\r\n                {selectedBox === 'feesrebates' && <span className='mz-detailed-price__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalWithFeesWithRebatesAndEvRebates, true)}</span>}\r\n                {selectedBox === 'taxesrebates' && <span className='mz-detailed-price__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalWithIncentiveRebatesAndEvRebatesTaxed, true)}</span>}\r\n                {selectedBox === 'allCheck' && <span className='mz-detailed-price__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalWithFeesWithRebatesTaxed, true)}</span>}\r\n                {selectedBox === null && <span className='mz-detailed-price__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotal, true)}</span>}\r\n                <div className=\"mz-financial--details\">\r\n\r\n\r\n                    {/* {financialInfo?.calculatedCash ? <CashOptions financialInfo={financialInfo} includeFees={selectedBox} includeTaxes={selectedBox} includeRebates={selectedBox}  /> : null} */}\r\n\r\n                    < CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price\" ColCarText1={`${t('payments:cash_price')}`} ColBoxText={getMazdaPriceDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"detailedprice_mazdaprice\" ColPrices={`${formatPrice(getMazdaPrice(), true)}`} isOpen={openCollapsable === 'mzPrice'} setOpenCollapsable={setOpenCollapsable} id={String(Math.floor(Math.random() * 100000000))}/>\r\n\r\n                    {summaryCalculator.FinancialInfo ?.calculatedFinance ?.options.wheels.title ? \r\n                    < CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price\" ColCarText1={t(\"payments:cash_option_wheels\")} ColBoxText={getWheelsDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"\"  TooltipText={ReactHtmlParser(getTooltipText())} ColPrices={`${formatPrice(getWheelsPrice(), true)}`} id={String(Math.floor(Math.random() * 100000000))} />\r\n                    : null}\r\n\r\n                    {summaryCalculator.SelectedConnectedVehiclePackage.financial.msrp ?\r\n                    < CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price\" ColCarText1={t(\"payments:cash_option_connectivity\")} ColBoxText={getConnectivityDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"\"  ColPrices={`${formatPrice(getConnectivityPrice(), true)}`} id={String(Math.floor(Math.random() * 100000000))} />\r\n                    : null }\r\n\r\n                    {summaryCalculator.FinancialInfo ?.calculatedFinance ?.accessories.total ? \r\n                    < CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price\" ColCarText1={t(\"payments:cash_option_accessories\")} ColBoxText={getAccessoriesDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"\"  TooltipText={getAccessoriesTooltipText()} ColPrices={`${formatPrice(getAccessoriesPrice(), true)}`} id={String(Math.floor(Math.random() * 100000000))} />\r\n                    : null }\r\n\r\n                    {summaryCalculator.SelectedAddedProtectionPackage.name || summaryCalculator.SelectedAppearanceProtectionPlansIndex !== null?  \r\n                    < CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price\" ColCarText1={t(\"payments:cash_option_protection\")} ColBoxText={getProtectionDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"\"  ColPrices={`${formatPrice(getProtectionPrice(), true)}`} id={String(Math.floor(Math.random() * 100000000))} />\r\n                    : null }                \r\n\r\n\r\n                    {feesChecked ?< CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price\" ColCarText1={`${t('payments:cash_fees')}`} ColBoxText={getMazdaFeesAndLeviesDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"detailedprice_feesandlevies\"  ColPrices={`${formatPrice(getMazdaFeesAndLeviesPricingWithoutPDE(), true)}`} isOpen={openCollapsable === 'mzFees'} setOpenCollapsable={setOpenCollapsable} id={String(Math.floor(Math.random() * 100000000))}/>:null}\r\n                    {taxesChecked ? <div className=\"mz-financial__non-collapse\"><p className=\"mz-financial__non-collapse__title\">{t(\"payments:taxes\")} <Tooltip TooltipName=\"detailedprice_taxes\" /></p>\r\n                        {selectedBox === 'feesCheck' && <span className=\"mz-financial__non-collapse__price\">{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalWithFeesTaxes, true)}</span>}\r\n                        {selectedBox === 'taxesCheck' && <span className='mz-financial__non-collapse__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalTaxes, true)}</span>}\r\n                        {selectedBox === 'rebatesCheck' && <span className='mz-financial__non-collapse__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalWithIncentiveRebatesAndEvRebatesTaxes, true)}</span>}\r\n                        {selectedBox === 'feestaxes' && <span className='mz-financial__non-collapse__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalWithFeesTaxes, true)}</span>}\r\n                        {selectedBox === 'feesrebates' && <span className='mz-financial__non-collapse__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalWithFeesWithRebatesTaxes, true)}</span>}\r\n                        {selectedBox === 'taxesrebates' && <span className='mz-financial__non-collapse__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalWithIncentiveRebatesAndEvRebatesTaxes, true)}</span>}\r\n                        {selectedBox === 'allCheck' && <span className='mz-financial__non-collapse__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalWithFeesWithRebatesTaxes, true)}</span>}\r\n                        {selectedBox === null && <span className='mz-financial__non-collapse__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotal, true)}</span>}\r\n                    </div>:null}\r\n\r\n                    < CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price negative\" ColCarText1={`${t('payments:cash_credits')}`} ColBoxText={getCreditsDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"detailedprice_credit\" ColPrices={`${currentIncentives.value + summaryCalculator.FinancialInfo.calculatedCash.incentives.taxable.total + summaryCalculator.FinancialInfo.calculatedCash.incentives.nonTaxable.total + Obj.tradeInValue + summaryCalculator.FinancialInfo.mazdaCashIncentive >0?'-':''}${formatPrice(currentIncentives.value + summaryCalculator.FinancialInfo.calculatedCash.incentives.taxable.total + summaryCalculator.FinancialInfo.calculatedCash.incentives.nonTaxable.total + summaryCalculator.FinancialInfo.tradeInValue + summaryCalculator.FinancialInfo.mazdaCashIncentive, true)}`} isOpen={openCollapsable === 'mzCredits'} setOpenCollapsable={setOpenCollapsable} id={String(Math.floor(Math.random() * 100000000))}/>\r\n                    <div className=\"mz-financial__non-collapse negative\">\r\n                        <div className=\"mz-financial__non-collapse__title\">{t(\"payments:down_payment\")}<sup>1</sup> <Tooltip TooltipName=\"detailedprice_downpayment\" /></div>\r\n                        <span className=\"mz-financial__non-collapse__price\">{formatPrice(Obj.downPaymentValue, true)}</span>\r\n                    </div>\r\n                    {selectedBox === 'rebatesCheck' || selectedBox === 'taxesrebates' || selectedBox === 'allCheck' || selectedBox === 'feesrebates'  && summaryCalculator.FinancialInfo?.ev_rebates?.length ?< CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price evRebates\" ColCarText1={t(\"payments:gov_rebates\")} ColBoxText={getRebatesDetails()} ColClassPrice=\"mz-collapse__price\" ColPrices={`${summaryCalculator.FinancialInfo.calculatedCash.evRebates.total.cash>0?'-':''}${formatPrice(summaryCalculator.FinancialInfo.calculatedCash.evRebates.total.cash, true)}`} isOpen={openCollapsable === 'mzRebates'} setOpenCollapsable={setOpenCollapsable}/>:null}\r\n                </div>\r\n\t\t\t\t<div className=\"mz-financial--cta\">\r\n                    {summaryCalculator.isSelectionPreOrder() ?\r\n                    <Button primary={true} label={String(t(\"btn_pre_order\"))} iconBefore={false} onClick={handlePreOrderClick}/>\r\n                    :                    \r\n\t                <Button primary={true} label={String(t(\"btn_reserve_yours\"))} iconBefore={false} onClick={()=>{handleReserveYoursClick('Cash')}}/>\r\n                    }\r\n\t            </div>\r\n            </div>\r\n            <ReserveModal isOpen={reserveOpen} handleClose={setReserveModalOpen}></ReserveModal> \r\n            <OcaModal isOpen={ocaOpen} financeType={financeType} handleClose={setOcaModalOpen}></OcaModal>                       \r\n        </div>\r\n        <PreOrderModal isOpen={preorderOpen} handleClose={setPreorderModalOpen}></PreOrderModal> \r\n        </>\r\n    );\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { goToTop } from '../../../utils'\r\n\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nexport const SpecsItem = ({ SpecsItemName, SpecsItemModel, SpecsItemEditUrl, useHTML, isPackage, ...props }) => {\r\n    const { t, i18n } = useTranslation(['summary', 'general']);\r\n    const navigate = useNavigate();\r\n    let SpecsItemModelStriped\r\n    if(!useHTML){\r\n        SpecsItemModelStriped = SpecsItemModel.replace(/(<([^>]+)>)/gi, \"\");\r\n    }else{\r\n        SpecsItemModelStriped = SpecsItemModel;\r\n    }\r\n    \r\n    const gtmHelper = new GTMHelper();\r\n\r\n    const handleOnClick = (e) => {\r\n        goToTop();\r\n        navigate(SpecsItemEditUrl);\r\n        gtmHelper.setGTM({'action':'Edit Specs','value': e.target.innerHTML}, true, false);\r\n    }\r\n\r\n    return (\r\n        <div className={isPackage ? useHTML ? \"mz-specs__item spec-packages spec-packages_wide\"  : 'mz-specs__item spec-packages' : \"mz-specs__item\"}>\r\n            <p className=\"mz-specs__category\" onClick={handleOnClick}>\r\n                <a className=\"mz-link\">{ SpecsItemName }</a>\r\n            </p>\r\n            <div className=\"mz-specs__right\">\r\n                <p className=\"mz-specs__name\">{ ReactHtmlParser(SpecsItemModelStriped) }</p>\r\n            </div>\r\n        </div>\r\n    )\r\n};\r\n\r\nSpecsItem.propTypes = {\r\n    SpecsItemName:  PropTypes.string,\r\n    SpecsItemModel: PropTypes.string,\r\n    SpecsItemEditUrl: PropTypes.string,\r\n}\r\n\r\nSpecsItem.defaultProps = {\r\n    SpecsItemName: 'SPECS NAME',\r\n    SpecsItemModel: '',\r\n    SpecsItemEditUrl: '',\r\n}\r\n\r\nexport default SpecsItem;","import React from 'react';\r\nimport { useParams } from 'react-router-dom';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { getApiBaseUrl, getLang, getProvince } from '../../../utils';\r\n\r\nimport { handleRequest } from '../../../stories/helpers/httpRequest';\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\n\r\nimport { SpecsItem } from '../../2_Molecules/SpecsItem/SpecsItem';\r\n\r\nexport const BuildSpecs = ({ componentRef, ...props }) => {\r\n    const { t, i18n } = useTranslation(['summary', 'packages', 'general', 'payments']);\r\n    const { year, carline, trim, model, packageCode } = useParams();\r\n\r\n    const defaultEngineUrl = `${getApiBaseUrl()}/api/EngineModels/${year}/${carline}/${trim}/?prov_code=${getProvince()}&lang_code=${getLang()}`;\r\n    const defaultPackageUrl = `${getApiBaseUrl()}/api/Packages/${model}/${packageCode}/?prov_code=${getProvince()}&lang_code=${getLang()}`;\r\n\r\n\r\n    const [defaultDrivetrain, setDefaultDrivetrain] = React.useState(null);\r\n    const [defaultEngine, setDefaultEngine] = React.useState(null);\r\n    const [defaultPackages, setDefaultPackage] = React.useState(null);\r\n\r\n\r\n    let { selectedTrim, selectedTrimUrl} = '';\r\n    let { selectedModel, selectedModelUrl} = '';\r\n    let { selectedPackage, selectedPackageUrl} = '';\r\n    let { selectedColoursInt, selectedColoursExt, selectedColoursUrl} = '';\r\n    let { selectedWheel, selectedWheelUrl} = '';\r\n    let { selectedConnectivity, selectedConnectivityUrl} = '';\r\n    let { selectedAddedProtection, selectedAddedProtectionUrl} = '';\r\n    let { selectedAppearanceProtectionPlan, selectedAppearanceProtection, selectedAppearanceProtectionUrl} = '';\r\n\r\n    let isWide = false;\r\n\r\n    async function defaultEngineRequest() {\r\n        handleRequest('get', defaultEngineUrl, {}).then(requestResponse => {\r\n            const data = requestResponse.data;\r\n            const defaultDrivetrain = data.models[0].drivetrain.label;\r\n            const defaultEngine = data.models[0].engine.label;\r\n            setDefaultDrivetrain(defaultDrivetrain);\r\n            setDefaultEngine(defaultEngine);\r\n        }).catch(error => {\r\n            console.log(error);\r\n        });\r\n    }\r\n\r\n    async function defaultPackagesRequest() {\r\n        handleRequest('get', defaultPackageUrl, {}).then(requestResponse => {\r\n            const data = requestResponse.data;\r\n            setDefaultPackage(data);\r\n        }).catch(error => {\r\n            console.log(error);\r\n        });\r\n    }\r\n\r\n    if (!defaultEngine) {\r\n        defaultEngineRequest();\r\n    }\r\n\r\n    if (!defaultPackages) {\r\n        defaultPackagesRequest();\r\n    }\r\n\r\n    if (defaultEngine) {\r\n        let model = { engine: { label: defaultEngine }, drivetrain: { label: defaultDrivetrain } };\r\n        selectedModel = model;\r\n        let modelUrl = '/' + year + '/' + carline + '/' + trim;\r\n        selectedModelUrl = modelUrl\r\n\r\n    }\r\n\r\n    if (defaultPackages) {\r\n        let packages = { name: defaultPackages.packages[0] ?.name};\r\n        selectedPackage = packages;\r\n        let packageUrl = '/' + year + '/' + carline + '/' + trim + '/' + model + '/' + packageCode + '/#';\r\n        selectedPackageUrl = packageUrl\r\n    }\r\n\r\n    if (sessionStorage.getItem('selectedTrim')) {\r\n        selectedTrim = sessionStorage.getItem('selectedTrim');\r\n        selectedTrim = JSON.parse(selectedTrim);\r\n\r\n        selectedTrimUrl = sessionStorage.getItem('urlSlugObjectTrims');\r\n        selectedTrimUrl = JSON.parse(selectedTrimUrl);\r\n        selectedTrimUrl = '/' + selectedTrimUrl.year + '/' + selectedTrimUrl.carline;\r\n    }\r\n\r\n    if (sessionStorage.getItem('selectedModel')) {\r\n        selectedModel = sessionStorage.getItem('selectedModel');\r\n        selectedModel = JSON.parse(selectedModel);\r\n\r\n        selectedModelUrl = sessionStorage.getItem('urlSlugObjectEngineAndDrivetrain');\r\n        selectedModelUrl = JSON.parse(selectedModelUrl);\r\n        selectedModelUrl = '/' + selectedModelUrl.year + '/' + selectedModelUrl.carline + '/' + selectedModelUrl.trim;\r\n    }\r\n\r\n    if (sessionStorage.getItem('selectedPackage')) {\r\n        selectedPackage = sessionStorage.getItem('selectedPackage');\r\n        selectedPackage = JSON.parse(selectedPackage);\r\n\r\n        // Added this in the case of the build id passed in the url\r\n        if (sessionStorage.getItem('urlSlugObjectPackage')) {\r\n            selectedPackageUrl = sessionStorage.getItem('urlSlugObjectPackage');\r\n            selectedPackageUrl = JSON.parse(selectedPackageUrl);\r\n            selectedPackageUrl = '/' + selectedPackageUrl.year + '/' + selectedPackageUrl.carline + '/' + selectedPackageUrl.trim + '/' + selectedPackageUrl.model + '/' + (selectedPackageUrl.option ? selectedPackageUrl.option : selectedPackageUrl.packageCode);\r\n        } else {\r\n            selectedPackageUrl = defaultPackageUrl;\r\n        }\r\n    }\r\n\r\n    if (sessionStorage.getItem('selectedInteriorColour')) {\r\n        selectedColoursInt = sessionStorage.getItem('selectedInteriorColour');\r\n        selectedColoursExt = sessionStorage.getItem('selectedExteriorColour');\r\n        selectedColoursInt = JSON.parse(selectedColoursInt);\r\n        selectedColoursExt = JSON.parse(selectedColoursExt);\r\n\r\n        selectedColoursUrl = sessionStorage.getItem('urlSlugObjectColour');\r\n        selectedColoursUrl = JSON.parse(selectedColoursUrl);\r\n        selectedColoursUrl = '/' + selectedColoursUrl.year + '/' + selectedColoursUrl.carline + '/' + selectedColoursUrl.trim + '/' + selectedColoursUrl.model + '/' + selectedColoursUrl.packageCode + '/colours/';\r\n    } else if (sessionStorage.getItem('defaultExteriorColour')) {\r\n        selectedColoursInt = sessionStorage.getItem('defaultInteriorColour');\r\n        selectedColoursExt = sessionStorage.getItem('defaultExteriorColour');\r\n        selectedColoursInt = JSON.parse(selectedColoursInt);\r\n        selectedColoursExt = JSON.parse(selectedColoursExt);\r\n\r\n        selectedColoursUrl = '/' + year + '/' + carline + '/' + trim + '/' + model + '/' + packageCode + '/colours/';\r\n    } else {\r\n        selectedColoursUrl = '/' + year + '/' + carline + '/' + trim + '/' + model + '/' + packageCode + '/colours/';\r\n    }\r\n\r\n    if (sessionStorage.getItem('selectedWheel')) {\r\n        selectedWheel = sessionStorage.getItem('selectedWheel');\r\n        selectedWheel = JSON.parse(selectedWheel);\r\n\r\n        selectedWheelUrl = sessionStorage.getItem('urlSlugObjectWheels');\r\n        selectedWheelUrl = JSON.parse(selectedWheelUrl);\r\n        selectedWheelUrl = '/' + selectedWheelUrl.year + '/' + selectedWheelUrl.carline + '/' + selectedWheelUrl.trim + '/' + selectedWheelUrl.model + '/' + selectedWheelUrl.packageCode + '/wheels';\r\n    } else {\r\n        selectedWheelUrl = '/' + year + '/' + carline + '/' + trim + '/' + model + '/' + packageCode + '/wheels';\r\n    }\r\n\r\n    if(sessionStorage.getItem('selectedConnectedVehiclePackage')) {\r\n        selectedConnectivity = sessionStorage.getItem('selectedConnectedVehiclePackage');\r\n        selectedConnectivity = JSON.parse(selectedConnectivity);\r\n    }\r\n    selectedConnectivityUrl = '/'+year+'/'+carline+'/'+trim+'/'+model+'/'+packageCode+'/connectivity';\r\n\r\n\r\n    if(sessionStorage.getItem('selectedAppearanceProtectionPlansPackage')) {\r\n        // TODO : TRANSFORM INTO A FUNCTION SUMMARYCALCULATOR\r\n        if(window.summaryCalculator.Packages?.appearance_protection){\r\n            Object.entries(window.summaryCalculator.Packages.appearance_protection[0].plans).map(([key, value], planIndex) => {\r\n                if(planIndex === Number(window.summaryCalculator.SelectedAppearanceProtectionIndex)) {\r\n                    selectedAppearanceProtectionPlan = value;\r\n                }\r\n            });\r\n        }\r\n\r\n        selectedAppearanceProtection = sessionStorage.getItem('selectedAppearanceProtectionPlansPackage');\r\n        selectedAppearanceProtection = JSON.parse(selectedAppearanceProtection);\r\n    }\r\n    selectedAppearanceProtectionUrl = '/'+year+'/'+carline+'/'+trim+'/'+model+'/'+packageCode+'/protections#ap';\r\n\r\n    if(sessionStorage.getItem('selectedAddedProtectionPackage')) {\r\n        selectedAddedProtection = sessionStorage.getItem('selectedAddedProtectionPackage');\r\n        selectedAddedProtection = JSON.parse(selectedAddedProtection);\r\n    }\r\n    selectedAddedProtectionUrl = '/'+year+'/'+carline+'/'+trim+'/'+model+'/'+packageCode+'/protections#map';\r\n\r\n    function getProtectionDetails() {\r\n        let list = \"<p>\";\r\n\r\n        if(window.summaryCalculator.SelectedAddedProtectionPackage.name != undefined ){\r\n            list += `${t('payments:added_protection')} ${window.summaryCalculator.SelectedAddedProtectionPackage.name}`\r\n        }\r\n        if(window.summaryCalculator.SelectedAppearanceProtectionPlan.name != undefined && window.summaryCalculator.SelectedAppearanceProtectionPlansIndex !== null) {\r\n            if(window.summaryCalculator.SelectedAddedProtectionPackage.name != undefined ){\r\n                list += ', '\r\n            }\r\n            list += `<p class=\"desc\">${t('payments:appearance_protection')} <span style=\"text-transform:lowercase\">${window.summaryCalculator.SelectedAppearanceProtectionPlansPackage.name} for ${window.summaryCalculator.SelectedAppearanceProtectionPlan.name}</span></p>`\r\n        }           \r\n        list += \"</p>\"\r\n        return list;\r\n    }\r\n\r\n    function getPackageName() {\r\n        let packageName = '';\r\n\r\n\r\n        const selectedPackageIndex = JSON.parse(sessionStorage.getItem(Constants.SelectedPackageIndex));\r\n        if (selectedPackageIndex !== null)\r\n            packageName += `<span>${selectedPackage.name}</span>`;\r\n\r\n        const selectedWarrantyPackage = JSON.parse(sessionStorage.getItem('selectedWarrantyPackage'));\r\n        if (selectedWarrantyPackage != null && selectedWarrantyPackage.name != undefined) {\r\n            isWide = true;\r\n            if (packageName != '') packageName += ', <br>';\r\n            packageName += `<span>${t(\"packages:warranties\")}</span>&nbsp;: <span>${selectedWarrantyPackage.name}</span>`;\r\n        }\r\n        const selectedConnectedVehiclePackage = JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage'));\r\n        if (selectedConnectedVehiclePackage != null && selectedConnectedVehiclePackage.name != undefined) {\r\n            isWide = true;\r\n            if (packageName != '') packageName += ', <br>';\r\n            packageName += `<span>${t(\"packages:connected\")}</span>&nbsp;: <span>${selectedConnectedVehiclePackage.name}</span>`;\r\n        }\r\n        if (packageName === '')\r\n            t(\"general:none_selected\");\r\n\r\n        return packageName;\r\n    }\r\n\r\n    React.useEffect(() => {\r\n    }, []);\r\n\r\n    return (\r\n        <div className=\"mz-summary--specs\" ref={componentRef}>\r\n            <h3>{t(\"your_build_specifications\")}</h3>\r\n            <SpecsItem SpecsItemName={t(\"trim\")} SpecsItemModel={selectedTrim? selectedTrim.trim_type.name : '' } SpecsItemEditUrl={selectedTrimUrl? selectedTrimUrl : '/#/'} />\r\n            <SpecsItem SpecsItemName={t(\"options\")} SpecsItemModel={selectedModel ? selectedModel.engine.label +' '+ selectedModel.drivetrain.label : '' } SpecsItemEditUrl={selectedModelUrl ? selectedModelUrl : '/#/'} />\r\n            <SpecsItem SpecsItemName={t(\"package\")} SpecsItemModel={ getPackageName() } SpecsItemEditUrl={selectedPackageUrl} useHTML={isWide}  isPackage={true} />\r\n            <SpecsItem SpecsItemName={t(\"exterior\")} SpecsItemModel={selectedColoursExt? selectedColoursExt.description : ''} SpecsItemEditUrl={selectedColoursUrl} />\r\n            <SpecsItem SpecsItemName={t(\"interior\")} SpecsItemModel={selectedColoursInt? selectedColoursInt.description : ''} SpecsItemEditUrl={selectedColoursUrl} />\r\n            <SpecsItem SpecsItemName={t(\"wheels\")} SpecsItemModel={selectedWheel? selectedWheel.title : t(\"wheels_default\")} SpecsItemEditUrl={selectedWheelUrl} />\r\n            {/* <SpecsItem SpecsItemName={t(\"protection\")} SpecsItemModel={getProtectionDetails()} SpecsItemEditUrl={selectedAppearanceProtectionUrl} />             */}\r\n        </div>\r\n    )\r\n};\r\n\r\nBuildSpecs.defaultProps = {\r\n    componentRef: null,\r\n}","import React from 'react';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport { Button } from '../../1_Atoms/Button/Button';\r\nimport { AccessoryCard } from '../../2_Molecules/AccessoryCard/AccessoryCard';\r\n\r\nexport const Accessories = ({ ...props }) => {\r\n    const { year, carline, trim, model, packageCode } = useParams();\r\n    const navigate = useNavigate();\r\n    const { t, i18n } = useTranslation(['accessories', 'general']);\r\n\r\n    const gtmHelper = new GTMHelper();\r\n\r\n    function handleAddAccessoriesClick(e) {\r\n\t\te.preventDefault();\r\n        const url = '/'+year+'/'+carline+'/'+trim+'/'+model+'/'+packageCode+'/accessories';\r\n\r\n        navigate(url);\r\n        gtmHelper.setGTM({'action':'Add Accessories'}, true, false);\r\n    }\r\n\r\n    function EditButton(props) {\r\n        let accessories = sessionStorage.getItem(Constants.SelectedAccessories);\r\n        accessories = JSON.parse(accessories);\r\n\r\n        if(accessories && accessories.length > 0) {\r\n            return(<div className=\"accessory-edit-link\"><a  className=\"mz-link\" href=\"\" onClick={handleAddAccessoriesClick}>{t(\"edit_accessories\")}</a></div>);\r\n        }\r\n    }\r\n\r\n    function AccessoriesList(props) {\r\n        let availableAccessories = JSON.parse(sessionStorage.getItem(Constants.Accessories));\r\n\r\n        let accessories = sessionStorage.getItem(Constants.SelectedAccessories);\r\n        accessories = JSON.parse(accessories);\r\n        const List = []\r\n\r\n        console.log(accessories)\r\n        if(accessories && accessories.length > 0) {\r\n            accessories.forEach((accessory) => {\r\n                List.push(<AccessoryCard\r\n                    Accessory={{\r\n                        category: {\r\n                        id: accessory.category.id,\r\n                        title: accessory.category.title,\r\n                        },\r\n                        description: accessory.description,\r\n                        image: accessory.image,\r\n                        name: accessory.name,\r\n                        part_number: accessory.part_number,\r\n                        price: accessory.price,\r\n                        install_cost: accessory.install_cost,\r\n                        price_week: null,\r\n                    }}\r\n                    key={accessory.name}\r\n                    Index={1}\r\n                />)\r\n            })\r\n        } else {\r\n            if(availableAccessories && availableAccessories.rawData.length > 0) {\r\n                return (\r\n                    <div className='mz-accessory--empty'>\r\n                        <p>{t(\"no_added_accessories\")}</p>\r\n                        <a className=\"mz-link\" href=\"\" onClick={handleAddAccessoriesClick}>{t(\"add_accessories\")}</a>\r\n                    </div>\r\n                )\r\n            } else {\r\n                return (\r\n                    <div className='mz-accessory--empty'>\r\n                        <p>{t(\"no_accessorie_comingsoon\")}</p>\r\n                    </div>\r\n                )\r\n            }\r\n        }\r\n\r\n        return (\r\n            <div className='mz-accessory--container'>\r\n                {List}\r\n            </div>\r\n        )\r\n    }\r\n\r\n    return (\r\n        <div className=\"mz-summary--accessories\">\r\n            <h4>{t(\"accessories:title\")}</h4>\r\n\r\n            {\r\n                EditButton()\r\n            }\r\n\r\n            <AccessoriesList />\r\n        </div>\r\n    )\r\n};","import React, { useState, useEffect, useRef }  from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nexport const CollapseSpecs = ({ColCarText1, ColBoxText, id, ...props }) => {\r\n\tconst gtmHelper = new GTMHelper();\r\n\r\n    const [toggle, setToggle] = useState(true);\r\n    const [currID, setID] = useState(id);\r\n    const collapseRef = useRef();\r\n\r\n    useEffect(() => {\r\n        const collapse = collapseRef.current;\r\n        if(typeof window.mzAnimator === 'object'){\r\n            window.mzAnimator.animateHeight(collapse, 'CollapseListSpecs' + currID, 'init')\r\n        }\r\n    }, [])\r\n\r\n    useEffect(() => {\r\n        const collapse = collapseRef.current;\r\n        if(toggle){\r\n            window.mzAnimator.animateHeight(collapse, 'CollapseListSpecs' + currID, false)\r\n        }else{\r\n            window.mzAnimator.animateHeight(collapse, 'CollapseListSpecs' + currID, true)\r\n        }\r\n        gtmHelper.setGTM({'action':'Collapse', 'type': 'Specs', 'value': toggle, 'title': ColCarText1}, true , false);\r\n    },[toggle])\r\n\r\n    return (\r\n        <div className=\"mz-collapse mz-collapse--specs\">\r\n            <button\r\n                onClick={()=>{setToggle(!toggle)}}\r\n                className=\"mz-collapse__button\"\r\n            >\r\n                <div className=\"mz-collapse__cartext-container\">\r\n                    <p className=\"mz-collapse__text\">{ColCarText1}</p>\r\n                </div>\r\n                <i className={ !toggle ? \"mz-svg mz-svg-chevron open\" : \"mz-svg mz-svg-chevron\"}></i>\r\n            </button>\r\n            <div className=\"mz-collapse__box visible\" ref={collapseRef}>{ ReactHtmlParser (ColBoxText) }</div>\r\n        </div>\r\n    )\r\n}\r\n\r\nCollapseSpecs.propTypes = {\r\n    ColCarText1: PropTypes.string,\r\n    ColBoxText: PropTypes.string,\r\n}\r\n\r\nCollapseSpecs.defaultProps = {\r\n    ColCarText1: 'Term: 60 months @2.95%',\r\n    ColBoxText: 'Pellentesque in ipsum id orci porta dapibus. Curabitur arcu erat, accumsan id imperdiet et, porttitor at sem. Nulla porttitor accumsan tincidunt. Cras ultricies ligula sed magna dictum porta. Nulla quis lorem ut libero malesuada feugiat. Curabitur arcu erat, accumsan id imperdiet et, porttitor at sem. Quisque velit nisi, pretium ut lacinia in, elementum id enim. Nulla porttitor accumsan tincidunt. Sed porttitor lectus nibh. Proin eget tortor risus.',\r\n}\r\n\r\nexport default CollapseSpecs;","import React from 'react';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport { Button } from '../../1_Atoms/Button/Button';\r\nimport { CollapseSpecs } from '../../2_Molecules/Collapse/CollapseSpecs';\r\n\r\nimport { getLang } from '../../../utils';\r\n\r\nexport const FeaturedSpecs = ({openCollapsable,  ...props }) => {\r\n    const { t, i18n } = useTranslation(['summary', 'general']);\r\n    const navigate = useNavigate();\r\n    const { year, carline, trim, model, packageCode } = useParams();\r\n    const [summaryCalculator = new SummaryCalculator().reloadStoredData(), setSummaryCalculator] = React.useState();\r\n\r\n    const [showBrochure]  = React.useState(summaryCalculator.AvailableTrim.model_year.show_brochure);\r\n    const data = JSON.parse(sessionStorage.getItem(Constants.SpecificationData));\r\n    const specsPDF = genereatePDFURL(true);\r\n\tconst brochurePDF = genereatePDFURL(false);\r\n\r\n    const gtmHelper = new GTMHelper();\r\n\r\n    function genereatePDFURL(isSpec){\r\n\t\tconst pdfType=isSpec?'specs':'brochure';\r\n        let URL = `/globalassets/mazda-canada/${getLang()}/pdf/brochures/vehicles/${carline}/${year}-mazda-${carline.toLowerCase()}-${pdfType}-${getLang()}.pdf`;\r\n        return URL;\r\n    }\r\n\r\n    function getTableSpecs(data) {\r\n        let table  = \"<table class='tablespecs'>\"\r\n            Object.keys(data).map((innerAttr, index) => {\r\n                table += \"<tbody>\";\r\n                table += \"<tr>\";\r\n\r\n                let title=data[innerAttr].Title;\r\n                if(!title.includes('http')){\r\n                    title=title.replace(/([^<])\\/([^>])/g, \"$1 / $2\");\r\n                }\r\n                let content=data[innerAttr].Data;\r\n                if(!content.includes('http')){\r\n                    content=content.replace(/([^<])\\/([^>])/g, \"$1 / $2\");\r\n                }\r\n                if(data[innerAttr].type === 'Header') {\r\n                    table += `<td colspan=\"2\" class=\"cell category\"><p class=\"paragraph--large text--white\">${title}</p></td>`;\r\n                } else {\r\n                    table += `<td class=\"cell title\">${title}</td>`;\r\n                    table += `<td class=\"cell data\">${content}</td>`;\r\n                }\r\n\r\n                table += \"</tr>\";\r\n                table += \"</tbody>\";\r\n            });\r\n            table += \"</table>\";\r\n\r\n        return table;\r\n    }\r\n\r\n    return (\r\n        <div className=\"mz-summary--featured\">\r\n            <h3>{t(\"full_specifications\")}</h3>\r\n\r\n            {data ? Object.keys(data).map((innerAttr, index) => {\r\n                const key = `specificationsCollapse${index}`;\r\n                const tableHtml = getTableSpecs(data[innerAttr]);\r\n                return (\r\n                    <CollapseSpecs key={key} isOpen={openCollapsable === key} ColCarText1={innerAttr} ColBoxText={tableHtml} id={String(Math.floor(Math.random() * 100000000))} />\r\n                )}) : null\r\n            }\r\n\r\n            <div className=\"mz-summary--featured__cta\">\r\n\t\t\t\t<Button\r\n                    primary={false}\r\n                    label={t(\"btn_download_full_specs\")}\r\n                    icon={true}\r\n                    iconBefore={true}\r\n                    size={1.4}\r\n                    svg_list=\"downloadbrochure\"\r\n                    onClick={() => {  \r\n                        window.open(specsPDF, \"_blank\")\r\n                        gtmHelper.setGTM({'action':'Download', 'type': 'Specs PDF', 'value': specsPDF}, true , false);\r\n                    }}\r\n                />\r\n\t\t\t\t{showBrochure && <Button\r\n                    primary={false}\r\n                    label={t(\"btn_download_brochure\")}\r\n                    icon={true}\r\n                    iconBefore={true}\r\n                    size={1.4}\r\n                    svg_list=\"downloadbrochure\"\r\n                    onClick={() => {  \r\n                        window.open(brochurePDF, \"_blank\");\r\n                        gtmHelper.setGTM({'action':'Download', 'type': 'Brochure PDF', 'value': brochurePDF}, true , false);\r\n                    }}\r\n                />}\r\n            </div>\r\n        </div>\r\n)\r\n};","import React from 'react';\r\n\r\nimport { getLang, getBaseUrl} from '../../../utils';\r\n\r\nimport { useTranslation } from \"react-i18next\";\r\n// import PropTypes from 'prop-types';\r\n\r\nexport const Packs = ({ ...props }) => {\r\n    const { t, i18n } = useTranslation(['summary', 'general']);\r\n    //const lang = getLang();\r\n\r\n    const shortLang = getLang() === 'en' ? 'e' : 'f';\r\n\r\n    return (\r\n        <>\r\n            <div className=\"mz-bg--101010\">\r\n                <div className=\"mz-spacer-m mz-spacer\"></div>\r\n                <div className=\"mz-circle-callout mz-circle-callout--warranty\">\r\n                    <div className=\"mz-image mz-circle-callout__top-logo\">\r\n                        <img src={`https://mazda.ca/globalassets/mazda-canada/c65_mazdaunlimitedlogo_neg_${shortLang}_new.png`} alt=\"Mazda Unlimited Mileage Warranty.\"/>\r\n                    </div>\r\n                    <div className=\"mz-container mz-four-col-grid\">\r\n                        <div className=\"mz-circle-callout-wrapper \">\r\n                            <div className=\"image\">\r\n                                <div className=\"mz-image   \">\r\n                                    <img src=\"https://mazda.ca/contentassets/3b14f54f8aa6495999c6e6d1e1477959/c63_unlmited_newvehicle.png\" alt=\"White car icon.\"/>\r\n                                </div>    \r\n                            </div>\r\n                            <div className=\"top-label\">\r\n                                <h6 className=\"text--grey\"></h6>\r\n                            </div>\r\n                            <div className=\"big-text\">\r\n                                <h4 className=\"text--white\">{t(\"wrnty_newVeh\")}</h4>\r\n                            </div>\r\n                            <div className=\"text text--grey2\">\r\n                                <h6 className=\"text--white\">{t(\"wrnty_unlimited\")}</h6>\r\n                            </div>\r\n                        </div>\r\n                        <div className=\"mz-circle-callout-wrapper \">\r\n                            <div className=\"image\">\r\n                                <div className=\"mz-image   \">\r\n                                    <img src=\"https://mazda.ca/contentassets/ca3ba1ddd7e84ecc9ee1ba3ea10d11d3/c63_unlmited_roadside.png\" alt=\"White road icon.\"/>\r\n                                </div>    \r\n                            </div>\r\n                            <div className=\"top-label\">\r\n                                <h6 className=\"text--grey\"></h6>\r\n                            </div>\r\n                            <div className=\"big-text\">\r\n                                <h4 className=\"text--white\">{t(\"wrnty_roadside\")}</h4>\r\n                            </div>\r\n                            <div className=\"text text--grey2\">\r\n                                <h6 className=\"text--white\">{t(\"wrnty_mileage\")}</h6>\r\n                            </div>\r\n                        </div>\r\n                        <div className=\"mz-circle-callout-wrapper \">\r\n                            <div className=\"image\">\r\n                                <div className=\"mz-image   \">\r\n                                    <img src=\"https://mazda.ca/contentassets/b2c41975a22049409c47e9ab7f278f4d/c63_unlmited_powertrain.png\" alt=\"White powertrain icon.\"/>\r\n                                </div>    \r\n                            </div>\r\n                            <div className=\"top-label\">\r\n                                <h6 className=\"text--grey\"></h6>\r\n                            </div>\r\n                            <div className=\"big-text\">\r\n                                <h4 className=\"text--white\">{t(\"wrnty_powertrain\")}</h4>\r\n                            </div>\r\n                            <div className=\"text text--grey2\">\r\n                                <h6 className=\"text--white\">{t(\"wrnty_unlimited\")}</h6>\r\n                            </div>\r\n                        </div>\r\n                        <div className=\"mz-circle-callout-wrapper \">\r\n                            <div className=\"image\">\r\n                                <div className=\"mz-image   \">\r\n                                    <img src=\"https://mazda.ca/contentassets/5ac1baf08c5b43cd9230b7495f35906a/c63_unlmited_antiperforation.png\"  alt=\"White shield icon.\"/>\r\n                                </div>    \r\n                            </div>\r\n                            <div className=\"top-label\">\r\n                                <h6 className=\"text--grey\"></h6>\r\n                            </div>\r\n                            <div className=\"big-text\">\r\n                                <h4 className=\"text--white\">{t(\"wrnty_perforation\")}</h4>\r\n                            </div>\r\n                            <div className=\"text text--grey2\">\r\n                                <h6 className=\"text--white\">{t(\"wrnty_unlimited\")}</h6>\r\n                            </div>\r\n                        </div>   \r\n                    </div>\r\n                </div>\r\n                <a className=\"mz-btn  mz-btn--primary mz-btn--white mz-btn--center\" href={t(\"wrnty_href\")} target=\"_self\" data-link-type=\"internal\" data-link-name=\"View Warranty Details\" data-link-url=\"/en/mazda-owners/Overview/warranty/\"><span>{t(\"wrnty_cta\")}</span></a>\r\n                <div className=\"mz-spacer-m mz-spacer mz-bg--101010\"></div>\r\n            </div>\r\n            <div className=\"mz-spacer-s mz-spacer\"></div>\r\n        </>\r\n    )\r\n};","/* global mzFunc mzMenu mzTabs */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nimport { get360Data, getLoading, showCmsHiddenBlock, getCmsAwardsBlockFromCMS, showCmsFooterHiddenBlock, getProvince } from '../../../utils';\r\n\r\nimport { openModal, scrollTo } from '../../../Helpers/helpers';\r\n//import SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport NavHelper from '../../../Helpers/navhelper';\r\n\r\nimport Button from '../../1_Atoms/Button/Button';\r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\nimport CollapseLegal from '../../2_Molecules/Collapse/CollapseLegal';\r\nimport { Nav } from '../../3_Organisms/Nav/Nav';\r\nimport { Financial } from '../../3_Organisms/Financial/Financial';\r\nimport { BuildSpecs } from '../../3_Organisms/BuildSpecs/BuildSpecs';\r\nimport ThreeSixtyContainer from '../../3_Organisms/360Container/360Container';\r\nimport { Accessories } from '../../3_Organisms/Accessories/Accessories';\r\nimport { FeaturedSpecs } from '../../3_Organisms/FeaturedSpecs/FeaturedSpecs';\r\nimport { Packs } from '../../3_Organisms/Packs/Packs';\r\nimport { Modal } from '../../3_Organisms/Modal/Modal';\r\n\r\nexport const SummaryPage = ({ ...props }) => {\r\n    const [loading, setLoading] = useState(true);\r\n    const summaryCalculator = window.summaryCalculator;\r\n    const { year, carline, trim, model, packageCode } = useParams();\r\n    const [nav, setNav] = React.useState(null);\r\n    const navigate = useNavigate();\r\n    const { t, i18n } = useTranslation(['summary', 'general']);\r\n    const buildSpecsRef = useRef(null);\r\n\r\n    const [hasScrolled, setHasScrolled] = React.useState(false);\r\n\r\n    const [openCollapsable, setOpenCollapsable] = React.useState(null);\r\n    const [openSpecificationCollapsable, setOpenSpecificationCollapsable] = React.useState(null);\r\n\r\n    const legalContent = JSON.parse(sessionStorage.getItem(Constants.LegalSummary));\r\n    const [legalModalOpen, setLegalModalOpen] = React.useState(false);\r\n\r\n    const [dealerID, setDealerID] = useState(null);\r\n    const [isRetailerMode, setIsRetailerMode] = useState(window.bnp_retailer_mode === true ? true : false);\r\n\r\n\tconst gtmHelper = new GTMHelper();\r\n\tconst navHelper = new NavHelper();\r\n\r\n    //showCmsHiddenBlock(summaryCalculator.selectedVehicle.carline);\r\n\r\n    showCmsFooterHiddenBlock();\r\n\r\n    summaryCalculator.CurrentStep = 9;\r\n\r\n    React.useEffect(() => {\r\n        async function executeTasks() {\r\n            if (!summaryCalculator.isDataLoaded()) {\r\n                await summaryCalculator.loadVehicleData(year, carline, trim, model, packageCode);\r\n                await summaryCalculator.loadFromFinancialProvider();\r\n\r\n                if (JSON.parse(sessionStorage.getItem(Constants.HasFinancialProviderError)) === true) {\r\n                    const vehiclePageUri = `/${decodeURI(window.location.search)}`;\r\n                    navigate(vehiclePageUri)\r\n                }\r\n\r\n                setLoading(false);\r\n\r\n                setNav(null);\r\n            } else {\r\n                setLoading(false);\r\n            }\r\n\r\n            if(!loading) {\r\n                if (nav === null) {\r\n                    //setNav(navHelper.getNavContent(year, carline, trim, model, packageCode,summaryCalculator.CurrentStep, t));\r\n                    const toRender = navHelper.getNavContent(t);\r\n                    setNav(toRender);                    \r\n                }\r\n                if(summaryCalculator.isDataLoaded() && !hasScrolled) {\r\n                    // ONCE THE PAGE DATA IS LOADED ANCHOR TO CONTACT A DEALER\r\n                    if (window.location.href.indexOf('?contactDealer') > 0) {\r\n                        function isFindDealerForm() {\r\n                            const formEl = document.getElementById('contactDealer')\r\n                            if (formEl) {\r\n                                const reactEl = formEl.querySelector('.FormApp');\r\n                                if(reactEl){\r\n                                    document.querySelector('#contactDealer').scrollIntoView({\r\n                                        block: 'end',\r\n                                        behavior: 'smooth'\r\n                                    });\r\n                                }else{\r\n                                    setTimeout(isFindDealerForm, 15);\r\n                                }\r\n                            } else {\r\n                              setTimeout(isFindDealerForm, 15);\r\n                            }\r\n                        }\r\n                        isFindDealerForm();\r\n                    }\r\n    \r\n                    setHasScrolled(true);\r\n                }\r\n            }\r\n\r\n\t\t\tif(typeof mzFunc === 'object' && typeof mzTabs === 'object'){\r\n\t\t\t\tmzFunc.waitForEl('.mzBuildandPrice .mz-tabs').then(function(components){mzTabs.init(components);});\r\n                mzMenu.init();\r\n\t\t\t}\r\n\r\n            // Set the retailer mode (Force this call for the hotlink situation)\r\n            const isRetailerMode = await summaryCalculator.isRetailerMode();\r\n            setIsRetailerMode(isRetailerMode);\r\n        }\r\n        executeTasks();\r\n    }, [summaryCalculator, loading]);\r\n\r\n    let images = {};\r\n\r\n    if (summaryCalculator.SelectedColourExteriorIndex !== 'null' && summaryCalculator.Colours !== null) {\r\n        const { exteriors, interiors } = summaryCalculator.Colours.visual;\r\n        const selectedExterior = Object.entries(exteriors)[summaryCalculator.SelectedColourExteriorIndex][1];\r\n        const selectedInterior = summaryCalculator.SelectedColourInteriorIndex !== 'null' ? interiors[summaryCalculator.SelectedColourInteriorIndex] : null;\r\n        images = get360Data(summaryCalculator.Colours.visual, selectedExterior, selectedInterior);\r\n    }\r\n\r\n    React.useEffect(() => {\r\n        if (window.bnp_retailer_mode) {\r\n            // Set the polling until we have a dealer vars with the information set as we should always have the dealer vars information\r\n            const intervalRef = setInterval(()=>{\r\n              const dealerVars = window.summaryCalculator.getDealerVars();\r\n            \r\n              if (dealerVars) {\r\n                setDealerID(dealerVars.dealerId);\r\n        \r\n                clearInterval(intervalRef);\r\n              }\r\n            }, 200);\r\n        } else {\r\n            // Restart React Forms app.\r\n            // Skip if this is the first time loading it because App.js takes care of it.\r\n            if (window.isReactFormsAppLoaded && typeof window.initReactFormsApp === 'function') {\r\n                window.initReactFormsApp();\r\n            }\r\n        }\r\n    }, []);\r\n\r\n    React.useEffect(() => {\r\n        if(dealerID) {\r\n            // Restart React Forms app.\r\n            // Skip if this is the first time loading it because App.js takes care of it.\r\n            if (window.isReactFormsAppLoaded && typeof window.initReactFormsApp === 'function') {\r\n                window.initReactFormsApp();\r\n            }\r\n        }\r\n    }, [dealerID, isRetailerMode]);\r\n\r\n    const generateStaticVehicleImg = () => {\r\n        if (images) {\r\n            const { imagePath,  imageName } = images;\r\n            const { year, carline, trim } = summaryCalculator.selectedVehicle\r\n            const src = imagePath && imageName ? `${imagePath}${imageName.replace('{index}', 18)}` : '';\r\n            return (\r\n                <img src={src} alt={year + '' + carline + ' ' + trim} />\r\n            )\r\n        }\r\n        return ''\r\n    }\r\n\r\n    return (\r\n        <>\r\n        {getLoading(false, t)}\r\n        <div className=\"mz-summary-page mz-top-nav-spacing\">\r\n            <Nav nav={nav} />\r\n\r\n            <h6 className='mz-full-width mz-summary__page-title'>{t(\"build_summary\")}</h6>\r\n            <h3 className='mz-full-width mz-summary__page-subtitle'>{t(\"your\")} {ReactHtmlParser(summaryCalculator.VehicleTitle)}</h3>\r\n\r\n            <div className=\"mz-summary__top-vehicle-image\">\r\n                {generateStaticVehicleImg()}\r\n            </div>\r\n\r\n            <div className=\"mz-full-width mz-summary__top-actions\">\r\n                <button\r\n                    className=\"reset mz-summary-review-build-btn interactive text--grey\"\r\n                    onClick={() => {\r\n                        scrollTo({ y: buildSpecsRef.current, offsetY: 100 });\r\n                        gtmHelper.setGTM({'action':'Sctoll to','scrollto': 'Review Build'}, true, false);\r\n                    }}\r\n                >\r\n                    <span>{t(\"review_build_specifications\")}</span>\r\n                </button>\r\n            </div>\r\n            \r\n            <div style={{marginTop: '25px'}}></div>\r\n                        \r\n            <div className=\"mz-grey-block\">\r\n            { !loading ?\r\n                <Financial\r\n                    openCollapsable={openCollapsable}\r\n                    setOpenCollapsable={setOpenCollapsable}\r\n                /> : null }\r\n\r\n                <div id=\"BNP_AWARDS\">\r\n                {ReactHtmlParser(getCmsAwardsBlockFromCMS(summaryCalculator.selectedVehicle.year, summaryCalculator.selectedVehicle.carline))}\r\n                </div>\r\n\r\n                <div className=\"mzReactForms mz-summary--container-forms\" id=\"contactDealer\">\r\n                    <input type=\"hidden\" data-mz-form-field-name=\"formType\" value=\"BookTestDrive\"/>\r\n                    {isRetailerMode ?\r\n                        <>\r\n                            <h3 className=\"mz-summary__form-app-title\">{t(\"take_the\")} {ReactHtmlParser(summaryCalculator.VehicleTitle)} {t('test_drive')}</h3>\r\n                            <div className=\"mz-spacer mz-spacer-s\"></div>\r\n                            <input type=\"hidden\" data-mz-form-field-name=\"dealerId\" value={dealerID}/>\r\n                        </>\r\n                    :\r\n                        <>\r\n                            <h3 className=\"mz-summary__form-app-title\">{t(\"contact_your_local_retailer\")}</h3>\r\n                        </>\r\n                    }\r\n\r\n                    <input type=\"hidden\" data-mz-form-field-name=\"formDisclaimer\" value={t(\"form_disclaimer_retailer\")}/>                    \r\n                    <input type=\"hidden\" data-mz-form-field-name=\"modelCode\" value={model}/>\r\n                    <input type=\"hidden\" data-mz-form-field-name=\"modelOption\" value={packageCode}/>\r\n                    <input type=\"hidden\" data-mz-form-field-name=\"isTopSectionHidden\" value=\"true\"/>\r\n                    <input type=\"hidden\" data-mz-form-field-name=\"isEmbeddedOnBnP\" value=\"true\"/>\r\n                    <input type=\"hidden\" data-mz-form-field-name=\"source\" value=\"WF\"/>\r\n                    <div className=\"mz-react-forms-root\"></div>\r\n                </div>\r\n            </div>\r\n\r\n            <div className=\"mz-summary--container mz-summary--container-build\">\r\n                <BuildSpecs componentRef={buildSpecsRef} />\r\n                <Accessories />\r\n            </div>\r\n\r\n            {images?.imagePlaceHolder ? <ThreeSixtyContainer imagePlaceHolder={images.imagePlaceHolder} /> : <ThreeSixtyContainer imagePathInterior={images.imagePathInterior} imagePath={images.imagePath} imageAmount={images.imageAmount} imageName={images.imageName} />}\r\n            \r\n            {sessionStorage.getItem(Constants.SpecificationData) && Object.keys(JSON.parse(sessionStorage.getItem(Constants.SpecificationData))).length > 0 ?\r\n                <div className=\"mz-grey-block mz-summary--container mz-summary--container-specs\">\r\n                    <FeaturedSpecs\r\n                        openCollapsable={openSpecificationCollapsable}\r\n                    />\r\n                </div>\r\n            :''}\r\n\r\n            \r\n            \r\n\r\n            <Modal modalContent={legalContent} isOpen={legalModalOpen} handleClose={setLegalModalOpen} modalId='legalModal' />\r\n        </div>\r\n        {!window.bnp_retailer_mode &&\r\n            <Packs />\r\n        }\r\n        <div className=\"mz-summary-page\">\r\n            <div className=\"mz-summary--container mz-summary-warranty\">\r\n                <div className=\"mz-legal mz-mobile\">\r\n                    <Button\r\n                        className=\"mz-btn mz-btn--legal alwaysVisible text--grey\"\r\n                        label={t(\"general:legal\")}\r\n                        backgroundColor=\"grey\"\r\n                        colour=\"grey\"\r\n                        icon={true}\r\n                        iconAfter={true}\r\n                        svg_className=\"\"\r\n                        svg_list=\"plus\"\r\n                        size={0.6}\r\n                        onClick={() => {\r\n                            document.querySelector('body').classList.add('disabled');\r\n                            setLegalModalOpen(true);\r\n                            gtmHelper.setGTM({'action':'Open Modal','modal': 'Legal'}, true, false);\r\n                        }}\r\n                    />\r\n                </div>\r\n            </div>\r\n        </div>\r\n        </>\r\n    )\r\n}\r\n\r\nexport default SummaryPage;","import React from 'react';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { useRef, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { formatPrice, getFinanceWeekly, getLeaseBiWeeklyFromMsrp } from '../../../utils';\r\nimport SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nexport const EngineCard = ({ Model, Selected, HandleSelectedModel, Index, showFinancePrice, ...props }) => {\r\n    const summaryCalculator = window.summaryCalculator;\r\n    const [modelData] = React.useState(Model);\r\n\tconst financial = JSON.parse(sessionStorage.getItem(Constants.FinancialObj));\r\n    const engineCost = modelData.financial.msrp - summaryCalculator.SelectedTrim.financial.msrp; //financial.msrp;\r\n    const { t, i18n } = useTranslation(['options', 'general']);\r\n\tconst [expandedIndex, setExpandedIndex] = React.useState(null);\r\n\tconst collapseRef = useRef(null);\r\n\tconst [toggle, setToggle] = React.useState(false);\r\n\tconst isExpanded = false;\r\n\r\n    function setSelectedModel(index) {\r\n        HandleSelectedModel(index)\r\n    }\r\n\r\n\tuseEffect(() =>{\r\n\t\tif(typeof window.mzAnimator === 'object'){\r\n\t\t\twindow.mzAnimator.animateHeight(collapseRef.current, 'EngineCollapse' + Index, 'init')\r\n\t\t}\r\n   \t},[]);\r\n   \r\n    useEffect(() =>{\r\n\t\twindow.mzAnimator.animateHeight(collapseRef.current, 'EngineCollapse' + Index, toggle)\r\n   \t},[toggle]);\r\n\r\n\tfunction handleCollapse(e){\r\n\t\t\tif (isExpanded !== null && expandedIndex !== null && Index !== null) {\r\n\t\t\t\tif (isExpanded === true) {\r\n\t\t\t\t\tsetExpandedIndex(null);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsetExpandedIndex(Index);\r\n\t\t\t\t\tsetTimeout(()=>{\r\n\t\t\t\t\t\tconst collapseTarget = e.target.closest('.mz-collapse');\r\n\t\t\t\t\t\tif(collapseTarget){\r\n\t\t\t\t\t\t\tconst scrollWindow = document.querySelector('.mz-package-page__package-card-list');\r\n\t\t\t\t\t\t\tconst topScroll = collapseTarget.offsetTop;\r\n\t\t\t\t\t\t\tscrollWindow.scroll({\r\n\t\t\t\t\t\t\t  top:topScroll,\r\n\t\t\t\t\t\t\t  behavior: 'smooth'\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},100);\r\n\t\t\t\t}\r\n\t\t\t} else{\r\n\t\t\t\tsetToggle(!toggle);\r\n\t\t\t}\r\n\t}\r\n    return (\r\n        <div className={`mz-collapse engine-card ${Selected?'mz-collapse-selected engine-card-selected':''}`}>\r\n\r\n            {modelData ?\r\n\r\n\t\t\t\t<div className=\"engine-card__content\">\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tonClick={handleCollapse}\r\n\t\t\t\t\t\tclassName=\"mz-collapse__button\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{Selected &&\r\n\t\t\t\t\t\t\t<div className=\"mz-check-indicator\"><i className=\"mz-svg mz-svg--white mz-svg-checkmark\"></i></div>\r\n\t\t\t\t\t\t}\r\n\t\t                <h6 className=\"engine-card__title\">\r\n\t\t\t\t\t\t\t{modelData.drivetrain.short_description}<br/>\r\n\t\t\t\t\t\t\t{modelData.transmission.short_description}<br/>\r\n\t\t\t\t\t\t\t{modelData.engine.short_description}\r\n\t\t\t\t\t\t</h6>\r\n\t\t\t\t\t\t{engineCost != 0 ? ReactHtmlParser(`<p class=\"engine-card__price\">${formatPrice(engineCost)} <span>\r\n\t\t\t\t\t\t\t${showFinancePrice?\r\n\t\t\t\t\t\t\t`(${getFinanceWeekly(engineCost, financial.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].rate, financial.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].term)}${t(\"general:week\")})` : \r\n\t\t\t\t\t\t\t!window.hideLeaseInCard ? `(${getLeaseBiWeeklyFromMsrp(engineCost, financial.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].rate, financial.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].term)}${t(\"general:bi_week\")})` : ''\r\n\t\t\t\t\t\t\t}</span></p>`) : ''}\r\n\t\t\t\t\t\t<i className={`mz-svg mz-svg-chevron ${toggle ? 'mz-svg--rotate270':''}`}></i>\r\n\t\t\t\t\t\t<hr />\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div className=\"mz-collapse__box\" ref={collapseRef}>\r\n\r\n\t\t                {!modelData.description ?\r\n\t\t\t\t\t\t<ul className=\"engine-card__list\">\r\n\t\t\t\t\t\t\t<li className=\"engine-card__list-item\">{ReactHtmlParser(modelData.drivetrain.label)}</li>\r\n\t\t\t\t\t\t\t<li className=\"engine-card__list-item\">{ReactHtmlParser(modelData.transmission.label)}</li>\r\n\t\t                </ul> :\r\n\t\t                <p dangerouslySetInnerHTML={{ __html: modelData.description }} />}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div>\r\n\t\t                {Selected ? <button className=\"mz-btn mz-button--secondary engine-card__select-button\" disabled={true}><span>{t(\"general:button_selected\")}</span></button> : <button className=\"mz-btn mz-btn--primary mz-btn--red engine-card__select-button\" onClick={()=>{\r\n\t\t\t\t\t\t\tsetSelectedModel(Index);\r\n\t\t\t\t\t\t}}><span>{t(\"select_engine\")}</span></button>}\r\n\t\t\t\t\t</div>\r\n            </div> : null}\r\n        </div>\r\n    )\r\n}\r\n\r\n\r\nexport default EngineCard;\r\n\r\nEngineCard.propTypes = {\r\n    HandleSelectedModel: PropTypes.func,\r\n}\r\n\r\nEngineCard.defaultProps = {\r\n    HandleSelectedModel: () => {},\r\n};","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useRef, useEffect } from 'react';\r\nimport { formatPrice, getFinanceWeekly, getLeaseBiWeeklyFromMsrp, getLeaseBiWeeklyFromOptions } from '../../../utils';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nexport const PackageCard = ({ Package, PopContent, ButStyle, ButContent, Selected, ButSelectedContent, SelectedIndex, HandleSelectedPackage, HandleRemovePackage, HasCollapse=true, Index, showFinancePrice, isUniversal, displayPriceCalculation = true, displayConnectedServicePriceCalculation = false, ...props }) => {\r\n    const summaryCalculator = window.summaryCalculator;\r\n    const [packageData, setPackageData] = React.useState(Package);\r\n\tconst [financial, setFinancial] = React.useState(summaryCalculator.FinancialInfo);\r\n    const packageCost = packageData.financial.msrp;\r\n    const { t, i18n } = useTranslation(['packages', 'general']);\r\n\tconst [expandedIndex, setExpandedIndex] = React.useState(null);\r\n\tconst collapseRef = useRef(null);\r\n\tconst [toggle, setToggle] = React.useState(false);\r\n\tconst isExpanded = false;\r\n\t    \r\n\tfunction getConnectivityPackageDesc(){\r\n\t\tlet packageDesc;\r\n\r\n\t\t/*if(packageArr && packageArr.length === 0){\r\n\t\t\tpackageDesc=packageData.description;\r\n\t\t}else{\r\n\t\t\tpackageDesc= packageData.features.map((feature, index) => {return `<li class=\"package-card__list-item\" key=${index}>${feature.content}</li>`});\r\n\t\t\tpackageDesc = `<ul class=\"package-card__list\">${packageDesc.join('')}</ul>`;\r\n\t\t}*/\r\n\t\t//\r\n\r\n\t\tpackageDesc= `<li class=\"package-card__list-item\" >${packageData.title}</li>`;\r\n\t\tpackageDesc = `<ul class=\"package-card__list\">${packageData.subtitle}</ul>`;\t\t\r\n\t\treturn packageDesc;\r\n\t}\r\n\r\n\tfunction getPackageDesc(){\r\n\t\tlet packageArr=packageData.features;\r\n\t\tlet packageDesc;\r\n\r\n\t\tif(packageArr && packageArr.length === 0){\r\n\t\t\tpackageDesc=packageData.description;\r\n\t\t}else{\r\n\t\t\tpackageDesc= packageData.features.map((feature, index) => {return `<li class=\"package-card__list-item\" key=${index}>${feature.content}</li>`});\r\n\t\t\tpackageDesc = `<ul class=\"package-card__list\">${packageDesc.join('')}</ul>`;\r\n\t\t}\r\n\r\n\t\treturn packageDesc;\r\n\t}\r\n\r\n\t// DO NOT REMOVE THIS IS USED TO REFRESH WHEN AN ENGINE AND DRIVETRAIN GET SELECTED\r\n\tuseEffect(() =>{\r\n\t\tsetPackageData(Package);\r\n\r\n\t\tconst collapse = collapseRef.current; \r\n        if(typeof window.mzAnimator === 'object' ){\r\n            window.mzAnimator.animateHeight(collapse, 'PackageList' + Index, 'init', toggle)\r\n        }\r\n\t}, [Package]);\r\n    \r\n    useEffect(() =>{\r\n        const collapse = collapseRef.current;\r\n        window.mzAnimator.animateHeight(collapse, 'PackageList' + Index, toggle)\r\n   },[toggle]);\r\n\r\n    async function setSelectedPackage(index) {\r\n        await HandleSelectedPackage(index);\r\n    }\r\n\r\n    async function removeSelectedPackage(index) {\r\n        await HandleRemovePackage(index);\r\n    }\r\n\r\n\tfunction handleCollapse(e){\r\n\t\t\tconst $el = e.target;\r\n\r\n\t\t\tif (isExpanded !== null && expandedIndex !== null && Index !== null) {\r\n\t\t\t\tif (isExpanded === true) {\r\n\t\t\t\t\tsetExpandedIndex(null);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsetExpandedIndex(Index);\r\n\t\t\t\t\tsetTimeout(()=>{\r\n\t\t\t\t\t\tconst collapseTarget = e.target.closest('.mz-collapse');\r\n\t\t\t\t\t\tif(collapseTarget){\r\n\t\t\t\t\t\t\tconst scrollWindow = document.querySelector('.mz-package-page__package-card-list');\r\n\t\t\t\t\t\t\tconst topScroll = collapseTarget.offsetTop;\r\n\t\t\t\t\t\t\tscrollWindow.scroll({\r\n\t\t\t\t\t\t\t  top:topScroll,\r\n\t\t\t\t\t\t\t  behavior: 'smooth'\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},100);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tsetToggle(!toggle);\r\n\t\t\t}\r\n\t}\r\n\tconst showPrice = ()=>{\r\n\t\tlet spanCont;\r\n\t\tif(isUniversal){\r\n\t\t\treturn (<p className=\"package-card__price noUpper\">{t('warrantyDisclaimer')}</p>);\r\n\t\t}else{\r\n\t\t\tif(packageCost!==null && displayPriceCalculation){\r\n\t\t\t\tspanCont = showFinancePrice?\r\n\t\t\t\t\t\t`(${getFinanceWeekly(packageCost, financial.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].aprRate, financial.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].term)}${t(\"general:week\")})`:\r\n\t\t\t\t\t\t!window.hideLeaseInCard ? `(${getLeaseBiWeeklyFromMsrp(packageCost, financial.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].leaseRate, financial.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].term)}${t(\"general:bi_week\")})` : ''\r\n\t\t\t}\r\n\t\t\tif(packageCost!==null && displayConnectedServicePriceCalculation) {\r\n\t\t\t\tspanCont = showFinancePrice?\r\n\t\t\t\t\t\t`(${getFinanceWeekly(packageCost, financial.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].aprRate, financial.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].term)}${t(\"general:week\")})`:\r\n\t\t\t\t\t\t`(${getLeaseBiWeeklyFromOptions(packageCost, financial.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].leaseRate, financial.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].term)}${t(\"general:bi_week\")})`\r\n\r\n\t\t\t}\r\n\t\t\treturn(<p className=\"package-card__price\">+&nbsp;{formatPrice(packageCost)} <span>{spanCont}</span></p>);\r\n\t\t}\r\n\t}\r\n\r\n    return (\r\n\t\t<div className={`mz-collapse package-card ${Selected ? 'mz-collapse-selected selected' : ''}`}>\r\n            <div\r\n                onClick={handleCollapse}\r\n                className=\"mz-collapse__button\"\r\n            >\t\r\n\t\t\t\t{Selected && !ButSelectedContent &&\r\n\t\t\t\t\t<div className=\"mz-check-indicator\"><i className=\"mz-svg mz-svg--white mz-svg-checkmark\"></i></div>\r\n\t\t\t\t}\r\n\t\t\t\t{Package.popular===1 && <div className=\"package-card__popular label\">{PopContent}</div>}\r\n\t\t\t\t<h3 className=\"package-card__title\">{packageData.name}</h3>\r\n\t\t\t\t{!HasCollapse && <div>{ReactHtmlParser(displayConnectedServicePriceCalculation ? getConnectivityPackageDesc() : getPackageDesc())}</div>}\r\n\t\t\t\t{showPrice()}\r\n\t\t\t\t{HasCollapse && <><i className={`mz-svg mz-svg-chevron ${toggle ? 'mz-svg--rotate270':''}`}></i>\r\n\t\t\t\t<hr /></>}\r\n\t\t\t</div>\r\n\t\t\t{HasCollapse && <div className=\"mz-collapse__box\" ref={collapseRef}>{ReactHtmlParser(getPackageDesc())}</div>}\r\n\t\t\t<div>\r\n\t\t\t\t{Selected ? \r\n\t\t\t\t\tButSelectedContent ? \r\n\t\t\t\t\t\t<button className=\"mz-btn mz-btn--primary package-card__button\" onClick={()=>removeSelectedPackage(Index)}><span>{ButSelectedContent}</span></button>  \r\n\t\t\t\t\t: \r\n\t\t\t\t\t\t<button className=\"mz-btn mz-btn--primary package-card__button\" onClick={()=>removeSelectedPackage(Index)}><span>{t(\"button_remove_package\")}</span></button> \r\n\t\t\t\t: \r\n\t\t\t\t\tButContent ?\r\n\t\t\t\t\t\t<button className=\"mz-btn mz-btn--primary mz-btn--red package-card__button\" onClick={()=>{setSelectedPackage(Index);}}><span>{ButContent}</span></button>\r\n\t\t\t\t\t:\r\n\t\t\t\t\t<button  className=\"mz-btn mz-btn--primary mz-btn--red package-card__button\"  onClick={()=>{setSelectedPackage(Index);}}>\r\n\t\t\t\t\t\t<span>{t(\"button_select_package\")}</span>\r\n\t\t\t\t\t</button>\r\n\t\t\t\t}\r\n\t\t\t</div>\r\n\t\t</div>\r\n    )\r\n}\r\n\r\n\r\nexport default PackageCard;\r\n\r\nPackageCard.propTypes = {\r\n    HandleSelectedPackage: PropTypes.func,\r\n    HandleRemovePackage:  PropTypes.func,\r\n}\r\n\r\nPackageCard.defaultProps = {\r\n    HandleSelectedPackage: () => {},\r\n    HandleRemovePackage: () => {},\r\n};","import React, { useState }  from 'react';\r\nimport { useNavigate, useParams } from 'react-router-dom'\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { get360Data, goToTop, getLoading, setCursorWaiting, hideCmsHiddenBlock} from '../../../utils';\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport NavHelper from '../../../Helpers/navhelper';\r\n\r\nimport Button from '../../1_Atoms/Button/Button';\r\nimport EngineCard from '../../2_Molecules/EngineCard/EngineCard';\r\nimport ThreeSixtyContainer from '../../3_Organisms/360Container/360Container';\r\nimport { Nav } from '../../3_Organisms/Nav/Nav';\r\nimport { Pricing } from '../../3_Organisms/Pricing/Pricing';\r\nimport { Modal } from '../../3_Organisms/Modal/Modal';\r\nimport { PreOrderModal } from '../../3_Organisms/Modal/PreOrderModal';\r\nimport PackageCard from '../../2_Molecules/PackageCard/PackageCard';\r\nimport { Alert } from '../../3_Organisms/Alert/Alert';\r\n\r\nexport const Options = (...props) => {\r\n    const summaryCalculator = window.summaryCalculator;\r\n    const [loading, setLoading] = useState(true);\r\n    const [is360Loading, setIs360Loading] = useState(true);    \r\n    const [firstEmptyDataLoad, setFirstEmptyDataLoad] = useState(false);\r\n    const [dataNeedUpdate, setDataNeedUpdate] = useState(false);\r\n    const [selectedModelIndex, setSelectedModelIndex] = useState(summaryCalculator.SelectedModelIndex);\r\n    const [showFinancePrice, setShowFinancePrice] = React.useState(summaryCalculator.ShowFinancePrice);\r\n    const { year, carline, trim, model, option } = useParams();    \r\n    const listRef = React.useRef();\r\n    const [nav, setNav] = React.useState(null);\r\n    const navigate = useNavigate();\r\n    const legalContent = JSON.parse(sessionStorage.getItem(Constants.LegalOption));\r\n    const [legalModalOpen, setLegalModalOpen] = React.useState(false);\r\n    const [images, setImages] = React.useState({});\r\n    const { t, i18n } = useTranslation(['options', 'general']);\r\n\r\n    const [preorderOpen, setPreorderModalOpen] = React.useState(false);\r\n    \r\n\tconst gtmHelper = new GTMHelper();\r\n\tconst navHelper = new NavHelper();\r\n\r\n    hideCmsHiddenBlock();\r\n\r\n    function set360images() {\r\n        if(!summaryCalculator.Colours)\r\n            return;\r\n        \r\n        if (!Object.keys(images).length) {\r\n            summaryCalculator.SetSelectedColorsFromParams();\r\n\r\n            if (summaryCalculator.SelectedColourExteriorIndex > -1 && summaryCalculator.Colours) {\r\n                const extArray = Object.entries(summaryCalculator.Colours.visual.exteriors);\r\n                setImages(get360Data(summaryCalculator.Colours.visual, extArray[summaryCalculator.SelectedColourExteriorIndex][1], summaryCalculator.Colours.visual.interiors[summaryCalculator.SelectedColourInteriorIndex]));\r\n                setIs360Loading(false);\r\n            } else if (summaryCalculator.AvailableTrim) {\r\n                setImages(get360Data(summaryCalculator.AvailableTrim.trims[summaryCalculator.SelectedTrimIndex].visual));\r\n                setIs360Loading(false);\r\n            } else if (summaryCalculator.EngineAndDrivetrain) {\r\n                setImages(get360Data(summaryCalculator.SelectedModel.visual));\r\n                setIs360Loading(false);\r\n            }\r\n        }\r\n    }\r\n\r\n    summaryCalculator.CurrentStep = 2;\r\n\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n    React.useEffect(() => {\r\n        async function executeTasks() {\r\n            if (window.bnp_under_maintenance)\r\n                return;\r\n\r\n            if (!firstEmptyDataLoad) {\r\n                setFirstEmptyDataLoad(true);\r\n\r\n                if (!summaryCalculator.isDataLoaded()) {\r\n                    summaryCalculator.reset(false);\r\n\r\n                    if(model || option) {\r\n                        console.log('has package ', model, option);\r\n                        await summaryCalculator.loadVehicleData(year, carline, trim, model, option);                    \r\n                    } else {\r\n                        await summaryCalculator.loadVehicleData(year, carline, trim);\r\n                    }\r\n\r\n                    if (JSON.parse(sessionStorage.getItem(Constants.HasFinancialProviderError)) === true) {\r\n                        const vehiclePageUri = `/${decodeURI(window.location.search)}`;\r\n                        navigate(vehiclePageUri)\r\n                    }\r\n                }\r\n\r\n                setSelectedModelIndex(summaryCalculator.SelectedModelIndex);\r\n\r\n                setDataNeedUpdate(true);\r\n\r\n                setNav(null);\r\n\r\n                setLoading(false);\r\n            }\r\n\r\n            if (!loading) {\r\n                if (dataNeedUpdate) {\r\n                    setDataNeedUpdate(false);\r\n\r\n                    setLoading(true);\r\n\r\n                    if (selectedModelIndex !== summaryCalculator.SelectedModelIndex) {\r\n                        setCursorWaiting(true);\r\n                        await summaryCalculator.setSelectedModelIndex(selectedModelIndex);\r\n\r\n                        await summaryCalculator.updateSingleLineFromFinancialProvider();\r\n\r\n                        updateAddressBar();\r\n\r\n\t\t\t\t\t\tgtmHelper.setGTM({'action':'Model Change'}, false, false);\r\n\r\n                        setCursorWaiting(false);\r\n                    } \r\n                    else {\r\n                        if (model && option) {\r\n                            console.log('has package ', model, option);\r\n    \r\n                            await summaryCalculator.loadVehicleData(year, carline, trim, model, option);\r\n                        }\r\n                    }\r\n\r\n\r\n                    set360images();\r\n\r\n                    const toRender = navHelper.getNavContent(t);\r\n                    setNav(toRender);\r\n\r\n                    setLoading(false);\r\n                }\r\n            }\r\n\r\n            if (listRef.current) {\r\n                window.removeEventListener('resize', setListMaxHeight);\r\n                window.addEventListener('resize', setListMaxHeight);\r\n                setListMaxHeight();\r\n            }\r\n        }\r\n\r\n        executeTasks();\r\n    }, [nav, carline, summaryCalculator, loading, dataNeedUpdate, showFinancePrice, is360Loading, selectedModelIndex]);\r\n\r\n    function updateAddressBar() {\r\n        const lang = document.querySelector('meta[name=\"data-language\"]') ? document.querySelector('meta[name=\"data-language\"]').content === 'en' ? 'en' : 'fr' : 'en';\r\n        const province = document.querySelector('meta[name=\"data-region\"]') ? document.querySelector('meta[name=\"data-region\"]').content : 'on';        \r\n        const urlPrefix = window.location.hostname === 'localhost' ? '' : lang === 'en' ? '/en/shopping/build-and-price' : '/fr/magasiner/construction-et-prix/';\r\n        const url = `${urlPrefix}/#/${year}/${carline}/${trim}/${summaryCalculator.SelectedModel.model_code}/${summaryCalculator.SelectedPackage.option_code}?prov_code=${province}&lang_code=${lang}`;\r\n        //history.replaceState('', 'React App', url);\r\n        window.history.replaceState(null, 'React App', url);\r\n    }\r\n\r\n    React.useEffect(() => {\r\n        // Redraw the 360 images\r\n        set360images();\r\n    }, [images]);\r\n\r\n    async function handleSelectedPackage(index) {\r\n        setCursorWaiting(true);\r\n\r\n        await summaryCalculator.setSelectedPackageIndex(index);\r\n\r\n        // This is a patch for the MX5 package selection\r\n        await summaryCalculator.loadColours(year, carline, trim, summaryCalculator.SelectedModel.model_code, summaryCalculator.SelectedPackage.option_code);\r\n\r\n        // Added these two call as wheels and accessories a package dependant\r\n        await summaryCalculator.loadWheels(year, carline, trim, summaryCalculator.SelectedModel.model_code, summaryCalculator.SelectedPackage.option_code);\r\n        await summaryCalculator.loadAccessories(year, carline, trim, summaryCalculator.SelectedModel.model_code, summaryCalculator.SelectedPackage.option_code);\r\n\r\n        await summaryCalculator.updateSingleLineFromFinancialProvider();\r\n\r\n        //setSelectedPackageIndex(index);\r\n\t\tgtmHelper.setGTM({'action':'Package Add', 'package': summaryCalculator.SelectedPackage.option_code}, false, false);\r\n\r\n        const toRender = navHelper.getNavContent(t);\r\n        setNav(toRender);\r\n\r\n        updateAddressBar();\r\n\r\n        // Refresh the 360 images\r\n        setImages({});\r\n\r\n        setCursorWaiting(false);\r\n    }\r\n\r\n    async function handleRemovePackage(index) {\r\n        setCursorWaiting(true);\r\n\r\n\t\tgtmHelper.setGTM({'action':'Package Remove', 'package': summaryCalculator.SelectedPackage.option_code}, true, false);\r\n\r\n        await summaryCalculator.setSelectedPackageIndex(null);\r\n\r\n        // This is a patch for the MX5 package selection\r\n        await summaryCalculator.loadColours(year, carline, trim, summaryCalculator.SelectedModel.model_code, summaryCalculator.SelectedPackage.option_code);\r\n\r\n        // Added these two call as wheels and accessories a package dependant\r\n        await summaryCalculator.loadWheels(year, carline, trim, summaryCalculator.SelectedModel.model_code, summaryCalculator.SelectedPackage.option_code);\r\n        await summaryCalculator.loadAccessories(year, carline, trim, summaryCalculator.SelectedModel.model_code, summaryCalculator.SelectedPackage.option_code);\r\n\r\n        await summaryCalculator.updateSingleLineFromFinancialProvider();\r\n\r\n        const toRender = navHelper.getNavContent(t);\r\n        setNav(toRender);\r\n\r\n        updateAddressBar();\r\n\r\n        // Refresh the 360 images\r\n        setImages({});\r\n\r\n        setCursorWaiting(false);\r\n\r\n    } \r\n        \r\n    function handleSelectedModel(index) {\r\n        setCursorWaiting(true);\r\n\r\n        setImages({});\r\n\r\n        setSelectedModelIndex(index);\r\n\r\n        setDataNeedUpdate(true);\r\n\r\n        updateAddressBar();\r\n\r\n        setNav(null);\r\n\r\n        setCursorWaiting(false);\r\n    }\r\n\r\n    function nextStep() {\r\n        if (summaryCalculator.SelectedModel) {\r\n            goToTop();\r\n            navigate(`/${year}/${carline}/${trim}/${summaryCalculator.SelectedModel.model_code}/${summaryCalculator.SelectedModel.option_code}/colours${decodeURI(window.location.search)}`);\r\n        } else {\r\n            goToTop();\r\n            navigate(`/${year}/${carline}/${trim}/${summaryCalculator.EngineAndDrivetrain.models[0].financial.based_on.model_code}/${summaryCalculator.EngineAndDrivetrain.models[0].financial.based_on.option_code}/colours${decodeURI(window.location.search)}`);\r\n        }\r\n\t\tgtmHelper.setGTM({'action':'Next Step'}, true , false);\r\n    }\r\n\r\n\tfunction setListMaxHeight(){\r\n        if (listRef.current)\r\n            if (window.innerWidth < 1025) {\r\n                listRef.current.style.maxHeight = 'unset';\r\n            } else {\r\n                const incentivebar = document.querySelector('.mz-alert__item'); // Red alert bar\r\n\t\t\t\tconst submenu=document.querySelector(\".mz-sticky-submenu\");\r\n\t\t\t\tconst pricingBar=\r\n                listRef.current.style.height = `${window.innerHeight - (submenu?.offsetTop + document.querySelector(\".mz-sticky-submenu\")?.offsetHeight + document.querySelector(\".mz-pricing\")?.offsetHeight  + (incentivebar ? incentivebar.offsetHeight : 0) + 40)}px`;\r\n\t\t\t\tif(!submenu || !pricingBar){\r\n\t\t\t\t\tsetTimeout(setListMaxHeight, 100);\r\n\t\t\t\t}\r\n            }\r\n\r\n    }\r\n\r\n    function handleShowFinanceClick(value) {\r\n        setShowFinancePrice(value);\r\n    }\r\n\r\n    return (\r\n        <>\r\n        {getLoading(loading, t)}\r\n        <div className=\"mz-engine-and-drivetrain-page mz-top-nav-spacing grid-no-gutter-sm\">\r\n            <Nav nav={nav} />\r\n            <Alert />\r\n\r\n            {summaryCalculator.EngineAndDrivetrain?.models?.length ?\r\n                <div key='0' className=\"mz-full-width mz-engine-and-drivetrain-page__content general-content\">\r\n                    <div className=\"mz-engine-and-drivetrain-page__content-left\">\r\n                        <ThreeSixtyContainer imagePathInterior={images.imagePathInterior} imagePath={images.imagePath} imageAmount={images.imageAmount} imageName={images.imageName} trimName={summaryCalculator.VehicleTitle} imageIsLoading={is360Loading} />\r\n                    </div>\r\n                    <div className=\"mz-engine-and-drivetrain-page__content-right\">\r\n                        <div className=\"mz-engine-and-drivetrain-page__engine-card-list\" ref={listRef}>\r\n                            <h5 className='mz-engine-and-drivetrain-page__engine-card-list-title'>{t(\"select_engine_and_drivetrain\")}</h5>\r\n                            {summaryCalculator.displayWarning() ? <div className={`mz-alert-message`}>\r\n                                <i className=\"mz-svg mz-svg-warning mz-svg--red\"></i>&nbsp;\r\n                                <span className=\"mz-alert-message__text\">{t(\"warning_change_selection\")}</span>\r\n                            </div> : null}\r\n                            {summaryCalculator.EngineAndDrivetrain?.models.map((Model, index) => <EngineCard Model={Model} Selected={summaryCalculator.SelectedModelIndex === index} HandleSelectedModel={handleSelectedModel} Index={index} key={index} showFinancePrice={showFinancePrice}></EngineCard>)}\r\n\r\n                            {summaryCalculator.Packages ? summaryCalculator.Packages.packages.filter(pack => pack.type === 'model_option_package').length ? <hr className=\"mz-package-page__content-separator\" /> : null : null}\r\n                            {summaryCalculator.Packages ? summaryCalculator.Packages.packages.filter(pack => pack.type === 'model_option_package').length > 0 && <h2 className='mz-package-page__package-card-list-title'>{t(\"packages:available_packages\")}</h2> : null}\r\n                            {summaryCalculator.Packages ? summaryCalculator.Packages.packages.filter(pack => pack.type === 'model_option_package').map((Package, index) =>      <PackageCard Package={Package} Selected={summaryCalculator.SelectedPackageIndex === index}\r\n\t\t\t\t\t\t\tSelectedIndex={summaryCalculator.SelectedPackageIndex === index?summaryCalculator.SelectedPackageIndex:''} HandleSelectedPackage={handleSelectedPackage} HandleRemovePackage={handleRemovePackage} Index={index} key={index} showFinancePrice={showFinancePrice}></PackageCard>)  : null}\r\n\r\n\r\n                            <div className=\"mz-legal mz-mobile\">\r\n                                <Button\r\n                                    className=\"mz-btn mz-btn--legal text--grey\"\r\n                                    label={t(\"general:legal\")}\r\n                                    backgroundColor=\"grey\"\r\n                                    colour=\"grey\"\r\n                                    icon={true}\r\n                                    iconAfter={true}\r\n                                    svg_className=\"\"\r\n                                    svg_list=\"plus\"\r\n                                    size={0.6}\r\n                                    onClick={() => {\r\n\t\t\t\t\t\t\t\t\t\tdocument.querySelector('body').classList.add('disabled');\r\n\t\t\t\t\t\t\t\t\t\tsetLegalModalOpen(true)\r\n\t\t\t\t\t\t\t\t\t}}\r\n                                />\r\n                            </div>\r\n                        </div>                    \r\n                    </div>\r\n                </div>\r\n                : null}\r\n\r\n            {summaryCalculator.EngineAndDrivetrain?.models?.length && summaryCalculator.SelectedModel ?\r\n                <Pricing builtLabel={t(\"general:price_as_built\")} builtPrice=\"$\" loanLabel={t(\"general:loan_label\")} loanPrice=\"$\" saveLabel={t(\"general:save_build\")}\r\n                    leaseLabel={t(\"general:show_lease_price\")} financeLabel={t(\"general:show_finance_price\")} buttonLabel={t(\"general:next_colour\")}\r\n                    HandleNextClick={nextStep} setLegalModalOpen={setLegalModalOpen} HandleShowFinanceClick={handleShowFinanceClick} setPreorderModalOpen={setPreorderModalOpen} /> : null}\r\n            <Modal modalContent={legalContent} isOpen={legalModalOpen} handleClose={setLegalModalOpen} modalId='legalModal' />\r\n            <PreOrderModal isOpen={preorderOpen} handleClose={setPreorderModalOpen}></PreOrderModal> \r\n        </div>\r\n        </>\r\n    )\r\n}\r\n\r\nexport default Options;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { formatPrice, getBaseUrl, getFinanceWeekly, getLeaseBiWeeklyFromOptions } from '../../../utils';\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nexport const ColourCard = ({ Colour, Disabled, Selected, HandleSelectedColour, isExterior, Index, showFinancePrice, ...props }) => {\r\n\r\n    const [colourData] = React.useState(Colour);\r\n    const [selected] = React.useState(Selected);\r\n    const financial = JSON.parse(sessionStorage.getItem(Constants.FinancialObj));\r\n    const financeTermIndex = parseInt(sessionStorage.getItem(Constants.FinanceTermIndex));\r\n    const leaseTermIndex = parseInt(sessionStorage.getItem(Constants.LeaseTermIndex));\r\n    const financeTerm = parseInt(sessionStorage.getItem(Constants.FinanceTerm));\r\n    const leaseTerm = parseInt(sessionStorage.getItem(Constants.LeaseTerm));\r\n    const { t, i18n } = useTranslation(['colours', 'general']);\r\n\r\n    function setSelectedColour(index) {\r\n        HandleSelectedColour(index)\r\n    }\r\n    const imagePath = getBaseUrl() + process.env.REACT_APP_BASIC_CONTENT_PATH;\r\n    const apiBasePath = process.env.API_URL_BASE_PATH;\r\n\r\n    return (\r\n        <button onClick={() =>{\r\n\t\t\tsetSelectedColour(Index);\r\n\r\n\t\t}} className={`colour-card ${Selected?'colour-card-selected':''}`} disabled={Disabled}>\r\n            {colourData ? <span className=\"colour-card__content\">\r\n                <img className=\"colour-card__img\" alt={colourData.description} src={`${imagePath}${colourData.thumbnail}`   } />\r\n                <span className={Selected ? \"colour-card__selected-indicator selected\" :  \"colour-card__selected-indicator\"}><i className=\"mz-svg mz-svg--white mz-svg-checkmark\"></i></span>\r\n                <span className=\"colour-card__info\">\r\n                    <span className=\"colour-card__title\"><span className='text--red font-bold'>{Colour.new ? ReactHtmlParser(t('new')) : ''}</span>{ReactHtmlParser(Colour.description)}</span>\r\n                    <span className=\"colour-card__price\">{Colour.price!==0?`+ ${formatPrice(Colour.price)}`:''} <span>{Colour.price!==0? \r\n                        `(${showFinancePrice?\r\n                            `${getFinanceWeekly(Colour.price, financial.calculatedFinance.financeValues[financeTermIndex].aprRate, financial.calculatedFinance.financeValues[financeTermIndex].term)}${t(\"general:week\")}`:\r\n                            `${getLeaseBiWeeklyFromOptions(Colour.price, financial.calculatedLease.leaseValues[leaseTermIndex].leaseRate, financial.calculatedLease.leaseValues[leaseTermIndex].term)}${t(\"general:bi_week\")}`})`:''}</span></span>\r\n                </span>\r\n            </span> : null}\r\n        </button>\r\n    )\r\n\r\n}\r\n\r\n\r\nexport default ColourCard;\r\n\r\nColourCard.propTypes = {\r\n    HandleSelectedColour: PropTypes.func,\r\n}\r\n\r\nColourCard.defaultProps = {\r\n    HandleSelectedColour: () => { },\r\n};","import React, { useState } from 'react';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { get360Data, goToTop, getLoading, setTabsNextAndPrevButtons, setCursorWaiting, hideCmsHiddenBlock } from '../../../utils';\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport NavHelper from '../../../Helpers/navhelper';\r\n\r\nimport Button from '../../1_Atoms/Button/Button';\r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\nimport CollapseLegal from '../../2_Molecules/Collapse/CollapseLegal';\r\nimport ColourCard from '../../2_Molecules/ColourCard/ColourCard';\r\nimport ThreeSixtyContainer from '../../3_Organisms/360Container/360Container';\r\nimport { Nav } from '../../3_Organisms/Nav/Nav';\r\nimport { PreOrderModal } from '../../3_Organisms/Modal/PreOrderModal';\r\nimport { Pricing } from '../../3_Organisms/Pricing/Pricing';\r\nimport { Modal } from '../../3_Organisms/Modal/Modal';\r\nimport { Alert } from '../../3_Organisms/Alert/Alert';\r\n\r\nexport const Colours = ({ ...props }) => {\r\n    const [loading, setLoading] = useState(true);\r\n    const [is360Loading, setIs360Loading] = useState(true);\r\n    const summaryCalculator = window.summaryCalculator;\r\n    let defaultInteriorColour = JSON.parse(sessionStorage.getItem(Constants.DefaultInteriorColour));\r\n    let defaultExteriorColour = JSON.parse(sessionStorage.getItem(Constants.DefaultExteriorColour));\r\n    const { year, carline, trim, model, packageCode } = useParams();\r\n    const [nav, setNav] = React.useState(null);\r\n    let extArray = null;\r\n    const [images, setImages] = React.useState({});\r\n    const navigate = useNavigate();\r\n    const listRef = React.useRef();\r\n    const legalContent = JSON.parse(sessionStorage.getItem(Constants.LegalColours));\r\n    const [legalModalOpen, setLegalModalOpen] = React.useState(false);\r\n    const { t, i18n } = useTranslation(['colours', 'general']);\r\n    const [selectedColourInteriorIndex, setSelectedColourInteriorIndex] = React.useState(null);\r\n    const [selectedColourExteriorIndex, setSelectedColourExteriorIndex] = React.useState(null);\r\n    const [showFinancePrice, setShowFinancePrice] = React.useState(summaryCalculator.ShowFinancePrice);\r\n\r\n    const [preorderOpen, setPreorderModalOpen] = React.useState(false);\r\n    \r\n\tconst gtmHelper = new GTMHelper();\r\n\tconst navHelper = new NavHelper();\r\n\r\n    hideCmsHiddenBlock();\r\n\r\n    summaryCalculator.CurrentStep = 3;\r\n\r\n    React.useEffect(() => {\r\n        const toRender = navHelper.getNavContent(t);\r\n        setNav(toRender);\r\n        \r\n        async function executeTasks() {\r\n            if (window.bnp_under_maintenance)\r\n                return;\r\n\r\n            if (!summaryCalculator.isDataLoaded()) {\r\n                await summaryCalculator.loadTrims(year, carline);\r\n\r\n                const trimIndex = summaryCalculator.AvailableTrim.trims.findIndex(obj => obj.trim_type.url_slug === trim);\r\n                await summaryCalculator.setSelectedTrimIndex(trimIndex);\r\n\r\n                setLoading(false);\r\n\r\n                setNav(null);\r\n            } else {\r\n                setLoading(false);\r\n            }\r\n\r\n            if (!loading) {\r\n                /*if (nav === null) {\r\n                    setNav(navHelper.getNavContent(year, carline, trim, model, packageCode, summaryCalculator.CurrentStep, t));\r\n                }*/\r\n\r\n                summaryCalculator.SetSelectedColorsFromParams();\r\n\r\n                if (summaryCalculator.SelectedColourInterior === null) {\r\n                    if (summaryCalculator.SelectedColourInteriorIndex !== null)\r\n                        summaryCalculator.SelectedColourInteriorIndex = summaryCalculator.SelectedColourInteriorIndex; // Added this for when the page is beeing ctrl-r\r\n                    else {\r\n                        defaultInteriorColour = summaryCalculator.Colours.visual.interiors[0];\r\n                        summaryCalculator.Colours.visual.interiors.map((Colour, index) => {\r\n                            if (defaultInteriorColour.id === Colour.id)\r\n                                summaryCalculator.SelectedColourInteriorIndex = index;\r\n                                setSelectedColourInteriorIndex(index);\r\n                        })\r\n                    }\r\n                }\r\n\r\n                if (summaryCalculator.SelectedColourExterior === null) {\r\n                    if (summaryCalculator.SelectedColourExteriorIndex !== null)\r\n                        summaryCalculator.SelectedColourExteriorIndex = summaryCalculator.SelectedColourExteriorIndex; // Added this for when the page is beeing ctrl-r\r\n                    else {\r\n                        defaultExteriorColour = defaultInteriorColour.default_exterior;\r\n                        Object.entries(summaryCalculator.Colours.visual.exteriors).map((Colour, index) => {\r\n                            if (defaultExteriorColour.id === Colour[1]['id'])\r\n                                summaryCalculator.SelectedColourExteriorIndex = index;\r\n                                setSelectedColourExteriorIndex(index);\r\n                        })\r\n                    }\r\n                }\r\n\r\n                if (summaryCalculator.SelectedColourExteriorIndex > -1 && summaryCalculator.Colours) {\r\n                    const extArray = Object.entries(summaryCalculator.Colours.visual.exteriors);\r\n                    setImages(get360Data(summaryCalculator.Colours.visual, extArray[summaryCalculator.SelectedColourExteriorIndex][1], summaryCalculator.Colours.visual.interiors[summaryCalculator.SelectedColourInteriorIndex]));\r\n                    setIs360Loading(false);\r\n                } else if (summaryCalculator.AvailableTrim) {\r\n                    setImages(get360Data(summaryCalculator.AvailableTrim.trims[summaryCalculator.SelectedTrimIndex].visual));\r\n                    setIs360Loading(false);\r\n                }\r\n            \r\n                showWarning();    \r\n            }\r\n        }\r\n\r\n\t\tif (listRef.current) {\r\n\t\t\tsetListMaxHeight();\r\n        }\r\n  \r\n        executeTasks();\r\n    }, [summaryCalculator, selectedColourExteriorIndex, selectedColourInteriorIndex, loading, is360Loading]);\r\n\r\n    React.useEffect(() => {\r\n        //console.log('360 loading');\r\n    }, [is360Loading]);\r\n    \r\n    function getAllowedExteriorsIds(exteriors) {\r\n        let allowedExteriors = [];\r\n        exteriors.forEach(exterior => {\r\n            allowedExteriors.push(exterior.id);\r\n        });\r\n        return allowedExteriors;\r\n    }\r\n\r\n    async function handleSelectedColourInterior(index) {\r\n        await summaryCalculator.setSelectedColourInteriorIndex(index);\r\n        setSelectedColourInteriorIndex(index);\r\n\t\tgtmHelper.setGTM({'action':'Interior Colour Change'}, false, false);\r\n\r\n        const allowedExteriors = getAllowedExteriorsIds(summaryCalculator.Colours.visual.interiors[index].allowed_exteriors);\r\n        summaryCalculator.AllowedColoursExterior = allowedExteriors\r\n        if (!allowedExteriors.includes(Object.entries(summaryCalculator.Colours.visual.exteriors)[summaryCalculator.SelectedColourExteriorIndex][1].id)) {\r\n            const defaultExteriorId = summaryCalculator.Colours.visual.interiors[index].default_exterior.id;\r\n            Object.entries(summaryCalculator.Colours.visual.exteriors).forEach(async (exterior, index) => {\r\n                if (exterior[1].id === defaultExteriorId) {\r\n                    await summaryCalculator.setSelectedColourExteriorIndex(index);\r\n                    setSelectedColourExteriorIndex(index);\r\n                }\r\n            })\r\n        }\r\n    }\r\n\r\n    async function handleSelectedColourExterior(index) {\r\n        setCursorWaiting(true);\r\n\r\n        setLoading(true);\r\n\r\n        await summaryCalculator.setSelectedColourExteriorIndex(index);\r\n        setSelectedColourExteriorIndex(index);\r\n\t\tgtmHelper.setGTM({'action':'Exterior Colour Change'}, false, false);\r\n\r\n        const images = get360Data(summaryCalculator.Colours.visual, extArray[index][1], summaryCalculator.Colours.visual.interiors[summaryCalculator.SelectedColourInteriorIndex]);\r\n        setImages(images);\r\n        setCursorWaiting(false);\r\n    }\r\n\r\n    function nextStep() {\r\n        goToTop();\r\n        navigate(`/${year}/${carline}/${trim}/${model}/${packageCode}/wheels${decodeURI(window.location.search)}`)\r\n\t\tgtmHelper.setGTM({'action':'Next Step'}, true , false);\r\n    }\r\n\r\n    function showWarning() {\r\n        let showWarningMessage = false;\r\n        Object.entries(summaryCalculator.Colours.visual.exteriors).map((Colour, index) => {\r\n            if (!summaryCalculator.AllowedColoursExterior.includes(Colour[1].id)) {\r\n                showWarningMessage = true;\r\n            }\r\n        });\r\n\t\tshowWarningMessage = true;\r\n        return showWarningMessage;\r\n\r\n    }\r\n\r\n    function setListMaxHeight() {\r\n        if (listRef.current){\r\n            if (window.innerWidth < 1025) {\r\n                listRef.current.style.maxHeight = 'unset';\r\n                listRef.current.style.overflow = 'auto';\r\n            } else {\r\n                const incentivebar = document.querySelector('.mz-alert__item'); // Red alert bar\r\n\r\n                listRef.current.style.height = `${window.innerHeight - (document.querySelector(\".mz-sticky-submenu\")?.offsetTop + document.querySelector(\".mz-sticky-submenu\")?.offsetHeight + document.querySelector(\".mz-pricing\")?.offsetHeight + (incentivebar ? incentivebar.offsetHeight : 0) + 50)}px`;\r\n                listRef.current.style.overflow = 'auto';\r\n            }\r\n\t\t}\r\n\r\n\t}\r\n\r\n    function handleShowFinanceClick(value) {\r\n        setShowFinancePrice(value);\r\n    }\r\n\r\n    if (summaryCalculator.Colours && summaryCalculator.Colours.visual) {\r\n        extArray = Object.entries(summaryCalculator.Colours.visual.exteriors);\r\n    }\r\n\r\n    if (summaryCalculator.SelectedColourInterior !== null && summaryCalculator.Colours && summaryCalculator.AllowedColoursExterior.length === 0) {\r\n        const allowedExteriors = getAllowedExteriorsIds(summaryCalculator.Colours.visual.interiors[summaryCalculator.SelectedColourInteriorIndex].allowed_exteriors);\r\n        summaryCalculator.AllowedColoursExterior = allowedExteriors;\r\n    }\r\n\r\n\twindow.addEventListener('resize', setListMaxHeight);\r\n\r\n    return (\r\n        <>\r\n        {getLoading(loading, t)}\r\n        <div className=\"mz-colours-page mz-top-nav-spacing grid-no-gutter-sm\">\r\n            <Nav nav={nav} />\r\n            <Alert />\r\n\r\n            {summaryCalculator.Colours?.visual ?\r\n                <div key='0' className=\"mz-full-width mz-colours-page__content general-content\">\r\n                    <div className=\"mz-colours-page__content-left\">\r\n                        {images.imagePathInterior ?\r\n                            <ThreeSixtyContainer imagePathInterior={images.imagePathInterior} imagePath={images.imagePath} imageAmount={images.imageAmount} imageName={images.imageName} trimName={summaryCalculator.VehicleTitle} imageIsLoading={is360Loading}  /> : <></>}\r\n                    </div>\r\n                    <div className=\"mz-colours-page__content-right right-container\">\r\n\r\n                        <div className=\"mz-colours-page__package-card-list right-container\" ref={listRef}>\r\n\t\t\t\t\t\t\t<h5 className='mz-colours-page__package-card-list-title'>{t(\"select_exterior_colour\")}</h5>\r\n                            {showWarning() ? <div className=\"mz-alert-message paragraph paragraph--tight\">\r\n                                <i className=\"mz-svg mz-svg-warning mz-svg--red\"></i>\r\n                                <span className=\"mz-alert-message__text\">{t(\"general:warning_change_color_selection\")}</span>\r\n                            </div> : null}\r\n                            <div className='mz-colours-page__package-card-list-container'>\r\n                                {Object.entries(summaryCalculator.Colours.visual.exteriors).map((Colour, index) => <ColourCard Colour={Colour[1]} Selected={summaryCalculator.SelectedColourExteriorIndex === index} HandleSelectedColour={handleSelectedColourExterior}\r\n\t\t\t\t\t\t\t\tisExterior={true} Index={index} key={index} Disabled={!summaryCalculator.AllowedColoursExterior.includes(Colour[1].id)} showFinancePrice={showFinancePrice}></ColourCard>)}\r\n                            </div>\r\n                            <hr className='mz-colours-page__package-card-list-separator' />\r\n\t\t\t\t\t\t\t<h5 className='mz-colours-page__package-card-list-title'>{t(\"select_interior_colour\")}</h5>\r\n                            <div className='mz-colours-page__package-card-list-container'>\r\n                                {summaryCalculator.Colours.visual.interiors.map((Colour, index) => <ColourCard Colour={Colour} Selected={summaryCalculator.SelectedColourInteriorIndex === index}\r\n\t\t\t\t\t\t\t\tisExterior={false} HandleSelectedColour={handleSelectedColourInterior} Index={index} key={index} showFinancePrice={showFinancePrice}></ColourCard>)}\r\n                            </div>\r\n\r\n                            <div className=\"mz-legal mz-mobile\">\r\n                                <Button\r\n                                    className=\"mz-btn mz-btn--legal text--grey\"\r\n                                    label={t(\"general:legal\")}\r\n                                    backgroundColor=\"grey\"\r\n                                    colour=\"grey\"\r\n                                    icon={true}\r\n                                    iconAfter={true}\r\n                                    svg_className=\"\"\r\n                                    svg_list=\"plus\"\r\n                                    size={0.6}\r\n                                    onClick={() => {\r\n\t\t\t\t\t\t\t\t\t\tdocument.querySelector('body').classList.add('disabled');\r\n\t\t\t\t\t\t\t\t\t\tsetLegalModalOpen(true)\r\n\t\t\t\t\t\t\t\t\t}}\r\n                                />\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n                : null}\r\n            {summaryCalculator.Colours?.visual ?\r\n                <Pricing builtLabel={t(\"general:price_as_built\")} builtPrice=\"$\" loanLabel={t(\"general:loan_label\")} loanPrice=\"$\" saveLabel={t(\"general:save_build\")}\r\n                    leaseLabel={t(\"general:show_lease_price\")} financeLabel={t(\"general:show_finance_price\")} buttonLabel={t(\"general:next_wheel\")} summaryCalculator={summaryCalculator}\r\n                    HandleNextClick={nextStep} setLegalModalOpen={setLegalModalOpen} HandleShowFinanceClick={handleShowFinanceClick} setPreorderModalOpen={setPreorderModalOpen} /> : null}\r\n            <Modal modalContent={legalContent} isOpen={legalModalOpen} handleClose={setLegalModalOpen} modalId='legalModal' />\r\n            <PreOrderModal isOpen={preorderOpen} handleClose={setPreorderModalOpen}></PreOrderModal> \r\n        </div>\r\n        </>\r\n    )\r\n}\r\n\r\nexport default Colours;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nimport { getLang, formatPrice, getBaseUrl, getFinanceWeekly, getLeaseBiWeeklyFromOptions, getDisplayableProvinceName } from '../../../utils';\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\n\r\nimport { Tooltip } from '../../1_Atoms/Tooltip/Tooltip';\r\n\r\nexport const WheelCard = ({ Wheel, Disabled, Selected, HandleSelectedWheel, Index, showFinancePrice, ...props }) => {\r\n    const [selected] = React.useState(Selected);\r\n    const financial = JSON.parse(sessionStorage.getItem(Constants.FinancialObj));\r\n    const financeTermIndex = parseInt(sessionStorage.getItem(Constants.FinanceTermIndex));\r\n    const leaseTermIndex = parseInt(sessionStorage.getItem(Constants.LeaseTermIndex));\r\n    const financeTerm = parseInt(sessionStorage.getItem(Constants.FinanceTerm));\r\n    const leaseTerm = parseInt(sessionStorage.getItem(Constants.LeaseTerm));\r\n    const { t, i18n } = useTranslation(['wheels', 'general']);\r\n\r\n    const imagePath = getBaseUrl() + process.env.REACT_APP_BASIC_CONTENT_PATH;\r\n\r\n    function setSelectedWheel() {\r\n        if (Selected) {\r\n            HandleSelectedWheel(null)\r\n        } else {\r\n            HandleSelectedWheel(Wheel.index)\r\n        }\r\n    }\r\n\r\n    function getTotalCost(wheel) {\r\n        if(!wheel)\r\n            return;\r\n\r\n        let total = wheel.price;\r\n            total += wheel.install_cost ? wheel.install_cost : 0; \r\n            total += wheel.tpms ? wheel.tpms : 0;\r\n        \r\n        return formatPrice(total, true);\r\n    }\r\n\r\n    function getTooltipText(wheel) {\r\n        const lang = getLang();\r\n        const languageText = lang === 'en' ? 'This price includes:' : 'Ce prix inclut :';\r\n        const basePrice = lang === 'en' ? `4 x ${wheel.title}: ` : `4 x ${wheel.title} : `\r\n        const tpmsText = lang === 'en' ? `4 x Tire Pressure Monitoring System sensors` : `4 capteurs pour le système de surveillance de la pression des pneus`;\r\n        const installText = lang === 'en' ? `Installation (based on average labour rates in ${getDisplayableProvinceName()})` : `Installation (calculée en fonction des frais de main-d’œuvre moyens chez les détaillants ${getDisplayableProvinceName()})`;\r\n        const totalText = lang === 'en' ? `Total price` : `Prix total`;\r\n\r\n        const totalCost = wheel.price //getTotalCost(wheel);\r\n\r\n        let text = wheel.tpms && wheel.install_cost ? `${languageText}` : ``;\r\n            text += wheel.base_msrp ?  `<br>${basePrice}${formatPrice(wheel.base_msrp, true)}` : ''; \r\n            text += wheel.tpms ? `<br>${tpmsText} : ${formatPrice(wheel.tpms, true)}` : '';\r\n            text += wheel.install_cost ? `<br>${installText} : ${formatPrice(wheel.install_cost, true)}` : '';\r\n            text += wheel.install_cost ? `<hr>${totalText} : ${formatPrice(totalCost, true)}` : ``;\r\n\r\n        return text;\r\n    }\r\n\r\n    return (\r\n        <button onClick={() => setSelectedWheel()} className={`wheel-card ${Selected ? 'wheel-card-selected' : ''}`} disabled={Disabled}>\r\n            {Wheel ? <span className=\"wheel-card__content\">\r\n                <img className=\"wheel-card__img\" alt={Wheel.name} src={`${imagePath}/wheels/${Wheel.image.thumbnail}`} />\r\n                <span className={Selected ? \"wheel-card__selected-indicator selected\" : \"wheel-card__selected-indicator\"}><i className=\"mz-svg mz-svg--white mz-svg-checkmark\"></i></span>\r\n                <span className=\"wheel-card__info\">\r\n                    <span className=\"wheel-card__title\">{Wheel.title}</span>\r\n                    <span className=\"wheel-card__price\">{Wheel.price !== 0 ? `+ ${formatPrice(Wheel.price)}` : ''} <span className=\"nowrap\">{Wheel.price !== 0 ?\r\n                        `(${showFinancePrice ?\r\n                            `${getFinanceWeekly(Wheel.price, financial.apr[financeTermIndex].rate, financial.apr[financeTermIndex].term)}${t(\"general:week\")}` :\r\n                            `${getLeaseBiWeeklyFromOptions(Wheel.price, financial.apr[leaseTermIndex].leaseRate, financial.apr[leaseTermIndex].term)}${t(\"general:bi_week\")}`})` : ''}\r\n                            {getTooltipText(Wheel) ? <Tooltip TooltipText={ReactHtmlParser(getTooltipText(Wheel))} /> : ``}</span>\r\n                    </span>\r\n\r\n                </span>\r\n            </span> : null}\r\n        </button>\r\n    )\r\n\r\n}\r\n\r\n\r\nexport default WheelCard;\r\n\r\nWheelCard.propTypes = {\r\n    HandleSelectedWheel: PropTypes.func,\r\n}\r\n\r\nWheelCard.defaultProps = {\r\n    HandleSelectedWheel: () => { },\r\n};","//tabs driven by core js.\r\n/* global mzFunc mzTabs */\r\n\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport WheelCard from '../../2_Molecules/WheelCard/WheelCard'\r\n\r\nexport const WheelsList = ({ Wheels, DisabledIndexes, SelectedIndex, HandleSelectedWheel, defaultWheelSize, showFinancePrice,...props }) => {\r\n    const hasDefaultWheelSize = (formatedData, defaultSize) => {\r\n        const hasKey = Number(defaultSize) in formatedData;\r\n        return hasKey;\r\n    }   \r\n\r\n\tconst { t, i18n } = useTranslation(['wheels']);\r\n    const [wheelsData, setWheelsData] = React.useState(parceWheelsData());\r\n    const [sizes] = React.useState(Object.keys(wheelsData));\r\n\r\n\tconst gtmHelper = new GTMHelper();\r\n\r\n    const initWheelTab = sessionStorage.getItem(Constants.SelectedWheelSize) ? sessionStorage.getItem(Constants.SelectedWheelSize) : defaultWheelSize ? String(defaultWheelSize) : sizes[0];\r\n\r\n    const [selectedWheelsSize, setSelectedWheelsSize] = React.useState(initWheelTab);\r\n    const [warningMessage, setWarningMessage] = React.useState(getWarningMessage(initWheelTab));\r\n    const summaryCalculator = window.summaryCalculator;\r\n    function handleSelectedWheel(index) {\r\n        HandleSelectedWheel(index);\r\n    }\r\n\r\n    function getWarningMessage(newSize) {\r\n        let newMessage = null;\r\n\r\n        if (!defaultWheelSize) return newMessage;\r\n\r\n        if (Number(newSize) > Number(defaultWheelSize)) {\r\n            i18n.language == \"en\" ? newMessage = `${newSize}″ ${t('wheel_def_pre')} ${t('wheel_def_large')} ${t('wheel_def_suff')}` : newMessage = `${t('wheel_def_pre')} ${newSize}″ ${t('wheel_def_large')} ${t('wheel_def_suff')}`\r\n        } else if (Number(newSize) < Number(defaultWheelSize)) {\r\n            i18n.language == \"en\" ? newMessage = `${newSize}″ ${t('wheel_def_pre')} ${t('wheel_def_small')} ${t('wheel_def_suff')}` : newMessage = `${t('wheel_def_pre')} ${newSize}″ ${t('wheel_def_small')} ${t('wheel_def_suff')}`\r\n        }\r\n\r\n        return newMessage;\r\n    }\r\n\r\n\r\n    function groupBy(xs, key) {\r\n        return xs.reduce(function (rv, x) {\r\n            (rv[x[key]] = rv[x[key]] || []).push(x);\r\n            return rv;\r\n        }, {});\r\n    };\r\n\r\n    function parceWheelsData() {\r\n        var data = [];\r\n        let formatedData = {};\r\n\r\n        for (const index in Wheels) {\r\n            data.push(Wheels[index]);\r\n        }\r\n        \r\n        data.forEach((wheel, index) => {\r\n            wheel.selected = SelectedIndex!==null?Number(SelectedIndex) === index:null;\r\n            wheel.disabled = DisabledIndexes.includes(index);\r\n            wheel.index = index;\r\n        })\r\n\r\n        if (data.length) {\r\n            formatedData = groupBy(data, 'size');\r\n        }\r\n\r\n        const HASDEFAULTWHEELSIZE = hasDefaultWheelSize(formatedData, defaultWheelSize);\r\n        // Add default wheel size array\r\n        if(defaultWheelSize !== 0 && !HASDEFAULTWHEELSIZE)    \r\n            formatedData[defaultWheelSize] = [];\r\n\r\n        return (formatedData);\r\n    }\r\n\r\n    const getWheelSizeSuffix = (size) => {\r\n        if (!size) return '';\r\n        let suffix = '\"';\r\n\r\n        if (defaultWheelSize && Number(size) === Number(defaultWheelSize)) {\r\n            suffix += t('wheel_size');\r\n        }\r\n\r\n        return suffix\r\n    }\r\n\r\n    React.useEffect(() => {\r\n        setWheelsData(parceWheelsData());\r\n\r\n\t\tif(typeof mzFunc === 'object' && typeof mzTabs === 'object'){\r\n\t\t\tmzFunc.waitForEl('.mzBuildandPrice .mz-tabs').then(function(components){mzTabs.init(components);});\r\n\t\t}\r\n\r\n    }, [Wheels]);\r\n\r\n    return (\r\n        <div className=\"wheels-list\">\r\n\t\t\t<div className=\"mz-tabs\">\r\n\t\t\t\t<div className=\"mz-tabs-menu\">\r\n\t\t\t\t\t<div className=\"mz-tabs-menu-container\">\r\n\t\t\t\t\t   <div className=\"mz-tabs-menu-inner\">\r\n                        {\r\n\t\t\t                sizes.map((size, key) => (\r\n\t\t\t                    <a\r\n\t\t\t                        className={size === selectedWheelsSize ? 'wheels-list__tab active' : 'wheels-list__tab'}\r\n\t\t\t                        onClick={() => {\r\n\t\t\t                            setSelectedWheelsSize(sizes[key]);\r\n\r\n\t\t\t                            sessionStorage.setItem(Constants.SelectedWheelSize, sizes[key]);\r\n\r\n                                        setWarningMessage(getWarningMessage(size));\r\n\r\n\t\t\t\t\t\t\t\t\t\tgtmHelper.setGTM({'action':'Tab Click', 'wheel tab': sizes[key]}, true, false);\r\n\t\t\t                        }}\r\n\t\t\t                        key={key}\r\n\t\t\t                    >\r\n\t\t\t                        {size}{getWheelSizeSuffix(size)}\r\n\t\t\t                    </a>\r\n\t\t\t                ))\r\n\r\n                        }\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div className=\"mz-tabs-menu--left\"><i className=\"mz-svg mz-svg--grey mz-svg-chevroncarousel mz-svg--rotate180\"></i></div>\r\n\t\t\t\t\t<div className=\"mz-tabs-menu--right active\"><i className=\"mz-svg mz-svg--grey mz-svg-chevroncarousel\"></i></div>\r\n\t\t\t\t</div>\r\n            </div>\r\n            {wheelsData[selectedWheelsSize] && wheelsData[selectedWheelsSize].length > 0 ?\r\n            <div className='wheels-list__tab-content'>\r\n                <p className=\"wheels-list__warning-message paragraph paragraph--tight\">\r\n                    {ReactHtmlParser(t(\"wheels_disclaimer\"))}\r\n                </p>\r\n                {\r\n                    warningMessage && (\r\n                        <p className=\"wheels-list__warning-message paragraph paragraph--tight\"><i className=\"mz-svg mz-svg-warning mz-svg--red\"></i>&nbsp;{warningMessage}</p>\r\n                    )\r\n                }\r\n                {wheelsData[selectedWheelsSize].map((wheel, key) =>\r\n                    <WheelCard Wheel={wheel} Disabled={wheel.disabled} Selected={wheel.selected} Index={key} HandleSelectedWheel={handleSelectedWheel} key={key} showFinancePrice={showFinancePrice} />)\r\n                }\r\n            </div> \r\n            :  \r\n            <p>\r\n                {t(\"wheel_default_msg\")}\r\n            </p>\r\n            }\r\n        </div>\r\n    )\r\n}\r\n\r\n\r\nexport default WheelsList;\r\n\r\nWheelsList.propTypes = {\r\n    HandleSelectedWheel: PropTypes.func,\r\n}\r\n\r\nWheelsList.defaultProps = {\r\n    HandleSelectedWheel: () => {},\r\n};","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nexport const WheelsImageContainer = ({ imageBackgroundCar, imageForegroundWheel, trimName, ...props }) => {\r\n\r\n    return (\r\n        <div className='mz-wheels-images-container'>\r\n            <h2 className=\"mz-wheels-images-container__tittle\">{ReactHtmlParser(trimName)}</h2>\r\n            <div className=\"mz-wheels-images-container__background-image-container\">\r\n                <img className=\"mz-wheels-images-container__background-image\" src={imageBackgroundCar}/>\r\n\t\t\t\t{ imageForegroundWheel ?\r\n\t\t\t\t\t<div className=\"mz-wheels-images-container__foreground-image-container\">\r\n\t\t\t\t\t\t<img className=\"mz-wheels-images-container__foreground-image\" src={imageForegroundWheel}/>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t: <></>\r\n\t\t\t\t}\r\n            </div>\r\n\r\n        </div>\r\n    )\r\n}\r\n\r\nexport default WheelsImageContainer;\r\n\r\nWheelsImageContainer.propTypes = {\r\n    imageBackgroundCar: PropTypes.string,\r\n    imageForegroundWheel: PropTypes.string,\r\n\r\n}\r\n\r\nWheelsImageContainer.defaultProps = {\r\n    imageBackgroundCar: '/jellies/mazda-logo-placeholder.png',\r\n    imageForegroundWheel: ''\r\n};","import React, { useMemo, useState } from 'react';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nimport { get360Data, goToTop, setCursorWaiting, hideCmsHiddenBlock, getLoading } from '../../../utils';\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport NavHelper from '../../../Helpers/navhelper';\r\n\r\nimport { Nav } from '../../3_Organisms/Nav/Nav';\r\nimport Button from '../../1_Atoms/Button/Button';\r\nimport WheelsList from '../../3_Organisms/WheelsList/WheelsList';\r\nimport { WheelsImageContainer } from '../../3_Organisms/WheelsImageContainer/WheelsImageContainer';\r\nimport { Pricing } from '../../3_Organisms/Pricing/Pricing';\r\nimport { Modal } from '../../3_Organisms/Modal/Modal';\r\nimport { PreOrderModal } from '../../3_Organisms/Modal/PreOrderModal';\r\nimport { Alert } from '../../3_Organisms/Alert/Alert';\r\n\r\nexport const Wheels = ({ ...props }) => {\r\n    const [loading, setLoading] = useState(true);\r\n    const summaryCalculator = window.summaryCalculator;\r\n    const { year, carline, trim, model, packageCode } = useParams();\r\n    const [nav, setNav] = React.useState(null);\r\n    const navigate = useNavigate();\r\n    const listRef = React.useRef();\r\n    const legalContent = JSON.parse(sessionStorage.getItem('LegalWheels'));\r\n    const [legalModalOpen, setLegalModalOpen] = React.useState(false);\r\n    const { t, i18n } = useTranslation(['wheels', 'general']);\r\n    const [images, setImages] = useState({});\r\n    const [bgImage, setbgImage] = useState(null);\r\n    const [fgImage, setfgImage] = useState(null);\r\n    const [selectedWheelIndex, setSelectedWheelIndex] = useState(summaryCalculator.SelectedWheelIndex);\r\n    const [showFinancePrice, setShowFinancePrice] = React.useState(summaryCalculator.ShowFinancePrice);\r\n\r\n    const [preorderOpen, setPreorderModalOpen] = React.useState(false);\r\n    \r\n\tconst gtmHelper = new GTMHelper();\r\n    const navHelper = new NavHelper();\r\n    \r\n\tlet selectedWheelObject;\r\n\r\n    const selectedColor = useMemo(() => {\r\n        const storageColor = sessionStorage.getItem(Constants.SelectedExteriorColour);\r\n        return storageColor ? JSON.parse(storageColor).code : summaryCalculator.Wheels?.visual.interiors[0].default_exterior.code;\r\n    }, [summaryCalculator.Wheels]);\r\n\r\n    hideCmsHiddenBlock();\r\n\r\n    summaryCalculator.CurrentStep = 4;\r\n\r\n    React.useEffect(() => {\r\n        async function executeTasks() {\r\n            if (!summaryCalculator.isDataLoaded()) {\r\n                await summaryCalculator.loadVehicleData(year, carline, trim, model, packageCode);\r\n                await summaryCalculator.loadFromFinancialProvider();\r\n\r\n                setLoading(false);\r\n\r\n                setSelectedWheelIndex(summaryCalculator.SelectedWheelIndex);\r\n            } else {\r\n                setLoading(false);\r\n            }\r\n\r\n            if (!loading) {\r\n                if (nav === null) {\r\n                    const toRender = navHelper.getNavContent(t);\r\n                    setNav(toRender);   \r\n                    //setNav(navHelper.getNavContent(year, carline, trim, model, packageCode, summaryCalculator.CurrentStep, t));\r\n                }\r\n            }    \r\n\r\n            if (listRef.current) {\r\n                setListMaxHeight();\r\n            }\r\n        }\r\n\r\n        executeTasks();\r\n    }, [summaryCalculator, nav, loading]);\r\n\r\n    async function handleSelectedWheel(index) {\r\n        setCursorWaiting(true);\r\n\r\n        await summaryCalculator.setSelectedWheelIndex(index);\r\n\r\n        setSelectedWheelIndex(index);\r\n\r\n        setCursorWaiting(false);\r\n\r\n\t\tgtmHelper.setGTM({'action':'Selected Wheel'}, false, false);\r\n    }\r\n\r\n    function nextStep() {\r\n        goToTop();\r\n        //navigate(`/${year}/${carline}/${trim}/${model}/${packageCode}/connectivity${decodeURI(window.location.search)}`);\r\n        navigate(`/${year}/${carline}/${trim}/${model}/${packageCode}/accessories${decodeURI(window.location.search)}`)\r\n\t\tgtmHelper.setGTM({'action':'Next Step'}, true , false);\r\n    }\r\n\r\n    function setListMaxHeight() {\r\n        if (listRef.current){\r\n            if (window.innerWidth < 1025) {\r\n                listRef.current.style.height = 'unset';\r\n            } else {\r\n                const incentivebar = document.querySelector('.mz-alert__item'); // Red alert bar\r\n\r\n                listRef.current.style.height = `${window.innerHeight - (document.querySelector(\".mz-sticky-submenu\")?.offsetTop + document.querySelector(\".mz-sticky-submenu\")?.offsetHeight + document.querySelector(\".mz-pricing\")?.offsetHeight + (incentivebar ? incentivebar.offsetHeight : 0) + 30)}px`;\r\n            }\r\n\t\t}\r\n\r\n\t}\r\n\r\n\r\n    if (summaryCalculator.Wheels && !images) {\r\n        setImages(get360Data(summaryCalculator.Wheels.visual, model));\r\n    }\r\n\r\n    if (summaryCalculator.Wheels && summaryCalculator.Wheels.wheels) {\r\n        // Set Wheel Images\r\n        const yearSlug = summaryCalculator.Wheels.year.url_slug;\r\n        const carlineSlug = summaryCalculator.Wheels.carline.url_slug;\r\n        const trimSlug = summaryCalculator.Wheels.trim.trim_type.url_slug ? summaryCalculator.Wheels.trim.trim_type.url_slug : summaryCalculator.Wheels.trim.trim_type.name;\r\n        const wheelImageBaseURL = `${summaryCalculator.Wheels.visual.static_content_base_path}/wheels/${yearSlug}/${carlineSlug}/`;\r\n        const bgImagePath = summaryCalculator.SelectedColourInterior && summaryCalculator.SelectedColourInterior.include_in_360 ? `${wheelImageBaseURL}${yearSlug}-${carlineSlug}-${trimSlug.replaceAll(' ', '')}-${selectedColor}-${summaryCalculator.SelectedColourInterior.code}-WHEELS.jpg` : `${wheelImageBaseURL}${yearSlug}-${carlineSlug}-${trimSlug.replaceAll(' ', '')}-${selectedColor}-WHEELS.jpg`;\r\n        if (bgImage !== bgImagePath)\r\n            setbgImage(bgImagePath);\r\n\r\n        selectedWheelObject = summaryCalculator.Wheels.wheels[Object.keys(summaryCalculator.Wheels.wheels)[selectedWheelIndex]];\r\n        if (selectedWheelObject) {\r\n            const fgImagePath = `${wheelImageBaseURL}${yearSlug}-${carlineSlug}-WHEELS-${selectedWheelObject.image.overlay_image_suffix}.png`;\r\n            if(fgImage !== fgImagePath)\r\n                setfgImage(fgImagePath);\r\n        }\r\n    }\r\n\r\n    function handleShowFinanceClick(value) {\r\n        setShowFinancePrice(value);\r\n    }\r\n\r\n    return (\r\n        <>\r\n        {getLoading(false, t)}\r\n        <div className=\"mz-wheels-page mz-top-nav-spacing\">\r\n            <Nav nav={nav} />\r\n            <Alert />\r\n\r\n            {summaryCalculator.Wheels?.wheels ?\r\n                <div key='0' className=\"mz-full-width mz-wheels-page__content general-content\">\r\n                    <div className=\"mz-wheels-page__content-left\">\r\n                        <WheelsImageContainer trimName={summaryCalculator.VehicleTitle} imageBackgroundCar={bgImage} imageForegroundWheel={selectedWheelObject?fgImage:''} />\r\n                    </div>\r\n                    <div className=\"mz-wheels-page__content-right right-container\">\r\n                        <div className=\"mz-wheels-page__wheels-card-list\" ref={listRef}>\r\n                            <h5 className='mz-wheels-page__wheels-card-list-title'>{ReactHtmlParser(t(\"select_wheels\"))}</h5>\r\n\r\n                            <WheelsList Wheels={summaryCalculator.Wheels.wheels} SelectedIndex={selectedWheelIndex} DisabledIndexes={[]} HandleSelectedWheel={handleSelectedWheel} defaultWheelSize={summaryCalculator.Wheels.default_wheels_size} showFinancePrice={showFinancePrice}></WheelsList>\r\n\r\n                            <div className=\"mz-legal mz-mobile\">\r\n                                <Button\r\n                                    className=\"mz-btn mz-btn--legal text--grey\"\r\n                                    label={t(\"general:legal\")}\r\n                                    backgroundColor=\"grey\"\r\n                                    colour=\"grey\"\r\n                                    icon={true}\r\n                                    iconAfter={true}\r\n                                    svg_className=\"\"\r\n                                    svg_list=\"plus\"\r\n                                    size={0.6}\r\n                                    onClick={() => {\r\n\t\t\t\t\t\t\t\t\t\tdocument.querySelector('body').classList.add('disabled');\r\n\t\t\t\t\t\t\t\t\t\tsetLegalModalOpen(true)}}\r\n                                />\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n                : null}\r\n            {summaryCalculator.Wheels?.wheels ?\r\n                <Pricing builtLabel={t(\"general:price_as_built\")} builtPrice=\"$\" loanLabel={t(\"general:loan_label\")} loanPrice=\"$\" saveLabel={t(\"general:save_build\")}\r\n                    leaseLabel={t(\"general:show_lease_price\")} financeLabel={t(\"general:show_finance_price\")} buttonLabel={t(\"general:next_accessories\")} summaryCalculator={summaryCalculator}\r\n                    HandleNextClick={nextStep} setLegalModalOpen={setLegalModalOpen} HandleShowFinanceClick={handleShowFinanceClick} setPreorderModalOpen={setPreorderModalOpen} /> : null}\r\n            <Modal modalContent={legalContent} isOpen={legalModalOpen} handleClose={setLegalModalOpen} modalId='legalModal' />\r\n            <PreOrderModal isOpen={preorderOpen} handleClose={setPreorderModalOpen}></PreOrderModal> \r\n        </div>\r\n        </>\r\n    )\r\n}\r\n\r\nexport default Wheels;","// carousel driven by Core\r\n/* global mzCarousel */\r\n\r\nimport React, { useState } from 'react';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nimport { get360Data, goToTop, getLoading, setTabsNextAndPrevButtons, setCursorWaiting, getBaseUrl } from '../../../utils';\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport NavHelper from '../../../Helpers/navhelper';\r\n\r\nimport Button from '../../1_Atoms/Button/Button';\r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\nimport CollapseLegal from '../../2_Molecules/Collapse/CollapseLegal';\r\nimport ColourCard from '../../2_Molecules/ColourCard/ColourCard';\r\nimport ThreeSixtyContainer from '../../3_Organisms/360Container/360Container';\r\nimport { Nav } from '../../3_Organisms/Nav/Nav';\r\nimport { Pricing } from '../../3_Organisms/Pricing/Pricing';\r\nimport { Modal } from '../../3_Organisms/Modal/Modal';\r\nimport { PreOrderModal } from '../../3_Organisms/Modal/PreOrderModal';\r\nimport PackageCard from '../../2_Molecules/PackageCard/PackageCard';\r\n\r\nexport const Connectivity = ({ ...props }) => {\r\n    const [loading, setLoading] = useState(true);\r\n    const [is360Loading, setIs360Loading] = useState(true);\r\n    const summaryCalculator = window.summaryCalculator;\r\n    const { year, carline, trim, model, packageCode } = useParams();\r\n    const [nav, setNav] = React.useState(null);\r\n    let extArray = null;\r\n    const [images, setImages] = React.useState({});\r\n    const navigate = useNavigate();\r\n    const listRef = React.useRef();\r\n    const legalContent = JSON.parse(sessionStorage.getItem(Constants.LegalConnectivity));\r\n    const [legalModalOpen, setLegalModalOpen] = React.useState(false);\r\n    const [connectModalOpen, setConnectModalOpen] = React.useState(false);\r\n    const [carouselInit, setCarouselInit] = React.useState(false);\r\n    const { t, i18n } = useTranslation(['connectivity', 'general']);\r\n    const [showFinancePrice, setShowFinancePrice] = React.useState(summaryCalculator.ShowFinancePrice);\r\n    const [selectedConnectedVehicleIndex, setSelectedConnectedVehicleIndex] = React.useState(summaryCalculator.SelectedConnectedVehicleIndex);    \r\n    const [connectivityPackage, setConnectivityPackage] = React.useState(null);    \r\n\r\n    const [preorderOpen, setPreorderModalOpen] = React.useState(false);\r\n    \r\n\tconst gtmHelper = new GTMHelper();\r\n\tconst navHelper = new NavHelper();\r\n\r\n    function hideShownCmsBlock() {\r\n        let toHideBlocks = document.querySelectorAll('.mz-footer.visually-shown');\r\n        if (toHideBlocks) {\r\n            toHideBlocks.forEach(function (e) {\r\n                e.classList.remove('visually-shown');\r\n                e.classList.add('visually-hidden');\r\n            });\r\n        }\r\n    }\r\n\r\n    hideShownCmsBlock();\r\n\r\n    summaryCalculator.CurrentStep = 5;\r\n    \r\n\r\n    React.useEffect(() => {\r\n\t\tasync function executeTasks() {\r\n            if (!summaryCalculator.isDataLoaded()) {\r\n                await summaryCalculator.loadVehicleData(year, carline, trim, model, packageCode);\r\n\r\n                if (JSON.parse(sessionStorage.getItem(Constants.HasFinancialProviderError)) === true) {\r\n                    const vehiclePageUri = `/${decodeURI(window.location.search)}`;\r\n                    navigate(vehiclePageUri)\r\n                }\r\n\r\n                setLoading(false);\r\n            } else {\r\n                setLoading(false);\r\n            }\r\n\r\n            if (!loading) {\r\n                if (nav === null) {\r\n                    const toRender = navHelper.getNavContent(t);\r\n                    setNav(toRender);                    \r\n                }\r\n\r\n                if(summaryCalculator.Packages && !connectivityPackage) {\r\n                    setConnectivityPackage(summaryCalculator.Packages.connected_services[0]);\r\n                }\r\n            }\r\n\r\n            if (listRef.current) {\r\n                window.removeEventListener('resize', setListMaxHeight);\r\n                window.addEventListener('resize', setListMaxHeight);\r\n                setListMaxHeight();\r\n            }\r\n           \r\n        }\r\n\r\n        executeTasks();\r\n    }, [loading, nav, connectivityPackage]);\r\n\r\n    function getConnectivityImagePath() {\r\n        const imagePath = getBaseUrl() + process.env.REACT_APP_BASIC_CONTENT_PATH;\r\n        //return `https://preprod.mazda.ca/globalassets/mazda-canada/discover-mazda/innovation/mymazdaapp/4.1_c44_remotevehiclestart_nobackground_en.png`\r\n        \r\n        return `${imagePath}${connectivityPackage.image_folder}hero_section_bnp${connectivityPackage.image_extension}`\r\n    }\r\n\r\n    function getModalImagePath(carousel) {\r\n        const imagePath = getBaseUrl() + process.env.REACT_APP_BASIC_CONTENT_PATH;\r\n        \r\n        return `${imagePath}${connectivityPackage.image_folder}${carousel.image}`\r\n    }\r\n\r\n    function nextStep() {\r\n        goToTop();\r\n        navigate(`/${year}/${carline}/${trim}/${model}/${packageCode}/accessories${decodeURI(window.location.search)}`)\r\n\t\tgtmHelper.setGTM({'action':'Next Step'}, true , false);\r\n    }\r\n\r\n    function setListMaxHeight() {\r\n        if (listRef.current && typeof(mzFunc) === 'object'){\r\n            if (window.innerWidth < 1200) {\r\n                listRef.current.style.height = 'auto';\r\n            } else {\r\n                const baseTarget= document.querySelector('.App-container .mz-connectivity-page');\r\n                const contentHeight = baseTarget.querySelector('.mz-connectivity-page__title').clientHeight + baseTarget.querySelector('.mz-connectivity-page__content').clientHeight;\r\n                const visibleHeight = window.innerHeight - baseTarget.querySelector('.mz-pricing').clientHeight - document.querySelector('.mz-menu').clientHeight - baseTarget.querySelector('nav').clientHeight - document.querySelector('.mz-alert--permanent')?.clientHeight;\r\n                if(contentHeight > visibleHeight){\r\n                    listRef.current.style.height = (window.innerHeight +150)+'px';\r\n                }else{\r\n                    listRef.current.style.height = 'auto';\r\n                }\r\n            }\r\n\t\t}\r\n\r\n\t}\r\n\r\n    function handleShowFinanceClick(value) {\r\n        setShowFinancePrice(value);\r\n    }\r\n\r\n    async function handleSelectedConnectedVehiclePackage(index) {\r\n        setCursorWaiting(true);\r\n\r\n        await summaryCalculator.setSelectedConnectedVehicleIndex(index);\r\n\r\n        setSelectedConnectedVehicleIndex(index);\r\n\t\tgtmHelper.setGTM({'action':'Add Connected Vehicle Package', 'package': summaryCalculator.SelectedConnectedVehiclePackage.name}, false, false);\r\n\r\n        setCursorWaiting(false);\r\n    }\r\n\r\n    async function handleRemoveConnectedVehiclelPackage(index) {\r\n        setCursorWaiting(true);\r\n\r\n\t\tgtmHelper.setGTM({'action':'Remove Connected Vehicle Package', 'package': summaryCalculator.SelectedConnectedVehiclePackage.name}, true, false);\r\n\r\n        await summaryCalculator.setSelectedConnectedVehicleIndex(null);\r\n\r\n        setSelectedConnectedVehicleIndex(null);\r\n\r\n        setCursorWaiting(false);\r\n    }\r\n\r\n\twindow.addEventListener('resize', setListMaxHeight);\r\n\r\n    function setCarousel(){\r\n        if(carouselInit){\r\n            return `<div class=\"mz-container\"  style=\"width:100%;\">\r\n                        <div class=\"mz-full-width w-100\">\r\n                            <div class=\"mz-carousel-wrapper\">\r\n                                <div data-mz-autoplay=\"false\" data-mz-autoplay-timer=\"3000\" data-mz-infinite-loop=\"true\" data-mz-hide-pips=\"false\" data-mz-carousel-theme=\"contain\" data-mz-center=\"undefined\" class=\"mz-carousel glide  mz-carousel--contain mz-carousel--light\">\r\n                                    <div class=\"glide__bullets slider__bullets\" data-glide-el=\"controls[nav]\">\r\n                                        ${setBullets()}\r\n                                    </div>\r\n                                    <div class=\"glide__track\" data-glide-el=\"track\">\r\n                                        <ul class=\"glide__slides\">\r\n                                            ${setSlides()}\r\n                                        </ul>\r\n                                    </div>\r\n                                    <div class=\"glide__arrows\" data-glide-el=\"controls\">\r\n                                        <button class=\"mz-btn mz-btn--carousel mz-btn--black glide__arrow glide__arrow--right\" data-glide-dir=\">\">\r\n                                            <span><i class=\"mz-svg mz-svg--grey mz-svg-chevroncarousel\"></i></span>\r\n                                        </button>\r\n                                        <button class=\"mz-btn mz-btn--carousel mz-btn--black glide__arrow glide__arrow--left\" data-glide-dir=\"<\">\r\n                                            <span><i class=\"mz-svg mz-svg--grey mz-svg--rotate180 mz-svg-chevroncarousel\"></i></span>\r\n                                        </button>\r\n                                    </div>\r\n                                </div>\r\n                            </div>\r\n                        </div>\r\n                    </div>`\r\n        }\r\n    }\r\n\r\n    function setBullets(){\r\n        let slideContent='';\r\n        if(connectivityPackage) {\r\n            connectivityPackage.carousel.map((carousel, index) => {\r\n                slideContent +=`<button class=\"slider__bullet glide__bullet\" data-glide-dir=\"=${index}\"></button>`;\r\n            });\r\n        }\r\n\r\n        return slideContent;\r\n    }\r\n\r\n    function setSlides(){\r\n        let slideContent='';\r\n        if(connectivityPackage) {\r\n            connectivityPackage.carousel.map((carousel, index) => {\r\n                slideContent +=`<li class=\"glide__slide mz-image\" data-mz-slide-nth=\"${index}\">${set5050(carousel)}</li>`;\r\n            });\r\n        }\r\n\r\n        return slideContent;\r\n    }\r\n    function set5050(carousel){\r\n        return `<div class=\"mz-5050 mz-5050--image-right\">\r\n                    <div class=\"mz-container unconstrained mz-5050-container full-width no-gutter-between-cols\">\r\n                        <div class=\"mz-5050-left mz-5050-content mz-bg--f5f5f5\">\r\n                            <div class=\"mz-5050-text-wrapper text--left\">\r\n                                ${carousel.content}\r\n                            </div>\r\n                        </div>\r\n                        <div class=\"mz-5050-right mz-5050-content mz-bg--f5f5f5\">\r\n                            <div class=\"mz-image mz-5050-image\">\r\n                                <img src=\"${getModalImagePath(carousel)}\"></img>\r\n                            </div>\r\n                        </div>\r\n                       \r\n                    \r\n                    </div>\r\n                </div>`;\r\n    }\r\n\r\n    return (\r\n        <>\r\n        {\r\n            !summaryCalculator.isDataLoaded() ? getLoading(loading, t) : null\r\n        }\r\n        <div className=\"mz-connectivity-page mz-top-nav-spacing grid-no-gutter-sm\"  ref={listRef}>\r\n            <Nav nav={nav} />\r\n            <h5 className=\"mz-connectivity-page__title\">{t(\"connectivity:title\")}</h5>\r\n            <div className=\"mz-full-width mz-connectivity-page__content mz-container-flex\">\r\n                         \r\n                <div className=\"mz-connectivity-page__content-left\">\r\n                    {connectivityPackage &&\r\n                    <div className=\"mz-connectivity-page__content-left-container\">\r\n                        <div className=\"mz-connectivity-page__content-left-container__content-left\">\r\n                            <img src={getConnectivityImagePath()} alt=\"img\" />\r\n                        </div>\r\n                        <div className=\"mz-connectivity-page__content-left-container__content-right\">\r\n                            {ReactHtmlParser(connectivityPackage.description)}\r\n\r\n                            <a href=\"\" className=\"mz-link\" onClick={ (e)=>{\r\n                                e.preventDefault();\r\n                                setConnectModalOpen(true);\r\n                                //mzCarousel.init();\r\n                                if(!carouselInit){\r\n                                    \r\n                                   // window.setTimeout(()=>{\r\n                                        setCarouselInit(true)\r\n                                        mzCarousel.init();\r\n                                        \r\n                                    //}, 1000)\r\n                                   \r\n                                }\r\n                            }}>{connectivityPackage.carousel_cta_text}</a>\r\n                        </div>\r\n                    </div>}\r\n                </div>\r\n                <div className=\"mz-connectivity-page__content-right right-container\">\r\n                    {connectivityPackage && Object.entries(connectivityPackage.subscription).map(([key, value], index) => \r\n                        <PackageCard Package={value} \r\n                            PopContent={t('best')}\r\n                            ButStyle='mz-btn mz-btn--primary mz-btn--red package-card__button'\r\n                            ButContent={t('general','add')}\r\n                            Selected={summaryCalculator.SelectedConnectedVehicleIndex === index} \r\n                            ButSelectedContent={t('general','remove')}\r\n                            HasCollapse={false}\r\n                            HandleSelectedPackage={handleSelectedConnectedVehiclePackage} \r\n                            HandleRemovePackage={handleRemoveConnectedVehiclelPackage} \r\n                            Index={index} \r\n                            key={key} \r\n                            showFinancePrice={showFinancePrice} \r\n                            isUniversal={false} \r\n                            displayPriceCalculation={false} \r\n                            displayConnectedServicePriceCalculation={true}></PackageCard>)}\r\n                </div>\r\n            </div>\r\n            \r\n\r\n            <Pricing builtLabel={t(\"general:price_as_built\")} builtPrice=\"$\" loanLabel={t(\"general:loan_label\")} loanPrice=\"$\" saveLabel={t(\"general:save_build\")}\r\n                leaseLabel={t(\"general:show_lease_price\")} financeLabel={t(\"general:show_finance_price\")} buttonLabel={t(\"general:next_accessories\")} summaryCalculator={summaryCalculator}\r\n                HandleNextClick={nextStep} setLegalModalOpen={setLegalModalOpen} HandleShowFinanceClick={handleShowFinanceClick} setPreorderModalOpen={setPreorderModalOpen} />\r\n            <Modal modalContent={legalContent} isOpen={legalModalOpen} handleClose={setLegalModalOpen} modalId='legalModal' />\r\n            <Modal modalContent={setCarousel()} isOpen={connectModalOpen} handleClose={setConnectModalOpen} modalId='connectModal' />\r\n            <PreOrderModal isOpen={preorderOpen} handleClose={setPreorderModalOpen}></PreOrderModal> \r\n            \r\n        </div>\r\n        </>\r\n    )\r\n}\r\n\r\nexport default Connectivity;","import React, { useState, useEffect, useRef }  from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\n//import SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport { formatPrice, convertNum, setCursorWaiting } from '../../../utils'\r\n\r\nexport const CollapseFinance = ({dropdownCallback, selectCallback, setSelectedFinanceOption, key, ...props }) => {\r\n    const { t, i18n } = useTranslation(['payments', 'general']);\r\n\r\n    const summaryCalculator = window.summaryCalculator;\r\n\tconst gtmHelper = new GTMHelper();\r\n\r\n    const [collapseOpenContent, setCollapseOpenContent] = useState('');\r\n\r\n    const [isCollapsed, setIsCollapsed] =  useState(false);\r\n    const [didInit, setInit] = React.useState(false);\r\n    const collapseRef = useRef();\r\n\r\n    const [update, setForceUpdate] =  useState('');\r\n \r\n    function termCanBeDisplayed(term) {\r\n        const allowedTerm = [12,24,36,48,60,72,84];\r\n        \r\n        return allowedTerm.includes(term);\r\n    }\r\n\r\n    function hasRatePercentageDiscount(financeElement) {\r\n        return (Number.parseFloat(financeElement.aprRate) !== Number.parseFloat(financeElement.aprRateDiscounted));\r\n    }\r\n\r\n    function getFinanceOptions(financialInfo) {\r\n        if (summaryCalculator.getResponsesHasError() === true)\r\n        return (\r\n            <>\r\n            <div className='mz-finance-options__financial-element-error-msg'>{t(\"general:contact_a_dealer\")}</div>\r\n            </>\r\n        ) \r\n        else\r\n        return (\r\n            <ul className=\"mz-finance-options__financial-element-list mz-collapse__box--element-list\">\r\n                {summaryCalculator.LoyaltyChecked ?\r\n                <li className=\"loyalty-title\">{t(\"payments:mazda_loyalty_collapse_title\")}</li>:''}\r\n                <li className=\"mz-finance-options__financial-element mz-collapse__box--element headers\"><span>{t(\"months\")}</span><span>{t(\"rate\")}</span><span>{t(\"weekly_payment\")}</span><span>{t(\"bi_weekly_payment\")}</span><span>{t(\"monthly_payment\")}</span></li>\r\n                { financialInfo.calculatedFinance.financeValues.map((financeElement, index) => {\r\n                    if (termCanBeDisplayed(financeElement.term)){\r\n                        return (\r\n                            <>\r\n                            <li className=\"mz-finance-options__financial-element mz-collapse__box--element\" key={index}>\r\n                                <span><input type=\"checkbox\" name=\"financeTermOptions\"  value={index} onChange={itemClick} data-term-selected={financeElement.term} checked={parseInt(summaryCalculator.FinanceTermIndex) === index ? true : false}  id={financeElement.term + '__months'} /><label htmlFor={financeElement.term + '__months'}>{financeElement.term}</label></span>\r\n                                {summaryCalculator.LoyaltyChecked && hasRatePercentageDiscount(financeElement) ? \r\n                                    <span className=\"rate text--red\"><span className='rate-strike'>{financeElement.aprRate ? convertNum(financeElement.aprRate, 2) : \"\"}% </span> {convertNum(financeElement.aprRateDiscounted, 2)}%</span>:\r\n                                    <span className=\"rate\">{financeElement.aprRate ? convertNum(financeElement.aprRate, 2) : \"\"}%</span>\r\n                                }\r\n                                <span className=\"weekly\"><span>{formatPrice(financeElement[summaryCalculator.IncludeTaxes ? 'weeklyWithTaxes' : 'weekly'])}</span></span>\r\n                                <span className=\"biWeekly\"><span>{formatPrice(financeElement[summaryCalculator.IncludeTaxes ? 'biWeeklyWithTaxes' : 'biWeekly'])}</span></span>\r\n                                <span className=\"monthly\"><span>{formatPrice(financeElement[summaryCalculator.IncludeTaxes ? 'monthlyWithTaxes' : 'monthly'])}</span></span>\r\n                            </li>\r\n                            {summaryCalculator.LoyaltyChecked && !hasRatePercentageDiscount(financeElement) ? \r\n                            <li className=\"text--center text--red\" style={{'font-size': '0.6rem', 'margin-top': '-16px'}}>\r\n                                <span className=\"loyalty\">{t(\"payments:item_contains_discount\", { discount: formatPrice(summaryCalculator.Incentives.loyalty.cash_value) })}</span>\r\n                            </li>: null}\r\n                            </>  \r\n                        )\r\n                    }\r\n                })}\r\n            </ul>\r\n        )\r\n    }\r\n    \r\n    async function handleClick(e) {\r\n        const financialInfo = await summaryCalculator.RecalculateFinancialInfo();\r\n        setCollapseOpenContent(getFinanceOptions(financialInfo));\r\n\r\n        \r\n        setIsCollapsed(!isCollapsed);\r\n\t\tgtmHelper.setGTM({'action':'Collapse', 'type': 'Finance Term', 'value': isCollapsed}, true , false);\r\n    }\r\n\r\n    function itemClick(e) {\r\n        summaryCalculator.FinanceTermIndex = e.target.value;\r\n        summaryCalculator.FinanceTerm = parseInt(e.target.getAttribute(\"data-term-selected\"));\r\n        setSelectedFinanceOption(e.target.value);\r\n\r\n        selectCallback();\r\n\r\n        setCollapseOpenContent(getFinanceOptions(summaryCalculator.FinancialInfo));\r\n\r\n        gtmHelper.setGTM({'action':'Checkbox', 'type': 'Finance Term', 'value': e.target.dataset['termSelected']}, true , false);        \r\n    }\r\n\r\n    function getDisplayedRate() {\r\n        const financeElement = summaryCalculator.FinancialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex];\r\n\r\n        if (summaryCalculator.getResponsesHasError() === true)\r\n            return convertNum(0,2);        \r\n        else {\r\n            if (hasRatePercentageDiscount(financeElement))\r\n                return convertNum(financeElement.aprRateDiscounted,2);\r\n            else\r\n                return convertNum(financeElement.aprRate,2);\r\n        }\r\n    }\r\n\r\n    useEffect(() => {\r\n        (async () => {\r\n            setCursorWaiting(true);\r\n\r\n            const financialInfo = await summaryCalculator.RecalculateFinancialInfo();\r\n\r\n            setCollapseOpenContent(getFinanceOptions(financialInfo));\r\n    \r\n            setInit(false);\r\n            //setIsCollapsed(false);\r\n            const collapse = collapseRef.current;\r\n            collapse.style.height = null;\r\n            //collapse.style.removeProperty('height');\r\n            \r\n            setForceUpdate(Math.random());\r\n            //window.mzAnimator.animateHeight(collapse, 'CollapseFinanceRate', true);\r\n            setCursorWaiting(false);\r\n        })();\r\n    }, [summaryCalculator._tradeInValue, summaryCalculator._downPaymentValue, summaryCalculator.LoyaltyChecked, summaryCalculator.GraduateChecked, summaryCalculator.MilitaryChecked, summaryCalculator.FirstTimeOwnerChecked, summaryCalculator.IncludeFees, summaryCalculator.IncludeTaxes, summaryCalculator.IncludeRebates]);\r\n\r\n    useEffect(() => {\r\n        (async () => {\r\n            const collapse = collapseRef.current;\r\n\r\n            if(typeof window.mzAnimator === 'object' && !didInit){\r\n                window.mzAnimator.animateHeight(collapse, 'CollapseFinanceRate', 'init');\r\n                setInit(true);\r\n                window.mzAnimator.animateHeight(collapse, 'CollapseFinanceRate', isCollapsed);\r\n            }\r\n            else {\r\n                window.mzAnimator.animateHeight(collapse, 'CollapseFinanceRate', isCollapsed);\r\n            }\r\n            \r\n            collapse.className = 'mz-collapse__box visible ' + (!isCollapsed ? 'mz-collapse__box--finance-collapsed' : 'mz-collapse__box--finance-expanded');\r\n\r\n            if(isCollapsed === false)\r\n                dropdownCallback();\r\n        })();\r\n    }, [isCollapsed, didInit]);\r\n\r\n    /*useEffect(() => {\r\n        setCollapseOpenContent(getFinanceOptions());\r\n        console.log('reupdating finance collapse');\r\n    }, [update]);*/\r\n\r\n    return (\r\n        <div className=\"mz-collapse mz-collapse--finance\" key={key}>\r\n            <button\r\n                onClick={handleClick}\r\n                className=\"mz-collapse__button\"\r\n            >\r\n                <div className=\"mz-collapse__cartext-container\">\r\n                    <p className=\"mz-collapse__text\">{t(\"term\")}: {summaryCalculator.FinancialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].term} {t(\"payments:months_lowercase\")} {getDisplayedRate()}%</p>\r\n                </div>\r\n                <i className={ isCollapsed ? \"mz-svg mz-svg-chevron_small open  mz-svg--grey\" : \"mz-svg mz-svg-chevron_small  mz-svg--grey\"}></i>\r\n            </button>\r\n            <div className=\"mz-collapse__box\" ref={collapseRef}>{collapseOpenContent}</div>\r\n        </div>\r\n    )\r\n}\r\n\r\nCollapseFinance.propTypes = {\r\n}\r\n\r\nCollapseFinance.defaultProps = {\r\n}\r\n\r\nexport default CollapseFinance;","import React, { useState, useEffect, useRef }  from 'react';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\n\r\nimport { formatPrice, getIncentiveDisplayName, getMazdaFeesAndLeviesDetailTitle, convertNum, setCursorWaiting, setCheckChanged, getProvince, getLang} from '../../../utils'\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport OcaService from '../../../Services/OcaService';\r\n\r\nimport { Tooltip } from '../../1_Atoms/Tooltip/Tooltip';\r\nimport { Button } from '../../1_Atoms/Button/Button';\r\nimport { OcaModal } from '../../3_Organisms/Modal/OcaModal';\r\nimport { PreOrderModal } from '../../3_Organisms/Modal/PreOrderModal';\r\nimport CollapseFinance from '../Collapse/CollapseFinance';\r\nimport { openModal  } from '../../../Helpers/helpers';\r\n\r\nexport const FinanceOptions = ({ setSelectedFinanceOption, includeFees, includeTaxes, includeRebates, setPreorderModalOpen, ...props }) => {\r\n    const navigate = useNavigate();\r\n    const { year, carline, trim, model, packageCode } = useParams();\r\n    const summaryCalculator = window.summaryCalculator;\r\n\r\n    const [feesAndLeviesToDisplay, setFeesAndLeviesToDisplay] = useState(summaryCalculator.FinancialInfo.calculatedCash.feesAndLevies.detail.filter(item => item.title !== 'PDE'));\r\n\r\n    const [didInit, setInit] = useState(false);\r\n    const [showDetailedPricing, toggleShowDetailedPricing] = useState(false);\r\n    const financeDetailRef1 = useRef();\r\n    const financeDetailRef2 = useRef();\r\n    const financeDetailRef3 = useRef();\r\n\r\n    const { t, i18n } = useTranslation(['payments', 'general', 'summary']);\r\n    const provinceCode = getProvince().toUpperCase();\r\n    const [financialInfo, setFinancialInfo] = useState(summaryCalculator.FinancialInfo);\r\n    const [update, setForceUpdate] =  useState('');\r\n\r\n    const gtmHelper = new GTMHelper();\r\n    const ocaService = new OcaService();\r\n\r\n    const [ocaOpen, setOcaModalOpen] = useState(false);\r\n    const [financeType, setFinanceType] = useState(false);\r\n\r\n    //Fixed Number provided by API\r\n    const [currentIncentives, setCurrentIncentives] = useState(null);\r\n\r\n    const [reserveOpen, setReserveModalOpen] = React.useState(false);\r\n\r\n    useEffect(() =>{\r\n        const collapse1 = financeDetailRef1.current;\r\n        const collapse2 = financeDetailRef2.current;\r\n        const collapse3 = financeDetailRef3.current;\r\n        \r\n        if(typeof window.mzAnimator === 'object' && !didInit && showDetailedPricing){\r\n            window.mzAnimator.animateHeight(collapse1, 'CollapseDetailedFinance1', 'init')\r\n            window.mzAnimator.animateHeight(collapse2, 'CollapseDetailedFinance2', 'init')\r\n            window.mzAnimator.animateHeight(collapse3, 'CollapseDetailedFinance3', 'init')\r\n            setInit(true);\r\n            toggleCollapse(false);\r\n        }else{\r\n            toggleCollapse(true);\r\n        }\r\n    },[showDetailedPricing, didInit]);\r\n\r\n    useEffect(() =>{\r\n        (async function() {\r\n            setInit(false);\r\n            \r\n            setFinancialInfo(await summaryCalculator.RecalculateFinancialInfo());\r\n\r\n            setForceUpdate(Math.random());\r\n        })();\r\n    },[summaryCalculator._tradeInValue, summaryCalculator._downPaymentValue, summaryCalculator.LoyaltyChecked, summaryCalculator.GraduateChecked, summaryCalculator.MilitaryChecked, summaryCalculator.FirstTimeOwnerChecked, summaryCalculator.IncludeFees, summaryCalculator.IncludeTaxes, summaryCalculator.AnnualMileage, summaryCalculator.IncludeRebates]);    \r\n\r\n    useEffect(() => {\r\n        if(summaryCalculator.FinancialInfo.incentive_programs){\r\n            setCurrentIncentives(summaryCalculator.FinancialInfo.incentive_programs?.find(element => element.type === \"incentive\"));\r\n        }\r\n\r\n        console.log('refreshing the finance options section');\r\n        //console.log(summaryCalculator.FinancialInfo);\r\n    }, [update]);\r\n\r\n\r\n    function toggleCollapse(fromClick) {\r\n        const collapse1 = financeDetailRef1.current;\r\n        const collapse2 = financeDetailRef2.current;\r\n        const collapse3 = financeDetailRef3.current;\r\n            \r\n        if(showDetailedPricing){\r\n            window.mzAnimator.animateHeight(collapse1, 'CollapseDetailedFinance1', true)\r\n            window.mzAnimator.animateHeight(collapse2, 'CollapseDetailedFinance2', true)\r\n            window.mzAnimator.animateHeight(collapse3, 'CollapseDetailedFinance3', true)\r\n        }else{\r\n            window.mzAnimator.animateHeight(collapse1, 'CollapseDetailedFinance1', false)\r\n            window.mzAnimator.animateHeight(collapse2, 'CollapseDetailedFinance2', false)\r\n            window.mzAnimator.animateHeight(collapse3, 'CollapseDetailedFinance3', false)\r\n        }\r\n        if(fromClick)\r\n            gtmHelper.setGTM({'action':'Collapse', 'type': 'Finance ', 'value': showDetailedPricing}, true , false);\r\n        \r\n    }\r\n\r\n    function financeClick(financeType){\r\n        document.querySelector('body').classList.add('disabled');\r\n\t\tsetOcaModalOpen(true);\r\n        setFinanceType(financeType);\r\n\r\n        const price = summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceWithFeesWithRebatesTaxed;\r\n        gtmHelper.setGTM({'action':`OCA - Finance Payment`,'year': year,'model': ReactHtmlParser(carline), 'trim': trim, 'price' : Math.round(price)}, true, false);\r\n    }\r\n\r\n    const handleContactDealerLinkClick = (e) => {\r\n        e.preventDefault();\r\n\r\n        const contactRoute = `/${year}/${carline}/${trim}/${model}/${packageCode}/summary?contactDealer`;\r\n        navigate(contactRoute);\r\n    }\r\n\r\n    includeFees = summaryCalculator.IncludeFees;\r\n    includeTaxes = summaryCalculator.IncludeTaxes;\r\n    includeRebates = summaryCalculator.IncludeRebates;\r\n\r\n\tfunction getRebatesDetails() {\r\n\t\treturn financialInfo.calculatedCash.evRebates.details.map((rebate, index) => `<li key=\"${index}\" class=\"finance-list__item rebate\">\r\n                <p class=\"desc text--green\">${rebate.title==='federal'? t('fed_rebate'):t('prov_rebate') + ' ('+getProvince()+')'}</p><span class=\"price text--green\">${rebate.finance ? '-' : ''}${formatPrice(rebate.finance, true)}</span>\r\n            </li>`).join(\"\");\r\n    }\r\n\r\n    function getOptionList() {\r\n        let optionList = '';\r\n        \r\n        const options = summaryCalculator.FinancialInfo ?.calculatedFinance ?.options;\r\n\r\n        if(options.exteriorColour.price >0){\r\n            optionList += ` <li class=\"finance-list__item\">\r\n                <p class=\"desc\">${t('exterior')} ${options.exteriorColour.description}</p>\r\n                <span class=\"price\">${formatPrice(options.exteriorColour.price, true)}</span>\r\n            </li>`\r\n        }\r\n        if(options ?.interiorColour.price >0){\r\n            optionList += ` <li class=\"finance-list__item\">\r\n                <p class=\"desc\">${t('interior')} ${options.interiorColour.description}</p>\r\n                <span class=\"price\">${formatPrice(options.interiorColour.price, true)}</span>\r\n            </li>`\r\n        }\r\n        if(options ?.model_option_package ?.financial ?.msrp >0){\r\n            optionList += ` <li class=\"finance-list__item\">\r\n                <p class=\"desc\">${t('package')} ${options.model_option_package.name}</p>\r\n                <span class=\"price\">${formatPrice(options.model_option_package.financial.msrp, true)}</span>\r\n            </li>`\r\n        }\r\n\r\n        const selectedWarrantyPackage = JSON.parse(sessionStorage.getItem('selectedWarrantyPackage'));\r\n        if(selectedWarrantyPackage != null && selectedWarrantyPackage.name != undefined ){\r\n            const warrantyPrice = (JSON.parse(sessionStorage.getItem('selectedWarrantyPackage')).financial.msrp);\r\n            optionList += ` <li class=\"finance-list__item\">\r\n                <p class=\"desc\">${t(\"warranties\")} ${selectedWarrantyPackage.name}</p>\r\n                <span class=\"price\">${formatPrice(warrantyPrice, true)}</span>\r\n            </li>`\r\n        }   \r\n        \r\n        const selectedConnectedVehiclePackage = JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage'));\r\n        if(selectedConnectedVehiclePackage != null && selectedConnectedVehiclePackage.name != undefined){\r\n            const connectedPrice = (JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage')).financial.msrp);\r\n            optionList += ` <li class=\"finance-list__item\">\r\n                <p class=\"desc\">${t(\"connected\")} <span style=\"text-transform:lowercase\">${selectedConnectedVehiclePackage.name}</span></p>\r\n                <span class=\"price\">${formatPrice(connectedPrice, true)}</span>\r\n            </li>`\r\n        }\r\n\r\n        if(options.wheels.price >0){\r\n            const options = summaryCalculator.FinancialInfo ?.calculatedFinance ?.options;\r\n                   \r\n            optionList += `  <li class=\"finance-list__item\">\r\n                <p class=\"desc\">${`4x ${options.wheels.title}`}</p>\r\n                <span class=\"price\">${formatPrice(options.wheels.base_msrp, true)}</span>\r\n            </li>\r\n            <li class=\"finance-list__item\">\r\n                <p class=\"desc\">${`4x ${t(\"payments:tpms\")}`}</p>\r\n                <span class=\"price\">${formatPrice(options.wheels.tpms, true)}</span>\r\n            </li>\r\n            <li class=\"finance-list__item\">\r\n                <p class=\"desc\">${t(\"payments:installation\")}</p>\r\n                <span class=\"price\">${formatPrice(options.wheels.install_cost, true)}</span>\r\n            </li>`\r\n        }\r\n\r\n        return optionList;\r\n    }\r\n    \r\n    function getAccessoriesDetails() {\r\n        let accessories = sessionStorage.getItem(Constants.SelectedAccessories);\r\n        accessories = JSON.parse(accessories);        \r\n        \r\n        const accList = accessories.map((accessory, index) => {\r\n            return(\r\n                <>  \r\n                    <li className=\"finance-list__item financeOptions_accessories\">\r\n                        <p className=\"desc\">{accessory.name}</p>\r\n                        <span className=\"price\">{formatPrice(accessory.base_msrp, true)}</span>\r\n                    </li>\r\n                    <li className=\"finance-list__item financeOptions_accessories\">\r\n                        <p className=\"desc\">{accessory.name} - Installation</p>\r\n                        <span className=\"price\">{formatPrice(accessory.install_cost, true)}</span>\r\n                    </li>\r\n                </>\r\n            )\r\n        });\r\n        return accList;\r\n    }\r\n\r\n    const financeDropdown = async () => {\r\n        if(didInit){\r\n            const collapse1 = financeDetailRef1.current;\r\n            const collapse2 = financeDetailRef2.current;\r\n            const collapse3 = financeDetailRef3.current;\r\n\r\n            window.mzAnimator.animateHeight(collapse1, 'CollapseDetailedFinance1', 'init')\r\n            window.mzAnimator.animateHeight(collapse2, 'CollapseDetailedFinance2', 'init')\r\n            window.mzAnimator.animateHeight(collapse3, 'CollapseDetailedFinance3', 'init')\r\n            setInit(true);\r\n            toggleCollapse(false);\r\n        }\r\n    }\r\n    \r\n    const financeTermSelect = async () => {\r\n        setFinancialInfo(await summaryCalculator.RecalculateFinancialInfo());\r\n    }\r\n\r\n    async function handleReserveYoursClick() {\r\n        const isRetailerMode = await summaryCalculator.isRetailerMode();\r\n        summaryCalculator.CurrentPurchaseMethod = 'Finance';\r\n        if (isRetailerMode) {\r\n                setReserveModalOpen(true);\r\n        } else {\r\n            openGetLocal();\r\n        }\r\n    }\r\n\r\n    function handlePreOrderClick() {\r\n        document.querySelector('body').classList.add('disabled');\r\n        setPreorderModalOpen(true)\r\n    }\r\n\r\n    function openGetLocal(){\r\n        const lang = getLang();\r\n        gtmHelper.setGTM({'action':'Open Modal','modal': 'Contact Dealer'}, true, false);\r\n\r\n        const targetModal = document.getElementById('mz-react-send-build-to-dealer-modal');\r\n        if (targetModal && summaryCalculator) {\r\n            if (summaryCalculator.SelectedColourExteriorIndex !== 'null' && summaryCalculator.Colours !== null) {\r\n                const heading = targetModal.querySelector('.mz-send-build-to-dealer__vehicle-name');\r\n                if (heading) {\r\n                    heading.textContent = lang === 'en' ? summaryCalculator._selectedModelYear.year.title + ' ' + ReactHtmlParser(summaryCalculator._selectedModelYear.carline.title) : ReactHtmlParser(summaryCalculator._selectedModelYear.carline.title) + ' ' + summaryCalculator._selectedModelYear.year.title;\r\n                }\r\n            }\r\n            openModal('mz-react-send-build-to-dealer-modal');\r\n        }\r\n    }\r\n    const hasResponseError = summaryCalculator.getResponsesHasError();\r\n\r\n    function getWeeklyPrice() {\r\n        if (hasResponseError)\r\n            return formatPrice(0);\r\n        else\r\n            return formatPrice(financialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex][summaryCalculator.IncludeTaxes ? 'weeklyWithTaxes' : 'weekly']);\r\n    }\r\n\r\n    function getBiWeeklyPrice() {\r\n        if (hasResponseError)\r\n            return formatPrice(0);\r\n        else\r\n            return formatPrice(financialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex][summaryCalculator.IncludeTaxes ? 'biWeeklyWithTaxes' : 'biWeekly'])\r\n    }\r\n\r\n    function getMonthlyPrice() {\r\n        if (hasResponseError)\r\n            return formatPrice(0);\r\n        else\r\n            return formatPrice(financialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex][[summaryCalculator.IncludeTaxes ? 'monthlyWithTaxes' : 'monthly']])\r\n    }\r\n\r\n    function getDisplayedRate() {\r\n        if (hasResponseError)\r\n            return '-';\r\n\r\n        const financeElement = summaryCalculator.FinancialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex];\r\n        if (Number.parseFloat(financeElement.aprRate) !== Number.parseFloat(financeElement.aprRateDiscounted))\r\n            return convertNum(financeElement.aprRateDiscounted,2) + '%';\r\n        else\r\n            return convertNum(financeElement.aprRate,2) + '%';\r\n    }\r\n\r\n    function getInformationalRate() {\r\n        if (hasResponseError)\r\n            return '-';\r\n        else\r\n            return convertNum(summaryCalculator.getLoanInformationalAprRate(),2) + '%';\r\n    }\r\n        \r\n    function getCostOfBorrowing() {\r\n        const costOfBorrowing = includeTaxes ? summaryCalculator.FinancialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].costOfBorrowingWithTaxes : summaryCalculator.FinancialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].costOfBorrowing\r\n\r\n        return hasResponseError ? '-' :formatPrice(costOfBorrowing, true);\r\n    }\r\n\r\n    return (\r\n        <div className=\"mz-finance-options finance\">\r\n            <h4>{t(\"finance_options\")}</h4>\r\n            {!summaryCalculator.getResponsesHasError() ?\r\n            <>\r\n            <div className=\"mz-finance__count\">\r\n                <div className=\"mz-finance__count-item \">\r\n                    <p>{t(\"weekly\")}</p>\r\n                    <span>{getWeeklyPrice()}</span> \r\n                </div>\r\n                <div className=\"mz-finance__count-item \">\r\n                    <p>{t(\"bi_weekly\")}</p>\r\n                    <span>{getBiWeeklyPrice()}</span> \r\n                </div>\r\n                <div className=\"mz-finance__count-item \">\r\n                    <p>{t(\"monthly\")}</p>\r\n                    <span>{getMonthlyPrice()}</span> \r\n                </div>\r\n            </div>\r\n            <div className=\"mz-finance__terms\">\r\n                <CollapseFinance dropdownCallback={financeDropdown} selectCallback={financeTermSelect} setSelectedFinanceOption={setSelectedFinanceOption} />\r\n            </div>\r\n            </> \r\n            :\r\n            <>\r\n                <p className=\"text--center\">\r\n                    {ReactHtmlParser(t(\"general:generalErrorMessage\"))}\r\n                </p>\r\n            </>}\r\n            <div className=\"hr light\"></div>\r\n            <div className={`mz-finance__numbs ${!showDetailedPricing ? 'collapsed' : \r\n            ''}`}>\r\n                <ul className=\"finance-list hidden\"  ref={financeDetailRef1}>\r\n                    <li className=\"finance-list__item\">\r\n                        <p className=\"desc\">{t(\"msrp\")}</p>\r\n                        <span className=\"price\">{`${formatPrice(summaryCalculator.SelectedModel.financial.msrp, true)}`}</span>\r\n                    </li>\r\n                    <li className=\"finance-list__item\">\r\n                        <p className=\"desc\">{t(\"trade_in\")}<sup>1</sup></p>\r\n                        <span className=\"price discount\">{`${summaryCalculator.FinancialInfo.tradeInValue > 0 ? '-' : ''}${formatPrice(summaryCalculator.FinancialInfo.tradeInValue, true)}`}</span>\r\n                    </li>\r\n                    {currentIncentives && currentIncentives.value >0 ?\r\n                    <li className=\"finance-list__item\">\r\n                        <p className=\"desc\">{t(\"current_incentive\")} <Tooltip TooltipName=\"incentives\" incentives={currentIncentives.value}/></p>\r\n                        <span className=\"price discount\">{currentIncentives?'-':''}{formatPrice(currentIncentives.value, true)}</span>\r\n                    </li>:''}\r\n                    {ReactHtmlParser(getOptionList())}\r\n                    {summaryCalculator.FinancialInfo.calculatedLease?.accessories.total > 0 ?\r\n                        getAccessoriesDetails()\r\n                    : '' }\r\n                    <li className=\"finance-list__item\">\r\n                        <p className=\"desc\">{t(\"freight\")}</p>\r\n                        <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.freight, true)}`}</span>\r\n                    </li>\r\n                    <li className=\"finance-list__item\">\r\n                        <p className=\"desc\">{t(\"general:pde\")}</p>\r\n                        <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.pde, true)}`}</span>\r\n                    </li>\r\n                    {includeFees ? <li className=\"finance-list__item\">\r\n                        <p className=\"desc\">\r\n                            {getMazdaFeesAndLeviesDetailTitle(\"Administration Fee\", t)}\r\n                            <sup>9</sup>\r\n                        </p>\r\n                        <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.adminServiceFees, true)}`}</span>\r\n                    </li>:''}                            \r\n                    {includeFees ? feesAndLeviesToDisplay.map((fee, index) => {\r\n                        return <li className=\"finance-list__item\" key={index}>\r\n                            <p className=\"desc\">{ReactHtmlParser(getMazdaFeesAndLeviesDetailTitle(fee.title,t))}\r\n                                {fee.sup ? ReactHtmlParser(`<sup>${fee.sup}</sup>`) : ''}\r\n                            </p>\r\n                            <span className=\"price\">{`${formatPrice(fee.price, true)}`}</span>\r\n                        </li>\r\n                    }):''}\r\n                    {includeRebates ? ReactHtmlParser(getRebatesDetails()) : \"\"}\r\n                </ul>\r\n                <ul className=\"finance-list hidden\" ref={financeDetailRef2}>\r\n                    <li className=\"finance-list__item\"><p className=\"desc\">{provinceCode === \"QC\" ? \"RDPRM\" : \"PPSA\"}<sup>7</sup></p>\r\n                        <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].ppsa, true)}`}</span>\r\n                    </li>\r\n                    <li className=\"finance-list__item\">\r\n                        <p className=\"desc\">{t(\"sub_total\")}</p>\r\n                        <span className=\"price\">\r\n                            { includeFees &&  includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.subtotalWithFeesWithRebates, true)}`}</span> : null}\r\n                            { includeFees && !includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.subtotalWithFees, true)}`}</span> : null}\r\n                            {!includeFees &&  includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.subtotalWithRebates, true)}`}</span> : null}\r\n                            {!includeFees && !includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.subtotal, true)}`}</span> : null}\r\n                        </span>\r\n                    </li>\r\n                    {includeTaxes?<li className=\"finance-list__item\">\r\n                        <p className=\"desc\">{t(\"taxes\")}</p>\r\n                        <span className=\"price\">\r\n                            <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.subtotalTaxes, true)}`}</span> \r\n                        </span>\r\n                    </li>:''}\r\n\r\n                    <li className=\"finance-list__item\">\r\n                        <p className=\"desc\">{t(\"down_payment\")}<sup>2</sup></p>\r\n                        <span className=\"price discount\">{`${summaryCalculator.FinancialInfo.downPaymentValue > 0 ? '-' : ''}${formatPrice(summaryCalculator.FinancialInfo.downPaymentValue, true)}`}</span>\r\n                    </li>\r\n\r\n                    {summaryCalculator.FinancialInfo.calculatedFinance.rewards.map((el, index) => {\r\n                        return <li className=\"finance-list__item\" key={index}>\r\n                            <p className=\"desc\">{getIncentiveDisplayName(el.type)}</p>\r\n                            <span className=\"price discount\">{`-${el.cash_value?formatPrice(el.cash_value, true):formatPrice(el.value, true)}`}</span>\r\n                        </li>\r\n                    })}\r\n\r\n                </ul>\r\n                <ul className={`finance-list  ${showDetailedPricing ? 'finance-list__border' : ''}`}>\r\n                    <li className=\"finance-list__item\">\r\n                        <p className=\"desc\">{t(\"balance_to_finance\")}</p>\r\n                            {includeFees && includeTaxes && includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceWithFeesWithRebatesTaxed, true)}`}</span> : null}\r\n                            {!includeFees && includeTaxes && includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceWithRebatesTaxed, true)}`}</span> : null}\r\n                            {includeFees && !includeTaxes && includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceWithFeesWithRebates, true)}`}</span> : null}\r\n                            {includeFees && includeTaxes && !includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceWithFeesTaxed, true)}`}</span> : null}\r\n                            {includeFees && !includeTaxes && !includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceWithFees, true)}`}</span> : null}\r\n                            {!includeFees && includeTaxes && !includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceTaxed, true)}`}</span> : null}\r\n                            {!includeFees && !includeTaxes && includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceWithRebates, true)}`}</span> : null}\r\n                            {!includeFees && !includeTaxes && !includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinance, true)}`}</span> : null}\r\n                    </li>\r\n                    <div ref={financeDetailRef3}>\r\n                        <li className=\"finance-list__item\">\r\n                            <p className=\"desc\">{t(\"period_of_loan\")}</p>\r\n                            <span className=\"price\">{`${summaryCalculator.FinancialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].term}`} {t(\"months\")}</span>\r\n                        </li>\r\n                        <li className=\"finance-list__item\">\r\n                            <p className=\"desc\">{t(\"rate\")}</p>\r\n                            <span className=\"price\">{getDisplayedRate()}</span>\r\n                        </li>\r\n                        <li className=\"finance-list__item\">\r\n                            <p className=\"desc\">{t(\"informational_apr\")}</p>\r\n                            <span className=\"price\">{getInformationalRate()}</span>\r\n                        </li>\r\n                    </div>\r\n                </ul>\r\n                <ul className={`finance-list  ${showDetailedPricing ? 'finance-list__border' : ''}`}>\r\n                    <li className=\"finance-list__item\">\r\n                        <p className=\"desc\">{t(\"cost_of_borrowing\")}</p>\r\n                        <span className=\"price\">{getCostOfBorrowing()}</span>\r\n                    </li>\r\n                    <li className=\"finance-list__item no-spacing\">\r\n                        <a className=\"mz-link label text--grey\" href=\"/\" \r\n                            onClick={(e) =>{\r\n                                e.preventDefault();\r\n                                toggleShowDetailedPricing(!showDetailedPricing);\r\n                               \r\n                            }}>{t(\"show_detailed_pricing\")}</a>\r\n                        <a className=\"no_line label\" href=\"/\" \r\n                            onClick={(e) =>{\r\n                                e.preventDefault();\r\n                                toggleShowDetailedPricing(!showDetailedPricing);\r\n                               \r\n                            }}><i className={`mz-svg mz-svg-chevron_small mz-svg--red ${showDetailedPricing ? 'mz-svg--rotate270' : 'mz-svg--rotate90'}`}></i></a>\r\n                    </li>\r\n                </ul>\r\n                <div className=\"mz-financial--cta hidden\">\r\n                    {window.allow_oca ?\r\n                    <Button primary={true} label={ReactHtmlParser(String(t(\"summary:btn_apply_for_financing\")))} iconBefore={false} onClick={()=>financeClick('loan')}/>\r\n                    :\r\n                    summaryCalculator.isSelectionPreOrder() ?\r\n                    <Button primary={true} label={String(t(\"summary:btn_pre_order\"))} iconBefore={false} onClick={handlePreOrderClick}/>\r\n                    :\r\n                    <Button primary={true} label={String(t(\"summary:btn_reserve_yours\"))} iconBefore={false} onClick={handleReserveYoursClick}/>}\r\n                </div>\r\n                <div className=\"finance_disclaimer\">\r\n                    {currentIncentives && currentIncentives.value != 0 ?\r\n                        i18n.language == \"en\" ?\r\n                            <>\r\n                            <p className=\"caption\">Payments shown include a <span className=\"text--red\">{formatPrice(currentIncentives.value)}</span> Current Incentive.<br/><a className=\"mz-link--black\" onClick={handleContactDealerLinkClick}>Contact your local Mazda retailer</a> for details.</p>\r\n                            <br /> \r\n                            </>\r\n                        :\r\n                            <>\r\n                            <p className=\"caption\">Les paiements indiqués incluent l'offre incitatives actuelle de <span className=\"text--red\">{formatPrice(currentIncentives.value)}</span>. <a className=\"mz-link--black\" onClick={handleContactDealerLinkClick}>Communiquez avec votre concessionnaire Mazda</a> pour les détails.</p>\r\n                            <br />\r\n                            </>\r\n                    :\r\n                        ''\r\n                    }\r\n                    {i18n.language == \"en\" ?\r\n                        <p className=\"caption\">Informational APR {getInformationalRate()}. The rate selected is a special promotional rate. Alternatively, you can take advantage of cash purchase incentives that cannot be combined with the special promotional rate and your Informational APR would be as outlined above.</p>\r\n                    :\r\n                        <p className=\"caption\">TAP informatif {getInformationalRate()}. Le taux sélectionné est un taux promotionnel spécial. Si vous profitez plutôt des offres à l'achat au comptant qui ne peuvent être combinées avec le taux promotionnel spécial, votre TAP informatif serait celui indiqué ci-dessus.</p>\r\n                    }\r\n                </div>\r\n            </div>\r\n            <OcaModal isOpen={ocaOpen} financeType={financeType} handleClose={setOcaModalOpen}></OcaModal> \r\n        </div>\r\n    )\r\n}\r\n\r\nFinanceOptions.propTypes = {\r\n\r\n}\r\n\r\nFinanceOptions.defaultProps = {\r\n\r\n}","import React, { useState, useEffect, useRef }  from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\n//import SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport { formatPrice, convertNum, setCursorWaiting } from '../../../utils'\r\n\r\nexport const CollapseLease = ({dropdownCallback, selectCallback, setSelectedLeaseOption, ...props }) => {\r\n    const { t, i18n } = useTranslation(['payments', 'general']);\r\n\r\n    const summaryCalculator = window.summaryCalculator;\r\n\tconst gtmHelper = new GTMHelper();\r\n\r\n    const [collapseOpenContent, setCollapseOpenContent] = useState('');\r\n\r\n    const [isCollapsed, setIsCollapsed] =  useState(false);\r\n    const [didInit, setInit] = React.useState(false);\r\n    const collapseRef = useRef();\r\n\r\n    const [update, setForceUpdate] =  useState('');\r\n\r\n    function leaseTermCanBeDisplayed(term) {\r\n        const allowedTerm = [36,39,42,45,48,51,54,57,60];\r\n\r\n        return allowedTerm.includes(term);\r\n    }\r\n\r\n    function hasRatePercentageDiscount(leaseElement) {\r\n        return (Number.parseFloat(leaseElement.leaseRate) !== Number.parseFloat(leaseElement.leaseRateDiscounted));\r\n    }\r\n    \r\n    function getLeaseOptions(financialInfo) {\r\n        if (summaryCalculator.getResponsesHasError() === true)\r\n        return (\r\n            <>\r\n            <div className='mz-finance-options__financial-element-error-msg'>{t(\"general:contact_a_dealer\")}</div>\r\n            </>\r\n        ) \r\n        else\r\n        return (\r\n            <ul className=\"mz-lease-options__financial-element-list mz-collapse__box--element-list\">\r\n                {summaryCalculator.LoyaltyChecked ?\r\n                <li className=\"loyalty-title\">{t(\"payments:mazda_loyalty_collapse_title\")}</li>: ''}\r\n                <li className=\"mz-lease-options__financial-element mz-collapse__box--element headers\">\r\n                    <span>{t(\"months\")}</span><span>{t(\"rate\")}</span><span>{t(\"weekly_payment\")}</span><span>{t(\"bi_weekly_payment\")}</span><span>{t(\"monthly_payment\")}</span>\r\n                </li>\r\n                { financialInfo.calculatedLease.leaseValues.map((leaseElement, index) => {\r\n                    if (leaseTermCanBeDisplayed(leaseElement.term)){\r\n                        return (\r\n                            <>\r\n                            <li className=\"mz-lease-options__financial-element mz-collapse__box--element\" key={index}>\r\n                                <span><input type=\"checkbox\" name=\"leaseTermOptions\" data-term-selected={leaseElement.term} value={index} onChange={itemClick} checked={parseInt(summaryCalculator.LeaseTermIndex) === index ? true : false} id={leaseElement.term +'__months'} /><label htmlFor={leaseElement.term + '__months'}>{leaseElement.term}</label></span>\r\n                                {summaryCalculator.LoyaltyChecked && hasRatePercentageDiscount(leaseElement) ? \r\n                                    <span className=\"rate text--red\"><span className='rate-strike '>{convertNum(leaseElement.leaseRate, 2)}% </span> {convertNum(leaseElement.leaseRateDiscounted, 2)}%</span>:\r\n                                    <span className=\"rate\">{convertNum(leaseElement.leaseRate, 2)}%</span>\r\n                                }\r\n                                <span className=\"weekly\"><span>{formatPrice(leaseElement[summaryCalculator.IncludeTaxes ? 'weeklyWithTaxes' : 'weekly'])}</span></span>\r\n                                <span className=\"biWeekly\"><span>{formatPrice(leaseElement[summaryCalculator.IncludeTaxes ? 'biWeeklyWithTaxes' : 'biWeekly'])}</span></span>\r\n                                <span className=\"weekly\"> <span>{formatPrice(leaseElement[summaryCalculator.IncludeTaxes ? 'monthlyWithTaxes' : 'monthly'])}</span></span>\r\n                            </li>\r\n                            {summaryCalculator.LoyaltyChecked && !hasRatePercentageDiscount(leaseElement) ? \r\n                                <li className=\"text--center text--red\" style={{'font-size': '0.6rem', 'margin-top': '-16px'}}>\r\n                                    <span className=\"loyalty\">{t(\"payments:item_contains_discount\", { discount: formatPrice(summaryCalculator.Incentives.loyalty.cash_value) })}</span>\r\n                                </li>: null}\r\n                            </>\r\n                        )\r\n                    }\r\n                })}\r\n            </ul>\r\n        )\r\n    }\r\n    \r\n    async function handleClick(e) {\r\n        const financialInfo = await summaryCalculator.RecalculateFinancialInfo();\r\n\r\n        setCollapseOpenContent(getLeaseOptions(financialInfo));\r\n\r\n        setIsCollapsed(!isCollapsed);\r\n\r\n        setInit(false);\r\n\r\n        setForceUpdate(Math.random());\r\n\r\n        gtmHelper.setGTM({'action':'Collapse', 'type': 'Lease Term', 'value': !isCollapsed}, true , false);\r\n    }\r\n\r\n    function itemClick(e) {\r\n        summaryCalculator.LeaseTermIndex = parseInt(e.target.value);\r\n        summaryCalculator.LeaseTerm = parseInt(e.target.getAttribute(\"data-term-selected\"));\r\n        setSelectedLeaseOption(e.target.value);\r\n\r\n        selectCallback();\r\n        \r\n        setCollapseOpenContent(getLeaseOptions(summaryCalculator.FinancialInfo));\r\n\r\n        gtmHelper.setGTM({'action':'Checkbox', 'type': 'Lease Term', 'value': e.target.dataset['termSelected']}, true , false);\r\n    }\r\n\r\n    function getDisplayedRate() {\r\n        const leaseElement = summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex];\r\n\r\n        if (summaryCalculator.getResponsesHasError() === true)\r\n            return convertNum(0,2);        \r\n        else {\r\n            //return convertNum(summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].leaseRate,2);\r\n            if (hasRatePercentageDiscount(leaseElement))\r\n                return convertNum(leaseElement.leaseRateDiscounted,2)\r\n            else\r\n                return convertNum(leaseElement.leaseRate,2);\r\n        }\r\n    }\r\n\r\n    useEffect(() => {\r\n        (async () => {\r\n            setCursorWaiting(true);\r\n\r\n            const financialInfo = await summaryCalculator.RecalculateFinancialInfo();\r\n\r\n            setCollapseOpenContent(getLeaseOptions(financialInfo));\r\n\r\n            //setForceUpdate(Math.random());\r\n\r\n            setCursorWaiting(false);\r\n        })();\r\n    }, [summaryCalculator.AnnualMileage]);\r\n\r\n    useEffect(() => {\r\n        (async () => {\r\n            setCursorWaiting(true);\r\n\r\n            const financialInfo = await summaryCalculator.RecalculateFinancialInfo();\r\n\r\n            setCollapseOpenContent(getLeaseOptions(financialInfo));\r\n    \r\n            setInit(false);\r\n            //setIsCollapsed(false);\r\n            const collapse = collapseRef.current;\r\n            collapse.style.height = null;\r\n            //collapse.style.removeProperty('height');\r\n            \r\n            //setForceUpdate(Math.random());\r\n            //window.mzAnimator.animateHeight(collapse, 'CollapseListLease', true);\r\n\r\n            setCursorWaiting(false);            \r\n        })();\r\n    }, [summaryCalculator._tradeInValue, summaryCalculator._downPaymentValue, summaryCalculator.LoyaltyChecked, summaryCalculator.GraduateChecked, summaryCalculator.MilitaryChecked, summaryCalculator.FirstTimeOwnerChecked, summaryCalculator.IncludeFees, summaryCalculator.IncludeTaxes, summaryCalculator.IncludeRebates]);\r\n\r\n    useEffect(() => {\r\n        (async () => {\r\n            const collapse = collapseRef.current;\r\n\r\n            if(typeof window.mzAnimator === 'object' && !didInit){\r\n                window.mzAnimator.animateHeight(collapse, 'CollapseListLease', 'init');\r\n                setInit(true);\r\n                window.mzAnimator.animateHeight(collapse, 'CollapseListLease', isCollapsed);\r\n            } \r\n            else {\r\n                window.mzAnimator.animateHeight(collapse, 'CollapseListLease', isCollapsed);\r\n            }\r\n            \r\n            collapse.className = 'mz-collapse__box visible ' + (!isCollapsed ? 'mz-collapse__box--finance-collapsed' : 'mz-collapse__box--finance-expanded');\r\n\r\n            if(isCollapsed === false)\r\n                dropdownCallback();\r\n        })();\r\n    },[isCollapsed, didInit]);\r\n\r\n    useEffect(() => {\r\n        console.log('reupdating lease collapse');\r\n    }, [update]);\r\n\r\n    useEffect(() => {\r\n        setForceUpdate(Math.random());\r\n    }, [collapseOpenContent]);\r\n\r\n    return (\r\n        <div className=\"mz-collapse mz-collapse--finance\">\r\n            <button\r\n                onClick={handleClick}\r\n                className=\"mz-collapse__button\"\r\n            >\r\n                <div className=\"mz-collapse__cartext-container\">\r\n                    <p className=\"mz-collapse__text\">{t(\"term\")}: {summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].term} {t(\"payments:months_lowercase\")} {getDisplayedRate()}%</p>\r\n                </div>\r\n                <i className={ isCollapsed ? \"mz-svg mz-svg-chevron_small open  mz-svg--grey\" : \"mz-svg mz-svg-chevron_small  mz-svg--grey\"}></i>\r\n            </button>\r\n            <div className=\"mz-collapse__box\" ref={collapseRef}>{collapseOpenContent}</div>\r\n        </div>\r\n    )\r\n}\r\n\r\nCollapseLease.propTypes = {\r\n}\r\n\r\nCollapseLease.defaultProps = {\r\n}\r\n\r\nexport default CollapseLease;","import React, { useState, useEffect, useRef }  from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\n//import SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport { convertNum, setCursorWaiting } from '../../../utils'\r\n\r\nexport const CollapseLeaseMileage = ({callback, key, setSelectedLeasesMileage, ...props }) => {\r\n    const { t, i18n } = useTranslation(['payments', 'general']);\r\n\r\n    const summaryCalculator = window.summaryCalculator;\r\n\tconst gtmHelper = new GTMHelper();\r\n\r\n    const [isCollapsed, setIsCollapsed] =  useState(false);\r\n    const [didInit, setInit] = React.useState(false);\r\n    const collapseRef = useRef();\r\n\r\n    const [collapseClosedContent, setCollapseClosedContent] = useState('');\r\n    const [currentMileage, setCurrentAnnuelMileage] = useState(summaryCalculator.AnnualMileage);\r\n    \r\n    const [update, setForceUpdate] =  useState('');\r\n\r\n    //content for mileage current drop down select\r\n    const ClosedContent = ()=>{\r\n        let mileage = '';\r\n\r\n        switch (parseInt(summaryCalculator.AnnualMileage)) {\r\n            case 2:\r\n                mileage = 20000;\r\n                break;\r\n            case 3:\r\n                mileage = 16000;\r\n                break;\r\n            case 0:\r\n                mileage = 24000;\r\n                break;\r\n            default:\r\n                break;\r\n        }\r\n\r\n        return `${t(\"annual_km\")}: ${convertNum(mileage)}`\r\n    }\r\n\r\n    //content for mileage dropdown\r\n    function collapseOpenContent() {\r\n        return (\r\n            <ul className=\"mz-finance-options__financial-element-list annual-mileage-options\">\r\n               \r\n                <li className={`mz-finance-options__financial-element ${summaryCalculator.AnnualMileage === 3 ? 'selected' : ''}`}>\r\n                    <span onClick={itemClick}><label htmlFor=\"annualMileage\">{t(\"annual_km_16000\")}</label><input type=\"hidden\" name=\"annualMileage\" value=\"3\" id=\"ultra_kilometer_lease\"/></span> <i className=\"mz-svg mz-svg-checkmark\"></i>\r\n                </li>\r\n               \r\n                <li className={`mz-finance-options__financial-element ${summaryCalculator.AnnualMileage === 2 ? 'selected' : ''}`}>\r\n                    <span onClick={itemClick}><label htmlFor=\"annualMileage\">{t(\"annual_km_20000\")}</label><input type=\"hidden\" name=\"annualMileage\" value=\"2\" id=\"low_kilometer_lease\"/></span> <i className=\"mz-svg mz-svg-checkmark\"></i> \r\n                </li>\r\n                <li className={`mz-finance-options__financial-element ${summaryCalculator.AnnualMileage === 0 ? 'selected' : ''}`}>\r\n                    <span onClick={itemClick}><label htmlFor=\"annualMileage\">{t(\"annual_km_24000\")}</label><input type=\"hidden\" name=\"annualMileage\" value=\"0\" id=\"standard_kilometer_lease\"/></span> <i className=\"mz-svg mz-svg-checkmark\"></i>\r\n                </li>\r\n            </ul>\r\n        );\r\n    }\r\n\r\n    function handleClick(e) {\r\n        setIsCollapsed(!isCollapsed);\r\n\r\n        setInit(false);\r\n        \r\n\t\tgtmHelper.setGTM({'action':'Collapse', 'type': 'Lease Mileage', 'value': !isCollapsed}, true , false);\r\n    }\r\n\r\n    // update mileage value\r\n    async function itemClick(e) {\r\n        setCursorWaiting(true);\r\n\r\n        callback(e);\r\n\r\n        //setForceUpdate(Math.random());\r\n        \r\n        setCursorWaiting(false);\r\n\r\n        gtmHelper.setGTM({'action':'Checkbox', 'type': 'Lease Mileage', 'value': summaryCalculator.AnnualMileage}, true , false);\r\n    }\r\n\r\n    useEffect(() =>{\r\n        (async () => {\r\n            //setInit(false);\r\n            //setIsCollapsed(false);\r\n            const collapse = collapseRef.current;\r\n\r\n            if(!isCollapsed)\r\n                collapse.style.height = \"0px\";\r\n            else {\r\n                collapse.style.height = null;\r\n                window.mzAnimator.animateHeight(collapse, 'CollapseListMileage', true);\r\n            }\r\n\r\n            //collapse.style.removeProperty('height');\r\n            \r\n            //setForceUpdate(Math.random());\r\n\r\n            setCollapseClosedContent(ClosedContent());\r\n        })();        \r\n    }, [summaryCalculator._tradeInValue, summaryCalculator._downPaymentValue, summaryCalculator.LoyaltyChecked, summaryCalculator.GraduateChecked, summaryCalculator.MilitaryChecked, summaryCalculator.FirstTimeOwnerChecked, summaryCalculator.IncludeFees, summaryCalculator.IncludeTaxes, summaryCalculator.IncludeRebates]);\r\n\r\n    useEffect(() =>{\r\n        (async () => {\r\n            const collapse = collapseRef.current;\r\n\r\n            /*if(typeof window.mzAnimator === 'object'){\r\n                window.mzAnimator.animateHeight(collapse, 'CollapseListMileage', 'init')\r\n            }*/\r\n\r\n            if(typeof window.mzAnimator === 'object' && !didInit){\r\n                window.mzAnimator.animateHeight(collapse, 'CollapseListMileage', 'init')\r\n                setInit(true);\r\n                window.mzAnimator.animateHeight(collapse, 'CollapseListMileage', isCollapsed);\r\n            }\r\n            else {\r\n                //collapse.style.height = \"500px\";\r\n                window.mzAnimator.animateHeight(collapse, 'CollapseListMileage', isCollapsed);            \r\n            }\r\n\r\n        })();\r\n    }, [isCollapsed, didInit]);\r\n\r\n    /*useEffect(()=>{\r\n        \r\n    }, [currentMileage, update]);*/\r\n\r\n    useEffect(()=>{\r\n        setCurrentAnnuelMileage(summaryCalculator.AnnualMileage);\r\n\r\n        setCollapseClosedContent(ClosedContent());\r\n    }, [summaryCalculator.AnnualMileage]);\r\n\r\n    return (\r\n        <div className=\"mz-collapse mz-collapse--finance\" key={key}>\r\n            <button\r\n                onClick={handleClick}\r\n                className=\"mz-collapse__button\"\r\n            >\r\n                <div className=\"mz-collapse__cartext-container\">\r\n                    <p className=\"mz-collapse__text\">{collapseClosedContent}</p>\r\n                </div>\r\n                <i className={ !isCollapsed ? \"mz-svg mz-svg-chevron_small open  mz-svg--grey\" : \"mz-svg mz-svg-chevron_small  mz-svg--grey\"}></i>\r\n            </button>\r\n            <div className=\"mz-collapse__box\" ref={collapseRef}>{collapseOpenContent()}</div>\r\n        </div>\r\n    )\r\n}\r\n\r\nCollapseLeaseMileage.propTypes = {\r\n\r\n}\r\n\r\nCollapseLeaseMileage.defaultProps = {\r\n\r\n}\r\n\r\nexport default CollapseLeaseMileage;","import React, { useState, useEffect, useRef }  from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\n\r\nimport { formatPrice, getIncentiveDisplayName, getMazdaFeesAndLeviesDetailTitle, convertNum, getProvince, getLang} from '../../../utils'\r\nimport { openModal } from '../../../Helpers/helpers';\r\n\r\n//import SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport { Tooltip } from '../../1_Atoms/Tooltip/Tooltip';\r\nimport { Button } from '../../1_Atoms/Button/Button';\r\nimport { OcaModal } from '../../3_Organisms/Modal/OcaModal';\r\nimport CollapseLease from '../Collapse/CollapseLease';\r\nimport CollapseLeaseMileage from '../Collapse/CollapseLeaseMileage';\r\n\r\nexport const LeaseOptions = ({ setSelectedLeaseOption, includeFees, includeTaxes, includeRebates, setSelectedLeasesMileage, setPreorderModalOpen, ...props }) => {\r\n    const navigate = useNavigate();\r\n    const { year, carline, trim, model, packageCode } = useParams();\r\n    const summaryCalculator = window.summaryCalculator;\r\n    \r\n    const { t, i18n } = useTranslation(['payments', 'general', 'summary']);\r\n    const provinceCode = getProvince().toUpperCase();\r\n    const [financialInfo, setFinancialInfo] = useState(summaryCalculator.FinancialInfo);\r\n    const [update, setForceUpdate] =  useState(''); \r\n    const [isLeaseTermCollapsed, setLeaseTermCollapsed] = useState(false);\r\n\r\n    const [didInit, setInit] = useState(false);\r\n    const [showDetailedPricing, toggleShowDetailedPricing] = useState(false);\r\n    const leaseDetailRef1 = useRef();\r\n    const leaseDetailRef2 = useRef();\r\n    const leaseDetailRef3 = useRef();\r\n\r\n\tconst gtmHelper = new GTMHelper();\r\n    \r\n    const [ocaOpen, setOcaModalOpen] = useState(false);\r\n    const [financeType, setFinanceType] = useState(false);\r\n\r\n    //Fixed Number provided by API\r\n    const [currentIncentives, setCurrentIncentives] = useState(null);\r\n    \r\n    const [reserveOpen, setReserveModalOpen] = React.useState(false);\r\n\r\n    useEffect(() =>{\r\n        const collapse1 = leaseDetailRef1.current;\r\n        const collapse2 = leaseDetailRef2.current;\r\n        const collapse3 = leaseDetailRef3.current;\r\n        \r\n        if(typeof window.mzAnimator === 'object' && !didInit && showDetailedPricing){\r\n            window.mzAnimator.animateHeight(collapse1, 'CollapseDetailedLease1', 'init')\r\n            window.mzAnimator.animateHeight(collapse2, 'CollapseDetailedLease2', 'init')\r\n            window.mzAnimator.animateHeight(collapse3, 'CollapseDetailedLease3', 'init')\r\n            setInit(true);\r\n            toggleCollapse(false);\r\n        }else{\r\n            toggleCollapse(true);\r\n        }\r\n    },[showDetailedPricing, didInit]);\r\n\r\n \r\n    function toggleCollapse(fromClick) {\r\n        const collapse1 = leaseDetailRef1.current;\r\n        const collapse2 = leaseDetailRef2.current;\r\n        const collapse3 = leaseDetailRef3.current;\r\n            \r\n        if(showDetailedPricing){\r\n            window.mzAnimator.animateHeight(collapse1, 'CollapseDetailedLease1', true)\r\n            window.mzAnimator.animateHeight(collapse2, 'CollapseDetailedLease2', true)\r\n            window.mzAnimator.animateHeight(collapse3, 'CollapseDetailedLease3', true)\r\n        }else{\r\n            window.mzAnimator.animateHeight(collapse1, 'CollapseDetailedLease1', false)\r\n            window.mzAnimator.animateHeight(collapse2, 'CollapseDetailedLease2', false)\r\n            window.mzAnimator.animateHeight(collapse3, 'CollapseDetailedLease3', false)\r\n        }\r\n        if(fromClick)\r\n            gtmHelper.setGTM({'action':'Collapse', 'type': 'Detailed Lease ', 'value': showDetailedPricing}, true , false);\r\n        \r\n    }\r\n    function financeClick(financeType){\r\n        document.querySelector('body').classList.add('disabled');\r\n\t\tsetOcaModalOpen(true);\r\n        setFinanceType(financeType);\r\n        \r\n        const price = summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithFeesWithRebatesTaxed;\r\n        gtmHelper.setGTM({'action':`OCA - Lease Payment`,'year': year,'model': ReactHtmlParser(carline), 'trim': trim, 'price' : Math.round(price)}, true, false);\r\n    }\r\n\r\n    function getRebatesDetails() {\r\n\t\treturn financialInfo !== null ? financialInfo.calculatedLease.evRebates.details.map((rebate, index) => `<li key=\"${index}\" class=\"finance-list__item rebate\">\r\n                \t<p class=\"desc text--green\">${rebate.title==='federal'? t('fed_rebate'):t('prov_rebate') + ' ('+getProvince()+')'}</p><span class=\"price text--green\">${rebate.lease ? '-' : ''}${formatPrice(rebate.lease, true)}</span>\r\n                </li>`).join(\"\") : '';\r\n    }\r\n\r\n    function getTaxRebatesDetails() {\r\n        return <>\r\n            <li class=\"finance-list__item\"><p class=\"desc\">{t('tax_fed_rebate')}</p><span class=\"price\">{formatPrice(financialInfo.calculatedLease.evRebates.total.lease_federal_tax, true)}</span></li>\r\n            <li class=\"finance-list__item\"><p class=\"desc\">{t('tax_prov_rebate') + ' ('+getProvince()+')'}</p><span class=\"price\">{formatPrice(financialInfo.calculatedLease.evRebates.total.lease_provincial_tax, true)}</span></li>\r\n        </>\r\n    }\r\n\r\n    function getOptionList() {\r\n        let optionList = '';\r\n        \r\n        const options = summaryCalculator.FinancialInfo ?.calculatedLease ?.options;\r\n\r\n        if(options.exteriorColour.price >0){\r\n            optionList += ` <li class=\"finance-list__item\">\r\n                <p class=\"desc\">${t('exterior')} ${options.exteriorColour.description}</p>\r\n                <span class=\"price\">${formatPrice(options.exteriorColour.price, true)}</span>\r\n            </li>`\r\n        }\r\n        if(options ?.interiorColour.price >0){\r\n            optionList += ` <li class=\"finance-list__item\">\r\n                <p class=\"desc\">${t('interior')} ${options.interiorColour.description}</p>\r\n                <span class=\"price\">${formatPrice(options.interiorColour.price, true)}</span>\r\n            </li>`\r\n        }\r\n        if(options ?.model_option_package ?.financial ?.msrp >0){\r\n            optionList += ` <li class=\"finance-list__item\">\r\n                <p class=\"desc\">${t('package')} ${options.model_option_package.name}</p>\r\n                <span class=\"price\">${formatPrice(options.model_option_package.financial.msrp, true)}</span>\r\n            </li>`\r\n        }\r\n\r\n        const selectedWarrantyPackage = JSON.parse(sessionStorage.getItem('selectedWarrantyPackage'));\r\n        if(selectedWarrantyPackage != null && selectedWarrantyPackage.name != undefined ){\r\n            const warrantyPrice = (JSON.parse(sessionStorage.getItem('selectedWarrantyPackage')).financial.msrp);\r\n            optionList += ` <li class=\"finance-list__item\">\r\n                <p class=\"desc\">${t(\"warranties\")} ${selectedWarrantyPackage.name}</p>\r\n                <span class=\"price\">${formatPrice(warrantyPrice, true)}</span>\r\n            </li>`\r\n        }   \r\n        \r\n        const selectedConnectedVehiclePackage = JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage'));\r\n        if(selectedConnectedVehiclePackage != null && selectedConnectedVehiclePackage.name != undefined){\r\n            const connectedPrice = (JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage')).financial.msrp);\r\n            optionList += ` <li class=\"finance-list__item\">\r\n                <p class=\"desc\">${t(\"connected\")} <span style=\"text-transform:lowercase\">${selectedConnectedVehiclePackage.name}</span></p>\r\n                <span class=\"price\">${formatPrice(connectedPrice, true)}</span>\r\n            </li>`\r\n        }\r\n\r\n        if(options.wheels.price >0){\r\n            const options = summaryCalculator.FinancialInfo ?.calculatedFinance ?.options;\r\n\r\n            optionList += `  <li class=\"finance-list__item\">\r\n                <p class=\"desc\">${`4x ${options.wheels.title}`}</p>\r\n                <span class=\"price\">${formatPrice(options.wheels.base_msrp, true)}</span>\r\n            </li>\r\n            <li class=\"finance-list__item\">\r\n                <p class=\"desc\">${`4x ${t(\"payments:tpms\")}`}</p>\r\n                <span class=\"price\">${formatPrice(options.wheels.tpms, true)}</span>\r\n            </li>\r\n            <li class=\"finance-list__item\">\r\n                <p class=\"desc\">${t(\"payments:installation\")}</p>\r\n                <span class=\"price\">${formatPrice(options.wheels.install_cost, true)}</span>\r\n            </li>`\r\n        }\r\n\r\n        return optionList;\r\n    }    \r\n\r\n    function getAccessoriesDetails() {\r\n        let accessories = sessionStorage.getItem(Constants.SelectedAccessories);\r\n        accessories = JSON.parse(accessories);        \r\n        \r\n        const accList = accessories.map((accessory, index) => {\r\n            return(\r\n                <>  \r\n                    <li className=\"finance-list__item financeOptions_accessories\">\r\n                        <p className=\"desc\">{accessory.name}</p>\r\n                        <span className=\"price\">{formatPrice(accessory.base_msrp, true)}</span>\r\n                    </li>\r\n                    <li className=\"finance-list__item financeOptions_accessories\">\r\n                        <p className=\"desc\">{accessory.name} - Installation</p>\r\n                        <span className=\"price\">{formatPrice(accessory.install_cost, true)}</span>\r\n                    </li>\r\n                </>\r\n            )\r\n        });\r\n        return accList;\r\n    }\r\n\r\n    const handleContactDealerLinkClick = (e) => {\r\n        e.preventDefault();\r\n\r\n        const contactRoute = `/${year}/${carline}/${trim}/${model}/${packageCode}/summary?contactDealer`;\r\n        navigate(contactRoute);\r\n    }\r\n    \r\n    useEffect(() =>{\r\n        (async function() {\r\n            setInit(false);\r\n            \r\n            setFinancialInfo(await summaryCalculator.RecalculateFinancialInfo());\r\n\r\n            setForceUpdate(Math.random());\r\n            \r\n        })();\r\n    },[summaryCalculator._tradeInValue, summaryCalculator._downPaymentValue, summaryCalculator.LoyaltyChecked, summaryCalculator.GraduateChecked, summaryCalculator.MilitaryChecked, summaryCalculator.FirstTimeOwnerChecked, summaryCalculator.IncludeFees, summaryCalculator.IncludeTaxes, summaryCalculator.AnnualMileage, summaryCalculator.IncludeRebates]);\r\n\r\n    useEffect(() => {\r\n        if(summaryCalculator.FinancialInfo.incentive_programs) \r\n            setCurrentIncentives(summaryCalculator.FinancialInfo.incentive_programs?.find(element => element.type === \"incentive\"));\r\n\r\n        console.log('refreshing the lease options section');\r\n        //console.log(summaryCalculator.FinancialInfo);\r\n    }, [update]);\r\n    \r\n    includeFees = summaryCalculator.IncludeFees;\r\n    includeTaxes = summaryCalculator.IncludeTaxes;\r\n    includeRebates = summaryCalculator.IncludeRebates;\r\n\t\r\n    const leaseDropdown = async (isOpen) => {\r\n        if(didInit){\r\n            const collapse1 = leaseDetailRef1.current;\r\n            const collapse2 = leaseDetailRef2.current;\r\n            const collapse3 = leaseDetailRef3.current;\r\n        \r\n            window.mzAnimator.animateHeight(collapse1, 'CollapseDetailedLease1', 'init')\r\n            window.mzAnimator.animateHeight(collapse2, 'CollapseDetailedLease2', 'init')\r\n            window.mzAnimator.animateHeight(collapse3, 'CollapseDetailedLease3', 'init')\r\n            setInit(true);\r\n            toggleCollapse(false);\r\n        }\r\n    }\r\n\r\n    const leaseTermSelect = async (e) => {\r\n        setFinancialInfo(await summaryCalculator.RecalculateFinancialInfo());\r\n    }\r\n\r\n    const leaseMileageItemClick = async (e)=>{\r\n        const annualMileageValue = parseInt(e.currentTarget.querySelector('input[name=\"annualMileage\"]').value);\r\n        summaryCalculator.AnnualMileage = annualMileageValue;\r\n\r\n        setFinancialInfo(await summaryCalculator.RecalculateFinancialInfo());\r\n\r\n        setSelectedLeasesMileage(annualMileageValue);\r\n    }\r\n\r\n    const getMazdaFeesAndLeviesDetails = () => {\r\n        const feesAndLeviesToDisplay = summaryCalculator.FinancialInfo.calculatedLease.feesAndLevies.detail.filter(item => item.title !== 'PDE');\r\n        \r\n        return feesAndLeviesToDisplay;\r\n    }\r\n\r\n    const getDisplayedFee = (fee) => {\r\n        return getMazdaFeesAndLeviesDetailTitle(fee.title, t);\r\n    }\r\n\r\n    async function handleReserveYoursClick() {\r\n        const isRetailerMode = await summaryCalculator.isRetailerMode();\r\n        summaryCalculator.CurrentPurchaseMethod = 'Lease';\r\n        if (isRetailerMode) {\r\n                setReserveModalOpen(true);\r\n        } else {\r\n            openGetLocal();\r\n        }\r\n    }\r\n\r\n    function handlePreOrderClick() {\r\n        document.querySelector('body').classList.add('disabled');\r\n        setPreorderModalOpen(true)\r\n    }\r\n\r\n\r\n    function openGetLocal(){\r\n        const lang = getLang();\r\n        gtmHelper.setGTM({'action':'Open Modal','modal': 'Contact Dealer'}, true, false);\r\n\r\n        const targetModal = document.getElementById('mz-react-send-build-to-dealer-modal');\r\n        if (targetModal && summaryCalculator) {\r\n            if (summaryCalculator.SelectedColourExteriorIndex !== 'null' && summaryCalculator.Colours !== null) {\r\n                const heading = targetModal.querySelector('.mz-send-build-to-dealer__vehicle-name');\r\n                if (heading) {\r\n                    heading.textContent = lang === 'en' ? summaryCalculator._selectedModelYear.year.title + ' ' + ReactHtmlParser(summaryCalculator._selectedModelYear.carline.title) : ReactHtmlParser(summaryCalculator._selectedModelYear.carline.title) + ' ' + summaryCalculator._selectedModelYear.year.title;\r\n                }\r\n            }\r\n            openModal('mz-react-send-build-to-dealer-modal');\r\n        }\r\n    }\r\n\r\n\r\n    const firstPaymentTaxes = summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].monthlyWithTaxes - (summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].monthlyWithTaxes / (1 + summaryCalculator.FinancialInfo.calculatedLease.tax));\r\n\r\n    const hasResponseError = summaryCalculator.getResponsesHasError();\r\n\r\n    function getWeeklyPrice() {\r\n        if (hasResponseError)\r\n            return formatPrice(0);\r\n        else\r\n            return formatPrice(summaryCalculator.FinancialInfo.calculatedLease?.leaseValues[summaryCalculator.LeaseTermIndex][summaryCalculator.IncludeTaxes ? 'weeklyWithTaxes' : 'weekly'])\r\n    }\r\n\r\n    function getBiWeeklyPrice() {\r\n        if (hasResponseError)\r\n            return formatPrice(0);\r\n        else\r\n            return formatPrice(summaryCalculator.FinancialInfo.calculatedLease?.leaseValues[summaryCalculator.LeaseTermIndex][summaryCalculator.IncludeTaxes ? 'biWeeklyWithTaxes' : 'biWeekly'])\r\n    }\r\n\r\n    function getMonthlyPrice() {\r\n        if (hasResponseError)\r\n            return formatPrice(0);\r\n        else\r\n            return formatPrice(summaryCalculator.FinancialInfo.calculatedLease?.leaseValues[summaryCalculator.LeaseTermIndex][summaryCalculator.IncludeTaxes ? 'monthlyWithTaxes' : 'monthly']);\r\n    }\r\n\r\n    function getDisplayedRate() {\r\n        if (hasResponseError)\r\n            return '-';\r\n\r\n        const leaseElement = summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex];\r\n        if (Number.parseFloat(leaseElement.leaseRate) !== Number.parseFloat(leaseElement.leaseRateDiscounted))\r\n            return convertNum(leaseElement.leaseRateDiscounted, 2) + '%';\r\n        else\r\n            return convertNum(leaseElement.leaseRate,2) + '%';\r\n    }\r\n\r\n    function getInformationalRate() {\r\n        if (hasResponseError)\r\n            return '-';\r\n        else\r\n            return convertNum(summaryCalculator.getLeaseInformationalAprRate(),2) + '%';\r\n    }\r\n\r\n    function getTotalPayable() {\r\n        //{includeFees && includeTaxes && includeRebates \r\n        let totalPayable = summaryCalculator.FinancialInfo.calculatedLease.balanceToLease;\r\n        totalPayable = includeFees ? summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithFees : totalPayable;\r\n        totalPayable = includeRebates ? summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithRebates : totalPayable;\r\n        totalPayable = includeFees && includeRebates ? summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithFeesWithRebates : totalPayable;\r\n\r\n        return hasResponseError ? '-' :formatPrice(totalPayable, true);\r\n    }\r\n\r\n    function getFirstPayment() {\r\n        const firstPayment = includeTaxes ? (summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].monthlyWithTaxes - firstPaymentTaxes) : summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].monthly;\r\n\r\n        return hasResponseError ? '-' :formatPrice(firstPayment, true);\r\n    }\r\n\r\n    function getTotalDue() {\r\n        const leaseElement = summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex];\r\n        \r\n        const totalDue = (includeTaxes ? (leaseElement.monthlyWithTaxes + summaryCalculator.FinancialInfo.calculatedLease.downPaymentValue + summaryCalculator.FinancialInfo.calculatedLease.downPaymentTax) : leaseElement.monthly  + summaryCalculator.FinancialInfo.calculatedLease.downPaymentValue)\r\n                        + (includeRebates && includeTaxes ? (summaryCalculator.FinancialInfo.calculatedLease.evRebates.total.lease_federal_tax + summaryCalculator.FinancialInfo.calculatedLease.evRebates.total.lease_provincial_tax) : 0);\r\n\r\n        return hasResponseError ? '-' :formatPrice(totalDue, true);\r\n    }\r\n\r\n\r\n    return (\r\n            <div className=\"mz-lease-options lease\">\r\n            <h4>{t(\"lease_options\")}</h4>\r\n            {!summaryCalculator.getResponsesHasError() ?\r\n            <>\r\n            <div className=\"mz-lease__count\">\r\n                    <div className=\"mz-lease__count-item \">\r\n                    <p>{t(\"weekly\")}</p>\r\n                    <span>{getWeeklyPrice()}</span> \r\n                </div>\r\n                <div className=\"mz-lease__count-item \">\r\n                    <p>{t(\"bi_weekly\")}</p>\r\n                    <span>{getBiWeeklyPrice()}</span> \r\n                </div>\r\n                <div className=\"mz-lease__count-item \">\r\n                    <p>{t(\"monthly\")}</p>\r\n                    <span>{getMonthlyPrice()}</span> \r\n                </div>\r\n            </div>\r\n            <div className=\"mz-lease__terms\">\r\n                <CollapseLease dropdownCallback={leaseDropdown} selectCallback={leaseTermSelect} setSelectedLeaseOption={setSelectedLeaseOption} />\r\n                <CollapseLeaseMileage callback={leaseMileageItemClick} setSelectedLeasesMileage={setSelectedLeasesMileage} />\r\n            </div>\r\n            </> \r\n            :\r\n            <>\r\n                <p className=\"text--center\">\r\n                    {ReactHtmlParser(t(\"general:generalErrorMessage\"))}\r\n                </p>\r\n            </>}            \r\n            <div className=\"hr light\"></div>\r\n            <div className={`mz-finance__numbs ${!showDetailedPricing ? 'collapsed' : \r\n            ''}`}>\r\n                <ul className=\"finance-list hidden\" ref={leaseDetailRef1}>\r\n                    <li className=\"finance-list__item\">\r\n                        <p className=\"desc\">{t(\"msrp\")}</p>\r\n                        <span className=\"price\">{`${formatPrice(summaryCalculator.SelectedModel.financial.msrp, true)}`}</span>\r\n                    </li>\r\n                    <li className=\"finance-list__item\">\r\n                        <p className=\"desc\">{t(\"trade_in\")}<sup>1</sup></p>\r\n                        <span className=\"price discount\">{`${summaryCalculator.FinancialInfo.tradeInValue > 0 ? '-' : ''}${formatPrice(summaryCalculator.FinancialInfo.tradeInValue, true)}`}</span>\r\n                    </li>\r\n                    {currentIncentives && currentIncentives.value >0 ?\r\n                    <li className=\"finance-list__item\">\r\n                        <p className=\"desc\">{t(\"current_incentive\")} <Tooltip TooltipName=\"incentives\" incentives={currentIncentives.value}/></p>\r\n                        <span className=\"price discount\">{currentIncentives?'-':''}{formatPrice(currentIncentives.value, true)}</span>\r\n                    </li>:''}\r\n                    {ReactHtmlParser(getOptionList())}\r\n                    {summaryCalculator.FinancialInfo.calculatedLease?.accessories.total > 0?\r\n                        getAccessoriesDetails()\r\n                    :''}\r\n                    <li className=\"finance-list__item\">\r\n                        <p className=\"desc\">{t(\"freight\")}</p>\r\n                        <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.freight, true)}`}</span>\r\n                    </li>\r\n                    <li className=\"finance-list__item\">\r\n                        <p className=\"desc\">{t(\"general:pde\")}</p>\r\n                        <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.pde, true)}`}</span>\r\n                    </li>\r\n                    {includeFees ? <li className=\"finance-list__item\">\r\n                        <p className=\"desc\">\r\n                            {getDisplayedFee({title: \"Administration Fee\"})}\r\n                            <sup>9</sup>\r\n                        </p>\r\n                        <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.adminServiceFees, true)}`}</span>\r\n                    </li>:''}                       \r\n                    {includeFees? getMazdaFeesAndLeviesDetails().map((fee, index) => {\r\n                        return <li className=\"finance-list__item\">\r\n                            <p className=\"desc\">{ReactHtmlParser(getDisplayedFee(fee))}\r\n                                {fee.sup ? ReactHtmlParser(`<sup>${fee.sup}</sup>`) : ''}\r\n                            </p>\r\n                            <span className=\"price\">{`${formatPrice(fee.price, true)}`}</span>\r\n                        </li>\r\n                    }):''}\r\n\t\t\t\t\t{includeRebates ? ReactHtmlParser(getRebatesDetails()) : \"\"}\r\n                </ul>\r\n                <ul className=\"finance-list hidden\" ref={leaseDetailRef2}>\r\n                    <li className=\"finance-list__item\"><p className=\"desc\">{provinceCode === \"QC\" ? \"RDPRM\" : \"PPSA\"}<sup>7</sup></p>\r\n                        <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].ppsa, true)}`}</span>\r\n                    </li>\r\n                    <li className=\"finance-list__item\">\r\n                        <p className=\"desc\">{t(\"sub_total\")}</p>\r\n                        <span className=\"price\">\r\n                            { includeFees &&  includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.subtotalWithFeesWithRebates, true)}`}</span> : null}\r\n                            { includeFees && !includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.subtotalWithFees, true)}`}</span> : null}\r\n                            {!includeFees &&  includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.subtotalWithRebates, true)}`}</span> : null}\r\n                            {!includeFees && !includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.subtotal, true)}`}</span> : null}\r\n                        </span>\r\n                    </li>\r\n                    <li className=\"finance-list__item\">\r\n                        <p className=\"desc\">{t(\"down_payment\")}<sup>2</sup></p>\r\n                        <span className=\"price discount\">{`${summaryCalculator.FinancialInfo.downPaymentValue > 0 ? '-' : ''}${formatPrice(summaryCalculator.FinancialInfo.downPaymentValue, true)}`}</span>\r\n                    </li>\r\n                    {summaryCalculator.FinancialInfo.calculatedLease.rewards.map((el, index) => {\r\n                        return <li className=\"finance-list__item\" key={index}>\r\n                            <p className=\"desc\">{getIncentiveDisplayName(el.type)}</p>\r\n                            <span className=\"price discount\">{`-${el.cash_value?formatPrice(el.cash_value, true):formatPrice(el.value, true)}`}</span>\r\n                        </li>\r\n                    })}\r\n\r\n                </ul>\r\n                <ul className={`finance-list  ${showDetailedPricing ? 'finance-list__border' : ''}`}>\r\n                    <li className=\"finance-list__item\">\r\n                        <p className=\"desc\">{t(\"balance_to_lease\")}</p>\r\n                            {includeFees && includeTaxes && includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithFeesWithRebates, true)}`}</span> : null}\r\n                            {!includeFees && includeTaxes && includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithRebates, true)}`}</span> : null}\r\n                            {includeFees && !includeTaxes && includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithFeesWithRebates, true)}`}</span> : null}\r\n                            {includeFees && includeTaxes && !includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithFees, true)}`}</span> : null}\r\n                            {includeFees && !includeTaxes && !includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithFees, true)}`}</span> : null}\r\n                            {!includeFees && includeTaxes && !includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.balanceToLease, true)}`}</span> : null}\r\n                            {!includeFees && !includeTaxes && includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithRebates, true)}`}</span> : null}\r\n                            {!includeFees && !includeTaxes && !includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.balanceToLease, true)}`}</span> : null}\r\n                    </li>\r\n                    <div  ref={leaseDetailRef3}>\r\n                        <li className=\"finance-list__item\">\r\n                            <p className=\"desc\">{t(\"period_of_lease\")}</p>\r\n                            <span className=\"price\">{`${summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].term}`} months</span>\r\n                        </li>\r\n                        <li className=\"finance-list__item\">\r\n                            <p className=\"desc\">{t(\"rate\")}</p>\r\n                            <span className=\"price\">{`${getDisplayedRate()}`}</span>\r\n                        </li>\r\n                        <li className=\"finance-list__item\">\r\n                            <p className=\"desc\">{t(\"informational_apr\")}</p>\r\n                            <span className=\"price\">{getInformationalRate()}</span>\r\n                        </li>\r\n                    </div>\r\n                </ul>\r\n                <ul className={`finance-list  ${showDetailedPricing ? 'finance-list__border' : ''}`}>\r\n                    <li className=\"finance-list__item\">\r\n                        <p className=\"desc\">{t(\"total_payable\")}</p>\r\n                        <span className=\"price\">{`${getTotalPayable()}`}</span>\r\n                    </li>\r\n                    {includeTaxes? <li className=\"finance-list__item hidden\">\r\n                        <p className=\"desc\">{t(\"taxes\")}</p>\r\n                        <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].monthly*summaryCalculator.FinancialInfo.calculatedLease.tax, true)}`}</span>\r\n                    </li>:''}\r\n                </ul>\r\n                <ul className=\"finance-list\">\r\n                    <li className={`finance-list__item`}>\r\n                        <p className=\"desc\"><strong>{t(\"amount_due_on_delivery\")}</strong></p>\r\n                    </li>\r\n                    <li className={`finance-list__item`}>\r\n                        <p className=\"desc\">{t(\"first_payment\")}</p>\r\n                        <span className=\"price\">{getFirstPayment()}</span>\r\n                    </li>\r\n                    { includeTaxes ? <li className={`finance-list__item`}>\r\n                        <p className=\"desc\">{t(\"taxe_first_payment\")}</p>\r\n                        <span className=\"price\">{`${formatPrice(firstPaymentTaxes, true)}`}</span>\r\n                    </li> : null}\r\n                    <li className=\"finance-list__item\">\r\n                        <p className=\"desc\">{t(\"down_payment\")}<sup>2</sup></p>\r\n                        <span className=\"price\">{formatPrice(summaryCalculator.FinancialInfo.calculatedLease.downPaymentValue, true)}</span>\r\n                    </li>\r\n                    {includeTaxes? <li className=\"finance-list__item\">\r\n                        <p className=\"desc\">{t(\"taxes_on_down_payment\")}</p>\r\n                        <span className=\"price\">{formatPrice(summaryCalculator.FinancialInfo.calculatedLease.downPaymentTax, true)}</span>\r\n                    </li>:''}\r\n                    {includeRebates && includeTaxes ? getTaxRebatesDetails() : \"\"}\r\n                    <li className=\"finance-list__item\">\r\n                        <p className=\"desc\">{t(\"total_due\")}</p>\r\n                        <span className=\"price\">{getTotalDue()}</span>\r\n                    </li>\r\n                </ul>\r\n                <ul className={`finance-list  ${showDetailedPricing ? 'finance-list__border' : ''}`}>\r\n                    <li className=\"finance-list__item no-spacing\">\r\n                        <a className=\"mz-link label text--grey\" href=\"/\" onClick={(e) =>{\r\n                                e.preventDefault();\r\n                                toggleShowDetailedPricing(!showDetailedPricing);\r\n                               \r\n                            }}>{t(\"show_detailed_pricing\")}</a>\r\n                        <a className=\"no_line label\" href=\"/\" onClick={(e) =>{\r\n                                e.preventDefault();\r\n                                toggleShowDetailedPricing(!showDetailedPricing);\r\n                               \r\n                            }}><i className={`mz-svg mz-svg-chevron_small mz-svg--red ${showDetailedPricing ? 'mz-svg--rotate270' : 'mz-svg--rotate90'}`}></i></a>\r\n                    </li>\r\n                </ul>\r\n                <div className=\"mz-financial--cta hidden\">\r\n                {window.allow_oca ?\r\n                    <Button primary={true} label={ReactHtmlParser(String(t(\"summary:btn_apply_for_financing\")))} iconBefore={false} onClick={()=>financeClick('lease')}/>\r\n                    :\r\n                    summaryCalculator.isSelectionPreOrder() ?\r\n                    <Button primary={true} label={String(t(\"summary:btn_pre_order\"))} iconBefore={false} onClick={handlePreOrderClick}/>\r\n                    :                    \r\n                    <Button primary={true} label={String(t(\"summary:btn_reserve_yours\"))} iconBefore={false} onClick={handleReserveYoursClick}/>}\r\n                </div>\r\n                <div className=\"finance_disclaimer\">\r\n                     {currentIncentives && currentIncentives.value != 0 ?\r\n                        i18n.language == \"en\" ?\r\n                            <>\r\n                            <p className=\"caption\">Payments shown include a <span className=\"text--red\">{formatPrice(currentIncentives.value)}</span> Current Incentive.<br/><a className=\"mz-link--black\" onClick={handleContactDealerLinkClick}>Contact your local Mazda retailer</a> for details.</p>\r\n                            <br /> \r\n                            </>\r\n                        :\r\n                            <>\r\n                            <p className=\"caption\">Les paiements indiqués incluent l'offre incitatives actuelle de <span className=\"text--red\">{formatPrice(currentIncentives.value)}</span>. <a className=\"mz-link--black\" onClick={handleContactDealerLinkClick}>Communiquez avec votre concessionnaire Mazda</a> pour les détails.</p>\r\n                            <br />\r\n                            </>\r\n                    :\r\n                        ''\r\n                    }\r\n                    {i18n.language == \"en\" ?\r\n                        <p className=\"caption\">Informational APR {getInformationalRate()}. The rate selected is a special promotional rate. Alternatively, you can take advantage of cash purchase incentives that cannot be combined with the special promotional rate and your Informational APR would be as outlined above.</p>\r\n                    :\r\n                        <p className=\"caption\">TAP informatif {getInformationalRate()}. Le taux sélectionné est un taux promotionnel spécial. Si vous profitez plutôt des offres à l'achat au comptant qui ne peuvent être combinées avec le taux promotionnel spécial, votre TAP informatif serait celui indiqué ci-dessus.</p>\r\n                    }\r\n                </div>\r\n            </div>\r\n            <OcaModal isOpen={ocaOpen} financeType={financeType} handleClose={setOcaModalOpen}></OcaModal> \r\n        </div>\r\n    )\r\n}\r\n\r\nLeaseOptions.propTypes = {\r\n\r\n}\r\n\r\nLeaseOptions.defaultProps = {\r\n\r\n}","import React, { useState, useEffect, useRef }  from 'react';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport { openModal } from '../../../Helpers/helpers';\r\nimport { getMazdaFeesAndLeviesDetailTitle, formatPrice, getProvince, getLang } from '../../../utils';\r\nimport { CollapseList } from '../Collapse/CollapseList';\r\n\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport { Button } from '../../1_Atoms/Button/Button';\r\nimport { Tooltip } from '../../1_Atoms/Tooltip/Tooltip';\r\n\r\nexport const CashOptions = ({ ...props }) => {\r\n    const gtmHelper = new GTMHelper();\r\n\r\n    const summaryCalculator = window.summaryCalculator;\r\n    //Fixed Number provided by API\r\n    const currentIncentives = summaryCalculator.FinancialInfo.incentive_programs.find(element => element.type === \"incentive\");\r\n    const { t, i18n } = useTranslation(['payments', 'general']);\r\n    //const [update, setForceUpdate] =  useState('');\r\n    const [financialInfo, setFinancialInfo] = useState(summaryCalculator.FinancialInfo);\r\n    const [reserveOpen, setReserveModalOpen] = React.useState(false);\r\n\r\n    function getMazdaPriceDetails() {\r\n        // TODO : THIS HAS MOVED OUT INTO A COLLAPSE BOX, I HAVE COMMENTED DURING THE MERGE FROM DEVELOP - VIET TO WILL\r\n        \r\n        //<li><p>${t(\"accessories\")}<span class=\"accessory_legal\">${t(\"accLegal\")}</span></p><span>${formatPrice(financialInfo.calculatedCash.accessories.total, true)}</span></li>\r\n        return  `<ul>\r\n                    <li><p>${getMazdaFeesAndLeviesDetailTitle(\"Administration Fee\", t)}<sup>9</sup></p><span>${formatPrice(financialInfo.adminServiceFees, true)}</span></li>\r\n                    <li><p>${t(\"msrp\")}</p><span>${formatPrice(summaryCalculator.SelectedModel.financial.msrp, true)}</span></li>\r\n                    ${getOptionList()}\r\n                    <li><p>${t(\"freight\")}</p><span>${formatPrice(financialInfo.freight, true)}</span></li>\r\n                    <li><p>${t(\"general:pde\")}</p><span>${formatPrice(financialInfo.pde, true)}</span></li>\r\n                </ul>`;\r\n\r\n    }\r\n\r\n\r\n    function getWheelsDetails() {\r\n        const options = summaryCalculator.FinancialInfo ?.calculatedFinance ?.options;\r\n\r\n        return `<ul>\r\n                    <li><p>${`4x ${options.wheels.title}`}</p><span>${formatPrice(options.wheels.base_msrp, true)}</span></li>\r\n                    <li><p>${`4x ${t(\"payments:tpms\")}`}</p><span>${formatPrice(options.wheels.tpms, true)}</span></li>\r\n                    <li><p>${t(\"payments:installation\")}</p><span>${formatPrice(options.wheels.install_cost, true)}</span></li>\r\n                </ul>`;\r\n    }\r\n\r\n    function getConnectivityDetails() {\r\n        const selectedConnectedVehiclePackage = JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage'));\r\n        if(selectedConnectedVehiclePackage != null && selectedConnectedVehiclePackage.title != undefined){\r\n            const connectedPrice = (JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage')).financial.msrp);\r\n\r\n            return `<ul>\r\n                        <li><p>${`${selectedConnectedVehiclePackage.title}`}</p><span>${formatPrice(connectedPrice, true)}</span></li>\r\n                    </ul>`;\r\n        }\r\n\r\n        return '';\r\n    }\r\n    \r\n    function getAccessoriesDetails() {\r\n        let accessories = sessionStorage.getItem(Constants.SelectedAccessories);\r\n        accessories = JSON.parse(accessories);        \r\n    \r\n        let list = '<ul class=\"cashOptions_accessories\">';\r\n        accessories.map((accessory, index) => {\r\n            list += `<li><p>${accessory.name}</p><span>${formatPrice(accessory.base_msrp, true)}</span></li>`\r\n            list += `<li><p>${accessory.name} - Installation</p><span>${formatPrice(accessory.install_cost, true)}</span></li>`\r\n        });\r\n        list += '</ul>';\r\n        return list;\r\n    }\r\n\r\n    function getProtectionDetails() {\r\n        let list = \"<ul>\";\r\n\r\n        if(summaryCalculator.SelectedAddedProtectionPackage.name != undefined ){\r\n            list += `<li><p class=\"desc\">${t(\"added_protection\")} <span style=\"text-transform:lowercase\">${summaryCalculator.SelectedAddedProtectionPackage.name}</span></p><span>${formatPrice(summaryCalculator.SelectedAddedProtectionPackage.financial.msrp, true)}</span></li>`\r\n        }\r\n        if(summaryCalculator.SelectedAppearanceProtectionPlan.name != undefined && summaryCalculator.SelectedAppearanceProtectionPlansIndex !== null) {\r\n\r\n            list += `<li><p class=\"desc\">${t(\"appearance_protection\")} <span style=\"text-transform:lowercase\">${summaryCalculator.SelectedAppearanceProtectionPlansPackage.name} for ${summaryCalculator.SelectedAppearanceProtectionPlan.name}</span></p><span>${formatPrice(summaryCalculator.SelectedAppearanceProtectionPlansPackage.financial.msrp, true)}</span></li>`\r\n        }           \r\n        list += \"</ul>\"\r\n        return list;\r\n    }\r\n\r\n    function getMazdaFeesAndLeviesDetails() {\r\n        const feesAndLeviesToDisplay = financialInfo.calculatedCash.feesAndLevies.detail.filter(item => item.title !== 'PDE');\r\n        \r\n        return `<ul>\r\n                    ${feesAndLeviesToDisplay.map((fee, index) => `<li key=\"${index}\">\r\n                        <p>${getMazdaFeesAndLeviesDetailTitle(fee.title, t)}${fee.sup ? `<sup>${fee.sup}</sup>` : ''}</p><span>${formatPrice(fee.price, true)}</span>\r\n                        </li>`).join(\"\")}\r\n                </ul>`;\r\n    }\r\n\r\n    function getMazdaFeesAndLeviesPricingWithoutPDE() {\r\n        const total = financialInfo.calculatedCash.feesAndLevies.detail.filter(item => item.title !== 'PDE').reduce((total, fee) => total + fee.price, 0);\r\n        return total;\r\n    }\r\n\r\n    function getRebatesDetails() {\r\n        return `<ul>\r\n                    ${financialInfo.calculatedCash.evRebates.details.map((rebate, index) => `<li key=\"${index}\">\r\n                        \t<p class=\"text--green\">${rebate.title==='federal'? t('fed_rebate'):t('prov_rebate') + ' ('+getProvince()+')'}</p><span class=\"text--green\">-${formatPrice(rebate.cash, true)}</span>\r\n                        </li>`).join(\"\")}\r\n                </ul>`;\r\n    }\r\n\r\n    function getMazdaPrice() {\r\n        return financialInfo.calculatedCash.mazdaPrice;\r\n    }\r\n\r\n    function getWheelsPrice() {\r\n        const options = summaryCalculator.FinancialInfo ?.calculatedCash ?.options;\r\n\r\n        return options.wheels.price;\r\n    }\r\n\r\n    function getConnectivityPrice() {\r\n        const connectedPrice = (JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage')).financial.msrp);\r\n\r\n        return connectedPrice;\r\n    }\r\n\r\n    function getAccessoriesPrice() {\r\n        const accessories = summaryCalculator.FinancialInfo ?.calculatedCash ?.accessories;\r\n\r\n        return accessories.total;\r\n    }\r\n    \r\n    function getProtectionPrice() {\r\n        const protectionPrice = summaryCalculator.SelectedAddedProtectionPackage.financial.msrp + summaryCalculator.SelectedAppearanceProtectionPlansPackage.financial.msrp;\r\n            \r\n        return protectionPrice;\r\n    }\r\n\r\n    function openGetLocal(){\r\n        const lang = getLang();\r\n        gtmHelper.setGTM({'action':'Open Modal','modal': 'Contact Dealer'}, true, false);\r\n\r\n        const targetModal = document.getElementById('mz-react-send-build-to-dealer-modal');\r\n        if (targetModal && summaryCalculator) {\r\n            if (summaryCalculator.SelectedColourExteriorIndex !== 'null' && summaryCalculator.Colours !== null) {\r\n                const heading = targetModal.querySelector('.mz-send-build-to-dealer__vehicle-name');\r\n                if (heading) {\r\n                    heading.textContent = lang === 'en' ? summaryCalculator._selectedModelYear.year.title + ' ' + ReactHtmlParser(summaryCalculator._selectedModelYear.carline.title) : ReactHtmlParser(summaryCalculator._selectedModelYear.carline.title) + ' ' + summaryCalculator._selectedModelYear.year.title;\r\n                }\r\n            }\r\n            openModal('mz-react-send-build-to-dealer-modal');\r\n        }\r\n    }\r\n\r\n    async function handleReserveYoursClick() {\r\n        const isRetailerMode = await summaryCalculator.isRetailerMode();\r\n        summaryCalculator.CurrentPurchaseMethod = 'Cash';\r\n        if (isRetailerMode) {\r\n                setReserveModalOpen(true);\r\n        } else {\r\n            openGetLocal();\r\n        }\r\n    }\r\n\r\n    function getCreditsDetails() {\r\n        const currentIncentives =financialInfo.incentive_programs.find(element => element.type === \"incentive\");\r\n\r\n        return `<ul class=\"negative\">\r\n                    ${financialInfo.calculatedCash.incentives.taxable.details.map((incentive, index) => {\r\n                        const price = incentive.cash_value ? incentive.cash_value : incentive.value;\r\n                            return `<li key=\"${index}\">\r\n                                    <p>${getIncentiveDisplayName(incentive)}</p><span>-${formatPrice(price, true)}</span>\r\n                                </li>`;\r\n                        }).join(\"\")}\r\n                    ${financialInfo.calculatedCash.incentives.nonTaxable.details.map((incentive, index) => {\r\n                        const price = incentive.cash_value ? incentive.cash_value : incentive.value;\r\n                            return `<li key=\"${index}\">\r\n                                    <p>${getIncentiveDisplayName(incentive)}</p><span>-${formatPrice(price, true)}</span>\r\n                                </li>`;\r\n                        }).join(\"\")}\r\n                    ${(currentIncentives.value > 0) ? `<li>\r\n                        <p>${t(\"current_incentive\")}</p>\r\n                        <span>${currentIncentives?'-':''}${formatPrice(currentIncentives.value, true)}</span>\r\n                    </li>`:''}\r\n                    ${(summaryCalculator.FinancialInfo.mazdaCashIncentive > 0) ? `<li>\r\n                        <p>${t(\"mazda_cash_incentive\")}</p>\r\n                        <span style=\"white-space: nowrap;\">${summaryCalculator.FinancialInfo.mazdaCashIncentive?'-':''}${formatPrice(summaryCalculator.FinancialInfo.mazdaCashIncentive, true)}</span>\r\n                    </li>`:''}\r\n                    <li>\r\n                        <p>${t(\"trade_in\")}<sup>1</sup></p><span>${financialInfo.tradeInValue>0?'-':''}${formatPrice(financialInfo.tradeInValue, true)}</span>\r\n                    </li>\r\n                </ul>`;\r\n    }\r\n\r\n    function getIncentiveDisplayName(incentive) {\r\n        switch(incentive.type) {\r\n            case \"loyalty\" :\r\n                return t(\"mazda_owner_loyalty_program\");\r\n            case \"military\":\r\n                return t(\"mazda_military_program\");\r\n            case \"grad_award\":\r\n                return t(\"mazda_graduate_program_award\");\r\n            case \"first_time_owner\":\r\n                return t(\"mazda_first_time_owner\");                \r\n            default:\r\n                return incentive.type;\r\n        }\r\n    }\r\n\r\n    function getOptionList() {\r\n        let optionList = '';\r\n        \r\n        const options = summaryCalculator.FinancialInfo ?.calculatedFinance ?.options;\r\n\r\n        if(options.exteriorColour.price >0){\r\n            optionList += ` <li class=\"finance-list__item\">\r\n                <p class=\"desc\">${t('exterior')} ${options.exteriorColour.description}</p>\r\n                <span class=\"price\">${formatPrice(options.exteriorColour.price, true)}</span>\r\n            </li>`\r\n        }\r\n        if(options ?.interiorColour.price >0){\r\n            optionList += ` <li class=\"finance-list__item\">\r\n                <p class=\"desc\">${t('interior')} ${options.interiorColour.description}</p>\r\n                <span class=\"price\">${formatPrice(options.interiorColour.price, true)}</span>\r\n            </li>`\r\n        }\r\n        if(options ?.model_option_package ?.financial ?.msrp >0){\r\n            optionList += ` <li class=\"finance-list__item\">\r\n                <p class=\"desc\">${t('package')} ${options.model_option_package.name}</p>\r\n                <span class=\"price\">${formatPrice(options.model_option_package.financial.msrp, true)}</span>\r\n            </li>`\r\n        }\r\n/*\r\n        const selectedWarrantyPackage = JSON.parse(sessionStorage.getItem('selectedWarrantyPackage'));\r\n        if(selectedWarrantyPackage != null && selectedWarrantyPackage.name != undefined ){\r\n            const warrantyPrice = (JSON.parse(sessionStorage.getItem('selectedWarrantyPackage')).financial.msrp);\r\n            optionList += ` <li class=\"finance-list__item\">\r\n                <p class=\"desc\">${t(\"warranties\")} ${selectedWarrantyPackage.name}</p>\r\n                <span class=\"price\">${formatPrice(warrantyPrice, true)}</span>\r\n            </li>`\r\n        }   \r\n        \r\n        const selectedConnectedVehiclePackage = JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage'));\r\n        if(selectedConnectedVehiclePackage != null && selectedConnectedVehiclePackage.title != undefined){\r\n            const connectedPrice = (JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage')).financial.msrp);\r\n            optionList += ` <li class=\"finance-list__item\">\r\n                <p class=\"desc\">${t(\"connected\")} <span style=\"text-transform:lowercase\">${selectedConnectedVehiclePackage.title}</span></p>\r\n                <span class=\"price\">${formatPrice(connectedPrice, true)}</span>\r\n            </li>`\r\n        }\r\n\r\n        const selectedAddedProtectionPackage = summaryCalculator.SelectedAddedProtectionPackage;\r\n        if(selectedAddedProtectionPackage && selectedAddedProtectionPackage.name){\r\n            const selectedAddedProtectionPackagePrice = selectedAddedProtectionPackage.financial.msrp;\r\n            optionList += ` <li class=\"finance-list__item\">\r\n                <p class=\"desc\">${t(\"added_protection\")} <span style=\"text-transform:lowercase\"> ${selectedAddedProtectionPackage.name}</span></p>\r\n                <span class=\"price\">${formatPrice(selectedAddedProtectionPackagePrice, true)}</span>\r\n            </li>`\r\n        }        \r\n\r\n        const appearanceProtectionPlan = summaryCalculator.SelectedAppearanceProtectionPlan;\r\n        const selectedAppearanceProtectionPlansPackage = summaryCalculator.SelectedAppearanceProtectionPlansPackage; JSON.parse(sessionStorage.getItem('selectedAppearanceProtectionPlansPackage'));\r\n        if(appearanceProtectionPlan.name && selectedAppearanceProtectionPlansPackage.name){\r\n            const selectedAppearanceProtectionPlansPackagePrice = selectedAppearanceProtectionPlansPackage.financial.msrp;\r\n            optionList += ` <li class=\"finance-list__item\">\r\n                <p class=\"desc\">${t(\"appearance_protection\")} <span>${appearanceProtectionPlan.name}</span>${selectedAppearanceProtectionPlansPackage.name}</p>\r\n                <span class=\"price\">${formatPrice(selectedAppearanceProtectionPlansPackagePrice, true)}</span>\r\n            </li>`\r\n        }\r\n    \r\n        if(options.wheels.price >0){\r\n            optionList += ` <li class=\"finance-list__item\">\r\n                <p class=\"desc\">${options.wheels.title}</p>\r\n                <span class=\"price\">${formatPrice(options.wheels.price, true)}</span>\r\n            </li>`\r\n        }*/\r\n\r\n        return optionList;\r\n    }\r\n\r\n    function getCashPrice() {\r\n        //let financePricing = null;\r\n        let cashPricing = null;\r\n        if(summaryCalculator.IncludeFees){\r\n            if(summaryCalculator.IncludeTaxes){\r\n                if(summaryCalculator.IncludeRebates){\r\n                    // financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceWithFeesWithRebatesTaxed : financialInfo.calculatedLease.balanceToLeaseWithFeesWithRebatesTaxed;\r\n                    cashPricing = financialInfo.calculatedCash.subtotalWithFeesWithRebatesTaxed;\r\n                }else{\r\n                    //financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceWithFeesTaxed : financialInfo.calculatedLease.balanceToLeaseWithFees;\r\n                    cashPricing = financialInfo.calculatedCash.subtotalWithFeesTaxed;\r\n                }\r\n            }else{\r\n                if(summaryCalculator.IncludeRebates){\r\n                    //financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceWithFeesWithRebates : financialInfo.calculatedLease.balanceToLeaseWithFeesWithRebates;\r\n                    cashPricing = financialInfo.calculatedCash.subtotalWithFeesWithRebatesAndEvRebates;\r\n                }else{\r\n                    //financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceWithFees : financialInfo.calculatedLease.balanceToLeaseWithFees\r\n                    cashPricing = financialInfo.calculatedCash.subtotalWithFees;\r\n                }\r\n            }\r\n        }else{\r\n            if(summaryCalculator.IncludeTaxes){\r\n                if(summaryCalculator.IncludeRebates){\r\n                    //financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceWithRebatesTaxed : financialInfo.calculatedLease.balanceToLeaseWithRebates;\r\n                    cashPricing = financialInfo.calculatedCash.subtotalWithIncentiveRebatesAndEvRebatesTaxed;\r\n                }else{\r\n                    //financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceTaxed : financialInfo.calculatedLease.balanceToLease;\r\n                    cashPricing = financialInfo.calculatedCash.subtotalTaxed;\r\n                }\r\n            }else{\r\n                if(summaryCalculator.IncludeRebates){\r\n                    //financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceWithRebates : financialInfo.calculatedLease.balanceToLeaseWithRebates;\r\n                    cashPricing = financialInfo.calculatedCash.subtotalWithIncentiveRebatesAndEvRebates;\r\n                }else{\r\n                    //financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinance : financialInfo.calculatedLease.balanceToLease;\r\n                    cashPricing = financialInfo.calculatedCash.subtotal;\r\n                }\r\n            }\r\n        }\r\n\r\n        //for get local price form to grab\r\n        summaryCalculator.CurrentCalculatedCash = formatPrice(cashPricing, true);\r\n    }\r\n    \r\n    function canDisplayRebates() {\r\n        if(!summaryCalculator.IncludeRebates) \r\n            return false;\r\n\r\n        return summaryCalculator.FinancialInfo.ev_rebates && summaryCalculator.FinancialInfo.ev_rebates.length > 0;\r\n    }\r\n\r\n    /* START HORRIBLE HACK */\r\n    /* TODO : MOVE TRANSLATION TEXT IN RESOURCE FILE AND MAKE A GENERIC FUNCTION FOR THE SPECIALITY \"WORD\" */\r\n    function isEnglish() {\r\n        return getLang() === 'en';\r\n    }\r\n    \r\n    function getDisplayableProvinceName() {\r\n        const provinceCode = getProvince().toLowerCase();\r\n        const provinceNames = {\r\n            'on': { en: 'Ontario', fr: 'en Ontario' },\r\n            'qc': { en: 'Quebec', fr: 'au Québec' },\r\n            'ab': { en: 'Alberta', fr: 'en Alberta' },\r\n            'bc': { en: 'British Columbia', fr: 'au Colombie Britanique' },\r\n            'mb': { en: 'Manitoba', fr: 'au Manitoba' },\r\n            'nb': { en: 'New Brunswick', fr: 'au Nouveau-Brunswick' },\r\n            'nl': { en: 'Newfoundland', fr: 'à Terre-Neuve-et-Labrador' },\r\n            'nt': { en: 'North-West Territories', fr: 'à Territoires du nord-ouest' },\r\n            'ns': { en: 'Nova Scotia', fr: 'en Nouvelle-Écosse' },\r\n            'nu': { en: 'Nunavut', fr: 'au Nanavut' },\r\n            'pe': { en: 'Prince Edward Island', fr: \"à l'Île-du-Prince-Édouard\" },\r\n            'sk': { en: 'Saskatchewan', fr: 'en Saskatchewan' },\r\n            'yt': { en: 'Yukon', fr: 'au Yukon' },\r\n        };\r\n    \r\n        const provinceName = provinceNames[provinceCode];\r\n        return provinceName ? provinceName[isEnglish() ? 'en' : 'fr'] : '';\r\n    }\r\n    \r\n    function getAccessoriesTooltipText() {\r\n        const provinceName = getDisplayableProvinceName();\r\n    \r\n        const text = isEnglish()\r\n            ? `Labour for installation is calculated using average labour rates in ${provinceName}.`\r\n            : `Le coût de la main-d'œuvre pour l'installation est calculé en fonction du tarif horaire moyen ${provinceName}.`;\r\n    \r\n        return text;\r\n    }\r\n\r\n    function getTooltipText() {\r\n        const lang = getLang();\r\n        \r\n        return lang === 'en' ? `Labour for installation is calculated using average labour rates in ${getDisplayableProvinceName()}.` : `Le coût de la main-d'œuvre pour l'installation est calculé en fonction du tarif horaire moyen ${getDisplayableProvinceName()}.`;\r\n    }\r\n     /* END HORRIBLE HACK */\r\n\r\n    useEffect(() => {\r\n        console.log('data has changed need a refresh cash section');\r\n\r\n        //setForceUpdate(Math.random());\r\n        setFinancialInfo(summaryCalculator.FinancialInfo);\r\n    }, [summaryCalculator._tradeInValue, summaryCalculator._downPaymentValue, summaryCalculator.LoyaltyChecked, summaryCalculator.GraduateChecked, summaryCalculator.MilitaryChecked, summaryCalculator.FirstTimeOwnerChecked, summaryCalculator.IncludeFees, summaryCalculator.IncludeTaxes, summaryCalculator.IncludeRebates]);\r\n\r\n    return (\r\n        <div className=\"mz-cahs-options\">\r\n            <h4>{t(\"cash_purchase_price\")}</h4>\r\n            <div className=\"mz-cahs-options__count\">\r\n                <div className=\"mz-cahs-options__count-item \">\r\n                    <div>{t(\"purchase_price\")} <Tooltip TooltipName=\"purchase_price\" /></div>\r\n                    {getCashPrice()}\r\n                    {/* {summaryCalculator.IncludeFees && summaryCalculator.IncludeTaxes && summaryCalculator.IncludeRebates ? <span className='mmz-cahs-options__price'>{`${formatPrice(financialInfo.calculatedCash.subtotalWithFeesWithRebatesTaxed, true)}`}</span> : null}\r\n                    {!summaryCalculator.IncludeFees && summaryCalculator.IncludeTaxes && summaryCalculator.IncludeRebates ? <span className='mmz-cahs-options__price'>{`${formatPrice(financialInfo.calculatedCash.subtotalWithIncentiveRebatesAndEvRebatesTaxed, true)}`}</span> : null}\r\n                    {summaryCalculator.IncludeFees && !summaryCalculator.IncludeTaxes && summaryCalculator.IncludeRebates ? <span className='mmz-cahs-options__price'>{`${formatPrice(financialInfo.calculatedCash.subtotalWithFeesWithRebatesAndEvRebates, true)}`}</span> : null}\r\n                    {summaryCalculator.IncludeFees && summaryCalculator.IncludeTaxes && !summaryCalculator.IncludeRebates ? <span className='mmz-cahs-options__price'>{`${formatPrice(financialInfo.calculatedCash.subtotalWithFeesTaxed, true)}`}</span> : null}\r\n                    {summaryCalculator.IncludeFees && !summaryCalculator.IncludeTaxes && !summaryCalculator.IncludeRebates ? <span className='mmz-cahs-options__price'>{`${formatPrice(financialInfo.calculatedCash.subtotalWithFees, true)}`}</span> : null}\r\n                    {!summaryCalculator.IncludeFees && summaryCalculator.IncludeTaxes && !summaryCalculator.IncludeRebates ? <span className='mmz-cahs-options__price'>{`${formatPrice(financialInfo.calculatedCash.subtotalTaxed, true)}`}</span> : null}\r\n                    {!summaryCalculator.IncludeFees && !summaryCalculator.IncludeTaxes && summaryCalculator.IncludeRebates ? <span className='mmz-cahs-options__price'>{`${formatPrice(financialInfo.calculatedCash.subtotalWithIncentiveRebatesAndEvRebates, true)}`}</span> : null}\r\n                    {!summaryCalculator.IncludeFees && !summaryCalculator.IncludeTaxes && !summaryCalculator.IncludeRebates ? <span className='mmz-cahs-options__price'>{`${formatPrice(financialInfo.calculatedCash.subtotal, true)}`}</span> : null} */}\r\n\r\n                </div>\r\n            </div>\r\n\r\n            <div className=\"mz-financial--details\">\r\n                < CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price\" ColCarText1={`${t('cash_price')}`} ColBoxText={getMazdaPriceDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"detailedprice_mazdaprice\"  ColPrices={`${formatPrice(getMazdaPrice(), true)}`} id={t('cash_price').replace(/[^0-9a-z]/gi, '_')} />\r\n                \r\n                {financialInfo ?.calculatedFinance ?.options.wheels.title ? \r\n                < CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price\" ColCarText1={t(\"cash_option_wheels\")} ColBoxText={getWheelsDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"\" TooltipText={ReactHtmlParser(getTooltipText())} ColPrices={`${formatPrice(getWheelsPrice(), true)}`} id={t(\"cash_option_wheels\").replace(/[^0-9a-z]/gi, '_')} />\r\n                : null}\r\n\r\n                {summaryCalculator.SelectedConnectedVehiclePackage.financial.msrp ?\r\n                < CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price\" ColCarText1={t(\"cash_option_connectivity\")} ColBoxText={getConnectivityDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"\"  ColPrices={`${formatPrice(getConnectivityPrice(), true)}`} id={t(\"cash_option_connectivity\").replace(/[^0-9a-z]/gi, '_')} />\r\n                : null }\r\n\r\n                {financialInfo ?.calculatedFinance ?.accessories.total ? \r\n                < CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price\" ColCarText1={t(\"cash_option_accessories\")} ColBoxText={getAccessoriesDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"\" TooltipText={getAccessoriesTooltipText()} ColPrices={`${formatPrice(getAccessoriesPrice(), true)}`} id={t(\"cash_option_accessories\").replace(/[^0-9a-z]/gi, '_')} />\r\n                : null }\r\n\r\n                {summaryCalculator.SelectedAddedProtectionPackage.name || summaryCalculator.SelectedAppearanceProtectionPlansIndex !== null ?  \r\n                < CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price\" ColCarText1={t(\"cash_option_protection\")} ColBoxText={getProtectionDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"\"  ColPrices={`${formatPrice(getProtectionPrice(), true)}`} id={t(\"cash_option_protection\").replace(/[^0-9a-z]/gi, '_')} />\r\n                : null }                \r\n\r\n\t\t\t\t{canDisplayRebates() ?< CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price evRebates\" ColCarText1={t(\"gov_rebates\")} ColBoxText={getRebatesDetails()} ColClassPrice=\"mz-collapse__price\"  ColPrices={`${financialInfo.calculatedCash.evRebates.total.cash>0?'-':''}${formatPrice(financialInfo.calculatedCash.evRebates.total.cash, true)}`} id={t(\"gov_rebates\").replace(/[^0-9a-z]/gi, '_')} />:null}\r\n                {summaryCalculator.IncludeFees?< CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price\" ColCarText1={`${t('cash_fees')}`} ColBoxText={getMazdaFeesAndLeviesDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"detailedprice_feesandlevies\" ColPrices={`${formatPrice(getMazdaFeesAndLeviesPricingWithoutPDE(), true)}`}  id={t(\"cash_fees\").replace(/[^0-9a-z]/gi, '_')} />:null}\r\n                {summaryCalculator.IncludeTaxes?<div className=\"mz-financial__non-collapse\"><div className=\"mz-financial__non-collapse__title\">{t(\"taxes\")}</div>\r\n                    { summaryCalculator.IncludeFees && summaryCalculator.IncludeTaxes &&  summaryCalculator.IncludeRebates ? <span className='mz-financial__non-collapse__price'>{`${formatPrice(financialInfo.calculatedCash.subtotalWithFeesWithRebatesTaxes, true)}`}</span> : null}\r\n                    {!summaryCalculator.IncludeFees && summaryCalculator.IncludeTaxes &&  summaryCalculator.IncludeRebates ? <span className='mz-financial__non-collapse__price'>{`${formatPrice(financialInfo.calculatedCash.subtotalWithIncentiveRebatesAndEvRebatesTaxes, true)}`}</span> : null}\r\n                    { summaryCalculator.IncludeFees && summaryCalculator.IncludeTaxes && !summaryCalculator.IncludeRebates ? <span className='mz-financial__non-collapse__price'>{`${formatPrice(financialInfo.calculatedCash.subtotalWithFeesTaxes, true)}`}</span> : null}\r\n                    {!summaryCalculator.IncludeFees && summaryCalculator.IncludeTaxes && !summaryCalculator.IncludeRebates ? <span className='mz-financial__non-collapse__price'>{`${formatPrice(financialInfo.calculatedCash.subtotalTaxes, true)}`}</span> : null}\r\n                </div>:null}\r\n                < CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price negative\" ColCarText1={`${t('cash_credits')}`} TooltipName=\"detailedprice_credit\" ColBoxText={getCreditsDetails()} ColClassPrice=\"mz-collapse__price\" ColPrices={`${currentIncentives.value + financialInfo.calculatedCash.incentives.taxable.total + financialInfo.calculatedCash.incentives.nonTaxable.total + financialInfo.tradeInValue + summaryCalculator.FinancialInfo.mazdaCashIncentive >0?'-':''}${formatPrice(currentIncentives.value + financialInfo.calculatedCash.incentives.taxable.total + financialInfo.calculatedCash.incentives.nonTaxable.total + financialInfo.tradeInValue + summaryCalculator.FinancialInfo.mazdaCashIncentive, true)}`} id={t(\"cash_credits\").replace(/[^0-9a-z]/gi, '_')} />\r\n                <div className=\"mz-financial__non-collapse negative\"><div className=\"mz-financial__non-collapse__title\">{t(\"down_payment\")}<sup>2</sup> <Tooltip TooltipName=\"detailedprice_downpayment\" /></div><span className=\"mz-financial__non-collapse__price\">{financialInfo.downPaymentValue > 0 ? '-':''}{formatPrice(financialInfo.downPaymentValue, true)}</span></div>\r\n                <div className=\"mz-financial--cta hidden\">\r\n                    <Button primary={true} label={String(t(\"summary:btn_reserve_yours\"))} iconBefore={false} onClick={handleReserveYoursClick}/>\r\n                </div>\r\n                <div className=\"mz-spacer mz-spacer-s\"></div>\r\n            </div>\r\n        </div>\r\n    )\r\n}\r\n//ev_rebates >0? evRebate.getRebate(ev_rebates, 'general', true)","import React from 'react';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\nimport PropTypes from 'prop-types';\r\n\r\n\r\nexport const TradeInModal = ({modalContent, checkTradeInValue, isOpen, modalId, handleClose, setFinancialInfo, ...props }) => {\r\n    const summaryCalculator = window.summaryCalculator;\r\n    const { t } = useTranslation(['summary', 'general']);\r\n    //const [reserveOpen, setReserveOpen] = React.useState(isOpen);\r\n\r\n    React.useEffect(() => {\r\n        // Restart React Forms app.\r\n        // Skip if this is the first time loading it because App.js takes care of it.\r\n        if (window.isReactFormsAppLoaded && typeof window.initReactFormsApp === 'function') {\r\n            window.initReactFormsApp();\r\n        }\r\n    }, [isOpen]);\r\n\r\n    return (\r\n        <div className=\"mz-modal modal\" id={modalId} aria-hidden={!isOpen}>\r\n            <div className=\"wrapper\">\r\n                <div className=\"mz-modal__container\">\r\n                    <div className=\"mz-modal__content\">\r\n                        <button className=\"mz-modal__close\" aria-label=\"Close Modal\" onClick={async () => {\r\n\t\t\t\t\t\t\tdocument.querySelector('body').classList.remove('disabled');\r\n                            //set the trade in valuue if avail\r\n                            if(Number(summaryCalculator._tradeInValue) > 0){\r\n                                checkTradeInValue(summaryCalculator._tradeInValue);\r\n                                setFinancialInfo(await summaryCalculator.RecalculateFinancialInfo());\r\n                             }\r\n\r\n\t\t\t\t\t\t\thandleClose(false)\r\n\t\t\t\t\t\t}}>\r\n                            <Svg\r\n                                colour=\"grey\"\r\n                                size={1.93}\r\n                                svg_list=\"x\"\r\n                            />\r\n                        </button>\r\n                        <div className=\"mz-modal__text-container\">\r\n                            {isOpen &&\r\n                                <>\r\n                                    <div className=\"mzReactForms\">\r\n                                        <input type=\"hidden\" data-mz-form-field-name=\"formType\" value=\"TradeInEstimator\"/>\r\n                                        <input type=\"hidden\" data-mz-form-field-name=\"source\" value=\"WC\"/>\r\n                                        <input type=\"hidden\" data-mz-form-field-name=\"formDisclaimer\" value={t(\"form_disclaimer_retailer\")}/>\r\n                                        <div class=\"mz-react-forms-root\"></div>\r\n                                        <div className=\"mz-react-forms-root\"></div>\r\n                                    </div>\r\n                                </>\r\n                            }\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    );\r\n};\r\n\r\nTradeInModal.propTypes = {\r\n    HandleTabClick: PropTypes.func,\r\n}\r\n\r\nTradeInModal.defaultProps = {\r\n    handleClose: () => {\r\n    },\r\n};","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nimport { formatPrice, getBaseUrl, getProvince } from '../../../utils'\r\n\r\nimport SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport { Tooltip } from '../../1_Atoms/Tooltip/Tooltip';\r\nimport { TradeInModal } from '../../3_Organisms/Modal/TradeInModal';\r\n\r\nexport const PricePayment = ({ incentives, tradeInValue, checkTradeInValue, downPaymentValue, loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked, setDownPaymentInput, onBlurDownPaymentInput, setTradeInInput, onBlurTradeInInput, setLoyaltyChecked, setGraduateChecked, setMilitaryChecked, setFirstTimeOwnerChecked, setFinancialInfo, title, ...props }) => {\r\n\tconst summaryCalculator = new SummaryCalculator().reloadStoredData();\r\n\tconst evRebates = summaryCalculator.FinancialInfo.ev_rebates;\r\n    const { t, i18n } = useTranslation(['payments', 'general', 'summary']);\r\n    const tradeInLink = i18n.language === \"en\" ? `${getBaseUrl()}/en/shopping/trade-in-estimator/?bnp=1` : `${getBaseUrl()}/fr/magasiner/Estimateur-de-la-valeur-dechange/?bnp=1`;\r\n\tconst incentive_img_path = getBaseUrl() + t(\"payments:incentive_img\");\r\n\t\r\n\tconst [isTradeOpen, setIsTradeOpen] = React.useState(false);\r\n\r\n\tconst gtmHelper = new GTMHelper();\r\n\tconst carline = summaryCalculator.VehicleTitle;\r\n\r\n\tsessionStorage.setItem('curr_BNP_URL', 'https://' + window.location.host + window.location.pathname + window.location.hash.split('?')[0]);\r\n\t\r\n\tfunction isFirstTimeOwnerGreyOut() {\r\n\t\t// Uncheck\r\n\t\tif(!loyaltyChecked && !firstTimeOwnerChecked)\r\n\t\t\treturn '';\r\n\r\n\t\t// Checked\r\n\t\treturn !firstTimeOwnerChecked ? 'grey-out' : ''\r\n\t}\r\n\r\n\tfunction isLoyaltyGreyOut() {\r\n\t\t// Uncheck\r\n\t\tif(!loyaltyChecked && !firstTimeOwnerChecked)\r\n\t\t\treturn '';\r\n\r\n\t\t// Checked\r\n\t\treturn !loyaltyChecked ? 'grey-out' : '';\r\n\t}\r\n\r\n\tReact.useEffect(()=>{\r\n\t\twindow.addEventListener(\"message\", async function (e) {\r\n            if (e.data.type === \"formEvent\") {\r\n                console.log(\r\n                    `received message: ${e.data.message}`\r\n                )\r\n    \r\n                // If the message 'close' is passed, close the trade-in modal\r\n                if (e.data.message === \"close\") {\r\n                    setIsTradeOpen(false);\r\n                }\r\n            }else if(e.data.type==='setTradeInVal'){\r\n\t\t\t\tcheckTradeInValue(e.data.message);\r\n\t\t\t\tsetFinancialInfo(await summaryCalculator.RecalculateFinancialInfo());\r\n\t\t\t}\r\n        });\r\n\t},[tradeInValue])\r\n    return (\r\n\t\t<div className=\"mz-bg--off-white mz-price-payment-container\">\r\n\t        <div className=\"mz-price-payment desktop-center\">\r\n\t            <h1 className='mz-price-payment__title'>{ReactHtmlParser(title)}</h1>\r\n\t            {incentives.incentive && incentives.incentive.value > 0?<div className=\"mz-price-payment__connect\">\r\n\t                 <div >\r\n\t                    {/*<img src={incentive_img_path} alt=\"Mazda Incentives\"/>*/}\r\n\t\t\t\t\t\t<strong>{t(\"current_incentive\")}</strong>\r\n\t                    <Tooltip TooltipName=\"incentives\" incentives={incentives.incentive.value}/>\r\n\t                </div>\r\n\t                <span className=\"mz-price-payment__discount-price\">{`-${formatPrice(incentives.incentive.value)}`}</span>\r\n\t\t\t\t</div>:null}\r\n\t            {summaryCalculator.FinancialInfo.mazdaCashIncentive && summaryCalculator.FinancialInfo.mazdaCashIncentive > 0?<div className=\"mz-price-payment__connect\">\r\n\t                 <div >\r\n\t                    {/*<img src={incentive_img_path} alt=\"Mazda Incentives\"/>*/}\r\n\t\t\t\t\t\t<strong>{t(\"mazda_cash_incentive_title\")}</strong>\r\n\t                    <Tooltip TooltipName=\"mazda_cash_incentive\" incentives={summaryCalculator.FinancialInfo.mazdaCashIncentive}/>\r\n\t                </div>\r\n\t                <span className=\"mz-price-payment__discount-price\">{`-${formatPrice(summaryCalculator.FinancialInfo.mazdaCashIncentive)}`}</span>\r\n\t\t\t\t</div>:null}\t\t\t\t\r\n\t\t\t\t{ evRebates && evRebates.length > 0 ?\r\n\t\t\t\t<>\r\n\t\t\t\t {evRebates[0] && evRebates[0].province==='federal'?<div className=\"mz-price-payment__connect\">\r\n\t                 <div >\r\n\t                    {t(\"fed_rebate\")}<sup>★</sup>\r\n\t                    <Tooltip TooltipName=\"ev_rebate_federal\" incentives={formatPrice(evRebates[0].cash)} vehicle={carline}/>\r\n\t                </div>\r\n\t                <span className=\"mz-price-payment__discount-price text--green\">{t(\"up_to\")} {formatPrice(evRebates[0].cash)}</span>\r\n\t            </div>: ''}\r\n\t\t\t\t{evRebates[1] && evRebates[1].province==getProvince()?<div className=\"mz-price-payment__connect\">\r\n\t                 <div >\r\n\t                    {t(\"prov_rebate\")} ({getProvince()})<sup>★</sup>\r\n\t                    <Tooltip TooltipName={'ev_rebates_'+getProvince()} incentives={formatPrice(evRebates[1].cash)} vehicle={carline}/>\r\n\t                </div>\r\n\t                <span className=\"mz-price-payment__discount-price text--green\">{t(\"up_to\")} {formatPrice(evRebates[1].cash)}</span>\r\n\t            </div>:''}\r\n\t\t\t\t{evRebates[0] && evRebates[0].province==getProvince()?<div className=\"mz-price-payment__connect\">\r\n\t                 <div >\r\n\t                    {t(\"prov_rebate\")} ({getProvince()})<sup>★</sup>\r\n\t                    <Tooltip TooltipName={'ev_rebates_'+getProvince()} incentives={formatPrice(evRebates[0].cash)} vehicle={carline}/>\r\n\t                </div>\r\n\t                <span className=\"mz-price-payment__discount-price text--green\">{t(\"up_to\")} {formatPrice(evRebates[0].cash)}</span>\r\n\t            </div>:''}\r\n\r\n\t\t\t\t</> : '' }\r\n\t            <div className=\"mz-price-payment__trade\">\r\n\t                <label>{t(\"trade_in\")}<sup>1</sup> <a class=\"mz-link label text--grey\"\r\n\t\t\t\t\tonClick={async (e) => {\r\n\t\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\t\tsummaryCalculator.TradeInValue = 0;\r\n\t\t\t\t\t\tconst isRetailerMode = await summaryCalculator.isRetailerMode();\r\n\t\t\t\t\t\tif(isRetailerMode){\r\n\t\t\t\t\t\t\tsetIsTradeOpen(true);\r\n\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\twindow.location.href= tradeInLink;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}}>{t(\"estimate_your_trade_in_value\")}</a></label>\r\n\t                <input type=\"text\" value={tradeInValue.replace('$', '') === '0' ? '' :  tradeInValue} placeholder={t('payments:input_placeholder')} onChange={setTradeInInput} onBlur={onBlurTradeInInput} className=\"base trade-input\" />\r\n\t            </div>\r\n\t            <div className=\"mz-price-payment__down\">\r\n\t                <div className=\"mz-price-payment__label_container\"><label>{t(\"down_payment\")}<sup>2</sup></label> <Tooltip TooltipName=\"downpayment\"/></div>\r\n\t                <input type=\"text\" value={downPaymentValue.replace('$', '') === '0' ? '' :  downPaymentValue} placeholder={t('payments:input_placeholder')} onChange={setDownPaymentInput} onBlur={onBlurDownPaymentInput} className=\"base down-input\" />\r\n\t            </div>\r\n\t            {incentives.first_time_owner.value ?<div className={`mz-price-payment__firsttimeowner ${isFirstTimeOwnerGreyOut()}`}>\r\n\t                <div className='mz-price-payment__checkbox'><input type=\"checkbox\" className={`${isFirstTimeOwnerGreyOut()}`} checked={firstTimeOwnerChecked} onChange={()=>{\r\n\t\t\t\t\t\tsetFirstTimeOwnerChecked(!firstTimeOwnerChecked); \r\n\t\t\t\t\t\tgtmHelper.setGTM({'action':'Checkbox', 'type': 'FirstTimeOwner', 'value': firstTimeOwnerChecked}, true , false);\r\n\t\t\t\t\t}} id=\"firstTimeOwner\" /><div className=\"mz-price-payment__label_container\"><label id=\"labelFirstTimeOwner\" className={isFirstTimeOwnerGreyOut()} htmlFor=\"firstTimeOwner\">{ReactHtmlParser(t(\"mazda_first_time_owner_checkbox_title\"))}</label> <Tooltip TooltipName=\"first_time_owner\"/></div></div>\r\n\t                {firstTimeOwnerChecked?<span className=\"mz-price-payment__discount-price\">{`-${formatPrice(incentives.first_time_owner.value)}`}</span>:null}\r\n\t            </div>:null}\r\n\t\t\t\t\r\n\t            {incentives.loyalty ?<div className={`mz-price-payment__loyalty`} >\r\n\t                <div className='mz-price-payment__checkbox'><input type=\"checkbox\" className={isLoyaltyGreyOut()} checked={loyaltyChecked} onChange={()=>{\r\n\t\t\t\t\t\tsetLoyaltyChecked(!loyaltyChecked);\r\n\t\t\t\t\t\tgtmHelper.setGTM({'action':'Checkbox', 'type': 'Loyalty', 'value': loyaltyChecked}, true , false);\r\n\t\t\t\t\t}} id=\"loyalty\" /><div className=\"mz-price-payment__label_container\"><label className={isLoyaltyGreyOut()} htmlFor=\"loyalty\">{loyaltyChecked ? ReactHtmlParser(t(\"mazda_owner_loyalty_program_with_subtitle\")) : t(\"mazda_owner_loyalty_program\")}</label> <Tooltip TooltipName=\"ownerloyaltyprogram\" incentives={formatPrice(incentives.loyalty.cash_value)} rate={`${formatPrice(incentives.loyalty.rate_value * 100, true).replace('$', '')}`}/></div></div>\r\n\t            </div>:null}\r\n\t            {incentives.grad_award?<div className=\"mz-price-payment__graduate\">\r\n\t                <div className='mz-price-payment__checkbox'><input type=\"checkbox\" checked={graduateChecked} onChange={()=>{\r\n\t\t\t\t\t\tsetGraduateChecked(!graduateChecked);\r\n\t\t\t\t\t\tgtmHelper.setGTM({'action':'Checkbox', 'type': 'Graduate', 'value': graduateChecked}, true , false);\r\n\t\t\t\t\t}} id=\"graduate\" /><div className=\"mz-price-payment__label_container\"><label htmlFor=\"graduate\">{t(\"mazda_graduate_program_award\")}</label> <Tooltip TooltipName=\"graduate\"/></div></div>\r\n\t                {graduateChecked?<span className=\"mz-price-payment__discount-price\">{`-${formatPrice(incentives.grad_award.value)}`}</span>:null}\r\n\t            </div>:null}\r\n\t            {incentives.military?<div className=\"mz-price-payment__military\">\r\n\t                <div className='mz-price-payment__checkbox'><input type=\"checkbox\" checked={militaryChecked} onChange={()=>{\r\n\t\t\t\t\t\tsetMilitaryChecked(!militaryChecked);\r\n\t\t\t\t\t\tgtmHelper.setGTM({'action':'Checkbox', 'type': 'Military', 'value': militaryChecked}, true , false);\r\n\t\t\t\t\t}} id=\"military\" /><div className=\"mz-price-payment__label_container\"><label htmlFor=\"military\">{t(\"mazda_military_program\")}</label> <Tooltip TooltipName=\"military\"/></div></div>\r\n\t                {militaryChecked?<span className=\"mz-price-payment__discount-price\">{`-${formatPrice(incentives.military.value)}`}</span>:null}\r\n\t            </div>:null}\r\n\t\t\t</div>\r\n\t\t\t<TradeInModal isOpen={isTradeOpen} checkTradeInValue={checkTradeInValue} handleClose={setIsTradeOpen} setFinancialInfo={setFinancialInfo}></TradeInModal> \r\n        </div>\r\n    )\r\n}\r\n\r\nPricePayment.propTypes = {\r\n    setMoneyInput: PropTypes.func,\r\n    setLoyaltyChecked: PropTypes.func,\r\n    setGraduateChecked: PropTypes.func,\r\n    setMilitaryChecked: PropTypes.func,\r\n\tsetFirstTimeOwnerChecked: PropTypes.func\r\n}\r\n\r\nPricePayment.defaultProps = {\r\n    setMoneyInput: () => {},\r\n    setLoyaltyChecked: () => {},\r\n    setGraduateChecked: () => {},\r\n    setMilitaryChecked: () => {},\r\n\tsetFirstTimeOwnerChecked: () => {}\r\n}","//tabs driven by core js.\r\n/* global mzFunc mzMenu mzTabs */\r\n\r\nimport React, { useState } from \"react\";\r\nimport { useNavigate, useParams, useSearchParams } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { goToTop, getBaseUrl, getParams, getLoading, setCursorWaiting, province, hideCmsHiddenBlock } from \"../../../utils\";\r\n\r\nimport SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport NavHelper from '../../../Helpers/navhelper';\r\n\r\nimport Button from '../../1_Atoms/Button/Button';\r\nimport { FinanceOptions } from '../../2_Molecules/FinanceOptions/FinanceOptions';\r\nimport { LeaseOptions } from '../../2_Molecules/LeaseOptions/LeaseOptions';\r\nimport { CashOptions } from '../../2_Molecules/CashOptions/CashOptions';\r\nimport { PricePayment } from '../../2_Molecules/PricePayment/PricePayment';\r\nimport { Nav } from '../../3_Organisms/Nav/Nav';\r\nimport { PreOrderModal } from '../../3_Organisms/Modal/PreOrderModal';\r\nimport { Pricing } from '../../3_Organisms/Pricing/Pricing';\r\nimport { Modal } from '../../3_Organisms/Modal/Modal';\r\nimport { Alert } from '../../3_Organisms/Alert/Alert';\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nexport const PaymentsPage = ({ ...props }) => {\r\n    const [loading, setLoading] = useState(true);\r\n    const { t, i18n } = useTranslation(['payments', 'general']);\r\n    const summaryCalculator = window.summaryCalculator;\r\n    const { year, carline, trim, model, packageCode } = useParams();\r\n    const [nav, setNav] = React.useState(null);\r\n    let hasScrolled = false;\r\n    const navigate = useNavigate();\r\n    const [visibleTab, setVisibleTab] = useState(t(\"payments:finance_options\"));\r\n    //const [openCollapsable, setOpenCollapsable] = useState(null);\r\n    const legalContent = JSON.parse(sessionStorage.getItem(Constants.LegalPaymentInformation));\r\n    const [legalModalOpen, setLegalModalOpen] = React.useState(false);\r\n    const [selectedFinanceOption, setSelectedFinanceOption] = useState(null);\r\n    const [selectedLeaseOption, setSelectedLeaseOption] = useState(null);\r\n    const [selectedLeaseMileage, setSelectedLeasesMileage] = useState(null);\r\n    \r\n    const [loyaltyChecked, setLoyaltyChecked] = useState(summaryCalculator.LoyaltyChecked);\r\n    const [graduateChecked, setGraduateChecked] = useState(summaryCalculator.GraduateChecked);\r\n    const [militaryChecked, setMilitaryChecked] = useState(summaryCalculator.MilitaryChecked);\r\n    const [firstTimeOwnerChecked, setFirstTimeOwnerChecked] = useState(summaryCalculator.FirstTimeOwnerChecked);\r\n    const [includeFeesChecked, setIncludeFeesChecked] = useState(summaryCalculator.IncludeFees);\r\n    const [includeTaxesChecked, setIncludeTaxesChecked] = useState(summaryCalculator.IncludeTaxes);\r\n    const [includeRebatesChecked, setIncludeRebatesChecked] = useState(summaryCalculator.IncludeRebates);\r\n\r\n    const [tradeInValue, setTradeInValue] = useState(summaryCalculator.TradeInValue);\r\n    const [downPaymentValue, setDownPaymentValue] = useState(summaryCalculator.DownPaymentValue);\r\n\r\n    const [preorderOpen, setPreorderModalOpen] = React.useState(false);\r\n\r\n    const [financialInfo, setFinancialInfo] = useState(summaryCalculator.FinancialInfo);\r\n\r\n    const [searchParams, setSearchParams] = useSearchParams();\r\n    const DEBUG_MODE = sessionStorage.getItem(Constants.DEBUG);\r\n\r\n\tconst baseURL =  getBaseUrl() + '/globalassets/mazda-canada/build-and-price/pricing/evgridicons/';\r\n\r\n    const [financeType, setFinanceType] = React.useState(false);\r\n\r\n\tconst gtmHelper = new GTMHelper();\r\n\tconst navHelper = new NavHelper();\r\n\r\n    if(getParams()['tve']){\r\n        console.log(getParams()['tve'][0]);\r\n    }\r\n    \r\n    if (DEBUG_MODE)\r\n        console.log('YOU ARE IN DEBUG!');\r\n\r\n    let legalContentObject = '';\r\n    if (legalContentObject) {\r\n        legalContentObject.map(item => {\r\n            legalContent += item.copy\r\n        });\r\n    }\r\n\r\n    if (DEBUG_MODE) {\r\n        console.log(summaryCalculator.SelectedModelYear);\r\n\r\n        console.log('mazdaCashIncentive', summaryCalculator.FinancialInfo.mazdaCashIncentive);\r\n    }\r\n\r\n    async function setDownPaymentInput(e) {\r\n        const el = e.target;\r\n\r\n        let val = e.target.value;\r\n        val = val.replace(/\\D/g, \"\");\r\n\r\n        if (!DEBUG_MODE) {\r\n            // downpayment : Min: 0 , Max:  (TotalMSRP-10000) \r\n            if(parseInt(val) +  summaryCalculator.FinancialInfo.tradeInValue >= summaryCalculator.FinancialInfo.maxDownPayment){\r\n                val = summaryCalculator.FinancialInfo.maxDownPayment -summaryCalculator.FinancialInfo.tradeInValue;\r\n            }else if(parseInt(val) > summaryCalculator.FinancialInfo.maxDownPayment){\r\n                val = summaryCalculator.FinancialInfo.maxDownPayment;\r\n            }\r\n        }\r\n\r\n        if (val.length > 0) {\r\n            summaryCalculator.DownPaymentValue = `$${val}`;\r\n        } else {\r\n            summaryCalculator.DownPaymentValue = val;\r\n        }\r\n\r\n        // Check if the balance is under 7500$, if so update the downpayment\r\n        if(summaryCalculator.IncludeFees ? (summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinance < 7500 || summaryCalculator.FinancialInfo.calculatedLease.leaseEndValue < 3000) : (summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceNoFees < 7500 || summaryCalculator.FinancialInfo.calculatedLease.leaseEndValueNoFees < 3000) ) {\r\n            summaryCalculator.TradeInValue = 0;\r\n            summaryCalculator.DownPaymentValue = 0;\r\n        }\r\n\r\n        setDownPaymentValue(summaryCalculator.DownPaymentValue);\r\n    }  \r\n\r\n    async function checkTradeInValue(tempVal){\r\n        console.log('checkTradeInValue', tempVal);\r\n        let val = tempVal;\r\n        if(typeof val==='string'){\r\n            val = tempVal.replace(/\\D/g, \"\");\r\n        }\r\n        if (!DEBUG_MODE) {\r\n            // Tradein : Min: 0 , Max:  (TotalMSRP-10000) \r\n            if(parseInt(val) > summaryCalculator.FinancialInfo.maxDownPayment){\r\n                val = summaryCalculator.FinancialInfo.maxDownPayment;\r\n                summaryCalculator.DownPaymentValue = 0;\r\n            }else if(parseInt(val) +  summaryCalculator.FinancialInfo.downPaymentValue > summaryCalculator.FinancialInfo.maxDownPayment){\r\n                summaryCalculator.DownPaymentValue = summaryCalculator.FinancialInfo.maxDownPayment - parseInt(val);\r\n            }\r\n        }\r\n\r\n        if (val.length > 0) {\r\n            summaryCalculator.TradeInValue = `$${val}`;\r\n        } else {\r\n            summaryCalculator.TradeInValue = val;\r\n        }\r\n\r\n        // Check if the balance is under 7500$, if so update the downpayment\r\n        if(summaryCalculator.IncludeFees ? (summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinance < 7500 || summaryCalculator.FinancialInfo.calculatedLease.leaseEndValue < 3000) : (summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceNoFees < 7500 || summaryCalculator.FinancialInfo.calculatedLease.leaseEndValueNoFees < 3000) ) {\r\n            summaryCalculator.TradeInValue = 0;\r\n            summaryCalculator.DownPaymentValue = 0;\r\n        }\r\n\r\n        setTradeInValue(summaryCalculator.TradeInValue);\r\n    }\r\n    async function onBlurDownPaymentInput(e) {\r\n        setCursorWaiting(true);\r\n\r\n        setFinancialInfo(await summaryCalculator.RecalculateFinancialInfo());\r\n\r\n        gtmHelper.setGTM({'action':'Input', 'type': 'down payment', 'value': e.target.value}, true , false);\r\n        \r\n        setCursorWaiting(false);\r\n    }\r\n    async function setTradeInInput(e) {\r\n        setCursorWaiting(true);\r\n        \r\n        checkTradeInValue(e.target.value);\r\n        setFinancialInfo(await summaryCalculator.RecalculateFinancialInfo());\r\n    }  \r\n    async function onBlurTradeInInput(e) {\r\n        setCursorWaiting(true);\r\n\r\n        setFinancialInfo(await summaryCalculator.RecalculateFinancialInfo());\r\n\r\n        gtmHelper.setGTM({'action':'Input', 'type': 'trade in', 'value': e.target.value}, true , false);\r\n        \r\n        setCursorWaiting(false);\r\n    }    \r\n\r\n    hideCmsHiddenBlock();\r\n\r\n    summaryCalculator.CurrentStep = 8;\r\n    \r\n    React.useEffect(() => {\r\n        async function executeTasks() {\r\n            if (!summaryCalculator.isDataLoaded()/* && !loading*/) {\r\n                await summaryCalculator.loadVehicleData(year, carline, trim, model, packageCode);\r\n\r\n                if (JSON.parse(sessionStorage.getItem(Constants.HasFinancialProviderError)) === true) {\r\n                    const vehiclePageUri = `/${decodeURI(window.location.search)}`;\r\n                    navigate(vehiclePageUri)\r\n                }\r\n\r\n                setNav(null);\r\n\r\n                await summaryCalculator.loadFromFinancialProvider();\r\n            }\r\n\r\n            if (nav === null) {\r\n                //setNav(navHelper.getNavContent(year, carline, trim, model, packageCode,summaryCalculator.CurrentStep, t));\r\n                const toRender = navHelper.getNavContent(t);\r\n                setNav(toRender);\r\n            }\r\n\r\n            // patch for the ctrl-r case\r\n            //await summaryCalculator.loadFromFinancialProvider();\r\n            \r\n            if (loading) {\r\n                setLoading(false);\r\n            }\r\n\r\n            if (getParams()['tve'] !== undefined){\r\n                checkTradeInValue(getParams()['tve'][0]);\r\n                searchParams.delete('tve');\r\n                setSearchParams(searchParams)\r\n                \r\n                setFinancialInfo(await summaryCalculator.RecalculateFinancialInfo());\r\n            }\r\n        }\r\n\t\tif(typeof mzFunc === 'object' && typeof mzTabs === 'object'){\r\n\t\t\tmzFunc.waitForEl('.mzBuildandPrice .mz-tabs').then(function(components){mzTabs.init(components);});\r\n            // TODO: Verify why it doesn't work on mobile\r\n            //mzMenu.init();\r\n\t\t}\r\n        \r\n        executeTasks();\r\n    }, [nav, searchParams, summaryCalculator, financialInfo, selectedFinanceOption, selectedLeaseOption, loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked, includeFeesChecked, includeTaxesChecked, includeRebatesChecked, tradeInValue, downPaymentValue]);\r\n\r\n    React.useEffect(() => {\r\n        if( document.querySelector('#oca') != undefined){\r\n            if (searchParams.get('oca') === '1') {\r\n                document.querySelector('#oca').scrollIntoView({\r\n                    block: 'center',\r\n                    behavior: 'smooth'\r\n                });\r\n            }\r\n        }\r\n\r\n    },[searchParams, loading]);\r\n\r\n    function nextStep() {\r\n        goToTop();\r\n        navigate(`/${year}/${carline}/${trim}/${model}/${packageCode}/summary${decodeURI(window.location.search)}`);\r\n\t\tgtmHelper.setGTM({'action':'Next Step'}, true , false);\r\n    }\r\n\r\n    let paymentCats = [{ name: t(\"payments:finance_options\") }, { name: t(\"payments:lease_options\") }, { name: t(\"payments:purchase_price\") }];\r\n\r\n    const paymentTabs = Object.keys(paymentCats).map((item, key) => {\r\n        return (\r\n            <a\r\n                onClick={() => setVisibleTab(paymentCats[item].name)}\r\n                key={paymentCats[item].name}\r\n                className={visibleTab === paymentCats[item].name ? \"mz-tabs-tab interactive active\" : \"mz-tabs-tab interactive\"}\r\n            >\r\n                {paymentCats[item].name}\r\n            </a>\r\n        )\r\n    });\r\n\r\n    let paymentBlocks = [{ name: t(\"payments:finance_options\"), class: 'mz-finance-options' }, { name: t(\"payments:lease_options\"), class: 'mz-lease-options' }, { name: t(\"payments:purchase_price\"), class: 'mz-detailed-options' }];\r\n    const paymentTabsContent = Object.keys(paymentBlocks).map((item, key) => {\r\n\r\n        return (\r\n            <div\r\n                key={key}\r\n                className=\"mz-payments-page__details__column\"\r\n                style={paymentBlocks[item].name.includes(visibleTab) ? {} : { display: 'none' }}\r\n            >   \r\n                {item==='0' ? <div><FinanceOptions setSelectedFinanceOption={ setSelectedFinanceOption } setPreorderModalOpen={setPreorderModalOpen} /></div> : '' }\r\n                {item==='1' ?  <div><LeaseOptions setSelectedLeaseOption={ setSelectedLeaseOption } setSelectedLeasesMileage={ setSelectedLeasesMileage }  setPreorderModalOpen={setPreorderModalOpen} /></div> : '' }\r\n                {item==='2' ? <div><CashOptions />\r\n                </div> : '' }\r\n            </div>\r\n        )\r\n    });\r\n\r\n    function getAdminFeeDisclaimerSection() {\r\n        const el = document.querySelectorAll('input[data-mz-form-field-name=\"formAdminServiceFeeDisclaimer\"]');\r\n\r\n        const disclaimerMessage = el.length > 0 ? el[0].value : \"\";\r\n\r\n        if(disclaimerMessage)\r\n            return (\r\n                    <div className=\"mz-admin-fee-disclaimer\">\r\n                        {disclaimerMessage}\r\n                    </div>\r\n            );\r\n        else\r\n            return (\r\n                <>\r\n                </>\r\n            );\r\n    }\r\n\r\n    async function handleLoyaltyChecked() {\r\n        setCursorWaiting(true);\r\n\r\n        summaryCalculator.LoyaltyChecked  = !summaryCalculator.LoyaltyChecked;\r\n        if(summaryCalculator.LoyaltyChecked)\r\n            summaryCalculator.FirstTimeOwnerChecked = false;\r\n\r\n        await summaryCalculator.RecalculateFinancialInfo();\r\n        setLoyaltyChecked(summaryCalculator.LoyaltyChecked);\r\n        setFirstTimeOwnerChecked(summaryCalculator.FirstTimeOwnerChecked);\r\n\r\n        setCursorWaiting(false);\r\n    }\r\n\r\n    async function handleFirstTimeOwnerChecked() {\r\n        setCursorWaiting(true);\r\n\r\n        summaryCalculator.FirstTimeOwnerChecked  = !summaryCalculator.FirstTimeOwnerChecked;\r\n        if(summaryCalculator.FirstTimeOwnerChecked)\r\n            summaryCalculator.LoyaltyChecked = false;\r\n\r\n        await summaryCalculator.RecalculateFinancialInfo();\r\n        setFirstTimeOwnerChecked(summaryCalculator.FirstTimeOwnerChecked);\r\n        setLoyaltyChecked(summaryCalculator.LoyaltyChecked);\r\n\r\n        setCursorWaiting(false);\r\n    }    \r\n\r\n    async function handleGraduateChecked() {\r\n        setCursorWaiting(true);\r\n\r\n        summaryCalculator.GraduateChecked  = !summaryCalculator.GraduateChecked;\r\n        await summaryCalculator.RecalculateFinancialInfo();\r\n        setGraduateChecked(summaryCalculator.GraduateChecked);\r\n\r\n        setCursorWaiting(false);\r\n    }\r\n\r\n    async function handleMilitaryChecked() {\r\n        setCursorWaiting(true);\r\n\r\n        summaryCalculator.MilitaryChecked  = !summaryCalculator.MilitaryChecked;\r\n        await summaryCalculator.RecalculateFinancialInfo();\r\n        setMilitaryChecked(summaryCalculator.MilitaryChecked);\r\n\r\n        setCursorWaiting(false);\r\n    }\r\n\r\n\r\n\r\n    async function handleIncludeFeesChecked() {\r\n        setCursorWaiting(true);\r\n\r\n        summaryCalculator.IncludeFees = !summaryCalculator.IncludeFees;\r\n        await summaryCalculator.RecalculateFinancialInfo();\r\n        setIncludeFeesChecked(summaryCalculator.IncludeFees);\r\n\r\n\t\tgtmHelper.setGTM({'action':'Checkbox', 'type': 'Fees', 'value': summaryCalculator.IncludeFees}, true , false);\r\n\r\n        setCursorWaiting(false);\r\n    }\r\n\r\n    async function handleIncludeTaxesChecked() {\r\n        setCursorWaiting(true);\r\n\r\n        summaryCalculator.IncludeTaxes = !summaryCalculator.IncludeTaxes;\r\n        await summaryCalculator.RecalculateFinancialInfo();\r\n        setIncludeTaxesChecked(summaryCalculator.IncludeTaxes);\r\n\r\n\t\tgtmHelper.setGTM({'action':'Checkbox', 'type': 'Taxes', 'value': summaryCalculator.IncludeTaxes}, true , false);\r\n\r\n        setCursorWaiting(false);\r\n    }\r\n\r\n    async function handleIncludeRebatesChecked() {\r\n        setCursorWaiting(true);\r\n\r\n        summaryCalculator.IncludeRebates = !summaryCalculator.IncludeRebates;\r\n        await summaryCalculator.RecalculateFinancialInfo();\r\n        setIncludeRebatesChecked(summaryCalculator.IncludeRebates);\r\n        \r\n\r\n\t\tgtmHelper.setGTM({'action':'Checkbox', 'type': 'Rebates', 'value': summaryCalculator.IncludeRebates}, true , false);\r\n\r\n        setCursorWaiting(false);\r\n    }\r\n \r\n    function hasAlertBar() {\r\n        return summaryCalculator?._selectedModelYear?.incentives_banner;\r\n    }\r\n\r\n    function canDisplayEvRebatesCheckBox() {\r\n        return summaryCalculator.FinancialInfo.ev_rebates && summaryCalculator.FinancialInfo.ev_rebates.length > 0;\r\n    }\r\n\r\n    if (loading) {\r\n        return (\r\n            <div className=\"mz-spinner\">LOADING ...</div>\r\n        )\r\n    }\r\n    return (\r\n        <>\r\n            {getLoading(loading, t)}\r\n            <Nav nav={nav} />\r\n            <div className={`${hasAlertBar() ? 'mz-top-nav-spacing' : ''}`}>\r\n                <Alert />\r\n                <div className={`mz-payments-page ${hasAlertBar() ? 'alert-bar-top' : 'mz-top-nav-spacing'}`}>\r\n                    <PricePayment title={summaryCalculator.VehicleTitle}\r\n                    incentives={summaryCalculator.Incentives}\r\n                    ev_rebates={summaryCalculator.FinancialInfo.ev_rebates}\r\n                    tradeInValue={summaryCalculator.TradeInValue}\r\n                    downPaymentValue={summaryCalculator.DownPaymentValue}\r\n                    loyaltyChecked={summaryCalculator.LoyaltyChecked}\r\n                    graduateChecked={summaryCalculator.GraduateChecked}\r\n                    militaryChecked={summaryCalculator.MilitaryChecked}\r\n                    firstTimeOwnerChecked={summaryCalculator.FirstTimeOwnerChecked}\r\n                    setDownPaymentInput={setDownPaymentInput}\r\n                    onBlurDownPaymentInput={onBlurDownPaymentInput}\r\n                    setTradeInInput={setTradeInInput}\r\n                    onBlurTradeInInput={onBlurTradeInInput}\r\n                    setLoyaltyChecked={handleLoyaltyChecked}\r\n                    setGraduateChecked={handleGraduateChecked}\r\n                    setMilitaryChecked={handleMilitaryChecked}\r\n                    setFirstTimeOwnerChecked={handleFirstTimeOwnerChecked}\r\n                    checkTradeInValue={checkTradeInValue}\r\n                    setFinancialInfo={setFinancialInfo} />\r\n                    {ReactHtmlParser(summaryCalculator.SelectedModelYear.price_payments_callout)}\r\n                    \r\n                    { searchParams.get('oca') === '1' ?\r\n                        <>\r\n                            <div class=\"mz-spacer mz-spacer-s\"></div>\r\n                            <div class=\"mz-payments-page__details mz-container-flex mz-bg--black\" id=\"oca\">\r\n                                <div class=\"mz-flex-1\">\r\n                                    <div class=\"mz-spacer mz-spacer-s\"></div>\r\n                                    <h4 class=\"text--white text--center\">{t('creditTitle')}</h4>\r\n                                    <p class=\"text--white text--center\">{t('creditContent')}</p>\r\n                                </div>\r\n                            </div>\r\n                        </>\r\n                        : ''\r\n                    }\r\n                    <div className=\"mz-financial--actions\">\r\n                        {canDisplayEvRebatesCheckBox() ? \r\n                        <div className=\"actions__item\">\r\n                            <input type=\"checkbox\" defaultChecked={summaryCalculator.IncludeRebates} onChange={handleIncludeRebatesChecked} id=\"includeRebates\" />\r\n                            <label htmlFor=\"includeRebates\"> {t(\"checkbox_include_government_rebates\")}</label>\r\n                        </div> : null }\r\n                        <div className=\"actions__item\">\r\n                            <input type=\"checkbox\" defaultChecked={summaryCalculator.IncludeFees} onChange={handleIncludeFeesChecked} id=\"includeFees\" />\r\n                            <label htmlFor=\"includeFees\"> {t(\"checkbox_include_fees_and_levies\")}</label>\r\n                        </div>\r\n                        <div className=\"actions__item\">\r\n                            <input type=\"checkbox\" defaultChecked={summaryCalculator.IncludeTaxes} onChange={handleIncludeTaxesChecked} id=\"includeTaxes\" />\r\n                            <label htmlFor=\"includeTaxes\"> {t(\"checkbox_include_taxes_in_prices\")}</label>\r\n                        </div>\r\n\r\n                    </div>\r\n\r\n                    {getAdminFeeDisclaimerSection()}\r\n                    \r\n                    <div className=\"mz-payments-page__details\">\r\n                        <div className=\"mz-tabs mz-tabs--payments mz-mobile\">\r\n                            <div className=\"mz-tabs-menu\">\r\n                                <div className=\"mz-tabs-menu-container\">\r\n                                <div className=\"mz-tabs-menu-inner\">\r\n                                        {paymentTabs}\r\n                                    </div>\r\n                                </div>\r\n                                <div className=\"mz-tabs-menu--left\"><i className=\"mz-svg mz-svg--grey mz-svg-chevroncarousel mz-svg--rotate180\"></i></div>\r\n                                <div className=\"mz-tabs-menu--right active\"><i className=\"mz-svg mz-svg--grey mz-svg-chevroncarousel\"></i></div>\r\n                            </div>\r\n                            <div className=\"mz-tabs__content\">\r\n                                {paymentTabsContent}\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                    <div className=\"mz-legal mz-mobile\">\r\n                        <Button\r\n                            className=\"mz-btn mz-btn--legal text--grey\"\r\n                            label={t(\"general:legal\")}\r\n                            backgroundColor=\"grey\"\r\n                            colour=\"grey\"\r\n                            icon={true}\r\n                            iconAfter={true}\r\n                            svg_className=\"\"\r\n                            svg_list=\"plus\"\r\n                            size={0.6}\r\n                            onClick={() => {\r\n                                document.querySelector('body').classList.add('disabled');\r\n                                setLegalModalOpen(true);\r\n                            }}\r\n                        />\r\n                    </div>\r\n                    <Pricing builtLabel={t(\"general:price_as_built\")} builtPrice=\"$\" loanLabel={t(\"general:loan_label\")} loanPrice=\"$\" buttonLabel={t(\"general:next_summary\")} saveLabel={t(\"general:save_build\")} summaryCalculator={summaryCalculator}\r\n                        HandleNextClick={nextStep} setLegalModalOpen={setLegalModalOpen} leaseLabel={t(\"general:show_lease_price\")} financeLabel={t(\"general:show_finance_price\")} setPreorderModalOpen={setPreorderModalOpen}/>\r\n                    <PreOrderModal isOpen={preorderOpen} handleClose={setPreorderModalOpen}></PreOrderModal> \r\n                    <Modal modalContent={legalContent} isOpen={legalModalOpen} handleClose={setLegalModalOpen} modalId='legalModal' />\r\n                </div>\r\n            </div>\r\n        </>\r\n    )\r\n}\r\n\r\nexport default PaymentsPage;","import React, { useState, useRef, useEffect } from 'react';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nimport { formatPrice, goToTop, getLoading, setCursorWaiting, getFinanceWeekly, getLeaseBiWeeklyFromOptions, getLang, getBaseUrl, get360Data, hideCmsHiddenBlock} from '../../../utils';\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport NavHelper from '../../../Helpers/navhelper';\r\n\r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\nimport Button from '../../1_Atoms/Button/Button';\r\nimport CollapseLegal from '../../2_Molecules/Collapse/CollapseLegal';\r\nimport ColourCard from '../../2_Molecules/ColourCard/ColourCard';\r\nimport ThreeSixtyContainer from '../../3_Organisms/360Container/360Container';\r\nimport { Nav } from '../../3_Organisms/Nav/Nav';\r\nimport { Pricing } from '../../3_Organisms/Pricing/Pricing';\r\nimport { Modal } from '../../3_Organisms/Modal/Modal';\r\nimport { PreOrderModal } from '../../3_Organisms/Modal/PreOrderModal';\r\nimport { Alert } from '../../3_Organisms/Alert/Alert';\r\n\r\nexport const Protection = ({ ...props }) => {\r\n    const baseURL = getBaseUrl();\r\n    const lang = getLang();\r\n    const [loading, setLoading] = useState(true);\r\n    const summaryCalculator = window.summaryCalculator;\r\n    const { year, carline, trim, model, packageCode } = useParams();\r\n    const [nav, setNav] = useState(null);\r\n    const navigate = useNavigate();\r\n\r\n    const [preorderOpen, setPreorderModalOpen] = React.useState(false);\r\n    \r\n    let images = {};\r\n    \r\n    if (summaryCalculator.SelectedColourExteriorIndex !== 'null' && summaryCalculator.Colours !== null) {\r\n        const { exteriors, interiors } = summaryCalculator.Colours.visual;\r\n        const selectedExterior = Object.entries(exteriors)[summaryCalculator.SelectedColourExteriorIndex][1];\r\n        const selectedInterior = summaryCalculator.SelectedColourInteriorIndex !== 'null' ? interiors[summaryCalculator.SelectedColourInteriorIndex] : null;\r\n        images = get360Data(summaryCalculator.Colours.visual, selectedExterior, selectedInterior);\r\n    }\r\n    const generateStaticVehicleImg = () => {\r\n        if (images) {\r\n            const { imagePath,  imageName } = images;\r\n            const { year, carline, trim } = summaryCalculator.selectedVehicle\r\n            const src = imagePath && imageName ? `${imagePath}${imageName.replace('{index}', 18)}` : '';\r\n            return (\r\n                <img src={src} alt={year + '' + carline + ' ' + trim} />\r\n            )\r\n        }\r\n        return ''\r\n    }\r\n\r\n    const collapseRefProtection = useRef();\r\n    const collapseRefAppearance = useRef();\r\n    const [protectionExpanded, setProtectionExpanded] = useState(false);\r\n    const [appearanceExpanded, setAppearanceExpanded] = useState(false);\r\n\r\n    const legalContent = JSON.parse(sessionStorage.getItem(Constants.LegalProtections));\r\n    const [legalModalOpen, setLegalModalOpen] = useState(false);\r\n    const { t, i18n } = useTranslation(['protection', 'general']);\r\n    const [showFinancePrice, setShowFinancePrice] = useState(summaryCalculator.ShowFinancePrice);\r\n\r\n    const financial = JSON.parse(sessionStorage.getItem(Constants.FinancialObj));\r\n    const financeTermIndex = parseInt(sessionStorage.getItem(Constants.FinanceTermIndex));\r\n    const leaseTermIndex = parseInt(sessionStorage.getItem(Constants.LeaseTermIndex));\r\n\r\n    const [selectedAddedProtectionIndex, setSelectedAddedProtectionIndex] = useState(summaryCalculator.SelectedAddedProtectionIndex);\r\n    //const [selectedAppearanceProtectionIndex, setSelectedAppearanceProtectionIndex] = React.useState(summaryCalculator.SelectedAppearanceProtectionIndex);\r\n\r\n    const [addedProtectionSection, setAddedProtectionSection] = useState(null);\r\n\r\n    //const [appearanceDropDown, setAppearanceDropDown] = React.useState(Object.keys(summaryCalculator.Packages.appearance_protection[0].plans)[summaryCalculator.SelectedAppearanceProtectionIndex]);\r\n    const [appearanceDropDown, setAppearanceDropDown] = useState(Object.keys(summaryCalculator.Packages.appearance_protection[0].plans)[0]);\r\n    const [appearanceSelection, setAppearanceSelection] = useState(summaryCalculator.SelectedAppearanceProtectionPlansPackage.key !== undefined ? summaryCalculator.SelectedAppearanceProtectionPlansPackage.key : null);\r\n\r\n    const gtmHelper = new GTMHelper();\r\n    const navHelper = new NavHelper();\r\n\r\n    hideCmsHiddenBlock();\r\n    \r\n    useEffect(() =>{\r\n        const collapseProt = collapseRefProtection.current;\r\n        const collapseApp = collapseRefAppearance.current;\r\n        if(typeof window.mzAnimator === 'object'&& !protectionExpanded){\r\n            window.mzAnimator.animateHeight(collapseApp, 'CollapseListApp', 'init')\r\n            window.mzAnimator.animateHeight(collapseProt, 'CollapseListProt', 'init')\r\n            console.log(collapseRefProtection)\r\n        }\r\n   },[addedProtectionSection]);\r\n    \r\n    useEffect(() =>{   \r\n        const collapse = collapseRefProtection.current;\r\n        if(protectionExpanded){\r\n            window.mzAnimator.animateHeight(collapse, 'CollapseListProt', true)\r\n        }else{\r\n            window.mzAnimator.animateHeight(collapse, 'CollapseListProt', false)\r\n        }\r\n   },[protectionExpanded]);\r\n   useEffect(() =>{   \r\n        const collapse = collapseRefAppearance.current;\r\n\r\n        if(appearanceExpanded){\r\n            window.mzAnimator.animateHeight(collapse, 'CollapseListApp', true)\r\n        }else{\r\n            window.mzAnimator.animateHeight(collapse, 'CollapseListApp', false)\r\n        }\r\n    },[appearanceExpanded]);\r\n\r\n\r\n    function hideShownCmsBlock() {\r\n        let toHideBlocks = document.querySelectorAll('.mz-footer.visually-shown');\r\n        if (toHideBlocks) {\r\n            toHideBlocks.forEach(function (e) {\r\n                e.classList.remove('visually-shown');\r\n                e.classList.add('visually-hidden');\r\n            });\r\n        }\r\n    }\r\n\r\n    hideShownCmsBlock();\r\n\r\n    summaryCalculator.CurrentStep = 7;\r\n\r\n    useEffect(() => {\r\n        async function executeTasks() {\r\n            if (!summaryCalculator.isDataLoaded()) {\r\n                await summaryCalculator.loadTrims(year, carline);\r\n\r\n                const trimIndex = summaryCalculator.AvailableTrim.trims.findIndex(obj => obj.trim_type.name === trim);\r\n                await summaryCalculator.setSelectedTrimIndex(trimIndex);\r\n\r\n                setLoading(false);\r\n\r\n                setNav(null);\r\n            } else {\r\n                setLoading(false);\r\n\r\n            }\r\n\r\n            if (!loading) {\r\n                if (nav === null) {\r\n                    const toRender = navHelper.getNavContent(t);\r\n                    setNav(toRender);                    \r\n                }\r\n            }\r\n        }\r\n\r\n        executeTasks();\r\n    }, [loading, nav, selectedAddedProtectionIndex, ]);\r\n\r\n    useEffect(() => {\r\n        if(addedProtectionSection === null) {\r\n            setAddedProtectionSection(prepareAddedProtectionSection());\r\n        }\r\n    }, [addedProtectionSection]);\r\n\r\n    function prepareAddedProtectionSection() {\r\n        let section;\r\n\r\n        if (summaryCalculator.SelectedAddedProtectionIndex == null) {\r\n            /* DISPLAY THE TABLE IF WE HAVE NONE SELECTED*/\r\n            section = getAddedProtectionPackage();\r\n        } else {\r\n            section = getCurrentAddedProtectionPackage();\r\n        }\r\n\r\n        return section;\r\n    }\r\n\r\n    function nextStep() {\r\n        goToTop();\r\n        navigate(`/${year}/${carline}/${trim}/${model}/${packageCode}/payments${decodeURI(window.location.search)}`)\r\n        gtmHelper.setGTM({ 'action': 'Next Step' }, true, false);\r\n    }\r\n\r\n    async function handleSelectedAddedProtectionPackage(index) {\r\n        setCursorWaiting(true);\r\n\r\n        await summaryCalculator.setSelectedAddedProtectionIndex(index);\r\n\r\n        gtmHelper.setGTM({ 'action': 'Added Protection Package Add', 'package': summaryCalculator.SelectedAddedProtectionPackage.option_code }, false, false); // TODO : CHECK WITH BARLOW IF IT'S A CODE OR INDEX\r\n\r\n        setSelectedAddedProtectionIndex(index);\r\n\r\n        setNav(null);\r\n\r\n        setAddedProtectionSection(prepareAddedProtectionSection());\r\n        \r\n        setCursorWaiting(false);\r\n    }\r\n\r\n    async function handleRemoveAddedProtectionPackage() {\r\n        setCursorWaiting(true);\r\n\r\n        gtmHelper.setGTM({ 'action': 'Added Protection Package Remove', 'package': summaryCalculator.SelectedAddedProtectionPackage.option_code }, true, false); // TODO : CHECK WITH BARLOW IF IT'S A CODE OR INDEX\r\n\r\n        await summaryCalculator.setSelectedAddedProtectionIndex(null);\r\n\r\n        setSelectedAddedProtectionIndex(null);\r\n\r\n        setNav(null);\r\n\r\n        setAddedProtectionSection(prepareAddedProtectionSection());\r\n\r\n        setCursorWaiting(false);\r\n    }\r\n\r\n    async function handleAppearanceProtectionTerms(index) {\r\n        summaryCalculator.setSelectedAppearanceProtectionIndex(index);\r\n    }\r\n\r\n    async function handleAppearanceProtectionPlansPackage(index, key) {\r\n        setCursorWaiting(true);\r\n\r\n        setAppearanceSelection(key);\r\n\r\n        await summaryCalculator.setSelectedAppearanceProtectionPlansIndex(index);\r\n\r\n        gtmHelper.setGTM({ 'action': 'Appearance Protection Plans Package Add', 'package': summaryCalculator.SelectedAppearanceProtectionPlansPackage.name }, false, false); // TODO : CHECK WITH BARLOW IF IT'S A CODE OR INDEX\r\n\r\n        setNav(null);\r\n\r\n        setCursorWaiting(false);\r\n    }\r\n\r\n    async function handleRemoveAppearanceProtectionPlansPackage() {\r\n        setCursorWaiting(true);\r\n\r\n        setAppearanceSelection(null);\r\n\r\n        gtmHelper.setGTM({ 'action': 'Appearance Protection Plans Package Remove', 'package': summaryCalculator.SelectedAppearanceProtectionPlansPackage.name }, true, false); // TODO : CHECK WITH BARLOW IF IT'S A CODE OR INDEX\r\n\r\n        await summaryCalculator.setSelectedAppearanceProtectionPlansIndex(null);\r\n\r\n        setNav(null);\r\n\r\n        setCursorWaiting(false);\r\n    }\r\n\r\n    function handleShowFinanceClick(value) {\r\n        setShowFinancePrice(value);\r\n    }\r\n\r\n    function getAddedProtectionPackage() {\r\n        const addedProtectionPackageList = Object.entries(summaryCalculator.Packages.added_protection[0].plans).map(([key, plan], planIndex) => (\r\n            <div className=\"mz-protection-packages__item\" key={key}>\r\n               <div><strong>{plan.name}</strong></div>\r\n               <span>+ {formatPrice(plan.financial.msrp)} <span className=\"label\">{\r\n                        `(${showFinancePrice?\r\n                            `${getFinanceWeekly(plan.financial.msrp, financial.calculatedFinance.financeValues[financeTermIndex].aprRate, financial.calculatedFinance.financeValues[financeTermIndex].term)}${t(\"general:week\")}`:\r\n                            `${getLeaseBiWeeklyFromOptions(plan.financial.msrp, financial.calculatedLease.leaseValues[leaseTermIndex].leaseRate, financial.calculatedLease.leaseValues[leaseTermIndex].term)}${t(\"general:bi_week\")}`})`}</span></span>\r\n                <button className=\"mz-btn mz-btn--primary mz-btn--red\" onClick={()=>handleSelectedAddedProtectionPackage(planIndex)}><span>{t('general','add')}</span></button>\r\n            </div>\r\n        ));\r\n\r\n        return (<div className=\"mz-protection-packages\">\r\n            {addedProtectionPackageList}\r\n        </div>\r\n        )\r\n    }\r\n\r\n    function getCurrentAddedProtectionPackage() {\r\n        const plan = summaryCalculator.SelectedAddedProtectionPackage.financial.msrp;\r\n        return (<div>\r\n            <div><strong>{summaryCalculator.SelectedAddedProtectionPackage.name}</strong></div>\r\n            <p><span>+ {formatPrice(plan)} <span className=\"label\">{\r\n                        `(${showFinancePrice?\r\n                            `${getFinanceWeekly(plan, financial.calculatedFinance.financeValues[financeTermIndex].aprRate, financial.calculatedFinance.financeValues[financeTermIndex].term)}${t(\"general:week\")}`:\r\n                            `${getLeaseBiWeeklyFromOptions(plan, financial.calculatedLease.leaseValues[leaseTermIndex].leaseRate, financial.calculatedLease.leaseValues[leaseTermIndex].term)}${t(\"general:bi_week\")}`})`}</span></span>\r\n            </p>\r\n            <button className=\"mz-btn mz-btn--primary\" onClick={()=>{handleRemoveAddedProtectionPackage()}}><span>{t('general','remove')}</span></button> \r\n        </div>)\r\n    }\r\n\r\n    function getAppearanceProtectionSection() {\r\n        if (appearanceSelection === null) {\r\n            return (\r\n                <>\r\n                    {getAppearanceProtectionTermsDropDown()}\r\n                    {getAppearanceProtectionList()}\r\n                </>\r\n            )\r\n        } else {\r\n            const appearanceProtectionPlan = summaryCalculator.SelectedAppearanceProtectionPlan;\r\n            const plan = appearanceProtectionPlan.packages[appearanceSelection].financial.msrp;\r\n            return (\r\n                <div>\r\n                    <div>\r\n                        <p><strong>{summaryCalculator.SelectedAppearanceProtectionPlansPackage.name} ({appearanceProtectionPlan.name})</strong></p>\r\n                        <p><span>+ {formatPrice(plan)} <span className=\"label\">{\r\n                        `(${showFinancePrice?\r\n                            `${getFinanceWeekly(plan, financial.calculatedFinance.financeValues[financeTermIndex].aprRate, financial.calculatedFinance.financeValues[financeTermIndex].term)}${t(\"general:week\")}`:\r\n                            `${getLeaseBiWeeklyFromOptions(plan, financial.calculatedLease.leaseValues[leaseTermIndex].leaseRate, financial.calculatedLease.leaseValues[leaseTermIndex].term)}${t(\"general:bi_week\")}`})`}</span></span></p>\r\n                    </div>\r\n                    <p><button className=\"mz-btn mz-btn--primary\" onClick={()=>{handleRemoveAppearanceProtectionPlansPackage()}}><span>{t('general','remove')}</span></button> </p>\r\n                </div>\r\n            )\r\n        }\r\n    }\r\n\r\n    // TODO : LOOK WHAT WE DO WITH THOSE ICONS\r\n    function getAddedProtectionIcons() {\r\n        if (summaryCalculator.Packages.added_protection.length === 0)\r\n            return;\r\n\r\n        const src =`${baseURL}/globalassets/mazda-canada/react/images/mazdaaddedprotection_${lang}.png`;\r\n\r\n        return (<img src={src} />)\r\n    }\r\n\r\n    // TODO : LOOK WHAT WE DO WITH THOSE ICONS\r\n    function getAppearanceProtectionIcons() {\r\n        if (summaryCalculator.Packages.appearance_protection.length === 0)\r\n            return;\r\n\r\n        const iconList = summaryCalculator.Packages.appearance_protection[0].icons.map((icon, index) => (\r\n            <div key={index}>\r\n                <i className={`mz-svg mz-svg-appearance_${icon.name}`}></i>\r\n            </div>\r\n        ));\r\n\r\n        return (<div>\r\n            {iconList}\r\n        </div>\r\n        )\r\n    }\r\n\r\n    function setExpand(title, innerContent, target) {\r\n        // HACK FOR THE COLLAPSIBLE ON CTRL-R\r\n        if (!innerContent) \r\n            return (\r\n                <>\r\n                </>\r\n            )\r\n        \r\n        let active='';\r\n        let visible='';\r\n        let ref=null;\r\n        if(target === 'protection' && protectionExpanded){\r\n            active='active';\r\n            ref=collapseRefProtection;\r\n        }else if(target === 'protection'){\r\n            ref=collapseRefProtection;\r\n        }else if(target === 'appearance' && appearanceExpanded){\r\n            active='active';\r\n            ref=collapseRefAppearance;\r\n        }else if(target === 'appearance'){\r\n            ref=collapseRefAppearance;\r\n        }\r\n        console.log(target, active, ref)\r\n        return (<div className=\"mz-collapse mz-container-flex\">\r\n            <button className={`mz-collapse__button ${active}`} onClick={(e)=>{expandToggle(target)}}>\r\n                <h5>{title}</h5>\r\n                <i className=\"mz-svg mz-svg-chevroncarousel mz-svg--grey\"></i>\r\n            </button>\r\n            <div className={`mz-collapse__box`} ref={ref}>\r\n                <div className=\"mz-collapse__box-inner\">\r\n                    {innerContent}\r\n                </div>\r\n            </div>\r\n        </div>)\r\n    }\r\n\r\n    function expandToggle(target){\r\n        if(target === 'protection'){\r\n            setProtectionExpanded(!protectionExpanded);\r\n        }else{\r\n            setAppearanceExpanded(!appearanceExpanded);\r\n        }\r\n    }\r\n\r\n    function getAppearanceProtectionTermsDropDown() {\r\n        const terms = Object.entries(summaryCalculator.Packages.appearance_protection[0].plans).map(([key, appearanceProtectionPlans], index) =>\r\n            <option value={key} index={index} key={key}>{appearanceProtectionPlans.name}</option>\r\n        );\r\n        return (\r\n            <div className=\"mz-protection-page__appearanceSelect\">\r\n\r\n                <span className=\"label text--grey\">{summaryCalculator.Packages.appearance_protection[0].term_dropdown_label}</span>\r\n                <div className=\"mz-form-item mz-form-item--select \">\r\n                    <select className=\"mz-form-item__select\" defaultValue={appearanceDropDown} onChange={(e)=>{\r\n                        setAppearanceDropDown(e.target.value);\r\n                        handleAppearanceProtectionTerms(e.currentTarget.querySelector(`option[value=\"${e.target.value}\"]`).getAttribute('index'))\r\n                    }}>\r\n                        {terms}\r\n                    </select>\r\n                \r\n                    <div className=\"mz-form-item__arrow-down\">\r\n                        <div className=\"mz-svg-wrapper \" style={{ fontSize: '0.75rem' }}>\r\n                            <i className=\"mz-svg mz-svg--grey undefined mz-svg-chevron_small_down\"></i>\r\n                        </div>\r\n                    </div>\r\n\r\n                </div>\r\n            </div>\r\n        )\r\n    }\r\n\r\n    function getAppearanceProtectionList() {\r\n        const plans = Object.entries(summaryCalculator.Packages.appearance_protection[0].plans[appearanceDropDown].packages).map(([key, appearanceProtectionPlansPackage], index) => (\r\n            <div className=\"mz-protection-page__appearance\" key={key}>\r\n                <div className=\"mz-protection-page__appearance-name\">{appearanceProtectionPlansPackage.popular===1 ? <><span className=\"label\">popular</span><br/></> : \"\"}{appearanceProtectionPlansPackage.name}</div>\r\n                <div className=\"mz-protection-page__appearance-price\">\r\n                    <div className=\"text--grey\">+ {formatPrice(appearanceProtectionPlansPackage.financial.msrp)} <span className=\"label\">{\r\n                        `(${showFinancePrice?\r\n                            `${getFinanceWeekly(appearanceProtectionPlansPackage.financial.msrp, financial.calculatedFinance.financeValues[financeTermIndex].aprRate, financial.calculatedFinance.financeValues[financeTermIndex].term)}${t(\"general:week\")}`:\r\n                            `${getLeaseBiWeeklyFromOptions(appearanceProtectionPlansPackage.financial.msrp, financial.calculatedLease.leaseValues[leaseTermIndex].leaseRate, financial.calculatedLease.leaseValues[leaseTermIndex].term)}${t(\"general:bi_week\")}`})`}</span></div>\r\n                    <button className=\"mz-btn mz-btn--primary mz-btn--red\" onClick={()=>handleAppearanceProtectionPlansPackage(index, key)}><span>{t('general','add')}</span></button> \r\n                </div>\r\n            </div>\r\n        ));\r\n\r\n        return (\r\n            <>\r\n                {plans}\r\n            </>\r\n        )\r\n    }\r\n\r\n    function scrollToID(id){\r\n        const target = document.getElementById(id);\r\n        window.gsap.to(window, {duration: 1, scrollTo: {y: target, offsetY: window.mzFunc.offsetMenu + 60, autoKill: true}});\r\n    }\r\n\r\n    return (\r\n        <>\r\n            {\r\n                !summaryCalculator.isDataLoaded() ? getLoading(loading, t) : null\r\n            }\r\n            <div className=\"mz-protection-page mz-top-nav-spacing grid-no-gutter-sm\">\r\n                <Nav nav={nav} />\r\n                <Alert />\r\n\r\n                <h5 className=\"mz-protection-page__title\">{t(\"title\")}</h5>\r\n                <div className=\"mz-protection-page__subtitle\">\r\n                    <a className=\"mz-link\" onClick={()=>{scrollToID('map')}}>{ReactHtmlParser(summaryCalculator.Packages.added_protection[0].title.toLowerCase())}</a> {t(\"and\")} <a  className=\"mz-link nowrap\" onClick={()=>{scrollToID('ap')}}>{ReactHtmlParser(summaryCalculator.Packages.appearance_protection[0].title.toLowerCase())}</a>\r\n                </div>\r\n                <div className=\"mz-full-width mz-protection-page__content\">\r\n                    {summaryCalculator.Packages.added_protection &&\r\n                        <section id=\"map\">\r\n                            <h5>{ReactHtmlParser(summaryCalculator.Packages.added_protection[0].title)}</h5>\r\n\r\n                            <div className=\"mz-protection-page__content-container\">\r\n                                <div className=\"mz-protection-page__content-container__content-left\">\r\n                                    {generateStaticVehicleImg()}\r\n                                    {getAddedProtectionIcons()}\r\n                                </div>\r\n                                <div className=\"mz-protection-page__content-container__content-right\">\r\n                                    {ReactHtmlParser(summaryCalculator.Packages.added_protection[0].description)}\r\n                                </div>\r\n                            </div>\r\n                            { summaryCalculator.SelectedAddedProtectionIndex == null ? \r\n                                setExpand(summaryCalculator.Packages.added_protection[0].accordion_title, addedProtectionSection, 'protection') :\r\n                                <div className=\"mz-container-flex\">\r\n                                    <div className=\"mz-protection-page__selectedBox\">\r\n                                        <div className=\"mz-protection-page__selected-indicator\"><i className=\"mz-svg mz-svg--white mz-svg-checkmark\"></i></div>\r\n                                        <h5>{ReactHtmlParser(summaryCalculator.Packages.added_protection[0].selected_plan_text)}</h5> \r\n                                        {addedProtectionSection}\r\n                                    </div>\r\n                                </div>\r\n                            }\r\n                        </section>}\r\n\r\n                    <section id=\"ap\">\r\n                        <h5>{ReactHtmlParser(summaryCalculator.Packages.appearance_protection[0].title)}</h5>\r\n\r\n                        <div className=\"mz-protection-page__content-container\">\r\n                            <div className=\"mz-protection-page__content-container__content-left\">\r\n                                {generateStaticVehicleImg()}\r\n                                {getAppearanceProtectionIcons()}\r\n                            </div>\r\n                            <div className=\"mz-protection-page__content-container__content-right protection-features-introduction\">\r\n                                {ReactHtmlParser(summaryCalculator.Packages.appearance_protection[0].description)}\r\n                            </div>\r\n                        </div>\r\n                            {appearanceSelection === null ?\r\n                                setExpand(summaryCalculator.Packages.appearance_protection[0].accordion_title , getAppearanceProtectionSection(), 'appearance'):\r\n                                <div className=\"mz-container-flex\">\r\n                                    <div className=\"mz-protection-page__selectedBox\">\r\n                                        <div className=\"mz-protection-page__selected-indicator\"><i className=\"mz-svg mz-svg--white mz-svg-checkmark\"></i></div>\r\n                                            <h5>{ReactHtmlParser(summaryCalculator.Packages.appearance_protection[0].selected_plan_text)}</h5> \r\n                                            {getAppearanceProtectionSection()}\r\n                                    </div>\r\n                                </div>\r\n                            }\r\n\r\n                    </section>\r\n                </div>\r\n                \r\n                <div className=\"mz-legal mz-mobile\">\r\n                    <Button\r\n                        className=\"mz-btn mz-btn--legal text--grey\"\r\n                        label={t(\"general:legal\")}\r\n                        backgroundColor=\"grey\"\r\n                        colour=\"grey\"\r\n                        icon={true}\r\n                        iconAfter={true}\r\n                        svg_className=\"\"\r\n                        svg_list=\"plus\"\r\n                        size={0.6}\r\n                        onClick={() => {\r\n                            document.querySelector('body').classList.add('disabled');\r\n                            setLegalModalOpen(true)\r\n                        }}\r\n                    />\r\n                </div>\r\n\r\n                <Pricing builtLabel={t(\"general:price_as_built\")} builtPrice=\"$\" loanLabel={t(\"general:loan_label\")} loanPrice=\"$\" saveLabel={t(\"general:save_build\")}\r\n                    leaseLabel={t(\"general:show_lease_price\")} financeLabel={t(\"general:show_finance_price\")} buttonLabel={t(\"general:next_payments\")} summaryCalculator={summaryCalculator}\r\n                    HandleNextClick={nextStep} setLegalModalOpen={setLegalModalOpen} HandleShowFinanceClick={handleShowFinanceClick} setPreorderModalOpen={setPreorderModalOpen} />\r\n                <Modal modalContent={legalContent} isOpen={legalModalOpen} handleClose={setLegalModalOpen} modalId='legalModal' />\r\n                <PreOrderModal isOpen={preorderOpen} handleClose={setPreorderModalOpen}></PreOrderModal> \r\n            </div>\r\n        </>\r\n        \r\n    )\r\n}\r\n\r\nexport default Protection","import React, { useEffect } from \"react\";\r\nimport { HashRouter as Router, Routes, Route  } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport './Assets/scss/main.scss';\r\n\r\nimport { getBaseUrl, getUrlParamsObject, getParams, getProvince, setCursorWaiting } from './utils';\r\n\r\nimport BuildHelper from \"./Helpers/BuildHelper\";\r\nimport NavHelper from './Helpers/navhelper';\r\nimport SummaryCalculator from './Helpers/summarycalculator';\r\nimport { openModal } from './Helpers/helpers';\r\n// import { BrowserRouter as Router, Route, Routes } from 'react-router-dom'\r\n\r\nimport { Nav } from './Components/3_Organisms/Nav/Nav';\r\nimport { Modal } from './Components/3_Organisms/Modal/Modal';\r\nimport { AccessoriesList } from './Components/3_Organisms/AccessoriesList/AccessoriesList'\r\nimport { VehiclePage } from './Components/5_Pages/Vehicles/Vehicles';\r\nimport { TrimsPage } from './Components/5_Pages/Trim/Trim';\r\nimport { SummaryPage } from './Components/5_Pages/Summary/Summary';\r\nimport { Options } from './Components/5_Pages/Option/Option';\r\nimport { Colours } from './Components/5_Pages/Colours/Colours';\r\nimport { Wheels } from './Components/5_Pages/Wheels/Wheels';\r\nimport { Connectivity } from './Components/5_Pages/Connectivity/Connectivity';\r\nimport { PaymentsPage } from './Components/5_Pages/Payments/Payments';\r\nimport { Protection } from './Components/5_Pages/Protection/Protection';\r\n\r\nfunction App() {\r\n  const { t, i18n } = useTranslation(['general']);\r\n\r\n  const urlParams = getUrlParamsObject();\r\n  const buildId = urlParams.build;\r\n\r\n  window.summaryCalculator = new SummaryCalculator().reloadStoredData();\r\n\r\n  const savedCarline = JSON.parse(sessionStorage.getItem('SelectedVehicle')) ?.carline;\r\n  const savedCarYear = JSON.parse(sessionStorage.getItem('SelectedVehicle')) ?.year;\r\n\r\n  const getProvinceInUrl = () => {\r\n    const params = getParams(window.location.hash);\r\n    if(params.prov_code) {\r\n      return params.prov_code[0];\r\n    }\r\n\r\n    return undefined\r\n  }\r\n\r\n  /*const getRequestedLanguageInUrl = () => {\r\n    const params = getParams(window.location.hash);\r\n    if(params.lang_code) {\r\n      return params.lang_code[0];\r\n    }\r\n\r\n    return undefined\r\n  }*/\r\n\r\n  const currentProvince = document.querySelector('meta[name=\"data-region\"]').content;\r\n  const requestedProvince = getProvinceInUrl();\r\n\r\n  //const currentLanguage = document.querySelector('meta[name=\"data-language\"]').content;\r\n  //const requestedLanguage = getRequestedLanguageInUrl();\r\n\r\n  // Force a CMS redirect so that it can change province / language behind the scenes\r\n  if (window.location.hash && (requestedProvince !== undefined && requestedProvince !== currentProvince)/* && (requestedLanguage !== undefined && requestedLanguage !== currentLanguage)*/) {\r\n    const newLocation = window.location.origin + window.location.pathname + \"?changeProvince=\" + encodeURIComponent(window.location.origin + window.location.pathname +window.location.hash);\r\n    window.location = newLocation;\r\n  }\r\n\r\n  // Rewrite the url after the redirect\r\n  if (urlParams['changeProvince']) {\r\n    window.summaryCalculator._apiService.province = currentProvince;\r\n    window.summaryCalculator._tcciService.province = currentProvince;    \r\n    window.history.pushState({}, document.title, decodeURIComponent(urlParams['changeProvince']));\r\n  }\r\n\r\n  // Override onchange behavior for the region selector\r\n  document.addEventListener('DOMContentLoaded', () => {\r\n    window.handleSelectChange = async () => {\r\n      const select = document.getElementById('region-selector-dropdown');\r\n\r\n      const newProvince = select.value;\r\n      //console.log(newProvince);\r\n\r\n      window.summaryCalculator._apiService.province = newProvince;\r\n      window.summaryCalculator._tcciService.province = newProvince;\r\n      \r\n      const waitScreen = document.querySelector('div.loading');\r\n      \r\n      setCursorWaiting(true);\r\n      // Display wait screen\r\n      if(waitScreen) {\r\n        waitScreen.classList.add('visible');\r\n      }\r\n\r\n      // DO NOT REMOVE THIS LINE, USED TO RELOAD FOR THE EV REBATE\r\n      await window.summaryCalculator.forceReloadVehicle();\r\n\r\n      setCursorWaiting(false);\r\n      // Hide wait screen\r\n      if(waitScreen) {\r\n        waitScreen.classList.remove('visible');\r\n      }\r\n\r\n      // Set the regEx for prov_code replacement\r\n      const provCodePattern = /prov_code=[^&]*/;\r\n      \r\n      // Replace the prov_code parameter\r\n      let updatedUrl = window.location.href.replace(provCodePattern, `prov_code=${newProvince}`);\r\n\r\n      // Update the url in the address bar before submit\r\n      window.history.pushState({}, document.title, updatedUrl);\r\n      \r\n      const form = document.getElementById('region-selector');\r\n      form.submit();\r\n    };\r\n\r\n    const languageLink = document.querySelector('#region-language-link');\r\n\r\n    window.handleLanguageChange = async (e) => {\r\n      const newLocation = languageLink.href;\r\n\r\n      e.preventDefault();\r\n      e.stopPropagation();\r\n\r\n      const newLanguage = languageLink.text;\r\n\r\n      const waitScreen = document.querySelector('div.loading');\r\n\r\n      // Display the wait screen while loading\r\n      if(waitScreen) {\r\n        waitScreen.classList.add('visible');\r\n      }\r\n      \r\n      window.summaryCalculator._apiService.language = newLanguage;\r\n      window.summaryCalculator._tcciService.language = newLanguage;\r\n\r\n      await window.summaryCalculator.forceReloadVehicle();\r\n  \r\n      // Hide wait screen\r\n      if(waitScreen) {\r\n        waitScreen.classList.remove('visible');\r\n      }\r\n\r\n      window.location = newLocation;\r\n    };\r\n    \r\n    if (languageLink) {\r\n      languageLink.addEventListener('click', window.handleLanguageChange, false);\r\n    }\r\n\r\n  });\r\n\r\n\r\n  useEffect(() => {\r\n    const cssFile = document.createElement(\"link\");\r\n    const scriptFile = document.createElement(\"script\");\r\n    \r\n    \r\n    cssFile.href = window.location.host.indexOf(\"localhost\") === -1 ? getBaseUrl() + process.env.REACT_APP_GLOBALASSETS_CSS : '/forms/main.css';\r\n    cssFile.rel = \"stylesheet\";\r\n    document.head.appendChild(cssFile);\r\n\r\n    scriptFile.src = window.location.host.indexOf(\"localhost\") === -1 ? getBaseUrl() + process.env.REACT_APP_GLOBALASSETS_JS : '/forms/main.js';\r\n    document.body.appendChild(scriptFile);\r\n\r\n  }, [])\r\n\r\n  if (window.location.hash) {\r\n    if (window.location.hash.split('/')[1].substring(0, 1) != '?' && savedCarline) {\r\n      const carYearHash = window.location.hash.split('/')[1];\r\n      const carlineHash = window.location.hash.split('/')[2];\r\n      if (carYearHash != savedCarYear || carlineHash != savedCarline) {\r\n        console.log(carYearHash, carlineHash, savedCarYear, savedCarline);\r\n        window.summaryCalculator.reset(true);\r\n      }\r\n    }\r\n  }\r\n\r\n  return (\r\n    <Router>\r\n      <div className={`App mzBuildandPrice ${window.location.host.indexOf(\"localhost\") === -1 && window.bnp_retailer_mode ? 'retailer' : ''}`}>\r\n        <header className=\"App-header\">\r\n        </header>\r\n        <div className=\"App-container\">\r\n          <Routes>\r\n            <Route exact path=\"/\" element={\r\n              buildId ? (\r\n                <BuildHelper buildId={buildId} />\r\n              ) : (\r\n                  <VehiclePage key=\"vehiclePage\" />\r\n                )} />\r\n            <Route exact path=\"/:year/:carline\" element={<TrimsPage key=\"trimPage\" />} />\r\n            <Route exact path=\"/:year/:carline/:trim\" element={<Options />} />\r\n            <Route exact path=\"/:year/:carline/:trim/:model/:option\" element={<Options />} />\r\n            <Route exact path=\"/:year/:carline/:trim/:model/:packageCode/colours\" element={<Colours />} />\r\n            <Route exact path=\"/:year/:carline/:trim/:model/:packageCode/wheels\" element={<Wheels />} />\r\n            <Route exact path=\"/:year/:carline/:trim/:model/:packageCode/connectivity\" element={<Connectivity />} />\r\n            <Route exact path=\"/:year/:carline/:trim/:model/:packageCode/accessories\" element={<AccessoriesList />} />\r\n            <Route exact path=\"/:year/:carline/:trim/:model/:packageCode/protections\" element={<Protection />} />\r\n            <Route exact path=\"/:year/:carline/:trim/:model/:packageCode/summary\" element={<SummaryPage />} />\r\n            <Route exact path=\"/:year/:carline/:trim/:model/:packageCode/payments\" element={<PaymentsPage />} />\r\n          </Routes>\r\n        </div>\r\n      </div>\r\n    </Router>\r\n  );\r\n}\r\n\r\nexport default App;\r\n","const reportWebVitals = onPerfEntry => {\r\n  if (onPerfEntry && onPerfEntry instanceof Function) {\r\n    import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n      getCLS(onPerfEntry);\r\n      getFID(onPerfEntry);\r\n      getFCP(onPerfEntry);\r\n      getLCP(onPerfEntry);\r\n      getTTFB(onPerfEntry);\r\n    });\r\n  }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","import i18n from \"i18next\";\r\nimport { useTranslation, initReactI18next } from \"react-i18next\";\r\n\r\n//import Backend from 'i18next-http-backend';\r\nimport LanguageDetector from 'i18next-browser-languagedetector';\r\n\r\nimport VEHICLES_EN from './locales/en/vehicles.json';\r\nimport TRIMS_EN from './locales/en/trims.json';\r\nimport OPTIONS_EN from './locales/en/options.json';\r\nimport PACKAGES_EN from './locales/en/packages.json';\r\nimport CONNECTIVITY_EN from './locales/en/connectivity.json';\r\nimport COLOURS_EN from './locales/en/colours.json';\r\nimport WHEELS_EN from './locales/en/wheels.json';\r\nimport ACCESSORIES_EN from './locales/en/accessories.json';\r\nimport PROTECTION_EN from './locales/en/protection.json';\r\nimport PAYMENTS_EN from './locales/en/payments.json';\r\nimport SUMMARY_EN from './locales/en/summary.json';\r\nimport EVGRID_EN from './locales/en/evGrid.json';\r\nimport GENERAL_EN from './locales/en/general.json';\r\n\r\nimport VEHICLES_FR from './locales/fr/vehicles.json';\r\nimport TRIMS_FR from './locales/fr/trims.json';\r\nimport OPTIONS_FR from './locales/fr/options.json';\r\nimport PACKAGES_FR from './locales/fr/packages.json';\r\nimport CONNECTIVITY_FR from './locales/en/connectivity.json';\r\nimport COLOURS_FR from './locales/fr/colours.json';\r\nimport WHEELS_FR from './locales/fr/wheels.json';\r\nimport ACCESSORIES_FR from './locales/fr/accessories.json';\r\nimport PROTECTION_FR from './locales/fr/protection.json';\r\nimport PAYMENTS_FR from './locales/fr/payments.json';\r\nimport SUMMARY_FR from './locales/fr/summary.json';\r\nimport EVGRID_FR from './locales/fr/evGrid.json';\r\nimport GENERAL_FR from './locales/fr/general.json';\r\n\r\nconst languages = ['en', 'fr'];\r\nconst resources = {\r\n          en: {\r\n            general: GENERAL_EN,\r\n            vehicles: VEHICLES_EN,\r\n            trims: TRIMS_EN,\r\n            options: OPTIONS_EN,\r\n            connectivity: CONNECTIVITY_EN,\r\n            packages: PACKAGES_EN,\r\n            colours: COLOURS_EN,\r\n            wheels: WHEELS_EN,\r\n            accessories: ACCESSORIES_EN,\r\n            protection: PROTECTION_EN,\r\n            payments: PAYMENTS_EN,\r\n            summary: SUMMARY_EN,\r\n\t\t\tevGrid: EVGRID_EN\r\n          },\r\n          fr: {\r\n            general: GENERAL_FR,\r\n            vehicles: VEHICLES_FR,\r\n            trims: TRIMS_FR,\r\n            options: OPTIONS_FR,\r\n            packages: PACKAGES_FR,\r\n            connectivity: CONNECTIVITY_FR,\r\n            colours: COLOURS_FR,\r\n            wheels: WHEELS_FR,\r\n            accessories: ACCESSORIES_FR,\r\n            protection: PROTECTION_FR,\r\n            payments: PAYMENTS_FR,\r\n            summary: SUMMARY_FR,\r\n\t\t\tevGrid: EVGRID_FR\r\n          }\r\n        }\r\nconsole.log(resources);\r\n\r\n\r\ni18n\r\n  //.use(Backend)\r\n  .use(LanguageDetector)\r\n  .use(initReactI18next)\r\n  .init({\r\n    resources: resources,\r\n    lng: document.querySelector('meta[name=\"data-language\"]').content, //\"en\",\r\n    fallbackLng: \"en\",\r\n    debug: true,\r\n    whitelist: languages,\r\n    transKeepBasicHtmlNodesFor: ['br', 'strong', 'i', 'span', 'a'],\r\n    interpolation: {\r\n      escapeValue: false\r\n    }\r\n  });\r\n\r\nexport default i18n;\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport App from './App';\r\nimport reportWebVitals from './reportWebVitals';\r\nimport './i18n';\r\n\r\nReactDOM.render(\r\n  <React.StrictMode>\r\n    <App />\r\n  </React.StrictMode>,\r\n  document.getElementById('root')\r\n);\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals();\r\n"],"sourceRoot":""}