// IE polyfill
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: '101.100.146.155',
    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',
    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,
    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: 0,
    scriptLoaded: {},
    submitted: false,
    keys: {
        arc2: {
            'US': { id: '9eR5j96eGn39', key: '5c5zAAZAnAYzuDRRCC276r5mXB47DN4E9DxpmWAL9Dggp84PByd69bbCg6tTqUEA' },
            'CA': { id: '4d3sB2W5', key: '8x9dgEHvFy4Sj35tYTnRf664sBZ8mY8zkaZea92A4V67qP5x2pAUrYWDn7Tw4mjf' },
        }
    },
    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/dealer-driveway"}},
    useNewACDatafile: true,
    isFormSubmitted: false,
    isBusy: false,
    vehiclesRemaining: null,
    cart: {},
    rolGAEnabled: 'true',
    rolGAId: 'UA-115314153-2',
    rolGAProperty:'gorollick.com',

    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.async = true;
            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'];
                    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();
            }
            s.onerror = function () {
                rollick.maintenance = true;
            }
            var t = document.getElementsByTagName('script')[0];
            t.parentNode.insertBefore(s, t);
        }

        //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 && isAC2) {
                    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 (isEZGO) {
                                vehicle.brand = 'E-Z-GO';
                                vehicle.category = 'Golf Cart';
                                vehicle.type = elements[0];
                                vehicle.vehicleName = elements[1];
                                vehicle.modelName = elements[2];
                                vehicle.color = elements[3];
                                vehicle.msrpUSD = parseFloat(elements[4]);
                                vehicle.colorAdditionalUSD = (parseFloat(elements[5]) || 0);
                                vehicle.image = elements[6].replace(/\r/g, '');
                                vehicle.year = elements[7];
                                //FOR E-Z-Go Model code will need to maintain in 8 index in the file 
                                if (elements && elements.length > 7 && elements[8]) {
                                    vehicle.mfgModelCode = elements[8];
                                }
                            }
                            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.type = 'Snow';
                                    }
                                    if (category === 'side-by-side') {
                                        vehicle.category = 'SxS/UTVs';
                                        vehicle.brand = 'Arctic Cat Off Road';
                                        vehicle.type = 'Off Road';
                                    }
                                    if (category === 'atv') {
                                        vehicle.category = 'ATVs';
                                        vehicle.brand = 'Arctic Cat Off Road';
                                        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.deposit = rollick.DEFAULT_DEPOSIT_AMOUNT || 0;
                                        }
                                    }
                                    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);
            //	ga('rol.send', 'event', category, action, label, value);
        }
    },

    getQuote: function (vehicle, options) {
        var self = this;
        rollick.visited = {};
        rollick.leadType = (options && options.leadType || 'Quote') || 'Quote';
        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) {
        }
        //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 || '';
        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('getQuote 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 (this.siteId != 'ARC2') {
            if (vehicle.modelName && vehicle.color) {
                rollick.vehicleParams = { modelName: vehicle.modelName || '', color: vehicle.color || '' };
                var modelName = vehicle.modelName || '';
                var color = vehicle.color || '';
                var trims = [];
                if (!vehicle.condition) {
                    vehicle = rollick.vehicles.filter(function (v) { return v.modelName.toLowerCase() === modelName.toLowerCase() && v.color.toLowerCase() === color.toLowerCase(); }).pop();
                    trims = rollick.vehicles.filter(function (v) { return v.modelName.toLowerCase() === modelName.toLowerCase() && v.color.toLowerCase() === color.toLowerCase(); });
                    if (!vehicle) {
                        if (window.console) console.error('Unable to find matching vehicle: ' + modelName + ' ' + color);
                        return false;
                    }
                }
                vehicle.trims = trims || [];
            }
        }
        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 || '0');
            var modelNumber = (vehicle.modelNumber || '').trim();
            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 = 'REQUEST MORE INFO';
            if ((vehicle.brand == 'Arctic Cat Off Road' || vehicle.type == 'Off Road') && modelName) {
                var 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();
                if (!vehicle) {
                    if (window.console) console.error('Unable to find matching vehicle: ' + year + ' ' + modelName);
                    return false;
                }
            }
            if (rollick.div) {
                self.availableModels = rollick.listModels('Quote', options.country, '', '', '');
                self.vehiclesRemaining = self.availableModels.models.slice();
            } else {
                self.vehiclesRemaining = rollick.vehicles.slice();
                self.vehiclesRemaining = self.vehiclesRemaining.filter(function (v) { return rollick.isAvailable(v, 'Quote', options.country || 'US'); });
            }
            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.type == 'Snow' && !vehicle.brand) vehicle.brand = 'Arctic Cat Snow';
            if (vehicle.type == 'Off Road' && !vehicle.brand) vehicle.brand = 'Arctic Cat Off Road';
            if (self.vehiclesRemaining.length == 0) 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';
            }
        }
        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;
        rq.get(rollick.widget + '/widgets/templates/' + 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"><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"><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');
                if (rollick.siteId == 'EZG') {
                    // types = ['Freedom Series', 'Express Series', 'Valor', '2Five', 'Limited Edition']; // Custom ordering for E-Z-GO model families
                    types = ['Freedom Series', 'Express Series', 'Valor']; // Custom ordering for E-Z-GO model families
                }
                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') {
                rq('.rollick-form-vehicle-type-select').on('change', function () {
                    var vt = rq('.rollick-form-vehicle-type-select');
                    var vv = rq('.rollick-form-vehicle-vehicle-select');
                    var m = rq('.rollick-form-model-select');
                    var c = rq('.rollick-form-color-select');
                    rq('.rollick-form-vehicle-type-label').text(vt.find(':selected').text());
                    var vehicles = rollick.distinctValues(rollick.vehicles.filter(function (v) { return v.type === vt.val(); }), 'vehicleName');
                    vv.empty();
                    m.empty();
                    c.empty();
                    rollick.vehicle = {};
                    vv.append(rq('<option></option>').attr('value', '').text(''));
                    vv.val('');
                    rq.each(vehicles, function (key, value) {
                        vv.append(rq('<option></option>').attr('value', value).text(value));
                    });
                    rollick.validateForm();
                });
                rq('.rollick-form-vehicle-vehicle-select').on('change', function () {
                    var vt = rq('.rollick-form-vehicle-type-select');
                    var vv = rq('.rollick-form-vehicle-vehicle-select');
                    var m = rq('.rollick-form-model-select');
                    var c = rq('.rollick-form-color-select');
                    rq('.rollick-form-vehicle-vehicle-label').text(vv.find(':selected').text());
                    var models = rollick.distinctValues(rollick.vehicles.filter(function (v) { return v.type === vt.val() && v.vehicleName == vv.val(); }), 'modelName');
                    //vv.empty();
                    m.empty();
                    c.empty();
                    rollick.vehicle = {};
                    m.append(rq('<option></option>').attr('value', '').text(''));
                    m.val('');
                    rq.each(models, function (key, value) {
                        m.append(rq('<option></option>').attr('value', value).text(value));
                    });
                    rollick.validateForm();
                });
                rq('.rollick-form-model-select').on('change', function () {
                    var vt = rq('.rollick-form-vehicle-type-select');
                    var m = rq('.rollick-form-model-select');
                    var c = rq('.rollick-form-color-select');
                    rq('.rollick-form-model-label').text(m.find(':selected').text());
                    var colors = rollick.distinctValues(rollick.vehicles.filter(function (v) { return v.type === vt.val() && v.modelName === m.val(); }), 'color');
                    c.empty();
                    rollick.vehicle = {};
                    c.append(rq('<option></option>').attr('value', '').text(''));
                    c.val('');
                    rq.each(colors, function (key, value) {
                        c.append(rq('<option></option>').attr('value', value).text(value));
                    });
                    if (colors.length == 1) {
                        rq('.rollick-form-color-label').text(colors[0]);
                        rq('.rollick-form-color-select').val(colors[0]);
                        var vehicle = rollick.vehicles.filter(function (v) { return v.type === vt.val() && v.modelName === m.val() && v.color === colors[0]; }).pop();
                        var trims = rollick.distinctValues(rollick.vehicles.filter(function (v) { return v.type === vt.val() && v.modelName === m.val() && v.color === colors[0]; }), 'trimName');
                        var t = rq('.rollick-form-trim-select');
                        t.empty();
                        if (trims.length > 1) {
                            rq('.rollick-vehicle-trim').removeClass('rollick-hidden');
                            t.append(rq('<option></option>').attr('value', '').text(''));
                            t.val('');
                            rq.each(trims, function (key, value) {
                                t.append(rq('<option></option>').attr('value', value).text(value));
                            });
                        } else {
                            rq('.rollick-vehicle-trim').addClass('rollick-hidden');
                            t.append(rq('<option></option>').attr('value', trims[0]).text(trims[0]));
                            t.val(trims[0]);
                        }
                        if (vehicle) {
                            rollick.vehicle = Object.assign({}, vehicle);
                            if (!rollick.vehicle.originalImage) rollick.vehicle.originalImage = rollick.vehicle.image;
                        }
                    } else {
                        var trims = rollick.distinctValues(rollick.vehicles.filter(function (v) { return v.type.toLowerCase().trim() === vt.val().toLowerCase().trim() && v.modelName.toLowerCase().trim() === m.val().toLowerCase().trim(); }), 'trimName');
                        var t = rq('.rollick-form-trim-select');
                        t.empty();
                        if (trims.length > 1) {
                            rq('.rollick-vehicle-trim').removeClass('rollick-hidden');
                            t.append(rq('<option></option>').attr('value', '').text(''));
                            t.val('');
                            rq.each(trims, function (key, value) {
                                t.append(rq('<option></option>').attr('value', value).text(value));
                            });
                        } else {
                            rq('.rollick-vehicle-trim').addClass('rollick-hidden');
                            t.append(rq('<option></option>').attr('value', trims[0]).text(trims[0]));
                            t.val(trims[0]);
                        }
                    }
                    rollick.validateForm();
                });
                rq('.rollick-form-color-select').on('change', function () {
                    var vt = rq('.rollick-form-vehicle-type-select');
                    var m = rq('.rollick-form-model-select');
                    var c = rq('.rollick-form-color-select');
                    var t = rq('.rollick-form-trim-select');
                    rq('.rollick-form-color-label').text(c.find(':selected').text());
                    rollick.vehicle = {};
                    var vehicle = rollick.vehicles.filter(function (v) { return v.type.toLowerCase().trim() === vt.val().toLowerCase().trim() && v.modelName.toLowerCase().trim() === m.val().toLowerCase().trim() && v.color.toLowerCase().trim() === c.val().toLowerCase().trim(); }).pop();
                    if (vehicle) {
                        rollick.vehicle = Object.assign({}, vehicle);
                        if (!rollick.vehicle.originalImage) rollick.vehicle.originalImage = rollick.vehicle.image;
                    }
                    rollick.validateForm();
                });
                rq('.rollick-form-trim-select').on('change', function () {
                    var vt = rq('.rollick-form-vehicle-type-select');
                    var m = rq('.rollick-form-model-select');
                    var c = rq('.rollick-form-color-select');
                    var t = rq('.rollick-form-trim-select');
                    var modelName = rollick.vehicleParams.modelName || m.val();
                    var color = rollick.vehicleParams.color || c.val();
                    rq('.rollick-form-color-label').text(c.find(':selected').text());
                    rollick.vehicle = {};
                    var vehicle = rollick.vehicles.filter(function (v) { return (!vt.val() || v.type.toLowerCase().trim() === vt.val().toLowerCase().trim()) && v.modelName.toLowerCase().trim() === modelName.toLowerCase().trim() && v.color.toLowerCase().trim() === color.toLowerCase().trim() && v.trimName.toLowerCase().trim() == t.val().toLowerCase().trim(); }).pop();
                    if (vehicle) {
                        rollick.vehicle = Object.assign({}, vehicle);
                        if (!rollick.vehicle.originalImage) rollick.vehicle.originalImage = rollick.vehicle.image;
                        rq('.rollick-vehicle-msrp-usd').show();
                    } else {
                        rq('.rollick-vehicle-msrp-usd').hide();
                    }
                    rollick.validateForm();
                });
                rq('.rollick-form-ttp-select').on('change', function () {
                    var c = rq('.rollick-form-ttp-select');
                    rq('.rollick-form-ttp-label').text(c.find(':selected').text());
                    rollick.validateForm();
                });
                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.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'));
                        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;
    },

    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 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');
            });
        }
    },

    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();
        }
    },

    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') {
                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;
        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();
                if (rollick.siteId != 'ARC2') {
                    rq('.rollick-vehicle-image').attr('src', rollick.golfCartPlaceholder);
                    rq('.rollick-vehicle-image-2').attr('src', rollick.golfCartPlaceholder);
                } else {
                    // 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();
            if (rollick.siteId != 'ARC2') {
                rq('.rollick-vehicle-image').attr('src', rollick.golfCartPlaceholder);
                rq('.rollick-vehicle-image-2').attr('src', rollick.golfCartPlaceholder);
            } else {
                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"><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"><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"><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"><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('');
                if (self.siteId != 'ARC2') rq('.rollick-vehicle').css('visibility', 'visible');
            }
        }

        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 (rollick.siteId != 'ARC2') {
            if (!rollick.hasInput(val, obj) && rollick.isVisited(obj)) {
                rq(obj).addClass('rollick-required');
            } else {
                rq(obj).removeClass('rollick-required');
            }
        } else {
            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) {
            if (rollick.siteId != 'ARC2') rq(obj).addClass('has-input');
            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();
                }

                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';
                }

                // this should be 0 or 1 and also added ids in e-z-go templates as part of ROL-5823
                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 () {
        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 () {
        window.open(rollick.termsCondition, 'oem-terms');
        return false;
    },

    showPolicy: function () {
        window.open(rollick.privacyPolicy, 'oem-privacy-policy');
        return false;
    },

    sanitize: function (ctrl) {
        // ^[\w'\-,.][^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]]{2,}$
        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');
        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);
                    } else {
                        delete sessionStorage['rollick-dealer-id'];
                        delete sessionStorage['rollick-dealer-name'];
                        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);
            }
        } else {
            rq('#rollick-specific-dealer-label').text(selectedDealer);
            if (rq('#rollick-specific-dealer-label').length == 0) rq('#rollick-specific-dealer').val(selectedDealer);
        }
    },

    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 = rq('.rollick-form-vehicle-type-select').val();
            brand = vtype;
            if (vtype == 'Off Road') brand = 'TOR';
            if (vtype == 'Snow') 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');
                        }
                    }
                }
            }, '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 (!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 (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;
                }
            }
        }
        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;
        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",
                "powertrain": "powertrain",
                "modelcode": "modelnumber",
                "color": "color",
                "accessories": "",
                "country": "language",
                "location": "zip",
                "dealer": "dealer",
                "redirectUrl": "",
                "page": "page",
                "seating": "seating",
                "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') {
                    // 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.openCart();
            } 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);
                });
            }
        } 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 M', 'BLAST ZR', 'BLAST LT', 'BLAST XR', 'M Hardcore Alpha One', 'M Mountain Cat Alpha One', 'Riot', 'Riot X', 'ZR Thundercat', 'ZR RR', 'ZR Limited', 'Norseman', 'ZR 200', 'ZR 120',
            'Wildcat XX', 'Prowler Pro', 'Prowler Pro Crew', 'Prowler 500',
            'Alterra 700', 'Alterra TRV 700', '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;
    },

    testSAC() {
        var self = this;
        var options = { "div": "#rollick", "country": "US", "redirectUrl": "/request-more-info/request-submitted", "leadType": "Appointment" };
        var vehicle = {};
        if (sessionStorage['rollick-dealer-id']) self.sacStep1();
        rollick.getQuote(vehicle, options);
    },

    sacStep1() {
        rq(".standard-marquee__headline").text("Schedule an Appointment");
        rq(".rollick-blurb").html("Please select your model of interest. This allows us to provide you with the personalized experience you deserve, and don't worry, if you want to change your mind later, we'll help you find the best sled for your needs.");
    },

    sacStep2() {
        rq(".standard-marquee__headline").text("Schedule an Appointment");
        rq(".rollick-blurb").html("Please select your preferred color and trim from the list below.");
    },

    sacStep3() {
        var self = this;
        rq(".standard-marquee__headline").text("Schedule an Appointment");
        rq(".rollick-blurb").html("<center>We just need your contact details and preferred appointment times.</center>");
        rq(".rollick-form-appointment-pii .rollick-vehicle").html(self.generateVehicleDetailsAppt(rollick.vehicle));
        var today = new Date(new Date().getTime() - new Date().getTimezoneOffset() * 60000).toISOString().split("T")[0];
        var future = new Date((new Date().getTime() + 31557600000) - new Date().getTimezoneOffset() * 60000).toISOString().split("T")[0]; // max 1 year from today
        rq("#rollick-appt-date-1").attr("min", today).attr("max", future);
        rq("#rollick-appt-date-2").attr("min", today).attr("max", future);
    },

}

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://js.authorize.net/v3/AcceptUI.js',
    abandoned: null,
    ends: 1619841600000,
    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 Snowmageddon purchase. All other accessories are shipped separately.',

    paymentForm() {
        var selectedCountry = rollick.cart.country || 'US';
        if (selectedCountry) {
            rq('.rollick-pay').click();
        }
    },

    closeForm() {
        var self = this;
        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;
            rq('.rollick-form').remove();
            rq('body').css('overflow', 'auto');
        }, 200);
    },

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

    paymentHandler(response) {
        var self = this;
        if (!self.submitted) {
            self.submitted = true;
            if (response.messages.resultCode === 'Error') {
                self.paymentInfo = null;
                self.paymentTry++;
                window.setTimeout(function () {
                    self.submitted = false;
                }, 2000);
                rq('.rollick-invalid-payment').removeClass('rollick-hidden');
                if (self.paymentTry == 2 && !rollick.cart.leadUid) {
                    // auto-submit as NQL
                    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');
                self.updatePaymentInfo(response);
            }
        }
    },

    showReceipt(dealerName, paymentInfo) {
        var self = this;
        rq('.rollick-form').remove();
        rq('body').css('overflow', 'auto');
        var page = rollick.widget + '/widgets/templates/textron/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 || '');
            rq('body').css('overflow', 'hidden').append(data);
            rq('.rollick-form').show();
            window.setTimeout(function () {
                rollick.cart.checkout = false;
                self.renderCart(true);
                rq('.rollick-form').addClass('tray--active');
                rq('.rollick-form-fields').show();
                rollick.deposit = 0;
                self.emptyCart();
            }, 10);
        });
    },

    showCCFailure(deposit, paymentInfo) {
        var self = this;
        rq('.rollick-form').remove();
        rq('body').css('overflow', 'auto');
        var page = rollick.widget + '/widgets/templates/textron/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 || '');
            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 (!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>';
        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) {
        var opaqueData = null;
        if (response) opaqueData = response.opaqueData;
        if (opaqueData && opaqueData.dataDescriptor && opaqueData.dataValue) {
            rollick.paymentInfo = opaqueData;
            rollick.paymentInfo.cc = response.encryptedCardData.cardNumber;
            rollick.paymentInfo.expirationDate = (new Date()).valueOf() + (10 * 60 * 1000); // expires in 10 minutes
        } 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) {
        if (options && options.modelNumber) {
            var self = this;
            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;
                }
                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
                };
                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'] = options.dealer;
                            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') || '';
            if (modelNumber) {
                rq.post(rollick.widget + '/carts/setSkuCount/' + rollick.userId, { modelNumber: modelNumber, 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 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, 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') || '';
            if (modelNumber) {
                rq.post(rollick.widget + '/carts/decreaseSku/' + rollick.userId, { modelNumber: modelNumber, 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') || '';
            if (modelNumber) {
                rq.post(rollick.widget + '/carts/increaseSku/' + rollick.userId, { modelNumber: modelNumber, 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-modal-en-us.html';
        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;
        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';
        var form = 'textron/' + rollick.siteId.toLowerCase() + '/' + cartForm;
        rq('.rollick-form').remove();
        rq('#AcceptUIBackground').remove();
        rq('#AcceptUIContainer').remove();
        rq('body').css('overflow', 'auto');
        rollick.visited = {};
        rq.get(rollick.widget + '/widgets/templates/' + form, function (data) {
            self.abandoned = false;
            var pay_id = rollick.keys[rollick.siteId.toLowerCase()][rollick.cart.country].id;
            var pay_key = rollick.keys[rollick.siteId.toLowerCase()][rollick.cart.country].key;
            data = data.replace(/\$api_id/g, pay_id || '');
            data = data.replace(/\$api_key/g, pay_key || '');
            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;
                    window.AcceptUI = null;
                    delete rollick.scriptLoaded['acceptUI'];
                    rollick.loadScript(rollick.preorder.paymentScript, 'acceptUI');
                    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');
                    }
                }
                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;
            for (var i = 0; i < rollick.cart.items.length; i++) {
                var item = rollick.cart.items[i];
                var amount = item.deposit * item.quantity;
                var vehicle = self.getVehicle(item.modelNumber);
                var itemObj = rq('<div class="rollick-cart-item"></div>');
                var trimDetails = vehicle.color + ', ' + vehicle.track + ', ' + vehicle.trackType + ', ' + vehicle.suspension + ', ' + vehicle.starter;
                itemObj.attr('data-modelNumber', item.modelNumber || '');
                itemObj.attr('data-kit', item.kit || '');
                itemObj.attr('data-accCode', item.accCode || '');
                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 {
                    html += '<div class="rollick-cart-item-quantity"><div style="float: left; font-size: 14px; 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;
            }
            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');
                rq('.rollick-preorder-disclaimer').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 (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();
                        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';
        rq.get(rollick.widget + '/widgets/templates/' + form, function (data) {
            data = data.replace(/\$headline/g, headline || '');
            data = data.replace(/\$message/g, message || '');
            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();
            }, 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());
        } else {
            rq('.cart-count-value').text('0');
        }
    },

    getQuote(vehicle, options) {
        var self = this;
        //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 = rollick.DEFAULT_DEPOSIT_AMOUNT;
                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;
            }
            var pay_id = rollick.keys[rollick.siteId.toLowerCase()][country].id;
            var pay_key = rollick.keys[rollick.siteId.toLowerCase()][country].key;
            data = data.replace(/\$api_id/g, pay_id || '');
            data = data.replace(/\$api_key/g, pay_key || '');

            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.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' });
                }
            }
        });
        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) {
        var vehicle = null;
        if (rollick.vehicles) {
            vehicle = rollick.vehicles.filter(function (veh) {
                return veh.mfgModelCode && veh.mfgModelCode.toLowerCase() == modelNumber.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')) {
            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;
                }

                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) {
        // 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 (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;
            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) {
                    rollick.hideLoading();
                    rollick.preorder.isFormSubmitted = false;
                    rollick.preorder.submitted = false;
                    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);
                            else
                            {
                               
                                self.showCCFailure(rollick.deposit, rollick.paymentInfo);
                            }
                        } else {
                            
                            self.showCCFailure(rollick.deposit, rollick.paymentInfo);
                        }
                        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;
                    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) {
                rq.post(rollick.widget + '/aimbase-locate-dealer', { countryCode: rollick.cart.country, brandCode: 'ARC', 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;
    }

};
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();
        if (typeof Aimbase != 'undefined') delete Aimbase;
        rollick.initData();
    };
    document.getElementsByTagName('head')[0].appendChild(script);
}

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