var rollick = rollick || {};

rollick = {
  version: 'V2',
  isFetching: false,
  autorun: rollick.autorun || 'true' === 'true',
  dealerScriptTimer: null,
  dealer: {
    id: "b1822e410ab929aa",
    pan: "01689",
    logo: "https://content.rollick.io/l/b1822e410ab929aa/s",
    name: "Allsport - Liberty Lake",
    parent: "",
    targetedStates: "",
    isBFHOn: "" == "true",
    aaaActive: "" == "true",
    prequalEnabled: "true" == "true",
    synchronyEnabled: "" == "true",
    appointmentEnabled: "" == "true",
    textUsEnabled: "" == "true",
    nationalGeneralEnabled: "" == "true",
    singleLocationDealer: "" == "true",
    locations: [{"id":"b1822e410ab929aa","name":"Allsport - Liberty Lake","bc":[{"segmentId":1,"categoryId":1,"brandId":19,"cnew":true,"cused":true},{"segmentId":2,"categoryId":1005,"brandId":20,"cnew":true,"cused":false},{"segmentId":1,"categoryId":1,"brandId":25,"cnew":true,"cused":true},{"segmentId":1,"categoryId":4,"brandId":25,"cnew":true,"cused":true},{"segmentId":1,"categoryId":1,"brandId":15,"cnew":true,"cused":true},{"segmentId":1,"categoryId":1,"brandId":97,"cnew":true,"cused":true},{"segmentId":1,"categoryId":1,"brandId":12,"cnew":false,"cused":true},{"segmentId":1,"categoryId":1,"brandId":8,"cnew":false,"cused":true},{"segmentId":1,"categoryId":4,"brandId":17,"cnew":true,"cused":true},{"segmentId":1,"categoryId":1,"brandId":10,"cnew":false,"cused":true},{"segmentId":1,"categoryId":1,"brandId":14,"cnew":false,"cused":true},{"segmentId":1,"categoryId":1,"brandId":26,"cnew":false,"cused":true},{"segmentId":1,"categoryId":1,"brandId":6,"cnew":false,"cused":true},{"segmentId":1,"categoryId":1,"brandId":35,"cnew":false,"cused":true},{"segmentId":1,"categoryId":1,"brandId":59,"cnew":false,"cused":true},{"segmentId":1,"categoryId":1,"brandId":5,"cnew":true,"cused":true},{"segmentId":1,"categoryId":2,"brandId":5,"cnew":true,"cused":true},{"segmentId":1,"categoryId":3,"brandId":5,"cnew":true,"cused":true},{"segmentId":1,"categoryId":2,"brandId":9,"cnew":true,"cused":true},{"segmentId":1,"categoryId":1,"brandId":9,"cnew":true,"cused":true},{"segmentId":1,"categoryId":7,"brandId":9,"cnew":true,"cused":true},{"segmentId":1,"categoryId":3,"brandId":9,"cnew":true,"cused":true},{"segmentId":1,"categoryId":2,"brandId":19,"cnew":true,"cused":true},{"segmentId":1,"categoryId":4,"brandId":19,"cnew":true,"cused":true},{"segmentId":1,"categoryId":3,"brandId":19,"cnew":true,"cused":true},{"segmentId":1,"categoryId":5,"brandId":20,"cnew":true,"cused":true},{"segmentId":1,"categoryId":4,"brandId":21,"cnew":true,"cused":true},{"segmentId":1,"categoryId":3,"brandId":28,"cnew":true,"cused":true},{"segmentId":1,"categoryId":5,"brandId":28,"cnew":true,"cused":true},{"segmentId":1,"categoryId":1,"brandId":28,"cnew":true,"cused":true},{"segmentId":1,"categoryId":7,"brandId":28,"cnew":true,"cused":true},{"segmentId":1,"categoryId":4,"brandId":28,"cnew":true,"cused":true},{"segmentId":1,"categoryId":2,"brandId":28,"cnew":true,"cused":true},{"segmentId":1,"categoryId":1,"brandId":98,"cnew":true,"cused":true},{"segmentId":1,"categoryId":1,"brandId":27,"cnew":true,"cused":true},{"segmentId":1,"categoryId":2,"brandId":"5","cnew":true,"cused":true},{"segmentId":1,"categoryId":3,"brandId":"5","cnew":true,"cused":true},{"segmentId":1,"categoryId":1,"brandId":"98","cnew":true,"cused":true},{"segmentId":1,"categoryId":2,"brandId":"9","cnew":true,"cused":true},{"segmentId":1,"categoryId":1,"brandId":"9","cnew":true,"cused":true},{"segmentId":1,"categoryId":7,"brandId":"9","cnew":true,"cused":true},{"segmentId":1,"categoryId":3,"brandId":"9","cnew":true,"cused":true},{"segmentId":1,"categoryId":2,"brandId":"19","cnew":true,"cused":true},{"segmentId":1,"categoryId":4,"brandId":"19","cnew":true,"cused":true},{"segmentId":1,"categoryId":3,"brandId":"19","cnew":true,"cused":true},{"segmentId":1,"categoryId":1,"brandId":"97","cnew":true,"cused":true},{"segmentId":1,"categoryId":5,"brandId":"20","cnew":true,"cused":true},{"segmentId":1,"categoryId":4,"brandId":"21","cnew":true,"cused":true},{"segmentId":1,"categoryId":1,"brandId":"27","cnew":true,"cused":true},{"segmentId":1,"categoryId":2,"brandId":"28","cnew":true,"cused":true},{"segmentId":1,"categoryId":1,"brandId":"28","cnew":true,"cused":true},{"segmentId":1,"categoryId":7,"brandId":"28","cnew":true,"cused":true},{"segmentId":1,"categoryId":4,"brandId":"28","cnew":true,"cused":true},{"segmentId":1,"categoryId":3,"brandId":"28","cnew":true,"cused":true},{"segmentId":1,"categoryId":5,"brandId":"28","cnew":true,"cused":true}],"country":"US"}],
    tradeInPct: parseInt("40") || 40,
    modules: ["request-a-quote","offers"],
    tradeInModule: "Rollick",
    CTAs: ["request-a-quote","offers"],
    CTATexts: ["Start My Deal","Special Offers"],
    template: "",
    rollickCTA: true,
    subscriptionType: "1",
    isOEMDealer: "true" == "true",
    processConfig: {"Base":{"CANAM":{"Condition":"New","processCode":[100,101,200]},"SKIDOO":{"Condition":"New","processCode":[101,200]},"SEADOO":{"Condition":"New","processCode":[101,200]},"WINNEBAGO":{"Condition":"New","processCode":[101,200]},"WINNEBAGOINDUSTRIESTOWABLES":{"Condition":"New","processCode":[101,200]},"EZGO":{"Condition":"New","processCode":[101,200]}}},
    lenderIds: "",
    expressBuyHelperHeader: "",
    nextStepHelperHeader: "",
    preview: "",
    sponserdbrand: "",
    paymentProfiles: [],
    paymentEnabled: "" == "true",
    preApprovalOn: "" == "true",
    simpleDealerUrl: "",
    preApprovalButtonText: "",
    email: "Allsport-LibertyLake@rollickoutdoor.com",
    incentiveEnabledOnAffinity: "",
    financePreApprovals: [],
    excludeDealerLocation: "Lake Oconee,Lucedale,Miramar Beach",
    country: "US",
    financePrequal: [],
    prequal700credit: "" == "true",
    prequalYamaha: "" == "true",
    prequalYamahaUrl: "",
    prequalAqua: "" == "true",
    prequalAquaDealerNo: "",
    eligibleBrandsForAquaPrequal: ["winnebago","ezgo"],
    tradInPricePercent: "10",
    experiments: "",
    badgingEnabled: "" == "true",
    badgingPlacements: null,
    awards: null,
    tier3Enabled: "" == "true",
    usbProgramEnabled: "" == "true",
    partialLeadOnSpecialOffers: "true" == "true",
    tier3Brands: [],
    tier3EnabledLocations: [],
    tier3BrandsForEachLocation: {},
    badgingStatusOnPages: null,
    childPartners: [],
    status: "1",
    isUssaCTAEnabled: "" == "true",
    restrictIncentiveforDealers: {"11370":["WIN20240900001"]},
    addDropdownonDRPAN:["20122","08104"],
    restrictDRNonWinnPAN:["11370"],
    enableDRforHarleyPAN:["20163","01837","00758","18215","00760"],
    showIncentiveIndex: 2,
    },

  user: {
    uid: "",
    fn: "",
    ln: "",
    p: "",
    e: "",
    z: "",
    an: "",
    ac: "",
    rid: "",
    isFromS4: "" == "true",
    s4Affinity: "",
    aaa: "",
    usaa: "",
    ttp: "",
    textMe: false,
    verified: false,
    tradeIn: {},
  },
  aimbase: "https://ws.aimbase.com/Scripts/awa.js",
  script: "https://widget.rollick.io/widgets/dr/scripts/dealer.js",
  scripts: {},
  endpoints: {
    content: "https://content.rollick.io",
    gorollick: "https://gorollick.com",
    integration: "https://rmc.rollick.io/integrations",
    inventory: "https://gorollick.com/api",
    validation: "https://validate.rollick.io",
    widget: "https://widget.rollick.io",
    queue: "https://queue.rollick.io",
    inventoryAPI: "https://gorollick.com/api",
    healthstateAPI: "https://healthstats.rollick.io/api/record/add",
  },
  settings: {
    useRMCInventory: true,
    showCTA: { new: true, used: true },
    gaEnabled: "true" == "true",
    gaId: "282506840",
    gaProperty: "gorollick.com",
    gaLabel: "Digital Retailing",
    harleyBrand: "harleydavidson",
    paymentCalculator: true,
    cta: {"request-a-quote":{"text":"Start My Deal","fontColor":"#FFFFFF","fontSize":"","bgColor":"#3697D3","enabled":true},"offers":{"text":"Special Offers","fontColor":"#FFFFFF","fontSize":"","bgColor":"#3697D3","enabled":true},"payment":{"text":"Calculate","fontColor":"#FFFFFF","fontSize":"","bgColor":"#3697D3","enabled":false},"trade-in":{"text":"Estimate Trade-in","fontColor":"#FFFFFF","fontSize":"","bgColor":"#3697D3","enabled":false},"pre-qualify":{"text":"Prequalify","fontColor":"#FFFFFF","fontSize":"","bgColor":"#3697D3","enabled":false},"appointment":{"text":"Schedule an Appointment","fontColor":"#FFFFFF","fontSize":"","bgColor":"#3697D3","enabled":false},"reserve-now":{"text":"Reserve Now","fontColor":"#FFFFFF","fontSize":"","bgColor":"#3697D3","enabled":false,"hasSubtext":false},"text-us":{"text":"Text Us","fontColor":"#FFFFFF","fontSize":"","bgColor":"#3697D3","enabled":false},"finance":{"text":"Prequalify","fontColor":"#FFFFFF","fontSize":"","bgColor":"#3697D3","enabled":false}},
    ctaDefaults: {
      bgColor: "#3697D3",
      fontColor: "white",
      fontSize: "16px",
    },
    inventoryFile: "https://rmc.rollick.io/api/dealer-inventory/b1822e410ab929aa?lean=1",
    excludeCategories: ["spreaderimplements","turfequipment","electricbicycles","dumpers","blades","aerators","skid steers","powerequipment","pump","dump","bicycleebikes","auto","car","snowblower","industrialgenerators","recreationalgenerator","generators","portable","general","commercial","water","tractor","lawnmower","tillage","rake","cutter","scraper","airfx","electric bicycle","other","snow blower","bicycle","outboard motors","residential generators","electric bike","truck","lawn garden and farm","generator","go-kart","cargo trailer","tractors","trailers","lawn mowers - riding","go-karts","tillers","spreaders","pressure washers","seeder implements","backhoe attachments","snowblowers","outboard","four stroke","lawngarden","electric bicycle","cars","skateboard","landscape","edger","trimmer","pruner","blades"],
    excludeMake: ["bad boy mowers","honda power equipment","bad boy","dixie chopper","other","aluma","bobcat®","hillsboro","husqvarna® power","stacyc","bobcat","mowers","bob-cat","big cat bikes®","cub cadet®","nucanoe","old town canoes and kayaks","ocean kayak","freightliner","stinger equipment","cub cadet"],
    layout: "vertical-tabs-v2",
    isModuleSupportedTemplatesEnabled:
      "true" == "true",
    award: {
      enabled: "true" == "true",
      script: "https://cdn.rollick.io/awards/RollickDealerAwards.js",
      api: "https://awards.rollick.io",
      key: "79c7d774b9d323aba2ab92763d690fbc",
    },
    badgingDefault: null,
    usaaCtaSettingInPartnerRecord: {
      usaaCTAEnabledPages: [],
      usaaCTAEnabledDevices: {"isMobile":true,"isDesktop":true},
    },
    usaaHideFullCta: "true",
    usaaRotationMinCTASettings: {"isEnabledUsaaRotateMinCTA":true,"duration":"4s","slideInDelay":"0s","slideOutDelay":"2s"},
    ga4Enabled: "" == "true",
    ga4Id: "",
    
  },
  page: {},
  session: {
    aimbase: {},
    piwikId: "",
  },
  vehicle: {},
  noCTA: rollick.noCTA || false,

  templateIdentifierJson: [{"SearchArray":["cdnmedia.endeavorsuite.com","arinet.com","arinetapi.com","endeavorsuite.com"],"TemplateName":"ARI"},{"SearchArray":["Powered by DX1"],"TemplateName":"DX1"},{"SearchArray":["interactrv.com","interactrv.net","interactcp.com"],"TemplateName":"IRV"},{"SearchArray":["level5advertising.com","level5-form"],"TemplateName":"L5"},{"SearchArray":["Firestorm Websites"],"TemplateName":"Firestorm"},{"SearchArray":["Room 58","room58.com"],"TemplateName":"Room58"},{"SearchArray":["harleydavidsonofcharlotte.com"],"TemplateName":"hdoc"},{"SearchArray":["camperland.net"],"TemplateName":"camper"},{"SearchArray":["mdsbrand.com"],"TemplateName":"mds"},{"SearchArray":["pixelmotion.com"],"TemplateName":"pixelmotion"},{"SearchArray":["whitefishmarine.com"],"TemplateName":"marcoregroup"},{"SearchArray":["Dealer Spike","dealerspike.com"],"TemplateName":"DS"},{"SearchArray":["AutoManager"],"TemplateName":"AutoManager"},{"SearchArray":["netsourcemedia.com","cycles128.com","ansleyrv.com"],"TemplateName":"netsource"},{"SearchArray":["staging.psxdigital.com","PSXDigital","psxdigital.com","psxascend.ai"],"TemplateName":"PSX"},{"SearchArray":["DealerFire","dealersocket.com"],"TemplateName":"DealerFire"},{"SearchArray":["rvconnections.com"],"TemplateName":"ridemarketing"},{"SearchArray":["Fay's Marina"],"TemplateName":"faysmarina"},{"SearchArray":["frankelinteractive.com"],"TemplateName":"frankelinteractive"},{"SearchArray":["dealerinspire.com","www.dealerinspire.com"],"TemplateName":"DI"},{"SearchArray":["fullondigital.com"],"TemplateName":"fullondigital"},{"SearchArray":["travelcamp.com","travelcampcom"],"TemplateName":"travelcamp"},{"SearchArray":["virtualdealer360.com"],"TemplateName":"virtual360"},{"SearchArray":["boatsgroup.com"],"TemplateName":"boatsgroup"},{"SearchArray":["autorevo.com"],"TemplateName":"Autorevo"},{"SearchArray":["operatebeyond.com"],"TemplateName":"operatebeyond"},{"SearchArray":["noleeo.com"],"TemplateName":"noleeo"},{"SearchArray":["www.grrcycles.com","grrcycles.com","www.unitypws.com"],"TemplateName":"grrcycles"},{"SearchArray":["fuelm.com","mtdoraboats.com","coloradoboatcenter.com"],"TemplateName":"fuelmedia"},{"SearchArray":["trailercentral.com","dealereprocess.com"],"TemplateName":"dealereprocess"},{"SearchArray":["ridedigital.com"],"TemplateName":"ridedigital"},{"SearchArray":["dealersync.com"],"TemplateName":"dealersync"},{"SearchArray":["viersgolfcars.com","www.viersgolfcars.com"],"TemplateName":"customviersgolfcars"},{"SearchArray":["forewheelergolfcars.com","golfcarsofhouston.com","milehighgolfcars.com"],"TemplateName":"revenuematter"},{"SearchArray":["nativerank.com"],"TemplateName":"NativeRank"},{"SearchArray":["revver.com"],"TemplateName":"Revver"},{"SearchArray":["dealers.golfcartresource.com"],"TemplateName":"golfcartresource"},{"SearchArray":["dealershiptoolkit.com"],"TemplateName":"dealershiptoolkit"},{"SearchArray":["poulsborv.com"],"TemplateName":"custompoulsborv"},{"SearchArray":["goldgorillamedia.com"],"TemplateName":"goldgorillamedia"},{"SearchArray":["shelteredcovemarina.com"],"TemplateName":"blackbearmedia"},{"SearchArray":["buzzsmarine.com"],"TemplateName":"intellicominc"},{"SearchArray":["turnkeywebsolutions.com"],"TemplateName":"turnkeywebsolutions"},{"SearchArray":["wintersrec.com"],"TemplateName":"thewhitgroup"},{"SearchArray":["pohlenv.com"],"TemplateName":"pohle"},{"SearchArray":["bolandrvs.com"],"TemplateName":"inventure"},{"SearchArray":["rvwebservices.com","traderinteractive.com","boerv.com"],"TemplateName":"RVWEBSERVICES"},{"SearchArray":["www.ymarinaboats.com"],"TemplateName":"customymarina"},{"SearchArray":["www.coasttechnology.com","coasttechnology.com"],"TemplateName":"StealthAI"},{"SearchArray":["www.smithvillerv.com","www.focusrv.com"],"TemplateName":"focusrv"},{"SearchArray":["www.machinio.com"],"TemplateName":"machinio"},{"SearchArray":["RVC Marketing"],"TemplateName":"rvc-marketing"}],
  supportedTemplates: [
    "ds",
    "dx1",
    "ari",
    "travelcamp",
    "psx",
    "irv",
    "firestorm",
    "pixelmotion",
    "operatebeyond",
    "faysmarina",
    "room58",
    "l5",
    "frankelinteractive",
    "dealerfire",
    "pst",
    "autorevo",
    "di",
    "ridemarketing",
    "noleeo",
    "grrcycles",
    "virtual360",
    "fuelmedia",
    "dealereprocess",
    "ridedigital",
    "dealersync",
    "customviersgolfcars",
    "revenuematter",
    "leadsonline",
    "netsource",
    "nativerank",
    "revver",
    "boatsgroup",
    "golfcartresource",
    "mds",
    "dealershiptoolkit",
    "custompoulsborv",
    "goldgorillamedia",
    "blackbearmedia",
    "intellicominc",
    "marcoregroup",
  ],
  supportedModulesTemplates: [
    "ds",
    "irv",
    "dx1",
    "ari",
    "turnkeywebsolutions",
    "thewhitgroup",
    "firestorm",
    "fuelmedia",
    "room58",
    "pixelmotion",
    "mds",
    "nativerank",
    "virtual360",
    "ridedigital",
    "revver",
    "di",
    "autorevo",
    "dealerdotcom",
    "pohle",
    "inventure",
    "automanager",
    "rvwebservices",
    "customymarina",
    "focusrv",
    "machinio",
    "stealthai",
    "golfcartresource",
  ],
 
  verifyJqueryStatus() {
    try {
      return jQuery && jQuery().jquery && jQuery.ajax && jQuery.getJSON;
    } catch (ex) {
      return false;
    }
  },
  init() {
    var self = this;
    try {
      // checking if the jQuery is slim version and checking if AJAX and getJSON methods are available or not
      if (rollick.verifyJqueryStatus()) {
        self.jq = jQuery;
      } else {
        rollick.initializeJquery();
        window.setTimeout(rollick.init, 1000);
        return;
      }
    } catch (e) {
      console.log(e);
      if (rollick.verifyJqueryStatus()) {
        self.jq = jQuery;
      } else {
        rollick.initializeJquery();
        window.setTimeout(rollick.init, 1000);
        return;
      }
    }
    if (sessionStorage["rollick.session"]) {
      try {
        self.session = JSON.parse(sessionStorage["rollick.session"]);
      } catch (e) {
        self.session = {};
      }
    }
    if (sessionStorage["rollick.vehicle"]) {
      try {
        self.vehicle = JSON.parse(sessionStorage["rollick.vehicle"]);
      } catch (e) {
        self.vehicle = {};
      }
    }

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

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

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

    // Initialize only for G-PTYFQJJX1X
    gtag('js', new Date());
    gtag('config', rollick.settings.ga4Id, { 'send_page_view': true });
},
  async loadTemplateScript() {
    const templateScriptSettings = await rollick.getTemplateSettings();
    const template = this.dealer.template;

    if (templateScriptSettings?.templatePath) {
      await rollick.loadScript(templateScriptSettings, template);
    }

    rollick.handleSpecialCases(templateScriptSettings, template);
  },

  async loadScript(templateScriptSettings, template) {
    this.scripts[template] = "loading";

    const script = document.createElement("script");
    script.type = templateScriptSettings.supportsModule ? "module" : "text/javascript";
    script.src = templateScriptSettings.templatePath;
    script.id = "RollickTemplateScript";

    script.onload = () => {
      this.scripts[template] = "loaded";

      if (typeof rollick.DMS === "object") {
        rollick.DMS.CTASettings = templateScriptSettings?.templateCtaSettings || {};
        rollick.DMS.dealerCTASettings = templateScriptSettings?.dealerCTASettings || {};
        if (typeof rollick.DMS.loadDealerInventory === "function") {
          rollick.DMS.loadDealerInventory();
        }
        this.loadDealerScript();
      }
    };

    document.body.appendChild(script);
  },

  handleSpecialCases(templateScriptSettings, template) {
    if (template === "DX1") {
      rollick.overrideXHR(["indexes/*/queries?x", "indexes/*/queries", "DesktopModules/Dominion"]);
    } else if (template.toLowerCase() === "firestorm") {
      rollick.overrideXHR([
        "/vehicle/getvehiclelistviewmodels",
        "/vehicle/refreshfilters",
        "vehiclefiltersform",
      ]);
    }
    else if (template == "fuelmedia") {
      rollick.overrideXHR(["boats/?_condition"]);
    }
    
    else if (
      !templateScriptSettings?.templatePath &&
      rollick.dealer.badgingEnabled &&
      rollick.settings?.award?.enabled
    ) {
      rollick.loadDealerScript();
    }
  },

  overrideXHR(targetUrls) {
    const oldXHR = window.XMLHttpRequest;

    window.XMLHttpRequest = function () {
      const realXHR = new oldXHR();

      realXHR.addEventListener("readystatechange", function () {
        try {
          const responseURL = realXHR.responseURL?.toLowerCase() || "";
          const matchesTarget = targetUrls.some((url) => responseURL.includes(url.toLowerCase()));

          if (matchesTarget && realXHR.readyState === 4 && realXHR.status === 200) {
            // Clear any existing timer before setting a new one (debouncing)
            if (rollick.dealerScriptTimer) {
              clearTimeout(rollick.dealerScriptTimer);
            }
            
            // Set a new timer - this allows multiple calls but debounces rapid successive ones
            rollick.dealerScriptTimer = setTimeout(rollick.dealerScriptLoaded, 1500);
          }
        } catch (error) {
          console.error("Error in XHR override:", error);
        }
      });

      return realXHR;
    };

    // Preserve the prototype to maintain instanceof checks
    window.XMLHttpRequest.prototype = oldXHR.prototype;
  },

  async getTemplateSettings() {
    const template = this.dealer?.template?.toLowerCase();

    if (!template || this.scripts[template]) {
      return {}; // Return an empty object if no template or already loaded
    }

    try {
      const templateScriptSettings = await rollick.getTemplateFile(template);
      return templateScriptSettings;
    } catch (error) {
      console.error("Error fetching template settings:", error);
      return {}; // Return an empty object on error
    }
  },

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  async getTemplateFile(templateName) {
    if (rollick.isFetching) return; // Prevent multiple concurrent calls
    rollick.isFetching = true;
let dealerId = rollick.dealer.pan;
    try {
      const url = `${rollick.endpoints.widget}/getTemplate/${templateName}/${dealerId}`;
      const response = await fetch(url);

      if (!response.ok) {
        throw new Error(
          `Failed to fetch template file: ${response.statusText} (${response.status})`
        );
      }

      const data = await response.json();
      console.log("Template data received:", data);
      return data;
    } catch (error) {
      console.error("Error fetching template file:", error);
      return {}; // Return an empty object as a fallback
    } finally {
      rollick.isFetching = false; // Ensure the fetching state is reset
    }
  },
};
// polyfill for non-ES6
if (!String.prototype.endsWith) {
  String.prototype.endsWith = function (string) {
    var index = arguments.length < 2 ? this.length : arguments[1];
    var foundIndex = this.lastIndexOf(string);
    return foundIndex !== -1 && foundIndex === index - string.length;
  };
}

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

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

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

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

else
  rollick.init();
