

var rollick = rollick || {};

rollick = {
    version: "V2",
    autorun: rollick.autorun || ("true" == "true"),
    dealer: {
        id: "ff497df5726548fd",
        pan: "10244",
        logo: "https://content.rollick.io/l/ff497df5726548fd/s",
        name: "Mid America RV",
        parent: "",
        targetedStates: "",
        isBFHOn: ("" == "true"),
        aaaActive: ("" == "true"),
        prequalEnabled: ("true" == "true"),
        synchronyEnabled: ("" == "true"),
        appointmentEnabled: ("" == "true"),
        textUsEnabled: ("" == "true"),
        nationalGeneralEnabled: ("true" == "true"),
        singleLocationDealer: ("true" == "true"),
        locations: [{"id":"ff497df5726548fd","name":"Mid America RV","bc":[{"brandId":0,"categoryId":2005,"segmentId":3,"cnew":true,"cused":true},{"brandId":0,"categoryId":2009,"segmentId":3,"cnew":true,"cused":true},{"brandId":0,"categoryId":2006,"segmentId":3,"cnew":true,"cused":true},{"brandId":0,"categoryId":2010,"segmentId":3,"cnew":true,"cused":true},{"brandId":0,"categoryId":2007,"segmentId":3,"cnew":true,"cused":true},{"brandId":0,"categoryId":2001,"segmentId":3,"cnew":true,"cused":true},{"brandId":0,"categoryId":2002,"segmentId":3,"cnew":true,"cused":true},{"brandId":0,"categoryId":2003,"segmentId":3,"cnew":true,"cused":true},{"brandId":0,"categoryId":2004,"segmentId":3,"cnew":true,"cused":true},{"brandId":0,"categoryId":2008,"segmentId":3,"cnew":true,"cused":true}],"country":"US"}],
        tradeInPct: parseInt("40") || 40,
        modules: ["request-a-quote","reserve-now","payment","offers","trade-in","financing","appointment"],
        tradeInModule: "NADAGuides",
        CTAs: ["request-a-quote","finance"],
        CTATexts: ["Request A Quote","Prequalify for Financing"],
        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]}}},
        lenderIds: "",
        expressBuyHelperHeader: "",
        nextStepHelperHeader: "",
        preview: "",
        sponserdbrand: "",
        paymentProfiles: [],
        paymentEnabled: ("" == "true"),
        preApprovalOn: ("" == "true"),
        simpleDealerUrl: "",
        preApprovalButtonText: "",
        email: "MidAmericaRV@rollickoutdoor.com",
        incentiveEnabledOnAffinity: "",
        financePreApprovals: [],
        excludeDealerLocation: "Caledonia,Midway,Lake Oconee,Norwich",
        country: "US",
        financePrequal: [{"name":"700Credit","type":"prequal","status":1,"key":"midamericarpq","secret":"Auto005439","mode":"PROD","settings":[]}],
        prequal700credit: "true",
        prequalYamaha: "",
        prequalYamahaUrl: "",
        tradInPricePercent: "10",
        experiments: "",
        badgingEnabled: ("" == "true"),
        tier3Enabled: ("" == "true"),
        tier3Brands: [],
    },
    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://rmc.rollick.io/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: "qa.gorollick.com",
        gaLabel: "Digital Retailing",
        harleyBrand: "harleydavidson",
        paymentCalculator: true,
        cta: {"request-a-quote":{"text":"Request A Quote","fontColor":"","fontSize":"","bgColor":"c12129","enabled":true},"reserve-now":{"text":"Reserve Now","fontColor":"","fontSize":"","bgColor":"c12129","enabled":false,"hasSubtext":false,"deposit":1000,"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":[]},"offers":{"text":"Special Offers","fontColor":"","fontSize":"","bgColor":"c12129","enabled":false},"payment":{"text":"Calculate Payments","fontColor":"","fontSize":"","bgColor":"c12129","enabled":false},"trade-in":{"text":"Estimate Trade-in","fontColor":"","fontSize":"","bgColor":"c12129","enabled":false},"finance":{"text":"Prequalify for Financing","fontColor":"","fontSize":"","bgColor":"c12129","enabled":true},"appointment":{"text":"Schedule an Appointment","fontColor":"","fontSize":"","bgColor":"c12129","enabled":false},"text-us":{"text":"Text Us","fontColor":"","fontSize":"","bgColor":"c12129","enabled":false}},
        ctaDefaults: {
            bgColor: "#3697D3",
            fontColor: "white",
            fontSize: "16px",
        },
        inventoryFile: "https://rmc.rollick.io/api/dealer-inventory/ff497df5726548fd/*",
        excludeCategories: ['aerators', 'powerequipment', 'bicycleebikes', 'auto', 'car', 'snowblower', 'industrialgenerators', 'recreationalgenerator', 'generators', 'portable', 'general', 'commercial', 'water', 'tractor', "lawn mower", "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'],
        excludeMake: ['bad boy', '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'],
        layout: "vertical-tabs-v2",
        award: {
            enabled: "true" == "true",
            script: "https://cdn.rollick.io/awards/RollickDealerAwards.js",
            api: "https://awards.rollick.io",
            key: "",
        },
    },
    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": ["powersporttechnologies.com"],
    //     "TemplateName": 'PST'
    // },
    {
        "SearchArray": ["interactrv.com", "interactrv.net", "interactcp.com"],
        "TemplateName": 'IRV'
    },
    {
        "SearchArray": ["level5advertising.com", "level5-form"],
        "TemplateName": 'L5'
    },
    {
        "SearchArray": ["Firestorm Websites"],
        "TemplateName": 'Firestorm'
    },
    {
        "SearchArray": ["Room 58"],
        "TemplateName": 'Room58'
    },
    {
        "SearchArray": ["harleydavidsonofcharlotte.com"],
        "TemplateName": 'hdoc'
    },
    {
        "SearchArray": ["camperland.net"],
        "TemplateName": 'camper'
    },
    {
        "SearchArray": ["pixelmotion.com"],
        "TemplateName": 'pixelmotion'
    },
    {
        "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"],
        "TemplateName": 'PSX'
    },
    {
        "SearchArray": ["DealerFire"],
        "TemplateName": 'DealerFire'
    },
    {
        "SearchArray": ["rvconnections.com"],
        "TemplateName": 'ridemarketing'
    },
    {
        "SearchArray": ["Fay's Marina"],
        "TemplateName": 'faysmarina'
    },
    {
        "SearchArray": ["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": ["frankelinteractive.com"],
        "TemplateName": 'frankelinteractive'
    },

    {
        "SearchArray": ["noleeo.com"],
        "TemplateName": 'noleeo'

    }
        ,
    {
        "SearchArray": ["grrcycles.com"],
        "TemplateName": 'grrcycles'

    },
    {
        "SearchArray": ["fuelm.com", "mtdoraboats.com"],
        "TemplateName": 'fuelmedia'
    },
    {
        "SearchArray": ["trailercentral.com"],
        "TemplateName": 'dealereprocess'
    },
    {
        "SearchArray": ["ridedigital.com"],
        "TemplateName": 'ridedigital'
    },
    {
        "SearchArray": ["dealersync.com"],
        "TemplateName": 'dealersync'
    },
    {
        "SearchArray": ["viersgolfcars.com"],
        "TemplateName": 'customviersgolfcars'
    },
    {
        "SearchArray": ["forewheelergolfcars.com", "golfcarsofhouston.com", "milehighgolfcars.com"],
        "TemplateName": 'revenuematter'
    },
    {
        "SearchArray": ["carolinagolfcars.com"],
        "TemplateName": 'leadsonline'
    },
    {
        "SearchArray": ["nativerank.com"],
        "TemplateName": 'NativeRank'
    },
    {
        "SearchArray": ["revver.com"],
        "TemplateName": 'Revver'
    }
    ],
    init() {
        var self = this;
        try {
            if (jQuery().jquery) {
                self.jq = jQuery;
            }
        } catch (e) {
            console.log(e);
            if (typeof jQuery == 'undefined') {
                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;

                }

                window.setTimeout(rollick.init, 1000);
            }
        }
        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();
        rollick.loadAimbaseScript();
        rollick.TrackHealthEvent("Widget script loaded");
        if (rollick.autorun) {
            if (rollick.settings.gaEnabled) {
                rollick.loadGAScript();
            }
            if (location.pathname == '/') rollick.noCTA = true;
            if (document.body.hasAttribute('rollick-CTA')) {
                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';
                self.session.aimbase = {
                    userUid: Aimbase.Analytics.GetUserUid(),
                    sessionUid: Aimbase.Analytics.GetSessionUid(),
                    source: Aimbase.Analytics.GetFieldValue('source') || '',
                    campaign: Aimbase.Analytics.GetFieldValue('campaign') || '',
                    event: Aimbase.Analytics.GetFieldValue('event') || '',
                }
                if (document.body.hasAttribute('rollick-pageType')) {
                    var pageType = document.body.getAttribute('rollick-pageType');
                    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') {
            (function (i, s, o, g, r, a, m) {
                i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function () {
                    (i[r].q = i[r].q || []).push(arguments)
                }, i[r].l = 1 * new Date(); a = s.createElement(o),
                    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) {
            ga('create', rollick.settings.gaId, 'auto', { 'name': 'rol', 'allowLinker': true });
            ga('rol.require', 'linker');
            ga('rol.linker:autoLink', [rollick.settings.gaProperty]);
        }
    },
    loadTemplateScript() {
        var self = this;
        if (self.dealer.template && !self.scripts[self.dealer.template] && ['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'].indexOf(self.dealer.template.toLowerCase()) != -1) {
            self.scripts[self.dealer.template] = 'loading';
            var script = document.createElement('script');
            script.onload = function () {
                self.scripts[self.dealer.template] = 'loaded';
                if (typeof rollick.DMS == 'object' && typeof rollick.DMS.loadDealerInventory == 'function') rollick.DMS.loadDealerInventory();
                self.loadDealerScript();
            };
            script.setAttribute('type', 'text/javascript');
            script.setAttribute('src', self.endpoints.widget + '/widgets/dr/scripts/dms/' + self.dealer.template.toLowerCase() + '.js');
            script.setAttribute('id', 'RollickTemplateScript');
            document.body.appendChild(script);
        }
        if (rollick.dealer.template == "DX1") {
            var timerId2;
            var oldXHR = window.XMLHttpRequest;
            function newXHR() {
                var realXHR = new oldXHR();
                realXHR.addEventListener("readystatechange", function () {
                    if (realXHR.responseURL) {
                        if ((realXHR.responseURL.toLowerCase().indexOf("indexes/*/queries?x") != -1) || (realXHR.responseURL.toLowerCase().indexOf("indexes/*/queries") != -1) || (realXHR.responseURL.toLowerCase().indexOf("DesktopModules/Dominion") != -1)) {
                            if (realXHR.readyState == 4 && realXHR.status == 200) {
                                timerId2 = window.setTimeout(rollick.dealerScriptLoaded, 200); //run your code here
                            } else {
                                window.setTimeout(rollick.dealerScriptLoaded);
                            }
                        }
                    }
                }, false);
                clearTimeout(timerId2);
                return realXHR;
            }
            window.XMLHttpRequest = newXHR;
        }
        //  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;
        //     }
    },
    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) {
                    rollick.loadAwardScript();
                }
            };
            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' && jQuery().jquery) {
            self.jq = jQuery;
        }
        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();
                        }
                    }
                    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();
                }
            }
            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) { }

    }
};

// 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();
