// GLOBAL VARS
// globally define adobe object
let s = null;
// create dataprops object for adobe
let dataProps = {};

const COMMUNITY_NAME = 'disneyplushelpcenter';
let COMMUNITY_NAME_VFORCE = 'disneyplushelpcentervforcesite';


// BEGIN general Functions

function getLocale() {
    let urlPath = document.URL;
    let locale = '';
    if (document.URL.indexOf('disneyplushelpcenter') != -1) {
        urlPath = document.URL.substring(document.URL.indexOf('disneyplushelpcenter')+21);
        locale = urlPath.substring(0, urlPath.indexOf('/'));
    } else {
        urlPath = document.URL.substring(document.URL.indexOf('.com')+5);
        locale = urlPath.substring(0, urlPath.indexOf('/'));
    }

    const regex = /[a-z]{2}-[a-zA-Z]{2}/gm;
    let localeMatch = locale.match(regex);
    
    if ((locale.length==5 && localeMatch) || locale.length==2) {
        console.log('locale match: ' + localeMatch);
        return locale;
    } else {
        return 'en-US';
    }
    
}

function getLangCountryStr() {

    let documentURL = document.URL;
    let articleIndex = documentURL.indexOf("article/");
    let isArticle = false;
    let storageCountry = '';
    let storageLanguage = '';
    if (articleIndex != -1) {
        const regex = /-[a-z]{2}-[a-z]{2}-/gm;
        let urlName = documentURL.substring(articleIndex + 8);
        let result = urlName.match(regex);
        console.log('page-init: article page: URL regex match: ' + JSON.stringify(result));
        if (result) {
            storageLanguage = result[0].substring(1,3);
            console.log('page-init: article page: URL language: ' + storageLanguage);
            storageCountry = result[0].substring(4,6);
            console.log('page-init: article page: URL country: ' + storageCountry);
            isArticle = true;
        }
    }

    if (isArticle) {
        return '&language=' + storageLanguage + '&country=' + storageCountry;
    } else {
        return '';
    }
    
}

function isActiveSession() {
    //check for an active session
    let currentStatus = "";
    let language = window.sessionStorage.getItem("LSKey[c]language");
    // add any checks if necessary
    //let storageKey = "-" + language + "___chat";    
    let storageKey = "-___chat";    
    for (i = 0; i < localStorage.length; i++)   {

        if (localStorage.key(i).includes(storageKey)) {

            console.log('page-init: chat-log: isActiveSession found localstorage = ' + localStorage.getItem(localStorage.key(i)));

            let sessionStatus = JSON.parse(localStorage.getItem(localStorage.key(i)));
            currentStatus = sessionStatus.session.status;
            break;
        }

    };

    console.log('page-init: chat-log: isActiveSession currentStatus = ' + currentStatus);
    return (currentStatus == "OPEN" || currentStatus == "ASSIGNING" || currentStatus == "CLOSED");
}
// END functions


// BEGIN nice script
const BOT_ALLOWED_COUNTRIES = ['US', 'UK', 'AR', 'BR', 'CL', 'CO', 'CR', 'EC', 'MX', 'PA', 'PE', 'UY', 'AU', 'NZ', 'SG'];
const BRAND_DISNEY = 'Disney';
const TIER = 'Tier1';
const SF_BOT_LANGUAGES = [
    {"sfLanguage": "es-AR", "botLanguage" : "es-LA"},
    {"sfLanguage": "es-CL", "botLanguage" : "es-LA"},
    {"sfLanguage": "es-CO", "botLanguage" : "es-LA"},
    {"sfLanguage": "es-CR", "botLanguage" : "es-LA"},
    {"sfLanguage": "es-EC", "botLanguage" : "es-LA"},
    {"sfLanguage": "es-MX", "botLanguage" : "es-LA"},
    {"sfLanguage": "es-PA", "botLanguage" : "es-LA"},
    {"sfLanguage": "es-PE", "botLanguage" : "es-LA"},
    {"sfLanguage": "es-UY", "botLanguage" : "es-LA"},
    {"sfLanguage": "es-US", "botLanguage" : "es-LA"}
];

function getBotLanguage(sfLanguage) {
    let botLanguage = sfLanguage;
    let filteredValues = SF_BOT_LANGUAGES.filter(item => {
        return item.sfLanguage == sfLanguage;
    });
    return (filteredValues.length > 0) ? filteredValues[0].botLanguage : botLanguage;
}

function isBotEnabled() {
    const countryValue = window.sessionStorage.getItem('LSKey[c]country');
    console.log('page-init: chat-log: isBotEnabled: ' + countryValue);
    return countryValue && BOT_ALLOWED_COUNTRIES.includes(countryValue);
}

function initiateNice() {
    if (isBotEnabled()) {
        console.log('page-init: chat-log: bot enabled... load nice chat');
        (function (i, s, o, r, g, v, a, m) {
            g = v ? g + '?v=' + v : g; i['BrandEmbassy'] = r;
            i[r] = i[r] || function () { (i[r].q = i[r].q || []).push(arguments) }; i[r].l = +new Date();
            a = s.createElement(o); m = s.getElementsByTagName(o)[0]; a.async = 1;
            a.src = g + '?' + Math.round(Date.now() / 1000 / 3600); m.parentNode.insertBefore(a, m)
        }) (window, document, 'script', 'brandembassy', BRAND_EMBASSY_JS);

        let language = window.sessionStorage.getItem("LSKey[c]language");
        brandembassy('init', 3717, BRAND_EMBASSY_ID, language);

        brandembassy('setWindowWidth', '320px');
        brandembassy('setWindowHeight', '610px');
        brandembassy('setCustomCss', '[data-selector="Header"] {margin-bottom: 18px;}');
        brandembassy('setCustomCss', '[data-selector="MESSENGER"] {display: none;}');

        //hide the precontact survey form */
        brandembassy('hidePreSurvey');
        //brandembassy('openChatWindow');
        brandembassy('sendFirstMessageAutomatically', 'Hello');
        //brandembassy('autoStartSession');

        //Displays the chat window as if there are agents available*/
        brandembassy('enableChatAlwaysOnline');

        //SHOW SEND BUTTON*/
        brandembassy('showSendButton');

        //mute sound - VXSS-1123
        brandembassy('muteAudioNotification');


        //sets default width to 400px
        document.onreadystatechange = (event) => {

            if (document.readyState === 'complete') {
                brandembassy('setWindowWidth', '400px');
                //set the brand embassy fields here 1st time when session is set.
                /*let country = window.sessionStorage.getItem("LSKey[c]country");
                let language = window.sessionStorage.getItem("LSKey[c]language");
                console.log('setBrandEmbassy fields on load: country = ' + country + ' language: ' + language);*/
                setBrandEmbassyFields();
            }

        };

        document.addEventListener('chatBotStatusChange', showHideBot);

        document.addEventListener('setnicefields', function (event) {
            console.log('page-init: chat-log: call setBrandEmbassyFields (setnicefields event listener) : ' + event.detail.country + ', ' + event.detail.language);
            //setBrandEmbassyFields(event.detail.country, event.detail.language);
            setBrandEmbassyFields(event.detail);
        });

        brandembassy('onPushUpdate', ['CaseStatusChanged'], pushUpdatePayload => {

            if (typeof pushUpdatePayload === 'undefined' || typeof pushUpdatePayload.data === 'undefined') {
                return;
            }
            const { status } = pushUpdatePayload.data.case || {};

            if (typeof status === 'undefined') {
                return;
            }
            // When a previous case has been closed, this will set the custom fields again.

            if (status === 'closed') {
                //let country = window.sessionStorage.getItem("LSKey[c]country");
                //let language = window.sessionStorage.getItem("LSKey[c]language");

                //console.log('page-init: chat-log: call setBrandEmbassyFields (onPushUpdate listener) : ' + country + ', ' + language);
                //setBrandEmbassyFields(country, language);
                setBrandEmbassyFields();
            }

        });

    } 
}

//show/hide bot
function showHideBot() {
    let documentURL = document.URL;

    let chatbotActive = window.sessionStorage.getItem("LSKey[c]isChatBotActive");
    if (chatbotActive == "true" &&(documentURL.indexOf('/contact-us') == -1 || (isActiveSession()))) {
        brandembassy('setCustomCss', '[data-selector="MESSENGER"] {display: initial};');
    } else {
        console.log("hide the bot");
        brandembassy('setCustomCss', '[data-selector="MESSENGER"] {display: none};');
    }

}

function setBrandEmbassyFields(details) {
    console.log('page-init: chat-log: inside setBrandEmbassyFields : ');
    brandembassy('setCaseCustomField', 'brand', BRAND_DISNEY);
    brandembassy('setCaseCustomField', 'tier', TIER);
    brandembassy('setCaseCustomField', 'authenticated', "false");
    brandembassy('setCaseCustomField', 'user_id', "N/A");

    const country = window.sessionStorage.getItem("LSKey[c]country");
    const language = window.sessionStorage.getItem("LSKey[c]language");

    const localCountry = window.localStorage.getItem("LSKey[c]country");
    const localLanguage = window.localStorage.getItem("LSKey[c]language");

    var brandEmbassyCountry = "NO_COUNTRY_FOUND";
    var brandEmbassyLanguage = "NO_LANGUAGE_FOUND";

    if (!isEmpty(country)) {
        brandEmbassyCountry = country;
    } else if (!isEmpty(localCountry)) {
        brandEmbassyCountry = localCountry;
    }

    if (!isEmpty(language)) {
        brandEmbassyLanguage = language;
    } else if (!isEmpty(localLanguage)) {
        brandEmbassyLanguage = localLanguage;
    }        

    let botLanguage = getBotLanguage(brandEmbassyLanguage);
    console.log('page-init: chat-log: ' + language + " => botLanguage: " + botLanguage);

    let logId = Math.floor(Math.random() * 1000000);
    logBrandEmbassyData(brandEmbassyCountry, brandEmbassyLanguage, localCountry, localLanguage, country, language, logId);

    brandembassy('setCaseCustomField', 'sflogid', logId);
    brandembassy('setCaseCustomField', 'country', brandEmbassyCountry);
    brandembassy('setCaseCustomField', 'language', brandEmbassyLanguage);
    brandembassy('setCaseCustomField', 'locale', brandEmbassyLanguage.replace('-','_'));
    brandembassy('setCaseCustomField', 'botlanguage', botLanguage);

    //set the ipAddress and browser name
    let ipAddress = window.sessionStorage.getItem("LSKey[c]ip");
    brandembassy('setCaseCustomField', 'ipaddress',ipAddress);
    brandembassy('setCaseCustomField', 'browser', getBrowserName());
    
    let adobeId = getCookie('s_fid');
    //adobeId = adobeId?.toLowerCase();
    brandembassy('setCaseCustomField', 'adobeid', adobeId);

    if(details && !details.isguestuser)
    {
        console.log("Set Authenticated to TRUE");
        brandembassy('setCaseCustomField', 'authenticated', "true");
        brandembassy('setCaseCustomField', 'user_id', details.userid ? details.userid : "N/A");
        brandembassy('setCaseCustomField', 'identity_id', details.identityId ? details.identityId : "N/A");
        brandembassy('setCaseCustomField', 'account_id', details.disneyAccountId ? details.disneyAccountId : "N/A");
        brandembassy('setCaseCustomField', 'swid', details.swid ? details.swid : "N/A");
    }
    else{
        //get chatdata from session
        let chatData = window.sessionStorage.getItem("LSKey[c]chatdata");
        console.log("chatData = " + chatData);
        if (chatData) {
            chatData = JSON.parse(chatData);
        }
        let authenticated = chatData && chatData.userId ? "true" : "false";
        let user_id = chatData && chatData.userId ? chatData.userId : "N/A";
        let identity_id = chatData && chatData.identityId ? chatData.identityId : "N/A";
        let account_id = chatData && chatData.disneyAccountId ? chatData.disneyAccountId : "N/A";
        let swid = chatData && chatData.swid ? chatData.swid : "N/A";
        console.log("Set Authenticated to " + authenticated);
        brandembassy('setCaseCustomField', 'authenticated', authenticated);
        brandembassy('setCaseCustomField', 'user_id', user_id);
        brandembassy('setCaseCustomField', 'identity_id', identity_id);
        brandembassy('setCaseCustomField', 'account_id', account_id);
        brandembassy('setCaseCustomField', 'swid', swid);
    }    
}

async function logBrandEmbassyData(brandEmbassyCountry, brandEmbassyLanguage, localCountry, localLanguage, country, language, logId) {

    let documentURL = document.URL;
    let index = documentURL.indexOf('.com');
    let baseURL = documentURL.substring(0, index + 4);

    let communityName = COMMUNITY_NAME;
    let communityNameVforce = COMMUNITY_NAME_VFORCE;
    let serviceURL = SITE_DOMAIN + '/' + communityNameVforce;

    if(documentURL.indexOf(communityName) == -1) {
        communityName = "";
        communityNameVforce = "";
        serviceURL = baseURL;
    }

    let calloutURI = serviceURL + '/services/apexrest/BrandEmbassyLoggerService' +
        '?brand=' + BRAND_DISNEY + '&country=' + brandEmbassyCountry + '&language=' + brandEmbassyLanguage +
        '&localLanguage=' + localLanguage + '&localCountry=' + localCountry +
        '&sessionLanguage=' + language + '&sessionCountry=' + country +
        '&tier=' + TIER + '&authenticated=' + false + '&userId=N/A&randomNumber=' + logId;
    fetch(calloutURI, {
        method: "GET",
        cache: 'no-cache'
    }).then((response) => {
        console.log("BrandEmbassy Logged");
    }).catch(error => {
        console.error("Calling async logging error: ", error);
    });

}

/**stop body scrolling when feedback form is displayed**/
document.addEventListener('feedback', function (event) {
    //console.log("Received feedback event.", event.detail.status);
    let body = document.getElementsByTagName("body");
    if (body && body.length > 0) {
        let overflowValue = (event.detail.status == "open") ? "hidden" : "auto";
        body[0].style.overflow = overflowValue;
    }
});

document.addEventListener('startnicechat', function (event) {
    var top = screen.height-660;//20px margin
    var left=screen.width-375;

    let language = event.detail.language;
    let country = event.detail.country;
    let brand = BRAND_DISNEY;

    if (isBotEnabled()) {
        brandembassy('hideChatWindow');
    }

    let options = "width=375,height=640,toolbar=no,scrollbars=no,resizable=no,titlebar=no,left=" + left + ",top=" + top;
    window.open(LIVE_AGENT_URL + "?language=" + language + "&country=" + country + "&product=" + brand, "chatwindow", options);

});

document.addEventListener('startnicebot', function () {

    console.log('page-init: chat-log: startnicebot event');
    brandembassy('setCustomCss', '[data-selector="MESSENGER"] {display: initial};');
    brandembassy('hidePreSurvey');
    brandembassy('openChatWindow');
    brandembassy('sendFirstMessageAutomatically', 'Hello');

    if (!isActiveSession()) {
        brandembassy('hideAssignedAgent');
        brandembassy('autoStartSession');
    }

    if (getNiceStatus() != 'RECOVERING') {
        // send adobe chat initiation event
        let chatDataProps = {}
        chatDataProps.prop5 = 'Contact Button';
        chatDataProps.evar5 = 'Contact Button';
        chatDataProps.prop6 = 'N/A';
        chatDataProps.evar6 = 'N/A';
        chatDataProps.prop7 = 'FAB';
        chatDataProps.evar35 = 'FAB';
        chatDataProps.event7 = 1;
        chatDataProps.pageName = dataProps.pageName;
        chatDataProps.prop13 = dataProps.prop13;
        chatDataProps.prop14 = dataProps.prop14;
        chatDataProps.prop39 = dataProps.prop39;
        chatDataProps.evar74 = dataProps.evar74;
        chatDataProps.prop27 = dataProps.prop27;
        chatDataProps.evar27 = dataProps.evar27;

        handleAdobeData(chatDataProps, 'event');

        console.log('page-init: chat-log: startnicebot event: send adobe event7');
    }

});

window.addEventListener("message", receiveMessage, false);

function receiveMessage(event) {
    console.log("page-init: generic message-event: " + event);
    
    try{
        var jsonObject = "";
        if (event && event.data && typeof event.data === "string") {
            if (event.data.startsWith("loadSalesForceLiveChat")) {

                console.log('page-init: message-event: chat-log: loadSalesForceLiveChat');

                const delimiter = "#sep#";
                const splitArray = event.data.split(delimiter);
                try {
                    jsonObject = JSON.parse(splitArray[1]);
                } catch (error) {
                    console.error("page-init: chat-log: Error parsing JSON:", error);
                }

                //minimize the VA chat
                let country = window.sessionStorage.getItem("LSKey[c]country");
                let language = window.sessionStorage.getItem("LSKey[c]language");
                let product = BRAND_DISNEY;
                let tier = TIER;

                if (isBotEnabled()) {
                    brandembassy('hideChatWindow');
                }

                let w = 375;
                let h = 650;
                let l = window.innerWidth - w;
                let t = window.innerHeight - h;
                let options = "width=" + w + ",height=" + h + ",toolbar=no,scrollbars=no,resizable=no,titlebar=no,left=" + l + ",top=" + t;

                window.open(LIVE_AGENT_URL + '?language=' + language + '&country=' + country + '&product=' + product + '&ameliaconvid=' + jsonObject.ameliaconvid + '&tier=' + tier, "chatwindow", options);
            }

            if (event.data.startsWith("setnicefields")) {

                try {
                    //let country = window.sessionStorage.getItem("LSKey[c]country");
                    //let language = window.sessionStorage.getItem("LSKey[c]language");

                    //console.log('page-init: message-event: chat-log: call setBrandEmbassyFields : ' + country + ', ' + language);
                    setBrandEmbassyFields();

                    brandembassy('hidePreSurvey');
                    brandembassy('sendFirstMessageAutomatically', 'Hello');
                    if (!isActiveSession()) {
                        brandembassy('hideAssignedAgent');
                        brandembassy('autoStartSession');
                    }

                } catch (error) {
                    console.error("page-init: chat-log: Error parsing JSON:", error);
                }
            }

            if (event.data.startsWith("startnicebot")) {
                
                console.log('page-init: message-event: chat-log: startnicebot');

                brandembassy('setCustomCss', '[data-selector="MESSENGER"] {display: initial};');
                brandembassy('hidePreSurvey');
                //brandembassy('openChatWindow');
                brandembassy('sendFirstMessageAutomatically', 'Hello');

                if (!isActiveSession()) {
                    brandembassy('hideAssignedAgent');
                    brandembassy('autoStartSession');
                }

                if (getNiceStatus() != 'RECOVERING') {
                    // send adobe chat initiation event, only if this is new session
                    let chatDataProps = {}
                    chatDataProps.prop5 = 'Contact Button';
                    chatDataProps.evar5 = 'Contact Button';
                    chatDataProps.prop6 = 'N/A';
                    chatDataProps.evar6 = 'N/A';
                    chatDataProps.prop7 = 'FAB';
                    chatDataProps.evar35 = 'FAB';
                    chatDataProps.event7 = 1;
                    chatDataProps.pageName = dataProps.pageName;
                    chatDataProps.prop13 = dataProps.prop13;
                    chatDataProps.prop14 = dataProps.prop14;
                    chatDataProps.prop39 = dataProps.prop39;
                    chatDataProps.evar74 = dataProps.evar74;
                    chatDataProps.prop27 = dataProps.prop27;
                    chatDataProps.evar27 = dataProps.evar27;
                    
                    console.log('page-init: chat-log: handleAdobeData: startnicebot from message event: send adobe event7');
                    handleAdobeData(chatDataProps, 'event');
                }               

            }         
            
            if (event.data.startsWith("{")) {

                let eventData = JSON.parse(event.data);
                console.log('page-init: message-event: object data: ' + eventData);
                
                if (eventData.event && eventData.event == 'play') {
                    console.log("handleAdobeData: video play event: " + eventData.event);

                    const eventProps = {
                        'event17': 1,
                        'prop13': dataProps.prop13,
                        'prop14': dataProps.prop14,
                        'prop39': dataProps.prop39,
                        'evar74': dataProps.evar74,
                        'prop27': dataProps.prop27,
                        'evar27': dataProps.evar27
                    };
                    handleAdobeData(eventProps, 'event');
                }
            }
        } 

    } catch(err) {
        console.error("page-init: chat-log: Error in receiveMessage broadcast:", err);
    }        
}
// END Nice chat

// BEGIN primary Salesforce events pageref and writemeta 
document.addEventListener('pagerefchange', function (event) {
    console.log("page-init: pagerefchange event start.");
    if (isBotEnabled()) {
        showHideBot();
        getNiceStatus();
    }

    if (window.sessionStorage.getItem('LSKey[c]firstPage') == 'true'){
        console.log('page-init: pagerefchange: no longer on first page, set firstPage to false');
        // window.removeEventListener("beforeunload", beforeUnloadHandler, { once: true });
        window.sessionStorage.setItem('LSKey[c]firstPage','false');
    }

    let documentURL = document.URL;

    handleRobotsMetaTag(documentURL);

    console.log('page-init: pagerefchange: adobe: set analytics props');
    if (event.detail.isGuest == true) {
        // login status
        dataProps.prop39 = 'Unauthenticated';
        dataProps.evar74 = 'Unauthenticated';
    } else {
        // login status
        dataProps.prop39 = 'Authenticated';
        dataProps.evar74 = 'Authenticated';
    }

    // function in common markup - check for campaign and other incoming querystring params that need to pass to adobe analytics
    checkQueryParams();

    if (document.title == 'Error') {
        dataProps.pageName = '404 Error Page';
        dataProps.prop27 = '404 Error Page';
        dataProps.evar27 = '404 Error Page';
        dataProps.prop14 = '404 Error Page';
        dataProps.prop13 = document.title;
        console.log('handleAdobeData: error page');
        handleAdobeData(dataProps, 'page');
    } else if (documentURL.indexOf('/article') == -1 && documentURL.indexOf('/category') == -1) {

        console.log('page-init: pagerefchange: not an article or category page');

        let elements = document.querySelectorAll("[data-src='js']");
        if (elements) {
            elements.forEach(e => {
                e.remove();
            });
        }

        setTimeout(() => {
    
            dataProps.prop13 = document.title;
            // "Parent Page Title" - English version of title for non-article pages.  article version in writemetatags event
    
            if (document.URL.indexOf('/contact-us') !== -1) {
                dataProps.pageName = 'Contact Us';
                dataProps.prop27 = 'Contact Us';
                dataProps.evar27 = 'Contact Us';
                dataProps.prop14 = 'Contact Us';
            } else if (document.URL.indexOf('/global-search') !== -1) {
                dataProps.pageName = 'Global Search';
                dataProps.prop27 = 'Global Search';
                dataProps.evar27 = 'Global Search';
                dataProps.prop14 = 'Search Results';
            } else {
                dataProps.pageName = 'Home';
                dataProps.prop27 = 'Home';
                dataProps.evar27 = 'Home';
                dataProps.prop14 = 'Home';
            }
            console.log('page-init: pagerefchange: handleAdobeData: setting pagename: ', dataProps);
            handleAdobeData(dataProps, 'page');
        }, 100);
    }
        
});

function handleRobotsMetaTag(urlPath) {
    //hardcode for now
    console.log("handleRobotsMetaTag");
    let elements = document.querySelectorAll("[content='nosnippet']");
    if (elements) {
        elements.forEach(e => {
            e.remove();
        });
    }

    let regex = /disneyplus-[a-z]{2}-[a-z]{2}-cancel/;
    if (urlPath.indexOf("/article/disneyplus-cancel") != -1 || regex.test(urlPath)) {
        var link = document.createElement('meta');
        link.setAttribute('name', 'robots');
        link.content = 'nosnippet';
        document.getElementsByTagName('head')[0].appendChild(link);
    }
}


/**dynamically add metadata to article pages **/
document.addEventListener('writemetatags', function (event) {
    console.log("page-init: Received writemetatags event.");
    console.log("title: " + event.detail.title);
    console.log("summary: " + event.detail.summary);
    console.log("page:" + event.detail.page);

    let elements = document.querySelectorAll("[data-src='js']");
    if (elements) {
        elements.forEach(e => {
            e.remove();
        });
    }

    if (event.detail.page == "category") {

        // adobe code needed for article page.  need to wait for this meta before firing
        dataProps.pageName = 'Help Topic';
        dataProps.prop27 = 'Help Topic';
        dataProps.evar27 = 'Help Topic';
        dataProps.prop13 = document.title;
        dataProps.prop14 = event.detail.topic;

        console.log('handleAdobeData: category page');
        handleAdobeData(dataProps, 'page');

        var link = document.createElement('meta');
        link.setAttribute('name', 'og:url');
        link.content = document.URL;
        link.setAttribute("data-src", "js");
        document.getElementsByTagName('head')[0].appendChild(link);

    } else {

        // adobe code needed for article page.  need to wait for this meta before firing
        dataProps.pageName = 'Article Detail';
        dataProps.prop27 = 'Article Detail';
        dataProps.evar27 = 'Article Detail';
        dataProps.prop13 = document.title;
        dataProps.prop14 = event.detail.parenttitleenglish;
        //Article Updated Date: prop15
        dataProps.prop15 = event.detail.lastpublished;
        //Article Version: prop16
        dataProps.prop16 = event.detail.articleversionnumber;
        //salesforce URLname: prop28
        dataProps.prop28 = event.detail.urlname;
        // category
        dataProps.prop34 = event.detail.category;

        console.log('handleAdobeData: article detail page');
        handleAdobeData(dataProps, 'page');

        var link = document.createElement('meta');
        link.setAttribute('name', 'og:title');
        link.content = event.detail.title;
        link.setAttribute("data-src", "js");
        document.getElementsByTagName('head')[0].appendChild(link);

        link = document.createElement('meta');
        link.setAttribute('name', 'og:description');
        link.content = event.detail.summary;
        link.setAttribute("data-src", "js");
        document.getElementsByTagName('head')[0].appendChild(link);

        link = document.createElement('meta');
        link.setAttribute('name', 'description');
        link.content = event.detail.summary;
        link.setAttribute("data-src", "js");
        document.getElementsByTagName('head')[0].appendChild(link);

        //<meta name="robots" content="noindex">
        if (event.detail.suppress) {
            link = document.createElement('meta');
            link.setAttribute('name', 'robots');
            link.content = "noindex";
            link.setAttribute("data-src", "js");
            document.getElementsByTagName('head')[0].appendChild(link);
        }   
    }

    let canlink = document.createElement('link');
    canlink.setAttribute('rel', 'canonical');
    let primSession =  window.sessionStorage.getItem('LSKey[c]primaryLocale');
    let pathname = location.pathname;
    if (event.detail.page=='article' && primSession == 'true')  {
        const regex = /-[a-z]{2}-[a-z]{2}-/gm;
        pathname = pathname.replace(regex, "-");
    }
    canlink.href = location.protocol + '//' + location.host + pathname;
    canlink.setAttribute("data-src", "js");
    console.log('page-init: add custom canonical');
    document.getElementsByTagName('head')[0].appendChild(canlink);

});
// END SF events

// BEGIN OneTrust related code
function getOneTrustGroupValue(group) {

    let OptOutStatus = decodeURIComponent(document.cookie)
        .split("; ")
        .find((e) => e.startsWith("OptanonConsent"))
        ?.split("&")
        .find((e) => e.startsWith("groups"))
        .split("=")[1]
        .split(",")
        .find((e) => e.startsWith(group))
        ?.split(":");
    
    return OptOutStatus[1];
}

function hasUserOptedOut() {
    
    let optOutValue = getOneTrustGroupValue("4"); // 4 is opt out flag
    
    console.log('page-init: onetrust: opt out value: ' + optOutValue);

    if (optOutValue === "1" || window.sessionStorage.getItem('LSKey[c]region') === 'APAC' || window.sessionStorage.getItem('LSKey[c]region') === 'LATAM') {
        console.log('page-init: onetrust: User has opted in. load adobe library');
        window.sessionStorage.setItem('LSKey[c]allowAdobe', 'allow');
        console.log('page-init: onetrust: handleAdobeData: are dataProps set? ', dataProps);
        handleAdobeData(dataProps, 'onetrust');
    } else {
        console.log('page-init: onetrust: User has opted out. ');
        window.sessionStorage.setItem('LSKey[c]allowAdobe', 'reject');
        deleteAdobeCookies();
    }         
}

function OptanonWrapper() { 
    console.log('page-init: onetrust: Onetrust OptanonWrapper');

    setTimeout(() => {
        hasUserOptedOut();
    }, 10);

    OneTrust.OnConsentChanged(hasUserOptedOut);
}

document.addEventListener('privacychoice', function () {
    console.log("onetrust: Received one trust event.");
    OneTrust.ToggleInfoDisplay();
});
// END OneTrust

// BEGIN Adobe Related

//instantiate tracking object with report suite ID and set global params in object
function handleAdobeData(localDataProps, type) {
    
    console.log('handleAdobeData: function called with type: '+type+' and allowAdobe: ' + window.sessionStorage.getItem('LSKey[c]allowAdobe') + ' and suppressAdobe: ' + suppressAdobe());

    if (window.sessionStorage.getItem('LSKey[c]allowAdobe') == 'allow' && !suppressAdobe()) {

        console.log('handleAdobeData: localDataProps.pageName = ' + localDataProps.pageName);

        if (!isObjectEmpty(localDataProps) && ((type=='onetrust' && localDataProps.pageName !== undefined) || type=='page' || type=='event')) {

            let aaPromise = new Promise(function (resolve, reject) {
            
                if (s === null) {
                    let aascripttag = document.createElement('script');
                    aascripttag.async = false;
                    aascripttag.src = SITE_DOMAIN + '/sfsites/c/resource/Adobe_AppMeasurement_Disney?s='+Date.now();
                    document.head.insertBefore(aascripttag, document.head.children[0]);
            
                    aascripttag.addEventListener('load', () => {
    
                        console.log('handleAdobeData: loaded. setting global props');
                        s = s_gi(SUITE_NAME);
                        //designate tracking server
                        s.trackingServer = TRACKING_SERVER;
    
                        s.registerPostTrackCallback(function(){
                            // custom clear of dataProps
                            clearAdobeVars();
                            // native clear of s object
                            s.clearVars();
                            console.log('handleAdobeData: cleared data post s.t()');
                        });
                        
                        resolve();
                    });
                } else {
                    console.log('handleAdobeData: already loaded. resolve promise');
                    resolve();
                }
                
            });
    
            aaPromise.then(() => {
                console.log('handleAdobeData: promise resolved');
    
                //Previous Page URL: prop3
                let originalReferrer = window.sessionStorage.getItem('LSKey[c]originalReferrer');
                console.log('handleAdobeData: original referrer value: ', originalReferrer);
                if (originalReferrer) {
                    console.log('handleAdobeData: using original referrer after redirect : ', originalReferrer);
                    s.referrer = originalReferrer;
                    s.prop3 = originalReferrer;
                    s.prop12 = originalReferrer;
                    window.sessionStorage.removeItem('LSKey[c]originalReferrer');
                    window.sessionStorage.setItem('LSKey[c]visitReferrer',originalReferrer);
                } else {
                    let currentReferrer = window.sessionStorage.getItem('LSKey[c]currentReferrer');
                    let originalReferrer = window.sessionStorage.getItem('LSKey[c]visitReferrer');
                    s.prop12 = originalReferrer;
                    if (currentReferrer) {
                        s.referrer = currentReferrer;
                        s.prop3 = currentReferrer;
                    } else {
                        s.referrer = document.referrer;
                        s.prop3 = document.referrer;
                    }
                    if (type == 'page') {
                        window.sessionStorage.setItem('LSKey[c]currentReferrer', window.location.href);
                    }
                    console.log('handleAdobeData: prop3/referrer: ' + s.prop3); 
                }
    
                //Adobe Suite Name: prop95, evar 95
                s.prop95 = SUITE_NAME;
                s.evar95 = SUITE_NAME;
    
                //Brand (Site Section): prop1, evar3, evar130
                var getdomain = location.host.split('.').reverse();
                var root_domain =  getdomain[1];
                s.prop1 = root_domain;
                s.evar3 = root_domain;
                s.evar130 = root_domain;
    
                //Visitor ID: prop 38
                //Visitor Type: Prop 4 and Evar4
                let visitorId = getCookie('s_fid');
                if (visitorId !== null) {
                    s.prop38 = visitorId;
                }
                let visitorType = getCookie('s_nr');
                if (visitorType !== null) {
                    s.prop4 = visitorType;
                    s.evar4 = visitorType;
                }
                
                // always set these props when fired.
                s.prop2 = window.location.href;
                s.prop31 = window.sessionStorage.getItem('LSKey[c]language');
                s.prop32 = window.sessionStorage.getItem('LSKey[c]countryName');

                getPercentPageViewed();
                s.prop40 = window._ppvHighestPercentViewed;
                s.prop41 = window._ppvHighestPixelsSeen;
    
                for (const [key, value] of Object.entries(localDataProps)) {
                    if (key.startsWith('event')) {
                        s.events = key;
                    } else {
                        s[key] = value;
                    }
                }
    
                if (!s.prop2.includes('preview.salesforce')) {
                    if (noPageView()) {
                        console.log('handleAdobeData: NO PAGE VIEW: calling s.tl()');
                        if (s.prop7 != null && s.prop7 != undefined) {
                            s.tl(true,"o",s.prop7);
                        } else {
                            s.tl(true,"o",s.prop2);
                        }
                    } else {
                        console.log('handleAdobeData: calling s.t()');
                        s.t();
                    }
                }
                
    
            }).catch(() => {
                console.log('handleAdobeData: promise rejected');
            });

        }
        
    }
}

document.addEventListener('sendadobeevent', function (event) {

    let eventDataProps = {};

    console.log('handleAdobeData: event recieved from click: ', JSON.stringify(event.detail));
    for (const [key, value] of Object.entries(event.detail.params)) {
        eventDataProps[key] = value;
    }
    eventDataProps.pageName = dataProps.pageName;
    eventDataProps.prop13 = dataProps.prop13;
    eventDataProps.prop14 = dataProps.prop14;
    eventDataProps.prop39 = dataProps.prop39;
    eventDataProps.evar74 = dataProps.evar74;
    eventDataProps.prop27 = dataProps.prop27;
    eventDataProps.evar27 = dataProps.evar27;

    handleAdobeData(eventDataProps, 'event');

});

// END Adobe

function seoTagObserver() {
    const targetNode = document.head;
    const config = { childList: true, subtree: true };
    const observer = new MutationObserver((mutations) => {
        mutations.forEach((mutation) => {
        if (mutation.addedNodes.length > 0) {
            const newElement = mutation.addedNodes[0];
            if (newElement.matches && newElement.matches("[hreflang][data-owner='setSEOProperties']")) {
                //console.log("mutation observer found hreflang " , newElement);
                newElement.remove();
            }
            if (newElement.matches && newElement.matches("[rel='canonical'][data-owner='setSEOProperties']")) {
                if (document.URL.indexOf("/article/") != -1 || document.URL.indexOf("/category/") != -1) {
                    //console.log("mutation observer found category/article page canonical " , newElement);
                    newElement.remove();
                }
                
            }
        }
        });
    });
    observer.observe(targetNode, config);
}	 

function initializeSession() {

    let documentURL = document.URL;
    let index = documentURL.indexOf('.com');
    let baseURL = documentURL.substring(0, index + 4);

    let communityName = COMMUNITY_NAME;
    let communityNameVforce = COMMUNITY_NAME_VFORCE;
    let serviceURL = SITE_DOMAIN + '/' + communityNameVforce;

    if(documentURL.indexOf(communityName) == -1) {
        communityName = "";
        communityNameVforce = "";
        serviceURL = baseURL;
    } else {
        baseURL += '/' + communityName;
    }

    //Rohit 12042023 - VXSS-370
    /*
    let articleIndex = documentURL.indexOf("article/");
    let storageLanguage = window.localStorage.getItem('LSKey[c]language');
    if (storageLanguage) {
        storageLanguage = storageLanguage.substring(0,2).toLowerCase();
    }
    let storageCountry = window.localStorage.getItem('LSKey[c]country');
    if (storageCountry) {
        storageCountry = storageCountry.toLowerCase();
    }
    console.log("pre storageLanguage = " + storageLanguage);
    console.log("pre storageCountry = " + storageCountry);
    
    let isArticle = false;
    if (articleIndex != -1) {
        const regex = /-[a-z]{2}-[a-z]{2}-/gm;
        let urlName = documentURL.substring(articleIndex + 8);
        let result = urlName.match(regex);
        console.log(JSON.stringify(result));
        if (result) {
            if (storageLanguage != result[0].substring(1,3)) {
                console.log('page-init: article page: URL language doesnt match session: ' + storageLanguage);
                storageLanguage = result[0].substring(1,3);
                isArticle = true;
            }
            if (storageCountry != result[0].substring(4,6)) {
                console.log('page-init: article page: URL country doesnt match session: ' + storageCountry);
                storageCountry = result[0].substring(4,6);
                isArticle = true;
            }
        }
    }
    console.log("documentURL = " + documentURL);
    console.log("storageLanguage = " + storageLanguage);
    console.log("storageCountry = " + storageCountry);
    console.log("isArticle = " + isArticle);
    */
    // VXSS-370

    let ipPromise = new Promise(function(resolve, reject) {
        
        console.log('page-init: initializeSession: begin promise');

        let calloutURI = serviceURL + '/services/apexrest/IPService?brand=Disney';
        if(isCrawlerBot()) {

            if (window.sessionStorage.getItem('LSKey[c]botLoaded')) {
                console.log('page-init: initializeSession: bot already loaded, resolve promise');
                window.sessionStorage.removeItem('LSKey[c]botLoaded');
                return resolve();
            }

            // this version of the callout for bots only to get metadata record for locale
            calloutURI += '&iscrawlerbot=true&locale=' + getLocale() + getLangCountryStr();
            console.log('page-init: crawlerbot TRUE: ' + calloutURI);
            fetch(calloutURI, {
                method: "GET",
            })
            .then((response) => response.json())
                .then(repos => {
                    console.log("page-init: ip service callback json for bot: ", repos);
                    window.sessionStorage.setItem('LSKey[c]ip', repos.ipAddress);
                    window.localStorage.setItem('LSKey[c]ip', repos.ipAddress);

                    window.sessionStorage.setItem('LSKey[c]botLoaded', 'true');

                    if (repos.isAvailable) {
                        setSession(repos);
                        console.log("page-init: bot reload page: ", document.URL);
                        window.open(document.URL, "_self");
                    } else {
                        window.sessionStorage.setItem('LSKey[c]country', 'US');
                        window.sessionStorage.setItem('LSKey[c]countryName', 'United States');
                        window.sessionStorage.setItem('LSKey[c]metadataName', 'United_States_English');
                        window.sessionStorage.setItem('LSKey[c]language', getLocale()); // this is to stop country/lang selector from reloading page again
                        window.sessionStorage.setItem('LSKey[c]region', 'NA');
                        window.sessionStorage.setItem('LSKey[c]primaryLocale', 'true');
                        window.localStorage.setItem('LSKey[c]country', 'US');
                        window.localStorage.setItem('LSKey[c]countryName', 'United States');
                        window.localStorage.setItem('LSKey[c]metadataName', 'United_States_English');
                        window.localStorage.setItem('LSKey[c]language', getLocale());
                        window.localStorage.setItem('LSKey[c]region', 'NA');
                        window.localStorage.setItem('LSKey[c]primaryLocale', 'true');
                        // set local/session so we don't trigger another refresh
                        // an isAvailable of false for bot means bad page / redirect to 404
                        console.log("page-init: bot send to 404 page: ", document.URL);
                        window.open(location.protocol + '//' + location.host + '/error-404', "_self");
                    }
                })
                .catch(error => {
                    reject();
                    console.error("error1:" + error);
                })
            .catch(error => {
                reject();
                console.error("error2:" + error);
            });
        } else {

            //VXSS-370
            /*
            if(isArticle) {
                calloutURI += '&isarticle=true&language=' + storageLanguage + '&country=' + storageCountry;
            } 
            */
            //VXSS-370

            // if (!isArticle) {  // VXSS-370 - remove conditional if not using 370

            let response = verifySessionStorage();
            if(response != 'create-session'){

                if (response == 'local-exists') {
                    window.sessionStorage.setItem('LSKey[c]originalReferrer', document.referrer);
                }
                console.log('page-init: initializeSession: session already set');
                return resolve();
            } else {
                console.log('page-init: initializeSession: need to create session');
            }
            //}
            
            console.log('page-init: crawlerbot FALSE: ' + calloutURI);
            fetch(calloutURI, {
                method: "GET"
            })
            .then((response) => response.json())
                .then(repos => {
                    console.log("page-init: ip service callback json: ", repos);

                    if(!repos.isAvailable){
                        console.log("page-init: not available");
                        window.open(repos.notAvailableURL, '_self');
                        return resolve();
                    }

                    // if allowAdobe doesn't already exist, create it as false
                    if (!window.sessionStorage.getItem('LSKey[c]allowAdobe')) {
                        if (repos.region == 'APAC' || repos.region == 'LATAM') {
                            window.sessionStorage.setItem('LSKey[c]allowAdobe', 'allow');
                        } else {
                            window.sessionStorage.setItem('LSKey[c]allowAdobe', 'reject');
                        }
                    }
                
                    setSession(repos);

                    let languageValue = repos.languageCode;
                    if (languageValue == "en-US") {
                        languageValue = "";
                        document.cookie = "PreferredLanguage0DM8L000000Gn4tWAC=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
                    } else {
                        languageValue = "/" + languageValue;
                    }

                    let pageName = documentURL.substring(documentURL.lastIndexOf('/'));
                    let subPath = "";
                    //console.log('pagename: ' + pageName + ' subpath: ' + subPath);

                    // article url fix 
                    //text.replace(/-[a-z]{2}-[a-z]{2}-/gm, '-en-us-');

                    if (documentURL.indexOf("article") != -1) {
                        subPath = "/article";

                        const regex = /-[a-z]{2}-[a-z]{2}-/gm;
                        let urlMatch = pageName.match(regex);
                        let newLocale = '-'+(repos.languageCode.substring(0,2)).toLowerCase()+'-'+(repos.countryCode).toLowerCase()+'-';

                        if (urlMatch && urlMatch != newLocale) {
                            pageName = pageName.replace(/-[a-z]{2}-[a-z]{2}-/gm, newLocale);
                        }
                        
                    } else if (documentURL.indexOf("contact-us") != -1 && pageName != '/contact-us') {
                        subPath = '/contact-us';
                    } else if (documentURL.indexOf("category") != -1 && pageName != '/category') {
                        subPath = '/category';
                    }
                    console.log('subPath updated: ' + subPath);
                    if (pageName == null) {
                        pageName = "";
                    }

                    var url = baseURL + languageValue + subPath + pageName ;
                    console.log("page-init: reload page: ", url);
                    window.sessionStorage.setItem('LSKey[c]originalReferrer', document.referrer);
                    window.sessionStorage.removeItem('LSKey[c]firstPage');
                    console.log('page-init: reload page: original referrer value: ', document.referrer);
                    window.open(url, "_self");
                })
                .catch(error => {
                    reject();
                    console.error("page-init: error1:" + error);
                })
            .catch(error => {
                reject();
                console.error("page-init: error2:" + error);
            });
        } 
    });

    ipPromise.then(() => {
        console.log('page-init: initializeSession promise resolved');

        // check for first time ref for this session.  if first pageref, add unload listener.  if listener exists and pageref runs, remove listener
        if (!window.sessionStorage.getItem('LSKey[c]firstPage')) {
            console.log('page-init: pagerefchange: ADD beforeunload handler');
            window.addEventListener("beforeunload", beforeUnloadHandler, { once: true });
            window.sessionStorage.setItem('LSKey[c]firstPage','true');
        }

        seoTagObserver();
        initiateNice();
    });
    ipPromise.catch(() => {
        console.log('page-init: initializeSession promise REJECTED');
    })
    
}

//this call kicks off everything needed on initial page load
console.log('page-init: call initializeSession');
initializeSession();