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.