// 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: '167.114.118.210',
    vehicles: [],
    siteId: '',
    redirectUrl: '',
    userId: '',
    sessionId: '',
    source: '',
    campaign: '',
    accessories: [],
    kits: [],
    vehicle: {},
    year: '',
    blank: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=',
    golfCartPlaceholder: 'https://cdn.rollick.io/images/savings-finder/golfcart-silhouette.png',
    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: {
        tor: ['arcticcatoffroad.txtsv.com', 'textronoffroad.txtsv.com', 'textronoffroad.stagesr.com'],
        ezg: ['ezgo.txtsv.com', 'ezgo.stagesr.com', 'redesign.ezgo.stagesr.com'],
        arc: ['www.arcticcat.com', 'arcticcat.com', 'stage.arcticcat.com'],
        arc2: ['arcticcat.txtsv.com', 'arcticcat.stagesr.com', 'snow.arcticcat.stagesr.com'],
    },
    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',
    form_ttp_select: '.rollick-form-ttp-select',
    ea_ttp: ["0-6 Months", "6-12 Months", "No Intention"],
    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,
    windowOpened: false,
    timeToPurchase: ["Next 2 days","3 to 7 days","8 to 14 days","15 to 30 days","1 to 3 months","In over 3 months"],
    disclaimers: {
        'ARC2': {
            'Off Road': {
                '*': {
                    '2018': 'Arctic Cat Off Road Rebrand kits are available at no cost for all Model Year 2018 units.'
                },
            },
            'Snow': {
                '*': {
                    '2021': 'Online Pre-Order Deposits are available for U.S. and Canadian customers only.',
                    '2022': 'Online Pre-Order Deposits are available for U.S. and Canadian customers only.'
                }
            }
        }
    },
    dealersList: [],
    dealers: null,
    enablePreselect: {"ARC2":true,"ARC":true,"TOR":true,"EZG":true},
    brandCode: 'ARC2',
    paymentInfo: null,
    paymentTry: 0,
    abandoned: null,
    deposit: 500,
    scriptLoaded: {},
    submitted: false,
    keys: {
        arc2: {
            'US': { id: '$payment_id_US', key: '$payment_key_US' },
            'CA': { id: '$payment_id_CA', key: '$payment_key_CA' },
        }
    },
    locateDealerBusy: false,
    div: '',
    bfh: {"arc2":{"Off Road":{"enabled":true,"url":"https://arcticcat.txtsv.com/shopping-tools/dealer-driveway"},"Snow":{"enabled":false,"url":""}},"ezg":{"enabled":true,"url":"https://ezgo.txtsv.com/personal/shopping-tools/find-dealer/dealer-driveway"}},
    inseason: {"ezg":false,"arc":false,"tor":false},
    useNewACDatafile: true,
    isFormSubmitted: false,
    isBusy: false,
    vehiclesRemaining: null,
    cart: {},
    rolGAEnabled: 'true',
    rolGAId: '282506840',
    rolGAProperty: 'qa.gorollick.com',
    areaOfInterestSelect: [
        {
            text: 'I am a consumer interested in E-Z-GO personal transportation vehicles (PTVs) for personal use.',
            value: 'ConsumerPTV'
        },
        {
            text: 'I am employed by a golf course and am interested in golf cars for that business.',
            value: 'Fleet'
        },
        {
            text: 'Other',
            value: 'Commercial'
        }
    ],

    brochureCategorySelect: [
        {
            text: 'Off-road - English',
            value: 'OffRoadEng'
        },
        {
            text: 'Off-road - Francais',
            value: 'OffRoadFr'
        },
        {
            text: 'Snow - English',
            value: 'SnowEng'
        },
        {
            text: 'Snow - Francais',
            value: 'SnowFr'
        }
    ],

    snowmageddonPreviewListId: 174,

    initData: function () {
        if (!rq) return;
        rollick.StartListener();
        var host = location.hostname.toLowerCase();
        if (this.hosts.tor.indexOf(host) != -1) {
            this.siteId = 'TOR';
        } else if (this.hosts.ezg.indexOf(host) != -1) {
            this.siteId = 'EZG';
        } else if (this.hosts.arc.indexOf(host) != -1) {
            this.siteId = 'ARC';
        } else if (this.hosts.arc2.indexOf(host) != -1) {
            this.siteId = 'ARC2';
        }
        if ('ARC2' != '') {
            this.siteId = ('ARC2').toUpperCase();
        }
        var isTOR = (this.siteId == 'TOR');
        var isEZGO = (this.siteId == 'EZG');
        var isAC = (this.siteId == 'ARC');
        var isAC2 = (this.siteId == 'ARC2');
        var dataFile = '';
        var ts = (new Date()).valueOf();
        if (isTOR) dataFile = 'data-textron.js';
        if (isEZGO) dataFile = 'data-ezgo.js';
        if (isAC || isAC2) {
            dataFile = 'data-arcticcat-combined-1.js';
            if (rollick.useNewACDatafile) {
                dataFile = 'data-arcticcat.js';
            }
            if (location.hostname.toLowerCase().indexOf('stagesr.com') != -1 && rollick.widget.toLowerCase().indexOf('widget.rollick.io') != -1) {
                rollick.maintenance = true;
                delete rollick.preorder;
                alert('Staging Site is pointing to production URL. Aborting initialization process.');
            }
        }
        rollick.brandCode = this.siteId;

        if (!dataFile) {
            if (window.console && rollick.debugMode) console.log('Unable to detect OEM brand');
            return;
        }
        this.loadVehicleData(dataFile);

        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', 'textron');
            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;
                }
                var dealerId = rollick.getSearchParams('dealerid');
                if (dealerId) {
                    sessionStorage['rollick-dealer-id'] = dealerId;
                    sessionStorage['rollick-allow-preorder'] = 'Yes';
                }
                rq('#rollick-cart').off('click').on('click', function () { rollick.openCart(); return false; });
                rq('#rollick-cart-mobile').off('click').on('click', function () { rollick.openCart(); return false; });
                if (rollick.preorder && typeof rollick.preorder.updateCartCount == 'function') {
                    rollick.preorder.updateCartCount(rollick.preorder.getCartCount());
                }
                rollick.loadCart();
                if (Aimbase.Analytics.GetFieldValue('wst_ambassador') && !sessionStorage['ambassador']) {
                    sessionStorage['ambassador'] = unescape(Aimbase.Analytics.GetFieldValue('wst_ambassador'));
                }
            }
            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;
            }
            var dealerId = rollick.getSearchParams('dealerid');
            if (dealerId) {
                sessionStorage['rollick-dealer-id'] = dealerId;
                sessionStorage['rollick-allow-preorder'] = 'Yes';
            }
            rq('#rollick-cart').off('click').on('click', function () { rollick.openCart(); return false; });
            rq('#rollick-cart-mobile').off('click').on('click', function () { rollick.openCart(); return false; });
            if (rollick.preorder && typeof rollick.preorder.updateCartCount == 'function') {
                rollick.preorder.updateCartCount(rollick.preorder.getCartCount());
            }
            rollick.loadCart();
            if (Aimbase.Analytics.GetFieldValue('wst_ambassador') && !sessionStorage['ambassador']) {
                sessionStorage['ambassador'] = unescape(Aimbase.Analytics.GetFieldValue('wst_ambassador'));
            }
        }

        //GA
        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 (typeof rollick.rolGAId != 'undefined' && typeof rollick.rolGAProperty != 'undefined') {
            ga('create', rollick.rolGAId, 'auto', { 'name': 'rol', 'allowLinker': true });
            ga('rol.require', 'linker');
            ga('rol.linker:autoLink', [rollick.rolGAProperty]);
            rollick.rolGAEnabled = true;
        }

        if (typeof Cookies === 'undefined') {
            var s = document.createElement('script');
            s.async = true;
            s.id = 'Cookies';
            s.type = 'text/javascript';
            s.src = '//cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js';
            s.onload = function () {
                rollick.loadTypeahead();
            }
            s.onerror = function () {
                rollick.maintenance = true;
            }
            var t = document.getElementsByTagName('script')[0];
            t.parentNode.insertBefore(s, t);
        }

        rollick.loadCSS();
        return;
    },

    async loadVehicleData(dataFile) {
        var self = this;
        var isTOR = (self.siteId == 'TOR');
        var isEZGO = (self.siteId == 'EZG');
        var isAC = (self.siteId == 'ARC');
        var isAC2 = (self.siteId == 'ARC2');
        rollick.brandCode = self.siteId;
        var data = null;
        try {
            data = await rq.get(rollick.widget + '/widgets/vehicles/' + dataFile);
        } catch (e) {
        }
        rollick.vehicles = [];
        if (data) {
            var i = 0;
            var prevVehicle = null;
            var COLUMNS = {};
            data.split('\n').forEach(function (line) {
                if (i == 0) {
                    if (line.charCodeAt(line.length - 1) == 13) line = line.substring(0, line.length - 1);
                    var columnNames = line.split(',');
                    for (var c = 0; c < columnNames.length; c++) {
                        COLUMNS[columnNames[c]] = c;
                    }
                }
                if (i > 0) {
                    if (line) {
                        if (line.charCodeAt(line.length - 1) == 13) line = line.substring(0, line.length - 1);
                        var elements = line.split(',');
                        if (elements.length >= 4) {
                            elements.forEach(function (e) { e = e.trim(); });
                            var vehicle = { segment: 'Powersports', category: '', brand: '', vehicleName: '', modelName: '', color: '', msrpUSD: null, msrpCAD: null, colorAdditionalUSD: null, colorAdditionalCAD: null, image: '' };
                            if (isAC2 || isTOR) {
                                elements = rollick.csvToArray(line)[0];
                                var category = elements[COLUMNS['Type']].toLowerCase();
                                if (category == 'kit') {
                                    vehicle = null;
                                    if (prevVehicle) {
                                        if (rollick.vehicles.length) {
                                            var vehicleIndex = rollick.vehicles.length - 1;
                                            var kVehicle = rollick.vehicles[vehicleIndex];
                                            kVehicle.hasKits = true;
                                            if (!kVehicle.kits) kVehicle.kits = [];
                                            kVehicle.kits.push({ part: elements[COLUMNS['Model']], item: elements[COLUMNS['Model']], msrpUSD: parseFloat(elements[COLUMNS['MSRP (USD)']] || '0'), msrpCAD: parseFloat(elements[COLUMNS['MSRP (CAD)']] || '0'), saleUSD: parseFloat(elements[COLUMNS['Sale Price (USD)']] || '0'), saleCAD: parseFloat(elements[COLUMNS['Sale Price (CAD)']] || '0'), image: elements[COLUMNS['Image']], mfgModelCode: elements[COLUMNS['Model Code']] });
                                        }
                                    }
                                } else {
                                    if (category === 'snowmobile') {
                                        vehicle.category = 'Snowmobiles';
                                        vehicle.brand = 'Arctic Cat Snow';
                                        vehicle.brandCode = 'ARC';
                                        vehicle.type = 'Snow';
                                    }
                                    if (category === 'side-by-side') {
                                        vehicle.category = 'SxS/UTVs';
                                        vehicle.brand = 'Arctic Cat Off Road';
                                        vehicle.brandCode = 'TOR';
                                        vehicle.type = 'Off Road';
                                    }
                                    if (category === 'atv') {
                                        vehicle.category = 'ATVs';
                                        vehicle.brand = 'Arctic Cat Off Road';
                                        vehicle.brandCode = 'TOR';
                                        vehicle.type = 'Off Road';
                                    }
                                    vehicle.vehicleName = elements[COLUMNS['Vehicle']].trim();
                                    vehicle.modelName = elements[COLUMNS['Model']].trim();
                                    vehicle.year = elements[COLUMNS['Year']].trim();
                                    vehicle.track = elements[COLUMNS['Track/Lug']].trim();
                                    vehicle.suspension = elements[COLUMNS['Suspension']].trim();
                                    vehicle.starter = elements[COLUMNS['Starter']].trim();
                                    vehicle.color = elements[COLUMNS['Color']].trim();
                                    vehicle.msrpUSD = parseFloat(elements[COLUMNS['MSRP (USD)']] || '0');
                                    vehicle.msrpCAD = parseFloat(elements[COLUMNS['MSRP (CAD)']] || '0');
                                    vehicle.saleUSD = parseFloat(elements[COLUMNS['Sale Price (USD)']] || '0');
                                    vehicle.saleCAD = parseFloat(elements[COLUMNS['Sale Price (CAD)']] || '0');
                                    vehicle.colorAdditionalUSD = 0;
                                    vehicle.colorAdditionalCAD = 0;
                                    vehicle.image = elements[COLUMNS['Image']];
                                    vehicle.hideMSRP = false;
                                    vehicle.hasKits = false;
                                    prevVehicle = vehicle;
                                    if (COLUMNS['RAQ (USD)']) {
                                        vehicle.RAQ = {
                                            'US': elements[COLUMNS['RAQ (USD)']].toLowerCase() == 'x',
                                            'CA': elements[COLUMNS['RAQ (CAD)']].toLowerCase() == 'x',
                                        }
                                        vehicle.PRE = {
                                            'US': elements[COLUMNS['Pre-Order (USD)']].toLowerCase() == 'x',
                                            'CA': elements[COLUMNS['Pre-Order (CAD)']].toLowerCase() == 'x',
                                        }
                                    }
                                    if (COLUMNS['Model Code']) {
                                        vehicle.mfgModelCode = elements[COLUMNS['Model Code']].trim();
                                        if (rollick.preorder) {
                                            vehicle.depositUSD = parseInt(elements[COLUMNS['Variable Deposit (USD)']] || rollick.DEFAULT_DEPOSIT_AMOUNT); //rollick.DEFAULT_DEPOSIT_AMOUNT || 0;
                                            vehicle.depositCAD = parseInt(elements[COLUMNS['Variable Deposit (CAD)']] || rollick.DEFAULT_DEPOSIT_AMOUNT);
                                        }
                                    }
                                    if (COLUMNS['Track Type']) vehicle.trackType = elements[COLUMNS['Track Type']].trim();
                                }
                            }
                            if (vehicle) rollick.vehicles.push(vehicle);
                        }
                    }
                }
                i++;
            });
        }
    },

    roTrackGA: function (category, action, label, value) {
        if (rollick.rolGAEnabled) {
            var category = category || "",
                action = action || "",
                label = label || "",
                value = value || "";
            var rolTrackingObj = { hitType: 'event', eventCategory: category, eventAction: action }; //required fields
            if (label) rolTrackingObj['eventLabel'] = label; //optional populate only when available
            if (value) rolTrackingObj['eventValue'] = value; //optional populate only when available 
            ga('rol.send', rolTrackingObj);
        }
    },

    getQuote: function (vehicle, options) {
        var self = this;
        if (location.pathname == '/activation-sign' || location.pathname == '/event-email-sign') {
            if (self.debugMode) {
                console.log('getQuote cancelled');
            }
            return;
        }
        if (!rollick.vehicles.length) {
            window.setTimeout(function () {
                self.getQuote(vehicle, options);
            }, 250);
        }
        rollick.visited = {};
        rollick.leadType = (options && options.leadType || 'Quote') || 'Quote';
        if (!options) options = {};
        if (!options.country && location.href.toLowerCase().indexOf("currency=cad") != -1) {
            options.country = 'CA';
        }
        rollick.country = options.country || 'US';
        if (options && (location.href.toLowerCase().indexOf('dealer-pre-order') != -1 || rollick.dealerMode || options.dealer)) {
            options.dealer = true;
            options.leadType = 'Pre-order';
            rollick.leadType = 'Pre-order';
            rq('.standard-marquee__headline').text('Dealer Pre-Order');
            document.title = 'Dealer Pre-Order | Arctic Cat';
            if (rollick.preorder) {
                if ((rollick.preorder.ends || 0) < (new Date()).valueOf()) {
                    if (options.div) rq(options.div).html('<div style="text-align: center; margin-top: 35px;">The Model Year 2025 Pre-order window has closed.</div>');
                    return;
                }
            } else {
                if (options.div) rq(options.div).html('<div style="text-align: center; margin-top: 35px;">Model Year 2023 Pre-orders will begin on April 19, 2022 and run through May 3, 2022.</div>');
                return;
            }
        }
        if (options.country == "CA") {
            vehicle.deposit = vehicle.depositCAD || rollick.deposit;
        }
        if (options.country == "US" || !options.country) {
            vehicle.deposit = vehicle.depositUSD || rollick.deposit;
        }
        if ((rollick.dealerMode || options.dealer) && options.leadType.toLowerCase() == 'pre-order') {
            if (rollick.preorder && typeof rollick.preorder.getQuote == 'function') {
                return rollick.preorder.getQuote(vehicle, options);
            }
        }
        //delete sessionStorage['rollick-dealer-id'];
        if (window.console && rollick.debugMode) {
            console.log(vehicle);
            console.log(options);
        }
        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 || '';
        let preOrder = false;
        if (rollick.leadType.toLowerCase() == 'pre-order') {
            if (!rollick.div && rollick.settings && rollick.settings.drEnabled) {
                preOrder = rollick.dealer.preorder;
            } else {
                preOrder = rollick.preorder ? true : false;
            }
            if (preOrder) {
                if ((rollick.preorder.ends || 0) < (new Date()).valueOf()) {
                    rollick.openCart();
                    return;
                }
            } else {
                rollick.openCart();
                return;
            }
        }
        if (vehicle.year) {
            var yr = vehicle.year || '';
            if (yr.length == 4) {
                try {
                    yr = parseInt(yr);
                    if (yr <= ((new Date()).getFullYear() + 2)) {
                        rollick.year = yr.toString();
                    }
                } catch (e) { }
            }
        } else {
            if (!rollick.year || (this.siteId != 'EZG')) rollick.year = '';
        }
        if (vehicle.modelName) {
            vehicle.modelName = vehicle.modelName.trim();
        }
        if (vehicle.starter) {
            vehicle.starter = vehicle.starter.trim();
        }
        if (vehicle.suspension) {
            vehicle.suspension = vehicle.suspension.trim();
        }
        if (vehicle.track) {
            vehicle.track = vehicle.track.trim();
        }
        if (vehicle.color) {
            vehicle.color = vehicle.color.trim();
        }
        if (vehicle.image) vehicle.image = vehicle.image.trim();
        if (vehicle.image64) image64 = vehicle.image64.trim();
        if (vehicle.image && vehicle.image.indexOf(';base64,') != -1) {
            image64 = vehicle.image;
            delete vehicle.image;
        }
        if (vehicle.accessories) accessories = vehicle.accessories.slice();
        if (options.customFlayout) rollick.customFlayout = options.customFlayout;
        if (options.redirectUrl) rollick.redirectUrl = options.redirectUrl;
        else rollick.redirectUrl = '';
        if (options.dealer) rollick.dealerMode = true;
        else rollick.dealerMode = false;
        rollick.vehicleParams = {};
        rollick.paymentInfo = null;
        rollick.abandoned = null;
        rollick.paymentTry = 0;

        if (!vehicle.color) {
            if (typeof event !== 'undefined') {
                if (rq(event.target).closest('.model-list-item').length) vehicle.color = rq(event.target).closest('.model-list-item').find('.model-color-choice-wrapper.active').first().text().trim();
                if (rq(event.target).closest('.model-introduction').length) vehicle.color = rq(event.target).closest('.model-introduction').find('.model-color-choice-wrapper.active:visible').first().text().trim();
            }
        }
        if (this.siteId == 'ARC2') {
            var year = vehicle.year || rollick.year;
            var vehType = (vehicle.type || '').trim();
            var vehicleName = (vehicle.vehicleName || '').trim();
            var modelName = (vehicle.modelName || '').trim();
            var color = (vehicle.color || '').trim();
            var track = (vehicle.track || '').trim();
            var trackType = (vehicle.trackType || '').trim();
            var suspension = (vehicle.suspension || '').trim();
            var starter = (vehicle.starter || '').trim();
            var kit = (vehicle.kit || '').trim();
            var deposit = parseFloat(vehicle.deposit || rollick.DEFAULT_DEPOSIT_AMOUNT || '0');
            var modelCode = (vehicle.modelCode || vehicle.mfgModelCode || '').trim();
            if (!vehType && self.getSearchParams('category')) {
                var vehCategory = self.getSearchParams('category').trim().toLowerCase();
                if (vehCategory) {
                    if (vehCategory[0] == 's') vehType = 'Snow';
                    if (vehCategory[0] == 'o') vehType = 'Off Road';
                }
            }
            var vehicleParameter = { type: vehType, vehicleName: vehicleName, modelName: modelName, year: year, color: color, track: track, trackType: trackType, suspension: suspension, starter: starter, kit: kit, deposit: deposit, modelNumber: modelCode };
            rollick.vehicleParams = vehicleParameter;
            rollick.deposit = deposit;
            delete vehicle.trims;
            rollick.lead_headline = 'REQUEST A QUOTE';
            var vehicleFound = false;
            self.vehiclesRemaining = null;
            if (modelCode) {
                // for Snow
                let vehicles = rollick.vehicles.filter(function (v) { return v.year == year && v.mfgModelCode.toLowerCase() === modelCode.toLowerCase() && rollick.isAvailable(v, rollick.leadType, options.country); });
                if (vehicles.length == 0) return false;
                if (vehicles.length == 1) {
                    vehicle = vehicles.pop();
                    vehicleFound = true;
                }
            }
            if (!vehicleFound && modelName && color) {
                // for Off-Road
                let vehicles = rollick.vehicles.filter(function (v) { return v.year == year && v.modelName.toLowerCase() === modelName.toLowerCase() && (color === '' || v.color.toLowerCase() === color.toLowerCase()) && rollick.isAvailable(v, rollick.leadType, options.country); });
                if (vehicles.length == 1) {
                    vehicle = vehicles.pop();
                    vehicleFound = true;
                }
            }
            if (!vehicleFound && vehicleName) {
                // for model header level
                let vehicles = rollick.vehicles.filter(function (v) { return v.year == year && v.vehicleName.toLowerCase() === vehicleName.toLowerCase() && rollick.isAvailable(v, rollick.leadType, options.country); });
                if (vehicles.length == 1) {
                    vehicle = vehicles.pop();
                    vehicleFound = true;
                }
                if (vehicles.length > 1) {
                    vehicleFound = true;
                    self.vehiclesRemaining = JSON.parse(JSON.stringify(vehicles));
                }
            }
            if (!vehicleFound && vehType) {
                // for vehicle type
                let vehicles = rollick.vehicles.filter(function (v) { return (!year || v.year == year) && v.type.toLowerCase() === vehType.toLowerCase() && rollick.isAvailable(v, rollick.leadType, options.country); });
                if (vehicles.length == 1) {
                    vehicle = vehicles.pop();
                    vehicleFound = true;
                }
                if (vehicles.length > 1) {
                    vehicleFound = true;
                    self.vehiclesRemaining = JSON.parse(JSON.stringify(vehicles));
                }
            }
            if (!vehicleFound && !rollick.div) {
                if (window.console) console.error('Unable to find matching vehicle: ' + year + ' ' + modelName + ' ' + modelCode);
                return false;
            }
            if (!rollick.div && rollick.settings && rollick.settings.drEnabled) {
                if (!vehicle && !self.vehiclesRemaining) {
                    return;
                }
                if (self.vehiclesRemaining && self.vehiclesRemaining.length) {
                    self.openSKUPicker(self.vehiclesRemaining, options);
                    return;
                }
                if (vehicle && !vehicle.inventoryId) {
                    var accessoriesText = '';
                    var vehicleParameters = new Object();
                    vehicleParameters.color = vehicle.color;
                    vehicleParameters.deposit = vehicle.deposit;
                    vehicleParameters.image = vehicle.image;
                    vehicleParameters.make = vehicle.brand;
                    vehicleParameters.model = vehicle.modelName;
                    vehicleParameters.modelCode = vehicle.mfgModelCode;
                    vehicleParameters.msrp = vehicle.saleUSD || vehicle.msrpUSD;
                    vehicleParameters.price = vehicle.saleUSD || vehicle.msrpUSD;
                    vehicleParameters.year = vehicle.year;
                    vehicleParameters.category = vehicle.category;
                    vehicleParameters.type = vehicle.category;
                    if (vehicle.track) vehicleParameters.track = vehicle.track;
                    if (vehicle.trackType) vehicleParameters.trackType = vehicle.trackType;
                    if (vehicle.starter) vehicleParameters.starter = vehicle.starter;
                    if (vehicle.suspension) vehicleParameters.suspension = vehicle.suspension;
                    if (vehicle.type == 'Snow') rollick.brandCode = 'ARC';
                    else rollick.brandCode = 'TOR';
                    // vehicleParameters.reservable = rollick.isAvailable(vehicle, 'Pre-order', options.country);
                    vehicleParameters.preorderable = rollick.isAvailable(vehicle, 'Pre-order', options.country);



                    if (options.country == 'CA') {
                        vehicleParameters.msrp = vehicle.saleCAD || vehicle.msrpCAD;
                        vehicleParameters.price = vehicle.saleCAD || vehicle.msrpCAD;
                        deposit = vehicle.depositCAD || rollick.DEFAULT_DEPOSIT_AMOUNT || 0;
                        vehicleParameters.deposit = deposit;
                        vehicle.deposit = deposit;

                    }
                    if (options.country == 'US' || !options.country) {
                        deposit = vehicle.depositUSD || rollick.DEFAULT_DEPOSIT_AMOUNT || 0;
                        vehicleParameters.deposit = deposit;
                        vehicle.deposit = deposit;
                    }
                    if (accessories) {
                        vehicleParameters.accessories = accessories;
                        accessoriesText = accessories.join(',');
                        vehicleParameters.price = accessories.reduce((a, b) => a + (b.cost ? parseFloat(b.cost) : 0), vehicleParameters.price);
                    }

                    if (!vehicleParameters.id) {
                        // auto-generate vehicle id
                        vehicleParameters.id = self.CRC32(vehicleParameters.year + vehicleParameters.make + vehicleParameters.model + vehicleParameters.color + vehicleParameters.price + accessoriesText);
                        if (options.leadType && options.leadType.toLowerCase() == 'pre-order') {
                            vehicleParameters.id = self.generateUUID(); // always unique vehicle id for pre-orders
                        }
                    }

                    if (window.tray && window.tray.active) window.tray.closeTray();
                    let module = 'request-a-quote';
                    if (options.module) module = options.module;
                    if (rollick.leadType.toLowerCase() == 'pre-order') module = 'reserve-now';
                    var vehicleParametersJsonString = JSON.stringify(vehicleParameters);

                    if (image64) {
                        // upload image64 and replace the vehicleParameters.image with the URL;
                        console.log('upload vehicle image');
                        let imageUrlPromise = rollick.uploadVehicleImage(image64);
                        imageUrlPromise.then(function (imageUrl) {
                            console.log('vehicle image url: ' + imageUrl);
                            if (imageUrl) {
                                vehicleParameters.image = imageUrl;
                                image64 = '';
                            } else {
                                vehicleParameters.image64 = image64;
                            }
                            vehicleParametersJsonString = JSON.stringify(vehicleParameters);
                            if (self.windowOpened) {
                                return;
                            }
                            self.windowOpened = true;
                            rollick.openTrayArc2(self, module, options, vehicleParametersJsonString);
                            window.setTimeout(function () {
                                self.windowOpened = false;
                            }, 800);
                        });
                    } else {
                        if (self.windowOpened) {
                            return;
                        }
                        self.windowOpened = true;
                        rollick.openTrayArc2(self, module, options, vehicleParametersJsonString);
                        window.setTimeout(function () {
                            self.windowOpened = false;
                        }, 800);
                    }

                    window.setTimeout(function () {
                        if (window.tray && window.tray.active) window.tray.closeTray();
                    }, 500);
                    return;
                }
                if (vehType) self.vehiclesRemaining = self.vehiclesRemaining.filter(function (v) { return v.type.toLowerCase() == vehType.toLowerCase(); });
                if (year) self.vehiclesRemaining = self.vehiclesRemaining.filter(function (v) { return v.year == year; });
                if (vehicleName) self.vehiclesRemaining = self.vehiclesRemaining.filter(function (v) { return v.vehicleName.toLowerCase() === vehicleName.toLowerCase(); });
                if (modelName) self.vehiclesRemaining = self.vehiclesRemaining.filter(function (v) { return v.modelName.toLowerCase() === modelName.toLowerCase(); });
                if (color) self.vehiclesRemaining = self.vehiclesRemaining.filter(function (v) { return v.color.toLowerCase() === color.toLowerCase(); });
                if (track) self.vehiclesRemaining = self.vehiclesRemaining.filter(function (v) { return v.track.toLowerCase() === track.toLowerCase(); });
                if (trackType) self.vehiclesRemaining = self.vehiclesRemaining.filter(function (v) { return v.trackType.toLowerCase() === trackType.toLowerCase(); });
                if (suspension) self.vehiclesRemaining = self.vehiclesRemaining.filter(function (v) { return v.suspension.toLowerCase() === suspension.toLowerCase(); });
                if (starter) self.vehiclesRemaining = self.vehiclesRemaining.filter(function (v) { return v.starter.toLowerCase() === starter.toLowerCase(); });
                if (self.vehiclesRemaining.length == 1) vehicle = self.vehiclesRemaining[0];
                if (kit && vehicle) vehicle.kit = kit;
                if (vehicle && vehicle.type == 'Snow' && !vehicle.brand) vehicle.brand = 'Arctic Cat Snow';
                if (vehicle && vehicle.type == 'Off Road' && !vehicle.brand) vehicle.brand = 'Arctic Cat Off Road';
                if (self.vehiclesRemaining.length == 0) return;
            }
            if (rollick.div) {
                self.availableModels = rollick.listModels(rollick.leadType, options.country, '', vehType, '');
                self.vehiclesRemaining = self.availableModels.models.slice();
                if (self.vehiclesRemaining.length == 0) {
                    rq(rollick.div).html('<div class="rte-body-component container-narrow rollick-blurb rollick-center rollick-mb subhead">We apologize, but we were unable to find any models that matched your selection.</div><div class="rollick-mb">&nbsp;</div>');
                    return;
                }
            }
        }
        if (accessories) {
            try {
                if (accessories.length) {
                    rollick.accessories = [];
                    accessories.forEach(function (acc) {
                        var item = {
                            part: acc.part.trim(),
                            item: acc.item.trim(),
                            cost: parseFloat(acc.cost)
                        };
                        rollick.accessories.push(item);
                    });
                }
            } catch (e) {
                if (window.console) console.error('Accessories parsing error ', e);
            }
        }
        rollick.vehicleImage = null;
        if (image64) {
            vehicle.image64 = image64;
            rollick.vehicleImage = image64;
        }
        var form = 'textron/' + rollick.siteId.toLowerCase() + '/form-modal-en-us.html';
        if (this.siteId == 'ARC2') {
            if (options.div) {
                if (rq('#main-content .content-segment').length == 3) rq('#main-content .content-segment').first().remove();
                if (rq('#main-content .rte-body-component').length == 2) rq('#main-content .rte-body-component').first().remove();
                form = 'textron/' + rollick.siteId.toLowerCase() + '/form-full-en-us.html';
                try {
                    rq("main")[0].scrollIntoView();
                } catch (e) {
                }
            }
        }
        if (rollick.siteId.toLowerCase() == 'ezg') form = 'textron/' + rollick.siteId.toLowerCase() + '/redesign-form-full-en-us.html';
        if (options.mode && options.mode == 'flyout') {
            form = 'textron/' + rollick.siteId.toLowerCase() + '/redesign-form-modal-en-us.html';
        }
        if (this.siteId == 'ARC2') {
            form = 'textron/' + rollick.siteId.toLowerCase() + '/form-modal-en-us.html';
            if (options.div) {
                if (rollick.leadType.toLowerCase() == 'appointment') {
                    var dealerId = rollick.getSearchParams('dealerId');
                    var dealerNo = rollick.getSearchParams('dealerNo');
                    if (dealerId || dealerNo) {
                        form = 'textron/' + rollick.siteId.toLowerCase() + '/form-full-en-us-appointment.html';
                    } else {
                        options.leadType = 'Quote';
                        rollick.getQuote(vehicle, options);
                        return;
                    }
                } else {
                    form = 'textron/' + rollick.siteId.toLowerCase() + '/form-full-en-us.html';
                }
            }
        }
        rollick.vehicle = Object.assign({}, vehicle);
        if (!rollick.vehicle.originalImage) rollick.vehicle.originalImage = rollick.vehicle.image;
        if (this.windowOpened) {
            return;
        }
        this.windowOpened = true;
        var self = this;
        rq.get(rollick.widget + '/widgets/templates/' + form, function (data) {
            var accessoriesMSRP = 0;
            self.windowOpened = false;
            if (rollick.accessories && rollick.accessories.length) {
                rollick.accessories.forEach(function (acc) { accessoriesMSRP += parseFloat(acc.cost); });
                if (!rollick.vehicle.image64) rollick.flattenVehicleImage();
            }
            data = data.replace(/\$form_headline/g, rollick.lead_headline || '');
            data = data.replace(/\$form_vehicle_caption/g, vehicle.type == "Snow" ? "Select Your Sled" : "Select Your Vehicle");
            data = data.replace(/\$form_text/g, rollick.lead_text || '');
            data = data.replace(/\$brandName/g, 'Arctic Cat Snow');
            data = data.replace(/\$category/g, vehicle.category || '');
            data = data.replace(/\$passengers/g, vehicle.passengers || '');
            data = data.replace(/\$brandName/g, vehicle.brand || '');
            data = data.replace(/\$year/g, vehicle.year || rollick.year);
            data = data.replace(/\$vehicleName/g, vehicle.vehicleName || '');
            data = data.replace(/\$modelName/g, vehicle.modelName || '');
            var priceUSD = (vehicle.msrpUSD + (vehicle.colorAdditionalUSD || 0) + accessoriesMSRP);
            var priceCAD = (vehicle.msrpCAD + (vehicle.colorAdditionalCAD || 0) + accessoriesMSRP);
            var originalUSD = 0;
            var originalCAD = 0;

            if (vehicle.saleUSD) {
                originalUSD = vehicle.msrpUSD;
                priceUSD = (vehicle.saleUSD + (vehicle.colorAdditionalUSD || 0) + accessoriesMSRP);
            }
            if (vehicle.saleCAD) {
                originalCAD = vehicle.msrpCAD;
                priceCAD = (vehicle.saleCAD + (vehicle.colorAdditionalCAD || 0) + accessoriesMSRP);
            }
            if (priceUSD) data = data.replace(/\$msrpUSD/g, priceUSD.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 }) || '');
            if (priceCAD) data = data.replace(/\$msrpCAD/g, priceCAD.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 }) || '');
            if (originalUSD) data = data.replace(/\$originalUSD/g, originalUSD.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 }) || '');
            if (originalCAD) data = data.replace(/\$originalCAD/g, originalCAD.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 }) || '');
            data = data.replace(/\$color/g, vehicle.color || '');
            if (rollick.siteId != 'ARC2' && vehicle.image64) data = data.replace(/\$image/g, vehicle.image64 || '');
            else data = data.replace(/\$image/g, vehicle.image || '');
            if (options.country) {
                rq('.rollick-form-country-select option').each(function (a, b) {
                    if (rq(b).attr('value').toLowerCase() == options.country.toLowerCase().trim()) {
                        rq('.rollick-form-country-select').val(rq(b).attr('value'));
                    }
                });
            }
            if (options.div) {
                if (options.customFlayout) {
                    rq(options.div).html(rollick.designFlayout(data, options));
                    if (!vehicle.color) {
                        rq('.rollick-vehicle-color').addClass('rollick-hidden');
                    }
                } else {
                    rq(options.div).html(data);
                }
                if (typeof Aimbase !== 'undefined') {
                    if (Aimbase && Aimbase.Analytics && Aimbase.Analytics.SendPageAction) {
                        if (rq('.rollick-form-fp').length) Aimbase.Analytics.SendPageAction(rq('.rollick-form-fp')[0], 'Full', 'view', { 'PageAction': '19938612-bb81-4ec7-a250-7a38ba4b02e6' });
                    }
                }
                // result = vehicle.filter(i=>i.color==vehicle.color&&i.modelName==vehicle.modelName)[0]
                rq(".rollick-form-vehicle-type-select").val(vehicle.type);
                rq('.rollick-form-vehicle-vehicle-select').append(rq('<option></option>').attr('value', vehicle.vehicleName).text(vehicle.vehicleName));
                rq(".rollick-form-model-select").append(rq('<option></option>').attr('value', vehicle.modelName).text(vehicle.modelName));
                rq(".rollick-form-color-select").append(rq('<option></option>').attr('value', vehicle.color).text(vehicle.color));
                rq(".rollick-vehicle-image").attr('src', vehicle.image);
                if (originalUSD) {
                    rq('.rollick-vehicle-msrp-usd').html('<div class="vehicle-card__meta" style="display: block; text-align: unset;"><span class="meta--price__value">$' + priceUSD.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 }) + '</span> <span class="vehicle-card__meta--msrp">USD*</span></div><div class="vehicle-card__meta vehicle-marquee__price__original-price--wrap rollick-original-price"><span class="vehicle-card__meta--msrp" style="letter-spacing: initial">WAS</span>&nbsp;<span class="vehicle-marquee__price__original-price__value">$' + originalUSD.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 }) + '</span></div>');
                }
                if (originalCAD) {
                    rq('.rollick-vehicle-msrp-cad').html('<div class="vehicle-card__meta" style="display: block; text-align: unset;"><span class="meta--price__value">$' + priceCAD.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 }) + '</span> <span class="vehicle-card__meta--msrp">CAD*</span></div><div class="vehicle-card__meta vehicle-marquee__price__original-price--wrap rollick-original-price"><span class="vehicle-card__meta--msrp" style="letter-spacing: initial">WAS</span>&nbsp;<span class="vehicle-marquee__price__original-price__value">$' + originalCAD.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 }) + '</span></div>');
                }
                window.setTimeout(function () {
                    if (options.dealerid) {
                        sessionStorage['rollick-dealer-id'] = options.dealerid;
                    }
                    if (rollick.siteId == 'ARC2') self.initFullPageEvents();
                    rollick.dealerInit();
                    var zip = rollick.getQueryZip();
                    if (zip) {
                        rq(rollick.form_postalCode).addClass('has-input');
                        rq(rollick.form_postalCode).val(zip).trigger('change');
                    }
                }, 10);
            } else {
                rq('body').css('overflow', 'hidden').append(data);
                rq('.rollick-form').show();
                window.setTimeout(function () {
                    rq('.rollick-form').addClass('tray--active');
                    rq('.rollick-form-fields').show();
                    self.initFlyoutEvents();
                    rollick.validateForm();
                    rollick.dealerInit();
                }, 10);
                if (typeof Aimbase !== 'undefined') {
                    if (Aimbase && Aimbase.Analytics && Aimbase.Analytics.SendPageAction) {
                        if (rq('.rollick-form').length) Aimbase.Analytics.SendPageAction(rq('.rollick-form')[0], 'Flyout', 'view', { 'PageAction': '50d1c736-ad09-424a-af51-09b45b33af81' });
                    }
                }
            }

            rq('.rollick-form-kit-select').on('change', function () {
                rollick.vehicle.image = rollick.vehicle.originalImage;
                rollick.vehicle.kit = rq('.rollick-form-kit-select').val() || '';
                rollick.validateVehicleSelection();
            });

            // load time-to-purchase
            var ttp = rq('.rollick-form-ttp-select');
            ttp.empty();
            if (rollick.leadType.toLowerCase() != 'pre-order' && rollick.timeToPurchase && rollick.timeToPurchase.length) {
                rq('.rollick-vehicle-ttp').removeClass('rollick-hidden');
                ttp.append(rq('<option></option>').attr('value', '').attr('selected', 'selected').text(''));
                ttp.val('');
                rq.each(rollick.timeToPurchase, function (key, value) {
                    var opt = rq('<option></option>').attr('value', value).text(value);
                    ttp.append(opt);
                });
                ttp.removeClass('rollick-hidden');
            } else {
                ttp.append(rq('<option></option>').attr('value', 'N/A').text(''));
            }
            ttp.on('change', function () {
                rollick.validateForm();
            });

            // load vehicle series
            if (rq('.rollick-form-vehicle-type-select').length) {
                var c = rq('.rollick-form-vehicle-type-select');
                var types = rollick.distinctValues(rollick.vehicles, 'type');
                c.empty();
                c.append(rq('<option></option>').attr('value', '').text(''));
                c.val('');
                rq.each(types, function (key, value) {
                    var opt = rq('<option></option>').attr('value', value).text(value);
                    if (value.toLowerCase() == (vehicle.type || '').toLowerCase()) opt.attr('selected', 'selected');
                    c.append(opt);
                });
            }

            if (vehicle.trims) {
                rq('.rollick-vehicle-msrp-usd').hide();
                rq('.rollick-vehicle-trim').removeClass('rollick-hidden');
                rq('.rollick-form-first-name-value').removeClass('rollick-form-first');
                rq('.rollick-form-trim-select').addClass('rollick-form-first');
                if (vehicle.priceCAD)
                    rq(".meta--price__value").text(vehicle.priceCAD);
                if (vehicle.priceUSD)
                    rq(".meta--price__value").text(vehicle.priceUSD);
                var t = rq('.rollick-form-trim-select');
                t.empty();
                t.append(rq('<option></option>').attr('value', '').text(''));
                t.val('');
                rq.each(vehicle.trims, function (key, value) {
                    t.append(rq('<option></option>').attr('value', value.trimName).text(value.trimName));
                });
                if (vehicle.trims.length > 1) {
                    rq('.rollick-vehicle-trim').removeClass('rollick-hidden');
                    rq('.rollick-vehicle-msrp-usd').hide();
                } else {
                    rq('.rollick-vehicle-trim').addClass('rollick-hidden');
                    rq('.rollick-vehicle-msrp-usd').hide();
                    if (vehicle.trims.length == 1) {
                        t.val(vehicle.trims[0].trimName);
                        rq('.rollick-vehicle-msrp-usd').show();
                    }
                }
            } else {
                rq('.rollick-vehicle-msrp-usd').show();
                rq('.rollick-vehicle-trim').addClass('rollick-hidden');
            }
            if (options.customFlayout) {
                rq('.rollick-vehicle-msrp-usd').hide();
                rq('.rollick-msrp-disclaimer').hide();
            }

            // set events
            rq('.rollick-form-country-select').on('change', function () {
                var country = 'United States';
                if (options.country) {
                    rq('.rollick-form-country-select').hide();
                    if (options.country.toLowerCase() == 'ca') country = 'Canada';
                }
                var selectedCountry = rq('.rollick-form-country-select').val();
                if (selectedCountry.toLowerCase() == 'ca') {
                    country = 'Canada';
                    rq(rollick.form_postalCode).attr('maxlength', 7);
                    rq('.rollick-invalid-postal').text('Invalid postal code');
                }
                rq('.rollick-form-country-label').text(country);
                rq(rollick.form_postalCode).val('');
                var postal_code_label = 'ZIP Code';
                if (country != 'United States') {
                    postal_code_label = 'Postal Code';
                    rq('.rollick-vehicle-msrp-usd').hide();
                    rq('.rollick-vehicle-msrp-cad').show();
                    if (sessionStorage['rollick-zip']) {
                        if (sessionStorage['rollick-zip'].length == 7) rq(rollick.form_postalCode).val(sessionStorage['rollick-zip']);
                    }
                } else {
                    rq('.rollick-vehicle-msrp-usd').show();
                    rq('.rollick-vehicle-msrp-cad').hide();
                    if (sessionStorage['rollick-zip']) {
                        if (sessionStorage['rollick-zip'].length == 5) rq(rollick.form_postalCode).val(sessionStorage['rollick-zip']);
                    }
                }
                if (rollick.siteId != 'ARC2') {
                    postal_code_label += '*';
                }
                if (options.customFlayout) {
                    rq('.rollick-vehicle-msrp-usd').hide();
                    rq('.rollick-msrp-disclaimer').hide();
                }
                rq('.rollick-form-postal-code-label').text(postal_code_label);
            });
            rq(rollick.form_firstName)
                .add(rollick.form_lastName)
                .add(rollick.form_email)
                .add(rollick.form_phone)
                .add(rollick.form_postalCode)
                .add('.rollick-form-comment-value')
                .on('blur', function () {
                    if (rq(this).parents('.rollick-form-checkout').length) {
                        rollick.preorder.sanitize(rq(this));
                        rollick.preorder.validateForm();
                    } else {
                        rollick.sanitize(rq(this));
                        rollick.validateForm();
                    }
                }).on('focus', function () {
                    rollick.clearBorder(this);
                }).on('input', function () {
                    if (rq(this).parents('.rollick-form-checkout').length) {
                        rollick.preorder.validateForm();
                    } else {
                        rollick.validateForm();
                    }
                });
            rq('#rollick-appt-date-1')
                .on('blur', function () {
                    rollick.validateForm();
                })
                .on('focus', function () {
                    rollick.clearBorder(this);
                })
                .on('change', function () {
                    rollick.validateForm();
                });
            rq(rollick.form_phone).on('input', function (e) {
                var x = e.target.value.replace(/\D/g, '').match(/(\d{0,3})(\d{0,3})(\d{0,4})/);
                e.target.value = !x[2] ? x[1] : '(' + x[1] + ') ' + x[2] + (x[3] ? '-' + x[3] : '');
            });
            rq(rollick.form_postalCode).on('input', function (e) {
                if (rq('.rollick-form-country-select').val() == 'US') {
                    var x = e.target.value.replace(/\D/g, '').match(/(\d{0,5})/);
                    e.target.value = x[1];
                    if (/Edge/.test(navigator.userAgent) && e.target.value.length == 5) rq(e.target).change();
                } else if (rq('.rollick-form-country-select').val() == 'CA') {
                    var pc = e.target.value.toUpperCase().replace(/\ /g, '');
                    var caTest = /[a-zA-Z][0-9][a-zA-Z][0-9][a-zA-Z][0-9]/;
                    e.target.value = pc;
                    if (caTest.test(pc)) {
                        e.target.value = pc.substring(0, 3) + ' ' + pc.substring(3, 6);
                        if (/Edge/.test(navigator.userAgent) && e.target.value.length == 7) rq(e.target).change();
                    }
                }
            });
            rq(rollick.form_postalCode).on('change', function (e) {
                var countryCode = rq('.rollick-form-country-select').val();
                var brandCode = rq('.rollick-form-vehicle-type-select').val() || rollick.brandCode;
                if (brandCode == 'Off Road') brandCode = 'TOR';
                if (brandCode == 'Snow') brandCode = 'ARC';
                if (rollick.brandCode == 'EZG') brandCode = 'EZG';
                var postalCode = rq(rollick.form_postalCode).val();
                if (postalCode) rq('.rollick-specific-dealer-error').addClass('rollick-hidden');
                if (!sessionStorage['rollick-dealer-id']) rollick.locateDealer(countryCode, brandCode, postalCode);
                else {
                    // verify selected dealer supports bfh
                    rq('.rollick-not-dtd-dealer-error').addClass('rollick-hidden');
                    var bfh = (rollick.showBFH() && rq('#rollick-bfh').is(':checked')) ? true : false;
                    if (bfh) {
                        rollick.verifyDTDDealer(postalCode, sessionStorage['rollick-dealer-id'], function (result) {
                            if (!result) {
                                rq('#rollick-bfh').prop('checked', false);
                                rq('.rollick-not-dtd-dealer-error').removeClass('rollick-hidden');
                                rq('.rollick-form-comment-value').val('I am interested in "Dealer to Driveway", but outside of 50-mile range. ' + rq('.rollick-form-comment-value').val());
                            }
                        });
                    }
                }
            });
            rq('.rollick-form').keyup(function (e) {
                if (e.keyCode === 27) rq('.rollick-form-cancel').click();
                // else rollick.validateForm();
            });
            if (rollick.siteId == 'ARC2') {
                var vt = rq('.rollick-form-vehicle-type-select');
                try {
                    if (vt[0].options.length == 2) {
                        vt[0].options[1].selected = true;
                    }
                    vt.trigger('change');
                } catch (e) { }
                rollick.toggleBFH();
                if (options.bfh || rollick.getQueryDtD()) {
                    rq('#rollick-bfh').prop('checked', true);
                }
                if (options.dealerid) {
                    sessionStorage['rollick-dealer-id'] = options.dealerid;
                    rq('.rollick-specific-dealer-selected').removeClass('rollick-hidden');
                    rq('.rollick-specific-dealer-not-selected').addClass('rollick-hidden');
                    rollick.dealerDisplayDealer();
                }
                if (rollick.inseason && rollick.inseason[rollick.brandCode.toLowerCase()]) {
                    rq('.rollick-specific-dealer-not-selected').addClass('rollick-hidden');
                }
                if (rq('#rollick-specific-dealer').is(':visible')) {
                    var selectedDealer = rq('#rollick-specific-dealer').val().trim();
                    if (selectedDealer == '') {
                        rq('#rollick-specific-dealer-id').val('');
                        rq('#rollick-specific-dealer-name').val('');
                    } else {
                        if (rollick.dealersList && rollick.dealersList.length) {
                            var bMatched = false;
                            rq.each(rollick.dealersList, function (key, item) {
                                if (!bMatched && item.name == selectedDealer) {
                                    rq('#rollick-specific-dealer-id').val(item.id);
                                    rq('#rollick-specific-dealer-name').val(item.name);
                                    bMatched = true;
                                }
                            });
                            if (!bMatched) {
                                rq.each(rollick.dealersList, function (key, item) {
                                    if (!bMatched && item.name.toLowerCase() == selectedDealer.toLowerCase()) {
                                        rq('#rollick-specific-dealer-id').val(item.id);
                                        rq('#rollick-specific-dealer-name').val(item.name);
                                        bMatched = true;
                                    }
                                });
                            }
                            if (!bMatched) {
                                rq('#rollick-specific-dealer-id').val('');
                                rq('#rollick-specific-dealer-name').val('');
                            }
                        } else {
                            rq('#rollick-specific-dealer-id').val('');
                            rq('#rollick-specific-dealer-name').val('');
                        }
                    }
                }
                rq('#rollick-dealer-choice-closest').off('change').on('change', function () {
                    rq('#rollick-specific-dealer').removeClass('error');
                    if (rq('#rollick-bfh').is(':visible')) {
                        rq('#rollick-bfh').trigger('change');
                    }
                    self.validateForm();
                });
                rq('#rollick-dealer-choice-customer').off('click').on('click', function () {
                    rq('#rollick-specific-dealer').focus();
                    if (!rq('#rollick-specific-dealer').val()) {
                        rq('#rollick-specific-dealer-id').val('');
                        rq('#rollick-specific-dealer-name').val('');
                    }
                    self.validateForm();
                });
            }

            if (options.country) {
                rq('.rollick-form-country-select option').each(function (a, b) {
                    if (rq(b).attr('value').toLowerCase() == options.country.toLowerCase().trim()) {
                        rq('.rollick-form-country-select').val(rq(b).attr('value'));
                        rq('.rollick-form-country-select').triggerHandler('change');
                    }
                });
            }

            // set screens
            rq('.rollick-form-fields').css('overflow', 'auto');
            rq('.rollick-form-first').focus();
            if (options.div) {
                if (rq('.rollick-form-fields').length) {
                    rq('.rollick-form-fields')[0].scrollIntoView(true);
                    var scrolledY = window.scrollY;
                    if (scrolledY) {
                        window.scroll(0, scrolledY - 100);
                    }
                }
            } else {
                rq('.rollick-form-fields')[0].scrollTop = 0;
            }

            // tracking
            if (typeof Aimbase !== 'undefined') {
                if (Aimbase && Aimbase.Analytics && Aimbase.Analytics.AddListener) {
                    if (rq('.rollick-form-submit').length) Aimbase.Analytics.AddListener(rq('.rollick-form-submit')[0], 'Submit', 'click', { 'PageAction': 'bc96b92b-fadb-44c8-a570-24e182d79216' });
                    if (rq('.rollick-form-close-button').length) Aimbase.Analytics.AddListener(rq('.rollick-form-close-button')[0], 'Abandon', 'click', { 'PageAction': 'ceab5569-b68c-4730-af7b-fa225078423d' });
                }
            }

            rq('#rollick-bfh').on('change', function (e) {
                rollick.dealerLoad();
                rollick.validateForm();
                var countryCode = rq('.rollick-form-country-select').val();
                var brandCode = rq('.rollick-form-vehicle-type-select').val() || rollick.brandCode;
                if (brandCode == 'Off Road') brandCode = 'TOR';
                if (brandCode == 'Snow') brandCode = 'ARC';
                if (rollick.brandCode == 'EZG') brandCode = 'EZG';
                var postalCode = rq(rollick.form_postalCode).val();
                if (postalCode) rq('.rollick-specific-dealer-error').addClass('rollick-hidden');
                if (!sessionStorage['rollick-dealer-id']) rollick.locateDealer(countryCode, brandCode, postalCode);
                else {
                    // verify selected dealer supports bfh
                    rq('.rollick-not-dtd-dealer-error').addClass('rollick-hidden');
                    var bfh = (rollick.showBFH() && rq('#rollick-bfh').is(':checked')) ? true : false;
                    if (bfh) {
                        rollick.verifyDTDDealer(postalCode, sessionStorage['rollick-dealer-id'], function (result) {
                            if (!result) {
                                rq('#rollick-bfh').prop('checked', false);
                                rq('.rollick-not-dtd-dealer-error').removeClass('rollick-hidden');
                                rq('.rollick-form-comment-value').val('I am interested in "Dealer to Driveway", but outside of 50-mile range. ' + rq('.rollick-form-comment-value').val());
                            }
                        });
                    }
                }
            });
        });
        return;
    },

    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;
    },

    initFullPageEvents() {
        var self = this;
        try {
            rq('.rollick-form').addClass('tray--active');
            var models = self.availableModels.summary.slice();
            var activeIndex = -1;
            if (models.length > 1) rq('.rollick-carousel-model-nav').removeClass('rollick-hidden');
            var carousel = rq('.carousel-model');
            carousel.empty();
            var vehicles = '';
            for (var i = 0; i < models.length; i++) {
                vehicles += '<div class="item' + (i == 0 ? ' active"' : '"') + ' style="background-image: url(' + models[i].image + ')"></div>';
            }
            carousel.html(vehicles);
            rq('.rollick-multiple-models .carousel-next').off('click').on('click', { d: 'n' }, rotateModel);
            rq('.rollick-multiple-models .carousel-prev').off('click').on('click', { d: 'p' }, rotateModel);
            rq('.rollick-multiple-models .carousel-show-skus').off('click').on('click', function () {
                let options = { country: rollick.country, leadType: rollick.leadType || 'Quote' };
                if (!rollick.dealerMode && rollick.settings && rollick.settings.drEnabled) {
                    let vehicleName = models[activeIndex].model;
                    self.vehiclesRemaining = self.availableModels.models.slice().filter(function (vehicle) { return vehicle.vehicleName.toLowerCase() == vehicleName.toLowerCase(); });
                    if (self.vehiclesRemaining && self.vehiclesRemaining.length == 1) {
                        self.getQuote(self.vehiclesRemaining[0], options);
                    }
                    if (self.vehiclesRemaining && self.vehiclesRemaining.length > 1) {
                        self.openSKUPicker(self.vehiclesRemaining, options);
                    }
                    return;
                } else {
                    if (options.leadType.toLowerCase() == 'pre-order') {
                        if (rollick.preorder && typeof rollick.preorder.getQuote == 'function') {
                            if (options.country == 'CA') {
                                self.vehiclesRemaining[0].deposit = self.vehiclesRemaining[0].depositCAD;
                            }
                            if (options.country == 'US' || !options.country) {
                                self.vehiclesRemaining[0].deposit = self.vehiclesRemaining[0].depositUSD;
                            }
                            if (self.vehiclesRemaining && self.vehiclesRemaining.length == 1) {
                                return rollick.preorder.getQuote(self.vehiclesRemaining[0], options);
                            }
                            if (self.vehiclesRemaining && self.vehiclesRemaining.length > 1) {
                                return rollick.preorder.getQuote({ modelName: self.vehiclesRemaining[0].vehicleName }, options);
                            }
                        }
                    }
                    rq('.rollick-blurb').text('Please select your trim and accessory package plus a few personal details so your local authorized dealer can follow-up with a personalized quote for the vehicle you\'re interested in.');
                    showSkus();
                }
            });
            if (models.length) {
                activeIndex = 0;
                if (rq('.rollick-form-country-select :checked').val() == 'CA') {
                    rq('.rollick-multiple-models .rollick-vehicle-msrp-usd').addClass('rollick-hidden');
                    rq('.rollick-multiple-models .rollick-vehicle-msrp-cad').removeClass('rollick-hidden');
                } else {
                    rq('.rollick-multiple-models .rollick-vehicle-msrp-usd').removeClass('rollick-hidden');
                    rq('.rollick-multiple-models .rollick-vehicle-msrp-cad').addClass('rollick-hidden');
                }
                rq('.rollick-multiple-models .carousel-model-caption').html('<h4>' + models[0].model + '</h4>');
                rq('.rollick-multiple-models .carousel-status').text('1 of ' + models.length);
                if (models[0].sale) {
                    rq('.rollick-multiple-models .rollick-vehicle-msrp-usd .rollick-original-price').removeClass('rollick-invisible');
                    rq('.rollick-multiple-models .rollick-vehicle-msrp-cad .rollick-original-price').removeClass('rollick-invisible');
                    rq('.rollick-multiple-models .rollick-vehicle-msrp-usd .meta--price__value').text(self.formatCurrency(models[0].sale, '$'));
                    rq('.rollick-multiple-models .rollick-vehicle-msrp-cad .meta--price__value').text(self.formatCurrency(models[0].sale, '$'));
                    rq('.rollick-multiple-models .rollick-vehicle-msrp-usd .vehicle-marquee__price__original-price__value').text(self.formatCurrency(models[0].msrp, '$'));
                    rq('.rollick-multiple-models .rollick-vehicle-msrp-cad .vehicle-marquee__price__original-price__value').text(self.formatCurrency(models[0].msrp, '$'));
                } else {
                    rq('.rollick-multiple-models .rollick-vehicle-msrp-usd .rollick-original-price').addClass('rollick-invisible');
                    rq('.rollick-multiple-models .rollick-vehicle-msrp-cad .rollick-original-price').addClass('rollick-invisible');
                    rq('.rollick-multiple-models .rollick-vehicle-msrp-usd .meta--price__value').text(self.formatCurrency(models[0].msrp, '$'));
                    rq('.rollick-multiple-models .rollick-vehicle-msrp-cad .meta--price__value').text(self.formatCurrency(models[0].msrp, '$'));
                }
            }

            function rotateModel(e) {
                var items = carousel.find('.item');
                for (var i = 0; i < items.length; i++) {
                    if (rq(items[i]).hasClass('active')) activeIndex = i;
                }
                if (e.data.d == 'n') {
                    activeIndex++;
                    if (activeIndex >= items.length) activeIndex = 0;
                }
                if (e.data.d == 'p') {
                    activeIndex--;
                    if (activeIndex < 0) activeIndex = items.length - 1;
                }
                items.removeClass('active');
                rq(items[activeIndex]).addClass('active');
                rq('.rollick-multiple-models .carousel-model-caption').html('<h4>' + models[activeIndex].model + '</h4>');
                rq('.rollick-multiple-models .carousel-status').text((activeIndex + 1) + ' of ' + models.length);
                rq('.rollick-multiple-models .rollick-vehicle-msrp-usd .meta--price__value').text(self.formatCurrency(models[activeIndex].msrp, '$'));
                rq('.rollick-multiple-models .rollick-vehicle-msrp-cad .meta--price__value').text(self.formatCurrency(models[activeIndex].msrp, '$'));
                if (models[activeIndex].sale) {
                    rq('.rollick-multiple-models .rollick-vehicle-msrp-usd .rollick-original-price').removeClass('rollick-invisible');
                    rq('.rollick-multiple-models .rollick-vehicle-msrp-cad .rollick-original-price').removeClass('rollick-invisible');
                    rq('.rollick-multiple-models .rollick-vehicle-msrp-usd .meta--price__value').text(self.formatCurrency(models[activeIndex].sale, '$'));
                    rq('.rollick-multiple-models .rollick-vehicle-msrp-cad .meta--price__value').text(self.formatCurrency(models[activeIndex].sale, '$'));
                    rq('.rollick-multiple-models .rollick-vehicle-msrp-usd .vehicle-marquee__price__original-price__value').text(self.formatCurrency(models[activeIndex].msrp, '$'));
                    rq('.rollick-multiple-models .rollick-vehicle-msrp-cad .vehicle-marquee__price__original-price__value').text(self.formatCurrency(models[activeIndex].msrp, '$'));
                } else {
                    rq('.rollick-multiple-models .rollick-vehicle-msrp-usd .rollick-original-price').addClass('rollick-invisible');
                    rq('.rollick-multiple-models .rollick-vehicle-msrp-cad .rollick-original-price').addClass('rollick-invisible');
                    rq('.rollick-multiple-models .rollick-vehicle-msrp-usd .meta--price__value').text(self.formatCurrency(models[activeIndex].msrp, '$'));
                    rq('.rollick-multiple-models .rollick-vehicle-msrp-cad .meta--price__value').text(self.formatCurrency(models[activeIndex].msrp, '$'));
                }
                rq('.rollick-vehicle-kit').addClass('rollick-invisible');
            }

            function showSkus() {
                var vehicleName = models[activeIndex].model;
                self.vehiclesRemaining = self.availableModels.models.slice().filter(function (vehicle) { return vehicle.vehicleName.toLowerCase() == vehicleName.toLowerCase(); });
                rq('.rollick-multiple-skus').removeClass('rollick-hidden');
                rq('.rollick-multiple-models').addClass('rollick-hidden');
                rq('.container')[0].scrollIntoView(true);
                self.initSkuCarousel();
                self.validateVehicleSelection();
                rollick.dealerInit();
                if (rollick.leadType.toLowerCase() == 'appointment') {
                    if (self.vehiclesRemaining.length == 1) {
                        rq('.carousel-show-form').click();
                    }
                }
            }

            if (rollick.leadType.toLowerCase() == 'appointment') {
                rq('.rollick-multiple-models .carousel-show-skus').off('click').on('click', function () {
                    self.sacStep2();
                    showSkus();
                });
                rq('.carousel-show-form').off('click').on('click', function () {
                    self.sacStep3();
                    rq('.rollick-multiple-skus').addClass('rollick-hidden');
                    rq('.rollick-form-appointment-pii').removeClass('rollick-hidden');
                });
            }
        } catch (e) { }
    },

    initSkuCarousel() {
        var self = this;
        var skus = self.vehiclesRemaining;
        if (!skus) return;
        rq('.rollick-multiple-skus').removeClass('rollick-hidden');
        if (skus.length > 1) rq('.rollick-multiple-skus .rollick-carousel-nav').removeClass('rollick-hidden');
        else rq('.rollick-multiple-skus .rollick-carousel-nav').addClass('rollick-hidden');
        var carousel = rq('.carousel-sku');
        carousel.empty();
        var vehicles = '';
        for (var i = 0; i < skus.length; i++) {
            vehicles += '<div class="item' + (i == 0 ? ' active"' : '"') + ' style="background-image: url(' + skus[i].image + ')"></div>';
        }
        carousel.html(vehicles);
        rollick.vehicle = skus[0];
        if (rollick.vehicle) rollick.vehicle.originalImage = rollick.vehicle.image;
        rq('.rollick-multiple-skus .carousel-status').text('1 of ' + skus.length);
        self.loadKits(skus[0]);
        rq('.rollick-multiple-skus .carousel-next').off('click').on('click', { d: 'n' }, rotate);
        rq('.rollick-multiple-skus .carousel-prev').off('click').on('click', { d: 'p' }, rotate);

        function rotate(e) {
            var items = carousel.find('.item');
            var activeIndex = -1;
            for (var i = 0; i < items.length; i++) {
                if (rq(items[i]).hasClass('active')) activeIndex = i;
            }
            if (e.data.d == 'n') {
                activeIndex++;
                if (activeIndex >= items.length) activeIndex = 0;
            }
            if (e.data.d == 'p') {
                activeIndex--;
                if (activeIndex < 0) activeIndex = items.length - 1;
            }
            items.removeClass('active');
            rq(items[activeIndex]).addClass('active');
            rq('.rollick-multiple-skus .carousel-status').text((activeIndex + 1) + ' of ' + skus.length);
            var sku = skus[activeIndex];
            rollick.vehicle = sku;
            rollick.vehicle.originalImage = rollick.vehicle.image;
            self.loadKits(sku);
            self.validateVehicleSelection(rollick.country || 'US');
        }
    },

    loadKits(sku) {
        var cbo = rq('#rollick-kit');
        var kitChoice = (rollick.vehicle ? rollick.vehicle.kit || '' : '');
        cbo.empty();
        var opt = rq('<option></option>').attr('value', '').text('None Selected');
        cbo.append(opt);
        var hasAccessories = (rollick.accessories && rollick.accessories.length > 0);
        if (sku && sku.hasKits && !hasAccessories) {
            for (var i = 0; i < sku.kits.length; i++) {
                var item = sku.kits[i];
                var text = item.item + ' (+';
                if (rollick.cart.country == 'CA') {
                    if (item.saleCAD) {
                        text += item.saleCAD.toString() + ', was +' + item.msrpCAD.toString();
                    } else {
                        text += item.msrpCAD.toString();
                    }
                } else {
                    if (item.saleUSD) {
                        text += item.saleUSD.toString() + ', was +' + item.msrpUSD.toString();
                    } else {
                        text += item.msrpUSD.toString();
                    }
                }
                text += ')';
                opt = rq('<option></option>').attr('value', item.part).text(text);
                if (item.part.toLowerCase() == (kitChoice || '').toLowerCase()) opt.attr('selected', 'selected');
                cbo.append(opt);
            }
            rq('.rollick-vehicle-kit').removeClass('rollick-invisible');
        } else {
            rq('.rollick-vehicle-kit').addClass('rollick-invisible');
        }
    },

    validateVehicleSelection() {
        var self = this;
        var kit = rq('.rollick-form-kit-select').val() || '';
        var isVehicleSelected = (rollick.vehicle && (rollick.vehicle.mfgModelCode || rollick.vehicle.modelName));

        // rq('.rollick-vehicle-deposit').removeClass('rollick-hidden');
        // rq('.rollick-preorder-disclaimer').removeClass('rollick-hidden');
        // rq('.rollick-deposit-amount').text('$' + rollick.vehicleParams.deposit);

        if (isVehicleSelected) {
            if (rollick.vehicle.type != rq(".rollick-form-vehicle-type-select").val()) {
                rq(".rollick-form-vehicle-type-select").val(rollick.vehicle.type);
            }
            var accessoriesMSRP = 0;
            var kitMSRPUSD = 0;
            var kitMSRPCAD = 0;
            var kitSaleUSD = 0;
            var kitSaleCAD = 0;
            if (rollick.accessories && rollick.accessories.length) {
                rollick.accessories.forEach(function (acc) { accessoriesMSRP += parseFloat(acc.cost); });
            }
            if (kit && rollick.vehicle.hasKits) {
                rq.each(rollick.vehicle.kits, function (key, item) {
                    if (item.part.toLowerCase() == kit.toLowerCase() || item.item.toLowerCase() == kit.toLowerCase()) {
                        kitMSRPUSD = item.msrpUSD;
                        kitMSRPCAD = item.msrpCAD;
                        kitSaleUSD = item.saleUSD || 0;
                        kitSaleCAD = item.saleCAD || 0;
                        if (item.image && (item.image || '').trim().length) {
                            rollick.vehicle.image = item.image.trim();
                        }
                    }
                });
            }
            var priceUSD = (rollick.vehicle.msrpUSD + (rollick.vehicle.colorAdditionalUSD || 0) + kitMSRPUSD + accessoriesMSRP);
            var priceCAD = (rollick.vehicle.msrpCAD + (rollick.vehicle.colorAdditionalCAD || 0) + kitMSRPCAD + accessoriesMSRP);
            var originalUSD = priceUSD;
            var originalCAD = priceCAD;
            if (rollick.vehicle.saleUSD) {
                priceUSD = (rollick.vehicle.saleUSD + (rollick.vehicle.colorAdditionalUSD || 0) + (kitSaleUSD || kitMSRPUSD) + accessoriesMSRP);
            }
            if (rollick.vehicle.saleCAD) {
                priceCAD = (rollick.vehicle.saleCAD + (rollick.vehicle.colorAdditionalCAD || 0) + (kitSaleCAD || kitMSRPCAD) + accessoriesMSRP);
            }

            if (rq('.rollick-form-country-select :checked').val() == 'CA' || rollick.country == 'CA') {
                rq('.rollick-vehicle-msrp-usd').addClass('rollick-hidden');
                rq('.rollick-vehicle-msrp-cad').removeClass('rollick-hidden');
            } else {
                rq('.rollick-vehicle-msrp-usd').removeClass('rollick-hidden');
                rq('.rollick-vehicle-msrp-cad').addClass('rollick-hidden');
            }

            rq('.carousel-modelName').html('<div><h5>' + rollick.vehicle.modelName + '</h5></div>');
            rq('.carousel-model-details').html(rollick.generateVehicleDetailsHtml(rollick.vehicle));

            rq('.rollick-vehicle-msrp-usd .meta--price__value').text(self.formatCurrency(priceUSD, '$'));
            rq('.rollick-vehicle-msrp-cad .meta--price__value').text(self.formatCurrency(priceCAD, '$'));
            if (rollick.vehicle.saleUSD) {
                rq('.rollick-vehicle-msrp-usd .vehicle-marquee__price__original-price__value').text(self.formatCurrency(originalUSD, '$'));
                rq('.rollick-vehicle-msrp-usd .rollick-original-price').removeClass('rollick-invisible');
            } else {
                rq('.rollick-vehicle-msrp-usd .rollick-original-price').addClass('rollick-invisible');
            }
            if (rollick.vehicle.saleCAD) {
                rq('.rollick-vehicle-msrp-cad .vehicle-marquee__price__original-price__value').text(self.formatCurrency(originalCAD, '$'));
                rq('.rollick-vehicle-msrp-cad .rollick-original-price').removeClass('rollick-invisible');
            } else {
                rq('.rollick-vehicle-msrp-cad .rollick-original-price').addClass('rollick-invisible');
            }
            if (rollick.vehicle.deposit) {
                rq('.rollick-deposit').removeClass('rollick-invisible').html('<h6>' + self.formatCurrency(rollick.vehicle.deposit, '$') + ' PRE-ORDER DEPOSIT REQUIRED</h6>');
            } else {
                rq('.rollick-deposit').addClass('rollick-invisible');
            }

            var vehicleImage = rollick.vehicle.image;
            if (rollick.accessories && rollick.accessories.length) {
                rq('.rollick-accessories-detail').removeClass('rollick-hidden');
                rq('.rollick-vehicle-kit').addClass('rollick-hidden');
                var html = '<h6>Configured Accessories</h6>';
                var kitDetails = '';
                for (var i = 0; i < rollick.accessories.length; i++) {
                    var acc = rollick.accessories[i];
                    if (acc.isKit) {
                        kitDetails = acc.item + ' (+' + acc.cost + ')';
                    } else {
                        var info = '';
                        if (acc.cost) info += '(+' + acc.cost + '';
                        if (acc.text) {
                            if (info) info += ', ';
                            else info += '(';
                            info += acc.text;
                        }
                        if (info) info += ')';
                        html += '<div>' + acc.item + ' ' + info + '</div>';
                    }
                }
                if (rollick.vehicleImage) {
                    vehicleImage = rollick.vehicleImage;
                    rollick.vehicle.image = vehicleImage;
                }
                rq('.rollick-accessories-detail').html(html);
                if (rollick.vehicle.kit) {
                    var kitHtml = '<h6>Accessory Package</h6><div>' + rollick.vehicle.kit + '</div>';
                    rq('.rollick-kit-detail').html(kitHtml).removeClass('rollick-hidden');
                }
                if (kitDetails) {
                    var kitHtml = '<h6>Accessory Package</h6><div>' + kitDetails + '</div>';
                    rq('.rollick-kit-detail').html(kitHtml).removeClass('rollick-hidden');
                }
            }

            rq('.rollick-brand').text(rollick.vehicle.brand || 'Arctic Cat');

            rq('.rollick-multiple-skus .rollick-carousel .item.active').css('background-image', 'url(' + rollick.vehicle.image + ')');
        }
    },

    backToModels() {
        var self = this;
        rq('.rollick-blurb').text('To get started, please select your model of interest.');
        rq('.rollick-multiple-skus').addClass('rollick-hidden');
        rq('.rollick-multiple-models').removeClass('rollick-hidden');
        rq('.container')[0].scrollIntoView(true);
        rq('.rollick-vehicle-kit').addClass('rollick-invisible');
        if (rollick.leadType.toLowerCase() == 'appointment') {
            self.sacStep1();
        }
    },

    initFlyoutEvents() {
        var self = this;
        if (!self.vehiclesRemaining) return;
        rq('.rollick-form').addClass('tray--active');
        rq('.rollick-vehicle-type').addClass('rollick-hidden');
        self.initSkuCarousel();
        rq('.rollick-form-fields').show();
        self.validateVehicleSelection();
        rollick.dealerInit();
        if (self.vehiclesRemaining.length == 1) {
            rq('.rollick-carousel-header').addClass('rollick-hidden');
        }
    },

    formatCurrency(x, symbol) {
        x = (x || 0).toFixed(0);
        return (symbol || '') + ('' + x).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
    },

    closeFlayout: function (flayoutDivId) {
        rq('#' + flayoutDivId).hide();
        rq('body').css('overflow', 'auto');
    },

    designFlayout: function (data, options) {
        if (rollick.siteId == 'EZG' && options.mode == 'flyout') {
            var html = "<div id='ezgo_rollick_tray' class='tray__active tray' style='opacity: 1; visibility: inherit;'>" +
                "    <div class='tray__overlay overlay' style='opacity: 1; visibility: inherit;'></div>" +
                "    <div class='tray__outer-container outer-container'>" +
                "        <div class='tray__toolbar'>" +
                "            <button type='button' class='tray__close' onclick='rollick.closeFlayout(\"ezgo_rollick_tray\")'>" +
                "                <svg aria-hidden='true' role='img' aria-label='Open' xmlns='http://www.w3.org/2000/svg' width='22' height='22' viewBox='0 0 22 22' class='icon-plus'>" +
                "                    <line x1='5' y1='11' x2='17' y2='11' fill='none' stroke='#000000' stroke-width='2' stroke-miterlimit='10' class='icon-plus__line icon-plus__horizontal-line'></line>" +
                "                    <line x1='11' y1='5' x2='11' y2='17' fill='none' stroke='#000000' stroke-width='2' stroke-miterlimit='10' class='icon-plus__line icon-plus__vertical-line'></line>" +
                "                </svg>" +
                "            </button>" +
                "        </div>" +
                "        <div class='tray__content-container container'>" +
                "            <div class='tray__content-wrap'>" +
                "                <div class='tray__content rte-body-component'>" +
                "                    <div id='inner-rollick-form' class='tray__form'> " + data + "</div>" +
                "                </div>" +
                "            </div>" +
                "        </div>" +
                "    </div>" +
                "</div>";
            return html;
        }
        return data;
    },

    clearBorder: function (obj) {
        window.setTimeout(function () {
            rollick.visited[rq(obj).attr('id')] = '1';
            rq(obj).attr('visited', '1');
            rq(obj).removeClass('rollick-required');
        }, 200);
    },

    flattenVehicleImage: function () {
        // parse vehicle build&price images
        try {

            var canvas = document.createElement('canvas');
            var context = canvas.getContext('2d');
            var images = [];
            var loadCount = 0;

            if (rq('.builder-vehicle').length) {
                images.push({ z: 10, url: rq('.builder-vehicle').find('img').attr('src') });
                rq('.builder-vehicle').find('div').each(function (a, b) {
                    var imageUrl = rq(b).css('background-image').replace(/^url\(['"]?/, '').replace(/['"]?\)$/, '');
                    if (imageUrl != 'none') {
                        images.push({ z: parseInt(rq(b).css('z-index')), url: imageUrl });
                    }
                });
                images.sort(function (a, b) { return a.z - b.z; });
                var loadedImages = [];
                var img = new Image();
                img.onload = function () {
                    canvas.width = img.width;
                    canvas.height = img.height;
                    context.globalAlpha = 1.0;
                    for (var i = 0; i < images.length; i++) {
                        loadedImages[i] = new Image();
                        loadedImages[i].onload = function () {
                            loadCount++;
                            if (loadCount == images.length) {
                                for (var j = 0; j < loadedImages.length; j++) {
                                    context.drawImage(loadedImages[j], 0, 0);
                                }
                                rollick.vehicle.image64 = canvas.toDataURL('image/png');
                                rollick.redrawVehicle();
                            }
                        };
                        loadedImages[i].src = images[i].url;
                    }
                }
                img.src = images[0].url;
            }
        } catch (e) {
            console.error(e);
        }
    },

    setDisclaimer: function (txt) {
        rq('.rollick-disclaimer').removeClass('rollick-hidden').find('i').text(txt);
    },

    clearDisclaimer: function () {
        rq('.rollick-disclaimer').addClass('rollick-hidden').find('i').text('');
    },

    redrawVehicleFlyout: function () {
        var sxs = '//arcticcat.txtsv.com/themes/custom/arcticcat/assets/img/owners_no-image-placeholder_side-by-side.jpg';
        var snow = '//arcticcat.txtsv.com/themes/custom/arcticcat/assets/img/vehicle-card-5-2-aspect-ratio-silhouette.jpg';
        var image = '';
        try {
            if (rq('.rollick-form-vehicle-type-select').val() == 'Off Road') {
                image = sxs;
            }
            if (rq('.rollick-form-vehicle-type-select').val() == 'Snow') {
                image = snow;
            }
        } catch (e) {

        }

        if (rollick.vehicle) {
            if (rollick.vehicle.image64) {
                rq('.rollick-vehicle-image-background').css('background-image', 'url(' + rollick.vehicle.image64 + ')').css('opacity', '').css('filter', '');
                rq('.rollick-no-vehicle-info').addClass('rollick-hidden');
                rq('.rollick-vehicle-info').removeClass('rollick-hidden');
            } else if (rollick.vehicle.image) {
                rq('.rollick-vehicle-image-background').css('background-image', 'url(' + rollick.vehicle.image + ')').css('opacity', '').css('filter', '');
                rq('.rollick-no-vehicle-info').addClass('rollick-hidden');
                rq('.rollick-vehicle-info').removeClass('rollick-hidden');
            } else {
                rq('.rollick-vehicle-image-background').css('background-image', 'url(' + image + ')').css('opacity', '0.3').css('filter', 'blur(5px)');
                rq('.rollick-no-vehicle-info').removeClass('rollick-hidden');
                rq('.rollick-vehicle-info').addClass('rollick-hidden');
            }
        } else {
            rq('.rollick-vehicle-image-background').css('background-image', 'url(' + image + ')').css('opacity', '0.3').css('filter', 'blur(5px)');
            rq('.rollick-no-vehicle-info').removeClass('rollick-hidden');
            rq('.rollick-vehicle-info').addClass('rollick-hidden');
        }
    },

    redrawVehicle: function () {
        if (rollick.vehicle) {
            if (rollick.vehicle.image64) {
                rq('.rollick-vehicle-info').show();
                rq('.rollick-no-vehicle-image').hide();
                rq('.rollick-vehicle-image').attr('src', rollick.vehicle.image64);
                rq('.rollick-vehicle-image-2').attr('src', rollick.vehicle.image64);
                rq('.rollick-has-vehicle-image').show();
            } else if (rollick.vehicle.image) {
                rq('.rollick-vehicle-info').show();
                rq('.rollick-no-vehicle-image').hide();
                rq('.rollick-vehicle-image').off('load').attr('src', rollick.vehicle.image).on('load', function () {
                    rq('.rollick-has-vehicle-image').show();
                });
                rq('.rollick-vehicle-image-2').off('load').attr('src', rollick.vehicle.image).on('load', function () {
                    rq('.rollick-has-vehicle-image').show();
                });
            } else {
                rq('.rollick-vehicle-info').hide();
                // change image based on type
                var sxs = '//arcticcat.txtsv.com/themes/custom/arcticcat/assets/img/owners_no-image-placeholder_side-by-side.jpg';
                var snow = '//arcticcat.txtsv.com/themes/custom/arcticcat/assets/img/vehicle-card-5-2-aspect-ratio-silhouette.jpg';
                var image = sxs;
                var vehType = rq('.rollick-form-vehicle-type-select').val();
                if (vehType == 'Off Road') {
                    image = sxs;
                }
                if (vehType == 'Snow') {
                    image = snow;
                }
                rq('.rollick-no-vehicle-image').find('img').attr('src', image);
                rq('.rollick-no-vehicle-image').show();
                rq('.rollick-has-vehicle-image').hide();
            }
        } else {
            rq('.rollick-vehicle-info').hide();
            rq('.rollick-no-vehicle-image').show();
            rq('.rollick-has-vehicle-image').hide();
        }
    },

    validateForm: function () {
        var self = this;
        if (!rq(self.form_firstName).length) return;
        var fn = rq(self.form_firstName).val().trim();
        var ln = rq(self.form_lastName).val().trim();
        var e = rq(self.form_email).val().trim();
        var pc = rq(self.form_postalCode).val().trim();
        var phone = (rq(self.form_phone).val() || "").trim();
        var country = rq('.rollick-form-country-select').val().trim();
        var trim = rq('.rollick-form-trim-select').val() || '';
        var ttp = rq('.rollick-form-ttp-select').val() || '';
        var kit = rq('.rollick-form-kit-select').val() || '';
        var comment = rq('.rollick-form-comment-value').val() || '';

        var isValidEmail = (/^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/).test(e.toLowerCase());
        var isValidPhone = (phone.length == 14);
        var isValidPostalCode = false;
        var isVehicleSelected = (self.vehicle && self.vehicle.brand && self.vehicle.modelName);
        var isTrimSelected = true;
        var isTTPSelected = (ttp != '');
        var isValidPaymentInfo = true;
        var isDealerValid = false;

        if (self.siteId == 'ARC2') {
            if (self.vehicle) {
                if (self.vehicle.type == 'Snow') isVehicleSelected = (self.vehicle && self.vehicle.brand && self.vehicle.modelName && self.vehicle.track && self.vehicle.starter && self.vehicle.suspension && self.vehicle.color);
                if (self.vehicle.type == 'Off Road') isVehicleSelected = (self.vehicle && self.vehicle.brand && self.vehicle.modelName && self.vehicle.color);
            }
            self.redrawVehicleFlyout();
            isDealerValid = true;
            rq('#rollick-specific-dealer').removeClass('error');
            if (rq('#rollick-dealer-choice-customer').is(':checked')) {
                if (!rq('#rollick-specific-dealer').val() || !rq('#rollick-specific-dealer-id').val()) {
                    rq('#rollick-specific-dealer').addClass('error');
                    isDealerValid = false;
                }
            }
        } else {
            isDealerValid = true; // not required for non-pre-order flow
        }

        if (rq('.rollick-form-trim-select option').length > 2) {
            if (!trim) isTrimSelected = false;
        }

        if (country == 'US') {
            isValidPostalCode = (pc.length == 5);
        } else if (country == 'CA') {
            isValidPostalCode = (pc.length == 7);
        }

        if (rq('.rollick-vehicle-model').length) {
            self.redrawVehicle();
            if (isVehicleSelected) {
                var accessoriesMSRP = 0;
                var kitMSRPUSD = 0;
                var kitMSRPCAD = 0;
                if (self.accessories && self.accessories.length) {
                    self.accessories.forEach(function (acc) { accessoriesMSRP += parseFloat(acc.cost); });
                }
                if (kit && self.vehicle.hasKits) {
                    rq.each(self.vehicle.kits, function (key, item) {
                        if (item.part.toLowerCase() == kit.toLowerCase() || item.item.toLowerCase() == kit.toLowerCase()) {
                            kitMSRPUSD = item.msrpUSD;
                            kitMSRPCAD = item.msrpCAD;
                            if (item.image && (item.image || '').trim().length) {
                                self.vehicle.image = item.image.trim();
                            }
                        }
                    });
                }
                rq('.rollick-vehicle-model-info').text(self.vehicle.modelName);
                rq('.rollick-vehicle-color-info').html('<div class="rollick-label">Color</div><div class="rollick-description">' + self.vehicle.color + '</div>');
                if (self.siteId == 'ARC2') {
                    var vehicleDetails = '';
                    if (self.vehicle.year) {
                        vehicleDetails += "<div><div class='rollick-label'>Model Year</div><div class='rollick-description'>" + self.vehicle.year + "</div></div>";
                    }
                    if (self.vehicle.track) {
                        vehicleDetails += "<div><div class='rollick-label'>Track/Lug</div><div class='rollick-description'>" + self.vehicle.track + "</div></div>";
                    }
                    if (self.vehicle.starter) {
                        vehicleDetails += "<div><div class='rollick-label'>Starter</div><div class='rollick-description'>" + self.vehicle.starter + "</div></div>";
                    }
                    if (self.vehicle.suspension) {
                        vehicleDetails += "<div><div class='rollick-label'>Suspension</div><div class='rollick-description'>" + self.vehicle.suspension + "</div></div>";
                    }
                    rq('.rollick-vehicle-trim-info').html(vehicleDetails);
                }
                var priceUSD = (self.vehicle.msrpUSD + self.vehicle.colorAdditionalUSD + accessoriesMSRP + kitMSRPUSD);
                var priceCAD = (self.vehicle.msrpCAD + self.vehicle.colorAdditionalCAD + accessoriesMSRP + kitMSRPCAD);
                if (priceUSD && !self.vehicle.hideMSRP) {
                    var originalUSD = 0;
                    if (self.vehicle.saleUSD) {
                        originalUSD = self.vehicle.msrpUSD;
                        priceUSD = (self.vehicle.saleUSD + self.vehicle.colorAdditionalUSD + accessoriesMSRP + kitMSRPUSD);
                    }
                    if (originalUSD) {
                        rq('.rollick-vehicle-msrp-usd').html('<div class="vehicle-card__meta" style="display: block; text-align: unset;"><span class="meta--price__value">$' + priceUSD.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 }) + '</span> <span class="vehicle-card__meta--msrp">USD*</span></div><div class="vehicle-card__meta vehicle-marquee__price__original-price--wrap rollick-original-price"><span class="vehicle-card__meta--msrp" style="letter-spacing: initial">WAS</span>&nbsp;<span class="vehicle-marquee__price__original-price__value">$' + originalUSD.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 }) + '</span></div>');
                    } else {
                        rq('.rollick-vehicle-msrp-usd').html('<div class="vehicle-card__meta" style="display: block; text-align: unset;"><span class="meta--price__value">$' + priceUSD.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 }) + '</span> <span class="vehicle-card__meta--msrp">MSRP USD*</span></div>');
                    }
                }
                else rq('.rollick-vehicle-msrp-usd').html('');
                if (priceCAD && !self.vehicle.hideMSRP) {
                    var originalCAD = 0;
                    if (self.vehicle.saleCAD) {
                        originalCAD = self.vehicle.msrpCAD;
                        priceCAD = (self.vehicle.saleCAD + self.vehicle.colorAdditionalCAD + accessoriesMSRP + kitMSRPCAD);
                    }
                    if (originalCAD) {
                        rq('.rollick-vehicle-msrp-cad').html('<div class="vehicle-card__meta" style="display: block; text-align: unset;"><span class="meta--price__value">$' + priceCAD.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 }) + '</span> <span class="vehicle-card__meta--msrp">CAD*</span></div><div class="vehicle-card__meta vehicle-marquee__price__original-price--wrap rollick-original-price"><span class="vehicle-card__meta--msrp" style="letter-spacing: initial">WAS</span>&nbsp;<span class="vehicle-marquee__price__original-price__value">$' + originalCAD.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 }) + '</span></div>');
                    } else {
                        rq('.rollick-vehicle-msrp-cad').html('<div class="vehicle-card__meta" style="display: block; text-align: unset;"><span class="meta--price__value">$' + priceCAD.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 }) + '</span> <span class="vehicle-card__meta--msrp">MSRP CAD*</span></div>');
                    }
                }
                else rq('.rollick-vehicle-msrp-cad').html('');
            }
        }

        self.checkRequired(fn, self.form_firstName);
        self.checkRequired(ln, self.form_lastName);
        self.checkRequired(e, self.form_email);
        self.checkRequired(phone, self.form_phone);
        self.checkRequired(pc, self.form_postalCode);
        self.hasInput(comment, self.form_comment)

        if (fn) {
            if (fn.length > 1) {
                rq(self.form_firstName).val(fn.substring(0, 1).toUpperCase() + fn.substring(1));
            } else {
                rq(self.form_firstName).val(fn.toUpperCase());
            }
        }
        if (ln) {
            if (ln.length > 1) {
                rq(self.form_lastName).val(ln.substring(0, 1).toUpperCase() + ln.substring(1));
            } else {
                rq(self.form_lastName).val(ln.toUpperCase());
            }
        }

        if (rollick.leadType.toLowerCase() == 'appointment') {
            isTTPSelected = true;
        }

        if (!pc) {
            if (!fn || !ln || !e || !pc || !phone || !country || !isValidEmail || !isValidPhone || !isValidPostalCode || !isVehicleSelected || !isTrimSelected || !isTTPSelected || !isValidPaymentInfo || !isDealerValid) {
                rq('.rollick-form-submit').addClass('disabled');
                rq('.rollick-form-payment').addClass('disabled');
            } else {
                rq('.rollick-form-submit').removeClass('disabled');
                rq('.rollick-form-payment').removeClass('disabled');
            }
        }

        if (pc) {
            if (!isValidPostalCode) {
                rq('.rollick-form-submit').addClass('disabled');
                rq('.rollick-form-payment').addClass('disabled');
                rq('.rollick-invalid-postal').removeClass('rollick-hidden');
            } else {
                self.validateZip(pc, function (isValidZip) {
                    isValidPostalCode = isValidZip;
                    if (!isValidZip) {
                        rq('.rollick-invalid-postal').removeClass('rollick-hidden');
                    } else {
                        rq('.rollick-invalid-postal').addClass('rollick-hidden');
                    }
                    if (!fn || !ln || !e || !pc || !phone || !country || !isValidEmail || !isValidPhone || !isValidPostalCode || !isVehicleSelected || !isTrimSelected || !isTTPSelected || !isDealerValid) {
                        rq('.rollick-form-submit').addClass('disabled');
                        rq('.rollick-form-payment').addClass('disabled');
                    } else {
                        rq('.rollick-form-submit').removeClass('disabled');
                        rq('.rollick-form-payment').removeClass('disabled');
                    }
                });
            }
        }
        if (e) {
            if (!isValidEmail) {
                rq('.rollick-invalid-email').removeClass('rollick-hidden');
            } else {
                rq('.rollick-invalid-email').addClass('rollick-hidden');
            }
        }

        if (phone) {
            if (!isValidPhone) {
                rq('.rollick-invalid-phone').removeClass('rollick-hidden');
            } else {
                rq('.rollick-invalid-phone').addClass('rollick-hidden');
            }
        }

        if (rollick.leadType.toLowerCase() == 'appointment') {
            var apptDate1 = rq('#rollick-appt-date-1').val();
            if (!apptDate1 && rollick.visited['rollick-appt-date-1']) {
                rq('#rollick-appt-date-1').addClass('rollick-required');
                rq('.rollick-form-submit').addClass('disabled');
            } else {
                rq('#rollick-appt-date-1').removeClass('rollick-required');
            }
        }
    },

    checkRequired: function (val, obj) {
        if (!val && rollick.isVisited(obj)) {
            rq(obj).addClass('error').closest('div').addClass('form-item--error');
        } else {
            rq(obj).removeClass('error').closest('div').removeClass('form-item--error');
        }
    },
    hasInput: function (val, obj) {
        if (val) {
            return true;
        }
        return false;
    },

    isVisited: function (obj) {
        return ((rq(obj).attr('visited') || rollick.visited[rq(obj).attr('id')] || '') == '1');
    },

    getFormData: function () {
        var self = this;
        var data = {};
        if (!self.vehicle.brand) return null; // no vehicle information
        var selectedDealer = rq('#rollick-specific-dealer').val().trim();
        if (rq('#rollick-specific-dealer').is(':visible')) {
            if (selectedDealer == '') {
                rq('#rollick-specific-dealer-id').val('');
                rq('#rollick-specific-dealer-name').val('');
            } else {
                if (self.dealersList && self.dealersList.length) {
                    var bMatched = false;
                    rq.each(self.dealersList, function (key, item) {
                        if (!bMatched && item.name.toLowerCase() == selectedDealer.toLowerCase()) {
                            rq('#rollick-specific-dealer-id').val(item.id);
                            rq('#rollick-specific-dealer-name').val(item.name);
                            bMatched = true;
                        }
                    });
                    if (!bMatched) {
                        rq('#rollick-specific-dealer-id').val('');
                        rq('#rollick-specific-dealer-name').val('');
                    }
                } else {
                    rq('#rollick-specific-dealer-id').val('');
                    rq('#rollick-specific-dealer-name').val('');
                }
            }
        }
        if (typeof Aimbase !== 'undefined') {
            if (Aimbase && Aimbase.Analytics) {
                var fn = rq(self.form_firstName).val();
                var ln = rq(self.form_lastName).val();
                var e = rq(self.form_email).val();
                var pc = rq(self.form_postalCode).val();
                var phone = rq(self.form_phone).val();
                var country = rq('.rollick-form-country-select').val();
                var comment = rq('.rollick-form-comment-value').val();
                var ttp = rq('.rollick-form-ttp-select').val() || '';
                var hashData = self.getHashParams();
                var kit = rq('.rollick-form-kit-select').val() || '';
                var bfh = (self.showBFH() && rq('#rollick-bfh').is(':checked')) ? 'Yes' : 'No';
                var submittedFrom = (window && window.location && (window.location.protocol + '//' + window.location.host + window.location.pathname));

                var dealerName = '';
                var dealerNumber = '';
                var dealerChoice = '';

                var cookieDealerId = Cookies.get('rollick-default-dealer-id');
                var cookieDealerName = Cookies.get('rollick-default-dealer-name');

                if (self.getSearchParams('dealerid') || sessionStorage['rollick-dealer-id']) {
                    dealerChoice = 'PreSelect';
                    dealerNumber = rq('#rollick-specific-dealer-id').val();
                    dealerName = rq('#rollick-specific-dealer-name').val();
                } else if (cookieDealerId && cookieDealerName) {
                    dealerChoice = 'Cookie';
                    dealerNumber = cookieDealerId;
                    dealerName = cookieDealerName;
                } else if (rq('#rollick-dealer-choice-closest').is(':checked')) {
                    dealerChoice = 'Closest';
                    dealerName = rq('#rollick-specific-dealer-name').val().trim();
                    dealerNumber = rq('#rollick-specific-dealer-id').val().trim();
                } else if (rq('#rollick-dealer-choice-customer').is(':checked')) {
                    dealerChoice = 'Custom';
                    dealerName = rq('#rollick-specific-dealer-name').val().trim();
                    dealerNumber = rq('#rollick-specific-dealer-id').val().trim();
                } else if (bMatched) {
                    dealerChoice = 'Custom';
                    dealerName = rq('#rollick-specific-dealer-name').val().trim();
                    dealerNumber = rq('#rollick-specific-dealer-id').val().trim();
                }

                if (self.closestPostalCode && self.closestDealerId && self.closestDealerName) {
                    dealerChoice = 'InSeason';
                    dealerNumber = self.closestDealerId;
                    dealerName = self.closestDealerName;
                }

                self.userId = Aimbase.Analytics.GetUserUid();
                self.sessionId = Aimbase.Analytics.GetSessionUid();
                self.source = Aimbase.Analytics.GetFieldValue('source') || 'Organic';
                self.campaign = Aimbase.Analytics.GetFieldValue('campaign') || '';

                data.uid = self.userId;
                data.sid = self.sessionId;
                data.source = self.source;
                data.campaign = self.campaign;
                data.type = (self.leadType ? self.leadType : 'Quote');
                data.category = self.vehicle.brand + ' Website';
                data.firstName = fn;
                data.lastName = ln;
                data.email = e;
                data.phone = phone;
                data.postalCode = pc;
                data.countryCode = country;
                data.comment = comment;
                data.timeToPurchase = ttp;
                data.buyFromHome = (bfh == 'Yes');
                data.submittedFrom = submittedFrom;

                data.brand = self.siteId;
                data.productCode = self.vehicle.mfgModelCode || self.vehicle.modelName;
                if (self.siteId == 'ARC') {
                    data.productCode = self.vehicle.mfgModelCode || self.vehicle.vehicleName; // ARC has the complete name in vehicleName
                }
                data.productYear = self.year;
                if (self.siteId == 'ARC2') {
                    data.brand = 'ARC';
                    if (self.vehicle.type == 'Off Road') {
                        data.brand = 'TOR';
                        // data.partnerId = 'e262f41b565a98b6';
                    }
                    data.category = 'Arctic Cat Website';
                    data.productCode = self.vehicle.mfgModelCode;
                    data.productName = self.vehicle.modelName;
                    data.track = self.vehicle.track;
                    data.trackType = self.vehicle.trackType;
                    data.starter = self.vehicle.starter;
                    data.suspension = self.vehicle.suspension;
                    data.trim = self.getTrimName(self.vehicle);
                    data.productYear = self.vehicle.year;
                    if (data.productYear == '2021' && data.brand == 'ARC' && data.type != 'Pre-Order') {
                        data.campaign = 'Snowmageddon_QUOTE-P1_MY21';
                    }

                    if (self.deposit) data.deposit = self.deposit;
                    if (self.paymentInfo) data.paymentInfo = self.paymentInfo;
                    // ROL-7966 Add Preorderable and Order Model Code
                    data.preorderable = self.isAvailable(self.vehicle, 'Pre-Order', country);
                    var orderModelCode = self.vehicle.mfgModelCode;
                    if (kit && self.vehicle.hasKits) {
                        try {
                            orderModelCode = self.vehicle.kits.filter(function (vk) { return vk.item.toLowerCase() == kit.toLowerCase() }).pop().mfgModelCode;
                        } catch (e) {
                        }
                    }
                    data.orderModelCode = orderModelCode;
                    if (self.leadType.toLowerCase() == 'appointment') {
                        data.apptDate1 = rq('#rollick-appt-date-1').val();
                        data.apptDate2 = rq('#rollick-appt-date-2').val();
                        data.apptTimeOfDay = rq('#rollick-appt-tod-morning').is(':checked') ? 'Morning' : 'Afternoon';
                        data.apptMethod = rq('#rollick-appt-method-instore').is(':checked') ? 'In-Store' : 'Phone';
                        data.dropOffUrl = self.getModelPage(self.vehicle);
                    }
                    if (rollick.div) {
                        data.dropOffUrl = self.getModelPage(self.vehicle);
                    }
                }
                if (self.siteId == 'EZG') {
                    if (self.vehicle.year) data.productYear = self.vehicle.year;
                }
                self.kits = [];
                if (kit && self.vehicle.hasKits) {
                    var kitItem = null;
                    rq.each(self.vehicle.kits, function (key, item) {
                        if (item.part.toLowerCase() == kit.toLowerCase() || item.item.toLowerCase() == kit.toLowerCase()) {
                            if (data.countryCode == 'US') {
                                kitItem = { part: item.part, item: item.item, cost: item.saleUSD || item.msrpUSD };
                            }
                            if (data.countryCode == 'CA') {
                                kitItem = { part: item.part, item: item.item, cost: item.saleCAD || item.msrpCAD };
                            }
                            if (item.image && (item.image || '').trim().length) {
                                self.vehicle.image = item.image.trim();
                            }
                        }
                    });
                    if (kitItem) {
                        self.kits.push(kitItem);
                    }
                }
                data.vehicleType = self.vehicle.category;
                data.color = self.vehicle.color;
                data.msrp = ((self.vehicle.saleUSD || self.vehicle.msrpUSD) + self.vehicle.colorAdditionalUSD);
                data.configUrl = '';
                data.imageUrl = self.vehicle.image;
                data.image64 = self.vehicle.image64;
                var accessories = [];
                if (self.accessories && self.accessories.length) accessories = accessories.concat(self.accessories);
                if (self.kits && self.kits.length) accessories = accessories.concat(self.kits);
                data.accessories = accessories;

                if (country == 'CA') {
                    data.msrp = ((self.vehicle.saleCAD || self.vehicle.msrpCAD) + self.vehicle.colorAdditionalCAD);
                }

                if (hashData.accessories || self.accessories.length) {
                    data.type = 'Build to Quote';
                    data.configUrl = window.location.href;
                }

                if (dealerNumber) {
                    data.partnerId = dealerNumber;
                    data.partnerName = dealerName;
                    data.partnerChoice = dealerChoice;
                    data.preselect = true;
                } else {
                    data.partnerChoice = 'Closest';
                    data.preselect = false;
                }

                data.optIn = false;
                if (rq('#rollick-optin').is(':checked')) {
                    data.optIn = true;
                    data.ip = self.ip;
                    data.optInDate = (new Date()).valueOf();
                    data.optInSource = 'Textron';
                    data.optInListCode = 'NewsPromo';
                }

                if (self.siteId == 'ARC2') {
                    var optInListCode = [];
                    if (data.optInListCode) {
                        optInListCode.push(data.optInListCode);
                    }
                    if (self.vehicle.type == 'Off Road') {
                        optInListCode.push('Arctic Cat Off Road English');
                    }
                    if (self.vehicle.type == 'Snow') {
                        optInListCode.push('Arctic Cat Snow English');
                    }
                    optInListCode.push('Arctic Cat Master English');
                    data.optInListCode = optInListCode.join(',');
                }

                // this should be 0 or 1
                if (rq('#rollick-ok').is(':checked')) {
                    data.textMe = 1;
                } else {
                    data.textMe = 0;
                }

                data.referrer = sessionStorage['rollick-referrer-value'];
                if (self.abandoned) data.abandoned = true;

                if (data.type.toLowerCase() == 'appointment') {
                    data.s = 'Appointment';
                }
            }
        }
        data.isOEMInventory = self.vehicle.inventoryId ? true : false;
        return data;
    },

    submitForm: function (closeAfter) {
        if (rollick.isFormSubmitted) {
            return true;
        }

        rollick.sanitize(rq(rollick.form_firstName));
        rollick.sanitize(rq(rollick.form_lastName));
        rollick.sanitize(rq(rollick.form_email));
        rollick.sanitize(rq(rollick.form_postalCode));
        rollick.sanitize(rq('.rollick-form-comment-value'));
        rollick.validateForm();

        if (rq('.rollick-form-submit').hasClass('disabled') && !rollick.abandoned) {
            return true;
        }
        // submit form
        rq('.rollick-form-submit').addClass('disabled');
        var data = rollick.getFormData();
        if (data) rollick.isFormSubmitted = true;
        if (Object.keys(data).length) {
            rollick.showLoading();
            if (window.dataLayer) window.dataLayer.push({ event: 'custom.requestMoreInfoSubmission', 'custom.eventLabel': data.productName });
            rq.ajax({
                url: rollick.validation + '/aimproxy',
                dataType: 'json',
                contentType: 'application/json;charset=utf-8',
                type: 'POST',
                timeout: 15000,
                data: JSON.stringify(data),
                success: function (resp) {
                    rollick.hideLoading();
                    if (closeAfter) {
                        rollick.closeForm();
                    } else {
                        if (rollick.customFlayout) {
                            if (rollick.redirectUrl) {
                                location.href = rollick.redirectUrl;
                            } else {
                                rollick_e_z_go_container.contentWindow.postMessage({ command: 'lead created', payload: { input: data } }, '*');
                            }
                        } else {
                            if (rollick.redirectUrl) {
                                location.href = rollick.redirectUrl;
                            } else {
                                rollick.closeForm();
                            }
                        }
                    }
                },
                error: function (resp) {
                    rollick.hideLoading();
                    rollick.isFormSubmitted = false;
                    if (!closeAfter) {
                        alert('We have encountered an unexpected error. Please try again later.');
                        rollick.validateForm();
                    } else {
                        rollick.closeForm();
                    }
                    return false;
                }
            });
        } else {
            rollick.isFormSubmitted = false;
            if (!closeAfter) {
                alert('We are unable to process your request at this time. Please try again later.');
                rollick.validateForm();
            } else {
                rollick.closeForm();
            }
            return false;
        }
    },

    closeForm: function () {
        if (window.tray && window.tray.active) {
            window.tray.closeTray();
            window.tray.resetData();
            rollick.vehicle = {};
            rollick.scriptLoaded = {};
            rollick.paymentInfo = null;
            rollick.paymentTry = 0;
            rollick.abandoned = null;
            rollick.submitted = false;
            rq('.rollick-form').remove();
            return;
        }
        rq('.rollick-form').removeClass('tray--active');
        window.setTimeout(function () {
            rollick.vehicle = {};
            rollick.scriptLoaded = {};
            rollick.paymentInfo = null;
            rollick.paymentTry = 0;
            rollick.abandoned = null;
            rollick.submitted = false;
            rq('.rollick-form').remove();
            rq('body').css('overflow', 'auto');
        }, 200);
    },

    showTerms: function (lang, textron) {
        if (textron) {
            let url = 'https://arcticcat.txtsv.com/about-arctic-cat/privacy-policy';
            if (lang == 'fr') {
                url = 'https://fr.arcticcat.txtsv.com/about-arctic-cat/privacy-policy';
            }
            window.open(url, 'textron-privacy-policy');
        } else {
            if (lang == 'fr') {
                window.open('https://gorollick-com.translate.goog/company/site-info/privacy-policy-terms-of-service/?_x_tr_sl=en&_x_tr_tl=fr&_x_tr_hl=en-US&_x_tr_pto=wapp;', 'oem-terms');
            } else {
                window.open(rollick.termsCondition, 'oem-terms');
            }
        }
        return false;
    },

    showPolicy: function (lang, textron) {
        if (textron) {
            let url = 'https://arcticcat.txtsv.com/about-arctic-cat/privacy-policy';
            if (lang == 'fr') {
                url = 'https://fr.arcticcat.txtsv.com/about-arctic-cat/privacy-policy';
            }
            window.open(url, 'textron-privacy-policy');
        } else {
            if (lang == 'fr') {
                window.open('https://gorollick-com.translate.goog/company/site-info/privacy-policy-terms-of-service/?_x_tr_sl=en&_x_tr_tl=fr&_x_tr_hl=en-US&_x_tr_pto=wapp;', 'oem-terms');
            } else {
                window.open(rollick.privacyPolicy, 'oem-privacy-policy');
            }
        }
        return false;
    },

    sanitize: function (ctrl) {
        // ^[\w'\-,.][^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]]{2,}$
        if (ctrl.attr('type') != 'file') {
            if (ctrl.val()) {
                ctrl.val(ctrl.val().trim());
            }
        }
    },

    getHashParams: function () {
        var hashParams = {};
        var e,
            a = /\+/g, // Regex for replacing addition symbol with a space
            r = /([^&;=]+)=?([^&;]*)/g,
            d = function (s) { return decodeURIComponent(s.replace(a, ' ')); },
            q = window.location.hash.substring(1);
        while (e = r.exec(q))
            hashParams[d(e[1])] = d(e[2]);
        return hashParams;
    },

    createPhoneMask: function (string) {
        return string.replace(/(\d{3})(\d{3})(\d{4})/, '\($1\) $2-$3');
    },

    destroyPhoneMask: function (string) {
        return string.replace(/\D/g, '').substring(0, 10);
    },

    distinctValues: function (dataArray, propertyName) {
        var distinct = [];
        dataArray.forEach(function (data) {
            if (data[propertyName]) {
                var value = data[propertyName];
                if (distinct.indexOf(value) == -1) distinct.push(value);
            }
        });
        distinct.sort(function (a, b) { return a.toLowerCase().localeCompare(b.toLowerCase()); });
        return distinct;
    },

    loadCSS: function () {
        var link = rq('<link />', {
            rel: 'stylesheet',
            type: 'text/css',
            href: rollick.widget + '/widgets/templates/textron/textron.css'
        });
        rq('head').append(link);
        var brandLink = rq('<link />', {
            rel: 'stylesheet',
            type: 'text/css',
            href: rollick.widget + '/widgets/templates/textron/' + rollick.siteId.toLowerCase() + '/override.css'
        });
        rq('head').append(brandLink);
    },

    validateZip: function (zip, callback) {
        if (rollick.previousZip != zip) {
            rollick.previousZip = zip;
            rq.get(rollick.widget + '/geocode/' + zip, null, function (data) {
                rollick.previousZipValid = (data.isValid || false);
                callback(data.isValid || false);
            });
        } else {
            callback(rollick.previousZipValid || false);
        }
    },

    csvToArray: function (text) {
        let p = '',
            row = [''],
            ret = [row],
            i = 0,
            r = 0,
            s = !0,
            l;
        for (var m = 0; m < text.length; m++) {
            l = text[m];
            if ('"' === l) {
                if (s && l === p) row[i] += l;
                s = !s;
            } else if (',' === l && s) l = row[++i] = '';
            else if ('\n' === l && s) {
                if ('\r' === p) row[i] = row[i].slice(0, -1);
                row = ret[++r] = [l = ''];
                i = 0;
            } else row[i] += l;
            p = l;
        }
        return ret;
    },

    dealerInit: function () {
        if (typeof Cookies !== 'function') {
            window.setTimeout(function () { rollick.dealerInit(); }, 100);
            return;
        }
        rollick.getQueryDealerId();
        rollick.dealerLoad();
    },

    dealerClearDefault: function () {
        Cookies.set('rollick-default-dealer-brand', '');
        Cookies.set('rollick-default-dealer-name', '');
        Cookies.set('rollick-default-dealer-id', '');
        rollick.dealerDisplayDealer();
    },

    dealerClearDealer: function () {
        if (typeof rq('#rollick-specific-dealer').typeahead == 'function') rq('#rollick-specific-dealer').typeahead('val', '');
        rq('#rollick-specific-dealer-id').val('');
        rq('#rollick-specific-dealer-name').val('');
    },

    dealerSetDealer: function () {
        var expire = null;
        if (rq('#cboExpire').val()) {
            var d = rq('#cboExpire').val();
            if (d == '1' || d == '7') {
                expire = { expires: parseInt(d) };
            }
            if (d == '-1') {
                expire = { expires: Math.ceil((new Date('9999-12-31').valueOf() - new Date().valueOf()) / 86400000) };
            }
            if (d == '0') {
                if (rq('#txtExpirationDate').val()) {
                    var expirationDate = new Date(new Date(rq('#txtExpirationDate').val()).valueOf() + (new Date().getTimezoneOffset() * 60 * 1000)).valueOf() + 86399999;
                    var duration = (expirationDate - (new Date().valueOf())) / 86400000;
                    if (duration < 0) duration = 0;
                    expire = { expires: duration };
                }
            }
        }
        var brandCode = rq('.rollick-form-vehicle-type-select').val();
        rollick.brandCode = brandCode;
        if (brandCode == 'Off Road') rollick.brandCode = 'TOR';
        if (brandCode == 'Snow') rollick.brandCode = 'ARC';
        Cookies.set('rollick-default-dealer-brand', brandCode, expire);
        Cookies.set('rollick-default-dealer-name', rq('#rollick-specific-dealer').val(), expire);
        Cookies.set('rollick-default-dealer-id', rq('#rollick-specific-dealer-id').val(), expire);
        rollick.dealerDisplayDealer();
    },

    dealerDisplayDealer: function (dealerId) {
        if (!rollick.brandCode && rollick.siteId) rollick.brandCode = rollick.siteId;
        if (!rollick.enablePreselect[rollick.brandCode]) return;
        if (typeof Cookies !== 'function') return;
        var selectedDealerId = Cookies.get('rollick-default-dealer-id') || sessionStorage['rollick-dealer-id'] || dealerId || '';
        var selectedDealer = '';
        rq('#rollick-specific-dealer-id').val('');
        rq('#rollick-specific-dealer-name').val('');
        rq('#rollick-specific-dealer').removeAttr('readonly');
        delete sessionStorage['rollick-dealer-name'];
        if (selectedDealerId) {
            rq('#rollick-specific-dealer-label').text('...');
            var localDealer = null;
            if (rollick.dealersList && rollick.dealersList.length) {
                localDealer = rollick.dealersList.filter(function (d) { return d.id == dealerId; }).pop();
            }
            if (!localDealer) {
                rq.get(rollick.widget + '/aimbase-verify-dealer/' + selectedDealerId, function (data) {
                    if (data && data.result) {
                        selectedDealer = data.name;
                        rq('#rollick-specific-dealer-id').val(selectedDealerId);
                        sessionStorage['rollick-dealer-name'] = selectedDealer;
                        if (rollick.leadType.toLowerCase() == 'pre-order' && location.href.indexOf('place-snow-pre-order') == -1) {
                            if (rollick.preorder && rollick.preorder.ends && rollick.preorder.ends > (new Date()).valueOf()) {
                                rq('.standard-marquee__intro div.subhead').html('<h3>Welcome, ' + sessionStorage['rollick-dealer-name'] + '</h3>').show();
                                rq('.rollick-preorder-message').remove();
                                rq('#main-content .rte-body-component:first').before('<div class="rollick-preorder-message rte-body-component rollick-mb rollick-center">This page is for selecting and submitting your Model Year 2023 pre-orders.<br>This page should not be shared with anyone outside your dealership, including customers.<br><br>To get started, please select your model of interest</div>');
                                rq('#main-content .content-segment--2').css('margin-top', '0');
                            }
                        }
                    } else {
                        delete sessionStorage['rollick-dealer-id'];
                        delete sessionStorage['rollick-dealer-name'];
                        /*
                        if (rollick.leadType.toLowerCase() == 'pre-order' && location.href.indexOf('place-snow-pre-order') == -1) {
                            if (rollick.preorder && rollick.preorder.ends && rollick.preorder.ends > (new Date()).valueOf()) {
                                rq('.standard-marquee__intro div.subhead').hide();
                                rq('.rollick-preorder-message').remove();
                                rq('#main-content .rte-body-component:first').before('<div class="rollick-preorder-message rte-body-component rollick-mb rollick-center">This page is for Arctic Cat dealer use only.<br><br>If you are a dealer and you do not have your shopping cart link, <br>please contact your Arctic Cat support team member.</div>');
                                rq('.rollick-form-preorder').addClass('rollick-hidden');
                            }
                        }
                        */
                        rq('#rollick-specific-dealer-id').val('');
                        rq('.rollick-specific-dealer-selected').addClass('rollick-hidden');
                        rq('.rollick-specific-dealer-not-selected').removeClass('rollick-hidden');
                    }
                    rq('#rollick-specific-dealer-name').val(selectedDealer);
                    rq('#rollick-specific-dealer-label').text(selectedDealer);
                    if (rq('#rollick-specific-dealer-label').length == 0) {
                        rq('#rollick-specific-dealer').val(selectedDealer);
                        rq('#rollick-specific-dealer').attr('readonly', 'readonly');
                    }
                });
            } else {
                rq('#rollick-specific-dealer-id').val(selectedDealerId);
                rq('#rollick-specific-dealer-name').val(localDealer.name);
                rq('#rollick-specific-dealer-label').text(localDealer.name);
                if (rollick.leadType.toLowerCase() == 'pre-order' && location.href.indexOf('place-snow-pre-order') == -1) {
                    if (rollick.preorder && rollick.preorder.ends && rollick.preorder.ends > (new Date()).valueOf()) {
                        rq('.standard-marquee__intro div.subhead').html('<h3>Welcome, ' + localDealer.name + '</h3>').show();
                        rq('.rollick-preorder-message').remove();
                        rq('#main-content .rte-body-component:first').before('<div class="rollick-preorder-message" style="text-align: center">This page is for selecting and submitting your Model Year 2023 pre-orders.<br>This page should not be shared with anyone outside your dealership, including customers.<br><br>To get started, please select your model of interest</div>');
                        rq('#main-content .content-segment--2').css('margin-top', '0');
                    }
                }
            }
        } else {
            rq('#rollick-specific-dealer-label').text(selectedDealer);
            if (rq('#rollick-specific-dealer-label').length == 0) rq('#rollick-specific-dealer').val(selectedDealer);
            /*
            if (rollick.leadType.toLowerCase() == 'pre-order' && location.href.indexOf('place-snow-pre-order') == -1) {
                if (rollick.preorder && rollick.preorder.ends && rollick.preorder.ends > (new Date()).valueOf()) {
                    rq('.standard-marquee__intro div.subhead').hide();
                    rq('.rollick-preorder-message').remove();
                    rq('#main-content .rte-body-component:first').before('<div class="rollick-preorder-message rte-body-component rollick-mb rollick-center">This page is for Arctic Cat dealer use only.<br><br>If you are a dealer and you do not have your shopping cart link, <br>please contact your Arctic Cat support team member.</div>');
                    rq('.rollick-form-preorder').addClass('rollick-hidden');
                }
            }
            */
        }
    },

    dealerChangeExpiration: function () {
        var selection = rq('#cboExpire').val();
        var d = '';
        var c = rq('#txtExpirationDate');
        switch (selection) {
            case '-1':
                c.addClass('rollick-hidden');
                d = '9999-12-31';
                break;
            case '1':
                c.addClass('rollick-hidden');
                d = ((new Date((new Date()).valueOf() + (1 * 86400000)).toISOString()).split('T')[0]);
                break;
            case '7':
                c.addClass('rollick-hidden');
                d = ((new Date((new Date()).valueOf() + (7 * 86400000)).toISOString()).split('T')[0]);
                break;
            default:
                c.removeClass('rollick-hidden');
                break;
        }
        rq('#txtExpirationDate').val(d);
    },

    dealerLoad: function () {
        var self = this;
        var currentSelectedDealerId = rq('#rollick-specific-dealer-id').val() || '';
        var currentCustomDealer = rq('#rollick-specific-dealer').val();
        if (!rollick.brandCode && rollick.siteId) rollick.brandCode = rollick.siteId;
        if (!rollick.enablePreselect[rollick.brandCode]) {
            rq('.rollick-form-dealer').find('button').prop('disabled', true);
            rq('.rollick-form-dealer').find('select').prop('disabled', true);
            rq('.rollick-form-dealer').find('input[type=text]').prop('disabled', true);
            rq('.rollick-form-dealer').find('.rollick-warning').removeClass('rollick-hidden');
            return;
        }
        if (typeof Typeahead === 'undefined' || !rq('#rollick-specific-dealer').typeahead) {
            window.setTimeout(function () {
                rollick.dealerInit();
            }, 100);
            return;
        }
        var country = rq('.rollick-form-country-select').val() || 'US';
        if (rollick.cart && rollick.cart.country) country = rollick.cart.country;
        var brand = rollick.siteId;
        if (brand == 'ARC2') {
            var vtype = rollick.vehicle.category;
            brand = 'TOR';
            if (vtype == 'Snowmobiles' || location.href.toLowerCase().indexOf('/snowmobile/') != -1) brand = 'ARC';
        }
        rollick.brandCode = brand;
        rollick.dealerClearDealer();
        var selectedDealerId = Cookies.get('rollick-default-dealer-id') || sessionStorage['rollick-dealer-id'] || currentSelectedDealerId || '';
        var selectedBrand = Cookies.get('rollick-default-dealer-brand') || '';
        if (!selectedDealerId || selectedBrand != brand || rq('#cboExpire').length) {
            if (sessionStorage['rollick-dealer-id']) {
                rq('.rollick-specific-dealer-selected').removeClass('rollick-hidden');
                rq('.rollick-specific-dealer-not-selected').addClass('rollick-hidden');
            } else {
                rq('.rollick-specific-dealer-selected').addClass('rollick-hidden');
                rq('.rollick-specific-dealer-not-selected').removeClass('rollick-hidden');
            }
            try { rq('#rollick-specific-dealer').typeahead('destroy'); } catch (e) { }
            rq('#rollick-specific-dealer').attr('placeholder', 'Loading Dealers...').prop('disabled', true);
            rollick.dealerDisplayDealer();
            rq.post(rollick.widget + '/aimbase-list-dealers', { countryCode: country, brandCode: brand }, function (data) {
                rollick.dealersList = JSON.parse(JSON.stringify(data));
                if (rollick.showBFH() && rq('#rollick-bfh').is(':checked')) {
                    rollick.dealersList = rollick.dealersList.filter(function (dealer) { return dealer.bfh; });
                }

                rollick.dealers = new Bloodhound({
                    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name'),
                    queryTokenizer: Bloodhound.tokenizers.whitespace,
                    identify: function (obj) { return obj.name; },
                    local: rollick.dealersList
                });

                rq('#rollick-specific-dealer').attr('placeholder', 'Search For Dealer').prop('disabled', false);
                rq('#rollick-specific-dealer').typeahead({
                    minLength: 0,
                    highlight: true
                },
                    {
                        name: 'dealers',
                        display: 'name',
                        source: rollick.dealers,
                        limit: 10,
                        templates: {
                            suggestion: function (data) {
                                return '<div class="rollick-form-submit">' + data.name + ' | ' + data.city + ' ' + data.state + '</div>';
                            }
                        }
                    }
                ).on('change blur', function () {
                    rq('.rollick-specific-dealer-error').addClass('rollick-hidden');
                    var match = false;
                    var dealerName = rq('#rollick-specific-dealer').val().trim();
                    if (rq('#rollick-dealer-choice-customer').is(':checked')) {
                        rq('#rollick-specific-dealer-id').val('');
                        rq('#rollick-specific-dealer-name').val('');
                    }
                    if (dealerName) {
                        rq.each(self.dealers.index.datums, function (i, item) {
                            if (dealerName == item.name) {
                                rq('#rollick-specific-dealer-id').val(item.id);
                                rq('#rollick-specific-dealer-name').val(item.name);
                                rq('#rollick-specific-dealer').typeahead('val', item.name);
                                match = true;
                            }
                        });
                        if (!match) {
                            rq.each(self.dealers.index.datums, function (i, item) {
                                if (dealerName.toLowerCase() == item.name.toLowerCase()) {
                                    rq('#rollick-specific-dealer-id').val(item.id);
                                    rq('#rollick-specific-dealer-name').val(item.name);
                                    rq('#rollick-specific-dealer').typeahead('val', item.name);
                                    match = true;
                                }
                            });
                        }
                        if (match) {
                            rq('#rollick-dealer-choice-customer').prop('checked', true);
                            rq('.rollick-preorder-specific-dealer-error').addClass('rollick-hidden');
                        } else {
                            rq('.rollick-preorder-specific-dealer-error').removeClass('rollick-hidden');
                        }
                    }
                    self.validateForm();
                });
                rq('#rollick-specific-dealer').off('typeahead:selected typeahead:autocompleted').on('typeahead:selected typeahead:autocompleted', function (e, datum) {
                    rq('#rollick-specific-dealer-id').val(datum.id);
                    rq('#rollick-specific-dealer-name').val(datum.name);
                    rq('#rollick-specific-dealer').typeahead('val', datum.name);
                    rq('#rollick-dealer-choice-customer').prop('checked', true);
                    rq(e.target).blur();
                    rq('#rollick-specific-dealer').removeClass('error');
                    rollick.validateForm();
                });
                rollick.getQueryDealerId();
                if (currentSelectedDealerId) {
                    if (rollick.dealersList.filter(function (dealer) { return dealer.id == currentSelectedDealerId; }).length == 0) {
                        rollick.dealerClearDealer();
                    } else {
                        if (rq('#rollick-dealer-choice-customer').is(':checked')) {
                            rollick.dealerDisplayDealer();
                            rq('#rollick-specific-dealer').typeahead('val', currentCustomDealer);
                            rq('#rollick-specific-dealer').trigger('change');
                        }
                    }
                }
                if (rollick.inseason && rollick.inseason[rollick.brandCode.toLowerCase()]) {
                    rq('.rollick-specific-dealer-not-selected').addClass('rollick-hidden');
                }
            }, 'json');
        } else {
            rq('.rollick-specific-dealer-selected').removeClass('rollick-hidden');
            rq('.rollick-specific-dealer-not-selected').addClass('rollick-hidden');
            rollick.dealerDisplayDealer();
        }
    },

    setDefaultDealer: function (options) {
        if (options.div) {
            var form = 'textron/select-dealer.html';
            if (rollick.siteId == 'EZG') {
                form = 'textron/select-dealer-ezg.html';
            }
            rq.get(rollick.widget + '/widgets/templates/' + form, function (data) {
                data = data.replace('2019-01-01', new Date().toISOString().split('T')[0]);
                rq(options.div).html(data);
                window.setTimeout(function () {
                    rollick.dealerInit();
                }, 10);
            });
        }
    },

    locateDealer: function (country, brand, postalCode) {
        var self = this;
        if (self.siteId == 'ARC2') {
            return self.locateDealerNew(country, brand, postalCode);
        } else {
            if (!rollick.locateDealerBusy) {
                rq('.rollick-specific-dealer-error').addClass('rollick-hidden');
                rollick.locateDealerBusy = true;
                var bfh = (rollick.showBFH() && rq('#rollick-bfh').is(':checked'));
                if (bfh) {
                    if (postalCode.length == 5 || postalCode.length == 7) {
                        rq('#rollick-specific-dealer').val('...');
                        var endpoint = '/aimbase-locate-bfh-dealer';
                        rq.post(rollick.widget + endpoint, { countryCode: country, brandCode: brand, postalCode: postalCode }, function (data) {
                            if (data && data.id) {
                                rollick.dealerDisplayDealer(data.id);
                                rq('#rollick-specific-dealer').val(data.name);
                                rq('#rollick-specific-dealer').typeahead('val', data.name);
                            } else {
                                rollick.dealerDisplayDealer('');
                                rq('#rollick-specific-dealer').typeahead('val', '');
                                rq('.rollick-specific-dealer-error').removeClass('rollick-hidden');
                            }
                            rollick.locateDealerBusy = false;
                            rollick.validateForm();
                        });
                    } else {
                        rollick.dealerDisplayDealer('');
                        rq('#rollick-specific-dealer').typeahead('val', '');
                        rq('.rollick-specific-dealer-error').addClass('rollick-hidden');
                        rollick.locateDealerBusy = false;
                        rollick.validateForm();
                    }
                } else {
                    rq('.rollick-specific-dealer-error').addClass('rollick-hidden');
                    rollick.locateDealerBusy = false;
                    rollick.validateForm();
                }
            }
        }
    },

    locateDealerNew: function (country, brand, postalCode) {
        // rollick-dealer-choice-closest
        var self = this;
        if (rollick.inseason && rollick.inseason[brand.toLowerCase()]) {
            delete self.closestPostalCode;
            delete self.closestDealerId;
            self.closestDealerName = '';
            rq('.rollick-inseason-warning').addClass('rollick-hidden');
            try {
                rq('.rollick-specific-dealer-error').addClass('rollick-hidden');
                self.getInSeasonDealer(country, brand, postalCode).then((dealer) => {
                    if (dealer) {
                        if (window.console && rollick.debugMode) console.log('Closest in-season dealer: ', dealer);
                        self.closestPostalCode = postalCode;
                        self.closestDealerId = dealer.id;
                        self.closestDealerName = dealer.name;
                        self.dealerDisplayDealer(dealer.id);
                        rq('.rollick-specific-dealer-selected').removeClass('rollick-hidden');
                    } else {
                        // cannot find in-season dealer, show generic message to closest dealer
                        self.dealerDisplayDealer('');
                        rq('.rollick-inseason-warning').removeClass('rollick-hidden');
                        rq('.rollick-specific-dealer-selected').addClass('rollick-hidden');
                    }
                });
            } catch (e) {
                // cannot find in-season dealer
                self.dealerDisplayDealer('');
                rq('.rollick-inseason-warning').removeClass('rollick-hidden');
                rq('.rollick-specific-dealer-selected').addClass('rollick-hidden');
            }
            return;
        }
        if (!self.locateDealerBusy) {
            rq('.rollick-specific-dealer-error').addClass('rollick-hidden');
            self.locateDealerBusy = true;
            if (!rq('.rollick-form-submit').hasClass('disabled')) rq('.rollick-form-submit').addClass('disabled');
            var bfh = (self.showBFH() && rq('#rollick-bfh').is(':checked'));
            if (rq('#rollick-dealer-choice-closest').is(':checked')) {
                if (bfh) {
                    if (self.closestPostalCode && self.closestPostalCode == postalCode && self.closestDealerId) {
                        self.dealerDisplayDealer(self.closestDealerId);
                        rq('#rollick-specific-dealer-id').val(self.closestDealerId);
                        rq('#rollick-specific-dealer-name').val(self.closestDealerName);
                        self.locateDealerBusy = false;
                        self.validateForm();
                    } else {
                        if (postalCode.length == 5 || postalCode.length == 7) {
                            var endpoint = '/aimbase-locate-bfh-dealer';
                            rq.post(self.widget + endpoint, { countryCode: country, brandCode: brand, postalCode: postalCode }, function (data) {
                                if (data && data.id) {
                                    self.closestPostalCode = postalCode;
                                    self.closestDealerId = data.id;
                                    self.closestDealerName = data.name;
                                    self.dealerDisplayDealer(data.id);
                                    rq('#rollick-specific-dealer-id').val(data.id);
                                    rq('#rollick-specific-dealer-name').val(data.name);
                                } else {
                                    self.dealerDisplayDealer('');
                                    rq('#rollick-specific-dealer-id').val('');
                                    rq('#rollick-specific-dealer-name').val('');
                                }
                                self.locateDealerBusy = false;
                                self.validateForm();
                            });
                        } else {
                            self.dealerDisplayDealer('');
                            rq('#rollick-specific-dealer-id').val('');
                            rq('#rollick-specific-dealer-name').val('');
                            self.locateDealerBusy = false;
                            self.validateForm();
                        }
                    }
                } else {
                    delete self.closestPostalCode;
                    delete self.closestDealerId;
                    self.closestDealerName = '';
                    rq('#rollick-specific-dealer-id').val('');
                    rq('#rollick-specific-dealer-name').val('');
                    rq('.rollick-specific-dealer-error').addClass('rollick-hidden');
                    self.locateDealerBusy = false;
                    self.validateForm();
                }
            } else {
                self.locateDealerBusy = false;
                delete self.closestPostalCode;
                delete self.closestDealerId;
                self.closestDealerName = '';
            }
        }
    },

    loadTypeahead: function () {
        if (!rollick.brandCode && rollick.siteId) rollick.brandCode = rollick.siteId;
        if (rollick.enablePreselect && rollick.enablePreselect[rollick.brandCode]) {
            if (typeof Typeahead === 'undefined') {
                var s = document.createElement('script');
                s.async = true;
                s.id = 'Typeahead';
                s.type = 'text/javascript';
                s.onload = function () {
                    Typeahead = {};
                    rollick.dealerInit();
                }
                s.src = rollick.widget + '/widgets/scripts/typeahead.bundle.js';
                s.onerror = function () {
                    rollick.maintenance = true;
                }
                var t = document.getElementsByTagName('script')[0];
                t.parentNode.insertBefore(s, t);
            }
        }
    },

    loadScript: function (src, id) {
        if (!rollick.scriptLoaded[id]) {
            if (rollick.debugMode && window.console) console.log('Loading script id' + id + ': ' + src);
            rollick.scriptLoaded[id] = true;
            var tag = document.createElement('script');
            tag.src = src;
            document.body.appendChild(tag);
        }
    },

    showLoading: function () {
        rq('.rollick-loading').removeClass('rollick-hidden');
    },

    hideLoading: function () {
        rq('.rollick-loading').addClass('rollick-hidden');
    },

    getQueryDealerId: async function () {
        var dealerId = rollick.getSearchParams('dealerid');
        var dealerNo = rollick.getSearchParams('dealerno');
        if (dealerNo) {
            try {
                rollick.dealerMappings = await rq.get(rollick.widget + '/aimbase-dealer-mappings');
                if (rollick.dealerMappings[dealerNo] && !dealerId) dealerId = rollick.dealerMappings[dealerNo];
            } catch (e) {
            }
        }
        if (dealerId) {
            sessionStorage['rollick-allow-preorder'] = 'Yes';
        }
        dealerId = dealerId || sessionStorage['rollick-dealer-id'];
        if (dealerId) {
            sessionStorage['rollick-dealer-id'] = dealerId;
            rq('.rollick-specific-dealer-selected').removeClass('rollick-hidden');
            rq('.rollick-specific-dealer-not-selected').addClass('rollick-hidden');
            rollick.dealerDisplayDealer();
        } else {
            // if (!Cookies.get('rollick-default-dealer-id')) sessionStorage['rollick-dealer-id'] = '';
        }
    },

    getQueryDtD: function () {
        var dtd = false;
        var dtdQS = rollick.getSearchParams('dtd');
        if (dtdQS == '1' || dtdQS.toLowerCase() == 'y') dtd = true;
        return dtd;
    },

    getQueryZip: function () {
        return rollick.getSearchParams('zip');
    },

    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 '';
    },

    showBFH: function () {
        var type = rq('#rollick-vehicle-type').val();
        if (rollick.siteId.toLowerCase() == 'arc2') {
            if (type == 'Off Road') return rollick.bfh[rollick.siteId.toLowerCase()]['Off Road'].enabled;
            if (type == 'Snow') return rollick.bfh[rollick.siteId.toLowerCase()]['Snow'].enabled;
            return false;
        }
        if (rollick.siteId.toLowerCase() == 'ezg') {
            return rollick.bfh[rollick.siteId.toLowerCase()].enabled;
        }
        return false;
    },

    toggleBFH: function () {
        var show = rollick.showBFH();
        if (show) {
            rq('.rollick-vehicle-bfh').removeClass('rollick-hidden');
        } else {
            rq('.rollick-vehicle-bfh').addClass('rollick-hidden');
        }
    },

    showProgramDetails: function () {
        var url = '';
        var type = rq('#rollick-vehicle-type').val();
        if (rollick.siteId.toLowerCase() == 'arc2') {
            if (type == 'Off Road') url = rollick.bfh[rollick.siteId.toLowerCase()]['Off Road'].url;
            if (type == 'Snow') url = rollick.bfh[rollick.siteId.toLowerCase()]['Snow'].url;
        }
        if (rollick.siteId.toLowerCase() == 'ezg') {
            url = rollick.bfh[rollick.siteId.toLowerCase()].url;
        }
        if (url != '') window.open(url);
        return false;
    },

    isAvailable: function (vehicle, leadType, country) {
        var available = false;
        var leadTypeCode = 'RAQ';
        if (leadType.toLowerCase() == 'pre-order') leadTypeCode = 'PRE';
        if (!rollick.useNewACDatafile) {
            available = true;
        } else {
            if (vehicle[leadTypeCode]) {
                if (vehicle[leadTypeCode][country || 'US']) {
                    available = true;
                }
            }
        }
        if (leadTypeCode == 'PRE' && !sessionStorage['rollick-dealer-id'] && (new Date()).valueOf() > (rollick.preorder && rollick.preorder.ends)) available = false;
        return available;
    },

    getTrimName: function (vehicle) {
        // convert raw data into trim that can be mapped to trimId
        const appendTrack = ['M 8000 Hardcore Alpha One', 'M 6000 Alpha One', 'M 8000 Mountain Cat', 'M 8000 Mountain Cat Alpha One', 'Riot 8000', 'Riot X 8000', 'ZR 6000 Limited', 'ZR 8000 Limited', 'ZR 9000 Thundercat'];
        const appendSuspension = ['Riot 8000', 'Riot X 8000', 'ZR 6000 Limited', 'ZR 8000 Limited', 'ZR 9000 Thundercat'];
        const appendStarter = ['M 8000 Hardcore Alpha One', 'M 6000 Alpha One', 'M 8000 Mountain Cat', 'M 8000 Mountain Cat Alpha One'];
        var originalModelName = vehicle.modelName || vehicle.model;
        var trimName = '';
        if (appendTrack.indexOf(originalModelName) != -1) {
            trimName += ' ' + vehicle.track.replace(/\"/g, '').replace('2.60', '2.6').replace('3.00', '3.0').replace('/', ' ').replace(' 1.60', ' 1.6').replace(' 1.25', '');
        }
        if (appendSuspension.indexOf(originalModelName) != -1) {
            trimName += ' ' + vehicle.suspension.replace(' Shocks', '');
        }
        if (appendStarter.indexOf(originalModelName) != -1) {
            if (vehicle.starter.indexOf('Electric') != -1) trimName += ' ES';
        }
        return trimName.trim();
    },

    formatPhone: function (phone) {
        if (!phone) return "";
        var fphone = phone.replace(/\D/g, "");
        if (fphone.length == 10) {
            fphone = '(' + fphone.substring(0, 3) + ') ' + fphone.substring(3, 6) + '-' + fphone.substring(6, 10);
        }
        return fphone;
    },

    getInventory: function (veh, options) {
        if (options && options.constructor === Object && options.hasOwnProperty("redirectUrl")) {
            var supported_params = {
                "modelyear": "year",
                "modelname": "model",
                "track": "track",
                "trackType": "trackType",
                "starter": "starter",
                "suspension": "suspension",
                "modelcode": "modelnumber",
                "color": "color",
                "accessories": "",
                "country": "language",
                "location": "zip",
                "dealer": "dealer",
                "redirectUrl": "",
                "page": "page",
                "distance": "distance",
                "dealersearch": "dealerSearch",
                "sort": "sort"
            };
            var default_params = {
                // "dealersearch": location.href,
                "page": 1,
                "distance": 50,
                "sort": "distance"
            };
            var qs = '';
            veh = veh || {};
            options = options || {};
            if (veh.constructor === Object && options.constructor === Object) {
                var _veh_params = Object.keys(veh);
                var _opt_params = Object.keys(options);
                var _supported_params = Object.keys(supported_params);
                var _default_params = Object.keys(default_params);
                var _params = [].concat(_veh_params, _opt_params);
                var _params_ = [];
                _params.forEach(function (v) {
                    var _v = (v || '').toLowerCase();
                    _params_.push(_v);
                    if (_supported_params.indexOf(_v) >= 0 && supported_params[_v]) {
                        if (qs) {
                            qs = qs + "&" + supported_params[_v] + "=" + encodeURIComponent(veh[v] || options[v]);
                        } else {
                            qs = supported_params[_v] + "=" + encodeURIComponent(veh[v] || options[v]);
                        }
                    }
                });
                _default_params.forEach(function (v) {
                    var _v = (v || '').toLowerCase();
                    if (_params_.indexOf(_v) < 0 && supported_params[_v]) {
                        if (qs) {
                            qs = qs + "&" + supported_params[_v] + "=" + encodeURIComponent(default_params[_v]);
                        } else {
                            qs = supported_params[_v] + "=" + encodeURIComponent(default_params[_v]);
                        }
                    }
                });
            }
            return options['redirectUrl'] + (qs ? "?" + qs : '');
        }
    },

    resizeIframe: function (obj) {
        rq('#rol_ezgo_loader').hide();
        //obj.style.height = rq(obj).parent().height() + 'px';
        obj.style.width = (rq(obj).parent().width() - 20) + 'px';
        rq(window).resize(function () {
            //obj.style.height = rq(obj).parent().height() + 'px';
            obj.style.width = (rq(obj).parent().width() - 20) + 'px';
        });
    },

    saveZIP: function (zip) {
        if (localStorage && zip && zip.length === 5) {
            localStorage.setItem('FILTER:ZIP', zip);
        }
    },

    getZIP: function () {
        if (localStorage) {
            return localStorage.getItem('FILTER:ZIP');
        }
        return '';
    },

    displayInventory: function (payload, options) {
        var redirection_url = '';
        var containerId = options.div;
        var inventoryId = rollick.getSearchParams('id');
        var zip = rollick.getSearchParams('zip');
        var qs = location.search;
        if (zip && zip.length === 5) {
            rollick.saveZIP(zip);
        } else {
            zip = rollick.getZIP();
            var searchParams = rollick.getAllSearchParams();
            searchParams.zip = zip;
            var result = rq.param(searchParams);
            if (result) { qs = '?' + result; }
        }
        inventoryId = (inventoryId || '').replace(/-/g, '');
        var isVDP = false;
        if (inventoryId && inventoryId.length === 32) {
            isVDP = true;
        }
        var isLocal = /(localhost)/i.test(location.hostname);
        let isQA = (rollick.widget == 'https://widget-qa.rollick.io') || (rollick.widget == 'https://widget-staging.rollick.io');
        var orgn = isLocal ? location.origin : (isQA ? 'https://qa.gorollick.com' : 'https://gorollick.com');
        if (!isVDP) {
            redirection_url = orgn + '/portals/ezgo/inventory/new-golf-carts-for-sale' + qs;
        } else {
            redirection_url = orgn + '/portals/ezgo/details/' + inventoryId + qs;
        }
        rq(containerId).html("<p id='rol_ezgo_loader' style='text-align:center; padding: 50px; font-size:30px;'><i class='fa fa-circle-o-notch fa-spin'></i></p>");
        rq(containerId).append("<iframe id='rollick_e_z_go_container' frameborder='0' allowtransparency='true' allow='geolocation' src='" + redirection_url + "' style='width:0;height:400px' onload='rollick.resizeIframe(this)'></iframe>");
    },

    displayDealerInventory: function (payload, options) {
        var redirection_url = '';
        var containerId = options.div;
        var inventoryId = rollick.getSearchParams('id');
        var _condition = rollick.getSearchParams('condition');
        _condition = (_condition || "N, U").toUpperCase();
        var zip = rollick.getSearchParams('zip');
        var qs = location.search;
        if (zip && zip.length === 5) {
            rollick.saveZIP(zip);
        } else {
            zip = rollick.getZIP();
            var searchParams = rollick.getAllSearchParams();
            searchParams.zip = zip;
            var result = rq.param(searchParams);
            if (result) { qs = '?' + result; }
        }
        inventoryId = (inventoryId || '').replace(/-/g, '');
        var isVDP = false;
        if (inventoryId && inventoryId.length === 32) {
            isVDP = true;
        } else if (inventoryId && /^\d+$/.test(inventoryId)) {
            isVDP = true;
        }
        var isLocal = /(localhost)/i.test(location.hostname);
        let isQA = (rollick.widget == 'https://widget-qa.rollick.io') || (rollick.widget == 'https://widget-staging.rollick.io');
        var orgn = isLocal ? location.origin : (isQA ? 'https://qa.gorollick.com' : 'https://gorollick.com');
        if (!isVDP) {
            var _slug_start = '';
            if (_condition == 'S') {
                _slug_start = 'showroom';
            } else if (_condition == 'N') {
                _slug_start = 'new';
            } else if (_condition == 'U') {
                _slug_start = 'used';
            } else {
                _slug_start = 'new';
                // _slug_start = 'inventory';
            }
            redirection_url = orgn + '/portals/ezgo/dealer/inventory/' + _slug_start + '-golf-carts-for-sale' + qs;
        } else {
            redirection_url = orgn + '/portals/ezgo/dealer/details/' + inventoryId + qs;
        }
        rq(containerId).html("<p id='rol_ezgo_loader' style='text-align:center; padding: 50px; font-size:30px;'><i class='fa fa-circle-o-notch fa-spin'></i></p>");
        rq(containerId).append("<iframe id='rollick_e_z_go_container' frameborder='0' allowtransparency='true' allow='geolocation' src='" + redirection_url + "' style='width:0;height:400px' onload='rollick.resizeIframe(this)'></iframe>");
    },

    checkContainer: function () {
        if (!rq(rollick.div).length) {
            rq('body').append("<div id='" + rollick.div.substring(1) + "'></div>");
        }
    },

    setQueryString: function (qs) {
        if (qs) {
            if (history.pushState) {
                var newurl = window.location.protocol + "//" + window.location.host + window.location.pathname + '?' + qs;
                window.history.pushState({ path: newurl }, '', newurl);
            } else {
                window.location.href = window.location.origin + window.location.pathname + "?" + qs;
            }
        }
    },

    MessageHandler: function (message) {
        var self = this;
        if (message.command) {
            switch (message.command.toLowerCase()) {
                case 'set querystring':
                    self.setQueryString(message.payload);
                    break;
                case 'submit quote':
                    self.checkContainer();
                    self.getQuote(message.payload.vehicle, message.payload.options);
                    rq('body').css('overflow', 'hidden');
                    break;
                case 'set scroll position':
                    self.setScrollPosition();
                    break;
                case 'reset scroll position':
                    self.resetScrollPosition();
                    break;
                case 'applay scroll position':
                    self.applayScrollPosition();
                    break;
                case 'close flyout':
                    self.closeFlayout('ezgo_rollick_tray');
                    break;
                case 'set session variable':
                    let variable = message.payload.key;
                    let value = message.payload.value;
                    self[variable] = value;
                    break;
                case 'set iframe dimensions':
                    let iframe = rq('#rollick_e_z_go_container');
                    iframe.height(message.payload.height || 300);
                    break;
                case 'get parent url':
                    var iframeWindow = rq('#rollick_e_z_go_container')[0].contentWindow;
                    iframeWindow.postMessage({ command: "set parent url", payload: { 'url': window.location.href } }, '*');
                    break;
                case 'hidescroll':
                    rq('body').css('overflow', 'hidden');
                    break;
                case 'trackga':
                    let gaCategory = message.payload.category || "";
                    let gaAction = message.payload.action || "";
                    let gaLabel = message.payload.label || "";
                    let gaValue = message.payload.value || "";
                    self.roTrackGA(gaCategory, gaAction, gaLabel, gaValue);
                    break;
            }
        }
    },

    setScrollPosition: function () {
        sessionStorage['r_scroll'] = JSON.stringify([0, rq(window).scrollTop()]);
    },

    resetScrollPosition: function () {
        window.scrollTo(0, 0)
    },

    applayScrollPosition: function () {
        var scrollPosition = JSON.parse(sessionStorage['r_scroll'] || "[0, 0]");
        window.scrollTo(scrollPosition[0], scrollPosition[1]);
    },

    StartListener: function () {
        var self = this;
        window.addEventListener('message', function (event) {
            if (self.debugMode) console.log("POST Message listener:", event.origin);
            if (event.data && event.data.constructor === Array) {
                for (var i = 0; i < event.data.length; i++) {
                    var message = event.data[i];
                    self.MessageHandler(message);
                }
            } else {
                var message = event.data;
                self.MessageHandler(message);
            }
        });
    },

    loadCart() {
        if (rollick.preorder) {
            if (typeof rollick.preorder.loadCart == 'function') {
                if ((new Date()).valueOf() > rollick.preorder.ends && sessionStorage['rollick-allow-preorder'] != 'Yes') {
                    var luid = rollick.getSearchParams("luid");
                    if (luid) {
                        // show message
                        rollick.preorder.openCart();
                    }
                } else {
                    var luid = rollick.getSearchParams("luid");
                    if (!luid) {
                        rollick.preorder.loadCart();
                    } else {
                        // restore cart from leadUid
                        rollick.preorder.generateCart(luid);
                    }
                }
            }
        }
    },

    openCart() {
        if (rollick.preorder) {
            if (typeof rollick.preorder.openCart == 'function' && ((rollick.preorder.ends || 0) > (new Date()).valueOf())) {
                rollick.preorder.openCart();
            } else {
                if (((rollick.preorder.ends || 0) < (new Date()).valueOf())) {
                    rollick.preorder.openCart();
                    return;
                }
                var form = 'textron/' + rollick.siteId.toLowerCase() + '/cart-no-event.html';
                rq('.rollick-form').remove();
                rq('body').css('overflow', 'auto');
                rq.get(rollick.widget + '/widgets/templates/' + form, function (data) {
                    rq('body').css('overflow', 'hidden').append(data);
                    rq('.rollick-form').show();
                    window.setTimeout(function () {
                        rq('.rollick-form').addClass('tray--active');
                        rq('.rollick-form-fields').show();
                    }, 10);
                });
            }
        } else {
            var form = 'textron/' + rollick.siteId.toLowerCase() + '/cart-no-event.html';
            rq('.rollick-form').remove();
            rq('body').css('overflow', 'auto');
            rq.get(rollick.widget + '/widgets/templates/' + form, function (data) {
                rq('body').css('overflow', 'hidden').append(data);
                rq('.rollick-form').show();
                window.setTimeout(function () {
                    rq('.rollick-form').addClass('tray--active');
                    rq('.rollick-form-fields').show();
                }, 10);
            });
        }
    },

    addToCart(options) {
        if (rollick.preorder && typeof rollick.preorder.addToCart == 'function') {
            rollick.preorder.addToCart(options);
        }
    },

    titleCase(val) {
        var retVal = '';
        var elems = val.split(' ');
        for (var i = 0; i < elems.length; i++) {
            if (!elems[i].length) {
                elems[i] = null;
            } else {
                if (elems[i].length > 1) {
                    elems[i] = elems[i].substring(0, 1).toUpperCase() + elems[i].substring(1);
                } else {
                    elems[i] = elems[i].toUpperCase();
                }
            }
        }
        retVal = elems.filter(function (e) { return e; }).join(' ');
        if (val.endsWith(' ')) retVal += ' ';
        return retVal;
    },

    simpleHash(s) {
        for (var i = 0, h = 0x0c0fefe0; i < s.length; i++)
            h = Math.imul(h ^ s.charCodeAt(i), 8675309);
        return (h ^ h >>> 16) >>> 0;
    },

    generateVehicleDetailsHtml(sku) {
        var output = "";
        output += "<div><div class='carousel-block-left'><b>Year :</b></div><div class='carousel-block-right'>" + sku.year + "</div></div>";
        output += "<div><div class='carousel-block-left'><b>Color :</b></div><div class='carousel-block-right'>" + sku.color + "</div></div>";
        if (sku.track) output += "<div><div class='carousel-block-left'><b>Track/Lug :</b></div><div class='carousel-block-right'>" + sku.track + "</div></div>";
        if (sku.trackType) output += "<div><div class='carousel-block-left'><b>Track Type :</b></div><div class='carousel-block-right'>" + sku.trackType + "</div></div>";
        if (sku.starter) output += "<div><div class='carousel-block-left'><b>Starter :</b></div><div class='carousel-block-right'>" + sku.starter + "</div></div>";
        if (sku.suspension) output += "<div><div class='carousel-block-left'><b>Suspension :</b></div><div class='carousel-block-right'>" + sku.suspension + "</div></div>";
        return output;
    },

    generateVehicleDetailsAppt(vehicle) {
        var html = "";
        var trimDetails = vehicle.color;
        if (vehicle.track) trimDetails += ", " + vehicle.track;
        if (vehicle.trackType) trimDetails += ", " + vehicle.trackType;
        if (vehicle.suspension) trimDetails += ", " + vehicle.suspension;
        if (vehicle.starter) trimDetails += ", " + vehicle.starter;
        html += '<div class="rollick-cart-item-image">';
        html += '<img src="' + vehicle.image + '">';
        html += '</div>';
        html += '<div class="rollick-cart-item-vehicle">';
        html += '<div class="rollick-cart-item-desc">';
        html += '<div class="rollick-cart-item-model">' + vehicle.modelName + '</div>';
        html += '<div class="rollick-cart-item-trim">' + trimDetails + '</div>';
        if (vehicle.kit) html += '<div class="rollick-cart-item-kit">' + vehicle.kit + '</div>';
        html += '</div>';
        return html;
    },

    listModels(leadType, country, year, type, category) {
        var self = this;
        var models = self.vehicles.slice();
        if (year) models = models.filter(function (model) { return model.year == year.toString().trim(); });
        if (type) models = models.filter(function (model) { return model.type.toLowerCase() == type.trim().toLowerCase(); });
        if (category) models = models.filter(function (model) { return model.category.toLowerCase() == category.trim().toLowerCase(); });
        models = models.filter(function (model) { return self.isAvailable(model, leadType, country); });
        return { summary: self.summarizeModels(leadType, country, models), models: models };
    },

    summarizeModels(leadType, country, models) {
        var self = this;
        var result = [];
        var summary = {};
        var sortOrder = [
            'BLAST XR', 'BLAST XR Touring', 'BLAST M', 'BLAST ZR', 'BLAST LT', 'M 600 ALPHA ONE', 'M Hardcore Alpha One', 'M Mountain Cat Alpha One', 'Norseman X', 'PANTERA', 'Riot', 'Riot X', 'ZR', 'ZR R-XC', 'ZR RR', 'ZR Limited', 'ZR Thundercat', 'ZR 200', 'ZR 120',
            'Wildcat XX Black Hills Edition', 'Wildcat XX', 'Prowler Pro', 'Prowler Pro Crew', 'Prowler 500',
            'Alterra 700', 'Alterra TRV 700', 'Alterra 600 Black Hills Edition', 'Alterra 600 Mud Pro', 'Alterra 600 TRV', 'Alterra 600', 'Alterra 570', 'Alterra 450', 'Alterra 300', 'Alterra 90'
        ];
        if (models) {
            for (var i = 0; i < models.length; i++) {
                if (self.isAvailable(models[i], leadType, country)) {
                    var vehicleName = models[i].vehicleName;
                    var msrp = (country == 'CA' ? models[i].msrpCAD : models[i].msrpUSD);
                    var sale = (country == 'CA' ? models[i].saleCAD : models[i].saleUSD);
                    var image = models[i].image;
                    var price = (sale ? sale : msrp);
                    if (!summary[vehicleName]) summary[vehicleName] = { sortOrder: sortOrder.indexOf(vehicleName), model: vehicleName, msrp: msrp, sale: sale, price: price, image: image };
                    if (summary[vehicleName].price > price) {
                        summary[vehicleName].msrp = msrp;
                        summary[vehicleName].sale = sale;
                        summary[vehicleName].price = price;
                    }
                }
            }
        }
        var keys = Object.keys(summary);
        for (var i = 0; i < keys.length; i++) {
            result.push(summary[keys[i]]);
        }
        result = result.sort(function (a, b) { return a.sortOrder - b.sortOrder; });
        return result;
    },

    getModelPage(vehicle) {
        var modelPages = {
            'blast m': '/snowmobile/mid-sized/blast-m',
            'blast zr': '/snowmobile/mid-sized/blast-zr',
            'blast lt': '/snowmobile/mid-sized/blast-lt',
            'blast xr': '/snowmobile/mid-sized/blast-xr',
            'm hardcore alpha one': '/snowmobile/mountain/m-hardcore',
            'm mountain cat alpha one': '/snowmobile/mountain/m-mountain-cat-alpha-one',
            'riot': '/snowmobile/crossover/riot',
            'riot x': '/snowmobile/crossover/riot-x',
            'zr thundercat': '/snowmobile/trail/zr-thundercat',
            'zr rr': '/snowmobile/trail/zr-rr',
            'zr limited': '/snowmobile/trail/zr-limited',
            'norseman': '/snowmobile/sport-utility/norseman',
            'zr 200': '/snowmobile/youth/zr-200',
            'zr 120': '/snowmobile/youth/zr-120',
        }
        var page = '';
        try {
            page = modelPages[vehicle.vehicleName.toLowerCase()];
            if (page) {
                page = location.protocol + '//' + location.host + page;
            }
        } catch (e) {
        }
        return page;
    },

    //EMAIL SIGN UP FORM
    getEmailSignUpForm(vehicle, options) {
        var self = this;
        rollick.visited = {};
        rollick.leadType = (options && options.leadType || 'Email Sign Up') || 'Email Sign Up';
        try {
            if (options.leadType.toLowerCase() == 'pre-order') {
                if (rollick.preorder && typeof rollick.preorder.getQuote == 'function') {
                    return rollick.preorder.getQuote(vehicle, options);
                } else {
                    return; // pre-order not enabled
                }
            }
        }
        catch (e) {
        }
        if (window.console && rollick.debugMode) {
            console.log(vehicle);
            console.log(options);
        }
        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 || '';
        if (vehicle.year) {
            var yr = vehicle.year || '';
            if (yr.length == 4) {
                try {
                    yr = parseInt(yr);
                    if (yr <= ((new Date()).getFullYear() + 2)) {
                        rollick.year = yr.toString();
                    }
                } catch (e) { }
            }
        } else {
            if (!rollick.year || (this.siteId != 'EZG')) rollick.year = '';
        }
        if (window.console && rollick.debugMode) console.log('getEmailSignUpForm called', vehicle, options);
        if (options.customFlyout) rollick.customFlyout = options.customFlyout;
        if (options.redirectUrl) rollick.redirectUrl = options.redirectUrl;
        else rollick.redirectUrl = '';
        rollick.abandoned = null;

        var form = 'textron/' + rollick.siteId.toLowerCase() + '/form-modal-en-us.html';
        if (this.siteId == 'ARC2') {
            if (options.div) {
                if (rq('#main-content .content-segment').length == 3) rq('#main-content .content-segment').first().remove();
                if (rq('#main-content .rte-body-component').length == 2) rq('#main-content .rte-body-component').first().remove();
                form = 'textron/' + rollick.siteId.toLowerCase() + '/form-full-en-us.html';
                if (rollick.leadType.toLowerCase() == 'pre-order') form = 'textron/' + rollick.siteId.toLowerCase() + '/form-full-en-us-preorder.html';
            }
        }
        if (rollick.siteId.toLowerCase() == 'ezg') {

            if (options.formType = 'email-sign-up') {
                form = '/widgets/templates/textron/' + rollick.siteId.toLowerCase() + '/form-email-sign-up-en-us.html';
            }
            else {
                form = '/widgets/templates/textron/' + rollick.siteId.toLowerCase() + '/redesign-form-full-en-us.html';
            }
        }
        if (options.mode && options.mode == 'flyout') {
            form = 'textron/' + rollick.siteId.toLowerCase() + '/redesign-form-modal-en-us.html';
        }
        if (this.siteId == 'ARC2') {
            form = 'textron/' + rollick.siteId.toLowerCase() + '/form-modal-en-us.html';
            if (options.div) {
                if (rollick.leadType.toLowerCase() == 'appointment') {
                    var dealerId = rollick.getSearchParams('dealerId');
                    var dealerNo = rollick.getSearchParams('dealerNo');
                    if (dealerId || dealerNo) {
                        form = 'textron/' + rollick.siteId.toLowerCase() + '/form-full-en-us-appointment.html';
                    } else {
                        options.leadType = 'Quote';
                        rollick.getQuote(vehicle, options);
                        return;
                    }
                } else {
                    form = 'textron/' + rollick.siteId.toLowerCase() + '/form-full-en-us.html';
                }
            }
        }
        rollick.vehicle = Object.assign({}, vehicle);
        if (!rollick.vehicle.originalImage) rollick.vehicle.originalImage = rollick.vehicle.image;

        //DEBUG HERE rollick.widget
        //rq.get('http://widget-dev.rollick.io/widgets/templates/' + form, function (data) {
        rq.get(rollick.widget + form, function (data) {
            if (options.country) {
                rq('.rollick-form-country-select option').each(function (a, b) {
                    if (rq(b).attr('value').toLowerCase() == options.country.toLowerCase().trim()) {
                        rq('.rollick-form-country-select').val(rq(b).attr('value'));
                    }
                });
            }
            if (options.div) {
                if (options.customFlyout) {
                    rq(options.div).html(rollick.designFlayout(data, options));
                    if (!vehicle.color) {
                        rq('.rollick-vehicle-color').addClass('rollick-hidden');
                    }
                } else {
                    rq(options.div).html(data);
                }
                if (typeof Aimbase !== 'undefined') {
                    if (Aimbase && Aimbase.Analytics && Aimbase.Analytics.SendPageAction) {
                        if (rq('.rollick-form-fp').length) Aimbase.Analytics.SendPageAction(rq('.rollick-form-fp')[0], 'Full', 'view', { 'PageAction': '19938612-bb81-4ec7-a250-7a38ba4b02e6' });
                    }
                }
                window.setTimeout(function () {
                    if (options.dealerid) {
                        sessionStorage['rollick-dealer-id'] = options.dealerid;
                    }
                    if (rollick.siteId == 'ARC2') self.initFullPageEvents();
                    var zip = rollick.getQueryZip();
                    if (zip) {
                        rq(rollick.form_postalCode).addClass('has-input');
                        rq(rollick.form_postalCode).val(zip).trigger('change');
                    }
                }, 10);
            } else {
                rq('body').css('overflow', 'hidden').append(data);
                rq('.rollick-form').show();
                window.setTimeout(function () {
                    rq('.rollick-form').addClass('tray--active');
                    rq('.rollick-form-fields').show();
                    self.initFlyoutEvents();
                    rollick.validateEmailSignUpForm();
                }, 10);
                if (typeof Aimbase !== 'undefined') {
                    if (Aimbase && Aimbase.Analytics && Aimbase.Analytics.SendPageAction) {
                        if (rq('.rollick-form').length) Aimbase.Analytics.SendPageAction(rq('.rollick-form')[0], 'Flyout', 'view', { 'PageAction': '50d1c736-ad09-424a-af51-09b45b33af81' });
                    }
                }
            }

            // load vehicle interest
            var areaOfInterestSelect = rq('.rollick-form-area-of-interest-select');
            areaOfInterestSelect.empty();
            if (rollick.leadType.toLowerCase() != 'pre-order' && rollick.areaOfInterestSelect && rollick.areaOfInterestSelect.length) {
                rq('.rollick-area-of-interest').removeClass('rollick-hidden');
                areaOfInterestSelect.append(rq('<option></option>').attr('value', '').attr('selected', 'selected').text(''));
                areaOfInterestSelect.val('');
                rq.each(rollick.areaOfInterestSelect, function (key, option) {
                    var opt = rq('<option></option>').attr('value', option.value).text(option.text);
                    areaOfInterestSelect.append(opt);
                });
                areaOfInterestSelect.removeClass('rollick-hidden');
                rq('.rollick-company').hide();
            } else {
                areaOfInterestSelect.append(rq('<option></option>').attr('value', 'N/A').text(''));
            }
            areaOfInterestSelect.on('change', function () {
                rollick.validateEmailSignUpForm();
            });

            // load vehicle ownership
            var $currentOwner = rq('input[name="rollick-ownership"]');

            $currentOwner.on('click', function () {
                rollick.validateEmailSignUpForm();
            });

            rq('#rollick-optin').click(function () {
                rollick.validateEmailSignUpForm();
            });

            // set events
            rq('.rollick-form-country-select').on('change', function () {
                var country = 'United States';
                if (options.country) {
                    //rq('.rollick-form-country-select').hide();
                    if (options.country.toLowerCase() == 'ca') country = 'Canada';
                }
                var selectedCountry = rq('.rollick-form-country-select').val();
                if (selectedCountry.toLowerCase() == 'ca') {
                    country = 'Canada';
                    rq(rollick.form_postalCode).attr('maxlength', 7);
                    rq('.rollick-invalid-postal').text('Invalid postal code');
                }

                rq(rollick.form_postalCode).val('');
                var postal_code_label = 'ZIP Code';
                if (country != 'United States') {
                    postal_code_label = 'Postal Code';
                    rq('.rollick-vehicle-msrp-usd').hide();
                    rq('.rollick-vehicle-msrp-cad').show();
                    if (sessionStorage['rollick-zip']) {
                        if (sessionStorage['rollick-zip'].length == 7) rq(rollick.form_postalCode).val(sessionStorage['rollick-zip']);
                    }
                } else {
                    rq('.rollick-vehicle-msrp-usd').show();
                    rq('.rollick-vehicle-msrp-cad').hide();
                    if (sessionStorage['rollick-zip']) {
                        if (sessionStorage['rollick-zip'].length == 5) rq(rollick.form_postalCode).val(sessionStorage['rollick-zip']);
                    }
                }
                if (rollick.siteId != 'ARC2') {
                    postal_code_label += '*';
                }
                rq('.rollick-form-postal-code-label').text(postal_code_label);
            });
            rq(rollick.form_firstName)
                .add(rollick.form_lastName)
                .add(rollick.form_email)
                .add(rollick.form_postalCode)
                .add('.rollick-form-comment-value')
                .on('blur', function () {
                    rollick.sanitize(rq(this));
                    rollick.validateEmailSignUpForm();
                }).on('focus', function () {
                    rollick.clearBorder(this);
                }).on('input', function () {
                    rollick.validateEmailSignUpForm();
                });
            rq(rollick.form_postalCode).on('input', function (e) {
                if (rq('.rollick-form-country-select').val() == 'US') {
                    var x = e.target.value.replace(/\D/g, '').match(/(\d{0,5})/);
                    e.target.value = x[1];
                    if (/Edge/.test(navigator.userAgent) && e.target.value.length == 5) rq(e.target).change();
                } else if (rq('.rollick-form-country-select').val() == 'CA') {
                    var pc = e.target.value.toUpperCase().replace(/\ /g, '');
                    var caTest = /[a-zA-Z][0-9][a-zA-Z][0-9][a-zA-Z][0-9]/;
                    e.target.value = pc;
                    if (caTest.test(pc)) {
                        e.target.value = pc.substring(0, 3) + ' ' + pc.substring(3, 6);
                        if (/Edge/.test(navigator.userAgent) && e.target.value.length == 7) rq(e.target).change();
                    }
                }
            });
            rq('.rollick-form').keyup(function (e) {
                if (e.keyCode === 27) rq('.rollick-form-cancel').click();
            });
            if (options.country) {
                rq('.rollick-form-country-select option').each(function (a, b) {
                    if (rq(b).attr('value').toLowerCase() == options.country.toLowerCase().trim()) {
                        rq('.rollick-form-country-select').val(rq(b).attr('value'));
                        rq('.rollick-form-country-select').triggerHandler('change');
                    }
                });
            }

            // set screens
            rq('.rollick-form-fields').css('overflow', 'auto');
            rq('.rollick-form-first').focus();
            if (options.div) {
                if (rq('.rollick-form-fields').length) {
                    rq('.rollick-form-fields')[0].scrollIntoView(true);
                    var scrolledY = window.scrollY;
                    if (scrolledY) {
                        window.scroll(0, scrolledY - 100);
                    }
                }
            } else {
                rq('.rollick-form-fields')[0].scrollTop = 0;
            }

            // tracking
            if (typeof Aimbase !== 'undefined') {
                if (Aimbase && Aimbase.Analytics && Aimbase.Analytics.AddListener) {
                    if (rq('.rollick-form-submit').length) Aimbase.Analytics.AddListener(rq('.rollick-form-submit')[0], 'Submit', 'click', { 'PageAction': 'bc96b92b-fadb-44c8-a570-24e182d79216' });
                }
            }
        });
        return;
    },

    validateEmailSignUpForm() {
        var self = this;
        if (!rq(self.form_firstName).length) return;
        var fn = rq(self.form_firstName).val().trim();
        var ln = rq(self.form_lastName).val().trim();
        var e = rq(self.form_email).val().trim();
        var pc = rq(self.form_postalCode).val().trim();
        var country = rq('.rollick-form-country-select').val().trim();
        var areaOfInterest = rq('#areaOfInterest').val() || '';
        var currentOwner = rq('input[name="rollick-ownership"]:checked').val() || '';
        var optIn = rq('input[id="rollick-optin"]:checked').val() || '';

        var isValidEmail = (/^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/).test(e.toLowerCase());
        var isValidPostalCode = false;
        var interest = rq('input[name="interest"]:checked').val() || '';

        if (country == 'US') {
            isValidPostalCode = (pc.length == 5);
        } else if (country == 'CA') {
            isValidPostalCode = (pc.length == 7);
        }

        self.checkRequired(fn, self.form_firstName);
        self.checkRequired(ln, self.form_lastName);
        self.checkRequired(e, self.form_email);
        self.checkRequired(pc, self.form_postalCode);

        if (fn) {
            if (fn.length > 1) {
                rq(self.form_firstName).val(fn.substring(0, 1).toUpperCase() + fn.substring(1));
            } else {
                rq(self.form_firstName).val(fn.toUpperCase());
            }
        }
        if (ln) {
            if (ln.length > 1) {
                rq(self.form_lastName).val(ln.substring(0, 1).toUpperCase() + ln.substring(1));
            } else {
                rq(self.form_lastName).val(ln.toUpperCase());
            }
        }

        if (!pc) {
            if (self.siteId == 'ARC2') {
                if (!fn || !ln || !e || !pc || !isValidEmail || !isValidPostalCode || !currentOwner || !interest) {
                    rq('.rollick-form-submit').addClass('disabled');
                    rq('.rollick-form-payment').addClass('disabled');
                } else {
                    rq('.rollick-form-submit').removeClass('disabled');
                    rq('.rollick-form-payment').removeClass('disabled');
                }
            }
            else {
                if (!fn || !ln || !e || !pc || !country || !isValidEmail || !isValidPostalCode || !areaOfInterest || !currentOwner || !optIn) {
                    rq('.rollick-form-submit').addClass('disabled');
                    rq('.rollick-form-payment').addClass('disabled');
                } else {
                    rq('.rollick-form-submit').removeClass('disabled');
                    rq('.rollick-form-payment').removeClass('disabled');
                }
            }
        }

        if (pc) {
            if (!isValidPostalCode) {
                rq('.rollick-form-submit').addClass('disabled');
                rq('.rollick-form-payment').addClass('disabled');
                rq('.rollick-invalid-postal').removeClass('rollick-hidden');
            } else {
                self.validateZip(pc, function (isValidZip) {
                    isValidPostalCode = isValidZip;
                    if (!isValidZip) {
                        rq('.rollick-invalid-postal').removeClass('rollick-hidden');
                    } else {
                        rq('.rollick-invalid-postal').addClass('rollick-hidden');
                    }
                    if (self.siteId == 'ARC2') {
                        if (!fn || !ln || !e || !pc || !isValidEmail || !isValidPostalCode || !interest) {
                            rq('.rollick-form-submit').addClass('disabled');
                            rq('.rollick-form-payment').addClass('disabled');
                        } else {
                            rq('.rollick-form-submit').removeClass('disabled');
                            rq('.rollick-form-payment').removeClass('disabled');
                        }
                    }
                    else {
                        if (!fn || !ln || !e || !pc || !country || !isValidEmail || !isValidPostalCode || !areaOfInterest || !currentOwner || !optIn) {
                            rq('.rollick-form-submit').addClass('disabled');
                            rq('.rollick-form-payment').addClass('disabled');
                        } else {
                            rq('.rollick-form-submit').removeClass('disabled');
                            rq('.rollick-form-payment').removeClass('disabled');
                        }
                    }
                });
            }
        }
        if (e) {
            if (!isValidEmail) {
                rq('.rollick-invalid-email').removeClass('rollick-hidden');
            } else {
                rq('.rollick-invalid-email').addClass('rollick-hidden');
            }
        }
    },

    getEmailSignUpFormData() {

        var self = this;
        var data = {};

        if (typeof Aimbase !== 'undefined') {
            if (Aimbase && Aimbase.Analytics) {
                var fn = rq(self.form_firstName).val();
                var ln = rq(self.form_lastName).val();
                var e = rq(self.form_email).val();
                var pc = rq(self.form_postalCode).val();
                var country = rq('.rollick-form-country-select').val();
                var areaOfInterest = rq('#areaOfInterest').val() || '';
                var areaOfInterestCompany = rq('#areaOfInterestCompany').val() || '';
                var currentOwner = rq('input[name="rollick-ownership"]:checked').val() || '';
                var submittedFrom = (window && window.location && (window.location.protocol + '//' + window.location.host + window.location.pathname));

                var interest = rq('input[name="interest"]:checked');
                var interestSelected = [];
                for (var i = 0; i < interest.length; i++) {
                    if (interest[i].checked) {
                        interestSelected.push(interest[i].value);
                    }
                }

                self.userId = Aimbase.Analytics.GetUserUid();
                self.sessionId = Aimbase.Analytics.GetSessionUid();
                self.source = Aimbase.Analytics.GetFieldValue('source') || 'Organic';
                self.campaign = Aimbase.Analytics.GetFieldValue('campaign') || '';

                data.uid = self.userId;
                data.sid = self.sessionId;
                data.source = self.source;
                data.campaign = self.campaign;
                data.type = (self.leadType ? self.leadType : 'Email Sign Up');
                data.firstName = fn;
                data.lastName = ln;
                data.email = e;
                data.postalCode = pc;
                data.countryCode = country;
                data.currentOwner = currentOwner;
                data.submittedFrom = submittedFrom;
                data.productCode = 'Uncategorized';

                if (self.siteId == 'ARC2') {
                    data.category = 'Arctic Cat Website';
                    data.brand = 'ARC';
                    data.areaOfInterest = interestSelected.join(',');
                }

                data.optIn = false;
                if (rq('#rollick-optin').is(':checked')) {
                    data.optIn = true;
                    data.ip = self.ip;
                    data.optInDate = (new Date()).valueOf();
                    data.optInSource = 'Textron';
                    data.optInListCode = rq('#optInListCode').val() || 'NewsPromo';
                }

                if (self.siteId == 'ARC2') {
                    var optInListCodes = [];
                    for (var i = 0; i < interestSelected.length; i++) {
                        if (interestSelected[i] == 'ATVs') {
                            optInListCodes.push('ACATV');
                            if (optInListCodes.indexOf('Arctic Cat Off Road English') == -1) optInListCodes.push('Arctic Cat Off Road English');
                        }
                        if (interestSelected[i] == 'Side-by-Sides') {
                            optInListCodes.push('ACSXS');
                            if (optInListCodes.indexOf('Arctic Cat Off Road English') == -1) optInListCodes.push('Arctic Cat Off Road English');
                        }
                        if (interestSelected[i] == 'Snowmobiles') {
                            optInListCodes.push('ACSnow');
                            optInListCodes.push('Arctic Cat Snow English');
                        }
                    }
                    optInListCodes.push('Arctic Cat Master English');
                    data.optInListCode = optInListCodes.join(',');
                }

                if ((self.leadType || "").toLowerCase() == 'email sign up') {
                    data.salesDriver = 'No';
                }

                data.referrer = sessionStorage['rollick-referrer-value'];
                if (self.abandoned) data.abandoned = true;
            }
        }
        return data;
    },

    submitEmailSignUpForm(closeAfter) {

        if (rollick.isFormSubmitted) {
            return true;
        }

        rollick.sanitize(rq(rollick.form_firstName));
        rollick.sanitize(rq(rollick.form_lastName));
        rollick.sanitize(rq(rollick.form_email));
        rollick.sanitize(rq(rollick.form_postalCode));
        rollick.validateEmailSignUpForm();

        var requiredFields = rq('input.rollick-form-field, select.rollick-form-field');

        requiredFields.each(function (i, e) {
            var el = rq(e);
            if (el[0].type == 'checkbox') {

                if (!el[0].checked) {
                    el.next('span').addClass('rollick-required');
                }
                else {
                    el.next('span').removeClass('rollick-required');
                }

            }
            else if (el.val() == '' || el.val().length == 0) {
                el.addClass('rollick-required');
                el.focus();
                return false;
            }
            else {
                el.removeClass('rollick-required');
            }

        });

        if (rq('.rollick-form-submit').hasClass('disabled') && !rollick.abandoned) {
            return true;
        }

        // submit form
        rq('.rollick-form-submit').addClass('disabled');
        var data = rollick.getEmailSignUpFormData();
        if (data) rollick.isFormSubmitted = true;
        if (Object.keys(data).length) {
            rollick.showLoading();
            if (window.dataLayer) window.dataLayer.push({ event: 'custom.requestMoreInfoSubmission', 'custom.eventLabel': data.productName });
            rq.ajax({
                url: rollick.validation + '/aimproxy',
                dataType: 'json',
                contentType: 'application/json;charset=utf-8',
                type: 'POST',
                timeout: 15000,
                data: JSON.stringify(data),
                success(resp) {
                    rollick.hideLoading();
                    if (closeAfter) {
                        rollick.closeForm();
                    } else {
                        if (rollick.customFlyout) {
                            if (rollick.redirectUrl) {
                                location.href = rollick.redirectUrl;
                            } else {
                                rollick_e_z_go_container.contentWindow.postMessage({ command: 'lead created', payload: { input: data } }, '*');
                            }
                        } else {
                            if (rollick.redirectUrl) {
                                location.href = rollick.redirectUrl;
                            } else {
                                if (rollick.leadType.toLowerCase() == 'reserve now') {
                                    var v = Object.assign({}, rollick.vehicle);
                                    delete v.trims;
                                    v.price = data.msrp;
                                    rollick.showReceipt(v, data.partnerName, null);
                                } else {
                                    rollick.closeForm();
                                }
                            }
                        }
                    }
                },
                error(resp) {
                    rollick.hideLoading();
                    rollick.isFormSubmitted = false;
                    if (!closeAfter) {
                        alert('We have encountered an unexpected error. Please try again later.');
                        rollick.validateEmailSignUpForm();
                    } else {
                        rollick.closeForm();
                    }
                    return false;
                }
            });
        } else {
            rollick.isFormSubmitted = false;
            if (!closeAfter) {
                alert('We are unable to process your request at this time. Please try again later.');
                rollick.validateEmailSignUpForm();
            } else {
                rollick.closeForm();
            }
            return false;
        }
    },

    validateSnowmageddonPreviewSignUpForm() {
        var self = this;
        if (!rq(self.form_firstName).length) return;
        var fn = rq(self.form_firstName).val().trim();
        var ln = rq(self.form_lastName).val().trim();
        var e = rq(self.form_email).val().trim();
        var country = rq('.rollick-form-country-select').val().trim();
        var areaOfInterest = rq('.rollick-form-sled-select').val() || '';
        var optIn = rq('input[id="rollick-optin"]:checked').val() || '';

        var isValidEmail = (/^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/).test(e.toLowerCase());

        self.checkRequired(fn, self.form_firstName);
        self.checkRequired(ln, self.form_lastName);
        self.checkRequired(e, self.form_email);

        if (fn) {
            if (fn.length > 1) {
                rq(self.form_firstName).val(fn.substring(0, 1).toUpperCase() + fn.substring(1));
            } else {
                rq(self.form_firstName).val(fn.toUpperCase());
            }
        }
        if (ln) {
            if (ln.length > 1) {
                rq(self.form_lastName).val(ln.substring(0, 1).toUpperCase() + ln.substring(1));
            } else {
                rq(self.form_lastName).val(ln.toUpperCase());
            }
        }

        if (self.siteId == 'ARC2') {
            if (!fn || !ln || !e || !isValidEmail || !areaOfInterest) {
                rq('.rollick-form-submit').addClass('disabled');
            } else {
                rq('.rollick-form-submit').removeClass('disabled');
            }
        }

        if (e) {
            if (!isValidEmail) {
                rq('.rollick-invalid-email').removeClass('rollick-hidden');
            } else {
                rq('.rollick-invalid-email').addClass('rollick-hidden');
            }
        }
    },

    getSnowmageddonPreviewSignUpFormData() {

        var self = this;
        var data = {};

        if (typeof Aimbase !== 'undefined') {
            if (Aimbase && Aimbase.Analytics) {
                var fn = rq(self.form_firstName).val();
                var ln = rq(self.form_lastName).val();
                var e = rq(self.form_email).val();
                var country = rq('.rollick-form-country-select').val();
                var submittedFrom = (window && window.location && (window.location.protocol + '//' + window.location.host + window.location.pathname));

                self.userId = Aimbase.Analytics.GetUserUid();
                self.sessionId = Aimbase.Analytics.GetSessionUid();
                self.source = Aimbase.Analytics.GetFieldValue('source') || 'Organic';
                self.campaign = Aimbase.Analytics.GetFieldValue('campaign') || '';

                data.uid = self.userId;
                data.sid = self.sessionId;
                data.source = self.source;
                data.campaign = self.campaign;
                data.type = rq('.rollick-form-sled-select').val() || '';
                data.firstName = fn;
                data.lastName = ln;
                data.email = e;
                data.countryCode = country;
                data.submittedFrom = submittedFrom;
                data.productCode = 'Uncategorized';
                data.listId = rollick.snowmageddonPreviewListId;

                if (self.siteId == 'EZG') {
                    data.category = 'E-Z-GO Website';
                    data.brand = self.siteId;
                }
                else if (self.siteId == 'ARC2') {
                    data.category = 'Arctic Cat Website';
                    data.brand = 'ARC';
                }

                if (self.siteId == 'EZG') {
                    if (country == 'CA') {
                        data.msrp = ((self.vehicle.saleCAD || self.vehicle.msrpCAD) + self.vehicle.colorAdditionalCAD);
                    }

                    //No Dealer Data
                    data.partnerChoice = 'Closest';
                    data.preselect = false;
                }

                data.optIn = false;
                if (rq('#rollick-optin').is(':checked')) {
                    data.optIn = true;
                    data.ip = self.ip;
                    data.optInDate = (new Date()).valueOf();
                    data.optInSource = 'Textron';
                    data.optInListCode = rq('#optInListCode').val() || 'NewsPromo';
                }

                data.salesDriver = 'No';

                data.referrer = sessionStorage['rollick-referrer-value'];
                if (self.abandoned) data.abandoned = true;
                data.listCodes = rq('#optInListCode').val() || 'Snowmageddon Preview 2022';
            }
        }
        return data;
    },

    submitSnowmageddonPreviewSignUpForm(closeAfter) {

        if (rollick.isFormSubmitted) {
            return true;
        }

        rollick.sanitize(rq(rollick.form_firstName));
        rollick.sanitize(rq(rollick.form_lastName));
        rollick.sanitize(rq(rollick.form_email));
        rollick.validateSnowmageddonPreviewSignUpForm();

        var requiredFields = rq('input.rollick-form-field, select.rollick-form-field');

        requiredFields.each(function (i, e) {
            var el = rq(e);

            if (el[0].type == 'checkbox') {

                if (!el[0].checked) {
                    el.next('span').addClass('rollick-required');
                }
                else {
                    el.next('span').removeClass('rollick-required');
                }

            }
            else if (el.val() == '' || el.val().length == 0) {
                el.addClass('rollick-required');
                el.focus();
                return false;
            }
            else {
                el.removeClass('rollick-required');
            }

        });

        if (rq('.rollick-form-submit').hasClass('disabled') && !rollick.abandoned) {
            return true;
        }

        // submit form
        rq('.rollick-form-submit').addClass('disabled');
        var data = rollick.getSnowmageddonPreviewSignUpFormData();
        if (data) rollick.isFormSubmitted = true;
        if (Object.keys(data).length) {
            rollick.showLoading();
            if (window.dataLayer) window.dataLayer.push({ event: 'custom.requestMoreInfoSubmission', 'custom.eventLabel': data.productName });
            rq.ajax({
                url: rollick.validation + '/oemList/TXT',
                dataType: 'json',
                contentType: 'application/json;charset=utf-8',
                type: 'POST',
                timeout: 15000,
                data: JSON.stringify(data),
                success(resp) {
                    rollick.hideLoading();
                    if (closeAfter) {
                        rollick.closeForm();
                    } else {
                        if (rollick.customFlyout) {
                            if (rollick.redirectUrl) {
                                location.href = rollick.redirectUrl;
                            } else {
                                rollick_e_z_go_container.contentWindow.postMessage({ command: 'lead created', payload: { input: data } }, '*');
                            }
                        } else {
                            if (rollick.redirectUrl) {
                                location.href = rollick.redirectUrl;
                            } else {
                                if (rollick.leadType.toLowerCase() == 'reserve now') {
                                    var v = Object.assign({}, rollick.vehicle);
                                    delete v.trims;
                                    v.price = data.msrp;
                                    rollick.showReceipt(v, data.partnerName, null);
                                } else {
                                    rollick.closeForm();
                                }
                            }
                        }
                    }
                },
                error(resp) {
                    rollick.hideLoading();
                    rollick.isFormSubmitted = false;
                    if (!closeAfter) {
                        if (resp) {
                            if (resp.responseText) {
                                var response = JSON.parse(resp.responseText);
                                if (response.result) {
                                    if (response.result.message) {
                                        var responseMessage = response.result.message;
                                        if (responseMessage.includes('already exist in the List')) {
                                            rq('.errorEmailAlreadyExists').show();
                                            rq('.errorEmailAlreadyExists').css('display', 'flex');
                                            rollick.validateSnowmageddonPreviewSignUpForm();
                                            return false;
                                        }
                                    }
                                }
                            }
                        }
                        alert('We have encountered an unexpected error. Please try again later.');
                        rollick.validateSnowmageddonPreviewSignUpForm();
                    } else {
                        rollick.closeForm();
                    }
                    return false;
                }
            });
        } else {
            rollick.isFormSubmitted = false;
            if (!closeAfter) {
                alert('We are unable to process your request at this time. Please try again later.');
                rollick.validateSnowmageddonPreviewSignUpForm();
            } else {
                rollick.closeForm();
            }
            return false;
        }
    },

    validateNameTheSledForm() {
        var self = this;
        if (!rq(self.form_firstName).length) return;
        var fn = rq(self.form_firstName).val().trim();
        var ln = rq(self.form_lastName).val().trim();
        var e = rq(self.form_email).val().trim();
        var pc = rq(self.form_postalCode).val().trim();
        var country = rq('.rollick-form-country-select').val().trim();
        var optIn = rq('input[id="rollick-optin"]:checked').val() || '';

        var isValidEmail = (/^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/).test(e.toLowerCase());
        var isValidPostalCode = false;

        if (country == 'US') {
            isValidPostalCode = (pc.length == 5);
        } else if (country == 'CA') {
            isValidPostalCode = (pc.length == 7);
        }

        self.checkRequired(fn, self.form_firstName);
        self.checkRequired(ln, self.form_lastName);
        self.checkRequired(e, self.form_email);
        self.checkRequired(pc, self.form_postalCode);

        if (fn) {
            if (fn.length > 1) {
                rq(self.form_firstName).val(fn.substring(0, 1).toUpperCase() + fn.substring(1));
            } else {
                rq(self.form_firstName).val(fn.toUpperCase());
            }
        }
        if (ln) {
            if (ln.length > 1) {
                rq(self.form_lastName).val(ln.substring(0, 1).toUpperCase() + ln.substring(1));
            } else {
                rq(self.form_lastName).val(ln.toUpperCase());
            }
        }

        if (!pc) {
            if (!fn || !ln || !e || !isValidEmail || !isValidPostalCode) {
                rq('.rollick-form-submit').addClass('disabled');
                rq('.rollick-form-payment').addClass('disabled');
            } else {
                rq('.rollick-form-submit').removeClass('disabled');
                rq('.rollick-form-payment').removeClass('disabled');
            }
        }

        if (pc) {
            if (!isValidPostalCode) {
                rq('.rollick-form-submit').addClass('disabled');
                rq('.rollick-form-payment').addClass('disabled');
                rq('.rollick-invalid-postal').removeClass('rollick-hidden');
            } else {
                self.validateZip(pc, function (isValidZip) {
                    isValidPostalCode = isValidZip;
                    if (!isValidZip) {
                        rq('.rollick-invalid-postal').removeClass('rollick-hidden');
                    } else {
                        rq('.rollick-invalid-postal').addClass('rollick-hidden');
                    }
                    if (!fn || !ln || !e || !isValidEmail || !isValidPostalCode) {
                        rq('.rollick-form-submit').addClass('disabled');
                        rq('.rollick-form-payment').addClass('disabled');
                    } else {
                        rq('.rollick-form-submit').removeClass('disabled');
                        rq('.rollick-form-payment').removeClass('disabled');
                    }
                });
            }
        }
        if (e) {
            if (!isValidEmail) {
                rq('.rollick-invalid-email').removeClass('rollick-hidden');
            } else {
                rq('.rollick-invalid-email').addClass('rollick-hidden');
            }
        }
    },

    getNameTheSledFormData() {

        var self = this;
        var data = {};

        if (typeof Aimbase !== 'undefined') {
            if (Aimbase && Aimbase.Analytics) {
                var fn = rq(self.form_firstName).val();
                var ln = rq(self.form_lastName).val();
                var e = rq(self.form_email).val();
                var pc = rq(self.form_postalCode).val();
                var country = rq('.rollick-form-country-select').val();
                var submittedFrom = (window && window.location && (window.location.protocol + '//' + window.location.host + window.location.pathname));

                self.userId = Aimbase.Analytics.GetUserUid();
                self.sessionId = Aimbase.Analytics.GetSessionUid();
                self.source = Aimbase.Analytics.GetFieldValue('source') || 'Organic';
                self.campaign = Aimbase.Analytics.GetFieldValue('campaign') || '';

                data.uid = self.userId;
                data.sid = self.sessionId;
                data.source = self.source;
                data.campaign = self.campaign;
                data.type = (self.leadType ? self.leadType : 'Name the Sled');
                data.firstName = fn;
                data.lastName = ln;
                data.email = e;
                data.postalCode = pc;
                data.countryCode = country;
                data.submittedFrom = submittedFrom;
                data.productCode = 'Uncategorized';
                data.category = 'Arctic Cat Website';
                data.brand = 'ARC';
                data.optIn = false;
                if (rq('#rollick-optin').is(':checked')) {
                    data.optIn = true;
                    data.ip = self.ip;
                    data.optInDate = (new Date()).valueOf();
                    data.optInSource = 'Textron';
                    data.optInListCode = 'NewsPromo';
                }
                data.salesDriver = 'No';
                data.suggestedName = rollick.suggestedName;
                if (data.optInListCode) data.optInListCode += ',';
                else data.optInListCode = '';
                switch (rollick.language) {
                    case 'fr':
                        data.optInListCode += 'Name The Sled 2022 - French';
                        break;
                    default:
                        data.optInListCode += 'Name The Sled 2022 - English';
                        break;
                }
                data.referrer = sessionStorage['rollick-referrer-value'];
            }
        }
        return data;
    },

    submitNameTheSledForm(closeAfter) {

        if (rollick.isFormSubmitted) {
            return true;
        }

        rollick.sanitize(rq(rollick.form_firstName));
        rollick.sanitize(rq(rollick.form_lastName));
        rollick.sanitize(rq(rollick.form_email));
        rollick.sanitize(rq(rollick.form_postalCode));
        rollick.validateNameTheSledForm();

        var requiredFields = rq('input.rollick-form-field, select.rollick-form-field');

        requiredFields.each(function (i, e) {
            var el = rq(e);
            if (el[0].type == 'checkbox') {

                if (!el[0].checked) {
                    el.next('span').addClass('rollick-required');
                }
                else {
                    el.next('span').removeClass('rollick-required');
                }

            }
            else if (el.val() == '' || el.val().length == 0) {
                el.addClass('rollick-required');
                el.focus();
                return false;
            }
            else {
                el.removeClass('rollick-required');
            }

        });

        if (rq('.rollick-form-submit').hasClass('disabled') && !rollick.abandoned) {
            return true;
        }

        // submit form
        rq('.rollick-form-submit').addClass('disabled');
        var data = rollick.getNameTheSledFormData();
        if (data) rollick.isFormSubmitted = true;
        if (Object.keys(data).length) {
            rollick.showLoading();
            // if (window.dataLayer) window.dataLayer.push({ event: 'custom.requestMoreInfoSubmission', 'custom.eventLabel': data.productName });
            rq.ajax({
                url: rollick.validation + '/aimproxy',
                dataType: 'json',
                contentType: 'application/json;charset=utf-8',
                type: 'POST',
                timeout: 15000,
                data: JSON.stringify(data),
                success(resp) {
                    rollick.hideLoading();
                    if (closeAfter) {
                        rollick.closeForm();
                    } else {
                        if (rollick.redirectUrl) {
                            location.href = rollick.redirectUrl;
                        } else {
                            if (typeof toggleThankYou == 'function') toggleThankYou();
                            else alert('Thank you for your submission');
                        }
                    }
                },
                error(resp) {
                    rollick.hideLoading();
                    rollick.isFormSubmitted = false;
                    if (!closeAfter) {
                        alert('We have encountered an unexpected error. Please try again later.');
                        rollick.validateNameTheSledForm();
                    } else {
                        rollick.closeForm();
                    }
                    return false;
                }
            });
        } else {
            rollick.isFormSubmitted = false;
            if (!closeAfter) {
                alert('We are unable to process your request at this time. Please try again later.');
                rollick.validateNameTheSledForm();
            } else {
                rollick.closeForm();
            }
            return false;
        }
    },

    getForm(vehicle, options) {

        var self = this;
        if (!rollick.vehicles.length) {
            window.setTimeout(function () {
                self.getForm(vehicle, options);
            }, 250);
        }

        validate = function () {
            if (!options.formType) return rollick.validateForm();
            switch (options.formType.toLowerCase()) {
                case 'email-sign-up':
                    return rollick.validateEmailSignUpForm();
                case 'request-a-brochure':
                    return rollick.validateRequestBrochureForm();
                case 'snowmageddon-preview-sign-up':
                    return rollick.validateSnowmageddonPreviewSignUpForm();
                case 'save-your-ride':
                    return rollick.validateSaveRideForm();
                case 'name-the-sled':
                    return rollick.validateNameTheSledForm();
                case 'event-activity':
                    return rollick.validateEventActivityForm();
                case 'event-sign-up':
                    return rollick.validateEventSignUpForm();
                case 'ask-an-engineer':
                    return rollick.validateAskAnEngineerForm();
                case 'casting-call':
                    return rollick.validateCastingCallForm();
                default:
                    return rollick.validateForm();
            }
        }

        if (options.formType == 'save-your-ride') {
            window.tray.resetData();
            window.tray.setWidth('half');
            window.tray.openTray();
        }

        if (options.mode && options.mode == 'flyout' && options.formType == 'email-sign-up' && options.div) {
            options.div = "";
        }

        self.lastForm = { vehicle: vehicle, options: options };
        rollick.visited = {};
        rollick.isFormSubmitted = false;
        if (options && options.formType == 'email-sign-up') {
            rollick.leadType = 'Email Sign Up';
        } else {
            rollick.leadType = (options && options.leadType || 'Email Sign Up') || 'Email Sign Up';
        }
        if (window.console && rollick.debugMode) {
            console.log(vehicle);
            console.log(options);
        }
        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 || '';
        let pageLanguage = rq("html").attr("lang") || 'en';
        if (options) {
            if (!options.language) options.language = pageLanguage;
            else options.language = (options.language || 'en').toLowerCase();
            if (options.language != 'en' && options.language != 'fr') options.language = 'en';
            rollick.language = options.language.toLowerCase();
        } else {
            rollick.language = pageLanguage.toLowerCase();
        }

        if (vehicle.year) {
            var yr = vehicle.year || '';
            if (yr.length == 4) {
                try {
                    yr = parseInt(yr);
                    if (yr <= ((new Date()).getFullYear() + 2)) {
                        rollick.year = yr.toString();
                    }
                } catch (e) { }
            }
        } else {
            if (!rollick.year || (this.siteId != 'EZG')) rollick.year = '';
        }
        if (vehicle.modelName) {
            vehicle.modelName = vehicle.modelName.trim();
        }
        if (vehicle.starter) {
            vehicle.starter = vehicle.starter.trim();
        }
        if (vehicle.suspension) {
            vehicle.suspension = vehicle.suspension.trim();
        }
        if (vehicle.track) {
            vehicle.track = vehicle.track.trim();
        }
        if (vehicle.color) {
            vehicle.color = vehicle.color.trim();
        }
        if (vehicle.image) image64 = vehicle.image.trim();
        if (vehicle.accessories) accessories = vehicle.accessories.slice();
        if (window.console && rollick.debugMode) console.log('getForm called', vehicle, options);
        if (options.customFlayout) rollick.customFlayout = options.customFlayout;
        if (options.redirectUrl) rollick.redirectUrl = options.redirectUrl;
        else rollick.redirectUrl = '';
        rollick.vehicleParams = {};
        rollick.paymentInfo = null;
        rollick.abandoned = null;
        rollick.paymentTry = 0;

        if (!vehicle.color) {
            if (typeof event !== 'undefined') {
                if (rq(event.target).closest('.model-list-item').length) vehicle.color = rq(event.target).closest('.model-list-item').find('.model-color-choice-wrapper.active').first().text().trim();
                if (rq(event.target).closest('.model-introduction').length) vehicle.color = rq(event.target).closest('.model-introduction').find('.model-color-choice-wrapper.active:visible').first().text().trim();
            }
        }
        if (accessories) {
            try {
                if (accessories.length) {
                    rollick.accessories = [];
                    accessories.forEach(function (acc) {
                        var item = {
                            part: acc.part.trim(),
                            item: acc.item.trim(),
                            cost: parseFloat(acc.cost)
                        };
                        rollick.accessories.push(item);
                    });
                }
            } catch (e) {
                if (window.console) console.error('Accessories parsing error ', e);
            }
        }
        rollick.vehicleImage = null;
        if (image64) {
            vehicle.image64 = image64;
            rollick.vehicleImage = image64;
        }

        var form = 'textron/' + rollick.siteId.toLowerCase() + '/form-modal-en-us.html';
        if (options.div) {
            form = 'textron/' + rollick.siteId.toLowerCase() + '/form-full-en-us.html';
        }
        form = '/widgets/templates/textron/' + rollick.siteId.toLowerCase() + '/form-modal-en-us.html';
        if (options.div) {
            if (rollick.leadType.toLowerCase() == 'appointment') {
                var dealerId = rollick.getSearchParams('dealerId');
                var dealerNo = rollick.getSearchParams('dealerNo');
                if (dealerId || dealerNo) {
                    form = '/widgets/templates/textron/' + rollick.siteId.toLowerCase() + '/form-full-en-us-appointment.html';
                } else {
                    options.leadType = 'Quote';
                    rollick.getQuote(vehicle, options);
                    return;
                }
            } else if (rollick.leadType.toLowerCase() == 'request a brochure') {
                form = '/widgets/templates/textron/' + rollick.siteId.toLowerCase() + '/form-request-a-brochure.html';
            }
            else if (rollick.leadType.toLowerCase() == 'email sign up') {
                form = '/widgets/templates/textron/' + rollick.siteId.toLowerCase() + '/form-email-sign-up.html';
            }
            else if (rollick.leadType.toLowerCase() == 'snowmageddon preview sign up') {
                form = '/widgets/templates/textron/' + rollick.siteId.toLowerCase() + '/snowmageddon-preview-sign-up.html';
            }
            else if (rollick.leadType.toLowerCase() == 'save your build') {
                form = '/widgets/templates/textron/' + rollick.siteId.toLowerCase() + '/form-save-your-ride-en-us-flyout.html';
                rq('.tray__outer-container.outer-container').css("transform", "translateX(0)");
                rq('.tray__toolbar').hide();
                rq('.tray__outer-container').css("width", "100%");
            }
            else if (rollick.leadType.toLowerCase() == 'name the sled') {
                let lang = options.language;
                form = '/widgets/templates/textron/' + rollick.siteId.toLowerCase() + '/form-name-the-sled-' + lang + '.html';
            }
            else if (rollick.leadType.toLowerCase() == 'event activity') {
                let lang = options.language;
                form = '/widgets/templates/textron/' + rollick.siteId.toLowerCase() + '/form-event-activity-' + lang + '.html';
            }
            else if (rollick.leadType.toLowerCase() == 'event sign up') {
                let lang = options.language;
                form = '/widgets/templates/textron/' + rollick.siteId.toLowerCase() + '/form-event-sign-up-' + lang + '.html';
            }
            else {
                form = '/widgets/templates/textron/' + rollick.siteId.toLowerCase() + '/form-full-en-us.html';
            }
        }
        else if (rollick.leadType.toLowerCase() == 'ask an engineer') {
            let lang = options.language;
            form = '/widgets/templates/textron/' + rollick.siteId.toLowerCase() + '/form-ask-an-engineer-' + lang + '.html';
        }
        else if (rollick.leadType.toLowerCase() == 'casting call') {
            let lang = options.language;
            form = '/widgets/templates/textron/' + rollick.siteId.toLowerCase() + '/form-casting-call-' + lang + '.html';
        }
        else if (rollick.leadType.toLowerCase() == 'email sign up') {
            if (options.mode && options.mode == 'flyout') {
                form = '/widgets/templates/textron/' + rollick.siteId.toLowerCase() + '/form-email-sign-up-flyout.html';
            }
        }
        rollick.vehicle = Object.assign({}, vehicle);
        if (!rollick.vehicle.originalImage && rollick.vehicle.image) rollick.vehicle.originalImage = rollick.vehicle.image;

        //DEBUG HERE
        rq.get(rollick.widget + form, function (data) {
            var accessoriesMSRP = 0;
            if (rollick.accessories && rollick.accessories.length) {
                rollick.accessories.forEach(function (acc) { accessoriesMSRP += parseFloat(acc.cost); });
                if (!rollick.vehicle.image64) rollick.flattenVehicleImage();
            }
            data = data.replace(/\$form_headline/g, rollick.lead_headline || '');
            data = data.replace(/\$form_vehicle_caption/g, vehicle.type == "Snow" ? "Select Your Sled" : "Select Your Vehicle");
            data = data.replace(/\$form_text/g, rollick.lead_text || '');
            data = data.replace(/\$brandName/g, 'Arctic Cat Snow');
            data = data.replace(/\$category/g, vehicle.category || '');
            data = data.replace(/\$passengers/g, vehicle.passengers || '');
            data = data.replace(/\$brandName/g, vehicle.brand || '');
            data = data.replace(/\$year/g, vehicle.year || rollick.year);
            data = data.replace(/\$vehicleName/g, vehicle.vehicleName || '');
            data = data.replace(/\$modelName/g, vehicle.modelName || '');
            var priceUSD = (vehicle.msrpUSD + (vehicle.colorAdditionalUSD || 0) + accessoriesMSRP);
            var priceCAD = (vehicle.msrpCAD + (vehicle.colorAdditionalCAD || 0) + accessoriesMSRP);
            var originalUSD = 0;
            var originalCAD = 0;

            if (vehicle.saleUSD) {
                originalUSD = vehicle.msrpUSD;
                priceUSD = (vehicle.saleUSD + (vehicle.colorAdditionalUSD || 0) + accessoriesMSRP);
            }
            if (vehicle.saleCAD) {
                originalCAD = vehicle.msrpCAD;
                priceCAD = (vehicle.saleCAD + (vehicle.colorAdditionalCAD || 0) + accessoriesMSRP);
            }
            if (priceUSD) data = data.replace(/\$msrpUSD/g, priceUSD.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 }) || '');
            if (priceCAD) data = data.replace(/\$msrpCAD/g, priceCAD.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 }) || '');
            if (originalUSD) data = data.replace(/\$originalUSD/g, originalUSD.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 }) || '');
            if (originalCAD) data = data.replace(/\$originalCAD/g, originalCAD.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 }) || '');
            data = data.replace(/\$color/g, vehicle.color || '');
            if (rollick.siteId != 'ARC2' && vehicle.image64) data = data.replace(/\$image/g, vehicle.image64 || '');
            else data = data.replace(/\$image/g, vehicle.image || '');
            if (options.country) {
                rq('.rollick-form-country-select option').each(function (a, b) {
                    if (rq(b).attr('value').toLowerCase() == options.country.toLowerCase().trim()) {
                        rq('.rollick-form-country-select').val(rq(b).attr('value'));
                    }
                });
            }
            if (options.div) {
                if (options.customFlayout) {
                    rq(options.div).html(rollick.designFlayout(data, options));
                    if (!vehicle.color) {
                        rq('.rollick-vehicle-color').addClass('rollick-hidden');
                    }
                } else {
                    rq(options.div).html(data);
                }
                if (typeof Aimbase !== 'undefined') {
                    if (Aimbase && Aimbase.Analytics && Aimbase.Analytics.SendPageAction) {
                        if (rq('.rollick-form-fp').length) Aimbase.Analytics.SendPageAction(rq('.rollick-form-fp')[0], 'Full', 'view', { 'PageAction': '19938612-bb81-4ec7-a250-7a38ba4b02e6' });
                    }
                }
                // result = vehicle.filter(i=>i.color==vehicle.color&&i.modelName==vehicle.modelName)[0]
                rq(".rollick-form-vehicle-type-select").val(vehicle.type);
                rq('.rollick-form-vehicle-vehicle-select').append(rq('<option></option>').attr('value', vehicle.vehicleName).text(vehicle.vehicleName));
                rq(".rollick-form-model-select").append(rq('<option></option>').attr('value', vehicle.modelName).text(vehicle.modelName));
                rq(".rollick-form-color-select").append(rq('<option></option>').attr('value', vehicle.color).text(vehicle.color));
                rq(".rollick-vehicle-image").attr('src', vehicle.image);
                if (originalUSD) {
                    rq('.rollick-vehicle-msrp-usd').html('<div class="vehicle-card__meta" style="display: block; text-align: unset;"><span class="meta--price__value">$' + priceUSD.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 }) + '</span> <span class="vehicle-card__meta--msrp">USD*</span></div><div class="vehicle-card__meta vehicle-marquee__price__original-price--wrap rollick-original-price"><span class="vehicle-card__meta--msrp" style="letter-spacing: initial">WAS</span>&nbsp;<span class="vehicle-marquee__price__original-price__value">$' + originalUSD.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 }) + '</span></div>');
                }
                if (originalCAD) {
                    rq('.rollick-vehicle-msrp-cad').html('<div class="vehicle-card__meta" style="display: block; text-align: unset;"><span class="meta--price__value">$' + priceCAD.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 }) + '</span> <span class="vehicle-card__meta--msrp">CAD*</span></div><div class="vehicle-card__meta vehicle-marquee__price__original-price--wrap rollick-original-price"><span class="vehicle-card__meta--msrp" style="letter-spacing: initial">WAS</span>&nbsp;<span class="vehicle-marquee__price__original-price__value">$' + originalCAD.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 }) + '</span></div>');
                }
                window.setTimeout(function () {
                    if (options.dealerid) {
                        sessionStorage['rollick-dealer-id'] = options.dealerid;
                    }
                    if (rollick.siteId == 'ARC2') self.initFullPageEvents();
                    rollick.dealerInit();
                    var zip = rollick.getQueryZip();
                    if (zip) {
                        rq(rollick.form_postalCode).addClass('has-input');
                        rq(rollick.form_postalCode).val(zip).trigger('change');
                    }
                    if (options.formType == 'save-your-ride' || options.formType == 'event-activity' || options.formType == 'event-sign-up') {
                        if (options.formType != 'event-activity') {
                            rq(rollick.form_phone).on('input', function (e) {
                                var x = e.target.value.replace(/\D/g, '').match(/(\d{0,3})(\d{0,3})(\d{0,4})/);
                                e.target.value = !x[2] ? x[1] : '(' + x[1] + ') ' + x[2] + (x[3] ? '-' + x[3] : '');
                            });
                        }
                        window.setTimeout(function () {
                            rq('.rollick-form-fields').show();
                            rq('.rollick-form-fields').css('overflow-y', 'scroll');
                        }, 500);
                    }
                    if (rollick.suggestedName) delete rollick.suggestedName;
                    if (options.suggestedName) {
                        let sName = options.suggestedName.trim();
                        if (sName.length > 50) sName = sName.substring(0, 50).trim();
                        options.suggestedName = sName;
                        rollick.suggestedName = options.suggestedName;
                        rq('.rollick-suggestion-name').text(options.suggestedName);
                    }
                }, 10);
            } else {
                rq('body').css('overflow', 'hidden').append(data);
                rq('.rollick-form').show();
                window.setTimeout(function () {
                    rq('.rollick-form').addClass('tray--active');
                    rq('.rollick-form-fields').show();
                    validate();
                }, 10);
                if (typeof Aimbase !== 'undefined') {
                    if (Aimbase && Aimbase.Analytics && Aimbase.Analytics.SendPageAction && rq('.rollick-form').length) {
                        if (rq('.rollick-form').length) Aimbase.Analytics.SendPageAction(rq('.rollick-form')[0], 'Flyout', 'view', { 'PageAction': '50d1c736-ad09-424a-af51-09b45b33af81' });
                    }
                }
            }
            rq('.rollick-form-kit-select').on('change', function () {
                rollick.vehicle.image = rollick.vehicle.originalImage;
                rollick.vehicle.kit = rq('.rollick-form-kit-select').val() || '';
                rollick.validateVehicleSelection();
            });

            // load time-to-purchase
            var ttp = rq('.rollick-form-ttp-select');
            ttp.empty();
            if (rollick.leadType.toLowerCase() != 'pre-order' && rollick.timeToPurchase && rollick.timeToPurchase.length) {
                if (rollick.leadType.toLowerCase() == "event activity") {
                    rq('.rollick-vehicle-ttp').removeClass('rollick-hidden');
                    ttp.append(rq('<option></option>').attr('value', '').attr('selected', 'selected').text(''));
                    ttp.val('');
                    rq.each(rollick.ea_ttp, function (key, value) {
                        var opt = rq('<option></option>').attr('value', value).text(value);
                        ttp.append(opt);
                    });
                    ttp.removeClass('rollick-hidden');
                } else {
                    rq('.rollick-vehicle-ttp').removeClass('rollick-hidden');
                    ttp.append(rq('<option></option>').attr('value', '').attr('selected', 'selected').text(''));
                    ttp.val('');
                    rq.each(rollick.timeToPurchase, function (key, value) {
                        var opt = rq('<option></option>').attr('value', value).text(value);
                        ttp.append(opt);
                    });
                    ttp.removeClass('rollick-hidden');
                }
            } else {
                ttp.append(rq('<option></option>').attr('value', 'N/A').text(''));
            }
            if (rollick.leadType.toLowerCase() != "event activity") {
                ttp.on('change', function () {
                    rollick.validateForm();
                });
            }

            // load vehicle series
            if (rq('.rollick-form-vehicle-type-select').length) {
                var c = rq('.rollick-form-vehicle-type-select');
                var types = rollick.distinctValues(rollick.vehicles, 'type');
                c.empty();
                c.append(rq('<option></option>').attr('value', '').text(''));
                c.val('');
                rq.each(types, function (key, value) {
                    var opt = rq('<option></option>').attr('value', value).text(value);
                    if (value.toLowerCase() == (vehicle.type || '').toLowerCase()) opt.attr('selected', 'selected');
                    c.append(opt);
                });
            }

            if (vehicle.trims) {
                rq('.rollick-vehicle-msrp-usd').hide();
                rq('.rollick-vehicle-trim').removeClass('rollick-hidden');
                rq('.rollick-form-first-name-value').removeClass('rollick-form-first');
                rq('.rollick-form-trim-select').addClass('rollick-form-first');
                if (vehicle.priceCAD)
                    rq(".meta--price__value").text(vehicle.priceCAD);
                if (vehicle.priceUSD)
                    rq(".meta--price__value").text(vehicle.priceUSD);
                var t = rq('.rollick-form-trim-select');
                t.empty();
                t.append(rq('<option></option>').attr('value', '').text(''));
                t.val('');
                rq.each(vehicle.trims, function (key, value) {
                    t.append(rq('<option></option>').attr('value', value.trimName).text(value.trimName));
                });
                if (vehicle.trims.length > 1) {
                    rq('.rollick-vehicle-trim').removeClass('rollick-hidden');
                    rq('.rollick-vehicle-msrp-usd').hide();
                } else {
                    rq('.rollick-vehicle-trim').addClass('rollick-hidden');
                    rq('.rollick-vehicle-msrp-usd').hide();
                    if (vehicle.trims.length == 1) {
                        t.val(vehicle.trims[0].trimName);
                        rq('.rollick-vehicle-msrp-usd').show();
                    }
                }
            } else {
                rq('.rollick-vehicle-msrp-usd').show();
                rq('.rollick-vehicle-trim').addClass('rollick-hidden');
            }
            if (options.customFlayout) {
                rq('.rollick-vehicle-msrp-usd').hide();
                rq('.rollick-msrp-disclaimer').hide();
            }

            // set events
            rq(rollick.form_firstName)
                .add(rollick.form_lastName)
                .add(rollick.form_email)
                .add(rollick.form_phone)
                .add(rollick.form_postalCode)
                .add('.rollick-form-comment-value')
                .on('blur', function () {
                    if (rq(this).parents('.rollick-form-checkout').length) {
                        rollick.preorder.sanitize(rq(this));
                        rollick.preorder.validateForm();
                    } else {
                        rollick.sanitize(rq(this));
                        // rollick.validateForm();
                    }
                }).on('focus', function () {
                    rollick.clearBorder(this);
                }).on('input', function () {
                    if (rq(this).parents('.rollick-form-checkout').length) {
                        rollick.preorder.validateForm();
                    } else {
                        // rollick.validateForm();
                    }
                });
            rq('#rollick-appt-date-1')
                .on('blur', function () {
                    rollick.validateForm();
                })
                .on('focus', function () {
                    rollick.clearBorder(this);
                })
                .on('change', function () {
                    rollick.validateForm();
                });
            rq(rollick.form_phone).on('input', function (e) {
                var x = e.target.value.replace(/\D/g, '').match(/(\d{0,3})(\d{0,3})(\d{0,4})/);
                e.target.value = !x[2] ? x[1] : '(' + x[1] + ') ' + x[2] + (x[3] ? '-' + x[3] : '');
            });
            rq(rollick.form_postalCode).on('input', function (e) {
                if (rq('.rollick-form-country-select').val() == 'US') {
                    var x = e.target.value.replace(/\D/g, '').match(/(\d{0,5})/);
                    e.target.value = x[1];
                    if (/Edge/.test(navigator.userAgent) && e.target.value.length == 5) rq(e.target).change();
                } else if (rq('.rollick-form-country-select').val() == 'CA') {
                    var pc = e.target.value.toUpperCase().replace(/\ /g, '');
                    var caTest = /[a-zA-Z][0-9][a-zA-Z][0-9][a-zA-Z][0-9]/;
                    e.target.value = pc;
                    if (caTest.test(pc)) {
                        e.target.value = pc.substring(0, 3) + ' ' + pc.substring(3, 6);
                        if (/Edge/.test(navigator.userAgent) && e.target.value.length == 7) rq(e.target).change();
                    }
                }
            });
            rq(rollick.form_postalCode).on('change', function (e) {
                var countryCode = rq('.rollick-form-country-select').val();
                var brandCode = rq('.rollick-form-vehicle-type-select').val() || rollick.brandCode;
                if (brandCode == 'Off Road') brandCode = 'TOR';
                if (brandCode == 'Snow') brandCode = 'ARC';
                var postalCode = rq(rollick.form_postalCode).val();
                if (postalCode) rq('.rollick-specific-dealer-error').addClass('rollick-hidden');
                if (!sessionStorage['rollick-dealer-id']) rollick.locateDealer(countryCode, brandCode, postalCode);
                else {
                    // verify selected dealer supports bfh
                    rq('.rollick-not-dtd-dealer-error').addClass('rollick-hidden');
                    var bfh = (rollick.showBFH() && rq('#rollick-bfh').is(':checked')) ? true : false;
                    if (bfh) {
                        rollick.verifyDTDDealer(postalCode, sessionStorage['rollick-dealer-id'], function (result) {
                            if (!result) {
                                rq('#rollick-bfh').prop('checked', false);
                                rq('.rollick-not-dtd-dealer-error').removeClass('rollick-hidden');
                                rq('.rollick-form-comment-value').val('I am interested in "Dealer to Driveway", but outside of 50-mile range. ' + rq('.rollick-form-comment-value').val());
                            }
                        });
                    }
                }
            });
            rq('.rollick-form').keyup(function (e) {
                if (e.keyCode === 27) rq('.rollick-form-cancel').click();
                // else rollick.validateForm();
            });
            if (rollick.siteId == 'ARC2') {
                var vt = rq('.rollick-form-vehicle-type-select');
                try {
                    if (vt[0].options.length == 2) {
                        vt[0].options[1].selected = true;
                    }
                    vt.trigger('change');
                } catch (e) { }
                rollick.toggleBFH();
                if (options.bfh || rollick.getQueryDtD()) {
                    rq('#rollick-bfh').prop('checked', true);
                }
                if (options.dealerid) {
                    sessionStorage['rollick-dealer-id'] = options.dealerid;
                    rq('.rollick-specific-dealer-selected').removeClass('rollick-hidden');
                    rq('.rollick-specific-dealer-not-selected').addClass('rollick-hidden');
                    rollick.dealerDisplayDealer();
                }
                if (rq('#rollick-specific-dealer').is(':visible')) {
                    var selectedDealer = rq('#rollick-specific-dealer').val().trim();
                    if (selectedDealer == '') {
                        rq('#rollick-specific-dealer-id').val('');
                        rq('#rollick-specific-dealer-name').val('');
                    } else {
                        if (rollick.dealersList && rollick.dealersList.length) {
                            var bMatched = false;
                            rq.each(rollick.dealersList, function (key, item) {
                                if (!bMatched && item.name == selectedDealer) {
                                    rq('#rollick-specific-dealer-id').val(item.id);
                                    rq('#rollick-specific-dealer-name').val(item.name);
                                    bMatched = true;
                                }
                            });
                            if (!bMatched) {
                                rq.each(rollick.dealersList, function (key, item) {
                                    if (!bMatched && item.name.toLowerCase() == selectedDealer.toLowerCase()) {
                                        rq('#rollick-specific-dealer-id').val(item.id);
                                        rq('#rollick-specific-dealer-name').val(item.name);
                                        bMatched = true;
                                    }
                                });
                            }
                            if (!bMatched) {
                                rq('#rollick-specific-dealer-id').val('');
                                rq('#rollick-specific-dealer-name').val('');
                            }
                        } else {
                            rq('#rollick-specific-dealer-id').val('');
                            rq('#rollick-specific-dealer-name').val('');
                        }
                    }
                }
                rq('#rollick-dealer-choice-closest').off('change').on('change', function () {
                    rq('#rollick-specific-dealer').removeClass('error');
                    if (rq('#rollick-bfh').is(':visible')) {
                        rq('#rollick-bfh').trigger('change');
                    }
                    self.validateForm();
                });
                rq('#rollick-dealer-choice-customer').off('click').on('click', function () {
                    rq('#rollick-specific-dealer').focus();
                    if (!rq('#rollick-specific-dealer').val()) {
                        rq('#rollick-specific-dealer-id').val('');
                        rq('#rollick-specific-dealer-name').val('');
                    }
                    self.validateForm();
                });
            }

            if (options.country) {
                rq('.rollick-form-country-select option').each(function (a, b) {
                    if (rq(b).attr('value').toLowerCase() == options.country.toLowerCase().trim()) {
                        rq('.rollick-form-country-select').val(rq(b).attr('value'));
                    }
                });
            }
            if (options.div) {
                if (options.customFlyout) {
                    rq(options.div).html(rollick.designFlayout(data, options));
                    if (!vehicle.color) {
                        rq('.rollick-vehicle-color').addClass('rollick-hidden');
                    }
                } else {
                    rq(options.div).html(data);
                }
                if (typeof Aimbase !== 'undefined') {
                    if (Aimbase && Aimbase.Analytics && Aimbase.Analytics.SendPageAction) {
                        if (rq('.rollick-form-fp').length) Aimbase.Analytics.SendPageAction(rq('.rollick-form-fp')[0], 'Full', 'view', { 'PageAction': '19938612-bb81-4ec7-a250-7a38ba4b02e6' });
                    }
                }
                window.setTimeout(function () {
                    if (options.dealerid) {
                        sessionStorage['rollick-dealer-id'] = options.dealerid;
                    }
                    if (rollick.siteId == 'ARC2') self.initFullPageEvents();
                    var zip = rollick.getQueryZip();
                    if (zip) {
                        rq(rollick.form_postalCode).addClass('has-input');
                        rq(rollick.form_postalCode).val(zip).trigger('change');
                    }
                    if (options.listCode) {
                        rq('#listCode').val(options.listCode.trim());
                    }
                }, 10);

                rq('.tray__close').on('click', function (e) {
                    rollick.closeForm();
                    //rq('.rollick-form-close-button').trigger("click");
                });
            }

            // load vehicle interest
            var areaOfInterestSelect = rq('.rollick-form-area-of-interest-select');
            areaOfInterestSelect.empty();
            if (rollick.leadType.toLowerCase() != 'pre-order' && rollick.areaOfInterestSelect && rollick.areaOfInterestSelect.length) {
                rq('.rollick-area-of-interest').removeClass('rollick-hidden');
                areaOfInterestSelect.append(rq('<option></option>').attr('value', '').attr('selected', 'selected').text(''));
                areaOfInterestSelect.val('');
                rq.each(rollick.areaOfInterestSelect, function (key, option) {
                    var opt = rq('<option></option>').attr('value', option.value).text(option.text);
                    areaOfInterestSelect.append(opt);
                });
                areaOfInterestSelect.removeClass('rollick-hidden');
                rq('.rollick-company').hide();
            } else {
                areaOfInterestSelect.append(rq('<option></option>').attr('value', 'N/A').text(''));
            }
            areaOfInterestSelect.on('change', function () {
                validate();
            });

            // load brochure category
            var brochureCategorySelect = rq('.rollick-form-brochure-category-select');
            brochureCategorySelect.empty();
            if (rollick.leadType.toLowerCase() != 'pre-order' && rollick.brochureCategorySelect && rollick.brochureCategorySelect.length) {
                rq('.rollick-brochure-category').removeClass('rollick-hidden');
                brochureCategorySelect.append(rq('<option></option>').attr('value', '').attr('selected', 'selected').text(''));
                brochureCategorySelect.val('');
                rq.each(rollick.brochureCategorySelect, function (key, option) {
                    var opt = rq('<option></option>').attr('value', option.value).text(option.text);
                    brochureCategorySelect.append(opt);
                });
                brochureCategorySelect.removeClass('rollick-hidden');
                rq('.rollick-company').hide();
            } else {
                brochureCategorySelect.append(rq('<option></option>').attr('value', 'N/A').text(''));
            }
            brochureCategorySelect.on('change', function () {
                validate();
            });

            rq('.rollick-form-phone-value').on('input', function (e) {
                validate();
            });

            // load vehicle ownership
            var $currentOwner = rq('input[name="rollick-ownership"]');

            $currentOwner.on('click', function () {
                validate();
            });

            var $interest = rq('input[name="interest"]');

            $interest.on('click', function () {
                validate();
            });

            var $ttp_select = rq('#rollick-ttp');

            $ttp_select.on('change', function () {
                validate();
            });

            rq('#rollick-optin').click(function () {
                validate();
            });

            // set events
            rq('.rollick-form-country-select').on('change', function () {
                var country = 'United States';
                if (options.country) {
                    //rq('.rollick-form-country-select').hide();
                    if (options.country.toLowerCase() == 'ca') country = 'Canada';
                }
                var selectedCountry = rq('.rollick-form-country-select').val();
                if (selectedCountry.toLowerCase() == 'ca') {
                    country = 'Canada';
                    rq(rollick.form_postalCode).attr('maxlength', 7);
                    rq('.rollick-invalid-postal').text('Invalid postal code');
                    if (options.language == 'fr') rq('.rollick-invalid-postal').text('Code postal invalide');
                }

                rq(rollick.form_postalCode).val('');
                var postal_code_label = 'ZIP Code';
                if (country != 'United States') {
                    postal_code_label = 'Postal Code';
                    rq('.rollick-vehicle-msrp-usd').hide();
                    rq('.rollick-vehicle-msrp-cad').show();
                    if (sessionStorage['rollick-zip']) {
                        if (sessionStorage['rollick-zip'].length == 7) rq(rollick.form_postalCode).val(sessionStorage['rollick-zip']);
                    }
                } else {
                    rq('.rollick-vehicle-msrp-usd').show();
                    rq('.rollick-vehicle-msrp-cad').hide();
                    if (sessionStorage['rollick-zip']) {
                        if (sessionStorage['rollick-zip'].length == 5) rq(rollick.form_postalCode).val(sessionStorage['rollick-zip']);
                    }
                }
                if (options.language == 'fr') postal_code_label = 'Code Postal';
                rq('.rollick-form-postal-code-label').text(postal_code_label);
            });
            rq(rollick.form_firstName)
                .add(rollick.form_lastName)
                .add(rollick.form_email)
                .add(rollick.form_phone)
                .add(rollick.form_postalCode)
                .add('.rollick-form-comment-value')
                .add('.rollick-form-initials-value')
                .add('.rollick-form-question-value')
                .add('.rollick-form-experience-select')
                .add('#casting-call-image1')
                .add('#casting-call-image2')
                .on('blur', function () {
                    rollick.sanitize(rq(this));
                    validate();
                }).on('focus', function () {
                    rollick.clearBorder(this);
                }).on('input', function () {
                    validate();
                });
            rq(rollick.form_postalCode).on('input', function (e) {
                if (rq('.rollick-form-country-select').val() == 'US') {
                    var x = e.target.value.replace(/\D/g, '').match(/(\d{0,5})/);
                    e.target.value = x[1];
                    if (/Edge/.test(navigator.userAgent) && e.target.value.length == 5) rq(e.target).change();
                } else if (rq('.rollick-form-country-select').val() == 'CA') {
                    var pc = e.target.value.toUpperCase().replace(/\ /g, '');
                    var caTest = /[a-zA-Z][0-9][a-zA-Z][0-9][a-zA-Z][0-9]/;
                    e.target.value = pc;
                    if (caTest.test(pc)) {
                        e.target.value = pc.substring(0, 3) + ' ' + pc.substring(3, 6);
                        if (/Edge/.test(navigator.userAgent) && e.target.value.length == 7) rq(e.target).change();
                    }
                }
            });
            rq('.rollick-form').keyup(function (e) {
                if (e.keyCode === 27) rq('.rollick-form-cancel').click();
            });
            if (options.country) {
                rq('.rollick-form-country-select option').each(function (a, b) {
                    if (rq(b).attr('value').toLowerCase() == options.country.toLowerCase().trim()) {
                        rq('.rollick-form-country-select').val(rq(b).attr('value'));
                        rq('.rollick-form-country-select').triggerHandler('change');
                    }
                });
            }

            // set screens
            rq('.rollick-form-fields').css('overflow', 'auto');
            rq('.rollick-form-first').focus();
            if (options.div) {
                if (rq('.rollick-form-fields').length) {
                    rq('.rollick-form-fields')[0].scrollIntoView(true);
                    var scrolledY = window.scrollY;
                    if (scrolledY) {
                        window.scroll(0, scrolledY - 100);
                    }
                }
            } else {
                rq('.rollick-form-fields')[0].scrollTop = 0;
            }

            // tracking
            if (typeof Aimbase !== 'undefined') {
                if (Aimbase && Aimbase.Analytics && Aimbase.Analytics.AddListener) {
                    if (rq('.rollick-form-submit').length) Aimbase.Analytics.AddListener(rq('.rollick-form-submit')[0], 'Submit', 'click', { 'PageAction': 'bc96b92b-fadb-44c8-a570-24e182d79216' });
                }
            }
        });
        return;
    },

    validateRequestBrochureForm() {
        var self = this;
        if (!rq(self.form_firstName).length) return;
        var fn = rq(self.form_firstName).val().trim();
        var ln = rq(self.form_lastName).val().trim();
        var e = rq(self.form_email).val().trim();
        var pc = rq(self.form_postalCode).val().trim();
        var optIn = rq('input[id="rollick-optin"]:checked').val() || '';

        var isValidEmail = (/^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/).test(e.toLowerCase());
        var isValidPostalCode = false;

        isValidPostalCode = (pc.length == 5);
        var phone = rq(self.form_phone).val().trim();
        var isValidPhone = (phone.length == 14);

        self.checkRequired(fn, self.form_firstName);
        self.checkRequired(ln, self.form_lastName);
        self.checkRequired(e, self.form_email);
        self.checkRequired(pc, self.form_postalCode);

        rq(rollick.form_phone).on('input', function (e) {
            var x = e.target.value.replace(/\D/g, '').match(/(\d{0,3})(\d{0,3})(\d{0,4})/);
            e.target.value = !x[2] ? x[1] : '(' + x[1] + ') ' + x[2] + (x[3] ? '-' + x[3] : '');
        });

        if (fn) {
            if (fn.length > 1) {
                rq(self.form_firstName).val(fn.substring(0, 1).toUpperCase() + fn.substring(1));
            } else {
                rq(self.form_firstName).val(fn.toUpperCase());
            }
        }
        if (ln) {
            if (ln.length > 1) {
                rq(self.form_lastName).val(ln.substring(0, 1).toUpperCase() + ln.substring(1));
            } else {
                rq(self.form_lastName).val(ln.toUpperCase());
            }
        }

        if (!pc) {
            if (!fn || !ln || !e || !pc || !phone || !isValidPhone || !isValidEmail || !isValidPostalCode) {
                rq('.rollick-form-submit').addClass('disabled');
                rq('.rollick-form-payment').addClass('disabled');
            } else {
                rq('.rollick-form-submit').removeClass('disabled');
                rq('.rollick-form-payment').removeClass('disabled');
            }
        }

        if (pc) {
            if (!isValidPostalCode) {
                rq('.rollick-form-submit').addClass('disabled');
                rq('.rollick-form-payment').addClass('disabled');
                rq('.rollick-invalid-postal').removeClass('rollick-hidden');
            } else {
                self.validateZip(pc, function (isValidZip) {
                    isValidPostalCode = isValidZip;
                    if (!isValidZip) {
                        rq('.rollick-invalid-postal').removeClass('rollick-hidden');
                    } else {
                        rq('.rollick-invalid-postal').addClass('rollick-hidden');
                    }
                    if (!fn || !ln || !e || !pc || !phone || !isValidPhone || !isValidEmail || !isValidPostalCode) {
                        rq('.rollick-form-submit').addClass('disabled');
                        rq('.rollick-form-payment').addClass('disabled');
                    } else {
                        rq('.rollick-form-submit').removeClass('disabled');
                        rq('.rollick-form-payment').removeClass('disabled');
                    }
                });
            }
        }
        if (e) {
            if (!isValidEmail) {
                rq('.rollick-invalid-email').removeClass('rollick-hidden');
            } else {
                rq('.rollick-invalid-email').addClass('rollick-hidden');
            }
        }
        if (phone) {
            if (!isValidPhone) {
                rq('.rollick-invalid-phone').removeClass('rollick-hidden');
            } else {
                rq('.rollick-invalid-phone').addClass('rollick-hidden');
            }
        }
    },

    getBrochureFormData() {

        var self = this;
        var data = {};

        if (typeof Aimbase !== 'undefined') {
            if (Aimbase && Aimbase.Analytics) {
                var fn = rq(self.form_firstName).val();
                var ln = rq(self.form_lastName).val();
                var e = rq(self.form_email).val();
                var pc = rq(self.form_postalCode).val();
                var country = rq('.rollick-form-country-select').val();
                var brochureType = rq('.rollick-form-brochure-category-select').val();
                var brochureURL = "";
                var submittedFrom = (window && window.location && (window.location.protocol + '//' + window.location.host + window.location.pathname));
                var brandCode = "";
                var phone = rq(self.form_phone).val();

                self.userId = Aimbase.Analytics.GetUserUid();
                self.sessionId = Aimbase.Analytics.GetSessionUid();
                self.source = Aimbase.Analytics.GetFieldValue('source') || 'Organic';
                self.campaign = Aimbase.Analytics.GetFieldValue('campaign') || '';

                switch (brochureType) {
                    case 'SnowEng':
                        brochureURL = "https://arcticcat.txtsv.com/snow-brochure";
                        brandCode = 'ARC';
                        break;
                    case 'SnowFr':
                        brochureURL = "https://arcticcat.txtsv.com/snow-brochure-fr";
                        brandCode = 'ARC';
                        break;
                    case 'OffRoadEng':
                        brochureURL = "https://arcticcat.txtsv.com/dirt-brochure";
                        brandCode = 'TOR';
                        break;
                    case 'OffRoadFr':
                        brochureURL = "https://arcticcat.txtsv.com/dirt-brochure-fr";
                        brandCode = 'TOR';
                        break;
                }

                rollick.brochureURL = brochureURL;
                data.uid = self.userId;
                data.sid = self.sessionId;
                data.source = self.source;
                data.campaign = self.campaign;
                data.type = (self.leadType ? self.leadType : 'Request a Brochure');
                data.category = 'Arctic Cat Website';
                data.firstName = fn;
                data.lastName = ln;
                data.email = e;
                data.postalCode = pc;
                data.countryCode = country ? country : 'US';
                data.brochureType = brochureType;
                data.submittedFrom = submittedFrom;
                data.brand = brandCode ? brandCode : 'ARC';
                data.productCode = 'Uncategorized';
                data.optIn = false;
                data.phone = phone;
                data.salesDriver = 'No';

                if (rq('#rollick-optin').is(':checked')) {
                    data.optIn = true;
                    data.ip = self.ip;
                    data.optInDate = (new Date()).valueOf();
                    data.optInSource = 'Textron';
                    data.optInListCode = rq('#optInListCode').val() || 'NewsPromo';
                }

                var optInListCode = [];
                if (data.optInListCode) {
                    optInListCode.push(data.optInListCode);
                }
                if (brochureType == 'SnowEng') {
                    data.optInListCode = 'Arctic Cat Brochure Snow - English';
                    optInListCode.push('Arctic Cat Master English');
                    optInListCode.push('Arctic Cat Snow English');
                }

                if (brochureType == 'SnowFr') {
                    data.optInListCode = 'Arctic Cat Brochure Snow - French';
                    optInListCode.push('Arctic Cat Master French');
                    optInListCode.push('Arctic Cat Snow French');
                }

                if (brochureType == 'OffRoadEng') {
                    data.optInListCode = 'Arctic Cat Brochure Off Road - English';
                    optInListCode.push('Arctic Cat Master English');
                    optInListCode.push('Arctic Cat Off Road English');
                }

                if (brochureType == 'OffRoadFr') {
                    data.optInListCode = 'Arctic Cat Brochure Off Road - French';
                    optInListCode.push('Arctic Cat Master French');
                    optInListCode.push('Arctic Cat Off Road French');
                }

                data.optInListCode = optInListCode.join(',');

                data.referrer = sessionStorage['rollick-referrer-value'];
                if (self.abandoned) data.abandoned = true;
            }
        }
        return data;
    },

    submitRequestBrochureForm(closeAfter) {

        if (rollick.isFormSubmitted) {
            return true;
        }

        rollick.sanitize(rq(rollick.form_firstName));
        rollick.sanitize(rq(rollick.form_lastName));
        rollick.sanitize(rq(rollick.form_email));
        rollick.sanitize(rq(rollick.form_postalCode));
        rollick.validateRequestBrochureForm();

        var requiredFields = rq('input.rollick-form-field, select.rollick-form-field');

        requiredFields.each(function (i, e) {
            var el = rq(e);

            if (el[0].type == 'checkbox') {

                if (!el[0].checked) {
                    el.next('span').addClass('rollick-required');
                }
                else {
                    el.next('span').removeClass('rollick-required');
                }

            }
            else if (el.val() == '' || el.val().length == 0) {
                el.addClass('rollick-required');
                el.focus();
                return false;
            }
            else {
                el.removeClass('rollick-required');
            }

        });

        if (rq('.rollick-form-submit').hasClass('disabled') && !rollick.abandoned) {
            return true;
        }

        // submit form
        rq('.rollick-form-submit').addClass('disabled');
        var data = rollick.getBrochureFormData();
        if (data) rollick.isFormSubmitted = true;
        if (Object.keys(data).length) {
            rollick.showLoading();
            if (window.dataLayer) window.dataLayer.push({ event: 'custom.requestMoreInfoSubmission', 'custom.eventLabel': data.productName });
            rq.ajax({
                url: rollick.validation + '/aimproxy',
                dataType: 'json',
                contentType: 'application/json;charset=utf-8',
                type: 'POST',
                timeout: 15000,
                data: JSON.stringify(data),
                success(resp) {
                    rollick.hideLoading();
                    if (closeAfter) {
                        rollick.closeForm();
                    } else {
                        if (rollick.customFlyout) {
                            if (rollick.redirectUrl) {
                                location.href = rollick.redirectUrl;
                            } else {
                                rollick_e_z_go_container.contentWindow.postMessage({ command: 'lead created', payload: { input: data } }, '*');
                            }
                        } else {
                            if (rollick.redirectUrl) {
                                if (rollick.brochureURL && rollick.leadType.toLowerCase() == 'request a brochure') {
                                    location.href = rollick.brochureURL;
                                }
                                else {
                                    location.href = rollick.redirectUrl;
                                }
                            } else {
                                if (rollick.leadType.toLowerCase() == 'reserve now') {
                                    var v = Object.assign({}, rollick.vehicle);
                                    delete v.trims;
                                    v.price = data.msrp;
                                    rollick.showReceipt(v, data.partnerName, null);
                                } else {
                                    rollick.closeForm();
                                }
                            }
                        }
                    }
                },
                error(resp) {
                    rollick.hideLoading();
                    rollick.isFormSubmitted = false;
                    if (!closeAfter) {
                        alert('We have encountered an unexpected error. Please try again later.');
                        rollick.validateEmailSignUpForm();
                    } else {
                        rollick.closeForm();
                    }
                    return false;
                }
            });
        } else {
            rollick.isFormSubmitted = false;
            if (!closeAfter) {
                alert('We are unable to process your request at this time. Please try again later.');
                rollick.validateRequestBrochureForm();
            } else {
                rollick.closeForm();
            }
            return false;
        }
    },

    validateSaveRideForm() {
        var self = this;
        if (!rq(self.form_firstName).length) return;
        var fn = rq(self.form_firstName).val().trim();
        var ln = rq(self.form_lastName).val().trim();
        var e = rq(self.form_email).val().trim();
        var pc = rq(self.form_postalCode).val().trim();
        var phone = rq(self.form_phone).val().trim();
        var currentOwner = rq('input[name="rollick-ownership"]:checked').val() || '';
        var isValidEmail = (/^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/).test(e.toLowerCase());
        var isValidPhone = (phone.length == 14);
        var isValidPostalCode = false;

        isValidPostalCode = (pc.length == 5);

        self.checkRequired(fn, self.form_firstName);
        self.checkRequired(ln, self.form_lastName);
        self.checkRequired(e, self.form_email);
        self.checkRequired(pc, self.form_postalCode);
        self.checkRequired(phone, self.form_phone);

        if (fn) {
            if (fn.length > 1) {
                rq(self.form_firstName).val(fn.substring(0, 1).toUpperCase() + fn.substring(1));
            } else {
                rq(self.form_firstName).val(fn.toUpperCase());
            }
        }
        if (ln) {
            if (ln.length > 1) {
                rq(self.form_lastName).val(ln.substring(0, 1).toUpperCase() + ln.substring(1));
            } else {
                rq(self.form_lastName).val(ln.toUpperCase());
            }
        }

        if (!pc) {
            if (!fn || !ln || !e || !pc || !phone || !isValidEmail || !isValidPostalCode || !currentOwner || !isValidPhone) {
                rq('.rollick-form-submit').addClass('disabled');
                rq('.rollick-form-payment').addClass('disabled');
            } else {
                rq('.rollick-form-submit').removeClass('disabled');
                rq('.rollick-form-payment').removeClass('disabled');
            }
        }

        if (pc) {
            if (!isValidPostalCode) {
                rq('.rollick-form-submit').addClass('disabled');
                rq('.rollick-form-payment').addClass('disabled');
                rq('.rollick-invalid-postal').removeClass('rollick-hidden');
            } else {
                self.validateZip(pc, function (isValidZip) {
                    isValidPostalCode = isValidZip;
                    if (!isValidZip) {
                        rq('.rollick-invalid-postal').removeClass('rollick-hidden');
                    } else {
                        rq('.rollick-invalid-postal').addClass('rollick-hidden');
                    }
                    if (!fn || !ln || !e || !pc || !phone || !isValidEmail || !isValidPostalCode || !currentOwner) {
                        rq('.rollick-form-submit').addClass('disabled');
                        rq('.rollick-form-payment').addClass('disabled');
                    } else {
                        rq('.rollick-form-submit').removeClass('disabled');
                        rq('.rollick-form-payment').removeClass('disabled');
                    }
                });
            }
        }
        if (e) {
            if (!isValidEmail) {
                rq('.rollick-invalid-email').removeClass('rollick-hidden');
            } else {
                rq('.rollick-invalid-email').addClass('rollick-hidden');
            }
        }
        if (phone) {
            if (!isValidPhone) {
                rq('.rollick-invalid-phone').removeClass('rollick-hidden');
            } else {
                rq('.rollick-invalid-phone').addClass('rollick-hidden');
            }
        }
    },

    getSaveRideFormData() {

        var self = this;
        var data = {};

        if (typeof Aimbase !== 'undefined') {
            if (Aimbase && Aimbase.Analytics) {
                var fn = rq(self.form_firstName).val();
                var ln = rq(self.form_lastName).val();
                var e = rq(self.form_email).val();
                var pc = rq(self.form_postalCode).val();
                var phone = rq(self.form_phone).val().trim();
                var country = rq('.rollick-form-country-select').val();
                var currentOwner = rq('input[name="rollick-ownership"]:checked').val() || '';
                var submittedFrom = window.location.href;
                var DropOffUrl = window.location.href;

                self.userId = Aimbase.Analytics.GetUserUid();
                self.sessionId = Aimbase.Analytics.GetSessionUid();
                self.source = Aimbase.Analytics.GetFieldValue('source') || 'Organic';
                self.campaign = Aimbase.Analytics.GetFieldValue('campaign') || '';

                data.uid = self.userId;
                data.sid = self.sessionId;
                data.source = self.source;
                data.campaign = self.campaign;
                data.type = (self.leadType ? self.leadType : 'Save Your Build');
                data.firstName = fn;
                data.lastName = ln;
                data.email = e;
                data.phone = phone;
                data.postalCode = pc;
                data.countryCode = country ? country : 'US';
                data.currentOwner = currentOwner;
                data.submittedFrom = submittedFrom;
                data.productCode = 'Uncategorized';
                data.DropOffUrl = DropOffUrl;
                data.salesDriver = 'No';

                if (self.siteId == 'EZG') {
                    data.category = 'E-Z-GO Website';
                    data.brand = self.siteId;
                }
                else if (self.siteId == 'ARC2') {
                    data.category = 'Arctic Cat Website';
                    data.brand = 'ARC';
                    if (location.pathname.toLowerCase().indexOf('buyers-guide-offroad') != -1) data.brand = 'TOR';
                    if (rollick.vehicle && rollick.vehicle.type && rollick.vehicle.type == 'Snow') data.brand = 'ARC';
                    if (rollick.vehicle && rollick.vehicle.type && rollick.vehicle.type != 'Snow') data.brand = 'TOR';
                }

                if (self.siteId == 'EZG') {
                    //No Dealer Data
                    data.partnerChoice = 'Closest';
                    data.preselect = false;
                }

                data.optIn = false;
                if (rq('#rollick-optin').is(':checked')) {
                    data.optIn = true;
                    data.ip = self.ip;
                    data.optInDate = (new Date()).valueOf();
                    data.optInSource = 'Textron';
                    data.optInListCode = rq('#optInListCode').val() || 'NewsPromo';
                }

                data.referrer = sessionStorage['rollick-referrer-value'];
                if (self.abandoned) data.abandoned = true;

                if (self.siteId == 'EZG') {
                    var optInListCode = [];
                    if (data.optInListCode) {
                        optInListCode.push(data.optInListCode);
                    }
                    optInListCode.push('E-Z-GO Master - Personal');
                    data.optInListCode = optInListCode.join(',');
                }
            }
        }
        return data;
    },

    submitSaveRideForm(closeAfter) {
        rollick.sanitize(rq(rollick.form_firstName));
        rollick.sanitize(rq(rollick.form_lastName));
        rollick.sanitize(rq(rollick.form_email));
        rollick.sanitize(rq(rollick.form_postalCode));
        rollick.validateSaveRideForm();

        var requiredFields = rq('input.rollick-form-field, select.rollick-form-field');

        requiredFields.each(function (i, e) {
            var el = rq(e);

            if (el[0].type == 'checkbox') {

                if (!el[0].checked) {
                    el.next('span').addClass('rollick-required');
                }
                else {
                    el.next('span').removeClass('rollick-required');
                }

            }
            else if (el.val() == '' || el.val().length == 0) {
                el.addClass('rollick-required');
                el.focus();
                return false;
            }
            else {
                el.removeClass('rollick-required');
            }

        });

        if (rq('.rollick-form-submit').hasClass('disabled') && !rollick.abandoned) {
            return true;
        }

        // submit form
        rq('.rollick-form-submit').addClass('disabled');
        var data = rollick.getSaveRideFormData();
        if (data) rollick.isFormSubmitted = true;
        if (Object.keys(data).length) {
            rollick.showLoading();
            if (window.dataLayer) window.dataLayer.push({ event: 'custom.requestMoreInfoSubmission', 'custom.eventLabel': data.productName });
            rq.ajax({
                url: rollick.validation + '/aimproxy',
                dataType: 'json',
                contentType: 'application/json;charset=utf-8',
                type: 'POST',
                timeout: 15000,
                data: JSON.stringify(data),
                success(resp) {
                    rollick.hideLoading();
                    if (closeAfter) {
                        rollick.closeForm();
                    } else {
                        if (rollick.customFlyout) {
                            if (rollick.redirectUrl) {
                                location.href = rollick.redirectUrl;
                            } else {
                                rollick_e_z_go_container.contentWindow.postMessage({ command: 'lead created', payload: { input: data } }, '*');
                            }
                        } else {
                            if (rollick.redirectUrl) {
                                location.href = rollick.redirectUrl;
                            } else {
                                if (rollick.leadType.toLowerCase() == 'reserve now') {
                                    var v = Object.assign({}, rollick.vehicle);
                                    delete v.trims;
                                    v.price = data.msrp;
                                    rollick.showReceipt(v, data.partnerName, null);
                                } else {
                                    if (rq('.rollick-form-confirmation')) {
                                        rq('.rollick-arc-save-your-ride-form').hide();
                                        rq('.rollick-form-confirmation').removeClass('rollick-hidden');
                                    }
                                    else {
                                        rollick.closeForm();
                                    }
                                }
                            }
                        }
                    }
                },
                error(resp) {
                    rollick.hideLoading();
                    rollick.isFormSubmitted = false;
                    if (!closeAfter) {
                        alert('We have encountered an unexpected error. Please try again later.');
                        rollick.validateSaveRideForm();
                    } else {
                        rollick.closeForm();
                    }
                    return false;
                }
            });
        } else {
            rollick.isFormSubmitted = false;
            if (!closeAfter) {
                alert('We are unable to process your request at this time. Please try again later.');
                rollick.validateSaveRideForm();
            } else {
                rollick.closeForm();
            }
            return false;
        }
    },

    getInSeasonDealer(country, brand, zip) {
        return new Promise(async (resolve, reject) => {
            let dealer = null;
            try {
                if (rollick.inseason && rollick.inseason[brand.toLowerCase()] && rollick.dealersList && rollick.dealersList.length) {
                    let data = await rq.get(rollick.widget + '/geocode/' + zip);
                    if (data.isValid && data.location) {
                        if (data.location.lat && data.location.lng) {
                            let inSeasonDealers = JSON.parse(JSON.stringify(rollick.dealersList));
                            inSeasonDealers = inSeasonDealers.filter(d => d.inseason).map(d => { d.distance = -1; return d; });
                            for (let i = 0; i < inSeasonDealers.length; i++) {
                                let idlr = inSeasonDealers[i];
                                idlr.distance = rollick.distance(data.location.lat, data.location.lng, idlr.lat, idlr.lng);
                            }
                            inSeasonDealers = inSeasonDealers.filter(d => d.distance >= 0).sort((a, b) => { return a.distance - b.distance; });
                            dealer = inSeasonDealers[0];
                            if (dealer.distance > 50) dealer = null;
                        }
                    }
                }
            } catch (e) {
                dealer = null;
            }
            resolve(dealer);
        });
    },

    distance(lat1, lon1, lat2, lon2, unit) {
        if ((lat1 == lat2) && (lon1 == lon2)) {
            return 0;
        }
        else {
            var radlat1 = Math.PI * lat1 / 180;
            var radlat2 = Math.PI * lat2 / 180;
            var theta = lon1 - lon2;
            var radtheta = Math.PI * theta / 180;
            var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
            if (dist > 1) {
                dist = 1;
            }
            dist = Math.acos(dist);
            dist = dist * 180 / Math.PI;
            dist = dist * 60 * 1.1515;
            if (unit == "K") { dist = dist * 1.609344 }
            if (unit == "N") { dist = dist * 0.8684 }
            return dist;
        }
    },

    initSKUPickerCarousel() {
        var self = this;
        var skus = self.vehiclesRemaining;
        rq('.rollick-sku-picker .rollick-multiple-skus').removeClass('rollick-hidden');
        if (skus.length > 1) rq('.rollick-sku-picker .rollick-multiple-skus .rollick-carousel-nav').removeClass('rollick-hidden');
        else rq('.rollick-sku-picker .rollick-multiple-skus .rollick-carousel-nav').addClass('rollick-hidden');
        var carousel = rq('.rollick-sku-picker .carousel-sku');
        carousel.empty();
        var vehicles = '';
        for (var i = 0; i < skus.length; i++) {
            vehicles += '<div class="item' + (i == 0 ? ' active"' : '"') + ' style="background-image: url(' + skus[i].image + ')"></div>';
        }
        carousel.html(vehicles);
        rollick.vehicle = skus[0];
        if (rollick.vehicle) rollick.vehicle.originalImage = rollick.vehicle.image;
        rq('.rollick-sku-picker .rollick-multiple-skus .carousel-status').text('1 of ' + skus.length);
        rq('.rollick-sku-picker .rollick-multiple-skus .carousel-next').off('click').on('click', { d: 'n' }, rotate);
        rq('.rollick-sku-picker .rollick-multiple-skus .carousel-prev').off('click').on('click', { d: 'p' }, rotate);

        function rotate(e) {
            var items = carousel.find('.item');
            var activeIndex = -1;
            for (var i = 0; i < items.length; i++) {
                if (rq(items[i]).hasClass('active')) activeIndex = i;
            }
            if (e.data.d == 'n') {
                activeIndex++;
                if (activeIndex >= items.length) activeIndex = 0;
            }
            if (e.data.d == 'p') {
                activeIndex--;
                if (activeIndex < 0) activeIndex = items.length - 1;
            }
            items.removeClass('active');
            rq(items[activeIndex]).addClass('active');
            rq('.rollick-sku-picker .rollick-multiple-skus .carousel-status').text((activeIndex + 1) + ' of ' + skus.length);
            var sku = skus[activeIndex];
            rollick.vehicle = sku;
            rollick.vehicle.originalImage = rollick.vehicle.image;
            self.validateSKUPickerVehicleSelection(rollick.country || 'US');
        }
    },

    validateSKUPickerVehicleSelection() {
        var self = this;
        var kit = rq('.rollick-sku-picker .rollick-form-kit-select').val() || '';
        var isVehicleSelected = (rollick.vehicle && (rollick.vehicle.mfgModelCode || rollick.vehicle.modelName));

        if (isVehicleSelected) {
            if (rollick.vehicle.type != rq('.rollick-sku-picker .rollick-form-vehicle-type-select').val()) {
                rq('.rollick-sku-picker .rollick-form-vehicle-type-select').val(rollick.vehicle.type);
            }
            if (rollick.vehicle.type == 'Snow') {
                rq('.rollick-vehicle-type-caption').text('SELECT YOUR SLED');
            } else {
                rq('.rollick-vehicle-type-caption').text('SELECT YOUR VEHICLE');
            }
            var accessoriesMSRP = 0;
            var kitMSRPUSD = 0;
            var kitMSRPCAD = 0;
            var kitSaleUSD = 0;
            var kitSaleCAD = 0;
            if (rollick.accessories && rollick.accessories.length) {
                rollick.accessories.forEach(function (acc) { accessoriesMSRP += parseFloat(acc.cost); });
            }
            if (kit && rollick.vehicle.hasKits) {
                rq.each(rollick.vehicle.kits, function (key, item) {
                    if (item.part.toLowerCase() == kit.toLowerCase() || item.item.toLowerCase() == kit.toLowerCase()) {
                        kitMSRPUSD = item.msrpUSD;
                        kitMSRPCAD = item.msrpCAD;
                        kitSaleUSD = item.saleUSD || 0;
                        kitSaleCAD = item.saleCAD || 0;
                        if (item.image && (item.image || '').trim().length) {
                            rollick.vehicle.image = item.image.trim();
                        }
                    }
                });
            }
            var priceUSD = (rollick.vehicle.msrpUSD + (rollick.vehicle.colorAdditionalUSD || 0) + kitMSRPUSD + accessoriesMSRP);
            var priceCAD = (rollick.vehicle.msrpCAD + (rollick.vehicle.colorAdditionalCAD || 0) + kitMSRPCAD + accessoriesMSRP);
            var originalUSD = priceUSD;
            var originalCAD = priceCAD;
            if (rollick.vehicle.saleUSD) {
                priceUSD = (rollick.vehicle.saleUSD + (rollick.vehicle.colorAdditionalUSD || 0) + (kitSaleUSD || kitMSRPUSD) + accessoriesMSRP);
            }
            if (rollick.vehicle.saleCAD) {
                priceCAD = (rollick.vehicle.saleCAD + (rollick.vehicle.colorAdditionalCAD || 0) + (kitSaleCAD || kitMSRPCAD) + accessoriesMSRP);
            }

            if (rq('.rollick-sku-picker .rollick-form-country-select :checked').val() == 'CA' || rollick.country == 'CA') {
                rq('.rollick-sku-picker .rollick-vehicle-msrp-usd').addClass('rollick-hidden');
                rq('.rollick-sku-picker .rollick-vehicle-msrp-cad').removeClass('rollick-hidden');
            } else {
                rq('.rollick-sku-picker .rollick-vehicle-msrp-usd').removeClass('rollick-hidden');
                rq('.rollick-sku-picker .rollick-vehicle-msrp-cad').addClass('rollick-hidden');
            }

            rq('.rollick-sku-picker .carousel-modelName').html('<div><h5>' + rollick.vehicle.modelName + '</h5></div>');
            rq('.rollick-sku-picker .carousel-model-details').html(rollick.generateVehicleDetailsHtml(rollick.vehicle));

            rq('.rollick-sku-picker .rollick-vehicle-msrp-usd .meta--price__value').text(self.formatCurrency(priceUSD, '$'));
            rq('.rollick-sku-picker .rollick-vehicle-msrp-cad .meta--price__value').text(self.formatCurrency(priceCAD, '$'));
            if (rollick.vehicle.saleUSD) {
                rq('.rollick-sku-picker .rollick-vehicle-msrp-usd .vehicle-marquee__price__original-price__value').text(self.formatCurrency(originalUSD, '$'));
                rq('.rollick-sku-picker .rollick-vehicle-msrp-usd .rollick-original-price').removeClass('rollick-invisible');
            } else {
                rq('.rollick-sku-picker .rollick-vehicle-msrp-usd .rollick-original-price').addClass('rollick-invisible');
            }
            if (rollick.vehicle.saleCAD) {
                rq('.rollick-sku-picker .rollick-vehicle-msrp-cad .vehicle-marquee__price__original-price__value').text(self.formatCurrency(originalCAD, '$'));
                rq('.rollick-sku-picker .rollick-vehicle-msrp-cad .rollick-original-price').removeClass('rollick-invisible');
            } else {
                rq('.rollick-sku-picker .rollick-vehicle-msrp-cad .rollick-original-price').addClass('rollick-invisible');
            }
            if (rollick.vehicle.deposit) {
                rq('.rollick-sku-picker .rollick-deposit').removeClass('rollick-invisible').html('<h6>' + self.formatCurrency(rollick.vehicle.deposit, '$') + ' PRE-ORDER DEPOSIT REQUIRED</h6>');
            } else {
                rq('.rollick-sku-picker .rollick-deposit').addClass('rollick-invisible');
            }

            var vehicleImage = rollick.vehicle.image;
            if (rollick.accessories && rollick.accessories.length) {
                rq('.rollick-sku-picker .rollick-accessories-detail').removeClass('rollick-hidden');
                rq('.rollick-sku-picker .rollick-vehicle-kit').addClass('rollick-hidden');
                var html = '<h6>Configured Accessories</h6>';
                var kitDetails = '';
                for (var i = 0; i < rollick.accessories.length; i++) {
                    var acc = rollick.accessories[i];
                    if (acc.isKit) {
                        kitDetails = acc.item + ' (+' + acc.cost + ')';
                    } else {
                        var info = '';
                        if (acc.cost) info += '(+' + acc.cost + '';
                        if (acc.text) {
                            if (info) info += ', ';
                            else info += '(';
                            info += acc.text;
                        }
                        if (info) info += ')';
                        html += '<div>' + acc.item + ' ' + info + '</div>';
                    }
                }
                if (rollick.vehicleImage) {
                    vehicleImage = rollick.vehicleImage;
                    rollick.vehicle.image = vehicleImage;
                }
                rq('.rollick-sku-picker .rollick-accessories-detail').html(html);
                if (rollick.vehicle.kit) {
                    var kitHtml = '<h6>Accessory Package</h6><div>' + rollick.vehicle.kit + '</div>';
                    rq('.rollick-sku-picker .rollick-kit-detail').html(kitHtml).removeClass('rollick-hidden');
                }
                if (kitDetails) {
                    var kitHtml = '<h6>Accessory Package</h6><div>' + kitDetails + '</div>';
                    rq('.rollick-sku-picker .rollick-kit-detail').html(kitHtml).removeClass('rollick-hidden');
                }
            }
            rq('.rollick-sku-picker .rollick-brand').text(rollick.vehicle.brand || 'Arctic Cat');
            rq('.rollick-sku-picker .rollick-multiple-skus .rollick-carousel .item.active').css('background-image', 'url(' + rollick.vehicle.image + ')');
        }
    },

    openSKUPicker(vehicles, options) {
        var self = this;
        if (vehicles && vehicles.length) {
            rollick.country = options.country || 'US';
            var form = 'textron/' + rollick.siteId.toLowerCase() + '/form-sku-picker-en-us.html';
            rq.get(rollick.widget + '/widgets/templates/' + form, function (data) {
                rq('body').css('overflow', 'hidden').append(data);
                rq('.rollick-sku-picker').show();
                window.setTimeout(function () {
                    rq('.rollick-sku-picker').addClass('tray--active');
                    rq('.rollick-sku-picker .rollick-form-fields').show();
                    self.initSKUPickerCarousel();
                    self.validateSKUPickerVehicleSelection();
                    rq('.rollick-sku-picker .carousel-show-skus').off('click').on('click', function () {
                        let vehicle = JSON.parse(JSON.stringify(rollick.vehicle));
                        rq('.rollick-close-button').click();
                        window.setTimeout(function () {
                            self.getQuote(vehicle, options);
                        }, 500);
                    });
                }, 10);
            });
        }
    },

    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);
        });
    },

    validateEventActivityForm() {
        var self = this;
        if (!rq(self.form_firstName).length) return;
        var fn = rq(self.form_firstName).val().trim();
        var ln = rq(self.form_lastName).val().trim();
        var e = rq(self.form_email).val().trim();
        var pc = rq(self.form_postalCode).val().trim();
        var ttp = rq('.rollick-form-ttp-select').val() || '';
        //var phone = (rq(self.form_phone).val() || "").trim();
        var initials = rq('.rollick-form-initials-value').val().trim();
        var country = rq('.rollick-form-country-select').val().trim();
        var optIn = rq('input[id="rollick-optin"]:checked').val() || '';
        var interest = rq('input[name="interest"]:checked').val() || '';

        var isValidEmail = (/^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/).test(e.toLowerCase());
        //var isValidPhone = true; //(phone.length == 14);
        var isValidPostalCode = false;

        if (country == 'US') {
            isValidPostalCode = (pc.length == 5);
        } else if (country == 'CA') {
            isValidPostalCode = (pc.length == 7);
        }

        self.checkRequired(fn, self.form_firstName);
        self.checkRequired(ln, self.form_lastName);
        self.checkRequired(e, self.form_email);
        self.checkRequired(pc, self.form_postalCode);
        // self.checkRequired(phone, self.form_phone);
        self.checkRequired(initials, '.rollick-form-initials-value');
        self.checkRequired(ttp, self.form_ttp_select);

        if (fn) {
            if (fn.length > 1) {
                rq(self.form_firstName).val(fn.substring(0, 1).toUpperCase() + fn.substring(1));
            } else {
                rq(self.form_firstName).val(fn.toUpperCase());
            }
        }
        if (ln) {
            if (ln.length > 1) {
                rq(self.form_lastName).val(ln.substring(0, 1).toUpperCase() + ln.substring(1));
            } else {
                rq(self.form_lastName).val(ln.toUpperCase());
            }
        }
        if (initials) {
            rq('.rollick-form-initials-value').val(initials.toUpperCase());
        }
        if (!pc) {
            if (!fn || !ln || !e || !pc || !initials || !isValidEmail || !isValidPostalCode || !interest || !optIn || !ttp) {
                rq('.rollick-form-submit').addClass('disabled');
            } else {
                rq('.rollick-form-submit').removeClass('disabled');
            }
        }
        if (pc) {
            if (!isValidPostalCode) {
                rq('.rollick-form-submit').addClass('disabled');
                rq('.rollick-invalid-postal').removeClass('rollick-hidden');
            } else {
                self.validateZip(pc, function (isValidZip) {
                    isValidPostalCode = isValidZip;
                    if (!isValidZip) {
                        rq('.rollick-invalid-postal').removeClass('rollick-hidden');
                    } else {
                        rq('.rollick-invalid-postal').addClass('rollick-hidden');
                    }
                    if (!fn || !ln || !e || !pc || !initials || !isValidEmail || !isValidPostalCode || !interest || !optIn || !ttp) {
                        rq('.rollick-form-submit').addClass('disabled');
                    } else {
                        rq('.rollick-form-submit').removeClass('disabled');
                    }
                });
            }
        }
        if (e) {
            if (!isValidEmail) {
                rq('.rollick-invalid-email').removeClass('rollick-hidden');
            } else {
                rq('.rollick-invalid-email').addClass('rollick-hidden');
            }
        }
    },

    getEventActivityFormData() {

        var self = this;
        var data = {};

        if (typeof Aimbase !== 'undefined') {
            if (Aimbase && Aimbase.Analytics) {
                var fn = rq(self.form_firstName).val();
                var ln = rq(self.form_lastName).val();
                var e = rq(self.form_email).val();
                // var ph = rq(self.form_phone).val();
                var pc = rq(self.form_postalCode).val();
                var initials = rq('.rollick-form-initials-value').val();
                var country = rq('.rollick-form-country-select').val();
                var ttp = rq('.rollick-form-ttp-select').val() || '';

                var submittedFrom = (window && window.location && (window.location.protocol + '//' + window.location.host + window.location.pathname));
                self.userId = Aimbase.Analytics.GetUserUid();
                self.sessionId = Aimbase.Analytics.GetSessionUid();
                self.source = Aimbase.Analytics.GetFieldValue('source') || 'Organic';
                self.campaign = Aimbase.Analytics.GetFieldValue('campaign') || '';
                data.uid = self.userId;
                data.sid = self.sessionId;
                data.source = self.source;
                data.campaign = self.campaign;
                data.type = 'Event Activity';
                data.firstName = fn;
                data.lastName = ln;
                data.email = e;
                data.timeToPurchase = ttp;
                //data.phone = ph;
                data.postalCode = pc;
                data.initials = initials;
                data.countryCode = country;
                data.submittedFrom = submittedFrom;
                data.productCode = 'Uncategorized';
                data.category = 'Arctic Cat Website';
                data.brand = 'ARC';
                data.optIn = false;
                data.noReroute = true;
                let listcodes = [];
                let interest = rq('input[name="interest"]:checked');
                let interestSelected = [];
                for (var i = 0; i < interest.length; i++) {
                    if (interest[i].checked) {
                        interestSelected.push(interest[i].value);
                    }
                }
                data.areaOfInterest = interestSelected.join(',');
                for (var i = 0; i < interestSelected.length; i++) {
                    if (interestSelected[i] == 'ATVs') {
                        listcodes.push('ACATV');
                    }
                    if (interestSelected[i] == 'Side-by-Sides') {
                        listcodes.push('ACSXS');
                    }
                    if (interestSelected[i] == 'Snowmobiles') {
                        listcodes.push('ACSnow');
                    }
                }
                if (rq('#rollick-optin').is(':checked')) {
                    data.optIn = true;
                    data.ip = self.ip;
                    data.optInDate = (new Date()).valueOf();
                    data.optInSource = 'Textron';
                    listcodes.push(rq('#listCode').val());
                }
                if (rq('#rollick-learn-more').is(':checked')) {
                    listcodes.push(rq('#rollick-learn-more').attr('code'));
                }
                if (listcodes.length) data.optInListCode = listcodes.join(',');
                data.salesDriver = 'No';
                data.referrer = sessionStorage['rollick-referrer-value'];
                if (rollick.dealer && rollick.dealer.conciergeId) {
                    data.partnerChoice = 'Custom';
                    data.partnerId = rollick.dealer.conciergeId;
                    data.partnerName = rollick.dealer.conciergeName || 'Textron Concierge Dealership';
                }
            }
        }
        return data;
    },

    submitEventActivityForm() {
        if (rollick.isFormSubmitted) {
            return true;
        }

        rollick.sanitize(rq(rollick.form_firstName));
        rollick.sanitize(rq(rollick.form_lastName));
        rollick.sanitize(rq(rollick.form_email));
        rollick.sanitize(rq(rollick.form_postalCode));
        //rollick.sanitize(rq(rollick.form_phone));
        rollick.validateEventActivityForm();

        var requiredFields = rq('input.rollick-form-field, select.rollick-form-field, select.rollick-form-ttp-select');

        requiredFields.each(function (i, e) {
            var el = rq(e);
            if (el[0].type == 'checkbox') {
                if (!el[0].checked) {
                    el.next('span').addClass('rollick-required');
                }
                else {
                    el.next('span').removeClass('rollick-required');
                }
            }
            else if (el.val() == '' || el.val().length == 0) {
                el.addClass('rollick-required');
                el.focus();
                return false;
            }
            else {
                el.removeClass('rollick-required');
            }
        });

        if (rq('.rollick-form-submit').hasClass('disabled') && !rollick.abandoned) {
            return true;
        }

        // submit form
        rq('.rollick-form-submit').addClass('disabled');
        var data = rollick.getEventActivityFormData();
        if (data) rollick.isFormSubmitted = true;
        if (Object.keys(data).length) {
            rq.ajax({
                url: rollick.validation + '/aimproxy',
                dataType: 'json',
                contentType: 'application/json;charset=utf-8',
                type: 'POST',
                timeout: 15000,
                data: JSON.stringify(data),
                success(resp) {
                    if (rollick.redirectUrl) {
                        location.href = rollick.redirectUrl;
                    } else {
                        rq('#rollick').html('<div class="container rollick-form-fp rollick-form-fp-fields rte-body-component"><div class="mod-text" style="margin-right: auto; margin-left: auto; max-width: 400px;"><h4>Thank you for your submission</h4><br><br><div class="rollick-center"><a class="button green arrow btn btn-skew btn-primary" onclick="return rollick.reloadForm();"><span>Reset Form</span></a></div></div></div>');
                        window.scrollTo(0, 0);
                    }
                },
                error(resp) {
                    rollick.isFormSubmitted = false;
                    alert('We have encountered an unexpected error. Please try again later.');
                    rollick.validateEventActivityForm();
                    return false;
                }
            });
        } else {
            rollick.isFormSubmitted = false;
            alert('We have encountered an unexpected error. Please try again later.');
            rollick.validateEventActivityForm();
            return false;
        }
    },

    validateEventSignUpForm() {
        var self = this;
        if (!rq(self.form_firstName).length) return;
        var fn = rq(self.form_firstName).val().trim();
        var ln = rq(self.form_lastName).val().trim();
        var e = rq(self.form_email).val().trim();
        var pc = rq(self.form_postalCode).val().trim();
        var phone = rq(self.form_phone).val().trim();
        var country = rq('.rollick-form-country-select').val().trim();

        var isValidEmail = (/^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/).test(e.toLowerCase());
        var isValidPhone = (phone.length == 14);
        var isValidPostalCode = false;

        if (country == 'US') {
            isValidPostalCode = (pc.length == 5);
        } else if (country == 'CA') {
            isValidPostalCode = (pc.length == 7);
        }

        self.checkRequired(fn, self.form_firstName);
        self.checkRequired(ln, self.form_lastName);
        self.checkRequired(e, self.form_email);
        self.checkRequired(pc, self.form_postalCode);
        self.checkRequired(phone, self.form_phone);

        if (fn) {
            if (fn.length > 1) {
                rq(self.form_firstName).val(fn.substring(0, 1).toUpperCase() + fn.substring(1));
            } else {
                rq(self.form_firstName).val(fn.toUpperCase());
            }
        }
        if (ln) {
            if (ln.length > 1) {
                rq(self.form_lastName).val(ln.substring(0, 1).toUpperCase() + ln.substring(1));
            } else {
                rq(self.form_lastName).val(ln.toUpperCase());
            }
        }
        if (!pc) {
            if (!fn || !ln || !e || !pc || !phone || !isValidEmail || !isValidPostalCode) {
                rq('.rollick-form-submit').addClass('disabled');
            } else {
                rq('.rollick-form-submit').removeClass('disabled');
            }
        }
        if (pc) {
            if (!isValidPostalCode) {
                rq('.rollick-form-submit').addClass('disabled');
                rq('.rollick-invalid-postal').removeClass('rollick-hidden');
            } else {
                self.validateZip(pc, function (isValidZip) {
                    isValidPostalCode = isValidZip;
                    if (!isValidZip) {
                        rq('.rollick-invalid-postal').removeClass('rollick-hidden');
                    } else {
                        rq('.rollick-invalid-postal').addClass('rollick-hidden');
                    }
                    if (!fn || !ln || !e || !pc || !phone || !isValidEmail || !isValidPostalCode) {
                        rq('.rollick-form-submit').addClass('disabled');
                    } else {
                        rq('.rollick-form-submit').removeClass('disabled');
                    }
                });
            }
        }
        if (e) {
            if (!isValidEmail) {
                rq('.rollick-invalid-email').removeClass('rollick-hidden');
            } else {
                rq('.rollick-invalid-email').addClass('rollick-hidden');
            }
        }
        if (phone) {
            if (!isValidPhone) {
                rq('.rollick-invalid-phone').removeClass('rollick-hidden');
            } else {
                rq('.rollick-invalid-phone').addClass('rollick-hidden');
            }
        }
    },

    getEventSignUpFormData() {

        var self = this;
        var data = {};

        if (typeof Aimbase !== 'undefined') {
            if (Aimbase && Aimbase.Analytics) {
                var fn = rq(self.form_firstName).val();
                var ln = rq(self.form_lastName).val();
                var e = rq(self.form_email).val();
                var ph = rq(self.form_phone).val();
                var pc = rq(self.form_postalCode).val();
                var country = rq('.rollick-form-country-select').val();
                var submittedFrom = (window && window.location && (window.location.protocol + '//' + window.location.host + window.location.pathname));
                self.userId = Aimbase.Analytics.GetUserUid();
                self.sessionId = Aimbase.Analytics.GetSessionUid();
                self.source = Aimbase.Analytics.GetFieldValue('source') || 'Organic';
                self.campaign = Aimbase.Analytics.GetFieldValue('campaign') || '';
                data.uid = self.userId;
                data.sid = self.sessionId;
                data.source = self.source;
                data.campaign = self.campaign;
                data.type = 'Event Sign Up';
                data.firstName = fn;
                data.lastName = ln;
                data.email = e;
                data.phone = ph;
                data.postalCode = pc;
                data.countryCode = country;
                data.submittedFrom = submittedFrom;
                data.productCode = 'Uncategorized';
                data.category = 'Arctic Cat Website';
                data.brand = 'ARC';
                data.optIn = false;
                data.noReroute = true;
                let listcodes = [];
                if (rq('#rollick-optin').is(':checked')) {
                    data.optIn = true;
                    data.ip = self.ip;
                    data.optInDate = (new Date()).valueOf();
                    data.optInSource = 'Textron';
                    listcodes.push('NewsPromo');
                }
                listcodes.push(rq('#listCode').val());
                if (listcodes.length) data.optInListCode = listcodes.join(',');
                data.salesDriver = 'No';
                data.referrer = sessionStorage['rollick-referrer-value'];
                if (rollick.dealer && rollick.dealer.conciergeId) {
                    data.partnerChoice = 'Custom';
                    data.partnerId = rollick.dealer.conciergeId;
                    data.partnerName = rollick.dealer.conciergeName || 'Textron Concierge Dealership';
                }
            }
        }
        return data;
    },

    submitEventSignUpForm() {
        if (rollick.isFormSubmitted) {
            return true;
        }

        rollick.sanitize(rq(rollick.form_firstName));
        rollick.sanitize(rq(rollick.form_lastName));
        rollick.sanitize(rq(rollick.form_email));
        rollick.sanitize(rq(rollick.form_postalCode));
        rollick.sanitize(rq(rollick.form_phone));
        rollick.validateEventSignUpForm();

        var requiredFields = rq('input.rollick-form-field, select.rollick-form-field');

        requiredFields.each(function (i, e) {
            var el = rq(e);
            if (el[0].type == 'checkbox') {
                if (!el[0].checked) {
                    el.next('span').addClass('rollick-required');
                }
                else {
                    el.next('span').removeClass('rollick-required');
                }
            }
            else if (el.val() == '' || el.val().length == 0) {
                el.addClass('rollick-required');
                el.focus();
                return false;
            }
            else {
                el.removeClass('rollick-required');
            }
        });

        if (rq('.rollick-form-submit').hasClass('disabled') && !rollick.abandoned) {
            return true;
        }

        // submit form
        rq('.rollick-form-submit').addClass('disabled');
        var data = rollick.getEventSignUpFormData();
        if (data) rollick.isFormSubmitted = true;
        if (Object.keys(data).length) {
            rq.ajax({
                url: rollick.validation + '/aimproxy',
                dataType: 'json',
                contentType: 'application/json;charset=utf-8',
                type: 'POST',
                timeout: 15000,
                data: JSON.stringify(data),
                success(resp) {
                    if (rollick.redirectUrl) {
                        location.href = rollick.redirectUrl;
                    } else {
                        rq('#rollick').html('<div class="container rollick-form-fp rollick-form-fp-fields rte-body-component"><div class="mod-text" style="margin-right: auto; margin-left: auto; max-width: 400px;"><h4>Thank you for your submission</h4><br><br><div class="rollick-center"><a class="button green arrow btn btn-skew btn-primary" onclick="return rollick.reloadForm();"><span>Reset Form</span></a></div></div></div>');
                        window.scrollTo(0, 0);
                    }
                },
                error(resp) {
                    rollick.isFormSubmitted = false;
                    alert('We have encountered an unexpected error. Please try again later.');
                    rollick.validateEventSignUpForm();
                    return false;
                }
            });
        } else {
            rollick.isFormSubmitted = false;
            alert('We have encountered an unexpected error. Please try again later.');
            rollick.validateEventSignUpForm();
            return false;
        }
    },

    validateAskAnEngineerForm() {
        var self = this;
        if (!rq(self.form_firstName).length) return;
        var fn = rq(self.form_firstName).val().trim();
        var ln = rq(self.form_lastName).val().trim();
        var e = rq(self.form_email).val().trim();
        var pc = rq(self.form_postalCode).val().trim();
        var phone = rq(self.form_phone).val().trim();
        var country = rq('.rollick-form-country-select').val().trim();
        var question = rq('.rollick-form-question-value').val().trim();
        var isValidEmail = (/^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/).test(e.toLowerCase());
        var isValidPhone = (phone.length == 14);
        var isValidPostalCode = false;

        if (country == 'US') {
            isValidPostalCode = (pc.length == 5);
        } else if (country == 'CA') {
            isValidPostalCode = (pc.length == 7);
        }

        self.checkRequired(fn, self.form_firstName);
        self.checkRequired(ln, self.form_lastName);
        self.checkRequired(e, self.form_email);
        self.checkRequired(pc, self.form_postalCode);
        self.checkRequired(phone, self.form_phone);
        self.checkRequired(question, '.rollick-form-question-value');

        if (fn) {
            if (fn.length > 1) {
                rq(self.form_firstName).val(fn.substring(0, 1).toUpperCase() + fn.substring(1));
            } else {
                rq(self.form_firstName).val(fn.toUpperCase());
            }
        }
        if (ln) {
            if (ln.length > 1) {
                rq(self.form_lastName).val(ln.substring(0, 1).toUpperCase() + ln.substring(1));
            } else {
                rq(self.form_lastName).val(ln.toUpperCase());
            }
        }

        if (!pc) {
            if (!fn || !ln || !e || !pc || !phone || !isValidEmail || !isValidPostalCode || !question || !isValidPhone) {
                rq('.rollick-form-submit').addClass('disabled');
                rq('.rollick-form-payment').addClass('disabled');
            } else {
                rq('.rollick-form-submit').removeClass('disabled');
                rq('.rollick-form-payment').removeClass('disabled');
            }
        }

        if (pc) {
            if (!isValidPostalCode) {
                rq('.rollick-form-submit').addClass('disabled');
                rq('.rollick-invalid-postal').removeClass('rollick-hidden');
            } else {
                self.validateZip(pc, function (isValidZip) {
                    isValidPostalCode = isValidZip;
                    if (!isValidZip) {
                        rq('.rollick-invalid-postal').removeClass('rollick-hidden');
                    } else {
                        rq('.rollick-invalid-postal').addClass('rollick-hidden');
                    }
                    if (!fn || !ln || !e || !pc || !phone || !isValidEmail || !isValidPostalCode || !question || !isValidPhone) {
                        rq('.rollick-form-submit').addClass('disabled');
                    } else {
                        rq('.rollick-form-submit').removeClass('disabled');
                    }
                });
            }
        }
        if (e) {
            if (!isValidEmail) {
                rq('.rollick-invalid-email').removeClass('rollick-hidden');
            } else {
                rq('.rollick-invalid-email').addClass('rollick-hidden');
            }
        }
        if (phone) {
            if (!isValidPhone) {
                rq('.rollick-invalid-phone').removeClass('rollick-hidden');
            } else {
                rq('.rollick-invalid-phone').addClass('rollick-hidden');
            }
        }
    },

    getAskAnEngineerFormData() {
        var self = this;
        var data = {};
        if (typeof Aimbase !== 'undefined') {
            if (Aimbase && Aimbase.Analytics) {
                var fn = rq(self.form_firstName).val();
                var ln = rq(self.form_lastName).val();
                var e = rq(self.form_email).val();
                var ph = rq(self.form_phone).val();
                var pc = rq(self.form_postalCode).val();
                var country = rq('.rollick-form-country-select').val();
                var submittedFrom = (window && window.location && (window.location.protocol + '//' + window.location.host + window.location.pathname));
                var question = rq('.rollick-form-question-value').val().trim();
                self.userId = Aimbase.Analytics.GetUserUid();
                self.sessionId = Aimbase.Analytics.GetSessionUid();
                self.source = Aimbase.Analytics.GetFieldValue('source') || 'Organic';
                self.campaign = Aimbase.Analytics.GetFieldValue('campaign') || '';
                data.uid = self.userId;
                data.sid = self.sessionId;
                data.source = self.source;
                data.campaign = self.campaign;
                data.type = 'Ask An Engineer';
                data.firstName = fn;
                data.lastName = ln;
                data.email = e;
                data.phone = ph;
                data.postalCode = pc;
                data.countryCode = country;
                data.submittedFrom = submittedFrom;
                data.productCode = 'Uncategorized';
                data.category = 'Arctic Cat Website';
                data.brand = 'ARC';
                data.optIn = false;
                data.noReroute = true;
                data.question = question;
                let listcodes = [];
                if (rq('#rollick-optin').is(':checked')) {
                    data.optIn = true;
                    data.ip = self.ip;
                    data.optInDate = (new Date()).valueOf();
                    data.optInSource = 'Textron';
                    listcodes.push('NewsPromo');
                }
                if (listcodes.length) data.optInListCode = listcodes.join(',');
                data.salesDriver = 'No';
                data.referrer = sessionStorage['rollick-referrer-value'];
                if (rollick.dealer && rollick.dealer.conciergeId) {
                    data.partnerChoice = 'Custom';
                    data.partnerId = rollick.dealer.conciergeId;
                    data.partnerName = rollick.dealer.conciergeName || 'Textron Concierge Dealership';
                }
            }
        }
        return data;
    },

    submitAskAnEngineerForm() {
        if (rollick.isFormSubmitted) {
            return true;
        }

        rollick.sanitize(rq(rollick.form_firstName));
        rollick.sanitize(rq(rollick.form_lastName));
        rollick.sanitize(rq(rollick.form_email));
        rollick.sanitize(rq(rollick.form_postalCode));
        rollick.sanitize(rq(rollick.form_phone));
        rollick.validateAskAnEngineerForm();

        var requiredFields = rq('input.rollick-form-field, select.rollick-form-field');

        requiredFields.each(function (i, e) {
            var el = rq(e);
            if (el[0].type == 'checkbox') {
                if (!el[0].checked) {
                    el.next('span').addClass('rollick-required');
                }
                else {
                    el.next('span').removeClass('rollick-required');
                }
            }
            else if (el.val() == '' || el.val().length == 0) {
                el.addClass('rollick-required');
                el.focus();
                return false;
            }
            else {
                el.removeClass('rollick-required');
            }
        });

        if (rq('.rollick-form-submit').hasClass('disabled') && !rollick.abandoned) {
            return true;
        }

        // submit form
        rq('.rollick-form-submit').addClass('disabled');
        var data = rollick.getAskAnEngineerFormData();
        if (data) rollick.isFormSubmitted = true;
        if (Object.keys(data).length) {
            rq.ajax({
                url: rollick.validation + '/aimproxy',
                dataType: 'json',
                contentType: 'application/json;charset=utf-8',
                type: 'POST',
                timeout: 15000,
                data: JSON.stringify(data),
                success(resp) {
                    if (rollick.redirectUrl) {
                        location.href = rollick.redirectUrl;
                    } else {
                        rq('.rollick-form-fields').addClass('rollick-hidden');
                        rq('.rollick-form-confirmation').removeClass('rollick-hidden');
                    }
                },
                error(resp) {
                    rollick.isFormSubmitted = false;
                    alert('We have encountered an unexpected error. Please try again later.');
                    rollick.validateAskAnEngineerForm();
                    return false;
                }
            });
        } else {
            rollick.isFormSubmitted = false;
            alert('We have encountered an unexpected error. Please try again later.');
            rollick.validateAskAnEngineerForm();
            return false;
        }
    },

    removeImage(id) {
        rq(id).val('');
        rollick.validateCastingCallForm();
    },

    validateCastingCallForm() {
        let self = this;
        if (!rq(self.form_firstName).length) return;
        let fn = rq(self.form_firstName).val().trim();
        let ln = rq(self.form_lastName).val().trim();
        let e = rq(self.form_email).val().trim();
        let pc = rq(self.form_postalCode).val().trim();
        let phone = rq(self.form_phone).val().trim();
        let country = rq('.rollick-form-country-select').val().trim();
        let optIn = rq('input[id="rollick-optin"]:checked').val() || '';
        let comment = rq('.rollick-form-comment-value').val().trim();
        let experience = rq('#rollick-experience :selected').val().trim();
        let image1 = rq('#casting-call-image1').val();
        let image2 = rq('#casting-call-image2').val();
        let ageConfirmation = rq('input[id="rollick-age-confirmation"]:checked').val() || '';

        let isValidEmail = (/^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/).test(e.toLowerCase());
        let isValidPhone = (phone.length == 14);
        let isValidPostalCode = false;
        let isValidImage1 = false;
        let isValidImage2 = false;

        if (country == 'US') {
            isValidPostalCode = (pc.length == 5);
        } else if (country == 'CA') {
            isValidPostalCode = (pc.length == 7);
        }

        self.checkRequired(fn, self.form_firstName);
        self.checkRequired(ln, self.form_lastName);
        self.checkRequired(e, self.form_email);
        self.checkRequired(pc, self.form_postalCode);
        self.checkRequired(phone, self.form_phone);
        self.checkRequired(comment, '.rollick-form-comment-value');
        self.checkRequired(experience, '#rollick-experience');
        self.checkRequired(image1, '#casting-call-image1');
        self.checkRequired(image2, '#casting-call-image2');

        if (rq('#casting-call-image1').val()) {
            rq('.rollick-remove-image1').removeClass('rollick-hidden');
            if (document.getElementById('casting-call-image1').files.length) {
                if (document.getElementById('casting-call-image1').files[0].size <= 2097152) {
                    isValidImage1 = true;
                    rq('.rollick-error-image1').addClass('rollick-hidden');
                } else {
                    rq('.rollick-error-image1').removeClass('rollick-hidden');
                }
            }
        } else {
            rq('.rollick-remove-image1').addClass('rollick-hidden');
            rq('.rollick-error-image1').addClass('rollick-hidden');
        }

        if (rq('#casting-call-image2').val()) {
            rq('.rollick-remove-image2').removeClass('rollick-hidden');
            if (document.getElementById('casting-call-image2').files.length) {
                if (document.getElementById('casting-call-image2').files[0].size <= 2097152) {
                    isValidImage2 = true;
                    rq('.rollick-error-image2').addClass('rollick-hidden');
                } else {
                    rq('.rollick-error-image2').removeClass('rollick-hidden');
                }
            }
        } else {
            rq('.rollick-remove-image2').addClass('rollick-hidden');
            rq('.rollick-error-image2').addClass('rollick-hidden');
        }

        if (fn) {
            if (fn.length > 1) {
                rq(self.form_firstName).val(fn.substring(0, 1).toUpperCase() + fn.substring(1));
            } else {
                rq(self.form_firstName).val(fn.toUpperCase());
            }
        }
        if (ln) {
            if (ln.length > 1) {
                rq(self.form_lastName).val(ln.substring(0, 1).toUpperCase() + ln.substring(1));
            } else {
                rq(self.form_lastName).val(ln.toUpperCase());
            }
        }
        if (!pc) {
            if (!fn || !ln || !e || !pc || !phone || !comment || !isValidImage1 || !isValidImage2 || !isValidEmail || !isValidPostalCode || !optIn || !ageConfirmation) {
                rq('.rollick-form-submit').addClass('disabled');
            } else {
                rq('.rollick-form-submit').removeClass('disabled');
            }
        }
        if (pc) {
            if (!isValidPostalCode) {
                rq('.rollick-form-submit').addClass('disabled');
                rq('.rollick-invalid-postal').removeClass('rollick-hidden');
            } else {
                self.validateZip(pc, function (isValidZip) {
                    isValidPostalCode = isValidZip;
                    if (!isValidZip) {
                        rq('.rollick-invalid-postal').removeClass('rollick-hidden');
                    } else {
                        rq('.rollick-invalid-postal').addClass('rollick-hidden');
                    }
                    if (!fn || !ln || !e || !pc || !phone || !comment || !isValidImage1 || !isValidImage2 || !isValidEmail || !isValidPostalCode || !optIn || !ageConfirmation) {
                        rq('.rollick-form-submit').addClass('disabled');
                    } else {
                        rq('.rollick-form-submit').removeClass('disabled');
                    }
                });
            }
        }
        if (e) {
            if (!isValidEmail) {
                rq('.rollick-invalid-email').removeClass('rollick-hidden');
            } else {
                rq('.rollick-invalid-email').addClass('rollick-hidden');
            }
        }
        if (phone) {
            if (!isValidPhone) {
                rq('.rollick-invalid-phone').removeClass('rollick-hidden');
            } else {
                rq('.rollick-invalid-phone').addClass('rollick-hidden');
            }
        }

    },

    getCastingCallFormData() {
        let self = this;
        let data = {};
        if (typeof Aimbase !== 'undefined') {
            if (Aimbase && Aimbase.Analytics) {
                let image1 = rq('#casting-call-image1-URL').val();
                let image2 = rq('#casting-call-image2-URL').val();
                let fn = rq(self.form_firstName).val();
                let ln = rq(self.form_lastName).val();
                let e = rq(self.form_email).val();
                let ph = rq(self.form_phone).val();
                let pc = rq(self.form_postalCode).val();
                let country = rq('.rollick-form-country-select').val();
                let submittedFrom = (window && window.location && (window.location.protocol + '//' + window.location.host + window.location.pathname));
                let comment = rq('.rollick-form-comment-value').val().trim();
                let experience = rq('#rollick-experience :selected').val().trim();
                self.userId = Aimbase.Analytics.GetUserUid();
                self.sessionId = Aimbase.Analytics.GetSessionUid();
                self.source = Aimbase.Analytics.GetFieldValue('source') || 'Organic';
                self.campaign = Aimbase.Analytics.GetFieldValue('campaign') || '';
                data.uid = self.userId;
                data.sid = self.sessionId;
                data.source = self.source;
                data.campaign = self.campaign;
                data.type = 'Casting Call';
                data.firstName = fn;
                data.lastName = ln;
                data.email = e;
                data.phone = ph;
                data.postalCode = pc;
                data.countryCode = country;
                data.submittedFrom = submittedFrom;
                data.productCode = 'Uncategorized';
                data.category = 'Arctic Cat Website';
                data.brand = 'ARC';
                data.optIn = false;
                data.noReroute = true;
                data.comment = comment;
                data.image1 = image1;
                data.image2 = image2;
                data.experience = experience;
                let listcodes = [];
                if (rq('#rollick-optin').is(':checked')) {
                    data.optIn = true;
                    data.ip = self.ip;
                    data.optInDate = (new Date()).valueOf();
                    data.optInSource = 'Textron';
                    listcodes.push('NewsPromo');
                }
                if (listcodes.length) data.optInListCode = listcodes.join(',');
                data.salesDriver = 'No';
                data.referrer = sessionStorage['rollick-referrer-value'];
                if (rollick.dealer && rollick.dealer.conciergeId) {
                    data.partnerChoice = 'Custom';
                    data.partnerId = rollick.dealer.conciergeId;
                    data.partnerName = rollick.dealer.conciergeName || 'Textron Concierge Dealership';
                }
            }
        }
        return data;
    },

    submitCastingCallForm() {
        if (rollick.isFormSubmitted) {
            return true;
        }

        rollick.sanitize(rq(rollick.form_firstName));
        rollick.sanitize(rq(rollick.form_lastName));
        rollick.sanitize(rq(rollick.form_email));
        rollick.sanitize(rq(rollick.form_postalCode));
        rollick.sanitize(rq(rollick.form_phone));
        rollick.validateCastingCallForm();

        var requiredFields = rq('input.rollick-form-field, select.rollick-form-field');

        requiredFields.each(function (i, e) {
            var el = rq(e);
            if (el[0].type == 'checkbox') {
                if (!el[0].checked) {
                    el.next('span').addClass('rollick-required');
                }
                else {
                    el.next('span').removeClass('rollick-required');
                }
            }
            else if (el.val() == '' || el.val().length == 0) {
                el.addClass('rollick-required');
                el.focus();
                return false;
            }
            else {
                el.removeClass('rollick-required');
            }
        });

        if (rq('.rollick-form-submit').hasClass('disabled') && !rollick.abandoned) {
            return true;
        }

        // submit form
        rq('.rollick-form-submit').addClass('disabled');
        rollick.uploadCastingCallImages();
        var data = rollick.getCastingCallFormData();
        if (data) rollick.isFormSubmitted = true;
        if (Object.keys(data).length) {
            rq.ajax({
                url: rollick.validation + '/aimproxy',
                dataType: 'json',
                contentType: 'application/json;charset=utf-8',
                type: 'POST',
                timeout: 15000,
                data: JSON.stringify(data),
                success(resp) {
                    if (rollick.redirectUrl) {
                        location.href = rollick.redirectUrl;
                    } else {
                        rq('.rollick-form-fields').addClass('rollick-hidden');
                        rq('.rollick-form-confirmation').removeClass('rollick-hidden');
                    }
                },
                error(resp) {
                    rollick.isFormSubmitted = false;
                    alert('We have encountered an unexpected error. Please try again later.');
                    rollick.validateCastingCallForm();
                    return false;
                }
            });
        } else {
            rollick.isFormSubmitted = false;
            alert('We have encountered an unexpected error. Please try again later.');
            rollick.validateCastingCallForm();
            return false;
        }
    },

    uploadCastingCallImages() {
        const i = document.getElementById('casting-call-image1');
        const w = document.getElementById('casting-call-image2');
        const uploaders = [i, w];
        const accountName = "aimbaseimage";
        const sasString = "sp=racwdli&st=2021-11-01T05:00:00Z&se=2026-01-01T06:00:00Z&spr=https&sv=2020-08-04&sr=c&sig=mIcsKR%2B%2BBxX2Kx%2FVRIv9uDRpluB1MVPda9fmpr5qD2I%3D";
        const containerName = "textron/CastingCall";
        const containerURL = new azblob.ContainerURL(`https://${accountName}.blob.core.windows.net/${containerName}?${sasString}`, azblob.StorageURL.newPipeline(new azblob.AnonymousCredential));
        const aimbaseUuid = Aimbase.Analytics.GetUserUid();
        const listFiles = [];
        for (const upload of uploaders) {
            const uploadFiles = async () => {
                try {
                    console.log("Uploading files...");
                    const promises = [];
                    for (const file of upload.files) {
                        let filename = 'on-the-trail';
                        if (upload.id == 'casting-call-image2') filename = 'off-the-trail';
                        filename += '_' + rollick.generateUUID();
                        const blockBlobURL = azblob.BlockBlobURL.fromContainerURL(containerURL, aimbaseUuid + '_' + filename);
                        if (upload.id == 'casting-call-image1' && blockBlobURL) {
                            document.getElementById('casting-call-image1-URL').value = blockBlobURL.url;
                        }
                        if (upload.id == 'casting-call-image2' && blockBlobURL) {
                            document.getElementById('casting-call-image2-URL').value = blockBlobURL.url;
                        }
                        promises.push(
                            azblob.uploadBrowserDataToBlockBlob(
                                azblob.Aborter.none,
                                file,
                                blockBlobURL,
                                { blobHTTPHeaders: { blobContentType: file.type } }
                            )
                        );
                    }
                    await Promise.all(promises);
                }
                catch (error) {
                    console.error(error);
                }
            };
            uploadFiles();
        }
    },

    async uploadVehicleImage(image64) {
        if (image64.indexOf(';base64,') == -1) return null;
        const key = image64.slice(20, 30) + image64.slice(-10);
        let storedImageURL = sessionStorage[key];
        if (storedImageURL) {
            return storedImageURL;
        }
        const accountName = "aimbaseimage";
        const sasString = "sp=racwdli&st=2021-11-01T05:00:00Z&se=2026-01-01T06:00:00Z&spr=https&sv=2020-08-04&sr=c&sig=mIcsKR%2B%2BBxX2Kx%2FVRIv9uDRpluB1MVPda9fmpr5qD2I%3D";
        const containerName = "textron/Vehicles";
        const containerURL = new azblob.ContainerURL(`https://${accountName}.blob.core.windows.net/${containerName}?${sasString}`, azblob.StorageURL.newPipeline(new azblob.AnonymousCredential));
        let imageUrl = '';
        const uploadFiles = async () => {
            try {
                let imageType = image64.split(';')[0].replace('data:', '');
                const byteCharacters = atob(image64.split(';base64,')[1]);
                const byteNumbers = new Array(byteCharacters.length);
                for (let i = 0; i < byteCharacters.length; i++) {
                    byteNumbers[i] = byteCharacters.charCodeAt(i);
                }
                const byteArray = new Uint8Array(byteNumbers);
                const imageBlob = new Blob([byteArray], { type: imageType });
                const promises = [];
                let filename = 'vehicle-image';
                filename += '_' + rollick.generateUUID();
                const blockBlobURL = azblob.BlockBlobURL.fromContainerURL(containerURL, filename);
                if (blockBlobURL) {
                    imageUrl = blockBlobURL.url;
                }
                promises.push(
                    azblob.uploadBrowserDataToBlockBlob(
                        azblob.Aborter.none,
                        imageBlob,
                        blockBlobURL,
                        { blobHTTPHeaders: { blobContentType: imageType } }
                    )
                );
                await Promise.all(promises);
            }
            catch (error) {
                console.error(error);
                return '';
            }
        };
        await uploadFiles();
        sessionStorage[key] = imageUrl;
        return imageUrl;
    },

    reloadForm() {
        let self = this;
        if (self.lastForm) {
            self.getForm(self.lastForm.vehicle, self.lastForm.options);
        }
        return false;
    },
    openTrayArc2(self, module, options, vehicleParametersJsonString) {
        self.openForm({
            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,
        }, JSON.parse(vehicleParametersJsonString));
    },
}



function paymentHandler(response) {
    if (rollick.preorder && typeof rollick.preorder.paymentHandler == 'function') rollick.preorder.paymentHandler(response);
}
rollick.DEFAULT_DEPOSIT_AMOUNT = 500;

rollick.preorder = {
    headline: 'PLACE A PRE-ORDER',
    caption: 'Fill out the form below to place your Model Year 2022 Pre-Order <b>with your local dealer</b> and submit your<b> $$' + rollick.DEFAULT_DEPOSIT_AMOUNT + ' deposit</b>.',
    enablePreselect: {"ARC2":true,"ARC":true,"TOR":true,"EZG":true},
    brandCode: 'ARC2',
    // preorder_button: '<button type="button" class="AcceptUI btn blue" onclick="rollick.preorder.paymentForm();">Pre-Order</button>',
    paymentInfo: null,
    paymentTry: 0,
    paymentActive: true,
    paymentScript: 'https://www.chasepaymentechhostedpay.com/hpf/js/hpfParent.min.js',
    paymentEndpoint: 'https://www.chasepaymentechhostedpay.com',
    abandoned: null,
    ends: 1712649600000,
    deposit: rollick.DEFAULT_DEPOSIT_AMOUNT,
    form_firstName: '.rollick-form-checkout .rollick-form-first-name-value',
    form_lastName: '.rollick-form-checkout .rollick-form-last-name-value',
    form_email: '.rollick-form-checkout .rollick-form-email-value',
    form_phone: '.rollick-form-checkout .rollick-form-phone-value',
    form_address: '.rollick-form-checkout .rollick-form-address-value',
    form_city: '.rollick-form-checkout .rollick-form-city-value',
    form_postalCode: '.rollick-form-checkout .rollick-form-postal-code-value',
    form_state: '.rollick-form-checkout .rollick-form-state-value',
    states: {
        'US': [{ 'name': 'Alabama', 'value': 'AL' }, { 'name': 'Alaska', 'value': 'AK' }, { 'name': 'Arizona', 'value': 'AZ' }, { 'name': 'Arkansas', 'value': 'AR' }, { 'name': 'California', 'value': 'CA' }, { 'name': 'Colorado', 'value': 'CO' }, { 'name': 'Connecticut', 'value': 'CT' }, { 'name': 'Delaware', 'value': 'DE' }, { 'name': 'District Of Columbia', 'value': 'DC' }, { 'name': 'Florida', 'value': 'FL' }, { 'name': 'Georgia', 'value': 'GA' }, { 'name': 'Hawaii', 'value': 'HI' }, { 'name': 'Idaho', 'value': 'ID' }, { 'name': 'Illinois', 'value': 'IL' }, { 'name': 'Indiana', 'value': 'IN' }, { 'name': 'Iowa', 'value': 'IA' }, { 'name': 'Kansas', 'value': 'KS' }, { 'name': 'Kentucky', 'value': 'KY' }, { 'name': 'Louisiana', 'value': 'LA' }, { 'name': 'Maine', 'value': 'ME' }, { 'name': 'Maryland', 'value': 'MD' }, { 'name': 'Massachusetts', 'value': 'MA' }, { 'name': 'Michigan', 'value': 'MI' }, { 'name': 'Minnesota', 'value': 'MN' }, { 'name': 'Mississippi', 'value': 'MS' }, { 'name': 'Missouri', 'value': 'MO' }, { 'name': 'Montana', 'value': 'MT' }, { 'name': 'Nebraska', 'value': 'NE' }, { 'name': 'Nevada', 'value': 'NV' }, { 'name': 'New Hampshire', 'value': 'NH' }, { 'name': 'New Jersey', 'value': 'NJ' }, { 'name': 'New Mexico', 'value': 'NM' }, { 'name': 'New York', 'value': 'NY' }, { 'name': 'North Carolina', 'value': 'NC' }, { 'name': 'North Dakota', 'value': 'ND' }, { 'name': 'Ohio', 'value': 'OH' }, { 'name': 'Oklahoma', 'value': 'OK' }, { 'name': 'Oregon', 'value': 'OR' }, { 'name': 'Pennsylvania', 'value': 'PA' }, { 'name': 'Rhode Island', 'value': 'RI' }, { 'name': 'South Carolina', 'value': 'SC' }, { 'name': 'South Dakota', 'value': 'SD' }, { 'name': 'Tennessee', 'value': 'TN' }, { 'name': 'Texas', 'value': 'TX' }, { 'name': 'Utah', 'value': 'UT' }, { 'name': 'Vermont', 'value': 'VT' }, { 'name': 'Virginia', 'value': 'VA' }, { 'name': 'Washington', 'value': 'WA' }, { 'name': 'West Virginia', 'value': 'WV' }, { 'name': 'Wisconsin', 'value': 'WI' }, { 'name': 'Wyoming', 'value': 'WY' }],
        'CA': [{ 'name': 'Alberta', 'value': 'AB' }, { 'name': 'British Columbia', 'value': 'BC' }, { 'name': 'Manitoba', 'value': 'MB' }, { 'name': 'New Brunswick', 'value': 'NB' }, { 'name': 'Newfoundland and Labrador', 'value': 'NL' }, { 'name': 'Northwest Territories', 'value': 'NT' }, { 'name': 'Nova Scotia', 'value': 'NS' }, { 'name': 'Nunavut', 'value': 'NU' }, { 'name': 'Ontario', 'value': 'ON' }, { 'name': 'Prince Edward Island', 'value': 'PE' }, { 'name': 'Quebec', 'value': 'QC' }, { 'name': 'Saskatchewan', 'value': 'SK' }, { 'name': 'Yukon Territory', 'value': 'YT' }]
    },
    vehiclesRemaining: null,
    accessoryDisclaimer: 'Accessory kits ordered with your sled will be delivered with your Model Year 2024 pre-order purchase. All other accessories are shipped separately.',
    paymentProvider: 'paymentech',
    endpointAvailable: false,
    endpointTimer: null,

    paymentForm() {
        var self = this;
        var selectedCountry = rollick.cart.country || 'US';
        if (rq('.rollick-form-payment.button').hasClass('disabled')) return;
        self.generatePaymentForm(selectedCountry);
    },

    closeForm() {
        var self = this;
        if (rollick.siteId.toLowerCase() == 'ezg') {
            if (self.endpointTimer) window.clearInterval(self.endpointTimer);
            rollick.closeForm();
        } else {
            rq('.rollick-form').removeClass('tray--active');
        }
        // No more S.O.4 since they can come back anytime
        if (rollick.cart.leadUid) {
            self.emptyCart();
            delete rollick.cart.leadUid;
            delete rollick.cart.checkout;
        }
        window.setTimeout(function () {
            if (rq('.rollick-form-checkout').length) {
                rollick.cart.firstName = rq(self.form_firstName).val();
                rollick.cart.lastName = rq(self.form_lastName).val();
                rollick.cart.email = rq('.rollick-form-checkout .rollick-invalid-email').hasClass('rollick-hidden') ? rq(self.form_email).val() : '';
                rollick.cart.url = (window && window.location && (window.location.protocol + '//' + window.location.host + window.location.pathname));
                sessionStorage['rollick-fn'] = rollick.cart.firstName || '';
                sessionStorage['rollick-ln'] = rollick.cart.lastName || '';
                sessionStorage['rollick-e'] = rollick.cart.email || '';
                self.addToCart();
            }
            self.vehicle = {};
            self.scriptLoaded = {};
            self.paymentInfo = null;
            self.paymentTry = 0;
            self.abandoned = null;
            self.submitted = false;
            if (rollick.siteId.toLowerCase() != 'ezg') {
                rq('.rollick-form').remove();
                rq('.rollick-payment-window').remove();
                rq('body').css('overflow', 'auto');
            }
        }, 200);
    },

    removePayment() {
        rollick.preorder.paymentInfo = null;
        rollick.preorder.validateForm();
    },

    paymentHandler(response, maxRetryReached) {
        var self = this;
        if (!self.submitted) {
            self.submitted = true;
            if (!response || !response.uID) {
                self.paymentInfo = null;
                self.paymentTry++;
                window.setTimeout(function () {
                    self.submitted = false;
                }, 2000);
                rq('.rollick-invalid-payment').removeClass('rollick-hidden');
                if ((self.paymentTry == 2 || maxRetryReached) && !rollick.cart.leadUid) {
                    // auto-submit as NQL
                    rq('.rollick-invalid-payment').addClass('rollick-hidden');
                    cancelPayment();
                    self.submitForm();
                } else {
                    try {
                        if (rq('#rollick').length) rq('html, body').animate({ scrollTop: rq('.rollick-form-payment').offset().top - (screen.availHeight / 2 - 100) }, 10);
                    } catch (e) {
                    }
                }
            } else {
                rq('.rollick-invalid-payment').addClass('rollick-hidden');
                cancelPayment();
                self.updatePaymentInfo(response);
            }
        }
    },

    showReceipt(dealerName, paymentInfo, brandCode) {
        var self = this;
        rq('.rollick-form').remove();
        rq('body').css('overflow', 'auto');
        var page = rollick.widget + '/widgets/templates/textron/receipt.html';
        if (brandCode.toLowerCase() == 'ezg' || brandCode.toLowerCase() == 'tor') page = rollick.widget + '/widgets/templates/textron/' + brandCode.toLowerCase() + '/receipt.html';
        rq.get(page, null, function (data) {
            data = data.replace(/\$dealerName/g, (dealerName || '').trim());
            data = data.replace(/\$cc/g, paymentInfo && paymentInfo.cc || '');
            data = data.replace(/\$authCode/g, paymentInfo && paymentInfo.authCode || '');
            data = data.replace(/\$orderNumber/g, paymentInfo && paymentInfo.orderId || '');
            if (rollick.siteId.toLowerCase() == 'ezg') {
                tray.resetData();
                tray.setType('rollick-custom');
                tray.rollickForm = true;
                tray.openTray();
                rq('#tray .tray__content.rte-body-component').html('<div id="inner-rollick-form" class="tray__form" />');
                rq('body').css('overflow', 'hidden');
                rq('#inner-rollick-form').html(data);
            } else {
                rq('body').css('overflow', 'hidden').append(data);
                rq('.rollick-form').show();
            }
            window.setTimeout(function () {
                rollick.cart.checkout = false;
                self.renderCart(true);
                if (rollick.siteId.toLowerCase() != 'ezg') {
                    rq('.rollick-form').addClass('tray--active');
                }
                rq('.rollick-form-fields').show();
                rollick.deposit = 0;
                self.emptyCart();
            }, 10);
        });
    },

    showCCFailure(deposit, paymentInfo, brandCode) {
        var self = this;
        rq('.rollick-form').remove();
        rq('body').css('overflow', 'auto');
        var page = rollick.widget + '/widgets/templates/textron/cc-failure.html';
        if (brandCode.toLowerCase() == 'ezg') page = rollick.widget + '/widgets/templates/textron/' + rollick.siteId.toLowerCase() + '/cc-failure.html';
        rq.get(page, null, function (data) {
            data = data.replace(/\$cc/g, paymentInfo && paymentInfo.cc || '');
            data = data.replace(/\$amount/g, deposit || '');
            data = data.replace(/\$authCode/g, paymentInfo && paymentInfo.authCode || '');
            if (rollick.siteId.toLowerCase() == 'ezg') {
                tray.resetData();
                tray.setType('rollick-custom');
                tray.rollickForm = true;
                tray.openTray();
                rq('#tray .tray__content.rte-body-component').html('<div id="inner-rollick-form" class="tray__form" />');
                rq('body').css('overflow', 'hidden');
                rq('#inner-rollick-form').html(data);
            } else {
                rq('body').css('overflow', 'hidden').append(data);
                rq('.rollick-form').show();
            }
            window.setTimeout(function () {
                rq('.rollick-form').addClass('tray--active');
                rq('.rollick-form-fields').show();
                rollick.deposit = 0;
                if (rollick.cart.leadUid) {
                    rq('.rollick-form .subhead').text('Please reload the page to attempt again');
                }
                self.emptyCart();
            }, 10);
        });
    },

    printReceipt(head, body) {
        function stripScripts(s) {
            var div = document.createElement('div');
            div.innerHTML = s;
            var scripts = div.getElementsByTagName('script');
            var i = scripts.length;
            while (i--) {
                scripts[i].parentNode.removeChild(scripts[i]);
            }
            return div.innerHTML;
        }

        var w = window.open();
        var logo = '';
        if (!body) body = rq(rq('.rollick-receipt-form .tray__content-container').html()).find('.rollick-form-fields').removeClass('rollick-form-fields');
        if (rollick.siteId.toLowerCase() == 'ezg') {
            body = rq('.rollick-receipt-form');
        }
        if (!head) head = stripScripts(rq('head').html());
        if (rq('.icon-arctic-cat-logo').length) logo = '<div style=\'padding-bottom: 25px; text-align: center;\'>' + rq('.icon-arctic-cat-logo')[0].outerHTML.replace('height="141"', 'height="100"') + '</div>';
        if (!logo && rq('.icon-logo').length) logo = '<div style=\'padding-bottom: 25px; text-align: center;\'>' + rq('.icon-logo')[0].outerHTML + '</div>';
        rq(body).find('.rollick-print').remove();
        rq(w.document.body).css('max-width', '600px').css('margin', '100px 100px 0 100px');
        rq(w.document.head).html(head);
        rq(w.document.body).html(logo + body.html() + "<script>window.setTimeout(function() { window.print(); }, 1000);</script>");
        w.document.title = 'Pre-Order Receipt';
        Aimbase.Analytics.SendPageAction(null, null, 'print', 'receipt', null);
    },

    updatePaymentInfo(response) {
        let transactionId = '';
        if (response) transactionId = response.uID;
        if (transactionId) {
            rollick.paymentInfo = { transactionId: transactionId, orderId: rollick.preorder.orderId || '', type: rollick.preorder.paymentProvider || '' };
        } else {
            rollick.paymentInfo = null;
        }
        rollick.preorder.submitForm();
    },

    extractKit(accessories) {
        var kitName = "";
        try {
            for (var i = 0; i < accessories.length; i++) {
                var acc = accessories[i];
                rollick.vehicles.filter(function (veh) {
                    if (veh.hasKits) {
                        veh.kits.filter(function (kit) {
                            if (kit.item.toLowerCase() == acc.item.toLowerCase()) {
                                kitName = kit.item;
                            }
                        });
                    }
                    return;
                });
            }
        } catch (e) {
        }
        return kitName;
    },

    removeKit(accessories) {
        var self = this;
        var acc = null;
        try {
            if (accessories.length) acc = [];
            var kitName = self.extractKit(accessories);
            for (var i = 0; i < accessories.length; i++) {
                var accItem = accessories[i];
                if (!kitName || accItem.item.toLowerCase() != kitName.toLowerCase()) {
                    acc.push(accessories[i]);
                }
            }
            if (!acc.length) acc = null;
        } catch (e) {
        }
        return acc;
    },

    addToCart(options) {
        var self = this;
        if (options && options.modelNumber && self.getVehicle(options.modelNumber, options.color || '')) {
            self.paymentInfo = null;
            self.abandoned = null;
            self.paymentTry = 0;
            self.submitted = false;
            var country = options.country || sessionStorage['rollick-country'] || 'US';
            if (rollick.userId) {
                // pull kit out of accessories collection
                if (!options.kit && options.accessories && options.accessories.length) {
                    options.kit = self.extractKit(options.accessories);
                    options.accessories = self.removeKit(options.accessories);
                }
                var vehicleImage = null;
                if (options.accessories && options.accessories.length) {
                    vehicleImage = rollick.vehicleImage;
                }
                if (!options.brandCode) {
                    var vehicle = self.getVehicle(options.modelNumber, options.color || '');
                    if (vehicle) {
                        options.brandCode = vehicle.brandCode || '';
                    }
                }
                var payload = {
                    modelNumber: options.modelNumber || '',
                    kit: options.kit || '',
                    accCode: self.getAccessoriesHash(options.accessories),
                    accessories: options.accessories || null,
                    quantity: options.quantity || 1,
                    image: vehicleImage,
                    country: country,
                    brandCode: options.brandCode || '',
                    color: options.color || '',
                };
                try {
                    if (rollick.cart.items[0].data.brandCode != options.brandCode) {
                        console.log('Not matching brandCode: ' + options.brandCode + '. Not adding item to cart.');
                        return;
                    }
                } catch (e) {
                }
                rq.ajax({
                    url: rollick.widget + '/carts/addToCart/' + rollick.userId,
                    type: 'POST',
                    data: JSON.stringify(payload),
                    contentType: 'application/json; charset=utf-8',
                    dataType: 'json',
                    success: function (data) {
                        rollick.cart = JSON.parse(JSON.stringify(data));
                        self.updateCartCount(self.getCartCount());
                        if (options.checkout) {
                            rollick.cart.dealerId = options.dealerId;
                            rollick.cart.dealerName = options.dealerName;
                            sessionStorage['rollick-dealer-id'] = rollick.cart.dealerId;
                            rollick.cart.checkout = true;
                            rollick.cart.leadUid = options.leadUid || null;
                            self.checkoutCart();
                        } else {
                            delete rollick.cart.checkout;
                            var vehicle = self.getVehicle(options.modelNumber);
                            if (vehicle && vehicle.modelName && window.dataLayer) window.dataLayer.push({ event: 'custom.preOrderCart', 'custom.eventLabel': vehicle.modelName });
                            self.openCart();
                        }
                    }
                });
                Aimbase.Analytics.SendPageAction(null, null, 'add', 'cart item', null);
            }
        } else {
            var payload = {
                modelNumber: '',
                fn: rollick.cart.firstName || '',
                ln: rollick.cart.lastName || '',
                e: rollick.cart.email || '',
                url: rollick.cart.url || ''
            };
            rq.ajax({
                url: rollick.widget + '/carts/addToCart/' + rollick.userId,
                type: 'POST',
                data: JSON.stringify(payload),
                contentType: 'application/json; charset=utf-8',
                dataType: 'json'
            });
        }
        return false;
    },

    removeCartItem(obj) {
        var self = this;
        var cartItem = rq(obj.closest('.rollick-cart-item'));
        if (cartItem && cartItem.length && rollick.userId) {
            var modelNumber = cartItem.attr('data-modelNumber') || '';
            var kit = cartItem.attr('data-kit') || '';
            var accCode = cartItem.attr('data-accCode') || '';
            var color = cartItem.attr('data-color') || '';
            if (modelNumber) {
                rq.post(rollick.widget + '/carts/setSkuCount/' + rollick.userId, { modelNumber: modelNumber, color: color, kit: kit, accCode: accCode, quantity: 0 }, function (data) {
                    if (data) {
                        rollick.cart = JSON.parse(JSON.stringify(data));
                        var cartCount = self.getCartCount();
                        self.updateCartCount(cartCount);
                        if (!cartCount) {
                            self.openCart();
                        } else {
                            self.renderCart();
                        }
                    }
                    Aimbase.Analytics.SendPageAction(null, null, 'remove', 'cart item', null);
                });
            }
        }
    },

    changeCartItemQuantity(obj) {
        var self = this;
        var cartItem = rq(obj.closest('.rollick-cart-item'));
        if (cartItem && cartItem.length && rollick.userId) {
            var modelNumber = cartItem.attr('data-modelNumber') || '';
            var kit = cartItem.attr('data-kit') || '';
            var accCode = cartItem.attr('data-accCode') || '';
            var color = cartItem.attr('data-color') || '';
            var qty = rq(obj).val();
            var originalQty = parseInt(rq(obj).attr('data-quantity'));
            if (!qty) {
                qty = originalQty;
                rq(obj).val(qty);
            }
            if (modelNumber && qty != originalQty) {
                rq.post(rollick.widget + '/carts/setSkuCount/' + rollick.userId, { modelNumber: modelNumber, color: color, kit: kit, accCode: accCode, quantity: qty }, function (data) {
                    if (data) {
                        self.paymentInfo = null;
                        self.abandoned = null;
                        self.paymentTry = 0;
                        self.submitted = false;
                        rollick.cart = JSON.parse(JSON.stringify(data));
                        var cartCount = self.getCartCount();
                        self.updateCartCount(cartCount);
                        if (!cartCount) {
                            self.openCart();
                        } else {
                            if (cartItem.find('.rollick-cart-quantity-input').val() == '1') {
                                self.renderCart();
                            } else {
                                self.renderCartNumbers();
                            }
                        }
                    }
                    Aimbase.Analytics.SendPageAction(null, null, 'change quantity', 'cart item', null);
                });
            }
        }
    },

    decreaseCartItem(obj) {
        var self = this;
        var cartItem = rq(obj.closest('.rollick-cart-item'));
        if (cartItem && cartItem.length && rollick.userId) {
            var modelNumber = cartItem.attr('data-modelNumber') || '';
            var kit = cartItem.attr('data-kit') || '';
            var accCode = cartItem.attr('data-accCode') || '';
            var color = cartItem.attr('data-color') || '';
            if (modelNumber) {
                rq.post(rollick.widget + '/carts/decreaseSku/' + rollick.userId, { modelNumber: modelNumber, color: color, kit: kit, accCode: accCode }, function (data) {
                    if (data) {
                        self.paymentInfo = null;
                        self.abandoned = null;
                        self.paymentTry = 0;
                        self.submitted = false;
                        rollick.cart = JSON.parse(JSON.stringify(data));
                        var cartCount = self.getCartCount();
                        self.updateCartCount(cartCount);
                        if (!cartCount) {
                            self.openCart();
                        } else {
                            if (cartItem.find('.rollick-cart-quantity-input').val() == '1') {
                                self.renderCart();
                            } else {
                                self.renderCartNumbers();
                            }
                        }
                    }
                    Aimbase.Analytics.SendPageAction(null, null, 'decrease quantity', 'cart item', null);
                });
            }
        }
    },

    increaseCartItem(obj) {
        var self = this;
        var cartItem = rq(obj.closest('.rollick-cart-item'));
        if (cartItem && cartItem.length && rollick.userId) {
            var modelNumber = cartItem.attr('data-modelNumber') || '';
            var kit = cartItem.attr('data-kit') || '';
            var accCode = cartItem.attr('data-accCode') || '';
            var color = cartItem.attr('data-color') || '';
            if (modelNumber) {
                rq.post(rollick.widget + '/carts/increaseSku/' + rollick.userId, { modelNumber: modelNumber, color: color, kit: kit, accCode: accCode }, function (data) {
                    if (data) {
                        self.paymentInfo = null;
                        self.abandoned = null;
                        self.paymentTry = 0;
                        self.submitted = false;
                        rollick.cart = JSON.parse(JSON.stringify(data));
                        var cartCount = self.getCartCount();
                        self.updateCartCount(cartCount);
                        if (!cartCount) {
                            self.openCart();
                        } else {
                            self.renderCartNumbers();
                        }
                    }
                    Aimbase.Analytics.SendPageAction(null, null, 'increase quantity', 'cart item', null);
                });
            }
        }
    },

    validModels(country) {
        var models = [];
        rollick.vehicles.forEach(function (vehicle) {
            if (vehicle.PRE[country || 'US'] && vehicle.mfgModelCode) models.push(vehicle.mfgModelCode);
        });
        return models;
    },

    openCart() {
        var self = this;
        var cartForm = 'cart-event-ended.html';
        if (self.endpointTimer) window.clearInterval(self.endpointTimer);
        if ((new Date()).valueOf() > self.ends && sessionStorage['rollick-allow-preorder'] != 'Yes') cartForm = 'cart-event-ended.html';
        else {
            if (!self.getCartCount()) cartForm = 'cart-empty.html';
        }
        if (rollick.cart && rollick.cart.checkout) {
            self.checkoutCart();
            return;
        }
        var form = 'textron/' + rollick.siteId.toLowerCase() + '/' + cartForm;
        if (rollick.siteId.toLowerCase() == 'ezg') {
            tray.resetData();
            tray.setType('rollick-custom');
            tray.rollickForm = true;
            tray.openTray();
            rq('#tray .tray__content.rte-body-component').html('<div id="inner-rollick-form" class="tray__form" />');
            rq.get(rollick.widget + '/widgets/templates/' + form, function (data) {
                rq('body').css('overflow', 'hidden');
                rq('#inner-rollick-form').html(data);
                window.setTimeout(function () {
                    self.renderCart();
                    rq('.rollick-form-fields').show();
                    Aimbase.Analytics.SendPageAction(null, null, 'open', 'cart', null);
                }, 10);
            });
        } else {
            rq('.rollick-form').remove();
            rq('body').css('overflow', 'auto');
            rq.get(rollick.widget + '/widgets/templates/' + form, function (data) {
                rq('body').css('overflow', 'hidden').append(data);
                rq('.rollick-form').show();
                window.setTimeout(function () {
                    self.renderCart();
                    rq('.rollick-form').addClass('tray--active');
                    rq('.rollick-form-fields').show();
                    Aimbase.Analytics.SendPageAction(null, null, 'open', 'cart', null);
                }, 10);
            });
        }
    },

    checkoutCart() {
        var self = this;
        var cartForm = 'cart-checkout-modal-en-us.html';
        if (!self.getCartCount()) cartForm = 'cart-empty.html';
        if (self.endpointTimer) window.clearInterval(self.endpointTimer);
        self.endpointTimer = window.setInterval(self.testEndpoint, 30000);
        var form = 'textron/' + rollick.siteId.toLowerCase() + '/' + cartForm;
        if (rollick.siteId.toLowerCase() == 'ezg') {
            if (typeof tray == 'undefined') {
                window.setTimeout(function () {
                    self.showMessage(headline, message);
                }, 250);
                return;
            }
            if (!tray.resetData) {
                window.setTimeout(function () {
                    self.showMessage(headline, message);
                }, 250);
                return;
            }
        }
        rq('.rollick-form').remove();
        rq('body').css('overflow', 'auto');
        rollick.visited = {};
        rq.get(rollick.widget + '/widgets/templates/' + form, function (data) {
            self.abandoned = false;
            if (rollick.siteId.toLowerCase() == 'ezg') {
                tray.resetData();
                tray.setType('rollick-custom');
                tray.rollickForm = true;
                tray.openTray();
                rq('#tray .tray__content.rte-body-component').html('<div id="inner-rollick-form" class="tray__form" />');
                rq('body').css('overflow', 'hidden');
                rq('#inner-rollick-form').html(data);
            } else {
                rq('body').css('overflow', 'hidden').append(data);
            }
            rq('.rollick-form').show();
            window.setTimeout(function () {
                if (self.getCartCount()) {
                    var vehicleModels = self.distinctModelsInCart();
                    if (vehicleModels.length && window.dataLayer) window.dataLayer.push({ event: 'custom.preOrderCheckout', 'custom.eventLabel': vehicleModels.join(", ") });
                    if (rollick.cart.country) rq('.rollick-form-country-select').val(rollick.cart.country);
                    self.renderCart(true);
                    self.isFormSubmitted = false;
                    rollick.loadScript(rollick.preorder.paymentScript, 'paymentProvider');
                    self.attachEvents();
                    self.loadPII();
                    if (rollick.cart.leadUid) {
                        sessionStorage['rollick-dealer-id'] = rollick.cart.dealerId;
                        rq('.rollick-form-checkout .rollick-continue-shopping').addClass('rollick-hidden');
                        rq('.rollick-form-checkout .rollick-specific-dealer-selected').removeClass('rollick-hidden');
                        rq('.rollick-form-checkout .rollick-specific-dealer').text(rollick.cart.dealerName);
                        rq(self.form_firstName).attr('readonly', true);
                        rq(self.form_lastName).attr('readonly', true);
                        rq(self.form_email).attr('readonly', true);
                        rq(self.form_phone).attr('readonly', true);
                        if (sessionStorage['rollick-zip']) rq(self.form_postalCode).attr('readonly', true);
                        rq('.rollick-field-comment').addClass('rollick-hidden');
                        rq('.rollick-field-dealer-order').addClass('rollick-hidden');
                    }
                }
                if (rollick.siteId.toLowerCase() != 'ezg') {
                    rq('.rollick-form').addClass('tray--active');
                }
                rq('.rollick-form-fields').show();
                Aimbase.Analytics.SendPageAction(null, null, 'checkout', 'cart', null);
            }, 500);
        });
    },

    loadPII() {
        var self = this;
        if (sessionStorage['rollick-fn']) rq(self.form_firstName).val(sessionStorage['rollick-fn']);
        if (sessionStorage['rollick-ln']) rq(self.form_lastName).val(sessionStorage['rollick-ln']);
        if (sessionStorage['rollick-e']) rq(self.form_email).val(sessionStorage['rollick-e']);
        if (sessionStorage['rollick-addr']) rq(self.form_address).val(sessionStorage['rollick-addr']);
        if (sessionStorage['rollick-city']) rq(self.form_city).val(sessionStorage['rollick-city']);
        if (sessionStorage['rollick-state']) rq(self.form_state).val(sessionStorage['rollick-state']);
        if (sessionStorage['rollick-zip']) rq(self.form_postalCode).val(sessionStorage['rollick-zip']);
        if (sessionStorage['rollick-p']) rq(self.form_phone).val(sessionStorage['rollick-p']);
        if (rq(self.form_postalCode).val()) {
            self.findClosestDealer(rq(self.form_postalCode).val());
        }
        self.validateForm();
    },

    renderCart(forReceipt) {
        var self = this;
        rq('.rollick-cart').empty();
        if (rollick.cart && rollick.cart.items) {
            var cartAmount = 0;
            var hasARC = false, hasTOR = false;
            for (var i = 0; i < rollick.cart.items.length; i++) {
                var item = rollick.cart.items[i];
                var amount = item.deposit * item.quantity;
                var vehicle = (item.color ? self.getVehicle(item.modelNumber, item.color) : self.getVehicle(item.modelNumber));
                var itemObj = rq('<div class="rollick-cart-item"></div>');
                var trimDetails = vehicle.color;
                if (vehicle.track) trimDetails += ', ' + vehicle.track;
                if (vehicle.trackType) trimDetails += ', ' + vehicle.trackType;
                if (vehicle.suspension) trimDetails += ', ' + vehicle.suspension;
                if (vehicle.starter) trimDetails += ', ' + vehicle.starter;
                if (vehicle.type == 'Snow') hasARC = true;
                if (vehicle.type == 'Off Road') hasTOR = true;
                itemObj.attr('data-modelNumber', item.modelNumber || '');
                itemObj.attr('data-kit', item.kit || '');
                itemObj.attr('data-accCode', item.accCode || '');
                itemObj.attr('data-color', item.color || '');
                var html = '';
                html += '<div class="rollick-cart-item-image">';
                html += '<img src="' + item.image + '">';
                if (!forReceipt) html += '<div class="rollick-center rollick-cart-item-remove" onclick="rollick.preorder.removeCartItem(this);">Remove</div>';
                html += '</div>';
                html += '<div class="rollick-cart-item-vehicle">';
                html += '<div class="rollick-cart-item-desc">';
                html += '<div class="rollick-cart-item-model">' + vehicle.modelName + '</div>';
                html += '<div class="rollick-cart-item-trim">' + trimDetails + '</div>';
                if (item.kit) html += '<div class="rollick-cart-item-kit">' + item.kit + '</div>';
                if (item.accCode) {
                    var accHtml = '<div class="rollick-cart-item-accessories">';
                    for (var j = 0; j < item.accessories.length; j++) {
                        if (j > 0) accHtml += ', ';
                        accHtml += item.accessories[j].item;
                    }
                    accHtml += '</div>';
                    html += accHtml;
                }
                html += '</div>';
                if (!forReceipt) {
                    html += '<div class="rollick-cart-item-quantity"><span class="rollick-cart-quantity" onclick="rollick.preorder.decreaseCartItem(this);">-</span><input class="rollick-cart-quantity-input" type="text" pattern="[0-9]{2}" data-quantity="' + item.quantity + '" onblur="rollick.preorder.changeCartItemQuantity(this);" min="0" step="1" max="99" value="' + item.quantity + '" maxlength="2"><span class="rollick-cart-quantity" onclick="rollick.preorder.increaseCartItem(this);">+</span></div>';
                } else {
                    let fs = 14;
                    if (rollick.siteId.toLowerCase() == 'ezg') fs = 12;
                    html += '<div class="rollick-cart-item-quantity"><div style="float: left; font-size: ' + fs + 'px; line-height: 31px;">Quantity: <span class="rollick-bold">' + item.quantity + '</span></div></div>';
                }
                html += '<div class="rollick-cart-item-amount"><span class="rollick-cart-deposit-label">DEPOSIT</span><span class="rollick-cart-deposit-value">' + self.formatCurrency(amount, '$') + '</span></div>';
                html += '</div>';
                html += '<div class="rollick-clear"></div>';
                itemObj.html(html);
                rq('.rollick-cart').append(itemObj);
                cartAmount += amount;
                self.cartAmount = cartAmount;
            }
            var totalObj = rq('<div class="rollick-cart-total"></div>');
            totalObj.html('<span class="rollick-cart-total-label">TOTAL PRE-ORDER DEPOSIT</span><span class="rollick-cart-deposit-value">' + self.formatCurrency(cartAmount, '$') + '</span>');
            if (forReceipt) {
                rq('.rollick-vehicle-deposit').removeClass('rollick-hidden');
                // if (hasARC) rq('.rollick-preorder-disclaimer-arc').removeClass('rollick-hidden');
                // if (hasTOR) rq('.rollick-preorder-disclaimer-tor').removeClass('rollick-hidden');
                rq('.rollick-deposit-amount').text(self.formatCurrency(cartAmount, '$'));
                // rq('.rollick-pay').attr('data-acceptUIFormHeaderTxt', 'Enter your ' + self.formatCurrency(cartAmount, '$') + ' pre-order deposit info');
            }
            rq('.rollick-cart').append(totalObj);
            rq('.rollick-cart').append('<div class="rollick-clear"></div>');
        }
    },

    renderCartNumbers() {
        var self = this;
        if (rollick.cart && rollick.cart.items) {
            var cartAmount = 0;
            for (var i = 0; i < rollick.cart.items.length; i++) {
                var item = rollick.cart.items[i];
                var amount = item.deposit * item.quantity;
                var itemObj = rq('.rollick-cart-item[data-modelNumber="' + item.modelNumber + '"][data-kit="' + item.kit + '"]');
                if (item.color) itemObj = rq('.rollick-cart-item[data-modelNumber="' + item.modelNumber + '"][data-color="' + item.color + '"][data-kit="' + item.kit + '"]');
                if (itemObj.length) {
                    itemObj.find('.rollick-cart-quantity-input').val(item.quantity);
                    itemObj.find('.rollick-cart-deposit-value').text(self.formatCurrency(amount, '$'));
                }
                cartAmount += amount;
            }
            rq('.rollick-cart-total .rollick-cart-deposit-value').text(self.formatCurrency(cartAmount, '$'));
        }
    },

    cleanCart() {
        var self = this;
        var cart = JSON.parse(sessionStorage['rollick-cart'] || '[]');
        var country = sessionStorage['rollick-country'] || 'US';
        var validModels = self.validModels(country);
        cart = cart.filter(function (item) { return ((item.quantity || 0) > 0 && validModels.indexOf(item.sku) != -1); });
        sessionStorage['rollick-cart'] = JSON.stringify(cart);
    },

    loadCart() {
        var self = this;
        rollick.cart = {};
        if (rollick.userId) {
            if ((new Date()).valueOf() > self.ends && sessionStorage['rollick-allow-preorder'] != 'Yes') {
                self.updateCartCount(self.getCartCount());
            } else {
                rq.get(rollick.widget + '/carts/load/' + rollick.userId, function (data) {
                    rollick.cart = JSON.parse(JSON.stringify(data));
                    if (sessionStorage['rollick-country'] && rollick.cart) {
                        rollick.cart.country = sessionStorage['rollick-country'];
                    }
                    self.updateCartCount(self.getCartCount());
                    if (rollick.initOpenCart) {
                        rollick.initOpenCart = false;
                        sessionStorage['rollick-fn'] = rollick.cart.firstName || '';
                        sessionStorage['rollick-ln'] = rollick.cart.lastName || '';
                        sessionStorage['rollick-e'] = rollick.cart.email || '';
                        sessionStorage['rollick-p'] = '';
                        sessionStorage['rollick-addr'] = '';
                        sessionStorage['rollick-city'] = '';
                        sessionStorage['rollick-state'] = '';
                        sessionStorage['rollick-zip'] = '';
                        self.openCart();
                    }
                });
            }
        }
    },

    generateCart(leadUid) {
        var self = this;
        // get dealer, orderModelNumber, accessories, country from leadUid
        delete sessionStorage['rollick-dealer-id'];
        if (leadUid) {
            rq.get(rollick.widget + '/preorder/' + leadUid, function (data) {
                if (data && data.dealerId) {
                    var orderModelCode = data.modelNumber;
                    var accessories = data.accessories;
                    var country = data.country;
                    sessionStorage['rollick-dealer-id'] = data.dealerId;
                    sessionStorage['rollick-fn'] = data.fn;
                    sessionStorage['rollick-ln'] = data.ln;
                    sessionStorage['rollick-e'] = data.e;
                    sessionStorage['rollick-p'] = rollick.formatPhone(data.p);
                    sessionStorage['rollick-zip'] = data.z;
                    // translate orderModelNumber to vehicle model number
                    var vehicle = self.getVehicle(orderModelCode);
                    if (vehicle) {
                        var modelNumber = vehicle.mfgModelCode;
                        self.emptyCart();
                        if (rollick.settings && rollick.settings.drEnabled && !rollick.library) {
                            window.setTimeout(function () {
                                self.generateCart(leadUid);
                            }, 100);
                            return;
                        }
                        if (rollick.settings && rollick.settings.drEnabled) {
                            rollick.user.fn = data.fn || '';
                            rollick.user.ln = data.ln || '';
                            rollick.user.e = data.e || '';
                            rollick.user.p = rollick.formatPhone(data.p || '');
                            rollick.user.z = data.z || '';
                            rollick.getQuote({ year: vehicle.year, modelCode: modelNumber }, { country: country, leadUid: leadUid, dealerId: data.dealerId, leadType: 'Pre-order' });
                        } else {
                            self.addToCart({ modelNumber: modelNumber, kit: '', accessories: accessories, quantity: 1, country: country, leadUid: leadUid, dealerId: data.dealerId, dealerName: data.dealerName, checkout: true });
                        }
                    } else {
                        // show unable to find the proper vehicle
                        self.showMessage("Pre-Order", "We are unable to locate the vehicle");
                    }
                } else {
                    if (data && data.preordered) {
                        self.showMessage("Pre-Order", "Thank you for your pre-order.</div><div class='subhead'>Your dealer will reach out to you soon.");
                    } else {
                        // show unable to find lead data
                        self.showMessage("Pre-Order", "We are unable to locate the provided information");
                    }
                }
            });
        }
    },

    showMessage(headline, message) {
        var self = this;
        var form = 'textron/' + rollick.siteId.toLowerCase() + '/' + 'message.html';
        if (rollick.siteId.toLowerCase() == 'ezg') {
            if (typeof tray == 'undefined') {
                window.setTimeout(function () {
                    self.showMessage(headline, message);
                }, 250);
                return;
            }
            if (!tray.resetData) {
                window.setTimeout(function () {
                    self.showMessage(headline, message);
                }, 250);
                return;
            }
        }
        rq.get(rollick.widget + '/widgets/templates/' + form, function (data) {
            data = data.replace(/\$headline/g, headline || '');
            data = data.replace(/\$message/g, message || '');
            if (rollick.siteId.toLowerCase() == 'ezg') {
                tray.resetData();
                tray.setType('rollick-custom');
                tray.rollickForm = true;
                tray.openTray();
                rq('#tray .tray__content.rte-body-component').html('<div id="inner-rollick-form" class="tray__form" />');
                rq('body').css('overflow', 'hidden');
                rq('#inner-rollick-form').html(data);
            } else {
                rq('body').css('overflow', 'hidden').append(data);
                rq('.rollick-form').show();
            }
            window.setTimeout(function () {
                self.renderCart();
                if (rollick.siteId.toLowerCase() != 'ezg') {
                    rq('.rollick-form').addClass('tray--active');
                }
                rq('.rollick-form-fields').show();
            }, 10);
        });
    },

    emptyCart() {
        var self = this;
        rq.get(rollick.widget + '/carts/empty/' + rollick.userId, function (data) {
            rollick.cart = JSON.parse(JSON.stringify(data));
            self.updateCartCount(self.getCartCount());
        });
    },

    increaseCartSKU(modelNumber, kit, accessories) {
        var self = this;
        return self.addToCart({ modelNumber: modelNumber || '', kit: kit || '', accessories: accessories || null, quantity: 1 });
    },

    decreaseCartSKU(modelNumber, kit, accessories) {
        var self = this;
        return self.addToCart({ modelNumber: modelNumber || '', kit: kit || '', accessories: accessories || null, quantity: -1 });
    },

    getCartCount() {
        var self = this;
        var count = 0;
        var cart = rollick.cart || {};
        if (cart.items) {
            for (var i = 0; i < cart.items.length; i++) {
                count += cart.items[i].quantity || 0;
            }
        }
        if ((new Date()).valueOf() > self.ends && sessionStorage['rollick-allow-preorder'] != 'Yes') count = 0;
        return count;
    },

    updateCartCount(count) {
        if (count > 0) {
            rq('.cart-count-value').text(count.toString());
            rq('.rollick-view-cart').removeClass('rollick-hidden');
        } else {
            rq('.cart-count-value').text('0');
            rq('.rollick-view-cart').addClass('rollick-hidden');
        }
    },

    getQuote(vehicle, options) {
        var self = this;
        if (options.country == "CA") {
            vehicle.deposit = vehicle.depositCAD || 0;
        }
        if (options.country == "US" || !options.country) {
            vehicle.deposit = vehicle.depositUSD || 0;
        }
        //delete sessionStorage['rollick-dealer-id'];
        var accessories = null, image64 = null;
        rollick.accessories = [];
        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 || '';
        if (vehicle.year) {
            var yr = vehicle.year || '';
            if (yr.length == 4) {
                try {
                    yr = parseInt(yr);
                    if (yr <= ((new Date()).getFullYear() + 2)) {
                        rollick.year = yr.toString();
                    }
                } catch (e) { }
            }
        } else {
            if (!rollick.year) rollick.year = '';
        }
        if (vehicle.modelName) {
            vehicle.modelName = vehicle.modelName.trim();
        }
        if (vehicle.starter) {
            vehicle.starter = vehicle.starter.trim();
        }
        if (vehicle.suspension) {
            vehicle.suspension = vehicle.suspension.trim();
        }
        if (vehicle.track) {
            vehicle.track = vehicle.track.trim();
        }
        if (vehicle.color) {
            vehicle.color = vehicle.color.trim();
        }
        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);
        rollick.vehicleParams = {};

        rollick.leadType = 'Pre-Order';
        vehicle.type = 'Snow';

        if (!vehicle.color) {
            if (typeof event !== 'undefined') {
                if (rq(event.target).closest('.model-list-item').length) vehicle.color = rq(event.target).closest('.model-list-item').find('.model-color-choice-wrapper.active').first().text().trim();
                if (rq(event.target).closest('.model-introduction').length) vehicle.color = rq(event.target).closest('.model-introduction').find('.model-color-choice-wrapper.active:visible').first().text().trim();
            }
        }

        var year = vehicle.year || rollick.year;
        var vehType = (vehicle.type || '').trim();
        var vehicleName = (vehicle.vehicleName || '').trim();
        var modelName = (vehicle.modelName || '').trim();
        var color = (vehicle.color || '').trim();
        var track = (vehicle.track || '').trim();
        var trackType = (vehicle.trackType || '').trim();
        var suspension = (vehicle.suspension || '').trim();
        var starter = (vehicle.starter || '').trim();
        var kit = (vehicle.kit || '').trim();
        var deposit = parseFloat(vehicle.deposit || '0');
        var modelNumber = (vehicle.modelNumber || '').trim();
        var matchedToSKU = false;
        var vehicleParameter = { type: vehType, vehicleName: vehicleName, modelName: modelName, year: year, color: color, track: track, trackType: trackType, suspension: suspension, starter: starter, kit: kit, deposit: deposit, modelNumber: modelNumber };
        rollick.vehicleParams = vehicleParameter;
        rollick.deposit = deposit;
        delete vehicle.trims;
        rollick.lead_headline = 'PLACE A PRE-ORDER';
        // filter vehicles
        self.vehiclesRemaining = rollick.vehicles.slice();
        self.vehiclesRemaining = self.vehiclesRemaining.filter(function (v) { return rollick.isAvailable(v, 'Pre-Order', options.country || 'US'); });
        if (year) self.vehiclesRemaining = self.vehiclesRemaining.filter(function (v) { return v.year == year; });
        if (vehicleName) self.vehiclesRemaining = self.vehiclesRemaining.filter(function (v) { return v.vehicleName.toLowerCase() === vehicleName.toLowerCase(); });
        if (modelName) self.vehiclesRemaining = self.vehiclesRemaining.filter(function (v) { return v.modelName.toLowerCase() === modelName.toLowerCase(); });
        if (color) self.vehiclesRemaining = self.vehiclesRemaining.filter(function (v) { return v.color.toLowerCase() === color.toLowerCase(); });
        if (track) self.vehiclesRemaining = self.vehiclesRemaining.filter(function (v) { return v.track.toLowerCase() === track.toLowerCase(); });
        if (trackType) self.vehiclesRemaining = self.vehiclesRemaining.filter(function (v) { return v.trackType.toLowerCase() === trackType.toLowerCase(); });
        if (suspension) self.vehiclesRemaining = self.vehiclesRemaining.filter(function (v) { return v.suspension.toLowerCase() === suspension.toLowerCase(); });
        if (starter) self.vehiclesRemaining = self.vehiclesRemaining.filter(function (v) { return v.starter.toLowerCase() === starter.toLowerCase(); });
        if (modelNumber) self.vehiclesRemaining = self.vehiclesRemaining.filter(function (v) { return v.mfgModelCode.toLowerCase() === modelNumber.toLowerCase(); });

        matchedToSKU = (self.vehiclesRemaining.length == 1);
        if (matchedToSKU) vehicle = self.vehiclesRemaining[0];
        if (kit && vehicle) vehicle.kit = kit;
        else vehicle.kit = '';
        if (!vehicle.brand) vehicle.brand = 'Arctic Cat Snow';
        if (accessories) {
            try {
                if (accessories.length) {
                    rollick.accessories = [];
                    accessories.forEach(function (acc) {
                        var item = {
                            part: acc.part.trim(),
                            item: acc.item.trim(),
                            cost: parseFloat(acc.cost),
                        };
                        if (acc.text) {
                            item.text = acc.text.trim();
                        }
                        var matchedToKit = false;
                        if (matchedToSKU) {
                            if (vehicle.kits && vehicle.kits.filter(vk => vk.item.toLowerCase() == item.item.toLowerCase()).length) {
                                item.isKit = true;
                                // vehicle.kit = item.item;
                                // matchedToKit = true;
                            }
                        }
                        if (!matchedToKit) rollick.accessories.push(item);
                    });
                }
                vehicleParameter.kit = vehicle.kit;
            } catch (e) {
                if (window.console) console.error('Accessories parsing error ', e);
            }
        }
        rollick.vehicleImage = null;
        if (image64) {
            vehicle.image64 = image64;
            rollick.vehicleImage = image64;
        }
        var form = 'textron/' + rollick.siteId.toLowerCase() + '/form-modal-en-us-addToCart.html';
        if (rollick.div) {
            // full-page
            form = 'textron/' + rollick.siteId.toLowerCase() + '/form-full-en-us-preorder.html';
            self.availableModels = rollick.listModels('Pre-order', options.country, '', 'Snow', 'Snowmobiles');
            self.vehiclesRemaining = self.availableModels.models.slice();
        } else {
            // flyout
            if (self.paymentActive) {
                rollick.brandCode = 'ARC';
                rollick.deposit = vehicle.deposit;
                rollick.vehicles = rollick.vehicles.filter(function (v) {
                    return v.category == 'Snowmobiles';
                });
            } else {
                form = 'textron/' + rollick.siteId.toLowerCase() + '/cart-event-ended.html';
            }
            rollick.vehicle = Object.assign({}, vehicle);
        }
        if (!rollick.vehicle.originalImage) rollick.vehicle.originalImage = rollick.vehicle.image;
        rq.get(rollick.widget + '/widgets/templates/' + form, function (data) {
            if (rollick.accessories && rollick.accessories.length) {
                if (!rollick.vehicle.image64) rollick.flattenVehicleImage();
            }
            var country = 'US';
            if (options.country) {
                country = options.country;
                rollick.cart.country = country;
            }
            if (options.country) {
                sessionStorage['rollick-country'] = options.country;
            }
            if (rollick.div) {
                rq(rollick.div).html(data);
                window.setTimeout(function () {
                    self.initFullPageEvents();
                }, 10);
                if (typeof Aimbase !== 'undefined') {
                    if (Aimbase && Aimbase.Analytics && Aimbase.Analytics.SendPageAction) {
                        Aimbase.Analytics.SendPageAction('Pre-Order', 'Full', 'view', { 'PageAction': '19938612-bb81-4ec7-a250-7a38ba4b02e6' });
                    }
                }
            } else {
                rq('body').css('overflow', 'hidden').append(data);
                rq('.rollick-form').show();
                window.setTimeout(function () {
                    self.initFlyoutEvents();
                }, 10);
                if (typeof Aimbase !== 'undefined') {
                    if (Aimbase && Aimbase.Analytics && Aimbase.Analytics.SendPageAction) {
                        Aimbase.Analytics.SendPageAction('Pre-Order', 'Flyout', 'view', { 'PageAction': '50d1c736-ad09-424a-af51-09b45b33af81' });
                    }
                }
            }

            rq('.rollick-form-kit-select').on('change', function () {
                rollick.vehicle.image = rollick.vehicle.originalImage;
                rollick.vehicle.kit = rq('.rollick-form-kit-select').val() || '';
                rollick.preorder.validateVehicleSelection();
            });

            if (options.dealerid) {
                sessionStorage['rollick-dealer-id'] = options.dealerid;
                rq('.rollick-specific-dealer-selected').removeClass('rollick-hidden');
                rq('.rollick-specific-dealer-not-selected').addClass('rollick-hidden');
                rollick.dealerDisplayDealer();
            }

            if (options.dealer) rollick.dealerDisplayDealer();

            if (options.country) {
                rollick.cart.country = options.country;
            }

            // set screens
            rq('.rollick-form-fields').css('overflow', 'auto');
            if (rq('.rollick-form-fields').length) rq('.rollick-form-fields')[0].scrollTop = 0;

            // tracking
            if (typeof Aimbase !== 'undefined') {
                if (Aimbase && Aimbase.Analytics && Aimbase.Analytics.AddListener) {
                    if (rq('.rollick-form-submit').length) Aimbase.Analytics.AddListener(rq('.rollick-form-submit')[0], 'Submit', 'click', { 'PageAction': 'bc96b92b-fadb-44c8-a570-24e182d79216' });
                }
            }

            if (!sessionStorage['rollick-dealer-id']) {
                rq('.rollick-form-preorder').addClass('rollick-hidden');
            }
        });
        return;
    },

    initFullPageEvents() {
        var self = this;
        rq('.rollick-form').addClass('tray--active');
        var models = self.availableModels.summary.slice();
        var activeIndex = -1;
        if (models.length > 1) rq('.rollick-carousel-model-nav').removeClass('rollick-hidden');
        var carousel = rq('.carousel-model');
        carousel.empty();
        var vehicles = '';
        for (var i = 0; i < models.length; i++) {
            vehicles += '<div class="item' + (i == 0 ? ' active"' : '"') + ' style="background-image: url(' + models[i].image + ')"></div>';
        }
        carousel.html(vehicles);
        rq('.rollick-multiple-models .carousel-next').off('click').on('click', { d: 'n' }, rotateModel);
        rq('.rollick-multiple-models .carousel-prev').off('click').on('click', { d: 'p' }, rotateModel);
        rq('.rollick-multiple-models .carousel-show-skus').off('click').on('click', function () {
            rq('.rollick-blurb').text('Please select your trim and accessory package.');
            showSkus();
        });
        if (models.length) {
            activeIndex = 0;
            if (rollick.cart.country == 'CA') {
                rq('.rollick-multiple-models .rollick-vehicle-msrp-usd').addClass('rollick-hidden');
                rq('.rollick-multiple-models .rollick-vehicle-msrp-cad').removeClass('rollick-hidden');
            } else {
                rq('.rollick-multiple-models .rollick-vehicle-msrp-usd').removeClass('rollick-hidden');
                rq('.rollick-multiple-models .rollick-vehicle-msrp-cad').addClass('rollick-hidden');
            }
            rq('.rollick-multiple-models .carousel-status').html('<h4>' + models[0].model + '</h4>');
            if (models[0].sale) {
                rq('.rollick-multiple-models .rollick-vehicle-msrp-usd .rollick-original-price').removeClass('rollick-invisible');
                rq('.rollick-multiple-models .rollick-vehicle-msrp-cad .rollick-original-price').removeClass('rollick-invisible');
                rq('.rollick-multiple-models .rollick-vehicle-msrp-usd .meta--price__value').text(self.formatCurrency(models[0].sale, '$'));
                rq('.rollick-multiple-models .rollick-vehicle-msrp-cad .meta--price__value').text(self.formatCurrency(models[0].sale, '$'));
                rq('.rollick-multiple-models .rollick-vehicle-msrp-usd .vehicle-marquee__price__original-price__value').text(self.formatCurrency(models[0].msrp, '$'));
                rq('.rollick-multiple-models .rollick-vehicle-msrp-cad .vehicle-marquee__price__original-price__value').text(self.formatCurrency(models[0].msrp, '$'));
            } else {
                rq('.rollick-multiple-models .rollick-vehicle-msrp-usd .rollick-original-price').addClass('rollick-invisible');
                rq('.rollick-multiple-models .rollick-vehicle-msrp-cad .rollick-original-price').addClass('rollick-invisible');
                rq('.rollick-multiple-models .rollick-vehicle-msrp-usd .meta--price__value').text(self.formatCurrency(models[0].msrp, '$'));
                rq('.rollick-multiple-models .rollick-vehicle-msrp-cad .meta--price__value').text(self.formatCurrency(models[0].msrp, '$'));
            }
        }

        function rotateModel(e) {
            var items = carousel.find('.item');
            for (var i = 0; i < items.length; i++) {
                if (rq(items[i]).hasClass('active')) activeIndex = i;
            }
            if (e.data.d == 'n') {
                activeIndex++;
                if (activeIndex >= items.length) activeIndex = 0;
            }
            if (e.data.d == 'p') {
                activeIndex--;
                if (activeIndex < 0) activeIndex = items.length - 1;
            }
            items.removeClass('active');
            rq(items[activeIndex]).addClass('active');
            rq('.rollick-multiple-models .carousel-status').html('<h4>' + models[activeIndex].model + '</h4>');
            rq('.rollick-multiple-models .rollick-vehicle-msrp-usd .meta--price__value').text(self.formatCurrency(models[activeIndex].msrp, '$'));
            rq('.rollick-multiple-models .rollick-vehicle-msrp-cad .meta--price__value').text(self.formatCurrency(models[activeIndex].msrp, '$'));
            if (models[activeIndex].sale) {
                rq('.rollick-multiple-models .rollick-vehicle-msrp-usd .rollick-original-price').removeClass('rollick-invisible');
                rq('.rollick-multiple-models .rollick-vehicle-msrp-cad .rollick-original-price').removeClass('rollick-invisible');
                rq('.rollick-multiple-models .rollick-vehicle-msrp-usd .meta--price__value').text(self.formatCurrency(models[activeIndex].sale, '$'));
                rq('.rollick-multiple-models .rollick-vehicle-msrp-cad .meta--price__value').text(self.formatCurrency(models[activeIndex].sale, '$'));
                rq('.rollick-multiple-models .rollick-vehicle-msrp-usd .vehicle-marquee__price__original-price__value').text(self.formatCurrency(models[activeIndex].msrp, '$'));
                rq('.rollick-multiple-models .rollick-vehicle-msrp-cad .vehicle-marquee__price__original-price__value').text(self.formatCurrency(models[activeIndex].msrp, '$'));
            } else {
                rq('.rollick-multiple-models .rollick-vehicle-msrp-usd .rollick-original-price').addClass('rollick-invisible');
                rq('.rollick-multiple-models .rollick-vehicle-msrp-cad .rollick-original-price').addClass('rollick-invisible');
                rq('.rollick-multiple-models .rollick-vehicle-msrp-usd .meta--price__value').text(self.formatCurrency(models[activeIndex].msrp, '$'));
                rq('.rollick-multiple-models .rollick-vehicle-msrp-cad .meta--price__value').text(self.formatCurrency(models[activeIndex].msrp, '$'));
            }
        }

        function showSkus() {
            var vehicleName = models[activeIndex].model;
            self.vehiclesRemaining = self.availableModels.models.slice().filter(function (vehicle) { return vehicle.vehicleName.toLowerCase() == vehicleName.toLowerCase(); });
            rq('.rollick-multiple-skus').removeClass('rollick-hidden');
            rq('.rollick-multiple-models').addClass('rollick-hidden');
            rq('.container')[0].scrollIntoView(true);
            self.initSkuCarousel();
            self.validateVehicleSelection();
            rollick.dealerInit();
        }
    },

    initFlyoutEvents() {
        var self = this;
        rq('.rollick-form').addClass('tray--active');
        self.initSkuCarousel();
        rq('.rollick-form-fields').show();
        self.validateVehicleSelection();
        rollick.dealerInit();
        if (self.vehiclesRemaining.length == 1) {
            rq('.rollick-carousel-header').addClass('rollick-hidden');
        }
    },

    initSkuCarousel() {
        var self = this;
        var skus = self.vehiclesRemaining;
        rq('.rollick-multiple-skus').removeClass('rollick-hidden');
        if (skus.length > 1) rq('.rollick-multiple-skus .rollick-carousel-nav').removeClass('rollick-hidden');
        else rq('.rollick-multiple-skus .rollick-carousel-nav').addClass('rollick-hidden');
        var carousel = rq('.carousel-sku');
        carousel.empty();
        var vehicles = '';
        for (var i = 0; i < skus.length; i++) {
            vehicles += '<div class="item' + (i == 0 ? ' active"' : '"') + ' style="background-image: url(' + skus[i].image + ')"></div>';
        }
        carousel.html(vehicles);
        rollick.vehicle = skus[0];
        if (rollick.vehicle) rollick.vehicle.originalImage = rollick.vehicle.image;
        rq('.rollick-multiple-skus .carousel-status').text('1 of ' + skus.length);
        self.loadKits(skus[0]);
        rq('.rollick-multiple-skus .carousel-next').off('click').on('click', { d: 'n' }, rotate);
        rq('.rollick-multiple-skus .carousel-prev').off('click').on('click', { d: 'p' }, rotate);

        /* Can't support touchmoves yet because it will prevent scrolling
        rq('.rollick-multiple-skus')
            .on('mousedown touchstart', function (e) {
                self.xDown = e.pageX;
                self.yDown = e.pageY;
            })
            .on('mouseup touchend', function (e) {
                self.xUp = e.pageX;
                self.yUp = e.pageY;
                if (self.xDown != self.xUp || self.yDown != self.yUp) {
                    if (self.xDown > self.xUp && (self.xDown - self.xUp) > (self.yDown - self.yUp)) {
                        rq('.carousel-next').click();
                    } else {
                        rq('.carousel-prev').click();
                    }
                }
            });
        */

        function rotate(e) {
            var items = carousel.find('.item');
            var activeIndex = -1;
            for (var i = 0; i < items.length; i++) {
                if (rq(items[i]).hasClass('active')) activeIndex = i;
            }
            if (e.data.d == 'n') {
                activeIndex++;
                if (activeIndex >= items.length) activeIndex = 0;
            }
            if (e.data.d == 'p') {
                activeIndex--;
                if (activeIndex < 0) activeIndex = items.length - 1;
            }
            items.removeClass('active');
            rq(items[activeIndex]).addClass('active');
            rq('.rollick-multiple-skus .carousel-status').text((activeIndex + 1) + ' of ' + skus.length);
            var sku = skus[activeIndex];
            rollick.vehicle = sku;
            rollick.vehicle.originalImage = rollick.vehicle.image;
            self.loadKits(sku);
            self.validateVehicleSelection();
        }
    },

    backToModels() {
        rq('.rollick-blurb').text('To get started, please select your model of interest.');
        rq('.rollick-multiple-skus').addClass('rollick-hidden');
        rq('.rollick-multiple-models').removeClass('rollick-hidden');
        rq('.container')[0].scrollIntoView(true);
    },

    dealerLoad() {
        var self = this;
        var currentSelectedDealerId = rq('#rollick-specific-dealer-id').val() || '';
        if (!rollick.brandCode && rollick.siteId) rollick.brandCode = rollick.siteId;
        var country = rq('.rollick-form-country-select').val() || 'US';
        var brand = 'ARC';
        var vtype = 'Snow';
        rollick.brandCode = brand;
        try { rq('#rollick-specific-dealer').typeahead('destroy'); } catch (e) { }
        rq('#rollick-specific-dealer').attr('placeholder', 'Loading Dealers...').prop('disabled', true);
        rq.post(rollick.widget + '/aimbase-list-dealers', { countryCode: country, brandCode: brand }, function (data) {
            self.dealersList = JSON.parse(JSON.stringify(data));
            self.dealers = new Bloodhound({
                datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name'),
                queryTokenizer: Bloodhound.tokenizers.whitespace,
                identify: function (obj) { return obj.name; },
                local: self.dealersList
            });

            rq('#rollick-specific-dealer').attr('placeholder', 'Search For Dealer').prop('disabled', false);
            rq('#rollick-specific-dealer').typeahead({
                minLength: 0,
                highlight: true
            },
                {
                    name: 'dealers',
                    display: 'name',
                    source: self.dealers,
                    limit: 10,
                    templates: {
                        suggestion: function (data) {
                            return '<div class="rollick-form-submit">' + data.name + ' | ' + data.city + ' ' + data.state + '</div>';
                        }
                    }
                }
            ).on('change blur', function () {
                rq('.rollick-specific-dealer-error').addClass('rollick-hidden');
                var match = false;
                var dealerName = rq('#rollick-specific-dealer').val().trim();
                if (rq('#rollick-dealer-choice-customer').is(':checked')) {
                    rq('#rollick-specific-dealer-id').val('');
                    rq('#rollick-specific-dealer-name').val('');
                }
                if (dealerName) {
                    rq.each(self.dealers.index.datums, function (i, item) {
                        if (dealerName == item.name) {
                            rq('#rollick-specific-dealer-id').val(item.id);
                            rq('#rollick-specific-dealer-name').val(item.name);
                            rq('#rollick-specific-dealer').typeahead('val', item.name);
                            match = true;
                        }
                    });
                    if (!match) {
                        rq.each(self.dealers.index.datums, function (i, item) {
                            if (dealerName.toLowerCase() == item.name.toLowerCase()) {
                                rq('#rollick-specific-dealer-id').val(item.id);
                                rq('#rollick-specific-dealer-name').val(item.name);
                                rq('#rollick-specific-dealer').typeahead('val', item.name);
                                match = true;
                            }
                        });
                    }
                    if (match) {
                        rq('#rollick-dealer-choice-customer').prop('checked', true);
                        rq('.rollick-preorder-specific-dealer-error').addClass('rollick-hidden');
                    } else {
                        rq('.rollick-preorder-specific-dealer-error').removeClass('rollick-hidden');
                    }
                }
                self.validateForm();
            });
            rq('#rollick-specific-dealer').off('typeahead:selected typeahead:autocompleted').on('typeahead:selected typeahead:autocompleted', function (e, datum) {
                rq('#rollick-specific-dealer-id').val(datum.id);
                rq('#rollick-specific-dealer-name').val(datum.name);
                rq('#rollick-specific-dealer').typeahead('val', datum.name);
                rq('#rollick-dealer-choice-customer').prop('checked', true);
                rq(e.target).blur();
                rq('#rollick-specific-dealer').removeClass('error');
                self.validateForm();
            });
            if (sessionStorage['rollick-dealer-id']) {
                var matchedDealer = self.dealersList.filter(function (dealer) {
                    return dealer.id.toLowerCase() == sessionStorage['rollick-dealer-id'].toLowerCase();
                }).pop();
                if (matchedDealer) {
                    rollick.cart.dealerId = sessionStorage['rollick-dealer-id'];
                    rollick.cart.dealerName = matchedDealer.name;
                    rq('.rollick-specific-dealer-label').text(matchedDealer.name);
                } else {
                    rq('.rollick-specific-dealer-label').text(sessionStorage['rollick-dealer-id']);
                    rollick.cart.dealerId = sessionStorage['rollick-dealer-id'];
                    rollick.cart.dealerName = sessionStorage['rollick-dealer-id'];
                }
            }
        }, 'json');
    },

    validateVehicleSelection() {
        var self = this;
        var kit = rq('.rollick-form-kit-select').val() || '';
        var isVehicleSelected = (rollick.vehicle && rollick.vehicle.mfgModelCode);

        // rq('.rollick-vehicle-deposit').removeClass('rollick-hidden');
        // rq('.rollick-preorder-disclaimer').removeClass('rollick-hidden');
        // rq('.rollick-deposit-amount').text('$' + rollick.vehicleParams.deposit);

        if (isVehicleSelected) {
            var accessoriesMSRP = 0;
            var kitMSRPUSD = 0;
            var kitMSRPCAD = 0;
            var kitSaleUSD = 0;
            var kitSaleCAD = 0;
            if (rollick.accessories && rollick.accessories.length) {
                rollick.accessories.forEach(function (acc) { accessoriesMSRP += parseFloat(acc.cost); });
            }
            if (kit && rollick.vehicle.hasKits) {
                rq.each(rollick.vehicle.kits, function (key, item) {
                    if (item.part.toLowerCase() == kit.toLowerCase() || item.item.toLowerCase() == kit.toLowerCase()) {
                        kitMSRPUSD = item.msrpUSD;
                        kitMSRPCAD = item.msrpCAD;
                        kitSaleUSD = item.saleUSD || 0;
                        kitSaleCAD = item.saleCAD || 0;
                        if (item.image && (item.image || '').trim().length) {
                            rollick.vehicle.image = item.image.trim();
                        }
                    }
                });
            }
            var priceUSD = (rollick.vehicle.msrpUSD + (rollick.vehicle.colorAdditionalUSD || 0) + kitMSRPUSD + accessoriesMSRP);
            var priceCAD = (rollick.vehicle.msrpCAD + (rollick.vehicle.colorAdditionalCAD || 0) + kitMSRPCAD + accessoriesMSRP);
            var originalUSD = priceUSD;
            var originalCAD = priceCAD;
            if (rollick.vehicle.saleUSD) {
                priceUSD = (rollick.vehicle.saleUSD + (rollick.vehicle.colorAdditionalUSD || 0) + (kitSaleUSD || kitMSRPUSD) + accessoriesMSRP);
            }
            if (rollick.vehicle.saleCAD) {
                priceCAD = (rollick.vehicle.saleCAD + (rollick.vehicle.colorAdditionalCAD || 0) + (kitSaleCAD || kitMSRPCAD) + accessoriesMSRP);
            }

            if (rollick.cart && rollick.cart.country == 'CA') {
                rq('.rollick-vehicle-msrp-usd').addClass('rollick-hidden');
                rq('.rollick-vehicle-msrp-cad').removeClass('rollick-hidden');
            } else {
                rq('.rollick-vehicle-msrp-usd').removeClass('rollick-hidden');
                rq('.rollick-vehicle-msrp-cad').addClass('rollick-hidden');
            }

            rq('.carousel-modelName').html('<div><h5>' + rollick.vehicle.modelName + '</h5></div>');
            rq('.carousel-model-details').html(rollick.generateVehicleDetailsHtml(rollick.vehicle));

            rq('.rollick-vehicle-msrp-usd .meta--price__value').text(self.formatCurrency(priceUSD, '$'));
            rq('.rollick-vehicle-msrp-cad .meta--price__value').text(self.formatCurrency(priceCAD, '$'));
            if (rollick.vehicle.saleUSD) {
                rq('.rollick-vehicle-msrp-usd .vehicle-marquee__price__original-price__value').text(self.formatCurrency(originalUSD, '$'));
                rq('.rollick-vehicle-msrp-usd .rollick-original-price').removeClass('rollick-invisible');
            } else {
                rq('.rollick-vehicle-msrp-usd .rollick-original-price').addClass('rollick-invisible');
            }
            if (rollick.vehicle.saleCAD) {
                rq('.rollick-vehicle-msrp-cad .vehicle-marquee__price__original-price__value').text(self.formatCurrency(originalCAD, '$'));
                rq('.rollick-vehicle-msrp-cad .rollick-original-price').removeClass('rollick-invisible');
            } else {
                rq('.rollick-vehicle-msrp-cad .rollick-original-price').addClass('rollick-invisible');
            }
            if (rollick.vehicle.deposit) {
                rq('.rollick-deposit').removeClass('rollick-invisible').html('<h6>' + self.formatCurrency(rollick.vehicle.deposit, '$') + ' PRE-ORDER DEPOSIT REQUIRED</h6>');
            } else {
                rq('.rollick-deposit').addClass('rollick-invisible');
            }

            var vehicleImage = rollick.vehicle.image;
            if (rollick.accessories && rollick.accessories.length) {
                rq('.rollick-accessories-detail').removeClass('rollick-hidden');
                rq('.rollick-vehicle-kit').addClass('rollick-hidden');
                var html = '<h6>Configured Accessories</h6>';
                var kitDetails = '';
                for (var i = 0; i < rollick.accessories.length; i++) {
                    var acc = rollick.accessories[i];
                    if (acc.isKit) {
                        kitDetails = acc.item + ' (+' + acc.cost + ')';
                    } else {
                        var info = '';
                        if (acc.cost) info += '(+' + acc.cost + '';
                        if (acc.text) {
                            if (info) info += ', ';
                            else info += '(';
                            info += acc.text;
                        }
                        if (info) info += ')';
                        html += '<div>' + acc.item + ' ' + info + '</div>';
                    }
                }
                html += '<div class="rollick-mt">' + self.accessoryDisclaimer + '</div>';
                if (rollick.vehicleImage) {
                    vehicleImage = rollick.vehicleImage;
                    rollick.vehicle.image = vehicleImage;
                }
                rq('.rollick-accessories-detail').html(html);
                if (rollick.vehicle.kit) {
                    var kitHtml = '<h6>Accessory Package</h6><div>' + rollick.vehicle.kit + '</div>';
                    rq('.rollick-kit-detail').html(kitHtml).removeClass('rollick-hidden');
                }
                if (kitDetails) {
                    var kitHtml = '<h6>Accessory Package</h6><div>' + kitDetails + '</div>';
                    rq('.rollick-kit-detail').html(kitHtml).removeClass('rollick-hidden');
                }
            }

            rq('.rollick-multiple-skus .rollick-carousel .item.active').css('background-image', 'url(' + vehicleImage + ')');
        }
    },

    getAccessoriesHash(accessories) {
        var hash = '';
        try {
            if (accessories && accessories.length) {
                var items = [];
                for (var i = 0; i < accessories.length; i++) {
                    if (accessories[i].item) {
                        items.push(accessories[i].item.toLowerCase());
                    }
                }
                items.sort();
                hash = rollick.simpleHash(items.join(''));
            }
        } catch (e) {
        }
        return hash;
    },

    formatCurrency(x, symbol) {
        x = (x || 0).toFixed(0);
        return (symbol || '') + ('' + x).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
    },

    getVehicle(modelNumber, color) {
        var vehicle = null;
        if (rollick.vehicles) {
            vehicle = rollick.vehicles.filter(function (veh) {
                return veh.mfgModelCode && veh.mfgModelCode.toLowerCase() == modelNumber.toLowerCase();
            }).pop();
            if (color) {
                vehicle = rollick.vehicles.filter(function (veh) {
                    return veh.mfgModelCode && veh.mfgModelCode.toLowerCase() == modelNumber.toLowerCase() && veh.color.toLowerCase() == color.toLowerCase();
                }).pop();
            }
            if (!vehicle) {
                vehicle = rollick.vehicles.filter(function (veh) {
                    return veh.hasKits && veh.kits.filter(function (kit) { return kit.mfgModelCode.toLowerCase() == modelNumber.toLowerCase(); }).pop();
                }).pop();
            }
        }
        return vehicle;
    },

    attachEvents() {
        var self = this;
        rq(self.form_firstName)
            .add(self.form_lastName)
            .add(self.form_email)
            .add(self.form_phone)
            .add(self.form_address)
            .add(self.form_city)
            .add(self.form_postalCode)
            .add('.rollick-form-comment-value')
            .unbind('blur').on('blur', function () {
                rollick.sanitize(rq(this));
                rq(self.form_address).val(rollick.titleCase(rq(self.form_address).val()));
                rq(self.form_city).val(rollick.titleCase(rq(self.form_city).val()));
                self.validateForm();
            }).unbind('focus').on('focus', function () {
                rollick.clearBorder(this);
            }).unbind('input').on('input', function () {
                self.validateForm();
            });
        rq(self.form_postalCode).on('change', function () {
            if (rq('#rollick-dealer-choice-closest').is(':checked')) {
                self.findClosestDealer(rq(self.form_postalCode).val());
            }
            self.validateForm();
        });
        rq(self.form_phone).on('input', function (e) {
            var x = e.target.value.replace(/\D/g, '').match(/(\d{0,3})(\d{0,3})(\d{0,4})/);
            e.target.value = !x[2] ? x[1] : '(' + x[1] + ') ' + x[2] + (x[3] ? '-' + x[3] : '');
        });
        var country = (rollick.cart && rollick.cart.country) || 'US';
        // load states/provinces
        rq(self.form_state).empty();
        rq(self.form_state).append(rq('<option></option>').attr('value', '').text(''));
        for (var i = 0; i < self.states[country].length; i++) {
            var state = self.states[country][i];
            rq(self.form_state).append(rq('<option></option>').attr('value', state.value).text(state.name));
        }
        rq(self.form_state).on('focus', function () {
            rq(self.form_state).attr('visited', true);
        });
        rq(self.form_state).on('blur', function () {
            self.validateForm();
        });
        rq(self.form_state).off('change').on('change', function () {
            var choice = rq('.rollick-form-state-value option:selected').val();
            if (!choice) {
                rq(self.form_state).parent().addClass('form-item--error');
                rq(self.form_state).addClass('error');
            } else {
                rq(self.form_state).parent().removeClass('form-item--error');
                rq(self.form_state).removeClass('error');
            }
            self.validateForm();
        });
        if (country == 'CA') {
            rq('.rollick-form-state-label').text('Province');
            rq('.rollick-invalid-state').text('Invalid province');
            rq(self.form_postalCode).attr('maxlength', 7);
            rq('.rollick-form-postal-code-label').text('Postal Code');
            rq('.rollick-invalid-postal').text('Invalid postal code');
            rq(self.form_postalCode).on('input', function (e) {
                var pc = e.target.value.toUpperCase().replace(/\ /g, '');
                var caTest = /[a-zA-Z][0-9][a-zA-Z][0-9][a-zA-Z][0-9]/;
                e.target.value = pc;
                if (caTest.test(pc)) {
                    rq('.rollick-invalid-postal').addClass('rollick-hidden');
                    e.target.value = pc.substring(0, 3) + ' ' + pc.substring(3, 6);
                    if (/Edge/.test(navigator.userAgent) && e.target.value.length == 7) rq(e.target).change();
                }
                if (!e.target.value) rq('.rollick-invalid-postal').addClass('rollick-hidden');
            });
        } else {
            rq(self.form_postalCode).on('input', function (e) {
                var x = e.target.value.replace(/\D/g, '').match(/(\d{0,5})/);
                e.target.value = x[1];
                if (!e.target.value) rq('.rollick-invalid-postal').addClass('rollick-hidden');
                if (x[1].length == 5) rq('.rollick-invalid-postal').removeClass('rollick-hidden');
            });
        }

        rq('#rollick-dealer-choice-closest').on('change', function () {
            rq('#rollick-specific-dealer').removeClass('error');
            if (rq(self.form_postalCode).val()) {
                self.findClosestDealer(rq(self.form_postalCode).val());
            }
            self.validateForm();
        });

        // set dealer selection
        if (Cookies.get('rollick-default-dealer-id') || rollick.cart.leadUid) {
            rq('.rollick-specific-dealer-label').text(Cookies.get('rollick-default-dealer-name'));
            rq('.rollick-specific-dealer-selected').removeClass('rollick-hidden');
            rq('.rollick-customer-choice-dealer').addClass('rollick-hidden');
            rq('.rollick-customer-choice-custom').addClass('rollick-hidden');
            rq('.rollick-dealer-typeahead').addClass('rollick-hidden');
        } else if (sessionStorage['rollick-dealer-id']) {
            var dealerName = '...';
            rq('.rollick-specific-dealer-label').text(dealerName);
            rq('.rollick-specific-dealer-selected').removeClass('rollick-hidden');
            rq('.rollick-customer-choice-dealer').addClass('rollick-hidden');
            rq('.rollick-customer-choice-custom').addClass('rollick-hidden');
            rq('.rollick-dealer-typeahead').addClass('rollick-hidden');
            self.dealerLoad();
        } else {
            rq('.rollick-specific-dealer-selected').addClass('rollick-hidden');
            rq('.rollick-customer-choice-dealer').removeClass('rollick-hidden');
            rq('.rollick-customer-choice-custom').removeClass('rollick-hidden');
            rq('.rollick-dealer-typeahead').removeClass('rollick-hidden');
            self.dealerLoad();
        }
        if (rq('#rollick-specific-dealer').is(':visible')) {
            var selectedDealer = rq('#rollick-specific-dealer').val().trim();
            if (selectedDealer == '') {
                rq('#rollick-specific-dealer-id').val('');
                rq('#rollick-specific-dealer-name').val('');
            } else {
                if (rollick.dealersList && rollick.dealersList.length) {
                    var bMatched = false;
                    rq.each(rollick.dealersList, function (key, item) {
                        if (!bMatched && item.name == selectedDealer) {
                            rq('#rollick-specific-dealer-id').val(item.id);
                            rq('#rollick-specific-dealer-name').val(item.name);
                            bMatched = true;
                        }
                    });
                    if (!bMatched) {
                        rq.each(rollick.dealersList, function (key, item) {
                            if (!bMatched && item.name.toLowerCase() == selectedDealer.toLowerCase()) {
                                rq('#rollick-specific-dealer-id').val(item.id);
                                rq('#rollick-specific-dealer-name').val(item.name);
                                bMatched = true;
                            }
                        });
                    }
                    if (!bMatched) {
                        rq('#rollick-specific-dealer-id').val('');
                        rq('#rollick-specific-dealer-name').val('');
                    }
                } else {
                    rq('#rollick-specific-dealer-id').val('');
                    rq('#rollick-specific-dealer-name').val('');
                }
            }
        }
        rq('#rollick-dealer-choice-customer').off('click').on('click', function () {
            rq('#rollick-specific-dealer').focus();
            if (!rq('#rollick-specific-dealer').val()) {
                rq('#rollick-specific-dealer-id').val('');
                rq('#rollick-specific-dealer-name').val('');
            }
            self.validateForm();
        });

        rq('#rollick-dealer-code').off('blur').on('blur', function () {
            self.validateForm();
        });
    },

    validateForm() {
        var self = this;
        if (!rq(self.form_firstName).length) return;
        var fn = rq(self.form_firstName).val();
        var ln = rq(self.form_lastName).val();
        var e = rq(self.form_email).val().trim();
        var addr = rq(self.form_address).val();
        var city = rq(self.form_city).val();
        var state = rq('.rollick-form-state-value option:selected').val();
        var pc = rq(self.form_postalCode).val().trim();
        var phone = rq(self.form_phone).val().trim();
        var country = (rollick.cart && rollick.cart.country) || 'US';

        var isValidEmail = (/^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/).test(e.toLowerCase());
        var isValidPhone = (phone.length == 14);
        var isValidPostalCode = false;
        var isValidPaymentInfo = true;
        var isDealerValid = true;

        if (country == 'US') {
            isValidPostalCode = (pc.length == 5);
        } else if (country == 'CA') {
            isValidPostalCode = (pc.length == 7);
        }

        rollick.checkRequired(fn, self.form_firstName);
        rollick.checkRequired(ln, self.form_lastName);
        rollick.checkRequired(e, self.form_email);
        rollick.checkRequired(addr, self.form_address);
        rollick.checkRequired(city, self.form_city);
        rollick.checkRequired(pc, self.form_postalCode);
        rollick.checkRequired(phone, self.form_phone);

        if (fn) {
            if (fn.length > 1) {
                rq(self.form_firstName).val(fn.substring(0, 1).toUpperCase() + fn.substring(1));
            } else {
                rq(self.form_firstName).val(fn.toUpperCase());
            }
        }
        if (ln) {
            if (ln.length > 1) {
                rq(self.form_lastName).val(ln.substring(0, 1).toUpperCase() + ln.substring(1));
            } else {
                rq(self.form_lastName).val(ln.toUpperCase());
            }
        }

        if (!state && rq(self.form_state)[0].hasAttribute('visited')) {
            rq(self.form_state).parent().addClass('form-item--error');
            rq(self.form_state).addClass('error');
        } else {
            rq(self.form_state).parent().removeClass('form-item--error');
            rq(self.form_state).removeClass('error');
        }

        rq('#rollick-specific-dealer').removeClass('error');
        if (rq('#rollick-dealer-choice-customer').is(':checked')) {
            if (!rq('#rollick-specific-dealer').val() || !rq('#rollick-specific-dealer-id').val()) {
                rq('#rollick-specific-dealer').addClass('error');
                isDealerValid = false;
            }
        }

        if (!pc) {
            if (!fn || !ln || !e || !phone || !addr || !city || !state || !country || !isValidEmail || !isValidPhone || !isValidPostalCode || !isValidPaymentInfo || !isDealerValid) {
                rq('.rollick-form-submit').addClass('disabled');
                rq('.rollick-form-payment').addClass('disabled');
            } else {
                rq('.rollick-form-submit').removeClass('disabled');
                rq('.rollick-form-payment').removeClass('disabled');
            }
            rq('.rollick-invalid-postal').addClass('rollick-hidden');
        } else {
            if (!isValidPostalCode) {
                rq('.rollick-form-submit').addClass('disabled');
                rq('.rollick-form-payment').addClass('disabled');
                rq('.rollick-invalid-postal').removeClass('rollick-hidden');
            } else {
                rollick.validateZip(pc, function (isValidZip) {
                    isValidPostalCode = isValidZip;
                    if (!isValidZip) {
                        rq('.rollick-invalid-postal').removeClass('rollick-hidden');
                    } else {
                        rq('.rollick-invalid-postal').addClass('rollick-hidden');
                    }
                    if (!fn || !ln || !e || !phone || !addr || !city || !state || !country || !isValidEmail || !isValidPhone || !isValidPostalCode || !isDealerValid) {
                        rq('.rollick-form-submit').addClass('disabled');
                        rq('.rollick-form-payment').addClass('disabled');
                    } else {
                        rq('.rollick-form-submit').removeClass('disabled');
                        rq('.rollick-form-payment').removeClass('disabled');
                    }
                });
            }
        }

        if (e) {
            if (!isValidEmail) {
                rq('.rollick-invalid-email').removeClass('rollick-hidden');
            } else {
                rq('.rollick-invalid-email').addClass('rollick-hidden');
            }
        } else {
            rq('.rollick-invalid-email').addClass('rollick-hidden');
        }

        if (phone) {
            if (!isValidPhone) {
                rq('.rollick-invalid-phone').removeClass('rollick-hidden');
            } else {
                rq('.rollick-invalid-phone').addClass('rollick-hidden');
            }
        } else {
            rq('.rollick-invalid-phone').addClass('rollick-hidden');
        }

        if (rq('#rollick-dealer-code').val()) {
            var currentStatus = !rq('.rollick-form-payment').hasClass('disabled');
            rq('.rollick-form-payment').addClass('disabled');
            self.validateOrderCode(rq('#rollick-dealer-code').val()).then((isOrderCodeValid) => {
                if (!isOrderCodeValid) {
                    rq('.rollick-invalid-order-code').removeClass('rollick-hidden');
                }
                if (isOrderCodeValid && currentStatus) {
                    rq('.rollick-invalid-order-code').addClass('rollick-hidden');
                    rq('.rollick-form-payment').removeClass('disabled');
                }
            });
        } else {
            rq('.rollick-invalid-order-code').addClass('rollick-hidden');
        }
    },

    getFormData() {
        var self = this;
        var data = {};
        if (!self.getCartCount()) return null; // no item in cart
        var selectedDealer = rq('#rollick-specific-dealer').val().trim();
        if (rq('#rollick-dealer-choice-customer').is(':checked')) {
            if (selectedDealer == '') {
                rq('#rollick-specific-dealer-id').val('');
                rq('#rollick-specific-dealer-name').val('');
            } else {
                if (self.dealersList && self.dealersList.length) {
                    var bMatched = false;
                    rq.each(self.dealersList, function (key, item) {
                        if (!bMatched && item.name.toLowerCase() == selectedDealer.toLowerCase()) {
                            rq('#rollick-specific-dealer-id').val(item.id);
                            rq('#rollick-specific-dealer-name').val(item.name);
                            bMatched = true;
                        }
                    });
                    if (!bMatched) {
                        rq('#rollick-specific-dealer-id').val('');
                        rq('#rollick-specific-dealer-name').val('');
                    }
                } else {
                    rq('#rollick-specific-dealer-id').val('');
                    rq('#rollick-specific-dealer-name').val('');
                }
            }
        }
        if (typeof Aimbase !== 'undefined') {
            if (Aimbase && Aimbase.Analytics) {
                var fn = rq(self.form_firstName).val();
                var ln = rq(self.form_lastName).val();
                var e = rq(self.form_email).val();
                var addr = rq(self.form_address).val();
                var city = rq(self.form_city).val();
                var pc = rq(self.form_postalCode).val();
                var state = rq('.rollick-form-state-value option:selected').val();
                var phone = rq(self.form_phone).val();
                var country = (rollick.cart && rollick.cart.country) || 'US';
                var comment = rq('.rollick-form-comment-value').val();
                var bfh = 'No';
                var submittedFrom = (window && window.location && (window.location.protocol + '//' + window.location.host + window.location.pathname));

                var dealerName = '';
                var dealerNumber = '';
                var dealerChoice = '';

                var cookieDealerId = Cookies.get('rollick-default-dealer-id');
                var cookieDealerName = Cookies.get('rollick-default-dealer-name');

                if (rollick.cart.dealerId) {
                    dealerChoice = 'PreSelect';
                    dealerNumber = rollick.cart.dealerId;
                    dealerName = rollick.cart.dealerName;
                } else if (cookieDealerId && cookieDealerName) {
                    dealerChoice = 'Cookie';
                    dealerNumber = cookieDealerId;
                    dealerName = cookieDealerName;
                } else if (rq('#rollick-dealer-choice-closest').is(':checked')) {
                    dealerChoice = 'Closest';
                    dealerName = rq('#rollick-specific-dealer-name').val().trim();
                    dealerNumber = rq('#rollick-specific-dealer-id').val().trim();
                } else if (rq('#rollick-dealer-choice-customer').is(':checked')) {
                    dealerChoice = 'Custom';
                    dealerName = rq('#rollick-specific-dealer-name').val().trim();
                    dealerNumber = rq('#rollick-specific-dealer-id').val().trim();
                }

                rollick.userId = Aimbase.Analytics.GetUserUid();
                rollick.sessionId = Aimbase.Analytics.GetSessionUid();
                rollick.source = Aimbase.Analytics.GetFieldValue('source') || 'Organic';
                rollick.campaign = Aimbase.Analytics.GetFieldValue('campaign') || '';

                data.s = 'oem-cart';
                data.uid = rollick.userId;
                data.sid = rollick.sessionId;
                data.source = rollick.source;
                data.campaign = rollick.campaign;
                data.type = 'Pre-Order';
                data.category = 'Arctic Cat Website';
                data.firstName = fn;
                data.lastName = ln;
                data.email = e;
                data.phone = phone;
                data.address = addr;
                data.city = city;
                data.state = state;
                data.postalCode = pc;
                data.countryCode = country;
                data.comment = comment;
                data.buyFromHome = (bfh == 'Yes');
                data.textronAccountNumber = rq('#rollick-dealer-code').val().trim();
                data.isDealerOrder = (data.textronAccountNumber.length > 0);
                data.optInListCode = data.textronAccountNumber.length == 0 ? "Pre-Order Arctic Cat Welcome to Cat's Pride" : "";
                data.cart = JSON.parse(JSON.stringify(rollick.cart.items));
                data.submittedFrom = submittedFrom;
                if (rollick.cart.leadUid) data.leadUid = rollick.cart.leadUid;

                if (rollick.paymentInfo) data.paymentInfo = rollick.paymentInfo;

                if (dealerNumber) {
                    data.partnerId = dealerNumber;
                    data.partnerName = dealerName;
                    data.partnerChoice = dealerChoice;
                    data.preselect = true;
                }

                if (rollick.siteId.toLowerCase() == 'ezg') {
                    data.category = 'E-Z-GO Website';
                    data.optInListCode = '';
                }

                data.optIn = false;
                if (rq('#rollick-optin').is(':checked')) {
                    data.optIn = true;
                    data.ip = rollick.ip;
                    data.optInDate = (new Date()).valueOf();
                    data.optInSource = 'Textron';
                    data.optInListCode = data.optInListCode.length ? data.optInListCode + ',' + 'NewsPromo' : 'NewsPromo';
                }
                if (rq('#rollick-ok').is(':checked')) {
                    data.textMe = 1;
                } else {
                    data.textMe = 0;
                }

                data.referrer = sessionStorage['rollick-referrer-value'];
                sessionStorage['rollick-fn'] = data.firstName;
                sessionStorage['rollick-ln'] = data.lastName;
                sessionStorage['rollick-e'] = data.email;
                sessionStorage['rollick-p'] = data.phone;
                sessionStorage['rollick-addr'] = data.address;
                sessionStorage['rollick-city'] = data.city;
                sessionStorage['rollick-state'] = data.state;
                sessionStorage['rollick-zip'] = data.postalCode;

                if (rollick.abandoned) data.abandoned = true;
            }
        }
        data.isOEMInventory = false;
        return data;
    },

    submitForm(closeAfter, skipTest) {
        // not verified yet
        var self = this;
        if (self.isFormSubmitted) {
            return true;
        }

        self.validateForm();
        if (rq('.rollick-form-submit').hasClass('disabled') && !rollick.abandoned) {
            return true;
        }
        // submit form
        rq('.rollick-form-submit').addClass('disabled');
        var data = self.getFormData();

        if (!skipTest) {
            self.endpointAvailable = false;
        }
        self.testEndpoint();
        if (!self.endpointAvailable) {
            rollick.showLoading();
            window.setTimeout(function () {
                if (window.console) console.warn('Attempting to reconnect...');
                self.submitForm(closeAfter, true);
            }, 1000);
            return;
        }
        if (data) self.isFormSubmitted = true;
        if (Object.keys(data).length && data.partnerId) {
            rollick.showLoading();
            var timeout = 30000;
            if (rollick.cart.items.length > 6) timeout = rollick.cart.items.length * 5000;
            let brandCode = '';
            try {
                brandCode = rollick.cart.items[0].data.brandCode;
            } catch (e) {
            }
            rq.ajax({
                url: rollick.validation + '/aimproxy',
                dataType: 'json',
                contentType: 'application/json;charset=utf-8',
                type: 'POST',
                data: JSON.stringify(data),
                timeout: timeout,
                success: function (resp) {
                    if (self.endpointTimer) window.clearInterval(self.endpointTimer);
                    rollick.hideLoading();
                    rollick.preorder.isFormSubmitted = false;
                    rollick.preorder.submitted = false;
                    rollick.preorder.orderId = '';
                    if (closeAfter) {
                        self.closeForm();
                    } else {
                        if (rollick.paymentInfo) {
                            // show cc receipt
                            rollick.paymentInfo.authCode = resp.authCode || '';
                            rollick.paymentInfo.orderId = resp.orderId || '';
                            if (rollick.paymentInfo.authCode) {
                                self.showReceipt(data.partnerName, rollick.paymentInfo, brandCode || '');
                            } else {
                                self.showCCFailure(rollick.deposit, rollick.paymentInfo, brandCode || '');
                            }
                        } else {
                            self.showCCFailure(rollick.deposit, rollick.paymentInfo, brandCode || '');
                        }
                        var vehicleModels = self.distinctModelsInCart();
                        if (vehicleModels.length && window.dataLayer) window.dataLayer.push({ event: 'custom.preOrderSubmission', 'custom.eventLabel': vehicleModels.join(", ") });
                    }
                },
                error: function (resp) {
                    rollick.hideLoading();
                    rollick.preorder.isFormSubmitted = false;
                    rollick.preorder.submitted = false;
                    rollick.preorder.orderId = '';
                    if (!closeAfter) {
                        alert('We have encountered an unexpected error. Please try again later.');
                        self.closeForm();
                    } else {
                        self.closeForm();
                    }
                    return false;
                }
            });
        } else {
            if (!closeAfter) {
                self.isFormSubmitted = false;
                self.submitted = false;
                alert('We are unable to process your request at this time. Please try again later.');
                self.validateForm();
            } else {
                self.closeForm();
            }
            return false;
        }
    },

    findClosestDealer(zip) {
        var self = this;
        if (!rollick.locateDealerBusy) {
            rq('.rollick-specific-dealer-error').addClass('rollick-hidden');
            rollick.locateDealerBusy = true;
            if (zip.length == 5 || zip.length == 7) {
                let brandCode = 'ARC';
                // try the first item in the cart
                try {
                    brandCode = rollick.cart.items[0].data.brandCode;
                } catch (e) {
                }
                rq.post(rollick.widget + '/aimbase-locate-dealer', { countryCode: rollick.cart.country, brandCode: brandCode, postalCode: zip }, function (data) {
                    if (data && data.id) {
                        rollick.cart.closestDealerId = data.id;
                        rollick.cart.closestDealerName = data.name;
                        rq('#rollick-specific-dealer-id').val(data.id);
                        rq('#rollick-specific-dealer-name').val(data.name);
                        rq('.rollick-closest-dealer').text(': ' + data.name).removeClass('rollick-hidden');
                    } else {
                        rollick.cart.closestDealerId = '';
                        rollick.cart.closestDealerName = '';
                        rq('#rollick-specific-dealer-id').val('');
                        rq('#rollick-specific-dealer-name').val('');
                        rq('.rollick-closest-dealer').text('').addClass('rollick-hidden');
                    }
                    rollick.locateDealerBusy = false;
                });
            } else {
                rollick.cart.closestDealerId = '';
                rollick.cart.closestDealerName = '';
                rq('#rollick-specific-dealer-id').val('');
                rq('#rollick-specific-dealer-name').val('');
                rq('.rollick-closest-dealer').text('').addClass('rollick-hidden');
                rollick.locateDealerBusy = false;
            }
        }
    },

    loadKits(sku) {
        var cbo = rq('#rollick-kit');
        var kitChoice = (rollick.vehicle ? rollick.vehicle.kit || '' : '');
        cbo.empty();
        var opt = rq('<option></option>').attr('value', '').text('None Selected');
        cbo.append(opt);
        var hasAccessories = (rollick.accessories && rollick.accessories.length > 0);
        if (sku && sku.hasKits) {
            for (var i = 0; i < sku.kits.length; i++) {
                var item = sku.kits[i];
                var text = item.item + ' (+';
                if (rollick.cart.country == 'CA') {
                    if (item.saleCAD) {
                        text += item.saleCAD.toString() + ', was +' + item.msrpCAD.toString();
                    } else {
                        text += item.msrpCAD.toString();
                    }
                } else {
                    if (item.saleUSD) {
                        text += item.saleUSD.toString() + ', was +' + item.msrpUSD.toString();
                    } else {
                        text += item.msrpUSD.toString();
                    }
                }
                text += ')';
                opt = rq('<option></option>').attr('value', item.part).text(text);
                if (item.part.toLowerCase() == (kitChoice || '').toLowerCase()) opt.attr('selected', 'selected');
                cbo.append(opt);
            }
            rq('.rollick-vehicle-kit').removeClass('rollick-invisible');
        } else {
            rq('.rollick-vehicle-kit').addClass('rollick-invisible');
        }
    },

    distinctModelsInCart() {
        var models = [];
        try {
            for (var i = 0; i < rollick.cart.items.length; i++) {
                var item = rollick.cart.items[i];
                var veh = this.getVehicle(item.modelNumber);
                if (veh && models.indexOf(veh.modelName) == -1) models.push(veh.modelName);
            }
        } catch (e) {
            console.warn(e);
        }
        return models;
    },

    async validateOrderCode() {
        var valid = false;
        var orderCode = rq('#rollick-dealer-code').val();
        try {
            valid = await rq.get(rollick.widget + '/carts/order-code/' + orderCode);
        } catch (e) {
        }
        if (!valid) {
            rq('.rollick-invalid-order-code').removeClass('rollick-hidden');
        } else {
            rq('.rollick-invalid-order-code').addClass('rollick-hidden');
        }
        return valid;
    },

    generatePaymentForm(country) {
        var self = this;
        let payload = {};
        payload.amount = self.cartAmount;
        if (payload.amount < 1) payload.amount = 1;
        payload.oem = 'Textron';
        payload.siteId = rollick.siteId;
        payload.countryCode = (country == 'CA' ? 'CA' : 'US');
        payload.orderDesc = 'Pre-Order Deposit';
        payload.currency = (country == 'CA' ? 'CAD' : 'USD');
        payload.sessionId = Aimbase.Analytics.GetSessionUid();
        rollick.preorder.orderId = '';
        let options = {
            type: 'POST',
            contentType: 'application/json; charset=utf-8',
            data: JSON.stringify(payload),
            dataType: 'json',
            url: rollick.widget + '/payments/paymentech',
            traditional: false,
            success: function (data) {
                if (data && data.id) {
                    let formHost = self.paymentEndpoint;
                    let formUrl = formHost + "/hpf/1_1/?uID=" + data.id;
                    let w = 500, h = 420;
                    if (rq(window).width() < 525) w = rq(window).width() - 10;
                    if (rq(window).height() < 420) h = rq(window).height() - 10;
                    if (data.orderId) rollick.preorder.orderId = data.orderId;
                    let headerStyle = 'font-family: trumpsoftpro, HelveticaNeue-UltraCondensed, HelveticaNeue-Condensed, Ubuntu Condensed, Liberation Sans Narrow, arial narrow, arial, sans-serif; height: 30px; font-weight: 600; color: black; background-color: #66bc29; font-size: 18px; padding-left: 10px; padding-top: 3px; text-transform: uppercase; letter-spacing: 1px; border-top-right-radius: 10px; border-top-left-radius: 10px';
                    if (rollick.siteId.toLowerCase() == 'ezg') headerStyle = 'font-family: arial narrow, arial, sans-serif; height: 30px; font-weight: 600; color: white; background-color: #B95927; font-size: 16px; padding-left: 10px; padding-top: 3px; text-transform: uppercase; border-top-right-radius: 10px; border-top-left-radius: 10px';
                    let html = '\
                        <div class="rollick-payment-window" style="position: fixed; left: 0; top: 0; bottom: 0; right: 0; background-color: rgba(80,80,80,0.9); z-index: 100000;">\
                            <div style="width: ' + w + 'px; height: ' + h + 'px; position: absolute; transform: translate(-50%,-50%); top: 50%; left: 50%; z-index: 100001; border: none; border-radius: 10px;">\
                                <div style="' + headerStyle + ';">Please enter your payment details</div>\
                                <div style="width: ' + w + 'px; height: ' + (h - 30) + 'px; z-index: 100002; border: none; overflow-y: auto; background-color: white; padding: 10%; border-bottom-right-radius: 10px; border-bottom-left-radius: 10px;" id="frame-rollick-payment-loading">Loading payment form...</div>\
                                <iframe style="width: ' + w + 'px; height: ' + (h - 30) + 'px; z-index: 100002; border: none; overflow-y: auto; display: none; border-bottom-right-radius: 10px; border-bottom-left-radius: 10px;" src="' + formUrl + '" id="frame-rollick-payment"></iframe>\
                                <div style="z-index: 100003; background-color: #DDDDDD; padding: 5px 5px; position: absolute; left: 0; right: 0; bottom: 0; height: 60px; margin: 10px; border-radius: 5px; border: red solid 2px; font-size: 12px;" class="rollick-payment-error rollick-hidden"><span class="rollick-payment-error-msg"></span><button style="position: absolute; right: 10px; height: 20px; width: 35px; top: 13px;" onclick="closePaymentError();">OK</button></div>\
                                <div style="z-index: 100003; background-color: #DDDDDD80; padding: 5px 5px; position: absolute; left: 0; right: 0; bottom: 0; top: 30px; font-size: 12px;" class="rollick-payment-processing rollick-hidden">\
                                    <div style="position: absolute; left:0;top:-100%;bottom:0;right:0;" class="rollick-loading-spinner"></div>\
                                </div>\
                            </div>\
                        </div>';
                    rq(".rollick-payment-window").remove();
                    rq("body").append(html);
                    window.setTimeout(function () {
                        rq("#frame-rollick-payment-loading").hide();
                        rq("#frame-rollick-payment").show();
                    }, 1000);
                } else {
                    alert('Unable to generate payment form');
                }
            },
            error: function () {
                alert('Unable to generate payment form');
            }
        };
        rq.ajax(options);
    },

    testEndpoint() {
        var self = rollick.preorder;
        rq.ajax({
            url: rollick.validation + '/sessionId',
            contentType: 'application/json;charset=utf-8',
            type: 'GET',
            timeout: 1000,
            success: function (resp) {
                if (resp) {
                    self.endpointAvailable = true;
                } else {
                    self.endpointAvailable = false;
                }
            },
            error: function (resp) {
                self.endpointAvailable = false;
            }
        });
    }
};

function closePaymentError() {
    rq('.rollick-payment-error-msg').text('');
    rq('.rollick-payment-error').addClass('rollick-hidden');
}

function handlePaymentErrors(data) {
    rq('.rollick-payment-processing').addClass('rollick-hidden');
    try {
        let msg = '';
        rq('.rollick-payment-error').addClass('rollick-hidden');
        if (data.errorCode.indexOf("200") != -1 || data.errorCode.indexOf("310") != -1 || data.errorCode.indexOf("320") != -1 || data.errorCode.indexOf("330") != -1 || data.errorCode.indexOf("340") != -1 || data.errorCode.indexOf("355") != -1 || data.errorCode.indexOf("530") != -1) {
            msg += 'Please fill in all the fields. ';
        }
        if (data.errorCode.indexOf("315") != -1) msg += 'Invalid credit card number. ';
        if (data.errorCode.indexOf("531") != -1) msg += 'Invalid ZIP or Postal Code. ';
        if (data.errorCode.indexOf("370") != -1) msg += 'Invalid expiration date. ';
        if (data.errorCode.indexOf("365") != -1) {
            rollick.preorder.paymentHandler(null, true);
            return;
        }
        if (!msg) msg = 'We are unable to process the payment details. Please retry. ';
        if (data.gatewayMessage) {
            rq('.rollick-payment-error-msg').text(decodeURIComponent(data.gatewayMessage).replace(/\+/g, ' '));
            rq('.rollick-payment-error').removeClass('rollick-hidden');
            rollick.preorder.paymentHandler(null);
        } else {
            rq('.rollick-payment-error-msg').text(msg);
            rq('.rollick-payment-error').removeClass('rollick-hidden');
        }
    } catch (e) {
        console.error(e);
    }
}

function completePayment(data) {
    rq('.rollick-payment-processing').addClass('rollick-hidden');
    try {
        rollick.preorder.paymentHandler(data);
    } catch (e) {
        console.error(e);
    }
}

function hpfReady() {
    return;
}

function scrollRelay(scrollX, scrollY) {
    return;
}

function startPayment() {
    rq('.rollick-payment-processing').removeClass('rollick-hidden');
    return;
}

function cancelPayment() {
    rq('.rollick-payment-window').remove();
}

function whatsThis(data) {
    return;
}

function testCartARC() {
    rollick.preorder.addToCart({ 'modelNumber': 'S2018BCTXPUSW' });
}

function testCartTOR() {
    rollick.preorder.addToCart({ 'modelNumber': 'Wildcat XX' });
}

function testCartEZG() {
    rollick.preorder.addToCart({ 'modelNumber': '680346', 'color': 'Platinum' });
}
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: "textron",
    logo: "",
    name: "arc",
    parent: "",
    targetedStates: "",
    isBFHOn: ("true" == "true"),
    aaaActive: ("" == "true"),
    prequalEnabled: ("true" == "true"),
    synchronyEnabled: ("" == "true"),
    appointmentEnabled: ("true" == "true"),
    textUsEnabled: ("" == "true"),
    nationalGeneralEnabled: ("" == "true"),
    singleLocationDealer: ("true" == "true"),
    locations: "",
    tradeInPct: parseInt("40") || 40,
    modules: ["request-a-quote","offers","trade-in","appointment"],
    tradeInModule: "NADAGuides",
    CTAs: ["request-a-quote"],
    CTATexts: ["Start My Deal"],
    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]}}},
    lenderIds: "",
    expressBuyHelperHeader: "We make shopping easier. Choose one to get started",
    nextStepHelperHeader: "What should I do next?",
    preview: "",
    sponserdbrand: "",
    paymentProfiles: [{"type":"paymentech.com","country":"US","id":"cpt888615552103","clientKey":"7253988f97fe4a17cc8801a6e5a0f15e","transactionKey":"7253988f97fe4a17cc8801a6e5a0f15e","enabled":true,"mode":"PROD","verified":true},{"type":"paymentech.com","country":"CA","id":"cpt734670917398","clientKey":"1e2676203fa694b3776ba0e057966db0","transactionKey":"1e2676203fa694b3776ba0e057966db0","enabled":true,"mode":"PROD","verified":true}],
    paymentEnabled: ("" == "true"),
    preApprovalOn: ("" == "true"),
    simpleDealerUrl: "{% simpleDealerUrl %}",
    preApprovalButtonText: "{% preApprovalButtonText %}",
    email: "",
    conciergeId: "e262f41b565a98b6",
    brandName: "Arctic Cat",
    incentiveEnabledOnAffinity: true,
    aimbaseId: "",
    preorder: ("" == "true"),
    rates: { "CA": parseFloat("1.25") },
    ambassadors: JSON.parse("{}"),
};

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: "282506840",
    gaProperty: "gorollick.com",
    gaLabel: "Digital Retailing",
    harleyBrand: "harleydavidson",
    paymentCalculator: true,
    cta: {"request-a-quote":{"text":"Start My Deal","fontColor":"#343434","fontSize":"","bgColor":"#FF9900","enabled":true},"offers":{"text":"Special Offers","fontColor":"#343434","fontSize":"","bgColor":"#FF9900","enabled":false},"payment":{"text":"Calculate","fontColor":"#343434","fontSize":"","bgColor":"#FF9900","enabled":false},"trade-in":{"text":"Estimate Trade-in","fontColor":"#343434","fontSize":"","bgColor":"#FF9900","enabled":false},"pre-qualify":{"text":"Prequalify","fontColor":"#343434","fontSize":"","bgColor":"#FF9900","enabled":false},"appointment":{"text":"Schedule an Appointment","fontColor":"#343434","fontSize":"","bgColor":"#FF9900","enabled":false},"reserve-now":{"text":"Reserve Now","fontColor":"#343434","fontSize":"","bgColor":"#FF9900","enabled":false,"hasSubtext":true,"deposit":250,"disclaimer":"Reservations require an initial ${deposit} credit card payment. You authorized dealer will contact you about your payment details. Reservations are not final until the payment is received.","subtext":"Deposit Required","configurations":[]},"text-us":{"text":"Text Us","fontColor":"#343434","fontSize":"","bgColor":"#FF9900","enabled":false},"standalone-trade-in":{"enabled":false,"zIndex":11002,"offset":0.5,"vPosition":"T","hPosition":"L"}},
    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" == "true",
};

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

    rollick.getTemplateName();
    rollick.loadAimbaseScript();
    rollick.loadAzureScript();
    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 || 'textron');
            // script.setAttribute('data-dealer', self.dealer.id);
            // script.setAttribute('data-mfg', 'textron');
            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.loadAzureScript = function () {
    var script = document.createElement('script');
    script.setAttribute('type', 'text/javascript');
    script.setAttribute('src', 'https://aimbaseimage.blob.core.windows.net/textron/CertificateOfOrigin/scripts/azure-storage-blob.min.js');
    document.body.appendChild(script);
}

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';
        };
        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();
    }

};

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