/* eslint-disable spaced-comment */
/* eslint-disable new-cap */
/* eslint-disable block-scoped-var */
var rollick = rollick || {};

rollick = {
    version: "V2",
    autorun: rollick.autorun || ("true" == "true"),
    dealer: {
        id: "ac26d9ce15ab282c",
        pan: "01066",
        logo: "https://content.rollick.io/l/ac26d9ce15ab282c/s",
        name: "Henderson Harley-Davidson",
        parent: "",
        targetedStates: "",
        isBFHOn: ("" == "true"),
        aaaActive: ("" == "true"),
        prequalEnabled: ("true" == "true"),
        synchronyEnabled: ("" == "true"),
        appointmentEnabled: ("" == "true"),
        textUsEnabled: ("" == "true"),
        nationalGeneralEnabled: ("" == "true"),
        singleLocationDealer: ("true" == "true"),
        locations: [{"id":"ac26d9ce15ab282c","name":"Henderson Harley-Davidson","bc":[{"segmentId":1,"categoryId":1,"brandId":8,"cnew":true,"cused":true},{"segmentId":1,"categoryId":1,"brandId":14,"cnew":false,"cused":true}],"country":"US"}],
        tradeInPct: parseInt("40") || 40,
        modules: ["request-a-quote","reserve-now","payment","offers","trade-in","appointment"],
        tradeInModule: "NADAGuides",
        CTAs: ["offers","reserve-now"],
        CTATexts: ["Special Offers","Reserve Now"],
        template: "",
        rollickCTA: true,
        subscriptionType: "1",
        isOEMDealer: ("" == "true"),
        processConfig: {"Base":{"CANAM":{"Condition":"New","processCode":[100,101,200]},"SKIDOO":{"Condition":"New","processCode":[101,200]},"SEADOO":{"Condition":"New","processCode":[101,200]},"WINNEBAGO":{"Condition":"New","processCode":[101,200]},"WINNEBAGOINDUSTRIESTOWABLES":{"Condition":"New","processCode":[101,200]},"EZGO":{"Condition":"New","processCode":[101,200]}}},
        lenderIds: "",
        expressBuyHelperHeader: "",
        nextStepHelperHeader: "",
        preview: "",
        sponserdbrand: "",
        paymentProfiles: [],
        paymentEnabled: ("" == "true"),
        preApprovalOn: ("" == "true"),
        simpleDealerUrl: "",
        preApprovalButtonText: "",
        email: "HendersonHarley-Davidson@rollickoutdoor.com",
        incentiveEnabledOnAffinity: "",
        financePreApprovals: [],
        excludeDealerLocation: "Lake Oconee,Lucedale,Miramar Beach",
        country: "US",
        financePrequal: [],
        prequal700credit: ("" == 'true'),
        prequalAqua: "" == "true",
        prequalAquaDealerNo: "",
        eligibleBrandsForAquaPrequal: ["winnebago","ezgo"],
        prequalYamaha: ("" == "true"),
        prequalYamahaUrl: "",
        tradInPricePercent: "10",
        experiments: "",
        badgingEnabled: ("" == "true"),
        badgingPlacements: null,
        awards: null,
        tier3Enabled: ("" == "true"),
        usbProgramEnabled: ("" == "true"),
        tier3Brands: [],
        tier3EnabledLocations: [],
        tier3BrandsForEachLocation: {},
        badgingStatusOnPages: null,
        childPartners: [],
        status: "1",
        isUssaCTAEnabled: ("" == "true"),
        restrictIncentiveforDealers: {"11370":["WIN20240900001"]},
        addDropdownonDRPAN:["20122","08104"],
        restrictDRNonWinnPAN:["11370"]
    },
    user: {
        uid: "",
        fn: "",
        ln: "",
        p: "",
        e: "",
        z: "",
        an: "",
        ac: "",
        rid: "",
        isFromS4: "" == "true",
        s4Affinity: "",
        aaa: "",
        usaa: "",
        ttp: "",
        textMe: false,
        verified: false,
        tradeIn: {},
    },
    aimbase: "https://ws.aimbase.com/Scripts/awa.js",
    script: "https://widget.rollick.io/widgets/dr/scripts/dealer.js",
    scripts: {},
    endpoints: {
        content: "https://content.rollick.io",
        gorollick: "https://gorollick.com",
        integration: "https://rmc.rollick.io/integrations",
        inventory: "https://gorollick.com/api",
        validation: "https://validate.rollick.io",
        widget: "https://widget.rollick.io",
        queue: "https://queue.rollick.io",
        inventoryAPI: "https://gorollick.com/api",
        healthstateAPI: "https://healthstats.rollick.io/api/record/add",
    },
    settings: {
        useRMCInventory: true,
        showCTA: { new: true, used: true },
        gaEnabled: "true" == "true",
        gaId: "282506840",
        gaProperty: "gorollick.com",
        gaLabel: "Digital Retailing",
        harleyBrand: "harleydavidson",
        paymentCalculator: true,
        cta: {"request-a-quote":{"text":"Start My Deal","fontColor":"#FFFFFF","fontSize":"","bgColor":"#339900","enabled":false},"offers":{"text":"Special Offers","fontColor":"#FFFFFF","fontSize":"","bgColor":"#339900","enabled":true},"payment":{"text":"Calculate","fontColor":"#FFFFFF","fontSize":"","bgColor":"#339900","enabled":false},"trade-in":{"text":"Estimate Trade-in","fontColor":"#FFFFFF","fontSize":"","bgColor":"#339900","enabled":false},"pre-qualify":{"text":"Prequalify","fontColor":"#FFFFFF","fontSize":"","bgColor":"#3697D3","enabled":false},"appointment":{"text":"Schedule an Appointment","fontColor":"#FFFFFF","fontSize":"","bgColor":"#339900","enabled":false},"reserve-now":{"text":"Reserve Now","fontColor":"#FFFFFF","fontSize":"","bgColor":"#339900","enabled":true,"hasSubtext":false,"deposit":500,"disclaimer":"Reservations require an initial ${deposit} credit card payment. The dealership will contact you about your payment details. Reservations are not final until the payment is received.","configurations":[]},"text-us":{"text":"Text Us","fontColor":"#FFFFFF","fontSize":"","bgColor":"#339900","enabled":false},"finance":{"text":"Prequalify","fontColor":"#FFFFFF","fontSize":"","bgColor":"#339900","enabled":false}},
        ctaDefaults: {
            bgColor: "#3697D3",
            fontColor: "white",
            fontSize: "16px",
        },
        inventoryFile: "https://rmc.rollick.io/api/dealer-inventory/ac26d9ce15ab282c?lean=1",
        excludeCategories: ["spreaderimplements","turfequipment","electricbicycles","dumpers","blades","aerators","skid steers","powerequipment","pump","dump","bicycleebikes","auto","car","snowblower","industrialgenerators","recreationalgenerator","generators","portable","general","commercial","water","tractor","lawnmower","tillage","rake","cutter","scraper","airfx","electric bicycle","other","snow blower","bicycle","outboard motors","residential generators","electric bike","truck","lawn garden and farm","generator","go-kart","cargo trailer","tractors","trailers","lawn mowers - riding","go-karts","tillers","spreaders","pressure washers","seeder implements","backhoe attachments","snowblowers","outboard","four stroke","lawngarden","electric bicycle","cars","skateboard"],
        excludeMake: ["bad boy","dixie chopper","other","aluma","bobcat®","hillsboro","husqvarna® power","stacyc","bobcat","mowers","bob-cat","big cat bikes®","cub cadet®","nucanoe","old town canoes and kayaks","ocean kayak","freightliner","stinger equipment","cub cadet"],
        layout: "vertical-tabs-v2",
        isModuleSupportedTemplatesEnabled: "true" == "true",
        award: {
            enabled: "true" == "true",
            script: "https://cdn.rollick.io/awards/RollickDealerAwards.js",
            api: "https://awards.rollick.io",
            key: "79c7d774b9d323aba2ab92763d690fbc",
        },
        badgingDefault: null,
        usaaCtaSettingInPartnerRecord: {
            usaaCTAEnabledPages: [],
            usaaCTAEnabledDevices: {"isMobile":true,"isDesktop":true},
        },
        usaaHideFullCta: "true",
        usaaRotationMinCTASettings: {"isEnabledUsaaRotateMinCTA":true,"duration":"4s","slideInDelay":"0s","slideOutDelay":"2s"},
        aquaPollingTimerSettings: {"intervalMs":5000,"maxAttempts":12,"timeoutMs":60000},
        ga4Enabled: "" == "true",
        ga4Id: "",
    },
    page: {
    },
    session: {
        aimbase: {},
        piwikId: ""
    },
    vehicle: {
    },
    noCTA: rollick.noCTA || false,
    templateIdentifierJson: [{"SearchArray":["cdnmedia.endeavorsuite.com","arinet.com","arinetapi.com","endeavorsuite.com"],"TemplateName":"ARI"},{"SearchArray":["Powered by DX1"],"TemplateName":"DX1"},{"SearchArray":["interactrv.com","interactrv.net","interactcp.com"],"TemplateName":"IRV"},{"SearchArray":["level5advertising.com","level5-form"],"TemplateName":"L5"},{"SearchArray":["Firestorm Websites"],"TemplateName":"Firestorm"},{"SearchArray":["Room 58","room58.com"],"TemplateName":"Room58"},{"SearchArray":["harleydavidsonofcharlotte.com"],"TemplateName":"hdoc"},{"SearchArray":["camperland.net"],"TemplateName":"camper"},{"SearchArray":["mdsbrand.com"],"TemplateName":"mds"},{"SearchArray":["pixelmotion.com"],"TemplateName":"pixelmotion"},{"SearchArray":["whitefishmarine.com"],"TemplateName":"marcoregroup"},{"SearchArray":["Dealer Spike","dealerspike.com"],"TemplateName":"DS"},{"SearchArray":["AutoManager"],"TemplateName":"AutoManager"},{"SearchArray":["netsourcemedia.com","cycles128.com"],"TemplateName":"netsource"},{"SearchArray":["staging.psxdigital.com","PSXDigital","psxdigital.com","psxascend.ai"],"TemplateName":"PSX"},{"SearchArray":["DealerFire","dealersocket.com"],"TemplateName":"DealerFire"},{"SearchArray":["rvconnections.com"],"TemplateName":"ridemarketing"},{"SearchArray":["Fay's Marina"],"TemplateName":"faysmarina"},{"SearchArray":["frankelinteractive.com"],"TemplateName":"frankelinteractive"},{"SearchArray":["dealerinspire.com","www.dealerinspire.com"],"TemplateName":"DI"},{"SearchArray":["fullondigital.com"],"TemplateName":"fullondigital"},{"SearchArray":["travelcamp.com","travelcampcom"],"TemplateName":"travelcamp"},{"SearchArray":["virtualdealer360.com"],"TemplateName":"virtual360"},{"SearchArray":["boatsgroup.com"],"TemplateName":"boatsgroup"},{"SearchArray":["autorevo.com"],"TemplateName":"Autorevo"},{"SearchArray":["operatebeyond.com"],"TemplateName":"operatebeyond"},{"SearchArray":["noleeo.com"],"TemplateName":"noleeo"},{"SearchArray":["www.grrcycles.com","grrcycles.com","www.unitypws.com"],"TemplateName":"grrcycles"},{"SearchArray":["fuelm.com","mtdoraboats.com","coloradoboatcenter.com"],"TemplateName":"fuelmedia"},{"SearchArray":["trailercentral.com","dealereprocess.com"],"TemplateName":"dealereprocess"},{"SearchArray":["ridedigital.com"],"TemplateName":"ridedigital"},{"SearchArray":["dealersync.com"],"TemplateName":"dealersync"},{"SearchArray":["viersgolfcars.com","www.viersgolfcars.com"],"TemplateName":"customviersgolfcars"},{"SearchArray":["forewheelergolfcars.com","golfcarsofhouston.com","milehighgolfcars.com"],"TemplateName":"revenuematter"},{"SearchArray":["nativerank.com"],"TemplateName":"NativeRank"},{"SearchArray":["revver.com"],"TemplateName":"Revver"},{"SearchArray":["dealers.golfcartresource.com"],"TemplateName":"golfcartresource"},{"SearchArray":["dealershiptoolkit.com"],"TemplateName":"dealershiptoolkit"},{"SearchArray":["poulsborv.com"],"TemplateName":"custompoulsborv"},{"SearchArray":["goldgorillamedia.com"],"TemplateName":"goldgorillamedia"},{"SearchArray":["shelteredcovemarina.com"],"TemplateName":"blackbearmedia"},{"SearchArray":["buzzsmarine.com"],"TemplateName":"intellicominc"},{"SearchArray":["turnkeywebsolutions.com"],"TemplateName":"turnkeywebsolutions"},{"SearchArray":["wintersrec.com"],"TemplateName":"thewhitgroup"},{"SearchArray":["pohlenv.com"],"TemplateName":"pohle"},{"SearchArray":["bolandrvs.com"],"TemplateName":"inventure"},{"SearchArray":["rvwebservices.com","traderinteractive.com","boerv.com"],"TemplateName":"RVWEBSERVICES"},{"SearchArray":["www.ymarinaboats.com"],"TemplateName":"customymarina"},{"SearchArray":["www.coasttechnology.com","coasttechnology.com"],"TemplateName":"StealthAI"},{"SearchArray":["www.smithvillerv.com","www.focusrv.com"],"TemplateName":"focusrv"},{"SearchArray":["www.machinio.com"],"TemplateName":"machinio"}],
    supportedTemplates: [
        'ds', 'dx1', 'ari', 'travelcamp', 'psx',
        'irv', 'firestorm', 'pixelmotion', 'operatebeyond', 'faysmarina',
        'room58', 'l5', 'frankelinteractive', 'dealerfire', 'pst',
        'autorevo', 'di', 'ridemarketing', 'noleeo', 'grrcycles',
        'virtual360', 'fuelmedia', 'dealereprocess', 'ridedigital', 'dealersync',
        'customviersgolfcars', 'revenuematter', 'leadsonline', 'netsource', 'nativerank',
        'revver', 'boatsgroup', 'golfcartresource', 'mds', 'dealershiptoolkit', "custompoulsborv",
        'goldgorillamedia', "blackbearmedia", "intellicominc", "marcoregroup"
    ],
    supportedModulesTemplates: [
        'ds', 'irv', 'dx1', 'ari', 'turnkeywebsolutions', 'thewhitgroup', 'firestorm', 'fuelmedia', 'room58', 'pixelmotion', 'mds', 'nativerank', 'virtual360',
        'ridedigital', 'revver', 'di', 'autorevo', 'dealerdotcom', 'pohle', "inventure", 'automanager', 'rvwebservices','customymarina','focusrv','machinio','stealthai'
    ],
   
    verifyJqueryStatus() {
        try {
            return jQuery && jQuery().jquery && jQuery.ajax && jQuery.getJSON;
        } catch (ex) {
            return false;
        }
    },
    init() {
        var self = this;
        try {
            // checking if the jQuery is slim version and checking if AJAX and getJSON methods are available or not
            if (rollick.verifyJqueryStatus()) {
                self.jq = jQuery;
            } else {
                rollick.initializeJquery();
                window.setTimeout(rollick.init, 1000);
                return;
            }
        } catch (e) {
            console.log(e);
            if (rollick.verifyJqueryStatus()) {
                self.jq = jQuery;
            } else {
                rollick.initializeJquery();
                window.setTimeout(rollick.init, 1000);
                return;
            }
        }
        if (sessionStorage['rollick.session']) {
            try {
                self.session = JSON.parse(sessionStorage['rollick.session']);
            } catch (e) {
                self.session = {}
            }
        }
        if (sessionStorage['rollick.vehicle']) {
            try {
                self.vehicle = JSON.parse(sessionStorage['rollick.vehicle']);
            } catch (e) {
                self.vehicle = {}
            }
        }

        rollick.session.href = window.location.href;
        if (self && self.jq) {
            rollick.session.website = self.jq(location).attr('origin').toLowerCase().replace(`${self.jq(location).attr('protocol').toLowerCase()}//`, '');
        } else {
            rollick.session.website = self.location.origin.toLowerCase().replace(`${self.location.protocol.toLowerCase()}//`, '');
        }
        rollick.getTemplateName();
        // eslint-disable-next-line eqeqeq
        if (rollick.dealer && rollick.dealer.status && rollick.dealer.status == 1) {
            rollick.loadAimbaseScript();
        }
        rollick.dealerScriptLoaded();
        rollick.TrackHealthEvent('Widget script loaded');
        if (rollick.autorun) {
            if (rollick.settings.gaEnabled) {
                rollick.loadGAScript();
            }
            if (rollick.settings.ga4Enabled) {
                rollick.loadGA4Script();
            }
            // eslint-disable-next-line no-undef, eqeqeq
            if (location.pathname == '/' && !((typeof showCtaOnHomePage == 'function') && showCtaOnHomePage())) rollick.noCTA = true;
            // if (rollick.dealer.badgingEnabled && rollick.settings.award && rollick.settings.award.enabled && rollick.dealer.awards) rollick.noCTA = true;
            if (document.body.hasAttribute('rollick-CTA')) {
                // eslint-disable-next-line eqeqeq
                if (self.jq('body').attr('rollick-CTA').toLowerCase() == 'false') rollick.noCTA = true;
            }
            if (!rollick.noCTA) rollick.loadTemplateScript();
            else rollick.loadDealerScript();
        } else {
            rollick.dealer.rollickCTA = false;
            if (rollick.dealer.badgingEnabled && rollick.settings.award && rollick.settings.award.enabled) {
                rollick.loadTemplateScript();
            }
        }
    },
    loadAimbaseScript() {
        var self = this;
        if (self.aimbase && !self.scripts[self.aimbase]) {
            self.scripts[self.aimbase] = 'loading';
            var script = document.createElement('script');
            script.onload = function () {
                self.scripts[self.aimbase] = 'loaded';

                let userUid = '', sessionUid = '', source = '', campaign = '', event = '';

                if (typeof Aimbase != "undefined" && Aimbase.Analytics && Aimbase.Analytics.GetUserUid) {
                    userUid = Aimbase.Analytics.GetUserUid();
                    sessionUid = Aimbase.Analytics.GetSessionUid();
                    source = Aimbase.Analytics.GetFieldValue('source') || '';
                    campaign = Aimbase.Analytics.GetFieldValue('campaign') || '';
                    event = Aimbase.Analytics.GetFieldValue('event') || '';
                }
                self.session.aimbase = {
                    userUid: userUid,
                    sessionUid: sessionUid,
                    source: source,
                    campaign: campaign,
                    event: event,
                }
                if (document.body.hasAttribute('rollick-pageType')) {
                    var pageType = document.body.getAttribute('rollick-pageType');
                    Aimbase.Capture && Aimbase.Capture.SendPageCategory && Aimbase.Capture.SendPageCategory(pageType);
                }
                self.restoreSession();
                // self.dealerScriptLoaded();
            };
            script.setAttribute('type', 'text/javascript');
            script.setAttribute('src', self.aimbase);
            script.setAttribute('id', 'AimbaseAnalytics');
            script.setAttribute('data-clientId', 'ROL');
            script.setAttribute('data-dealer', self.dealer.id);
            script.setAttribute('data-mfg', 'ROL');
            document.body.appendChild(script);
        }
    },
    loadGAScript() {
        if (typeof ga === 'undefined') {
            // eslint-disable-next-line func-names
            (function (i, s, o, g, r, a, m) {
                // eslint-disable-next-line no-unused-expressions, no-param-reassign, func-names
                i.GoogleAnalyticsObject = r; i[r] = i[r] || function () {
                    // eslint-disable-next-line no-param-reassign
                    (i[r].q = i[r].q || []).push(arguments);
                // eslint-disable-next-line no-unused-expressions, no-param-reassign, no-sequences
                }, i[r].l = 1 * new Date(); a = s.createElement(o),
                    // eslint-disable-next-line prefer-destructuring, no-param-reassign
                    m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a, m);
            }(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga'));
        }
        if (rollick.settings.gaId && rollick.settings.gaProperty) {
            // eslint-disable-next-line no-undef
            ga('create', rollick.settings.gaId, 'auto', { 'name': 'rol', 'allowLinker': true });
            // eslint-disable-next-line no-undef
            ga('rol.require', 'linker');
            // eslint-disable-next-line no-undef
            ga('rol.linker:autoLink', [rollick.settings.gaProperty]);
        }
    },
    loadGA4Script() {
        window.dataLayer = window.dataLayer || [];
        // eslint-disable-next-line no-undef
        function gtag() { dataLayer.push(arguments); }

        // Initialize only for G-PTYFQJJX1X
        gtag('js', new Date());
        gtag('config', rollick.settings.ga4Id, { 'send_page_view': true });
    },
    loadTemplateScript() {
        var self = this;
        let templateSupported = false;
        let templateScriptSettings = rollick.getTemplateSettings();
        if (templateScriptSettings.templatePath) {
            templateSupported = true;
            self.scripts[self.dealer.template] = 'loading';
            // eslint-disable-next-line vars-on-top
            var script = document.createElement('script');
            // eslint-disable-next-line func-names
            script.onload = function () {
                self.scripts[self.dealer.template] = 'loaded';
                if (typeof rollick.DMS == 'object' && typeof rollick.DMS.loadDealerInventory === 'function') rollick.DMS.loadDealerInventory();
                self.loadDealerScript();
            };

            if (templateScriptSettings?.supportsModule) {
                script.setAttribute('type', 'module');
            } else {
                script.setAttribute('type', 'text/javascript');
            }
            script.setAttribute('src', templateScriptSettings?.templatePath);
            script.setAttribute('id', 'RollickTemplateScript');
            document.body.appendChild(script);
        }
        if (rollick.dealer.template == "DX1") {
            // eslint-disable-next-line vars-on-top
            var timerId2;
            // eslint-disable-next-line vars-on-top
            var oldXHR;
            // eslint-disable-next-line block-scoped-var
            oldXHR = window.XMLHttpRequest;
            // eslint-disable-next-line no-inner-declarations
            function newXHR() {
                // eslint-disable-next-line new-cap, block-scoped-var
                var realXHR = new oldXHR();
                // eslint-disable-next-line func-names
                realXHR.addEventListener('readystatechange', function () {
                    if (realXHR.responseURL) {
                        // eslint-disable-next-line eqeqeq
                        if ((realXHR.responseURL.toLowerCase().indexOf('indexes/*/queries?x') != -1) || (realXHR.responseURL.toLowerCase().indexOf('indexes/*/queries') != -1) || (realXHR.responseURL.toLowerCase().indexOf('DesktopModules/Dominion') != -1)) {
                            // eslint-disable-next-line eqeqeq
                            if (realXHR.readyState == 4 && realXHR.status == 200) {
                                // eslint-disable-next-line block-scoped-var
                                timerId2 = window.setTimeout(rollick.dealerScriptLoaded, 200); // run your code here
                            } else {
                                window.setTimeout(rollick.dealerScriptLoaded);
                            }
                        }
                    }
                }, false);
                // eslint-disable-next-line block-scoped-var
                clearTimeout(timerId2);
                return realXHR;
            }
            window.XMLHttpRequest = newXHR;
        }
        // eslint-disable-next-line eqeqeq
        if (rollick.dealer.template == 'fuelmedia') {
            // eslint-disable-next-line vars-on-top, no-redeclare
            var timerId2;
            // eslint-disable-next-line vars-on-top, no-redeclare, block-scoped-var
            var oldXHR = window.XMLHttpRequest;
            // eslint-disable-next-line no-inner-declarations
            function newXHR() {
                var realXHR = new oldXHR();
                // eslint-disable-next-line func-names
                realXHR.addEventListener('readystatechange', function () {
                    if (realXHR.responseURL) {
                        // eslint-disable-next-line eqeqeq
                        if ((realXHR.responseURL.toLowerCase().indexOf('boats/?_condition') != -1) || (realXHR.responseURL.toLowerCase().indexOf('indexes/*/queries') != -1) || (realXHR.responseURL.toLowerCase().indexOf('DesktopModules/Dominion') != -1)) {
                            // eslint-disable-next-line eqeqeq
                            if (realXHR.readyState == 4 && realXHR.status == 200) {
                                timerId2 = window.setTimeout(rollick.dealerScriptLoaded, 1000); //run your code here
                            } else {
                                window.setTimeout(rollick.dealerScriptLoaded);
                            }
                        }
                    }
                }, false);
                clearTimeout(timerId2);
                return realXHR;
            }
            window.XMLHttpRequest = newXHR;
        }
        if (!templateSupported && rollick.dealer.badgingEnabled && rollick.settings.award && rollick.settings.award.enabled) {
            rollick.loadDealerScript();
        }
        //  else if (rollick.dealer.template.toLowerCase() == "firestorm") {
        //         var timerId2;
        //         var oldXHR = window.XMLHttpRequest;
        //         function newXHR() {
        //             var realXHR = new oldXHR();
        //             realXHR.addEventListener("readystatechange", function () {
        //                 var resp = realXHR.responseURL || realXHR.response;
        //                 if (resp) {
        //                     if ((resp.toLowerCase().indexOf("/vehicle/getvehiclelistviewmodels") != -1) || ((resp.toLowerCase().indexOf("/vehicle/refreshfilters") != -1)) || ((resp.toLowerCase().indexOf("vehiclefiltersform") != -1))) {
        //                         if (realXHR.readyState == 4 && realXHR.status == 200) {
        //                             timerId2 = window.setTimeout(rollick.dealerScriptLoaded(), 200);
        //                         }
        //                     }
        //                 }
        //             }, false);
        //             clearTimeout(timerId2);
        //             return realXHR;
        //         }
        //         window.XMLHttpRequest = newXHR;
        //     }
    },
    getTemplateSettings() {
        var self = this;
        let templateScriptSettings = {
            templatePath: '',
            supportsModule: false
        };
        let template = self.dealer?.template?.toLowerCase();
        if (template && !self.scripts[template]) {
            if (rollick?.settings?.isModuleSupportedTemplatesEnabled && rollick.isModuleSupportedTemplate(template)) {
                let templatePath = self.endpoints.widget + '/widgets/dr/scripts/DMSTemplates/' + self.dealer.template.toLowerCase() + '.js';
                templateScriptSettings.templatePath = templatePath;
                templateScriptSettings.supportsModule = true;
            } else if (rollick.isSupportedTemplate(template)) {
                let templatePath = self.endpoints.widget + '/widgets/dr/scripts/dms/' + self.dealer.template.toLowerCase() + '.js';
                templateScriptSettings.templatePath = templatePath;
            }
        }
        return templateScriptSettings;
    },

    isModuleSupportedTemplate(template) {
        var self = this;
        return self.supportedModulesTemplates.indexOf(template) != -1;
    },

    isSupportedTemplate(template) {
        var self = this;
        return self.supportedTemplates.indexOf(template) != -1;
    },

    loadDealerScript() {
        var self = this;
        if (self.script && !self.scripts[self.script]) {
            self.scripts[self.script] = 'loading';
            var script = document.createElement('script');
            script.onload = function () {
                self.scripts[self.script] = 'loaded';
                if (rollick.dealer.badgingEnabled && rollick.settings.award && rollick.settings.award.enabled) {
                    let dealerBadgingSupport = false;
                    if (rollick.DMS && rollick.DMS.drawAwards && typeof rollick.DMS.drawAwards == 'function') dealerBadgingSupport = true;
                    if (!dealerBadgingSupport && typeof rollick.library.DrawAwards == 'function') rollick.library.DrawAwards();
                    rollick.loadAwardScript();
                }
                if (rollick.dealer.isUssaCTAEnabled) {
                    if (rollick?.library?.homepageCtas?.usaa?.placeCtas) rollick.library.homepageCtas.usaa.placeCtas()
                }
            };
            script.setAttribute('type', 'text/javascript');
            script.setAttribute('src', self.script);
            script.setAttribute('id', 'RollickDealerScript');
            script.setAttribute('data-partner', self.dealer.pan);
            script.setAttribute('data-dealer', self.dealer.id);
            document.body.appendChild(script);
        }
    },
    restoreSession() {
        var self = this;
        var hasSessionData = false;
        if (sessionStorage['rollick.user']) {
            self.user = JSON.parse(sessionStorage['rollick.user']);
            if (self.user.uid && self.user.e) self.session.loggedIn = true;
            hasSessionData = true;
        }
        if (sessionStorage['rollick.leads']) {
            self.leads = JSON.parse(sessionStorage['rollick.leads']);
            hasSessionData = true;
        }
        if (!hasSessionData) {
            self.resumeSession();
        }
    },
    saveSession(persist) {
        var self = this;
        sessionStorage['rollick.user'] = JSON.stringify(self.user);
        sessionStorage['rollick.leads'] = JSON.stringify(self.leads);
        var userData = {
            user: self.user,
            leads: self.leads,
        };
        if (persist && self.user.e && self.user.uid) {
            self.setCookie('Aimbase.Analytics.Email', self.user.e, 90);
            var options = {
                type: 'POST',
                contentType: 'application/json; charset=utf-8',
                data: JSON.stringify(userData),
                dataType: 'json',
                url: self.endpoints.widget + '/user-session/' + location.hostname + '/' + self.user.e + '/' + self.user.uid,
                traditional: false
            };
            self.jq.ajax(options);
        }
    },
    openForm(formParameters, vehicleParameters) {
        var self = this;
        if (self.library) {
            self.library.OpenForm(formParameters, vehicleParameters);
        }
        return false;
    },

    logMessage(...params) {
        if (window.console) {
            if (params != null && params.length == 1 && typeof params == 'object') {
                console.log('[' + (new Date()).toLocaleString() + '] ', params[0]);
            } else {
                console.log('[' + (new Date()).toLocaleString() + '] ' + params.join(', '));
            }
        }
    },

    matchTemplate(templateIdentifiers) {
        var self = this;
        var htmlContent = document.head.innerHTML + document.body.innerHTML;
        var template = '';
        if (typeof jQuery != 'undefined' && rollick.verifyJqueryStatus()) {
            self.jq = jQuery;
        } else {
            rollick.initializeJquery();
        }
        if (self.jq) {
            if (!self.jq.isArray(templateIdentifiers))
                templateIdentifiers = [templateIdentifiers];
            self.jq.each(templateIdentifiers, function (index, templateIdentifier) {
                self.jq.each(templateIdentifier.SearchArray, function (index, value) {
                    if (htmlContent.indexOf(value) != -1) {
                        template = templateIdentifier.TemplateName;
                        return false;
                    }
                });

                if (template != '') return false;
            });
        }
        return template;
    },

    getTemplateName() {
        var self = this;
        if (!rollick.dealer.template) rollick.dealer.template = rollick.matchTemplate(rollick.templateIdentifierJson);
        return rollick.dealer.template;
    },

    setCookie(name, value, days) {
        var expires;
        var secure;
        if (days) {
            var date = new Date();
            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
            expires = '; expires=' + date.toGMTString();
        } else {
            expires = '';
        }
        if (location.protocol == 'https:') {
            secure = '; secure';
        } else {
            secure = '';
        }
        document.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value) + expires + '; path=/' + secure;
    },

    getCookie(name) {
        var nameEQ = encodeURIComponent(name) + '=';
        var ca = document.cookie.split(';');
        for (var i = 0; i < ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0) === ' ')
                c = c.substring(1, c.length);
            if (c.indexOf(nameEQ) === 0)
                return decodeURIComponent(c.substring(nameEQ.length, c.length));
        }
        return null;
    },

    eraseCookie(name) {
        this.setCookie(name, '', -1);
    },

    resumeSession() {
        var self = this;
        if (Aimbase && Aimbase.Analytics) {
            try {
                var host = location.hostname;
                var email = self.getCookie('Aimbase.Analytics.Email');
                var webUserId = Aimbase.Analytics.GetUserUid();
                if (host && email && webUserId) {
                    self.jq.get(self.endpoints.widget + '/user-session/' + host + '/' + email + '/' + webUserId, function (data) {
                        if (data) {
                            self.user = data.user || {};
                            self.leads = data.leads || {};
                            if (rollick.library) rollick.library.RenderButtons();
                            if (self.user.e) {
                                if (self.user.uid) self.session.loggedIn = true;
                                self.setCookie('Aimbase.Analytics.Email', self.user.e, 90);
                            }
                            self.saveSession(false);
                        }
                    });
                }
            } catch (err) {
                console.error(err);
            }
        }
    },

    sendCode(email, vehicle) {
        var self = this;
        if (Aimbase && Aimbase.Analytics) {
            try {
                var host = location.hostname;
                if (host && email) {
                    var qs = '?dealerId=' + self.dealer.id;
                    if (vehicle) qs += '&vehicle=' + encodeURIComponent(vehicle.year + ' ' + vehicle.make + ' ' + vehicle.model);
                    self.jq.get(self.endpoints.widget + '/user-session-generate-code/' + host + '/' + email + qs, function (data) {
                        if (data) {
                            rollick.library.TrackEvent('session', 'generate code');
                        }
                    });
                }
            } catch (err) {
                console.error(err);
            }
        }
    },

    resumeSessionCode(code, postScript) {
        var self = this;
        if (Aimbase && Aimbase.Analytics) {
            try {
                var host = location.hostname;
                if (host && code) {
                    self.jq.get(self.endpoints.widget + '/user-session-resume/' + host + '/' + code, function (data) {
                        if (data) {
                            self.user = data.user || {};
                            self.leads = data.leads || {};
                            if (self.library) {
                                self.library.jobsLoop = -1;
                                if (self.library.IsEmployeeVerificationFlow()) {
                                    self.library.EmployeeVerificationSuccess();
                                }
                                else self.library.HideForm();
                                if (self.library.RenderButtons) self.library.RenderButtons();
                                self.library.StartTimer();
                            }
                            if (self.user.e) {
                                self.setCookie('Aimbase.Analytics.Email', self.user.e, 90);
                            }
                            if (self.user.uid) {
                                // Aimbase.Analytics.SetUserUid(self.user.uid);
                            }
                            if (self.user.affinityId) {
                                if (self.providers) {
                                    var provider = self.providers.filter(p => p.pcode == self.user.affinityCode).pop();
                                    if (!provider) {
                                        delete self.user.affinityCode;
                                        delete self.user.affinityId;
                                        delete self.user.affinityVId;
                                        delete self.user.affinityName;
                                    }
                                    if (provider && !self.user.affinityCode) {
                                        self.user.affinityCode = provider.pcode;
                                        self.user.affinityId = provider._id;
                                        self.user.affinityName = provider.name;
                                        self.user.affinityVId = provider.vid;
                                    }
                                }
                            }
                            self.session.loggedIn = true;
                            self.saveSession(false);
                            rollick.library.TrackEvent('session', 'resume by code');
                            self.library.CheckLeads();
                            if (postScript) {
                                eval(postScript);
                            }
                        }
                    });
                }
            } catch (err) {
                console.error(err);
            }
        }
    },

    async resumeSessionByEmail(email, leadId, type, leadUid = null) {
        var self = this;
        var host = location.hostname;
        var data = await self.jq.get(self.endpoints.widget + '/user-session-resume-by-email/' + host + '/' + email + '/' + leadId + '/' + leadUid);
        if (data) {
            self.user = data.user || {};
            self.leads = data.leads || {};
            if (self.library.RenderButtons) self.library.RenderButtons();
            self.library.StartTimer();
            if (self.user.e) {
                self.setCookie('Aimbase.Analytics.Email', self.user.e, 90);
            }
            if (self.user.uid) {
                // Aimbase.Analytics.SetUserUid(self.user.uid);
            }
            self.session.loggedIn = true;
            self.saveSession(false);
            self.library.TrackEvent('session', 'resume by code');
            self.library.CheckLeads();
            var vehicles = Object.keys(self.leads);
            var vehicle = {};
            for (var i = 0; i < vehicles.length; i++) {
                if (rollick.leads[vehicles[i]].LeadId == leadId) {
                    vehicle = rollick.leads[vehicles[i]].vehicle;
                }
            }
            if (vehicle.id) {
                var pageVehicle = {
                    id: vehicle.id,
                    price: vehicle.price || null,
                    type: vehicle.condition || '',
                    vehtypename: vehicle.type || '',
                    bike_year: vehicle.year || '',
                    manuf: vehicle.make || '',
                    model: vehicle.model || '',
                    trim: vehicle.trim || '',
                    location: vehicle.location || ''
                }
                if (rollick && rollick.page && rollick.page.vehicles && !rollick.page.vehicles[vehicle.id]) {
                    rollick.page.vehicles[vehicle.id] = pageVehicle;
                } else {
                    rollick.page["vehicles"] = {};
                    rollick.page.vehicles[vehicle.id] = pageVehicle;
                }
                rollick.library.jobsPayment.push(vehicle.id);
                self.logMessage(vehicle);
                var formType = { type: 'request-a-quote' };
                if (type) {
                    switch (type) {
                        case 'rn':
                            formType.type = 'reserve-now';
                            break;
                        default:
                            break;
                    }
                }
                self.library.OpenForm(formType, vehicle);
            }
        }
    },

    initSession() {
        var self = this;
        self.user = {
            uid: "",
            fn: "",
            ln: "",
            p: "",
            e: "",
            z: "",
            an: "",
            ac: "",
            rid: "",
            isFromS4: "{% userIsFromS4 %}" == "true",
            s4Affinity: "{% userS4Affinity %}",
            aaa: "",
            usaa: "",
            ttp: "",
            textMe: false,
            verified: false,
            tradeIn: {},
        };
        self.leads = {};
        self.vehicle = {};
        self.provider = {};
        self.session.loggedIn = false;
        if (self.library && self.library.RenderButtons) self.library.RenderButtons();
        self.eraseCookie('Aimbase.Analytics.Email');
        self.saveSession(false);
    },

    dealerScriptLoaded() {
        if (!rollick.library) {
            window.setTimeout(rollick.dealerScriptLoaded, 50);
            return;
        }
        if (typeof roDrawButtons == 'function') {
            roDrawButtons = function () { };
        }
        if (typeof roInitDMS == 'function') {
            roInitDMS = function () { };
        }
        if (typeof roDrawTemplateButton == 'function') {
            roDrawTemplateButton = function () { };
        }
        if (typeof roDebugBar == 'object') {
            if (typeof roDebugBar.CheckMode == 'function') {
                roDebugBar.CheckMode = rollick.library.CheckDebugMode;
            }
        }
        rollick.library.DetectPageCategory();
        rollick.library.CheckQS();
        rollick.library.StartListener();
        rollick.library.StartTimer();
        rollick.jq(document).off("keydown").on("keydown", rollick.library.CheckDebugMode);
        if (sessionStorage["ro-debug-mode"] == "1") {
            rollick.library.ShowDebugBar();
        }

        if (rollick.dealer.rollickCTA) {
            if (rollick.DMS) {
                //rollick.DMS.loadDealerInventory();
                rollick.DMS.drawButtons();
                rollick.DMS.watchInventoryLoad();
            }
            rollick.library.RenderButtons();
        }

        if (rollick.settings.cta['standalone-trade-in'] && rollick.settings.cta['standalone-trade-in'].enabled) {
            if (typeof rollick.library.InitTradeInEstimator == 'function') rollick.library.InitTradeInEstimator();
        }
    },

    loadAwardScript() {
        var self = this;
        if (self.settings.award && self.settings.award.script && !self.scripts[self.settings.award.script]) {
            self.scripts[self.settings.award.script] = 'loading';
            import(self.settings.award.script)
                .then(({ default: RollickDealerAward }) => {
                    if (rollick.DMS) {
                        if (typeof rollick.DMS.drawAwards == 'function') {
                            rollick.DMS.drawAwards();
                            rollick.DMS.watchInventoryLoad();
                        }
                    }
                    self.award = new RollickDealerAward('rollick-award', self.settings.award.api, self.settings.award.key, false);
                    if (rollick.award && typeof (rollick.award.init) == 'function') {
                        rollick.TrackHealthEvent("Award script initialized");
                        rollick.award.init();
                    }
                });
        } else {
            if (rollick.DMS) {
                if (typeof rollick.DMS.drawAwards == 'function') {
                    rollick.DMS.drawAwards();
                    rollick.DMS.watchInventoryLoad();
                }
            }
            if (rollick.award && typeof (rollick.award.init) == 'function') {
                rollick.TrackHealthEvent("Award script initialized");
                rollick.award.init();
            }
        }
    },

    TrackHealthEvent(action) {
        let self = this;
        if (!self.endpoints || !self.endpoints.healthstateAPI) return;
        let website = location.href;
        website = website.startsWith("http") ? website.replace("http://", "") : website;
        website = website.startsWith("https") ? website.replace("https://", "") : website;
        website = website.startsWith("www") ? website.replace("www.", "") : website;
        website = website.split("/")[0];
        try {
            //  var URL = "https://dashboard.inventory-qa.rollick.io/health/api/record/add";
            let URL = self.endpoints.healthstateAPI;
            let postBody = {
                category: website,
                value: Date.now(),
                module: "s2",
                action: action
            }

            let options = {
                type: "POST",
                contentType: "application/json; charset=utf-8",
                data: JSON.stringify(postBody),
                url: URL,
                traditional: false,
                success: function () { },
                error: function (e) { console.log("Error in HealthState", e); }
            };
            self.jq.ajax(options);
        }
        catch (e) { }

    },

    initializeJquery() {
        var jqAdded;
        if (!jqAdded) {
            var headTag = document.getElementsByTagName("head")[0];
            var jqTag = document.createElement('script');
            jqTag.type = 'text/javascript';
            jqTag.src = 'https://code.jquery.com/jquery-3.2.1.min.js';
            headTag.appendChild(jqTag);
            jqAdded = true;
        }
    }
};

// polyfill for non-ES6
if (!String.prototype.endsWith) {
    String.prototype.endsWith = function (string) {
        var index = arguments.length < 2 ? this.length : arguments[1];
        var foundIndex = this.lastIndexOf(string);
        return foundIndex !== -1 && foundIndex === index - string.length;
    };
}

if (!String.prototype.startsWith) {
    String.prototype.startsWith = function (searchString, position) {
        position = position || 0;
        return this.indexOf(searchString, position) === position;
    };
}

if (!String.prototype.includes) {
    String.prototype.includes = function (search, start) {
        'use strict';
        if (typeof start !== 'number') {
            start = 0;
        }
        if (start + search.length > this.length) {
            return false;
        } else {
            return this.indexOf(search, start) !== -1;
        }
    };
}

if (typeof Object.assign != 'function') {
    Object.defineProperty(Object, 'assign', {
        valueassign(target, varArgs) { // .length of function is 2
            'use strict';
            if (target == null) { // TypeError if undefined or null
                throw new TypeError('Cannot convert undefined or null to object');
            }
            var to = Object(target);
            for (var index = 1; index < arguments.length; index++) {
                var nextSource = arguments[index];
                if (nextSource != null) {
                    for (var nextKey in nextSource) {
                        if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
                            to[nextKey] = nextSource[nextKey];
                        }
                    }
                }
            }
            return to;
        },
        writable: true,
        configurable: true
    });
}

if (document.readyState != "complete") window.addEventListener('load', rollick.init);
else
    rollick.init();
