        var appname = '';
        var availiabilityapi = "";
        var loaded = 0;
        var bannerText = '';
        var locale;
        var isConnected = false;
        var isOnline = false;
        var isHeaderClick = false;
        var bannerTime;
        var analyticsSiteName;
        var embeddedSericeDeploymentName;

        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 20sec once agent in online ***/
        function openBannerAfterTimeout() {
            setTimeout(function () {
                if (getCookie("IsBannerLoaded") === '1' && loaded == 0 && !$('.embeddedServiceSidebarMinimizedDefaultUI')[0]) {
                    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;";
                }
            },bannerTime);
        }

        /* 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 () {
            var siteUrl = window.location.href;
            locale = utag_data["locale"];
            $.ajax({
                url: "https://partnerapply.motorolasolutions.com/services/apexrest/liveagentconfigurl?localename=" + locale,
                context: document.body,
                success: function (configResp) {
                    bannerText = configResp.Banner_Text__c;
                    bannerTime = configResp.Banner_Time__c;
                    embeddedSericeDeploymentName = 'Agent';
                    $('#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(availiabilityapi);
                        console.table(entries);
                        console.log(embeddedSericeDeploymentName);
                    }

                    var emailValue = "";
                    if(Boolean(document.getElementById("msi-uinfo"))){
                        var emailVal = document.getElementById("msi-uinfo").getAttribute("data-uemail");
                        emailValue = (emailVal == null || emailVal == "null") ? "" : emailVal;
                    }

                    var isAuthenticated = false;
                    if(emailValue != ''){
                        isAuthenticated = true;
                    }
                    else{
                        emailValue = "";
                    }

                    var gaClientId = '';
                    if(Boolean(utag_data['cp._ga'])){
                        let gaId = utag_data['cp._ga'];
                        gaId = gaId.split(".");
                        let size = gaId.length;
                        if(size == 4){
                            gaClientId = gaId[size-2]+'.'+gaId[size-1];
                        }
                    }
                    else{
                        console.log('Not able to get GA ClientId');
                    }

                    var 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"]
                            }
                        ];

                        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 = false;
                        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) {
                                var $div = $("<span>", {
                                    id: "new-message"
                                });
                                $(".embeddedServiceSidebar").append($div);
                                $("#new-message").text(configResp.Display_Text__c);
                            }

                            $("#new-message").show();
                            $('.messageContent').hide();
                            swapeAnimationClass(true);
                            embeddedSericeDeploymentName = 'Agent';
                        });

                        /***  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 = '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) {
                                var $div = $("<span>", {
                                    id: "policy-div"
                                });
                                // banner code start
                                if (configResp.Is_Banner_Needed__c && $('#banner-div').length === 0) {
                                    var $div1 = $("<span>", {
                                        id: "banner-div"
                                    });
                                    $(".fieldList").append($div1);
                                    var 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);
                                    var 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);
                                    var 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) {
                        var 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) {
                                        openBannerAfterTimeout();
                                    }
                                }
                                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) {
                                        openBannerAfterTimeout();
                                    }
                                }
                            }, 1000)
                        })

                        /*** added animation if dom contains new message ***/
                        $(document).on('DOMSubtreeModified', '.message', function () {
                            var 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');
                            var 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 ***/
                            var name = '';
                            if(siteUrl.includes("shop") && Boolean(document.getElementById("msi-uinfo"))){
                                var fname = (document.getElementById("msi-uinfo").getAttribute("data-ufirstname") != "null") ? document.getElementById("msi-uinfo").getAttribute("data-ufirstname") : "";
                                var lname = (document.getElementById("msi-uinfo").getAttribute("data-ulastname") != "null") ? document.getElementById("msi-uinfo").getAttribute("data-ulastname") : "";
                                name = fname+" "+lname;
                                name = name.trim().split(" ");
                            }
                            else if($("#header-user-menu .header-user-menu-heading").text() && $("#header-user-menu .header-user-menu-label").text()){
                                name = $("#header-user-menu .header-user-menu-heading").text().trim().split(" ");
                            }
                            else if($("#ms-nav-buddy-menu .nav-login-name").text()){
                                name = $("#ms-nav-buddy-menu .nav-login-name").text().trim().split(" ");
                            }

                            if(Boolean(name) && isAuthenticated){
                                embedded_svc.settings.prepopulatedPrechatFields = {
                                    FirstName: name[0],
                                    LastName: name[1],
                                    Email: emailValue,
                                    Subject: "Hello"
                                };
                            }
                            else{
                                console.log('Unable to get the name');
                            }
                        });

                        $(document).on("click", ".helpButtonDisabled", function (e) {
                            if (locale.toUpperCase().indexOf('EN') == -1) {
                                if (typeof contactUsUrl !== 'undefined') {
                                    var contactUsFormUrl = contactUsUrl;
                                }
                                else{
                                    var contactUsFormUrl = $("#ms-nav-util .ms-button-chat").attr("data-contact-form-url");
                                }
                            }
                            else {
                                if (typeof contactUsUrl !== 'undefined') {
                                    var contactUsFormUrl = contactUsUrl;
                                } 
                                else {
                                    var 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 ***/
        var sfclose = document.getElementById('sfclose');
        var sfpop = document.getElementById('sfchatbanner');
        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
                        }
                    }
                })
            );
        }