// IE polyfill
if (location.search) {
    sessionStorage["rollick-search"] = location.search;
} else {
    delete sessionStorage["rollick-search"];
}

if (!Object.assign) {
    Object.defineProperty(Object, 'assign', {
        enumerable: false,
        configurable: true,
        writable: true,
        value: function (target) {
            'use strict';
            if (target === undefined || target === null) {
                throw new TypeError('Cannot convert first argument to object');
            }

            var to = Object(target);
            for (var i = 1; i < arguments.length; i++) {
                var nextSource = arguments[i];
                if (nextSource === undefined || nextSource === null) {
                    continue;
                }
                nextSource = Object(nextSource);

                var keysArray = Object.keys(Object(nextSource));
                for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) {
                    var nextKey = keysArray[nextIndex];
                    var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
                    if (desc !== undefined && desc.enumerable) {
                        to[nextKey] = nextSource[nextKey];
                    }
                }
            }
            return to;
        }
    });
}

var rollick = {
    widget: 'https://widget.rollick.io',
    validation: 'https://validate.rollick.io',
    ip: '152.53.55.43',
    vehicles: [],
    oem: 'winnebago',
    siteId: 'WGO',
    redirectUrl: '',
    userId: '',
    sessionId: '',
    source: '',
    campaign: '',
    accessories: [],
    kits: [],
    vehicle: {},
    year: '',
    blank: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=',
    debugMode: false,
    privacyPolicy: 'https://gorollick.com/company/site-info/privacy-policy-terms-of-service/',
    termsCondition: 'https://gorollick.com/company/site-info/privacy-policy-terms-of-service/',
    hosts: {},
    form_firstName: '.rollick-form-first-name-value',
    form_lastName: '.rollick-form-last-name-value',
    form_email: '.rollick-form-email-value',
    form_phone: '.rollick-form-phone-value',
    form_postalCode: '.rollick-form-postal-code-value',
    form_comment: '.rollick-form-comment-value',
    vehicleParams: {},
    maintenance: false,
    leadType: 'Quote',
    visited: {},
    lead_headline: 'REQUEST A QUOTE',
    lead_text: 'Fill out the below form and your local authorized dealer will follow-up with a personalized quote for the vehicle you\'re interested in',
    previousZip: '',
    previousZipValid: false,
    dealersList: [],
    dealers: null,
    brandCode: '$siteId',
    paymentInfo: null,
    paymentTry: 0,
    abandoned: null,
    deposit: 0,
    scriptLoaded: {},
    submitted: false,
    keys: {},
    locateDealerBusy: false,
    div: '',
    isFormSubmitted: false,
    isBusy: false,
    cart: {},
    rolGAEnabled: 'true',
    rolGAId: '282506840',
    rolGAProperty: 'gorollick.com',
    categories: [],

    initData: function () {
        if (!rq) return;
        var host = location.hostname.toLowerCase();
        var dataFile = '';
        var ts = (new Date()).valueOf();
        rollick.brandCode = this.siteId;
        if (!sessionStorage['rollick-referrer-set']) {
            sessionStorage['rollick-referrer-value'] = document.referrer || '';
            sessionStorage['rollick-referrer-set'] = '1';
        }

        if (location.href.toLowerCase().indexOf('currency=cad') != -1) {
            sessionStorage['rollick-country'] = 'CA';
        }
        if (location.href.toLowerCase().indexOf('currency=usd') != -1) {
            sessionStorage['rollick-country'] = 'US';
        }

        if (typeof Aimbase === 'undefined') {
            var s = document.createElement('script');
            s.setAttribute('data-clientId', 'winnebago');
            s.id = 'AimbaseAnalytics';
            s.type = 'text/javascript';
            s.src = '//ws.aimbase.com/Scripts/awa.js';
            s.onload = function () {
                var uid = rollick.getSearchParams('uid');
                if (uid) {
                    sessionStorage['rollick-user-id'] = uid;
                    rollick.initOpenCart = true;
                }
                if (sessionStorage['rollick-user-id']) {
                    rollick.userId = sessionStorage['rollick-user-id'];
                    // if (Aimbase.Analytics.GetUserUid() != rollick.userId) Aimbase.Analytics.SetUserUid(rollick.userId);
                } else {
                    rollick.userId = Aimbase.Analytics.GetUserUid();
                    sessionStorage['rollick-user-id'] = rollick.userId;
                }
            }
            s.onerror = function () {
                rollick.maintenance = true;
            }
            var t = document.getElementsByTagName('script')[0];
            t.parentNode.insertBefore(s, t);
        } else {
            var uid = rollick.getSearchParams('uid');
            if (uid) {
                sessionStorage['rollick-user-id'] = uid;
                rollick.initOpenCart = true;
            }
            if (sessionStorage['rollick-user-id']) {
                rollick.userId = sessionStorage['rollick-user-id'];
                // if (Aimbase.Analytics.GetUserUid() != rollick.userId) Aimbase.Analytics.SetUserUid(rollick.userId);
            } else {
                rollick.userId = Aimbase.Analytics.GetUserUid();
                sessionStorage['rollick-user-id'] = rollick.userId;
            }
        }
    },

    getAllSearchParams: function () {
        var qs = location.search;
        if (sessionStorage['rollick-search'] && location.pathname && location.pathname.toLowerCase().indexOf('build-and-price') != -1) qs = sessionStorage['rollick-search'];
        if (qs) {
            qs = qs.substring(1).replace(/\?/g, '&');
            var searchParams = qs.split('&').reduce(function (prev, curr, i, arr) {
                var p = curr.split('=');
                prev[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
                return prev;
            }, {});

            return searchParams || {};
        }
        return {};
    },

    getSearchParams: function (param) {
        var searchParams = rollick.getAllSearchParams();
        if (searchParams[param]) {
            return searchParams[param];
        }
        return '';
    },

    getQuote: async function (vehicle, options) {
        var self = this;
        if (typeof rollick.library != 'object') {
            window.setTimeout(function () {
                self.getQuote(vehicle, options);
            }, 250);
            return;
        }
        rollick.leadType = (options && options.leadType || 'Digital Retail') || 'Digital Retail';
        if (!options) options = {};
        if (!options.country && location.href.toLowerCase().indexOf("currency=cad") != -1) {
            options.country = 'CA';
        }
        rollick.country = options.country || 'US';
        if (window.console && rollick.debugMode) {
            console.log(vehicle);
            console.log(options);
        }
        /* Removed auto-detect location. very slow
        if (!options.country || !options.zip) {
            try {
                if (typeof LocationService == 'object' && typeof LocationService.getUserLocationInfoAsync == 'function') {
                    let location = await LocationService.getUserLocationInfoAsync();
                    if (location && location.zipPostalCode && location.country) {
                        options.country = location.country;
                        options.zip = location.zipPostalCode;
                    }
                }
            } catch (e) {
            }
        }
        */
        if (options.zip && !rollick?.user?.z) {
            rollick.user.z = options.zip;
        }
        var accessories = null, image64 = null;
        if (rollick.maintenance) {
            alert('The system is currently under maintenance. Please check back later');
            // return false;
        }
        if (!options) options = {};
        if (!vehicle) vehicle = {};
        rollick.div = options.div || '';
        delete sessionStorage['rollick-dealer-id'];
        if (options.dealerId) sessionStorage['rollick-dealer-id'] = options.dealerId;
        if (options.dealerNumber) sessionStorage['rollick-dealer-id'] = options.dealerNumber;
        if (vehicle.inventoryId) {
            try {
                let id = vehicle.inventoryId;
                let result = await rollick.getInventory(id);
                let inventory = result.trimInfo.pop();
                if (inventory) {
                    vehicle = {
                        year: inventory.Year,
                        type: inventory.Category,
                        make: (inventory.Model.toUpperCase()).replace(/[^\w\s]/gi, '').trim(),
                        model: inventory.Model + ' ' + inventory.Trim,
                        trim: '',
                        price: (inventory.displayPrice || inventory.dealerMSRP || null),
                        color: inventory.color,
                        image: vehicle?.VDPImage || inventory.dealerBikeImage,
                        inventoryId: id,
                        condition: inventory.condition,
                        oMake: inventory.Manufacturer,
                        modelCode: inventory.Model + ' ' + inventory.Trim,
                        msrp: (inventory.dealerMSRP || null),
                        vin: inventory.vin,
                        stockno: inventory.stockNumber,
                        id: id,
                        country: inventory.CountryCode,
                    };
                    if (vehicle.color.indexOf('N/A') != -1) delete vehicle.color;
                } else {
                    rollick.library.LoadForm({ type: "Not-Found", html: "vehicle-not-found.html" });
                    return;
                }
            } catch (e) {
                console.error(e);
                rollick.library.LoadForm({ type: "Not-Found", html: "vehicle-not-found.html" });
                return;
            }
        }
        if (vehicle.model) {
            vehicle.model = vehicle.model.trim();
        }
        if (vehicle.trim) {
            vehicle.trim = vehicle.trim.trim();
        }
        if (vehicle.color) {
            vehicle.color = vehicle.color.trim();
        }
        if (vehicle.year) {
            vehicle.year = vehicle.year.toString();
        }
        if (!vehicle.modelCode) vehicle.modelCode = vehicle.make.toUpperCase();
        if (vehicle.image) image64 = vehicle.image.trim();
        if (vehicle.accessories) accessories = vehicle.accessories.slice();
        if (window.console && rollick.debugMode) console.log('getQuote called', vehicle, options);
        if (options.redirectUrl) rollick.redirectUrl = options.redirectUrl;
        else rollick.redirectUrl = '';
        rollick.vehicleParams = {};
        rollick.paymentInfo = null;
        rollick.abandoned = null;
        rollick.paymentTry = 0;

        var year = vehicle.year;
        var vehType = (vehicle.type || '').trim();
        var model = (vehicle.model || '').trim();
        var color = (vehicle.color || '').trim();
        var deposit = parseFloat(vehicle.deposit || '0');
        var modelCode = (vehicle.modelCode || '').trim();
        var id = vehicle.id;
        var vehicleParameter = {
            type: vehType,
            model: model,
            year: year,
            color: color,
            deposit: deposit,
            modelNumber: modelCode,
            id: id
        };
        rollick.vehicleParams = vehicleParameter;
        rollick.deposit = deposit;
        rollick.lead_headline = 'REQUEST A QUOTE';
        if (vehicle) {
            var vehicleParameters = new Object();
            vehicleParameters.color = vehicle.color;
            vehicleParameters.deposit = vehicle.deposit;
            vehicleParameters.image = vehicle.image;
            vehicleParameters.make = vehicle.make;
            vehicleParameters.model = model;
            vehicleParameters.trim = vehicle.trim || '';
            vehicleParameters.modelCode = vehicle.modelCode;
            vehicleParameters.msrp = vehicle.msrp;
            vehicleParameters.price = vehicle.price;
            vehicleParameters.year = vehicle.year;
            vehicleParameters.category = vehType;
            vehicleParameters.type = vehType;
            vehicleParameters.id = vehicle.id;
            if (vehicle.oMake) vehicleParameters.oMake = vehicle.oMake;
            else vehicleParameters.oMake = 'Winnebago';
            if (vehicle.stockNumber) vehicleParameters.stockNumber = vehicle.stockNumber;
            if (vehicle.inventoryId) {
                vehicleParameters.inventoryId = vehicle.inventoryId;
                if (vehicle.condition) vehicleParameters.condition = vehicle.condition;
                if (vehicle.vin) vehicleParameters.vin = vehicle.vin;
                if (vehicle.stockno) vehicleParameters.stockno = vehicle.stockno;
            }
            if (image64) vehicleParameters.image64 = image64;
            if (accessories) {
                vehicleParameters.accessories = accessories;
                vehicleParameters.price = accessories.reduce((a, b) => a + (b.cost ? parseFloat(b.cost) : 0), vehicleParameters.price);
            }
            // vehicleParameters.id = self.generateUUID();
            self.setDefaultRates(vehicleParameters.id);
            var vehicleParametersJsonString = JSON.stringify(vehicleParameters);
            let module = 'request-a-quote';
            if (options.module) module = options.module;
            if (vehicle.country) {
                options.country = vehicle.country;
                rollick.country = vehicle.country;
            }
            let formParameters = {
                type: module,
                leadType: rollick.leadType,
                country: options.country || 'US',
                ttp: rollick.timeToPurchase,
                ambassadors: rollick.dealer.ambassadors || {},
                ambassador: sessionStorage['ambassador'] || null,
                logo: rq('.site-header__main-nav__link').first().html() || '',
                leadUid: options.leadUid || null,
            }
            if (module == 'reserve-now') formParameters.html = 'reserve-now-en.html'
            self.openForm(formParameters, JSON.parse(vehicleParametersJsonString));
            window.setTimeout(function () {
                if (window.tray && window.tray.active) window.tray.closeTray();
            }, 500);
            return;
        }
    },

    generateUUID() {
        var d = new Date().getTime();
        var d2 = ((typeof performance !== 'undefined') && performance.now && (performance.now() * 1000)) || 0;
        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
            var r = Math.random() * 16;
            if (d > 0) {
                r = (d + r) % 16 | 0;
                d = Math.floor(d / 16);
            } else {
                r = (d2 + r) % 16 | 0;
                d2 = Math.floor(d2 / 16);
            }
            return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
        });
    },

    MakeCRCTable() {
        var c;
        var crcTable = [];
        for (var n = 0; n < 256; n++) {
            c = n;
            for (var k = 0; k < 8; k++) {
                c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
            }
            crcTable[n] = c;
        }
        return crcTable;
    },

    CRC32(str) {
        var self = this;
        var crcTable = window.crcTable || (window.crcTable = self.MakeCRCTable());
        var crc = 0 ^ (-1);
        for (var i = 0; i < str.length; i++) {
            crc = (crc >>> 8) ^ crcTable[(crc ^ str.charCodeAt(i)) & 0xFF];
        }
        return (crc ^ (-1)) >>> 0;
    },

    setDefaultRates(id) {
        rollick.rates = {};
        rollick.rates[id] = {};
        if (rollick.dealer.fixedRates && rollick.dealer.fixedRates.length) {
            rollick.rates[id] = JSON.parse(JSON.stringify(rollick.dealer.fixedRates));
        }
    }
}
var rq = null;

if (sessionStorage['ro-extension'] == '1') {
    rollick.debugMode = true;
}
if (typeof jQuery === 'function') {
    rq = jQuery;
} else {
    // insert jQuery load here, but not needed for TSV. Needed for ARC
    var script = document.createElement('SCRIPT');
    script.src = 'https://code.jquery.com/jquery-3.3.1.min.js';
    script.type = 'text/javascript';
    script.onload = function () {
        rq = window.jQuery.noConflict();
        window.setTimeout(function() {
            rollick.initData();
        }, 250);
    };
    document.getElementsByTagName('head')[0].appendChild(script);
}

if (rq) {
    window.setTimeout(function() {
        rollick.initData();
    }, 250);
    if (rq('html').scrollTop()) {
        window.setTimeout(function () {
            rq('html').scrollTop(0); // scroll to top
        }, 100);
    }
}
var rollick = rollick || {};

rollick.version = "V2";

rollick.autorun = rollick.autorun || ("true" == "true");

rollick.dealer = {
    id: "",
    pan: "winnebago",
    logo: "",
    name: "wgo",
    parent: "",
    targetedStates: "",
    isBFHOn: ("" == "true"),
    aaaActive: ("" == "true"),
    prequalEnabled: ("true" == "true"),
    synchronyEnabled: ("" == "true"),
    appointmentEnabled: ("true" == "true"),
    textUsEnabled: ("" == "true"),
    nationalGeneralEnabled: ("" == "true"),
    singleLocationDealer: ("true" == "true"),
    locations: "",
    tradeInPct: parseInt("100") || 40,
    modules: ["request-a-quote","trade-in","appointment","offers","prequalification","payment"],
    tradeInModule: "NADAGuides",
    CTAs: [],
    CTATexts: [],
    template: "",
    rollickCTA: false,
    subscriptionType: "1",
    isOEMDealer: ("" == "true"),
    processConfig: null,
    lenderIds: "",
    expressBuyHelperHeader: "",
    nextStepHelperHeader: "",
    preview: "",
    sponserdbrand: "",
    paymentProfiles: [],
    paymentEnabled: ("" == "true"),
    preApprovalOn: ("{% preApprovalOn %}" == "true"),
    simpleDealerUrl: "{% simpleDealerUrl %}",
    preApprovalButtonText: "{% preApprovalButtonText %}",
    email: "",
    conciergeId: "cdf58a856f794ac8",
    conciergeName: "Winnebago Concierge Dealership",
    brandName: "Winnebago",
    incentiveEnabledOnAffinity: true,
    aimbaseId: "",
    rates: { "CA": parseFloat("1.377420049224417") },
    isOEM: true,
    noProvider: true,
    tradeMultiplier: 0.2,
    fixedRates: JSON.parse("[{\"term\":144,\"apr\":8.49,\"downPaymentPct\":20},{\"term\":180,\"apr\":8.49,\"downPaymentPct\":20},{\"term\":240,\"apr\":8.49,\"downPaymentPct\":20,\"best\":true}]"),
    trackEventV2: "true" == "true",
    filterActions: ["submit","click","view","close"],
    enableCAPreQual: "true" == "true",
};

rollick.user = {
    uid: "",
    fn: "",
    ln: "",
    p: "",
    e: "",
    z: "",
    an: "",
    ac: "",
    rid: "",
    isFromS4: "" == "true",
    s4Affinity: "",
    aaa: "",
    usaa: "",
    ttp: "",
    textMe: false,
    verified: false,
    tradeIn: {}
};

rollick.aimbase = "https://ws.aimbase.com/Scripts/awa.js";

rollick.script = "https://widget.rollick.io/widgets/dr/scripts/dealer.js";

rollick.scripts = {};

rollick.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"
};

rollick.settings = {
    useRMCInventory: true,
    showCTA: { new: true, used: true },
    gaEnabled: "" == "true",
    gaId: "",
    gaProperty: "",
    gaLabel: "",
    harleyBrand: "harleydavidson",
    paymentCalculator: true,
    cta: {},
    ctaDefaults: {
        bgColor: "#3697D3",
        fontColor: "white",
        fontSize: "16px"
    },
    inventoryFile: "{% inventoryFile %}",
    excludeCategories: ['powerequipment', 'bicycleebikes', 'auto', 'car', 'snowblower', 'industrialgenerators', 'recreationalgenerator', 'generator', 'portable', 'general', 'commercial', 'water'],
    layout: "vertical-tabs-v2",
    drEnabled: true,
    usbCreditScoreOptions: {"rvs":["800+","760-799","740-759","720-739","700-719","680-699"],"boats":["800+","760-799","740-759","720-739","700-719","680-699"]},
};

rollick.page = {};

rollick.session = {
    aimbase: {},
    piwikId: ""
};

rollick.vehicle = {};

rollick.noCTA = rollick.noCTA || false;

rollick.templateIdentifierJson = [];

rollick.init = function () {
    var self = this;
    try {
        if (jQuery().jquery) {
            self.jq = jQuery;
        }
    } catch (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;
                // self.jq = jQuery;
            }
            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;
    rollick.session.website = self.jq(location).attr('origin').toLowerCase().replace(self.jq(location).attr('protocol').toLowerCase() + "//", "");

    rollick.getTemplateName();
    rollick.loadAimbaseScript();
    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();
    }
};

rollick.loadAimbaseScript = function () {
    var self = this;
    if (typeof Aimbase === 'undefined') {
        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', self.dealer.aimbaseId || 'winnebago');
            // script.setAttribute('data-dealer', self.dealer.id);
            // script.setAttribute('data-mfg', 'winnebago');
            document.body.appendChild(script);
        }
    } else {
        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();
    }
};

rollick.loadGAScript = function () {
    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]);
    }
};

rollick.loadTemplateScript = function () {
    var self = this;
    self.loadDealerScript();
};

rollick.loadDealerScript = function () {
    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';
            rollick.widgetReady = true;
        };
        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);
    }
};

rollick.restoreSession = function () {
    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();
    }
};

rollick.saveSession = function (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);
    }
};

rollick.openForm = function (formParameters, vehicleParameters) {
    var self = this;
    if (self.library) {
        self.library.OpenForm(formParameters, vehicleParameters);
    } else {
        window.setTimeout(function () {
            self.openForm(formParameters, vehicleParameters);
        }, 500);
    }
    return false;
};

rollick.logMessage = function (...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(', '));
        }
    }
};

rollick.matchTemplate = function (templateIdentifiers) {
    var self = this;
    var htmlContent = document.head.innerHTML + document.body.innerHTML;
    var template = '';
    if (jQuery().jquery) {
        self.jq = jQuery;
    }
    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;
};

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

rollick.setCookie = function (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;
};

rollick.getCookie = function (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;
};

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

rollick.resumeSession = function () {
    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);
        }
    }
};

rollick.sendCode = function (email, vehicle) {
    var self = this;
    if (Aimbase && Aimbase.Analytics) {
        try {
            var host = location.hostname;
            if (host && email) {
                var qs = '?dealerId=txt-' + rollick.siteId.toLowerCase();
                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);
        }
    }
};

rollick.resumeSessionCode = function (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 || {};
                        let isPreorder = false;
                        if (rollick.leadType.toLowerCase() == 'pre-order') {
                            isPreorder = true;
                        }
                        if (self.library) {
                            self.library.jobsLoop = -1;
                            if (self.library.IsEmployeeVerificationFlow()) {
                                self.library.EmployeeVerificationSuccess();
                            }
                            else {
                                if (!isPreorder) 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);
                        }
                        if (isPreorder) {
                            try {
                                var iframe = rollick.jq('#rollick-modal')[0].contentWindow;
                                iframe.postMessage({ command: 'user data', customer: rollick.user }, '*');
                            } catch (e) {
                            }
                        }
                    }
                });
            }
        } catch (err) {
            console.error(err);
        }
    }
};

rollick.resumeSessionByEmail = async function (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) {
            if (!rollick.page.vehicles[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 || ''
                }
                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);
        }
    }
};

rollick.initSession = function () {
    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);
};

rollick.dealerScriptLoaded = function () {
    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();
    }

};

rollick.overflowSet = function () {
    rollick.page['body-overflow'] = rollick.jq('html').css('overflow');
    rollick.jq('html').css('overflow', 'hidden');
};

rollick.overflowUnset = function () {
    rollick.jq('html').css('overflow', rollick.page['body-overflow']);
};

rollick.getInventory = async function (id) {
    let self = this;
    let result = null;
    try {
        var options = {
            type: 'POST',
            contentType: 'application/json; charset=utf-8',
            data: JSON.stringify({ inventoryId: id, useV1: true }),
            dataType: 'json',
            url: self.endpoints.inventoryAPI + '/info/',
            traditional: false
        };
        result = await self.jq.ajax(options);
        return result;
    } catch (e) {
        return result;
    }
}

rollick.appendLeadFields = function(leadPayload, drPayload) {
    if (drPayload.prequal && drPayload.prequal.hasData) leadPayload.appendPrequal = true;
    return leadPayload;
}

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