PageSourceSearch

https://www.fisglobal.com/-/media/E19F386FB1B04FE89328D88770647DA7

js fisglobal.com collected 2026-09-27 20:53:54 UTC 37,190 bytes, 849 lines download raw bytes

1document.addEventListener('DOMContentLoaded', () => {
2  const path = window.location.pathname;
3  
4  // Configuration objects
5  const CSS_URLS = {
6    localNav: '/-/media/07DF79EE09ED49288AC991A10A73C312',
7    support1: '/-/media/76009133F7864D7BA8AD65F5C83303BE',
8    support2: '-/media/D1984B313DB640808CE0B4CA75D52660',
9    supportScript: '/-/media/54494D27B46A4AD198B59F370B02500F',
10    categoryDropdown: '-/media/6DB31B6A319243BDBDE509DC2A3AC747'
11  };
12
13  const NAV_CONFIG = {
14    products: {
15      excludedPaths: ['/products', '/products/product-catalog'],
16      navItem: 1,
17      navClass: 'product-page'
18    },
19    insights: {
20      excludedPaths: ['/insights', '/insights/all-topics', '/insights/fis-client-stories'],
21      navItem: 2,
22      navClass: 'insights-nav'
23    },
24    aboutUs: {
25      excludedPaths: [
26        '/about-us',
27        '/about-us/media-room/press-release',
28        '/about-us/media-room/press-release/',
29        '/about-us/media-room/media-kit',
30        '/about-us/media-room/contact',
31        '/about-us/supplier-information-portal/become-supplier',
32        '/about-us/supplier-information-portal/sustainable-procurement'
33      ],
34      navItem: 4,
35      navClass: 'about-subpage-nav'
36    }
37  };
38
39  // Utility functions
40  const injectCSS = (url) => {
41    const link = document.createElement('link');
42    link.rel = 'stylesheet';
43    link.href = url;
44    link.type = 'text/css';
45    document.head.appendChild(link);
46  };
47
48  const injectStyle = (selector, navItems) => {
49    const style = document.createElement('style');
50    const items = navItems.map(n => `${selector} .menu-item:nth-of-type(${n}) a`).join(', ');
51    style.textContent = `${items} {color: #4bcd3e !important;}`;
52    document.head.appendChild(style);
53  };
54
55  const fadeInLocalNav = () => {
56    const localNav = document.querySelector('.component.local-nav');
57    if (!localNav) return;
58    
59    let opacity = 0;
60    const fadeIn = () => {
61      opacity += 0.5;
62      if (opacity < 1) {
63        localNav.style.opacity = opacity;
64        requestAnimationFrame(fadeIn);
65      } else {
66        localNav.style.opacity = 1;
67      }
68    };
69    fadeIn();
70  };
71
72  const waitForElement = (selector, callback, maxAttempts = 25) => {
73    let attempts = 0;
74    const interval = setInterval(() => {
75      const element = document.querySelector(selector);
76      if (element) {
77        clearInterval(interval);
78        callback(element);
79      } else if (++attempts >= maxAttempts) {
80        clearInterval(interval);
81        console.warn(`${selector} not found after waiting.`);
82      }
83    }, 200);
84  };
85
86  const getTextContent = (selector) => {
87    const element = document.querySelector(selector);
88    if (!element) return '';
89    
90    return Array.from(element.childNodes)
91      .filter(node => node.nodeType === Node.TEXT_NODE)
92      .map(node => node.textContent.trim())
93      .join(' ')
94      .trim();
95  };
96
97  const createNavPanel = (homeLink = '/products') => `
98    <div class="nav-panel">
99      <svg width="0" height="0">
100        <defs>
101          <clipPath id="navClip" clipPathUnits="objectBoundingBox">
102            <polygon points="0 0, 0.9 0, 1 0.5, 0.9 1, 0 1"></polygon>
103          </clipPath>
104        </defs>
105      </svg>
106      <div class="nav-content">
107        <span class="home-icon">
108          ${homeLink !== '#' ? `<a href="${homeLink}" class="overlay-link"></a>` : ''}
109          <svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 28 28" fill="none">
110            <path d="M14 0.907127L28 12.1555H24.6739V27.0929H15.7235V17.4168H12.2765V27.0929H3.44708V12.1555H0L14 0.907127ZM22.7084 25.1577V10.4017L14 3.38661L5.41253 10.4017V25.1577H10.5529V15.6933H17.4471V25.1577H22.7084Z" fill="black"></path>
111          </svg>
112        </span>`;
113
114  const createBreadcrumbs = (tiers) => {
115    let html = '<div class="breadcrumb-links-wrapper">';
116    const tierNames = ['one', 'two', 'three'];
117    
118    tiers.forEach((tier, index) => {
119      if (tier) {
120        html += `
121          <div class="tier-${tierNames[index]}-wrapper">
122            <a href="${tier.href}"${tier.disabled ? ' style="pointer-events:none;"' : ''}>${tier.text}</a>
123          </div>`;
124      }
125    });
126    
127    html += '</div></div></div>';
128    return html;
129  };
130
131  const createLocalNav = (config) => {
132    const {
133      homeLink = '/products',
134      tiers = [],
135      title = '',
136      showContactUs = false,
137      wrapperClass = '',
138      localNavClass = ''
139    } = config;
140
141    const navPanel = createNavPanel(homeLink);
142    const breadcrumbs = createBreadcrumbs(tiers);
143    
144    return `
145      <div class="component local-nav ${localNavClass}" style="opacity:0;">
146        <div class="component-content">
147          <section class="fis-localnav-wrapper ${wrapperClass} fis-bg-white" id="">
148            <div class="fis-localnav-container">
149              ${navPanel}
150              ${breadcrumbs}
151              ${title ? `
152                <ul class="fis-localnav-prodname">
153                  <li class="l3productname fis-text-black">${title}</li>
154                </ul>` : ''}
155              ${showContactUs ? `
156                <ul class="fis-localnav-right">
157                  <li>
158                    <a href="/contact-us" class="fis-text-black" target="">
159                      Contact us
160                      <svg xmlns="http://www.w3.org/2000/svg" width="14" height="12" viewBox="0 0 14 12" fill="none">
161  <path d="M8.39633 0.396484L14 6.00016L8.39633 11.6038L7.45932 10.6852L11.5013 6.6432H0V5.33874H11.5013L7.45932 1.31512L8.39633 0.396484Z" fill="#4BCD3E"/>
162</svg>
163                    </a>
164                  </li>
165                </ul>` : ''}
166            </div>
167          </section>
168          <style>
169            .fis-localnav-wrapper ul.fis-localnav-left .scLooseFrameZone{display:inline-block}
170            .fis-localnav-wrapper ul.fis-localnav-right .scLooseFrameZone{display:inline-block;margin-right:20px}
171          </style>
172        </div>
173      </div>`;
174  };
175
176  const injectLocalNav = (markup, additionalClasses = [], heroClasses = []) => {
177    const target = document.querySelector('#content > .row');
178    if (!target) return;
179    
180    target.insertAdjacentHTML('afterbegin', markup);
181    
182    waitForElement('.component.local-nav', (localNav) => {
183      // Add additional classes to various elements
184      additionalClasses.forEach(({ selector, classes }) => {
185        const element = document.querySelector(selector);
186        if (element) {
187          classes.forEach(cls => element.classList.add(cls));
188        }
189      });
190      
191      // Add hero classes
192      const hero = document.querySelector('.component.hero .hero') || 
193                   document.querySelector('.hero.hero-marketplace-bg .hero-inner .hero-copy');
194      if (hero && heroClasses.length > 0) {
195        heroClasses.forEach(cls => hero.classList.add(cls));
196      }
197      
198      // Load support script and fade in
199      const script = document.createElement('script');
200      script.src = CSS_URLS.supportScript;
201      script.onload = () => console.log('localnav-support-script.js loaded and executed.');
202      script.onerror = () => console.error('Failed to load localnav-support-script.js.');
203      document.head.appendChild(script);
204      
205      fadeInLocalNav();
206    });
207  };
208
209  // Main navigation logic
210  const handleProductsSection = () => {
211    injectStyle('.fis-main-nav.toggleHeader .nav-container .primary-nav', [1]);
212    injectStyle('.nav-container .primary-nav', [1]);
213    injectCSS(CSS_URLS.localNav);
214    
215    if (path === '/products') {
216      const markup = createLocalNav({
217        tiers: [{href: '/products', text: 'Overview', disabled: true}],
218        wrapperClass: 'products-overview'
219      });
220      
221      waitForElement('.fis-localnav-wrapper .fis-localnav-container', (navWrapper) => {
222        navWrapper.insertAdjacentHTML('afterbegin', markup.match(/<div class="nav-panel">[\s\S]*?<\/div>\s*<\/div>/)[0]);
223        navWrapper.closest('.fis-localnav-wrapper').classList.add('products-overview');
224      });
225    } else if (path === '/products/product-catalog') {
226      const markup = createLocalNav({
227        tiers: [{href: '/products', text: 'Overview'}],
228        wrapperClass: 'product-catalog'
229      });
230      
231      waitForElement('.fis-localnav-wrapper .fis-localnav-container', (navWrapper) => {
232        navWrapper.insertAdjacentHTML('afterbegin', markup.match(/<div class="nav-panel">[\s\S]*?<\/div>\s*<\/div>/)[0]);
233        navWrapper.closest('.fis-localnav-wrapper').classList.add('product-catalog');
234      });
235    } else {
236      // Product detail pages
237      const productMarkup = createNavPanel() + createBreadcrumbs([
238        {href: '/products', text: 'Overview'},
239        {href: '/products/product-catalog', text: 'All products'}
240      ]);
241      
242      waitForElement('.fis-localnav-wrapper .fis-localnav-container', (navWrapper) => {
243        navWrapper.insertAdjacentHTML('afterbegin', productMarkup);
244        const wrapper = navWrapper.closest('.fis-localnav-wrapper');
245        wrapper.classList.add('product-page');
246        
247        const toggleSwitch = document.querySelector('.sticky-nav-toggle-switch');
248        if (toggleSwitch) {
249          wrapper.classList.add('product-suite-custom');
250          document.querySelector('.component.local-nav')?.classList.add('product-suite-local-nav');
251        } else {
252                const container = document.querySelector('.fis-localnav-container');                
253const navPanel = container.querySelector('.nav-panel');
254const prodName = container.querySelector('ul.fis-localnav-prodname');
255const leftNav = container.querySelector('ul.fis-localnav-left');
256
257// Create the wrapper div
258const wrapper = document.createElement('div');
259wrapper.classList.add('left-nav-wrap');
260
261// Append the selected elements to the wrapper
262if (navPanel) wrapper.appendChild(navPanel);
263if (prodName) wrapper.appendChild(prodName);
264if (leftNav) wrapper.appendChild(leftNav);
265
266// Insert the wrapper into the container
267container.insertBefore(wrapper, container.firstChild);
268
269        }
270      });
271    }
272  };
273
274  const handleDeveloper = () => {
275        injectStyle('.fis-main-nav.toggleHeader .nav-container .primary-nav', [3]);
276        injectStyle('.nav-container .primary-nav', [3]);
277  }
278
279  const handleInsightsSection = () => {
280    [CSS_URLS.localNav, CSS_URLS.support1, CSS_URLS.support2, CSS_URLS.categoryDropdown].forEac
280h(injectCSS);
281    injectStyle('.fis-main-nav.toggleHeader .nav-container .primary-nav', [1, 2]);
282    
283    waitForElement('.fis-main-nav', (nav) => nav.classList.add('insights-nav'));
284    
285    let config;
286
287    const featuredTopics =  [
288      {urlName: "Office of the CFO", url: "/insights/office-of-the-cfo"},
289      {urlName: "Risk management", url: "/insights/risk-management"},
290      {urlName: "AI and machine learning", url: "/insights/ai"}
291    ];
292
293    const allInsightCategories = [
294  //{ urlName: "AI and machine learning", url: "/insights/ai"},
295  { urlName: "Automation", url: "/insights/automation"},
296  { urlName: "Cloud and aaS platforms", url: "/insights/cloud-and-aas-platforms"},
297  { urlName: "Customer experience", url: "/insights/customer-experience"},
298  //{ urlName: "Customer experience", url: "/insights/customer-experience" },
299  { urlName: "Cybersecurity", url: "/insights/cybersecurity"},
300  { urlName: "Data management and analytics", url: "/insights/data-management"},
301  //{ urlName: "Digital assets", url: "/insights/digital-assets"},
302  { urlName: "Digitalization", url: "/insights/digitalization"},
303  { urlName: "Embedded finance", url: "/insights/embedded-finance"},
304  //{ urlName: "ESG", url: "/insights/esg"},
305  { urlName: "Fintech Insights series", url: "/insights/fintech-insights"},
306  { urlName: "Fraud", url: "/insights/fraud"},
307  { urlName: "Leadership and work", url: "/insights/leadership-and-work"},
308  { urlName: "Lending", url: "/insights/lending"},
309  { urlName: "Money movement", url: "/insights/money-movement"},
310  //{ urlName: "Operations", url: "/insights/operations"},
311  { urlName: "Payments", url: "/insights/payments"},
312  //{ urlName: "Platforms", url: "/insights/platforms"},
313  { urlName: "Regulatory compliance", url: "/insights/regulatory-change"},
314  //{ urlName: "Risk management", url: "/insights/risk-management" }
315  //{ urlName: "All topics", url: "/insights/all-topics"}
316];
317
318const contentTypes =  [
319  {urlName: "Client stories", url: "/insights/fis-client-stories"},
320  {urlName: "Videos", url: "/insights/videos"},
321  {urlName: "Webinars", url: "/insights/webinars"},
322];
323
324const categoryDropdown = document.createElement('ul');
325categoryDropdown.className = 'fis-localnav-right insights-dropdown';
326
327const mainLi = document.createElement('li');
328
329const mainLink = document.createElement('a');
330mainLink.className = 'fis-text-black';
331mainLink.innerHTML = `All topics <svg xmlns="http://www.w3.org/2000/svg" width="7" height="5" viewBox="0 0 7 5" fill="none">
332  <path d="M4.11859 4.01299C3.75568 4.2987 3.24432 4.2987 2.88141 4.01299L1.00502 2.53571C0.259231 1.94856 0.674424 0.75 1.62361 0.75L5.37639 0.75C6.32557 0.75 6.74077 1.94856 5.99498 2.53571L4.11859 4.01299Z" fill="#4BCD3E"/>
333</svg>`;
334
335const dropdownDiv = document.createElement('div');
336dropdownDiv.className = 'all-categories-dropdown';
337
338const featDropdownDiv = document.createElement('div');
339featDropdownDiv.className = 'feat-topics-dropdown';
340
341const contentTypeHead = document.createElement('h3');
342contentTypeHead.textContent = 'By content type';
343
344const heading = document.createElement('h3');
345heading.textContent = 'By topic';
346
347const featHeading = document.createElement('h3');
348featHeading.textContent = 'Featured topics';
349
350const dynamicContact = document.createElement('div');
351dynamicContact.className = 'dynamic-contact-us';
352dynamicContact.innerHTML = `<a href="/contact-us">Contact us <svg xmlns="http://www.w3.org/2000/svg" width="14" height="12" viewBox="0 0 14 12" fill="none">
353  <path d="M8.39633 0.396484L14 6.00016L8.39633 11.6038L7.45932 10.6852L11.5013 6.6432H0V5.33874H11.5013L7.45932 1.31512L8.39633 0.396484Z" fill="#4BCD3E"></path>
354</svg></a>`;
355
356
357const list = document.createElement('ul');
358list.className = 'all-categories-list';
359
360const featList = document.createElement('ul');
361featList.className = 'featured-categories-list';
362
363const typeList = document.createElement('ul');
364typeList.className = 'content-type-list';
365
366const browseAll = document.createElement('div');
367browseAll.className = 'browse-all';
368
369const browseAllLink = document.createElement('a');
370browseAllLink.className = 'fis-text-black';
371browseAllLink.href = '/insights/all-topics';
372browseAllLink.innerHTML = `Browse all insights <svg xmlns="http://www.w3.org/2000/svg" width="14" height="12" viewBox="0 0 14 12" fill="none">
373  <path d="M8.39633 0.396484L14 6.00016L8.39633 11.6038L7.45932 10.6852L11.5013 6.6432H0V5.33874H11.5013L7.45932 1.31512L8.39633 0.396484Z" fill="#4BCD3E"/>
374</svg>`;
375
376browseAll.appendChild(browseAllLink);
377
378allInsightCategories.forEach(category => {
379  const li = document.createElement('li');
380  const a = document.createElement('a');
381  a.href = category.url;
382  a.textContent = category.urlName;
383  li.appendChild(a);
384  list.appendChild(li);
385});
386
387featuredTopics.forEach(topic => {
388  const featLi = document.createElement('li');
389  const featA = document.createElement('a');
390  const spanText = document.createElement('span');
391  spanText.className = 'text-wrap';
392  featA.href = topic.url;
393  spanText.textContent = topic.urlName;
394  featA.appendChild(spanText);
395  featLi.appendChild(featA);
396  featList.appendChild(featLi);
397});
398
399contentTypes.forEach(type => {
400  const typeLi = document.createElement('li');
401  const typeA = document.createElement('a');
402  typeA.href = type.url;
403  typeA.textContent = type.urlName;
404  typeLi.appendChild(typeA);
405  typeList.appendChild(typeLi);
406});
407
408
409featDropdownDiv.appendChild(featHeading);
410featDropdownDiv.appendChild(featList);
411dropdownDiv.appendChild(featDropdownDiv);
412dropdownDiv.appendChild(heading);
413dropdownDiv.appendChild(list);
414dropdownDiv.appendChild(contentTypeHead);
415dropdownDiv.appendChild(typeList);
416dropdownDiv.appendChild(browseAll);
417mainLi.appendChild(mainLink);
418
419mainLi.appendChild(dropdownDiv);
420categoryDropdown.appendChild(mainLi);
421
422
423
424    if (path === '/insights') {
425      config = {
426        homeLink: '#',
427        tiers: [{href: '/insights', text: 'Overview', disabled: true}],
428        wrapperClass: 'insights-overview',
429        navClass: 'insights-nav'
430      };
431      const insightsMainHeroTarget = document.querySelector('.component.hero');
432      if (insightsMainHeroTarget){
433        insightsMainHeroTarget.classList.add('pad-insights-hero');
434      }
435    } else if (path === '/insights/all-topics') {
436      config = {
437        homeLink: '/insights',
438        tiers: [{href: '/insights', text: 'Overview'}],
439        title: 'All insights',
440        wrapperClass: 'insights-all-topics',
441        navClass: 'insights-nav'
442      };
443    } 
444    
445    // else if (path === '/insights/fis-client-stories') {
446    //   config = {
447    //     homeLink: '/insights',
448    //     tiers: [{href: '/insights', text: 'Overview'}],
449    //     title: 'Client stories',
450    //     showContactUs: true,
451    //     wrapperClass: 'insights-all-topics'
452    //   };
453      
454    //   waitForElement('.fis-localnav-wrapper', (localNavWrapper) => localNavWrapper.classList.add('client-story-local-nav'));
455    //   waitForElement('.fis-main-nav', (nav) => nav.classList.add('client-stories-nav'));
456    // } 
457    
458    else if (path.includes('/insights/fis-client-stories/') || path === ('/insights/client-stories')) {
459      const title = getTextContent('.hero .hero-inner .hero-copy h1') || 
460                    getTextContent('.hero .hero-inner .hero-copy h2') || 
461                    'Client story';
462      
463      config = {
464        homeLink: '/insights',
465        tiers: [
466          {href: '/insights', text: 'Overview'},
467          {href: '/insights/fis-client-stories', text: 'Client stories'}
468        ],
469        title,
470        showContactUs: true,
471        wrapperClass: 'insights-article client-story-article'
472      };
473      waitForElement('.fis-localnav-wrapper', (localNavWrapper) => localNavWrapper.classList.add('client-story-local-nav'));
474      waitForElement('.fis-main-nav', (nav) => nav.classList.add('client-story-nav'));
475    } else {
476      // Regular insights article
477      let title = getTextContent('.hero-copy h1') || getTextContent('.hero-copy h1 strong') || 'Article';
478      if (title.length > 70) {
479        title = title.slice(0, 67) + '...';
480      }
481
482      config = {
483        homeLink: '/insights',
484        tiers: [
485          {href: '/insights', text: 'Overview'},
486          {href: '/insights/all-topics', text: 'All insights'}
487        ],
488        title,
489        wrapperClass: 'insights-article'
490      };
491    }
492    
493    const markup = createLocalNav(config);
494    const heroClasses = path === '/insights' || path === '/insights/all-topics' ? ['pad-insights-hero'] : [];
495    
496    injectLocalNav(markup, [
497      {selector: '.hero.hero-marketplace-bg .hero-inner .hero-copy', classes: ['pad-for-article']},
498      {selector: '#cs-2col-layout .row .col-md-1', classes: ['pad-for-article']}
499    ], heroClasses);
500
501    const fisLocalNav = document.querySelector('.fis-localnav-wrapper');
502    //if (!path.includes('/insights/fis-client-stories')){
503      fisLocalNav.appendChild(categoryDropdown); // Or append to a specific element
504      fisLocalNav.appendChild(dynamicContact);
505    //}
506
507
508  };
509
510  const handleAboutSection = () => {
511    injectStyle('.fis-main-nav.toggleHeader .nav-container .primary-nav', [1, 4]);
512    [CSS_URLS.localNav, CSS_URLS.support1, CSS_URLS.support2].forEach(injectCSS);
513    
514    if (path === '/about-us') {
515      const markup = createNavPanel('#') + createBreadcrumbs([
516        {href: '/about-us', text: 'Overview', disabled: true}
517      ]);
518      
519      waitForElement('.fis-localnav-wrapper .fis-localnav-container', (navWrapper) => {
520        navWrapper.insertAdjacentHTML('afterbegin', markup);
521        navWrapper.closest('.fis-localnav-wrapper').classList.add('about-overview');
522        document.querySelector('.fis-main-nav').classList.add('about-main-page');
523      });
524      return;
525    }
526    
527    waitForElement('.fis-main-nav', (nav) => nav.classList.add('about-subpage-nav'));
528    
529    // Define page configurations
530    const pageConfigs = {
531      '/leadership': {title: 'Leadership'},
532      '/awards': {title: 'Awards', heroClasses: ['pad-for-local-nav']},
533      '/awards-new': {title: 'Awards', heroClasses: ['pad-for-local-nav']},
534      '/company-history': {title: 'Company history', additionalClasses: [{selector: '#fis-overview-section', classes: ['pad-for-local-nav']}]},
535      '/global-community-involvement': {title: 'Global community involvement', additionalClasses: [{selector: '.l3Hero.hero.fis-community-hero-wrapper', classes: ['pad-for-local-nav']}]},
536      '/ethics': {title: 'Ethics office', heroClasses: ['pad-for-local-nav']},
537      '/supplier-information-portal': {title: 'Supplier Information Portal', heroClasses: ['pad-for-local-nav']},
538      '/media-room': {title: 'Media room', heroClasses: ['pad-for-local-nav', 'media-room-margin-top']},
539      '/media-kit': {
540        title: 'Media resources',
541        tiers: [
542          {href: '/about-us', text: 'Overview'},
543          {href: '/about-us/media-room', text: 'Media room'}
544        ],
545        heroClasses: ['pad-for-local-nav', 'media-room-margin-top']
546      },
547      '/press-release': {
548        title: 'Press releases',
549        tiers: [
550          {href: '/about-us', text: 'Overview'},
551          {href: '/about-us/media-room', text: 'Media room'}
552        ],
553        heroClasses: ['pad-for-local-nav', 'media-room-margin-top']
554      },
555      '/contact': {
556        title: 'Contact',
557        tiers: [
558          {href: '/about-us', text: 'Overview'},
559          {href: '/about-us/media-room', text: 'Media room'}
560        ],
561        heroClasses: ['pad-for-local-nav', 'media-room-margin-top']
562      },
563      '/become-supplier': {
564        title: 'Become a supplier',
565        tiers: [
566          {href: '/about-us', text: 'Overview'},
567          {href: '/about-us/supplier-information-portal', text: 'Supplier Information Portal'}
568        ],
569        heroClasses: ['pad-for-local-nav']
570      },
571      '/sustainable-procurement': {
572        title: 'Sustainable procurement',
573        tiers: [
574          {href: '/about-us', text: 'Overview'},
575          {href: '/about-us/supplier-information-portal', text: 'Supplier Information Portal'}
576        ],
577        heroClasses: ['pad-for-local-nav']
578      }
579    };
580    
581    // Handle press release detail pages
582    if (path.includes('/media-room/press-release/') && !path.endsWith('/press-release')) {
583      let title = getTextContent('.hero-copy h1') || 'Press release';
584      if (title.length > 70) {
585        title = title.slice(0, 67) + '...';
586      }
587      
588      const config = {
589        homeLink: '/about-us',
590        tiers: [
591          {href: '/about-us', text: 'Overview'},
592          {href: '/about-us/media-room', text: 'Media room'},
593          {href: '/about-us/media-room/press-release', text: 'Press releases'}
594        ],
595        title,
596        showContactUs: true,
597        wrapperClass: 'about-child-page',
598        localNavClass: 'about-child-local three-tier'
599      };
600      
601      const markup = createLocalNav(config);
602      injectLocalNav(markup, [], ['pad-for-local-nav', 'media-room-margin-top']);
603      return;
604    }
605    
606    // Find matching config
607    const matchingPath = Object.keys(pageConfigs).find(key => path.endsWith(key));
608    if (matchingPath) {
609      const pageConfig = pageConfigs[matchingPath];
610      const config = {
611        homeLink: '/about-us',
612        tiers: pageConfig.tiers || [{href: '/about-us', text: 'Overview'}],
613        title: pageConfig.title,
614        showContactUs: true,
615        wrapperClass: 'about-child-page',
616        localNavClass: 'about-child-local'
617      };
618      
619      const markup = createLocalNav(config);
620      injectLocalNav(markup, pageConfig.additionalClasses || [], pageConfig.heroClasse
620s || []);
621    }
622  };
623
624  // Special page handling
625  const specialPages = [
626    //'/global-sustainability',
627    '/blog',
628    '/wealth-partners',
629    '/fisinnovatein48',
630    '/fisinnovatein48-partner-edition',
631    '/fis-fintech-accelerator',
632    '/minority-banking-mdi-cdfi',
633    '/about-us/fis-events'
634  ];
635
636  let config;
637  
638  if (specialPages.some(page => path.endsWith(page))) {
639    
640        const matchedSpecialPage = specialPages.find(page => path.endsWith(page));
641
642        if (matchedSpecialPage) {
643                console.log('Matched special page:', matchedSpecialPage); // Optional: for debugging
644                injectStyle('.fis-main-nav.toggleHeader .nav-container .primary-nav', [4]);
645                injectStyle('.nav-container .primary-nav', [4]);
646                injectCSS(CSS_URLS.localNav);
647
648                if (matchedSpecialPage === '/about-us/fis-events'){
649                  [CSS_URLS.localNav, CSS_URLS.support1, CSS_URLS.support2, CSS_URLS.categoryDropdown].forEach(injectCSS);
650
651                  const markup = createLocalNav({
652                          homeLink: '/about-us',
653                          tiers: [{href: '/about-us/fis-events', text: 'Events', disabled: true}],
654                          wrapperClass: 'products-overview',
655                          title: 'Events',
656                          showContactUs: true,
657                          wrapperClass: 'about-child-page',
658                          localNavClass: 'about-child-local'
659                  });
660                  injectLocalNav(markup, markup.title);
661                  waitForElement('.fis-localnav-wrapper .fis-localnav-container', (navWrapper) => {
662                          //navWrapper.insertAdjacentHTML('afterbegin', markup.match(/<div class="nav-panel">[\s\S]*?<\/div>\s*<\/div>/)[0]);
663                          navWrapper.closest('.fis-localnav-wrapper').classList.add('products-overview');
664                          navWrapper.closest('.fis-localnav-wrapper').classList.add('events-local');
665                          const mainNav = document.querySelector('.fis-main-nav');
666                          if(mainNav){
667                                  mainNav.classList.add('about-special-page');
668                          }
669                  });
670
671                  const heroBanner = document.getElementById('hero-banner');
672
673                  if (heroBanner){
674                          heroBanner.classList.add('global-sustainability-local-nav-pad');
675                  }
676          }
677          
678                if (matchedSpecialPage === '/blog'){
679                        const markup = createLocalNav({
680                                homeLink: '/about-us',
681                                tiers: [{href: '/blog', text: 'Overview', disabled: true}],
682                                wrapperClass: 'blog-overview'
683                        });
684                        const productMarkup = createNavPanel() + createBreadcrumbs([
685                          {href: '/products', text: 'Overview'},
686                          {href: '/products/product-catalog', text: 'All products'}
687                        ]);
688                        waitForElement('.fis-localnav-wrapper .fis-localnav-container', (navWrapper) => {
689                                navWrapper.insertAdjacentHTML('afterbegin', productMarkup);
690                                //navWrapper.insertAdjacentHTML('afterbegin', markup.match(/<div class="nav-panel">[\s\S]*?<\/div>\s*<\/div>/)[0]);
691                                navWrapper.closest('.fis-localnav-wrapper').classList.add('blog-overview');
692                                document.querySelector('.component.local-nav').classList.add('blog-localnav');
693                        });
694                }
695
696                /*  if (matchedSpecialPage === '/global-sustainability'){
697                        [CSS_URLS.localNav, CSS_URLS.support1, CSS_URLS.support2, CSS_URLS.categoryDropdown].forEach(injectCSS);
698
699                        const markup = createLocalNav({
700                                homeLink: '/about-us',
701                                tiers: [{href: '/global-sustainability', text: 'Global sustainability', disabled: true}],
702                                wrapperClass: 'products-overview events-overview',
703                                title: 'Global sustainability',
704                                showContactUs: true,
705                                wrapperClass: 'about-child-page',
706                                localNavClass: 'about-child-local'
707                        });
708                        injectLocalNav(markup, markup.title);
709                        waitForElement('.fis-localnav-wrapper .fis-localnav-container', (navWrapper) => {
710                                //navWrapper.insertAdjacentHTML('afterbegin', markup.match(/<div class="nav-panel">[\s\S]*?<\/div>\s*<\/div>/)[0]);
711                                navWrapper.closest('.fis-localnav-wrapper').classList.add('products-overview');
712                                navWrapper.closest('.fis-localnav-wrapper').classList.add('global-sustainability-local');
713                                const mainNav = document.querySelector('.fis-main-nav');
714                                if(mainNav){
715                                        mainNav.classList.add('about-special-page');
716                                }
717                        });
718
719                        const heroBanner = document.getElementById('hero-banner');
720
721                        if (heroBanner){
722                                heroBanner.classList.add('global-sustainability-local-nav-pad');
723                        }
724                } */
725
726                if (matchedSpecialPage === '/wealth-partners'){
727                        const markup = createLocalNav({
728                                homeLink: '/about-us',
729                                tiers: [{href: '/wealth-partners', text: 'Wealth partners', disabled: true}],
730                                wrapperClass: 'wealth-partners-overview'
731                        });
732                        waitForElement('.fis-localnav-wrapper .fis-localnav-container', (navWrapper) => {
733                                navWrapper.insertAdjacentHTML('afterbegin', markup.match(/<div class="nav-panel">[\s\S]*?<\/div>\s*<\/div>/)[0]);
734                                navWrapper.closest('.fis-localnav-wrapper').classList.add('products-overview');
735                                navWrapper.closest('.fis-localnav-wrapper').classList.add('wealth-partners-overview');
736                        });
737                }
738
739                if (matchedSpecialPage === '/fisinnovatein48-partner-edition'){
740                        const markup = createLocalNav({
741                                homeLink: '/about-us',
742                                tiers: [{href: '/fisinnovatein48-partner-edition', text: 'InnovateIN48 Partner Edition', disabled: true}],
743                                wrapperClass: 'innovate-partners-overview'
744                        });
745                        waitForElement('.fis-localnav-wrapper .fis-localnav-container', (navWrapper) => {
746                                navWrapper.insertAdjacentHTML('afterbegin', markup.match(/<div class="nav-panel">[\s\S]*?<\/div>\s*<\/div>/)[0]);
747                                navWrapper.closest('.fis-localnav-wrapper').classList.add('products-overview');
748                                navWrapper.closest('.fis-localnav-wrapper').classList.add('innovate-partners-overview');
749                                document.querySelector('.component.local-nav').classList.add('innovate-partners-localnav');
750                        });
751                }
752
753                if (matchedSpecialPage === '/fisinnovatein48'){
754                        [CSS_URLS.localNav, CSS_URLS.support1, CSS_URLS.support2, CSS_URLS.categoryDropdown].forEac
754h(injectCSS);
755
756                        const markup = createLocalNav({
757                                homeLink: '/about-us',
758                                tiers: [{href: '/fisinnovatein48', text: 'InnovateIN48', disabled: true}],
759                                wrapperClass: 'products-overview',
760                                title: 'InnovateIN48',
761                                showContactUs: true,
762                                wrapperClass: 'about-child-page',
763                                localNavClass: 'about-child-local'
764                        });
765                        injectLocalNav(markup, markup.title);
766                        waitForElement('.fis-localnav-wrapper .fis-localnav-container', (navWrapper) => {
767                                //navWrapper.insertAdjacentHTML('afterbegin', markup.match(/<div class="nav-panel">[\s\S]*?<\/div>\s*<\/div>/)[0]);
768                                navWrapper.closest('.fis-localnav-wrapper').classList.add('products-overview');
769                                navWrapper.closest('.fis-localnav-wrapper').classList.add('innovate-in-48-local');
770                                const mainNav = document.querySelector('.fis-main-nav');
771                                if(mainNav){
772                                        mainNav.classList.add('about-special-page');
773                                }
774                        });
775                }
776
777                if (matchedSpecialPage === '/fis-fintech-accelerator'){
778                        const markup = createLocalNav({
779                                homeLink: '/about-us',
780                                tiers: [{href: '/fis-fintech-accelerator', text: 'Fintech Accelerator', disabled: true}],
781                                wrapperClass: 'fintech-accelerator-overview'
782                        });
783                        waitForElement('.fis-localnav-wrapper .fis-localnav-container', (navWrapper) => {
784                                navWrapper.insertAdjacentHTML('afterbegin', markup.match(/<div class="nav-panel">[\s\S]*?<\/div>\s*<\/div>/)[0]);
785                                navWrapper.closest('.fis-localnav-wrapper').classList.add('products-overview');
786                                navWrapper.closest('.fis-localnav-wrapper').classList.add('fintech-accelerator-overview');
787                                document.querySelector('.component.local-nav').classList.add('fintech-accelerator-localnav');
788                        });
789
790                }
791
792                if (matchedSpecialPage === '/minority-banking-mdi-cdfi'){
793                        const markup = createLocalNav({
794                                homeLink: '/about-us',
795                                tiers: [{href: '/minority-banking-mdi-cdfi', text: 'MDIs and CDFIs', disabled: true}],
796                                wrapperClass: 'mdi-cdfi-overview'
797                        });
798                        waitForElement('.fis-localnav-wrapper .fis-localnav-container', (navWrapper) => {
799                                navWrapper.insertAdjacentHTML('afterbegin', markup.match(/<div class="nav-panel">[\s\S]*?<\/div>\s*<\/div>/)[0]);
800                                navWrapper.closest('.fis-localnav-wrapper').classList.add('products-overview');
801                                navWrapper.closest('.fis-localnav-wrapper').classList.add('mdi-cdfi-overview');
802                        });
803                }
804
805}
806
807
808
809
810    return;
811  }
812
813  // Route to appropriate handler
814  if (path.startsWith('/products')) {
815    handleProductsSection();
816  } else if (path.startsWith('/insights')) {
817    handleInsightsSection();
818  } else if (path.startsWith('/about-us')) {
819    handleAboutSection();
820  } else if (path.startsWith('/developer')){
821    handleDeveloper();
822  }
823
824 
825  const dropdownTrigger = document.querySelector('ul.fis-localnav-right.insights-dropdown > li > a');
826  const dropdownLi = dropdownTrigger;
827  const componentLocalNav = document.querySelector('.component.local-nav');
828  componentLocalNav.classList.add('category-dropdown');
829
830  if (!dropdownTrigger || !dropdownLi) return;
831
832  // Toggle class on click
833  dropdownTrigger.addEventListener('click', (e) => {
834    e.preventDefault(); // Prevent default link behavior if needed
835    dropdownLi.classList.toggle('insights-dropdown-active');
836    componentLocalNav.classList.toggle('active');
837  });
838
839  // Remove class when clicking outside
840  document.addEventListener('click', (e) => {
841    if (!dropdownLi.contains(e.target)) {
842      dropdownLi.classList.remove('insights-dropdown-active');
843      componentLocalNav.classList.remove('active');
844    }
845  });
846
847
848
849});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.