let availiabilityapi = "";
let loaded = 0;
let isConnected = false;
let isOnline = false;
let isHeaderClick = false;
let bannerConfig;
let embeddedSericeDeploymentName;

function getKeyword(site_url) {
  let key_value = "";
  const mapped_site_to_keyword = new Map();
  mapped_site_to_keyword.set("namrinfo", "ELOQUA_NAMRINFO");
  mapped_site_to_keyword.set("eloqua", "ELOQUAMSI");
  mapped_site_to_keyword.set("blog", "NAMSI");
  mapped_site_to_keyword.set("content/static/sr", "NAMSI");
  mapped_site_to_keyword.set("shop", "SHOP");
  mapped_site_to_keyword.set("watchguard", "WATCHGUARD");
  mapped_site_to_keyword.set("partner-central", "NAPC");

  for (const ky of mapped_site_to_keyword.keys()) {
    if (site_url.includes(ky)) {
      console.log(mapped_site_to_keyword.get(ky));
      key_value = mapped_site_to_keyword.get(ky);
      break;
    }
  }
  return key_value;
}

function getNormalizedUserType(user_type) {
  const usertype_map = new Map();
  usertype_map.set("PARTNER", "PARTNER");
  usertype_map.set("CONSUMER", "CONSUMER");
  usertype_map.set("DIRECT", "CUSTOMER");
  usertype_map.set("SALES", "EMPLOYEE");
  usertype_map.set("INTERNAL", "EMPLOYEE");
  usertype_map.set("DEFAULT", "CONSUMER");
  return usertype_map.get(user_type);
}

function getNormalizedRegion(region) {
  const region_map = new Map();
  region_map.set("NA", "NA");
  region_map.set("NAMR", "NA");
  region_map.set("NORTH AMERICA", "NA");
  region_map.set("EA", "EA");
  region_map.set("EMEA", "EA");
  region_map.set("LA", "LA");
  region_map.set("LACR", "LA");
  region_map.set("AP", "AP");
  region_map.set("APAC", "AP");
  region_map.set("ANZ", "AP");
  region_map.set("ASIA PACIFIC", "AP");
  region_map.set("EUROPE", "EA");
  region_map.set("LATIN AMERICA", "LA");
  region_map.set("MIDDLE EAST", "EA");
  return region_map.get(region);
}

function getCountryMapRegion(country) {
  let country_region_map = new Map();
  country_region_map.set("AE", "EA"); // UNITED ARAB EMIRATES
  country_region_map.set("AR", "LA"); // ARGENTINA
  country_region_map.set("AU", "AP"); // AUSTRALIA
  country_region_map.set("BR", "LA"); // BRAZIL
  country_region_map.set("CA", "NA"); // CANADA
  country_region_map.set("CL", "LA"); // CHILE
  country_region_map.set("CN", "AP"); // CHINA
  country_region_map.set("CO", "LA"); // COLOMBIA
  country_region_map.set("DE", "EA"); // GERMANY
  country_region_map.set("DK", "EA"); // DENMARK
  country_region_map.set("EC", "LA"); // ECUADOR
  country_region_map.set("ES", "EA"); // SPAIN
  country_region_map.set("FR", "EA"); // FRANCE
  country_region_map.set("GB", "EA"); // UNITED KINGDOM
  country_region_map.set("ID", "AP"); // INDONESIA
  country_region_map.set("IL", "EA"); // ISRAEL
  country_region_map.set("IN", "AP"); // INDIA
  country_region_map.set("IT", "EA"); // ITALY
  country_region_map.set("JP", "AP"); // JAPAN
  country_region_map.set("KP", "AP"); // DEMOCRATIC PEOPLE'S REPUBLIC OF KOREA
  country_region_map.set("KR", "AP"); // REPUBLIC OF KOREA
  country_region_map.set("MX", "LA"); // MEXICO
  country_region_map.set("MY", "AP"); // MALAYSIA
  country_region_map.set("NL", "EA"); // NETHERLANDS
  country_region_map.set("NO", "EA"); // NORWAY
  country_region_map.set("PE", "LA"); // PERU
  country_region_map.set("PH", "AP"); // PHILIPPINES
  country_region_map.set("PL", "EA"); // POLAND
  country_region_map.set("RU", "EA"); // RUSSIAN FEDERATION
  country_region_map.set("SA", "AP"); // SAUDI ARABIA
  country_region_map.set("SG", "AP"); // SINGAPORE
  country_region_map.set("TW", "AP"); // TAIWAN
  country_region_map.set("UA", "EA"); // UKRAINE
  country_region_map.set("US", "NA"); // UNITED STATES
  country_region_map.set("VN", "AP"); // VIETNAM
  country_region_map.set("ZA", "EA"); // SOUTH AFRICA

  country_region_map.set("419", "LA"); // LOCALE CODE
  country_region_map.set("XA", "AP"); // LOCALE CODE
  country_region_map.set("XC", "EA"); // LOCALE CODE
  country_region_map.set("XL", "LA"); // LOCALE CODE
  country_region_map.set("XP", "AP"); // LOCALE CODE
  country_region_map.set("XU", "EA"); // LOCALE CODE

  return country_region_map.get(country);
}

function setEmptyOrValue(field_value) {
  field_value = field_value == null || field_value == "null" ? "" : field_value;
  return field_value;
}

function getParameterValue(attribute_value) {
  return Boolean(document.getElementById("msi-uinfo"))
    ? document.getElementById("msi-uinfo").getAttribute(attribute_value)
    : "";
}

function getLoginId() {
  let login_id = getParameterValue("data-ulogin");
  if (!Boolean(login_id)) {
    login_id = getParameterValue("data-uid");
  }
  return setEmptyOrValue(login_id);
}

function getLocale() {
  let locale_value = getParameterValue("data-ulocale");
  if (!Boolean(locale_value)) {
    locale_value = utag_data["locale"];
  }
  return setEmptyOrValue(locale_value);
}

function getFirstName() {
  let first_name = getParameterValue("data-ufirstname");
  if (!Boolean(first_name)) {
    first_name = getCookie("first_name");
  }
  return setEmptyOrValue(first_name);
}

function getLastName() {
  let last_name = getParameterValue("data-ulastname");
  if (!Boolean(last_name)) {
    last_name = getCookie("last_name");
  }
  return setEmptyOrValue(last_name);
}

function getEmail() {
  let emailVal = getParameterValue("data-uemail");
  return setEmptyOrValue(emailVal);
}

function getUserType() {
  let user_type = getParameterValue("data-utype");
  if (!Boolean(user_type)) {
    user_type = getCookie("usertype");
  }

  if (Boolean(user_type)) {
    user_type = getNormalizedUserType(user_type);
  }
  return setEmptyOrValue(user_type);
}

function getLandingAppName() {
  let landin_app_name = getParameterValue("data-ulandingapp");
  return setEmptyOrValue(landin_app_name);
}

function getCountry() {
  let country_value = getParameterValue("data-ucountry");
  if (!Boolean(country_value)) {
    country_value = navigator.language.includes("-")
      ? navigator.language.split("-")[1]
      : "";
  }
  if (!Boolean(country_value)) {
    country_value = navigator.language.includes("_")
      ? navigator.language.split("_")[1]
      : "";
  }
  return setEmptyOrValue(country_value.toUpperCase());
}

function getRegion() {
  let region = getParameterValue("data-uregion");
  if (!Boolean(region)) {
    region = getCookie("region");
  }
  if (!Boolean(region)) {
    let locale = getLocale();
    if (Boolean(locale)) {
      region = getCountryMapRegion(locale.substring(3).toUpperCase());
    }
  }
  if (!Boolean(region)) {
    let country_value = getCountry();
    if (Boolean(country_value)) {
      region = getCountryMapRegion(country_value);
    }
  }
  if (!Boolean(region)) {
    region = "NA";
  }
  return getNormalizedRegion(region.toUpperCase());
}

function getCookie(name) {
  let cookie = {};
  document.cookie.split(";").forEach(function (el) {
    let [k, v] = el.split("=");
    cookie[k.trim()] = v;
  });
  return cookie[name];
}

function eraseCookie(name) {
  document.cookie = name + "=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;";
}

if (getCookie("IsBannerLoaded") == undefined) {
  document.cookie = "IsBannerLoaded=1;Domain=motorolasolutions.com;";
}

/*** This is the animation function based on isConnected parameter it will apply or remove animation****/
function swapeAnimationClass(isConnected) {
  if (Boolean(isConnected)) {
    $(
      ".embeddedServiceSidebar .embeddedServiceSidebarMinimizedDefaultUI"
    ).addClass("messageAnimation");
  } else {
    $(
      ".embeddedServiceSidebar .embeddedServiceSidebarMinimizedDefaultUI"
    ).removeClass("messageAnimation");
    $("#new-message").hide();
  }
}

/*** show the banner after configure time once agent in online ***/
function openBannerPopup(bannerConfig) {
  console.log("Banner Method Invoked");
  if (
    getCookie("IsBannerLoaded") === "1" &&
    loaded == 0 &&
    !$(".embeddedServiceSidebarMinimizedDefaultUI")[0]
  ) {
    let site_user_type = Boolean(getUserType()) ? getUserType() : "GUEST";
    bannerConfig = JSON.parse(bannerConfig);

    for(const bannerConfigIterable of bannerConfig){
      if(Boolean(bannerConfigIterable[site_user_type])){
        bannerConfig = bannerConfigIterable[site_user_type];
      }
    }

    if (Boolean(bannerConfig.enabled)) {
      setTimeout(function () {
        document.getElementById("sfchatbanner").classList.add("active");
        loaded = 1;
        //proactive chat event
        reusableAnalyticsEvent(
          "view",
          "chat",
          "content impression",
          "proactive chat",
          "@proactive chat impression",
          "1",
          "public",
          "",
          "proactive chat popup",
          "9"
        );
        eraseCookie("IsBannerLoaded");
        document.cookie = "IsBannerLoaded=0;Domain=motorolasolutions.com;";
        //}
      }, bannerConfig.start_delay_time_ms);
    }
  }
}

/* Description : onload call the rest service using endpoint  through ajax and get the response(respective locale specific custom meta data record) from rest service
 *  endpoint  : endpoint url of salesforce instance
 *  parameters : locale
 *  reponse : respective locale specific custom meta data record (configResp)
 */
$(document).ready(function () {
  const siteUrl = window.location.href;
  const moca_keyword = getKeyword(siteUrl);
  const locale = Boolean(getLocale()) ? getLocale() : "_DEFAULT";
  const country = Boolean(getCountry()) ? getCountry() : "_DEFAULT";
  const region = Boolean(getRegion()) ? getRegion() : "";

  const site_end_point_url =
    "https://motorolasolutions.my.site.com/channel/services/apexrest/einsteinconfigurl?localename=" +
    locale +
    "&keyword=" +
    moca_keyword +
    "&region=" +
    region +
    "&country=" +
    country;
  console.log(
    "****************************************************Site parms start**************************************************************************"
  );
  console.log("keyword=============>" + moca_keyword);
  console.log("locale==============>" + locale);
  console.log("country=============>" + country);
  console.log("region==============>" + region);
  console.log("getLoginId()========>" + getLoginId());
  console.log("getFirstName()======>" + getFirstName());
  console.log("getLastName()=======>" + getLastName());
  console.log("getEmail()==========>" + getEmail());
  console.log("getUserType()=======>" + getUserType());
  console.log("getLandingAppName()=>" + getLandingAppName());
  console.log("siteurl=============>" + site_end_point_url);
  console.log(
    "***************************************************Site parms end***************************************************************************"
  );

  function buildPrechatDataMap() {
    let dataMap = new Map();
    let queryString = new URLSearchParams(location.search);

    //search from URL parameters
    for (let pair of queryString.entries()) {
      let param = pair[0];
      let value = pair[1];
      //tn, fn, sc, sn
      if (param == "tn") {
        dataMap.set("technologyName", value);
      } else if (param == "fn") {
        dataMap.set("familyName", value);
      } else if (param == "sc") {
        dataMap.set("serviceCode", value);
      } else if (param == "sn") {
        dataMap.set("serialNumber", value);
      }
    }
    //search cookies
    dataMap = checkCookies(dataMap);

    //Search URL path
    dataMap = checkUrlPath(dataMap);
    return dataMap;
  }

  function checkUrlPath(dataMap) {
    let urlSegment = location.pathname.split("getstarted/");
    if (urlSegment.length == 1) {
      return dataMap;
    } else {
      let pathArray = urlSegment[1].split("/");
      if (
        dataMap.get("technologyName") == null ||
        dataMap.get("technologyName") == ""
      ) {
        dataMap.set("technologyName", pathArray[0]);
      }
      if (
        dataMap.get("familyName") == null ||
        dataMap.get("familyName") == ""
      ) {
        dataMap.set("familyName", pathArray[1]);
      }
    }
    return dataMap;
  }

  function checkCookies(dataMap) {
    const cookieNames = [
      "prod_technology_name",
      "prod_family_name",
      "prod_service_code",
      "prod_serial_number",
    ];
    let cookieToPrechatMap = new Map();
    cookieToPrechatMap.set("prod_technology_name", "technologyName");
    cookieToPrechatMap.set("prod_family_name", "familyName");
    cookieToPrechatMap.set("prod_service_code", "serviceCode");
    cookieToPrechatMap.set("prod_serial_number", "serialNumber");

    let decodedCookie = decodeURIComponent(document.cookie);
    let cookieArray = decodedCookie.split(";");

    for (const cookie of cookieArray) {
      let mutableCookie = cookie;
      while (mutableCookie.charAt(0) == " ") {
        mutableCookie = mutableCookie.substring(1);
      }
      let pair = mutableCookie.split("=");
      let name = pair[0];
      let val = pair[1];
      if (cookieNames.indexOf(name) >= 0) {
        let prechatVarName = cookieToPrechatMap.get(name);
        if (dataMap.get(prechatVarName)) {
          if (dataMap.get(prechatVarName == "")) {
            dataMap.set(prechatVarName, val);
          }
        } else {
          dataMap.set(prechatVarName, val);
        }
      }
    }
    return dataMap;
  }

  $.ajax({
    url: site_end_point_url,
    context: document.body,
    success: function (configResp) {
      let bannerText = configResp.Banner_Text__c;
      bannerConfig = configResp.Popup_Banner_Config__c;
      embeddedSericeDeploymentName =
        configResp.Embedded_Service_Deployment_Name__c;
      $("#bannerId").html(bannerText);
      availiabilityapi =
        configResp.Live_Agent_Chat_Url__c +
        "/rest/Visitor/Availability.jsonp?Availability.prefix=Visitor&Availability.ids=[" +
        configResp.Button_Id__c +
        "]&callback=embedded_svc.liveAgentAPI.connection.handlePing&deployment_id=" +
        configResp.Deployment_Id__c +
        "&org_id=" +
        configResp.Org_Id__c +
        "&version=" +
        configResp.Version__c;
      if (Boolean(configResp.isDebug__c)) {
        let entries = Object.entries(configResp);
        console.log(embeddedSericeDeploymentName);
        console.log("keyword=============>" + moca_keyword);
        console.log("locale==============>" + locale);
        console.log("country=============>" + country);
        console.log("region==============>" + region);
        console.log("getLoginId()========>" + getLoginId());
        console.log("getFirstName()======>" + getFirstName());
        console.log("getLastName()=======>" + getLastName());
        console.log("getEmail()==========>" + getEmail());
        console.log("getUserType()=======>" + getUserType());
        console.log("getLandingAppName()=>" + getLandingAppName());
        console.log("siteurl=============>" + site_end_point_url);
        console.log("rows count==========>" + entries.length);
        console.log(availiabilityapi);
        console.table(entries);
      }

      if (!Boolean(configResp.Id)) {
        return;
      }

      const isAuthenticated = Boolean(getLoginId()) ? true : false;

      let gaClientId = "";
      if (Boolean(utag_data["cp._ga"])) {
        let gaId = utag_data["cp._ga"]?.split(".");
        let size = gaId.length;
        if (size == 4) {
          gaClientId = gaId[size - 2] + "." + gaId[size - 1];
        }
      } else {
        console.log("Not able to get GA ClientId");
      }

      let prechatDataMap = buildPrechatDataMap();
      console.log(prechatDataMap);
      let initESW = function (gslbBaseURL) {
        embedded_svc.settings.chatbotAvatarImgURL =
          "https://www.motorolasolutions.com/content/dam/msi/sfchat/brand-mark@3x.png";
        embedded_svc.settings.displayHelpButton =
          configResp.Is_Display_Chat_Button__c;

        /***  update the below fields on chatTrascript record ***/
        embedded_svc.settings.extraPrechatFormDetails = [
          {
            value: window.location.href,
            transcriptFields: ["Source_URL__c"],
          },
          {
            value: configResp.Site_Language__c,
            transcriptFields: ["Language__c"],
          },
          {
            label: configResp.Last_Name_ChatT__c,
            transcriptFields: ["Last_Name__c"],
          },
          {
            label: configResp.First_Name_ChatT__c,
            transcriptFields: ["First_Name__c"],
          },
          {
            label: configResp.Email_Address_ChatT__c,
            transcriptFields: ["Email_Address__c"],
          },
          {
            value: isAuthenticated,
            transcriptFields: ["Is_Authenticated__c"],
          },
          {
            value: gaClientId,
            transcriptFields: ["GA_Client_ID__c"],
          },
        ];

        if (prechatDataMap.get("technologyName")) {
          embedded_svc.settings.extraPrechatFormDetails.push({
            transcriptFields: ["ProductTechnologyPrechat__c"],
            value: prechatDataMap.get("technologyName").toUpperCase(),
          });
        }
        if (prechatDataMap.get("familyName")) {
          embedded_svc.settings.extraPrechatFormDetails.push({
            transcriptFields: ["ProductFamilyPrechat__c"],
            value:
              prechatDataMap.get("familyName")[0].toUpperCase() +
              prechatDataMap.get("familyName").slice(1),
          });
        }
        if (prechatDataMap.get("serialNumber")) {
          embedded_svc.settings.extraPrechatFormDetails.push({
            transcriptFields: ["SerialNumberPrechat__c"],
            value: prechatDataMap.get("serialNumber"),
          });
        }
        if (prechatDataMap.get("serviceCode")) {
          embedded_svc.settings.extraPrechatFormDetails.push({
            transcriptFields: ["ServiceCodePrechat__c"],
            value: prechatDataMap.get("serviceCode"),
          });
        }
        embedded_svc.settings.fallbackRouting = [configResp.Button_Id__c];
        embedded_svc.settings.extraPrechatInfo = [
          {
            entityFieldMaps: [
              {
                doCreate: true,
                doFind: true,
                fieldName: "LastName",
                isExactMatch: true,
                label: "Last Name",
              },
              {
                doCreate: true,
                doFind: true,
                fieldName: "FirstName",
                isExactMatch: true,
                label: "First Name",
              },
              {
                doCreate: true,
                doFind: true,
                fieldName: "Email",
                isExactMatch: true,
                label: "Email",
              },
            ],
            entityName: "Contact",
            showOnCreate: false,
          },
        ];

        /*** assign the configResp record field values to all the required parameters in embeded script ***/
        embedded_svc.settings.storageDomain = "motorolasolutions.com";
        embedded_svc.settings.language = configResp.Site_Language__c;
        embedded_svc.settings.loadingText = configResp.Loading_Text__c;
        embedded_svc.settings.autoOpenPostChat = true;
        embedded_svc.settings.defaultMinimizedText =
          configResp.Default_Minimized_Text__c;
        embedded_svc.settings.disabledMinimizedText =
          configResp.Disabled_Minimized_Text__c;
        embedded_svc.settings.enabledFeatures = ["LiveAgent"];
        embedded_svc.settings.entryFeature = "LiveAgent";

        /***  alternate routing script ***/
        let routingObj;
        if (Boolean(configResp.Url_Key_Set__c)) {
          routingObj = JSON.parse(configResp.Url_Key_Set__c);
        } else {
          routingObj = {};
        }

        if (Object.keys(routingObj).length > 0) {
          let ents = Object.keys(routingObj);
          let alterButtonId = "";
          ents.forEach((key) => {
            if (siteUrl.includes(key)) {
              alterButtonId = routingObj[key];
            }
          });

          embedded_svc.settings.directToButtonRouting = function (dt) {
            if (Boolean(alterButtonId)) {
              return alterButtonId;
            }
          };
        }

        /***  this event fired when agent message some thing to customer ***/
        embedded_svc.addEventHandler("onAgentMessage", function (data) {
          if ($("#new-message").length === 0) {
            let $div = $("<span>", {
              id: "new-message",
            });
            $(".embeddedServiceSidebar").append($div);
            $("#new-message").text(configResp.Display_Text__c);
          }

          $("#new-message").show();
          $(".messageContent").hide();
          swapeAnimationClass(true);
        });

        /***  this event fired when customer minimize the chat window ***/
        embedded_svc.addEventHandler("afterMinimize", function (data) {
          swapeAnimationClass(isConnected);
          $(".messageContent").show();
        });

        /***  this event fired when chat is connected with Agent ***/
        embedded_svc.addEventHandler("onChatEstablished", function (data) {
          $("#new-message").hide();
          swapeAnimationClass(true);
          $(".messageContent").show();
          isConnected = true;
          embeddedSericeDeploymentName = "Einstein";
        });

        embedded_svc.addEventHandler(
          "onChatTransferSuccessful",
          function (data) {
            embeddedSericeDeploymentName = "Agent";
          }
        );

        /***  this event fired when chat is ended by Agent ***/
        embedded_svc.addEventHandler("onChatEndedByAgent", function (data) {
          swapeAnimationClass(false);
          $("#new-message").hide();
          isConnected = false;
          embeddedSericeDeploymentName = "";
        });

        /***  this event fired when chat is ended by Customer ***/
        embedded_svc.addEventHandler("onChatEndedByChasitor", function (data) {
          swapeAnimationClass(false);
          $("#new-message").hide();
          isConnected = false;
          embeddedSericeDeploymentName = "";
        });

        /* this event fired when customer maximize the chat window*/
        embedded_svc.addEventHandler("afterMaximize", function (data) {
          swapeAnimationClass(isConnected);
          $("#new-message").hide();

          /* added placeholders texts*/
          $("#FirstName").attr(
            "placeholder",
            configResp.First_Name_Place_Holder__c
          );
          $("#LastName").attr(
            "placeholder",
            configResp.Last_Name_Place_Holder__c
          );
          $("#Email").attr("placeholder", configResp.Email_Place_Holder__c);

          /* added privacy statement text, language banner*/
          if ($("#policy-div").length === 0) {
            let $div = $("<span>", {
              id: "policy-div",
            });

            let policyUrl;
            // banner code start
            if (
              configResp.Is_Banner_Needed__c &&
              $("#banner-div").length === 0
            ) {
              let $div1 = $("<span>", {
                id: "banner-div",
              });
              $(".fieldList").append($div1);
              let bannerString =
                '<div style="background:#fff2cc;border: solid 1px #ffd73a; text-align: center; width: auto; font-size: 12px; border-radius: 3px; color: #000; margin-bottom: 15px; margin-top: 20px; padding: 5px;"><img src="https://www.motorolasolutions.com/content/dam/msi/sfchat/warning-solid-24@3x.png" align="left" height="24px" width="24px" style="float:left;"><div id="languageBannerId">' +
                configResp.Supported_Language_Banner__c +
                "</div></div>";
              $("#banner-div").html(bannerString);
              $(".fieldList").append($div);
              policyUrl =
                '<a href="' +
                configResp.Policy_URL__c +
                '" target ="_blank" style="color:#005EB8;float:center;margin-top:5px;margin-right:10px;font-size:14px;cursor: pointer ;text-decoration: none;" >' +
                configResp.Privacy_Statement__c +
                "</a><br/><br/>";
              $("#policy-div").html(policyUrl);
            } else {
              $(".buttonWrapper").prepend($div);
              policyUrl =
                '<a href="' +
                configResp.Policy_URL__c +
                '" target ="_blank" style="color:#005EB8;float:center;margin-top:5px;margin-right:10px;font-size:14px;cursor: pointer ;text-decoration: none;" >' +
                configResp.Privacy_Statement__c +
                "</a><br/><br/>";
              $("#policy-div").html(policyUrl);
            }
            //banner code end
            if (isAuthenticated) {
              setTimeout(function () {
                $("#FirstName")
                  .attr("disabled", "true")
                  .css("background-color", "#E6E9EC");
                $("#LastName")
                  .attr("disabled", "true")
                  .css("background-color", "#E6E9EC");
                $("#Email")
                  .attr("disabled", "true")
                  .css("background-color", "#E6E9EC");
              }, 500);
            }
          }
        });

        embedded_svc.init(
          configResp.First_Url__c,
          configResp.Second_Url_Channel__c,
          gslbBaseURL,
          configResp.Org_Id__c,
          configResp.Embedded_Service_Deployment_Name__c,
          {
            baseLiveAgentContentURL: configResp.baseLiveAgentContentURL__c,
            deploymentId: configResp.Deployment_Id__c,
            buttonId: configResp.Button_Id__c,
            baseLiveAgentURL: configResp.baseLiveAgentURL__c,
            eswLiveAgentDevName: configResp.eswLiveAgentDevName__c,
            isOfflineSupportEnabled: configResp.isOfflineSupportEnabled__c,
          }
        );
      };

      if (!window.embedded_svc) {
        let s = document.createElement("script");
        s.setAttribute("src", configResp.setAttribute_src__c);
        s.onload = function () {
          initESW(null);
        };
        document.body.appendChild(s);
      } else {
        initESW("https://service.force.com");
        /*** once dom is modified from offline to online this method will invoke ***/
        $(document).on("DOMSubtreeModified", ".helpButtonEnabled", function () {
          isOnline = true;
          setTimeout(function () {
            if (
              $("button").hasClass("helpButtonEnabled") &&
              !$("div").hasClass("messageContent")
            ) {
              if (loaded == 0) {
                openBannerPopup(bannerConfig);
              }
            } else {
              document
                .getElementById("sfchatbanner")
                .classList.remove("active");
            }
          }, 1000);
        });

        /*** once dom is modified from online  to offline this method will invoke ***/
        $(document).on(
          "DOMSubtreeModified",
          ".helpButtonDisabled",
          function () {
            isOnline = false;
            $(
              ".embeddedServiceHelpButton .helpButton .helpButtonDisabled "
            ).removeClass("messageAnimation");
            setTimeout(function () {
              if (
                $("button").hasClass("helpButtonDisabled") &&
                !$("div").hasClass("messageContent")
              ) {
                document
                  .getElementById("sfchatbanner")
                  .classList.remove("active");
              } else {
                if (loaded == 0) {
                  openBannerPopup(bannerConfig);
                }
              }
            }, 1000);
          }
        );

        /*** added animation if dom contains new message ***/
        $(document).on("DOMSubtreeModified", ".message", function () {
          let msgLength = $(
            '.message:contains("' + configResp.Check_Text__c + '")'
          ).length;
          if (msgLength == 0) {
            swapeAnimationClass(false);
            $("#new-message").hide();
            $(".messageContent").show();
          }

          if ($(".chasitorText")[0]) {
            swapeAnimationClass(true);
          }
          if ($("iframe").hasClass("snapins_postChat")) {
            swapeAnimationClass(false);
          }
        });

        $(document).on("click", ".helpButtonEnabled", function (e) {
          document.getElementById("sfchatbanner").classList.remove("active");
          let impressioned = "no";
          if (loaded == 1) impressioned = "yes";
          if (!Boolean(isHeaderClick)) {
            /** chatFloaterEvent event ***/
            let addDetails =
              "proactive chat popup impressioned: " + impressioned;
            reusableAnalyticsEvent(
              "click",
              "chat",
              "button",
              "chat floater",
              "@open chat window",
              "1",
              "public",
              addDetails,
              "chat widget",
              "9"
            );
          }
          isHeaderClick = false;
          loaded = 1;

          /***  get and prepopulate the authenticated site use details to pre chat form ***/
          if (isAuthenticated) {
            let user_first_name = getFirstName();
            let user_last_lname = getLastName();
            let user_email = getEmail();

            embedded_svc.settings.prepopulatedPrechatFields = {
              FirstName: user_first_name,
              LastName: user_last_lname,
              Email: user_email,
              Subject: "Hello",
            };
          } else {
            console.log("Unable to get the name");
          }
        });

        $(document).on("click", ".helpButtonDisabled", function (e) {
          let contactUsFormUrl;
          if (typeof contactUsUrl !== "undefined") {
            contactUsFormUrl = contactUsUrl;
          } else {
            contactUsFormUrl = $(".navbar .ms-button-chat").attr(
              "data-contact-form-url"
            );
          }
          /***  offline support floater event ***/
          reusableAnalyticsEvent(
            "click",
            "",
            "button",
            "offline support floater",
            contactUsFormUrl,
            "1",
            "public",
            "",
            "chat widget",
            "9"
          );
          window.open(contactUsFormUrl, "_self");
        });
      }
    },
    error: function (request, status, errorThrown) {
      console.log(status);
      console.log(errorThrown);
      console.log(request);
    },
  });
});

/*** Close button on Alert ***/
let sfclose = document.getElementById("sfclose");
let sfpop = document.getElementById("sfchatbanner");
if (sfclose) {
  sfclose.addEventListener("click", function () {
    reusableAnalyticsEvent(
      "click",
      "chat",
      "button",
      "proactive chat close",
      "@proactive chat close",
      "1",
      "public",
      "",
      "proactive chat popup",
      "9"
    );
    sfpop.classList.remove("active");
  });
}

/***  this is the generic function for all analytics events ***/
function reusableAnalyticsEvent(
  act,
  lkCatg,
  lkType,
  lkLabel,
  lkUrl,
  lkPlace,
  restr,
  addDetail,
  cn,
  parea
) {
  window.document.dispatchEvent(
    new CustomEvent(analyticsSiteName, {
      detail: {
        action: act,
        "data-uet": {
          "link-category": lkCatg,
          "link-type": lkType,
          "link-label": lkLabel,
          "link-url": lkUrl,
          "link-place": lkPlace,
          restriction: restr,
          "add-detail": addDetail,
          cname: cn,
          "page-area": parea,
        },
      },
    })
  );
}
