PageSourceSearch

https://sfc.jp/common/js/common_nav.js

js sfc.jp collected 2026-10-01 13:03:44 UTC 79,939 bytes, 1,951 lines download raw bytes

1window.dataLayer = window.dataLayer || [];
2/**
3 * 共通ナビゲーション機能
4 * ヘッダー位置調整、ページトップボタン、ハンバーガーメニューなどの機能を提供
5 */
6window.addEventListener('DOMContentLoaded', function () {
7  /**
8   * ヘッダー位置調整
9   * areaSP要素の表示状態に応じてヘッダーの位置を調整
10   */
11  function headerPosition() {
12    var header = document.getElementById('js-header');
13    var areaSP = document.getElementById('areaSp');
14
15    if (header != null && areaSP != null) {
16      var style =
17        areaSP.currentStyle ||
18        document.defaultView.getComputedStyle(areaSP, '');
19      if (style.display == 'block') {
20        header.style.top = '120px';
21      }
22      window.addEventListener('scroll', function () {
23        var scrollTop =
24          document.documentElement.scrollTop || document.body.scrollTop;
25        if (style.display == 'block' && scrollTop == 0) {
26          header.style.top = '120px';
27        } else {
28          header.style.removeProperty('top');
29        }
30      });
31    }
32  }
33
34  /**
35   * トップへ戻るボタン機能
36   * スクロール位置に応じてボタンの表示/非表示を制御し、スムーズスクロールを設定
37   */
38  function pageTopBtn() {
39    /**
40     * スクロール位置に応じてボタンの表示/非表示を切り替え
41     * @param {number} scrollPos 現在のスクロール位置
42     */
43    var scrollToggleClass = function (scrollPos) {
44      var targetTop = document.getElementById('js-targetBtn');
45      var triggerMargin = 300;
46      if (triggerMargin < scrollPos) {
47        targetTop.classList.add('targetTop--show');
48      } else {
49        targetTop.classList.remove('targetTop--show');
50      }
51    };
52
53    window.addEventListener('scroll', function () {
54      var scrollTop =
55        document.documentElement.scrollTop || document.body.scrollTop;
56      scrollToggleClass(scrollTop);
57    });
58
59    // moveToライブラリ用のイージング関数
60    var easeFunctions = {
61      easeInQuad: function (t, b, c, d) {
62        t /= d;
63        return c * t * t + b;
64      },
65      easeOutQuad: function (t, b, c, d) {
66        t /= d;
67        return -c * t * (t - 2) + b;
68      },
69    };
70    
71    // スクロール中フラグ
72    var isScrolling = false;
73    var scrollStartTime = 0;
74    // スムーズスクロール設定
75    var moveTo = new MoveTo(
76      {
77        duration: 800,
78        ease: 'easeInQuad',
79        callback: function() {
80          // スクロール完了後にフォーカスを移動
81          isScrolling = false;
82          var headerLogo = document.querySelector('h1 a');
83          if (headerLogo) {
84            headerLogo.setAttribute('tabindex', '-1');
85            headerLogo.focus();
86            setTimeout(function() {
87              headerLogo.removeAttribute('tabindex');
88            }, 100);
89          }
90        }
91      },
92      easeFunctions
93    );
94    // ページトップボタンにスムーズスクロールを適用
95    var triggers = document.getElementsByClassName('js-pageTopTrigger');
96    for (var i = 0; i < triggers.length; i++) {
97      moveTo.registerTrigger(triggers[i]);
98
99      // クリック時にスクロール開始フラグを立てる
100      triggers[i].addEventListener('click', function(e) {
101        isScrolling = true;
102        scrollStartTime = Date.now();
103      });
104    }
105    
106    // スクロール中のTab操作を制御
107    document.addEventListener('keydown', function(e) {
108      if (e.key === 'Tab' && isScrolling) {
109        var elapsedTime = Date.now() - scrollStartTime;
110        
111        // スクロール開始から800ms以内の場合
112        if (elapsedTime < 800) {
113          e.preventDefault();
114          
115          // スクロールを即座に完了させてフォーカスを移動
116          window.scrollTo({
117            top: 0,
118            behavior: 'instant'
119          });
120          
121          isScrolling = false;
122          
123          // ヘッダーロゴにフォーカス
124          var headerLogo = document.querySelector('h1 a');
125          if (headerLogo) {
126            headerLogo.setAttribute('tabindex', '-1');
127            headerLogo.focus();
128            setTimeout(function() {
129              headerLogo.removeAttribute('tabindex');
130            }, 100);
131          }
132        }
133      }
134    });
135  }
136
137    /**
138   * ヘッダーサブタイトルとメニュー状態をURL判定
139   * 現在のURLパスに基づいてヘッダーサブタイトルとメガメニューの表示を制御
140   */
141  function headerUrlRelated() {
142    var activeUrlPath = location.pathname;
143    var pathList = activeUrlPath.split('/');
144    var firstLayer = pathList[1];
145    var secondLayer = pathList[2];
146    var header = document.getElementById('js-header');
147    var titleElement = document.getElementById('js-subTitle');
148    var megaMenu = document.getElementById('js-megaMenu');
149
150    var contentMenulists = [];
151    var clickMenulists = [];
152    var wrapperMenu = document.getElementById('js-hamburgerMenu');
153    var clickMenu = document.querySelectorAll('.hamburgerMenu__listItem');
154    var contentMenu = document.querySelectorAll('.hamburgerSubMenu__wrapper');
155
156    var megaMenuNormal = document.getElementById('megaMenuNormal');
157    var megaMenuInformation = document.getElementById('megaMenuInformation');
158    var megaMenuTreecycle = document.getElementById('megaMenuTreecycle');
159    var megaMenuBunjyo = document.getElementById('megaMenuBunjyo');
160
161    var pElement = document.createElement('a');
162    pElement.className = 'header__subTitle';
163    var megaMenuDisplay = function () {
164      megaMenu.classList.add('megaMenuHide');
165    };
166
167    for (var i = 0; i < contentMenu.length; i++) {
168      contentMenulists.push(contentMenu[i]);
169    }
170    for (var j = 0; j < clickMenu.length; j++) {
171      clickMenulists.push(clickMenu[j]);
172    }
173
174    //ハンバーガーメニュー対象のカテゴリーを開いた状態にする
175    //住まい
176    var hamburgerMenuOpenCat1 = function () {
177      clickMenulists[0].classList.add('hamburgerMenu__listItem--active');
178      contentMenulists[0].classList.add('hamburgerSubMenu__wrapper--isOpen');
179      var panelDiv = contentMenulists[0].closest('[role="tabpanel"]');
180      if (panelDiv) {
181        panelDiv.classList.add('hamburgerSubMenu__wrapper--isOpen');
182      }
183      wrapperMenu.classList.add('hamburgerMenu__body--isOpen');
184      var button = clickMenulists[0].querySelector('.hamburgerMenu__link');
185      if (button && button.tagName === 'BUTTON') {
186        button.setAttribute('aria-selected', 'true');
187        button.setAttribute('aria-expanded', 'true');
188      }
189    };
190    //中大規模
191    var hamburgerMenuOpenCat2 = function () {
192      clickMenulists[1].classList.add('hamburgerMenu__listItem--active');
193      contentMenulists[1].classList.add('hamburgerSubMenu__wrapper--isOpen');
194      var panelDiv = contentMenulists[1].closest('[role="tabpanel"]');
195      if (panelDiv) {
196        panelDiv.classList.add('hamburgerSubMenu__wrapper--isOpen');
197      }
198      wrapperMenu.classList.add('hamburgerMenu__body--isOpen');
199      var button = clickMenulists[1].querySelector('.hamburgerMenu__link');
200      if (button && button.tagName === 'BUTTON') {
201        button.setAttribute('aria-selected', 'true');
202        button.setAttribute('aria-expanded', 'true');
203      }
204    };
205
206    var hamburgerMenuOpenCat3 = function () {
207      clickMenulists[2].classList.add('hamburgerMenu__listItem--active');
208      contentMenulists[2].classList.add('hamburgerSubMenu__wrapper--isOpen');
209      var panelDiv = contentMenulists[2].closest('[role="tabpanel"]');
210      if (panelDiv) {
211        panelDiv.classList.add('hamburgerSubMenu__wrapper--isOpen');
212      }
213      wrapperMenu.classList.add('hamburgerMenu__body--isOpen');
214      var button = clickMenulists[2].querySelector('.hamburgerMenu__link');
215      if (button && button.tagName === 'BUTTON') {
216        button.setAttribute('aria-selected', 'true');
217        button.setAttribute('aria-expanded', 'true');
218      }
219    };
220    //企業・IR
221    var hamburgerMenuOpenCat5 = function () {
222      var targetIndex = 4; 
223      
224      if (!contentMenulists[targetIndex]) {
225        return;
226      }
227      
228      clickMenulists[5].classList.add('hamburgerMenu__listItem--active');
229      contentMenulists[targetIndex].classList.add('hamburgerSubMenu__wrapper--isOpen');
230      contentMenulists[targetIndex].setAttribute('id', 'hamburgerSubMenuOpen');
231      var panelDiv = contentMenulists[targetIndex].closest('[role="tabpanel"]');
232      if (panelDiv) {
233        panelDiv.classList.add('hamburgerSubMenu__wrapper--isOpen');
234      }
235      wrapperMenu.classList.add('hamburgerMenu__body--isOpen');
236      var button = clickMenulists[5].querySelector('.hamburgerMenu__link');
237      if (button && button.tagName === 'BUTTON') {
238        button.setAttribute('aria-selected', 'true');
239        button.setAttribute('aria-expanded', 'true');
240      }
241    };
242
243    //ハンバーガーメニュー対象のアコーディオンを開く
244    var accordionMenuOpen1 = function () {
245      var accordionElement = document
246        .getElementById('hamburgerSubMenuOpen')
247        .getElementsByClassName('hamburgerSubMenu__accordionMenu');
248      accordionElement[0].classList.add('hamburgerSubMenu__item--autoHeight');
249      accordionElement[0].firstElementChild.classList.add(
250        'accordionMenu--isActive'
251      );
252      accordionElement[0].lastElementChild.classList.add(
253        'accordionMenu__list--isOpen'
254      );
255    };
256    var accordionMenuOpen2 = function () {
257      var accordionElement = document
258        .getElementById('hamburgerSubMenuOpen')
259        .getElementsByClassName('hamburgerSubMenu__accordionMenu');
260      accordionElement[1].classList.add('hamburgerSubMenu__item--autoHeight');
261      accordionElement[1].firstElementChild.classList.add(
262        'accordionMenu--isActive'
263      );
264      accordionElement[1].lastElementChild.classList.add(
265        'accordionMenu__list--isOpen'
266      );
267    };
268    var accordionMenuOpen3 = function () {
269      var accordionElement = document
270        .getElementById('hamburgerSubMenuOpen')
271        .getElementsByClassName('hamburgerSubMenu__accordionMenu');
272      accordionElement[2].classList.add('hamburgerSubMenu__item--autoHeight');
273      accordionElement[2].firstElementChild.classList.add(
274        'accordionMenu--isActive'
275      );
276      accordionElement[2].lastElementChild.classList.add(
277        'accordionMenu__list--isOpen'
278      );
279    };
280
281    if (header != null) {
282      // ディレクトに応じての処理
283      switch (firstLayer) {
284        case 'ie':
285          pElement.textContent = '注文住宅';
286          pElement.href = '/ie/';
287          titleElement.appendChild(pElement);
288          megaMenuDisplay();
289          hamburgerMenuOpenCat1();
290          break;
291
292        case 'bunjyo':
293          pElement.textContent = '分譲住宅・土地';
294          pElement.href = '/bunjyo/';
295          titleElement.appendChild(pElement);
296          hamburgerMenuOpenCat1();
297          // メガメニュー表示
298          megaMenuBunjyo.style.display = 'block';
299          break;
300
301        case 'tochikatsu':
302          pElement.textContent = '賃貸住宅・土地活用';
303          pElement.href = '/tochikatsu/';
304          titleElement.appendChild(pElement);
305          megaMenuDisplay();
306          hamburgerMenuOpenCat1();
307          break;
308
309		case 'jigyou_kenchiku':
310          pElement.textContent = '事業用建築';
311          pElement.href = '/jigyou_kenchiku/';
312          titleElement.appendChild(pElement);
313          megaMenuDisplay();
314          hamburgerMenuOpenCat1();
315          break;
316
317        case 'renovation':
318          pElement.textContent = 'リノベーション済マンション';
319          pElement.href = '/renovation/';
320          titleElement.appendChild(pElement);
321          megaMenuDisplay();
322          hamburgerMenuOpenCat1();
323          break;
324
325        case 'mocca':
326          pElement.textContent = '中大規模木造建築(MOCCA)';
327          pElement.href = '/mocca/';
328          titleElement.appendChild(pElement);
329          megaMenuDisplay();
330          hamburgerMenuOpenCat2();
331          break;
332
333        case 'treecycle':
334          pElement.textContent = '森林・木材・再エネ';
335          pElement.href = '/treecycle/';
336          titleElement.appendChild(pElement);
337          hamburgerMenuOpenCat3();
338          // メガメニュー表示
339          megaMenuTreecycle.style.display = 'block';
340          break;
341
342        case 'information':
343          pElement.textContent = '企業・IR・ESG・採用';
344          pElement.href = '/information/';
345          titleElement.appendChild(pElement);
346          // メガメニュー表示
347          megaMenuInformation.style.display = 'block';
348          hamburgerMenuOpenCat5();
349          // まなびの森メガメニュー非表示
350          if (secondLayer === 'manabi') {
351            megaMenuDisplay();
352          }
353          // 第二回層ハンバーガーメニューアコーディオン表示処理
354          switch (secondLayer) {
355            case 'company':
356              accordionMenuOpen1();
357              break;
358            case 'ir':
359              accordionMenuOpen2();
360              break;
361            case 'sustainability':
362              accordionMenuOpen3();
363              break;
364            default:
365              break;
366          }
367          break;
368
369        case 'cm':
370          megaMenuDisplay();
371          hamburgerMenuOpenCat5();
372          break;
373
374        case 'contact':
375          megaMenuDisplay();
376          break;
377
378        case 'catalog':
379          megaMenuDisplay();
380          break;
381
382        case 'sitemap':
383          megaMenuDisplay();
384          break;
385
386        case 'terms':
387          megaMenuDisplay();
388          break;
389
390        case 'hogo':
391          megaMenuDisplay();
392          break;
393
394        case 'socialmediapolicy':
395          megaMenuDisplay();
396          break;
397
398        case 'search.html':
399          megaMenuDisplay();
400          break;
401
402        default:
403          // メガメニュー表示
404          megaMenuNormal.style.display = 'block';
405          break;
406      }
407    }
408  }
409  // ヘッダースクロール固定
410  function headerScrollFixed() {
411    var fixHeader = function (position, lastPosition) {
412      var header = document.getElementById('js-header');
413      var headerNav = document.getElementsByClassName('headerNav__listItem');
414      var headerOverlay = document.getElementById('js-headerOverlay');
415      if (header != null) {
416        var headerHeight = header.clientHeight;
417        if (position > headerHeight && position > lastPosition) {
418          header.classList.add('header--unpinned');
419          Array.prototype.forEach.call(headerNav, function (element) {
420            if (element.classList.contains('headerNav__listItem--isOpen')) {
421              element.classList.remove('headerNav__listItem--isOpen');
422              headerOverlay.classList.remove('headerOverlay--isHover');
423            }
424          });
425        }
426        if (position < headerHeight || position < lastPosition) {
427          header.classList.remove('header--unpinned');
428        }
429      }
430    };
431
432    var lastPosition = 0;
433    window.addEventListener('scroll', function () {
434      var position = window.scrollY || window.pageYOffset;
435      fixHeader(position, lastPosition);
436      lastPosition = position;
437    });
438  }
439
440  // フッタースクロールクラス追加
441  function footerScrollAddClass() {
442    var drawBorder = function (scrollPos) {
443      var footer = document.getElementById('js-footer');
444      var footerTop = footer.offsetTop + 300;
445      if (footerTop < scrollPos) {
446        footer.classList.add('footer--isScroll');
447      }
448    };
449
450    window.addEventListener('scroll', function () {
451      var scrollTop =
452        document.documentElement.scrollTop || document.body.scrollTop;
453      var scrollPos = scrollTop + document.documentElement.clientHeight;
454      drawBorder(scrollPos);
455    });
456  }
457
458  function toggleHamburgerTabIndex(isOpen) {
459    var hamburgerMenu = document.getElementById('js-openMenu');
460    var overlay = document.getElementById('js-overlay');
461    
462    if (!hamburgerMenu) return;
463    if (overlay) {
464      overlay.setAttribute('tabindex', '-1');
465    }
466    var subMenus = hamburgerMenu.querySelectorAll('.hamburgerSubMenu');
467    Array.prototype.forEach.call(subMenus, function(subMenu) {
468      subMenu.setAttribute('tabindex', '-1');
469    });
470    var focusableElements = hamburgerMenu.querySelectorAll(
471      'a, button, input, select, textarea, [tabindex]:not([tabindex="-1"])'
472    );
473    Array.prototype.forEach.call(focusableElements, function(element) {
474      if (isOpen) {
475        element.setAttribute('tabindex', '0');
476      } else {
477        element.setAttribute('tabindex', '-1');
478      }
479    });
480  }
481  // ハンバーガーメニュー開閉
482  function hamburgerClickIcon() {
483    var targetMenu = document.getElementById('js-openMenu');
484    var trigger = document.querySelector('.js-hamburgerOpen');
485    var overlay = document.getElementById('js-overlay');
486    var body = document.body;
487    var scrollPos = 0;
488
489    if (targetMenu != null && trigger != null) {
490      // 初期状態: メニューが閉じているのでタブフォーカス不可
491      toggleHamburgerTabIndex(false);
492      
493      var closeMenu = function () {
494        var winWidth = window.innerWidth;
495        targetMenu.classList.remove('hamburgerMenu--isActive');
496        body.classList.remove('isNavOpened');
497        if (winWidth <= 767) {
498          body.style.removeProperty('top');
499        }
500        body.style.removeProperty('display');
501        trigger.style.display = 'block';
502        window.scrollTo(0, scrollPos);
503        trigger.setAttribute('aria-expanded', 'false');
504        
505        // メニューを閉じたらタブフォーカス不可に
506        toggleHamburgerTabIndex(false);
507      };
508      
509      trigger.addEventListener('click', function () {
510        var winWidth = window.innerWidth;
511        if (targetMenu.classList.contains('hamburgerMenu--isActive')) {
512          closeMenu();
513        } else {
514          scrollPos = document.documentElement.scrollTop || document.body.scrollTop;
515          targetMenu.classList.add('hamburgerMenu--isActive');
516          body.classList.add('isNavOpened');
517          targetMenu.querySelector('.hamburgerMenu__wrapper').scrollTop = 0;
518          if (winWidth <= 767) {
519            body.style.top = -scrollPos + 'px';
520          }
521          trigger.setAttribute('aria-expanded', 'true');
522          trigger.style.display = 'block';
523          
524          // メニューを開いたらタブフォーカス可能に
525          toggleHamburgerTabIndex(true);
526        }
527      });
528
529      trigger.addEventListener('keydown', function(e) {
530        if (e.key === 'Enter' || e.key === ' ') {
531          e.preventDefault();
532          trigger.click();
533        }
534      });
535      
536      overlay.addEventListener('click', function () {
537        closeMenu();
538      });
539
540      targetMenu.addEventListener('scroll', function () {
541        var scrollY = targetMenu.scrollTop;
542        if (targetMenu.classList.contains('hamburgerMenu--isActive')) {
543          if (scrollY > 0) {
544            trigger.style.display = 'none';
545          } else {
546            trigger.style.display = 'block';
547          }
548        }
549      });
550    }
551  }
552
553  // ハンバーガーメニュー表示
554  function hamburgerShowMenu() {
555    var lists = [];
556    var wrapperMenu = document.getElementById('js-hamburgerMenu');
557    var clickMenu = document.querySelectorAll('.hamburgerMenu__listItem');
558    var contentMenu = document.querySelectorAll('.hamburgerSubMenu__wrapper');
559
560    for (var i = 0; i < contentMenu.length; i++) {
561      lists.push(contentMenu[i]);
562    }
563
564    Array.prototype.forEach.call(clickMenu, function (elm, index) {
565        if (!elm.classList.contains('hamburgerMenu__listItem--hasLink')) {
566            var button = elm.querySelector('.hamburgerMenu__link');
567            if (button && button.tagName === 'BUTTON') {
568                button.setAttribute('aria-expanded', 'false');
569                button.setAttribute('aria-controls', 'hamburger-panel-' + index);
570            }
571        }
572    });
573
574    var resetClass = function () {
575      Array.prototype.forEach.call(lists, function (element) {
576        element.classList.remove('hamburgerSubMenu__wrapper--isOpen');
577        element.removeAttribute('id');
578        // 親divのクラスも削除
579        var panelDiv = element.closest('[role="tabpanel"]');
580        if (panelDiv) {
581          panelDiv.classList.remove('hamburgerSubMenu__wrapper--isOpen');
582        }
583      });
584      Array.prototype.forEach.call(clickMenu, function (element) {
585        element.classList.remove('hamburgerMenu__listItem--active');
586        var button = element.querySelector('.hamburgerMenu__link');
587        if (button && button.tagName === 'BUTTON') {
588            button.setAttribute('aria-expanded', 'false');
589            button.setAttribute('aria-selected', 'false');
590        }
591      });
592    };
593
594    Array.prototype.forEach.call(clickMenu, function (elm, index) {
595      elm.addEventListener('click', function () {
596        if (this.classList.contains('hamburgerMenu__listItem--hasLink')) {
597          return false;
598        }
599        
600        // リセット
601        resetClass();
602        
603        // アクティブ化
604        this.classList.add('hamburgerMenu__listItem--active');
605        var button = this.querySelector('.hamburgerMenu__link');
606        if (button && button.tagName === 'BUTTON') {
607            button.setAttribute('aria-expanded', 'true');
608            button.setAttribute('aria-selected', 'true');
609        }
610        var panelId = button ? button.getAttribute('aria-controls') : null;
611        var targetPanel = panelId ? document.getElementById(panelId) : null;
612        if (targetPanel) {
613          var targetWrapper = targetPanel.querySelector('.hamburgerSubMenu__wrapper');
614          
615          if (targetWrapper) {
616            targetPanel.classList.add('hamburgerSubMenu__wrapper--isOpen');
617            targetWrapper.classList.add('hamburgerSubMenu__wrapper--isOpen');
618            
619            wrapperMenu.classList.add('hamburgerMenu__body--isOpen');
620            setTimeout(function() {
621                var firstFocusable = targetWrapper.querySelector('a, button:not([tabindex="-1"]), input, select, textarea, [tabindex]:not([tabindex="-1"])');
622                if (firstFocusable) {
623                    firstFocusable.focus();
624                }
625            }, 50);
626          }
627        }
628      });
629      
630      // キーボードサポート
631      var button = elm.querySelector('.hamburgerMenu__link');
632      if (button && button.tagName === 'BUTTON') {
633          button.addEventListener('keydown', function(e) {
634              if (e.key === 'Enter' || e.key === ' ') {
635                  e.preventDefault();
636                  elm.click();
637              } else if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {
638                e.preventDefault();
639                var allTabs = Array.prototype.filter.call(clickMenu, function(item) {
640                    return !item.classList.contains('hamburgerMenu__listItem--hasLink');
641                });
642                var currentIndex = allTabs.indexOf(elm);
643                var nextIndex = (currentIndex + 1) % allTabs.length;
644                var nextButton = allTabs[nextIndex].querySelector('.hamburgerMenu__link');
645                if (nextButton) {
646                    nextButton.focus();
647                    allTabs[nextIndex].click();
648                }
649            } else if (e.key === 'ArrowUp' || e.key === 'ArrowLeft') {
650                e.preventDefault();
651                var allTabs = Array.prototype.filter.call(clickMenu, function(item) {
652                    return !item.classList.contains('hamburgerMenu__listItem--hasLink');
653                });
654                var currentIndex = allTabs.indexOf(elm);
655                var prevIndex = (currentIndex - 1 + allTabs.length) % allTabs.length;
656                var prevButton = allTabs[prevIndex].querySelector('.hamburgerMenu__link');
657                if (prevButton) {
658                    prevButton.focus();
659                    allTabs[prevIndex].click();
660                }
661            }
662          });
663      }
664    });
665  }
666
667  // ハンバーガーメニューアコーディオン
668  function hamburgerAccordion() {
669    var accordionTitle = document.querySelectorAll('.js-accordion-title');
670
671    for (var i = 0; i < accordionTitle.length; i++) {
672      accordionTitle[i].setAttribute('aria-expanded', 'false');
673      accordionTitle[i].addEventListener('click', function () {
674        var content = this.nextElementSibling;
675        var parent = this.parentNode;
676        var isExpanded = this.getAttribute('aria-expanded') === 'true';
677        this.setAttribute('aria-expanded', (!isExpanded).toString());
678        this.classList.toggle('accordionMenu--isActive');
679        content.classList.toggle('accordionMenu__list--isOpen');
680        parent.classList.toggle('hamburgerSubMenu__item--autoHeight');
681      });
682
683      // キーボードサポート
684      accordionTitle[i].addEventListener('keydown', function(e) {
685          if (e.key === 'Enter' || e.key === ' ') {
686              e.preventDefault();
687              this.click();
688          }
689      });
690    }
691  }
692
693  // メガドロップメニュー
694  function dropdownShowMenu() {
695    var headerOverlay = document.getElementById('js-headerOverlay');
696    var dropdownItem = document.querySelectorAll('.headerNav__listItem');
697    var lists = [];
698    for (var i = 0; i < dropdownItem.length; i++) {
699      lists.push(dropdownItem[i]);
700    }
701    for (var j = 0; j < lists.length; j++) {
702      (function (i) {
703        var button = lists[i].querySelector('.headerNav__title');
704        var megaMenu = lists[i].querySelector('.headerMegaNav');
705        if (button && button.tagName === 'BUTTON' && megaMenu) {
706            button.setAttribute('aria-expanded', 'false');
707            button.setAttribute('aria-controls', 'mega-menu-' + i);
708            megaMenu.setAttribute('id', 'mega-menu-' + i);
709            megaMenu.setAttribute('aria-hidden', 'true');
710        }
711        lists[i].addEventListener('mouseenter', function () {
712          headerOverlay.classList.add('headerOverlay--isHover');
713          lists[i].classList.add('headerNav__listItem--isOpen');
714          if (lists[i].classList.contains('headerNav__listItem--hasLink')) {
715            headerOverlay.classList.remove('headerOverlay--isHover');
716          }
717        });
718        lists[i].addEventListener('mouseleave', function () {
719          headerOverlay.classList.remove('headerOverlay--isHover');
720          lists[i].classList.remove('headerNav__listItem--isOpen');
721        });
722        if (button && button.tagName === 'BUTTON') {
723            button.addEventListener('click', function() {
724                toggleMegaMenu(lists[i]);
725            });
726            
727            button.addEventListener('keydown', function(e) {
728                if (e.key === 'Enter' || e.key === ' ') {
729                    e.preventDefault();
730                    toggleMegaMenu(lists[i]);
731                } else if (e.key === 'Escape') {
732                    closeMegaMenu(lists[i]);
733                }
734            });
735        }
736      })(j);
737    }
738    function openMegaMenu(item) {
739        headerOverlay.classList.add('headerOverlay--isHover');
740        item.classList.add('headerNav__listItem--isOpen');
741        
742        var button = item.querySelector('.headerNav__title');
743        var megaMenu = item.querySelector('.headerMegaNav');
744        
745        if (button && button.tagName === 'BUTTON') {
746            button.setAttribute('aria-expanded', 'true');
747        }
748        if (megaMenu) {
749            megaMenu.setAttribute('aria-hidden', 'false');
750            
751            // メガメニューを開いたら、サブメニュー内の要素をフォーカス可能にする
752            var megaFocusable = megaMenu.querySelectorAll('a, button');
753            Array.prototype.forEach.call(megaFocusable, function(el) {
754                el.setAttribute('tabindex', '0');
755            });
756        }
757        
758        if (item.classList.contains('headerNav__listItem--hasLink')) {
759            headerOverlay.classList.remove('headerOverlay--isHover');
760        }
761    }
762    
763    function closeMegaMenu(item) {
764        headerOverlay.classList.remove('headerOverlay--isHover');
765        item.classList.remove('headerNav__listItem--isOpen');
766        
767        var button = item.querySelector('.headerNav__title');
768        var megaMenu = item.querySelector('.headerMegaNav');
769        
770        if (button && button.tagName === 'BUTTON') {
771            button.setAttribute('aria-expanded', 'false');
772        }
773        if (megaMenu) {
774            megaMenu.setAttribute('aria-hidden', 'true');
775            
776            // メガメニューを閉じたら、サブメニュー内の要素をフォーカス不可にする
777            var megaFocusable = megaMenu.querySelectorAll('a, button');
778            Array.prototype.forEach.call(megaFocusable, function(el) {
779                el.setAttribute('tabindex', '-1');
780            });
781        }
782    }
783    
784    function toggleMegaMenu(item) {
785        var isOpen = item.classList.contains('headerNav__listItem--isOpen');
786        if (isOpen) {
787            closeMegaMenu(item);
788        } else {
789            // 他のメニューを閉じる
790            lists.forEach(function(otherItem) {
791                if (otherItem !== item) {
792                    closeMegaMenu(otherItem);
793                }
794            });
795            openMegaMenu(item);
796        }
797    }
798  }
799
800  // フッターSPメニュー表示
801function footerSpShowMenu() {
802  var lists = [];
803  var wrapperMenu = document.getElementById('js-footerMenu');
804  var clickMenu = document.querySelectorAll('.footerSitemapSpHedging__item');
805  var contentMenu = document.querySelectorAll('.footerSitemap__listItem');
806
807  for (var i = 0; i < contentMenu.length; i++) {
808    lists.push(contentMenu[i]);
809  }
810
811  Array.prototype.forEach.call(clickMenu, function (elm, index) {
812    if (!elm.classList.contains('footerSitemapSpHedging__item--hasLink')) {
813      var button = elm.querySelector('.footerSitemapSpHedging__text');
814      if (button && button.tagName === 'BUTTON') {
815        button.setAttribute('aria-expanded', 'false');
816        button.setAttribute('aria-controls', 'footer-panel-' + index);
817        
818        if (lists[index]) {
819          lists[index].setAttribute('id', 'footer-panel-' + index);
820        }
821      }
822    }
823  });
824
825  Array.prototype.forEach.call(lists, function(listItem) {
826    var focusableElements = listItem.querySelectorAll('a, button');
827    Array.prototype.forEach.call(focusableElements, function(el) {
828      el.setAttribute('tabindex', '-1');
829    });
830  });
831
832  var resetClass = function () {
833    Array.prototype.forEach.call(lists, function (element) {
834      element.classList.remove('footerSitemap__listItem--isOpen');
835      
836      // ★追加: カテゴリー内のアコーディオンもリセット
837      var accordions = element.querySelectorAll('.js-footerSpAccordion');
838      Array.prototype.forEach.call(accordions, function(accordion) {
839        accordion.setAttribute('aria-expanded', 'false');
840        accordion.classList.remove('footerSpAccordionMenu--isActive');
841        
842        var accordionList = accordion.nextElementSibling;
843        if (accordionList && accordionList.classList.contains('footerSpAccordionMenu__list')) {
844          accordionList.classList.remove('footerSpAccordionMenu__list--isOpen');
845        }
846        
847        var parent = accordion.parentNode;
848        if (parent) {
849          parent.classList.remove('footerSpAccordionMenu__item--autoHeight');
850        }
851      });
852    });
853    
854    Array.prototype.forEach.call(clickMenu, function (element) {
855      element.classList.remove('footerSitemapSpHedging__item--active');
856      var button = element.querySelector('.footerSitemapSpHedging__text');
857      if (button && button.tagName === 'BUTTON') {
858        button.setAttribute('aria-expanded', 'false');
859      }
860    });
861  };
862
863  Array.prototype.forEach.call(clickMenu, function (elm, index) {
864    elm.addEventListener('click', function () {
865      if (this.classList.contains('footerSitemapSpHedging__item--hasLink')) {
866        return false;
867      }
868      
869      resetClass();
870      Array.prototype.forEach.call(lists, function(listItem) {
871        var focusableElements = listItem.querySelectorAll('a, button');
872        Array.prototype.forEach.call(focusableElements, function(el) {
873          el.setAttribute('tabindex', '-1');
874        });
875      });
876      
877      this.classList.add('footerSitemapSpHedging__item--active');
878      var button = this.querySelector('.footerSitemapSpHedging__text');
879      if (button && button.tagName === 'BUTTON') {
880        button.setAttribute('aria-expanded', 'true');
881      }
882      lists[index].classList.add('footerSitemap__listItem--isOpen');
883      wrapperMenu.classList.add('footerSitemap--isOpen');
884      
885      // 開いたカテゴリーのみフォーカス可能に
886      var openedCategory = lists[index];
887
888      // カテゴリー直下の要素(アコーディオンボタン、通常のリンクなど)をフォーカス可能に
889      var directFocusable = openedCategory.querySelectorAll('.footerSubCategory__link, .js-footerSpAccordion, .footerSubCategoryRelationMenu__link'); // ★追加
890      Array.prototype.forEach.call(directFocusable, function(el) {
891        el.removeAttribute('tabindex');
892      });
893
894      // 閉じているアコーディオン内のリンクはフォーカス不可のまま
895      var closedAccordions = openedCategory.querySelectorAll('.footerSpAccordionMenu__list:not(.footerSpAccordionMenu__list--isOpen)');
896      Array.prototype.forEach.call(closedAccordions, function(accordion) {
897        var links = accordion.querySelectorAll('a, button');
898        Array.prototype.forEach.call(links, function(link) {
899          link.setAttribute('tabindex', '-1');
900        });
901      });
902    });
903
904    // キーボードサポート
905    var button = elm.querySelector('.footerSitemapSpHedging__text');
906    if (button && button.tagName === 'BUTTON') {
907      button.addEventListener('keydown', function(e) {
908        if (e.key === 'Enter' || e.key === ' ') {
909          e.preventDefault();
910          elm.click();
911        }
912      });
913    }
914  });
915}
916
917  // フッターSPメニューアコーディオン
918  function footerAccordion() {
919    var accordionTitle = document.querySelectorAll('.js-footerSpAccordion');
920
921    // 初期状態でtabindexを設定
922    updateFooterAccordionTabIndex();
923
924    for (var i = 0; i < accordionTitle.length; i++) {
925      accordionTitle[i].setAttribute('aria-expanded', 'false');
926      if (accordionTitle[i].tagName === 'BUTTON') {
927        var content = accordionTitle[i].nextElementSibling;
928        if (content) {
929          var contentId = 'footer-accordion-' + i;
930          content.setAttribute('id', contentId);
931          accordionTitle[i].setAttribute('aria-controls', contentId);
932        }
933      }
934      
935      accordionTitle[i].addEventListener('click', function () {
936        var content = this.nextElementSibling;
937        var parent = this.parentNode;
938        if (this.tagName === 'BUTTON') {
939          var isExpanded = this.getAttribute('aria-expanded') === 'true';
940          this.setAttribute('aria-expanded', (!isExpanded).toString());
941        }
942        this.classList.toggle('footerSpAccordionMenu--isActive');
943        content.classList.toggle('footerSpAccordionMenu__list--isOpen'); // ★ここを修正
944        parent.classList.toggle('footerSpAccordionMenu__item--autoHeight'); // ★ここも修正
945        
946        // tabindexを更新
947        setTimeout(updateFooterAccordionTabIndex, 50);
948        
949        return false;
950      });
951      
952      // キーボードサポート
953      if (accordionTitle[i].tagName === 'BUTTON') {
954        accordionTitle[i].addEventListener('keydown', function(e) {
955          if (e.key === 'Enter' || e.key === ' ') {
956            e.preventDefault();
957            this.click();
958          }
959        });
960      }
961    }
962  }
963  // ヘッダーpadding設定
964  function HeaderPadTop() {
965    var globalHeaderPadTop = document.getElementById('js-globalHeaderPadTop');
966    var megaMenu = document.getElementById('js-megaMenu');
967    if (megaMenu != null) {
968      if (megaMenu.classList.contains('megaMenuHide')) {
969        globalHeaderPadTop.style.paddingTop = '82px';
970      }
971    }
972  }
973
974  // フッターアコーディオンのtabindex制御
975  function updateFooterAccordionTabIndex() {
976    var accordionLists = document.querySelectorAll('.footerSpAccordionMenu__list');
977    
978    Array.prototype.forEach.call(accordionLists, function(list) {
979      var isOpen = list.classList.contains('footerSpAccordionMenu__list--isOpen');
980      var focusableElements = list.querySelectorAll('a, button');
981      
982      Array.prototype.forEach.call(focusableElements, function(element) {
983        if (isOpen) {
984          // 開いている時はフォーカス可能に
985          element.removeAttribute('tabindex');
986          element.removeAttribute('data-original-tabindex');
987        } else {
988          // 閉じている時はフォーカス不可に
989          element.setAttribute('tabindex', '-1');
990          element.setAttribute('data-original-tabindex', '-1');
991        }
992      });
993    });
994  }
995
996  // カスタムタブナビゲーション
997  function customTabNavigation() {
998      var hamburgerMenu = document.getElementById('js-openMenu');
999      if (!hamburgerMenu) return;
1000
1001      // メニューが開いている時のみ動作
1002      hamburgerMenu.addEventListener('keydown', function(e) {
1003          if (e.key !== 'Tab') return;
1004          
1005          var activeElement = document.activeElement;
1006          
1007          if (e.shiftKey) {
1008              // Shift+Tab(逆方向)
1009              var nextElement = getPreviousLogicalElement(activeElement);
1010              if (nextElement) {
1011                  e.preventDefault();
1012                  nextElement.focus();
1013              }
1014              // nextElementがnullの場合はデフォルト動作に任せ、フォーカスがメニュー外に出られるようにする
1015          } else {
1016              // Tab(順方向) - 既存のロジックを維持
1017              var allFocusableElements = getAllFocusableElements();
1018              var currentIndex = allFocusableElements.indexOf(activeElement);
1019              if (currentIndex === -1) return;
1020
1021              var nextElement = getNextLogicalElement(activeElement, allFocusableElements, currentIndex);
1022              
1023              if (nextElement && nextElement !== getDefaultNextElement(activeElement, allFocusableElements, currentIndex, e.shiftKey)) {
1024                  e.preventDefault();
1025                  nextElement.focus();
1026              }
1027          }
1028      });
1029
1030      // すべてのフォーカス可能な要素を取得
1031      function getAllFocusableElements() {
1032          var elements = hamburgerMenu.querySelectorAll(
1033              'button:not([tabindex="-1"]), a, input, select, textarea, [tabindex]:not([tabindex="-1"])'
1034          );
1035          return Array.prototype.filter.call(elements, function(el) {
1036              return el.offsetWidth > 0 && el.offsetHeight > 0;
1037          });
1038      }
1039
1040      // デフォルトの次の要素を取得
1041      function getDefaultNextElement(currentElement, allElements, currentIndex, isReverse) {
1042          if (isReverse) {
1043              return currentIndex > 0 ? allElements[currentIndex - 1] : null;
1044          } else {
1045              return currentIndex < allElements.length - 1 ? allElements[currentIndex + 1] : null;
1046          }
1047      }
1048
1049      // ★★★ 順方向: 論理的な次の要素を取得 (変更なし) ★★★
1050      function getNextLogicalElement(currentElement, allElements, currentIndex) {
1051          // メインメニューボタンの場合
1052          if (currentElement.classList && currentElement.classList.contains('hamburgerMenu__link') && currentElement.tagName === 'BUTTON') {
1053              var parentMainItem = currentElement.closest('.hamburgerMenu__listItem');
1054              
1055              // aria-controlsからパネルIDを取得
1056              var panelId = currentElement.getAttribute('aria-controls');
1057              var correspondingSubmenu = null;
1058              
1059              if (panelId) {
1060                  var panel = document.getElementById(panelId);
1061                  if (panel) {
1062                      correspondingSubmenu = panel.querySelector('.hamburgerSubMenu__wrapper');
1063                  }
1064              }
1065              
1066              // サブメニューが開いているか判定
1067              var isExpanded = currentElement.getAttribute('aria-expanded') === 'true';
1068              var hasOpenClass = correspondingSubmenu && correspondingSubmenu.classList.contains('hamburgerSubMenu__wrapper--isOpen');
1069              
1070              // サブメニューが開いている場合
1071              if ((isExpanded || hasOpenClass) && correspondingSubmenu) {
1072                  var submenuElements = Array.prototype.filter.call(
1073                      correspondingSubmenu.querySelectorAll('button:not([tabindex="-1"]), a, input, select, textarea, [tabindex]:not
1073([tabindex="-1"])'),
1074                      function(el) { return el.offsetWidth > 0 && el.offsetHeight > 0; }
1075                  );
1076                  if (submenuElements.length > 0) {
1077                      return submenuElements[0];
1078                  }
1079              }
1080              
1081              // サブメニューが開いていない場合
1082              var nextMainButton = getNextMainMenuButton(parentMainItem);
1083              if (nextMainButton) {
1084                  return nextMainButton;
1085              } else {
1086                  var footerButtons = document.querySelectorAll('.footButton__link');
1087                  if (footerButtons.length > 0) {
1088                      return footerButtons[0];
1089                  }
1090              }
1091          }
1092          
1093          // サブメニュー内の要素の場合
1094          var parentSubmenu = currentElement.closest('.hamburgerSubMenu__wrapper');
1095          
1096          if (parentSubmenu && parentSubmenu.classList.contains('hamburgerSubMenu__wrapper--isOpen')) {
1097              var submenuElements = Array.prototype.filter.call(
1098                  parentSubmenu.querySelectorAll('button:not([tabindex="-1"]), a, input, select, textarea, [tabindex]:not([tabindex="-1"])'),
1099                  function(el) { return el.offsetWidth > 0 && el.offsetHeight > 0; }
1100              );
1101              var submenuIndex = submenuElements.indexOf(currentElement);
1102              
1103              // サブメニューの最後の要素の場合
1104              if (submenuIndex === submenuElements.length - 1) {
1105                  var panel = parentSubmenu.closest('[role="tabpanel"]');
1106                  if (panel) {
1107                      var buttonId = panel.getAttribute('aria-labelledby');
1108                      if (buttonId) {
1109                          var mainButton = document.getElementById(buttonId);
1110                          if (mainButton) {
1111                              var currentMainItem = mainButton.closest('.hamburgerMenu__listItem');
1112                              var nextMainButton = getNextMainMenuButton(currentMainItem);
1113                              return nextMainButton;
1114                          }
1115                      }
1116                  }
1117              }
1118          }
1119          
1120          return null;
1121      }
1122
1123      // ★★★ 逆方向: 論理的な前の要素を取得 (新しい実装) ★★★
1124      function getPreviousLogicalElement(currentElement) {
1125          var allFocusable = getAllFocusableElements();
1126          var currentFocusIndex = allFocusable.indexOf(currentElement);
1127
1128          // Case 1: フッターボタンからの移動
1129          if (currentElement.classList.contains('footButton__link')) {
1130              if (currentElement.classList.contains('footButton__link--global')) {
1131                  return document.querySelector('.footButton__link--inquiry');
1132              } else { // inquiry button
1133                  var allMainItems = Array.from(document.querySelectorAll('.hamburgerMenu__listItem'));
1134                  var lastMainItem = allMainItems[allMainItems.length - 1];
1135                  if (!lastMainItem) return null;
1136                  var lastMainButton = lastMainItem.querySelector('.hamburgerMenu__link');
1137
1138                  if (lastMainButton && lastMainButton.tagName === 'BUTTON' && lastMainButton.getAttribute('aria-expanded') === 'true') {
1139                      var panelId = lastMainButton.getAttribute('aria-controls');
1140                      var panel = document.getElementById(panelId);
1141                      if (panel) {
1142                          var lastSubmenu = panel.querySelector('.hamburgerSubMenu__wrapper');
1143                          if (lastSubmenu) {
1144                              var lastSubmenuElements = Array.from(lastSubmenu.querySelectorAll('a, button, input, select, textarea, [tabindex]:not([tabindex="-1"])')).filter(el => el.offsetWidth > 0 && el.offsetHeight > 0);
1145                              if (lastSubmenuElements.length > 0) {
1146                                  return lastSubmenuElements[lastSubmenuElements.length - 1];
1147                              }
1148                          }
1149                      }
1150                  }
1151                  return lastMainButton;
1152              }
1153          }
1154
1155          // Case 2: サブメニュー内からの移動
1156          var parentSubmenu = currentElement.closest('.hamburgerSubMenu__wrapper');
1157          if (parentSubmenu) {
1158              var submenuElements = Array.from(parentSubmenu.querySelectorAll('a, button, input, select, textarea, [tabindex]:not
1158([tabindex="-1"])')).filter(el => el.offsetWidth > 0 && el.offsetHeight > 0);
1159              var currentIndexInSubmenu = submenuElements.indexOf(currentElement);
1160
1161              if (currentIndexInSubmenu > 0) {
1162                  return submenuElements[currentIndexInSubmenu - 1];
1163              } else {
1164                  var panel = parentSubmenu.closest('[role="tabpanel"]');
1165                  if (panel) {
1166                      var buttonId = panel.getAttribute('aria-labelledby');
1167                      if (buttonId) {
1168                          return document.getElementById(buttonId);
1169                      }
1170                  }
1171              }
1172          }
1173
1174          // Case 3: メインメニュー項目からの移動
1175          var parentMainItem = currentElement.closest('.hamburgerMenu__listItem');
1176          if (parentMainItem) {
1177              var allMainItems = Array.from(document.querySelectorAll('.hamburgerMenu__listItem'));
1178              var currentMainIndex = allMainItems.indexOf(parentMainItem);
1179
1180              if (currentMainIndex > 0) {
1181                  var prevMainItem = allMainItems[currentMainIndex - 1];
1182                  var prevMainButton = prevMainItem.querySelector('.hamburgerMenu__link');
1183
1184                  if (prevMainButton && prevMainButton.tagName === 'BUTTON' && prevMainButton.getAttribute('aria-expanded') === 'true') {
1185                      var panelId = prevMainButton.getAttribute('aria-controls');
1186                      var panel = document.getElementById(panelId);
1187                      if (panel) {
1188                          var prevSubmenu = panel.querySelector('.hamburgerSubMenu__wrapper');
1189                          if (prevSubmenu) {
1190                              var prevSubmenuElements = Array.from(prevSubmenu.querySelectorAll('a, button, input, select, textarea, [tabindex]:not([tabindex="-1"])')).filter(el => el.offsetWidth > 0 && el.offsetHeight > 0);
1191                              if (prevSubmenuElements.length > 0) {
1192                                  return prevSubmenuElements[prevSubmenuElements.length - 1];
1193                              }
1194                          }
1195                      }
1196                  }
1197                  return prevMainButton;
1198              }
1199          }
1200
1201          // その他の要素(検索フォームなど)からの移動、またはメニューの先頭からの移動
1202          if (currentFocusIndex > 0) {
1203              return allFocusable[currentFocusIndex - 1];
1204          }
1205
1206          // メニューの先頭に到達した場合、nullを返してブラウザのデフォルト動作に任せる
1207          return null;
1208      }
1209
1210      // 次のメインメニューボタンを取得 (変更なし)
1211      function getNextMainMenuButton(currentMainItem) {
1212          var allMainItems = document.querySelectorAll('.hamburgerMenu__listItem');
1213          var currentIndex = Array.prototype.indexOf.call(allMainItems, currentMainItem);
1214          
1215          for (var i = currentIndex + 1; i < allMainItems.length; i++) {
1216              var nextItem = allMainItems[i];
1217              
1218              if (nextItem.classList.contains('hamburgerMenu__listItem--hasLink')) {
1219                  var nextLink = nextItem.querySelector('.hamburgerMenu__link');
1220                  if (nextLink && nextLink.tagName === 'A') {
1221                      return nextLink;
1222                  }
1223              } else {
1224                  var nextButton = nextItem.querySelector('.hamburgerMenu__link');
1225                  if (nextButton && nextButton.tagName === 'BUTTON') {
1226                      return nextButton;
1227                  }
1228              }
1229          }
1230          
1231          return null;
1232      }
1233  }
1234
1235  // フッターSPメニュー用カスタムタブナビゲーション
1236  function footerCustomTabNavigation() {
1237      var footerMenu = document.getElementById('js-footerMenu');
1238      if (!footerMenu) return;
1239      function isSPMode() {
1240          // footerSitemapSpHedging がdisplay: blockならSPモード
1241          var spHedging = document.querySelector('.footerSitemapSpHedging');
1242          if (!spHedging) return false;
1243          var style = window.getComputedStyle(spHedging);
1244          return style.display !== 'none';
1245      }
1246      document.addEventListener('keydown', function(e) {
1247          if (e.key !== 'Tab' || !e.shiftKey) return;
1248          var activeElement = document.activeElement;
1249          if (footerMenu.contains(activeElement)) return;
1250          var allPageElements = document.querySelectorAll('button:not([tabindex="-1"]), a:not([tabindex="-1"]), input:not([tabindex="-1"]), select:not([tabindex="-1"]), textarea:not([tabindex="-1"]), [tabindex]:not([tabindex="-1"])');
1251          var visibleElements = Array.prototype.filter.call(allPageElements, function(el) {
1252              return el.offsetWidth > 0 && el.offsetHeight > 0;
1253          });
1254          var currentPageIndex = visibleElements.indexOf(activeElement);
1255          if (currentPageIndex > 0) {
1256              var prevElement = visibleElements[currentPageIndex - 1];
1257              if (footerMenu.contains(prevElement)) {
1258                  var allMainItems = document.querySelectorAll('.footerSitemapSpHedging__item');
1259                  var lastMainButton = null;
1260                  
1261                  for (var i = allMainItems.length - 1; i >= 0; i--) {
1262                      var button = allMainItems[i].querySelector('.footerSitemapSpHedging__text');
1263                      if (button && button.tagName === 'BUTTON' && button.offsetWidth > 0 && button.offsetHeight > 0) {
1264                          lastMainButton = button;
1265                          break;
1266                      }
1267                  }
1268                  
1269                  if (lastMainButton) {
1270                      e.preventDefault();
1271                      lastMainButton.focus();
1272                      return;
1273                  }
1274              }
1275          }
1276      });
1277
1278      function updateTabIndexes() {
1279          var allAccordionLists = footerMenu.querySelectorAll('.footerSpAccordionMenu__list');
1280          
1281          Array.prototype.forEach.call(allAccordionLists, function(list) {
1282              var isOpen = list.classList.contains('footerSpAccordionMenu__list--isOpen');
1283              var focusableElements = list.querySelectorAll('button, a, input, select, textarea, [tabindex]');
1284              
1285              Array.prototype.forEach.call(focusableElements, function(el) {
1286                  if (isOpen) {
1287                      if (el.hasAttribute('data-original-tabindex')) {
1288                          var originalValue = el.getAttribute('data-original-tabindex');
1289                          if (originalValue === 'null') {
1290                              el.removeAttribute('tabindex');
1291                          } else {
1292                              el.setAttribute('tabindex', originalValue);
1293                          }
1294                      }
1295                  } else {
1296                      if (!el.hasAttribute('data-original-tabindex')) {
1297                          var originalTabindex = el.getAttribute('tabindex');
1298                          el.setAttribute('data-original-tabindex', originalTabindex === null ? 'null' : originalTabindex);
1299                      }
1300                      el.setAttribute('tabindex', '-1');
1301                  }
1302              });
1303          });
1304      }
1305
1306      updateTabIndexes();
1307
1308      var accordionButtons = footerMenu.querySelectorAll('.js-footerSpAccordion');
1309      Array.prototype.forEach.call(accordionButtons, function(button) {
1310          button.addEventListener('click', function() {
1311              setTimeout(updateTabIndexes, 50);
1312          });
1313      });
1314
1315      var categoryButtons = footerMenu.querySelectorAll('.footerSitemapSpHedging__text');
1316      Array.prototype.forEach.call(categoryButtons, function(button) {
1317          button.addEventListener('click', function() {
1318              setTimeout(updateTabIndexes, 50);
1319          });
1320      });
1321
1322      function isReallyVisible(el) {
1323          if (el.offsetWidth === 0 && el.offsetHeight === 0) {
1324              return false;
1325          }
1326          
1327          var current = el;
1328          while (current && current !== footerMenu) {
1329              if (current.classList && current.classList.contains('footerSpAccordionMenu__list')) {
1330                  if (!current.classList.contains('footerSpAccordionMenu__list--isOpen')) {
1331                      return false;
1332                  }
1333              }
1334              
1335              var style = window.getComputedStyle(current);
1336              if (style.display === 'none' || style.visibility === 'hidden') {
1337                  return false;
1338              }
1339              
1340              if (style.maxHeight === '0px' && style.overflow === 'hidden') {
1341                  return false;
1342              }
1343              
1344              current = current.parentElement;
1345          }
1346          return true;
1347      }
1348
1349      footerMenu.addEventListener('keydown', function(e) {
1350          if (e.key !== 'Tab') return;
1351          if (!isSPMode()) return;
1352          var activeElement = document.activeElement;
1353          
1354          if (!footerMenu.contains(activeElement)) {
1355              return;
1356          }
1357          
1358          var parentMainMenuItem = activeElement.closest('.footerSitemapSpHedging__item');
1359          if (parentMainMenuItem && parentMainMenuItem.classList.contains('footerSitemapSpHedging__item--hasLink')) {
1360              return;
1361          }
1362          
1363          var allFocusableElements = getAllFocusableElements();
1364          var currentIndex = allFocusableElements.indexOf(activeElement);
1365          
1366          if (currentIndex === -1) return;
1367
1368          var nextElement = null;
1369          
1370          if (e.shiftKey) {
1371              nextElement = getPreviousLogicalElement(activeElement, allFocusableElements, currentIndex);
1372              if (nextElement === 'EXIT_NAVIGATION') {
1373                  return;
1374              }
1375          } else {
1376              nextElement = getNextLogicalElement(activeElement, allFocusableElements, currentIndex);
1377              
1378              if (nextElement === null && 
1379                  activeElement.classList.contains('footerSitemapSpHedging__text') && 
1380                  activeElement.tagName === 'BUTTON') {
1381                  
1382                  var parentMainItem = activeElement.closest('.footerSitemapSpHedging__item');
1383                  var allMainItems = document.querySelectorAll('.footerSitemapSpHedging__item');
1384                  var currentMainIndex = Array.prototype.indexOf.call(allMainItems, parentMainItem);
1385                  
1386                  var isLastMainButton = true;
1387                  for (var i = currentMainIndex + 1; i < allMainItems.length; i++) {
1388                      if (allMainItems[i].querySelector('.footerSitemapSpHedging__text')) {
1389                          isLastMainButton = false;
1390                          break;
1391                      }
1392                  }
1393                  
1394                  if (isLastMainButton) {
1395                      var allPageElements = document.querySelectorAll('button, a, input, select, textarea, [tabindex]:not([tabindex="-1"])');
1396                      var footerMenuIndex = -1;
1397                      
1398                      for (var j = 0; j < allPageElements.length; j++) {
1399                          if (footerMenu.contains(allPageElements[j])) {
1400                              footerMenuIndex = j;
1401                          }
1402                      }
1403                      
1404                      if (footerMenuIndex !== -1) {
1405                          for (var k = footerMenuIndex + 1; k < allPageElements.length; k++) {
1406                              if (!footerMenu.contains(allPageElements[k]) && 
1407                                  allPageElements[k].offsetWidth > 0 && 
1408                                  allPageElements[k].offsetHeight > 0) {
1409                                  e.preventDefault();
1410                                  allPageElements[k].focus();
1411                                  return;
1412                              }
1413                          }
1414                      }
1415                      
1416                      return;
1417                  }
1418              }
1419          }
1420          
1421          var defaultNext = getDefaultNextElement(activeElement, allFocusableElements, currentIndex, e.shiftKey);
1422          
1423          if (nextElement === null) {
1424              return;
1425          }
1426          
1427          if (nextElement && nextElement !== defaultNext) {
1428              e.preventDefault();
1429              nextElement.focus();
1430          }
1431      });
1432      function getAllFocusableElements() {
1433          var elements = footerMenu.querySelectorAll(
1434              'button:not([tabindex="-1"]), a:not([tabindex="-1"]), input:not([tabindex="-1"]), select:not([tabindex="-1"]), textarea:not([tabindex="-1"]), [tabindex]:not
1434([tabindex="-1"])'
1435          );
1436          return Array.prototype.filter.call(elements, function(el) {
1437              return isReallyVisible(el);
1438          });
1439      }
1440
1441      function getDefaultNextElement(currentElement, allElements, currentIndex, isReverse) {
1442          if (isReverse) {
1443              return currentIndex > 0 ? allElements[currentIndex - 1] : null;
1444          } else {
1445              return currentIndex < allElements.length - 1 ? allElements[currentIndex + 1] : null;
1446          }
1447      }
1448
1449      function getNextLogicalElement(currentElement, allElements, currentIndex) {
1450          if (currentElement.classList && currentElement.classList.contains('footerSitemapSpHedging__text') && currentElement.tagName === 'BUTTON') {
1451              var parentMainItem = currentElement.closest('.footerSitemapSpHedging__item');
1452              var allMainItems = document.querySelectorAll('.footerSitemapSpHedging__item');
1453              var currentMainIndex = Array.prototype.indexOf.call(allMainItems, parentMainItem);
1454              
1455              var allCategories = document.querySelectorAll('.footerSitemap__listItem');
1456              var correspondingCategory = allCategories[currentMainIndex];
1457              
1458              if (correspondingCategory) {
1459                  var categoryItem = correspondingCategory.querySelector('.footerCategory__item');
1460                  if (categoryItem && window.getComputedStyle(categoryItem).display === 'block') {
1461                      var categoryElements = Array.prototype.filter.call(
1462                          categoryItem.querySelectorAll('button:not([tabindex="-1"]), a:not([tabindex="-1"]), input:not([tabindex="-1"]), select:not([tabindex="-1"]), textarea:not([tabindex="-1"]), [tabindex]:not([tabindex="-1"])'),
1463                          function(el) { return isReallyVisible(el); }
1464                      );
1465                      if (categoryElements.length > 0) {
1466                          return categoryElements[0];
1467                      }
1468                  }
1469              }
1470              
1471              var nextMainButton = getNextMainCategoryButton(parentMainItem);
1472              return nextMainButton;
1473          }
1474          
1475          var parentCategory = currentElement.closest('.footerCategory__item');
1476          if (parentCategory && window.getComputedStyle(parentCategory).display === 'block') {
1477              var categoryElements = Array.prototype.filter.call(
1478                  parentCategory.querySelectorAll('button:not([tabindex="-1"]), a:not([tabindex="-1"]), input:not([tabindex="-1"]), select:not([tabindex="-1"]), textarea:not([tabindex="-1"]), [tabindex]:not([tabindex="-1"])'),
1479                  function(el) { return isReallyVisible(el); }
1480              );
1481              var categoryIndex = categoryElements.indexOf(currentElement);
1482              
1483              if (categoryIndex === categoryElements.length - 1) {
1484                  var allCategories = document.querySelectorAll('.footerSitemap__listItem');
1485                  var currentCategoryIndex = Array.prototype.indexOf.call(allCategories, currentElement.closest('.footerSitemap__listItem'));
1486                  var allMainItems = document.querySelectorAll('.footerSitemapSpHedging__item');
1487                  var currentMainItem = allMainItems[currentCategoryIndex];
1488                  
1489                  var nextMainButton = getNextMainCategoryButton(currentMainItem);
1490                  return nextMainButton;
1491              }
1492          }
1493          
1494          return null;
1495      }
1496
1497      function getPreviousLogicalElement(currentElement, allElements, currentIndex) {
1498          // Case 1: We are inside a sub-menu (either a direct link or inside an accordion).
1499          var parentCategoryItem = currentElement.closest('.footerCategory__item');
1500          if (parentCategoryItem && window.getComputedStyle(parentCategoryItem).display === 'block') {
1501              var categoryElements = allElements.filter(function(el) {
1502                  return parentCategoryItem.contains(el) && isReallyVisible(el);
1503              });
1504              var localIndex = categoryElements.indexOf(currentElement);
1505
1506              // If not the first element in the sub-menu, return the previous one.
1507              if (localIndex > 0) {
1508                  return categoryElements[localIndex - 1];
1509              }
1510
1511              // If it IS the first element, we need to move to the main category button.
1512              var allCategories = Array.from(document.querySelectorAll('.footerSitemap__listItem'));
1513              var currentCategoryContainer = currentElement.closest('.footerSitemap__listItem');
1514              var categoryIndex = allCategories.indexOf(currentCategoryContainer);
1515              
1516              if (categoryIndex !== -1) {
1517                  var allMainItems = document.querySelectorAll('.footerSitemapSpHedging__item');
1518                  var mainItem = allMainItems[categoryIndex];
1519                  if(mainItem) {
1520                    var mainButton = mainItem.querySelector('.footerSitemapSpHedging__text');
1521                    if (mainButton) {
1522                        return mainButton;
1523                    }
1524                  }
1525              }
1526          }
1527
1528          // Case 2: We are on a main category button.
1529          var parentMainItem = currentElement.closest('.footerSitemapSpHedging__item');
1530          if (parentMainItem) {
1531              // Find the previous main category's last element if it's open
1532              var prevCategoryLastElement = getPreviousCategoryLastElement(parentMainItem);
1533              if (prevCategoryLastElement) {
1534                  return prevCategoryLastElement;
1535              }
1536
1537              // Otherwise, find the previous main category button.
1538              var prevMainButton = getPreviousMainCategoryButton(parentMainItem);
1539              if (prevMainButton) {
1540                  return prevMainButton;
1541              }
1542          }
1543          
1544          // If we are at the first element of the footer menu, let the browser handle it.
1545          if (currentIndex === 0) {
1546            return null;
1547          }
1548
1549          // Default case: return the previous element in the DOM order within the menu.
1550          var defaultPrev = getDefaultNextElement(currentElement, allElements, currentIndex, true);
1551          if (defaultPrev) {
1552            return defaultPrev;
1553          }
1554
1555          return null; // Exit menu
1556      }
1557
1558      function getNextMainCategoryButton(currentMainItem) {
1559          var allMainItems = document.querySelectorAll('.footerSitemapSpHedging__item');
1560          var currentIndex = Array.prototype.indexOf.call(allMainItems, currentMainItem);
1561          
1562          for (var i = currentIndex + 1; i < allMainItems.length; i++) {
1563              var nextItem = allMainItems[i];
1564              var nextButton = nextItem.querySelector('.footerSitemapSpHedging__text');
1565              if (nextButton) {
1566                  return nextButton;
1567              }
1568          }
1569          
1570          return null;
1571      }
1572
1573      function getPreviousMainCategoryButton(currentMainItem) {
1574          var allMainItems = document.querySelectorAll('.footerSitemapSpHedging__item');
1575          var currentIndex = Array.prototype.indexOf.call(allMainItems, currentMainItem);
1576          
1577          for (var i = currentIndex - 1; i >= 0; i--) {
1578              var prevItem = allMainItems[i];
1579              var prevButton = prevItem.querySelector('.footerSitemapSpHedging__text');
1580              if (prevButton) {
1581                  return prevButton;
1582              }
1583          }
1584          
1585          return null;
1586      }
1587
1588      function getPreviousCategoryLastElement(currentMainItem) {
1589          var allMainItems = document.querySelectorAll('.footerSitemapSpHedging__item');
1590          var currentIndex = Array.prototype.indexOf.call(allMainItems, currentMainItem);
1591          
1592          for (var i = currentIndex - 1; i >= 0; i--) {
1593              var prevItem = allMainItems[i];
1594              if (!prevItem.classList.contains('footerSitemapSpHedging__item--hasLink')) {
1595                  var allCategories = document.querySelectorAll('.footerSitemap__listItem');
1596                  var prevCategory = allCategories[i];
1597                  if (prevCategory) {
1598                      var categoryItem = prevCategory.querySelector('.footerCategory__item');
1599                      if (categoryItem && window.getComputedStyle(categoryItem).display === 'block') {
1600                          var prevCategoryElements = Array.prototype.filter.call(
1601                              categoryItem.querySelectorAll('button:not([tabindex="-1"]), a:not([tabindex="-1"]), input:not([tabindex="-1"]), select:not([tabindex="-1"]), textarea:not([tabindex="-1"]), [tabindex]:not
1601([tabindex="-1"])'),
1602                              function(el) { return isReallyVisible(el); }
1603                          );
1604                          if (prevCategoryElements.length > 0) {
1605                              return prevCategoryElements[prevCategoryElements.length - 1];
1606                          }
1607                      }
1608                  }
1609                  break;
1610              }
1611          }
1612          
1613          return null;
1614      }
1615  }
1616
1617  function autoCloseOnFocusOut() {
1618      var hamburgerMenu = document.getElementById('js-openMenu');
1619      var trigger = document.querySelector('.js-hamburgerOpen');
1620      
1621      if (!hamburgerMenu || !trigger) return;
1622      var isScrolling = false;
1623      hamburgerMenu.addEventListener('scroll', function() {
1624          isScrolling = true;
1625          clearTimeout(hamburgerMenu.scrollTimeout);
1626          hamburgerMenu.scrollTimeout = setTimeout(function() {
1627              isScrolling = false;
1628          }, 150);
1629      });
1630      document.addEventListener('focusout', function(e) {
1631          if (!hamburgerMenu.classList.contains('hamburgerMenu--isActive')) {
1632              return;
1633          }
1634          if (isScrolling) {
1635              return;
1636          }
1637          setTimeout(function() {
1638              var newFocusedElement = document.activeElement;
1639              var isInsideMenu = hamburgerMenu.contains(newFocusedElement) || 
1640                                newFocusedElement === trigger;
1641              if (!isInsideMenu) {
1642                  var overlay = document.getElementById('js-overlay');
1643                  if (overlay) {
1644                      overlay.click();
1645                  }
1646              }
1647          }, 10);
1648      });
1649  }
1650
1651  function headerFocusScroll() {
1652    var header = document.getElementById('globalHeader');
1653    if (!header) return;
1654    
1655    var headerFocusableElements = header.querySelectorAll('a, button');
1656    
1657    Array.prototype.forEach.call(headerFocusableElements, function(element) {
1658      element.addEventListener('focus', function() {
1659        // ページが下部にスクロールしている場合のみトップへ
1660        if (window.pageYOffset > 100) {
1661          window.scrollTo({
1662            top: 0,
1663            behavior: 'smooth'
1664          });
1665        }
1666      });
1667    });
1668  }
1669
1670  // アクセシビリティ修正: 非表示のメガメニューをTab順序から除外
1671  function fixMegaMenuTabOrder() {
1672    // すべてのheaderNavを対象にする
1673    var headerNavs = document.querySelectorAll('.headerNav');
1674    
1675    // メガメニュー内の要素を確実に設定する関数
1676    function updateMegaMenuTabIndex() {
1677      Array.prototype.forEach.call(headerNavs, function(nav) {
1678        var navItems = nav.querySelectorAll('.headerNav__listItem');
1679        
1680        Array.prototype.forEach.call(navItems, function(navItem) {
1681          var titleButton = navItem.querySelector('.headerNav__title');
1682          
1683          // トップレベルのボタンは常にtabindex="0"
1684          if (titleButton && titleButton.tagName === 'BUTTON') {
1685            titleButton.setAttribute('tabindex', '0');
1686          }
1687          
1688          // メガメニュー内のリンクの状態を確認
1689          var megaMenu = navItem.querySelector('.headerMegaNav');
1690          if (megaMenu) {
1691            var isOpen = navItem.classList.contains('headerNav__listItem--isOpen');
1692            var megaFocusable = megaMenu.querySelectorAll('a, button, input, select, textarea, [tabindex]');
1693            
1694            // メニューが閉じている場合は常にtabindex="-1"
1695            if (!isOpen) {
1696              Array.prototype.forEach.call(megaFocusable, function(el) {
1697                el.setAttribute('tabindex', '-1');
1698              });
1699            } else {
1700              // メニューが開いている場合はtabindex="0"
1701              Array.prototype.forEach.call(megaFocusable, function(el) {
1702                if (el.getAttribute('tabindex') === '-1') {
1703                  el.setAttribute('tabindex', '0');
1704                }
1705              });
1706            }
1707          }
1708        });
1709      });
1710    }
1711    
1712    // 初期化時に実行
1713    updateMegaMenuTabIndex();
1714    
1715    // MutationObserverでクラス変更を監視
1716    var observer = new MutationObserver(function(mutations) {
1717      mutations.forEach(function(mutation) {
1718        if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
1719          updateMegaMenuTabIndex();
1720        }
1721      });
1722    });
1723    
1724    // すべてのnavItemを監視
1725    Array.prototype.forEach.call(headerNavs, function(nav) {
1726      var navItems = nav.querySelectorAll('.headerNav__listItem');
1727      Array.prototype.forEach.call(navItems, function(navItem) {
1728        observer.observe(navItem, {
1729          attributes: true,
1730          attributeFilter: ['class']
1731        });
1732      });
1733    });
1734    
1735    // ホバー時にメガメニュー内の要素をフォーカス可能にする
1736    Array.prototype.forEach.call(headerNavs, function(nav) {
1737      var navItems = nav.querySelectorAll('.headerNav__listItem');
1738      
1739      Array.prototype.forEach.call(navItems, function(navItem) {
1740        navItem.addEventListener('mouseenter', function() {
1741          var megaMenu = this.querySelector('.headerMegaNav');
1742          if (megaMenu) {
1743            var megaFocusable = megaMenu.querySelectorAll('a, button');
1744            Array.prototype.forEach.call(megaFocusable, function(el) {
1745              el.setAttribute('tabindex', '0');
1746            });
1747          }
1748        });
1749        
1750        navItem.addEventListener('mouseleave', function() {
1751          // メニューが開いている場合は閉じない
1752          if (!navItem.classList.contains('headerNav__listItem--isOpen')) {
1753            var megaMenu = this.querySelector('.headerMegaNav');
1754            if (megaMenu) {
1755              var megaFocusable = megaMenu.querySelectorAll('a, button');
1756              Array.prototype.forEach.call(megaFocusable, function(el) {
1757                el.setAttribute('tabindex', '-1');
1758              });
1759            }
1760          }
1761        });
1762      });
1763    });
1764    
1765  }
1766  
1767  // アクセシビリティ修正: ページ下部から戻ってきたときロゴに誘導
1768  function fixPageTopTabOrder() {
1769    var pageTopButton = document.getElementById('js-targetTop');
1770    if (!pageTopButton) return;
1771    
1772    var lastBlurTime = 0;
1773    var hasMovedToLogo = false; // ロゴへの移動が完了したかフラグ
1774    var header = document.getElementById('js-header');
1775    
1776    // デバッグ用にwindowオブジェクトに公開
1777    window.debugPageTopState = function() {
1778      return {
1779        lastBlurTime: lastBlurTime,
1780        hasMovedToLogo: hasMovedToLogo,
1781        timeSinceBlur: Date.now() - lastBlurTime
1782      };
1783    };
1784    
1785    // ページトップボタンからフォーカスが離れた
1786    pageTopButton.addEventListener('blur', function() {
1787      lastBlurTime = Date.now();
1788      hasMovedToLogo = false; // リセット
1789      
1790      // ヘッダーを表示状態にする
1791      if (header) {
1792        header.classList.remove('header--unpinned');
1793      }
1794    });
1795    
1796    // ページ内の要素にフォーカスが戻ってきた
1797    document.addEventListener('focus', function(e) {
1798      var timeSinceBlur = Date.now() - lastBlurTime;
1799      
1800      // ページトップボタンからblurして3秒以内の場合
1801      if (lastBlurTime > 0 && timeSinceBlur < 3000 && !hasMovedToLogo) {
1802        var globalHeader = document.getElementById('globalHeader');
1803        
1804        // ヘッダー内の要素にフォーカスした場合
1805        if (globalHeader && globalHeader.contains(e.target)) {
1806          var headerLogo = document.querySelector('h1 a');
1807          
1808          // ロゴ以外の要素にフォーカスした場合
1809          if (headerLogo && e.target !== headerLogo) {
1810            hasMovedToLogo = true; // フラグを立てる
1811            
1812            // ヘッダーを表示
1813            if (header) {
1814              header.classList.remove('header--unpinned');
1815            }
1816            
1817            // ページトップにスクロール
1818            window.scrollTo({
1819              top: 0,
1820              behavior: 'instant'
1821            });
1822            
1823            // tabindex属性を操作せずに直接フォーカス
1824            setTimeout(function() {
1825              headerLogo.focus();
1826            }, 100);
1827          } else if (e.target === headerLogo) {
1828            // ロゴに直接フォーカスした場合もフラグを立てる
1829            hasMovedToLogo = true;
1830          }
1831        }
1832      }
1833    }, true);
1834  }
1835
1836  // アクセシビリティ修正: relatedSectionからメガメニュー
1837  function fixRelatedSectionShiftTab() {
1838    // 複数のセレクタで relatedSection を探す
1839    var relatedSection = document.querySelector('.relatedContent, .related, section.relatedContent, .relatedTiles, .featureSection');
1840    if (!relatedSection) {
1841      return;
1842    }
1843    
1844    // relatedSection内のすべてのフォーカス可能要素
1845    var relatedFocusable = document.querySelectorAll('.relatedTiles__head, .relatedList__text, .featureContet, .buttonLink__text');
1846    
1847    // 最初のフォーカス可能要素を取得
1848    function getFirstFocusable() {
1849      var visible = Array.prototype.filter.call(relatedFocusable, function(el) {
1850        var rect = el.getBoundingClientRect();
1851        var style = window.getComputedStyle(el);
1852        return rect.width > 0 && rect.height > 0 && 
1853              style.display !== 'none' && 
1854              style.visibility !== 'hidden' &&
1855              el.getAttribute('tabindex') !== '-1';
1856      });
1857      return visible.length > 0 ? visible[0] : null;
1858    }
1859    
1860    // ヘッダー内のメガメニューボタンの最後を取得(ニュースルームなど)
1861    function getLastMegaMenuButton() {
1862      var header = document.getElementById('globalHeader');
1863      if (!header) return null;
1864      
1865      // メガメニューボタン(.headerNav__title)を取得
1866      var megaMenuButtons = header.querySelectorAll('.headerNav__title');
1867      var validButtons = Array.prototype.filter.call(megaMenuButtons, function(btn) {
1868        var rect = btn.getBoundingClientRect();
1869        var style = window.getComputedStyle(btn);
1870        // 幅と高さがあればOK (visibility: hiddenでも含める)
1871        return rect.width > 0 && rect.height > 0 && style.display !== 'none';
1872      });
1873      
1874      // 最後のメガメニューボタンを返す
1875      return validButtons.length > 0 ? validButtons[validButtons.length - 1] : null;
1876    }
1877    
1878    // メガメニューボタンを一時的にフォーカス可能にする
1879    function makeButtonFocusable(button) {
1880      if (!button) return;
1881      
1882      // 親のheaderNavを取得
1883      var headerNav = button.closest('.headerNav');
1884      if (!headerNav) {
1885        button.focus();
1886        return;
1887      }
1888      
1889      // headerNavを表示状態に設定
1890      headerNav.style.visibility = 'visible';
1891      headerNav.style.pointerEvents = 'auto';
1892      
1893      // ボタンにフォーカス
1894      button.focus();
1895     
1896      // フォーカスが外れたら元に戻す
1897      button.addEventListener('blur', function hideOnBlur() {
1898        setTimeout(function() {
1899          // フォーカスがheaderNav内にない場合のみ非表示に戻す
1900          var focusedElement = document.activeElement;
1901          if (!headerNav.contains(focusedElement)) {
1902            headerNav.style.visibility = '';
1903            headerNav.style.pointerEvents = '';
1904          }
1905        }, 50);
1906        
1907        // イベントリスナーを削除(一度だけ実行)
1908        button.removeEventListener('blur', hideOnBlur);
1909      });
1910    }
1911    
1912    // keydownイベントを監視
1913    document.addEventListener('keydown', function(e) {
1914      if (e.key === 'Tab' && e.shiftKey) {
1915        var currentElement = document.activeElement;
1916        var firstFocusable = getFirstFocusable();
1917        
1918        // relatedSection内の最初の要素にフォーカスがある場合
1919        if (currentElement === firstFocusable) {
1920          var targetElement = getLastMegaMenuButton();
1921          
1922          if (targetElement) {
1923            e.preventDefault();
1924            makeButtonFocusable(targetElement);
1925          }
1926        }
1927      }
1928    });
1929  }
1930
1931  // 実行
1932  headerPosition();
1933  pageTopBtn();
1934  headerScrollFixed();
1935  footerScrollAddClass();
1936  hamburgerClickIcon();
1937  hamburgerShowMenu();
1938  hamburgerAccordion();
1939  dropdownShowMenu();
1940  footerSpShowMenu();
1941  footerAccordion();
1942  headerUrlRelated();
1943  HeaderPadTop();
1944  customTabNavigation();
1945  autoCloseOnFocusOut();
1946  headerFocusScroll();
1947  footerCustomTabNavigation();
1948  fixMegaMenuTabOrder();
1949  fixPageTopTabOrder();
1950  fixRelatedSectionShiftTab();
1951});

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.