//===============================================================
// メニュー制御用の関数とイベント設定（※バージョン2026-4｜オーバーレイ対応版）
//===============================================================
$(function(){
  //-------------------------------------------------
  // 変数の宣言
  //-------------------------------------------------
  const $menubar = $('#menubar');
  const $menubarHdr = $('#menubar_hdr');
  const $overlay = $('#menubar-overlay');

  // ▼フレームごとの設定は frame.json から注入される（window.CMS_FRAME_OPTS）
  //   menu_breakpoint        → breakPoint（既定 900）
  //   menu_hide_when_hidden  → HIDE_MENUBAR_IF_HDR_HIDDEN（既定 false）
  const __opts = (window.CMS_FRAME_OPTS || {});
  const breakPoint = __opts.breakPoint || 900;
  const HIDE_MENUBAR_IF_HDR_HIDDEN = !!__opts.hideMenubar;
  //   menu_keep_hamburger    → KEEP_HAMBURGER（既定 false）。PC幅でもハンバーガーを隠さない（PC横メニューと併存する常時ハンバーガー型）
  const KEEP_HAMBURGER = !!__opts.keepHamburger;

  // タッチデバイスかどうかの判定
  const isTouchDevice = ('ontouchstart' in window) ||
                       (navigator.maxTouchPoints > 0) ||
                       (navigator.msMaxTouchPoints > 0);

  //-------------------------------------------------
  // debounce(処理の呼び出し頻度を抑制) 関数
  //-------------------------------------------------
  function debounce(fn, wait) {
    let timerId;
    return function(...args) {
      if (timerId) {
        clearTimeout(timerId);
      }
      timerId = setTimeout(() => {
        fn.apply(this, args);
      }, wait);
    };
  }

  //-------------------------------------------------
  // メニューを閉じる共通関数
  // ※ハンバーガー解除・メニュー非表示・オーバーレイ非表示・
  //   noscroll解除・ドロップダウン閉じ を一括で行う
  //-------------------------------------------------
  function closeMenu() {
    $menubarHdr.removeClass('ham');
    $menubar.hide();
    $overlay.hide();
    $menubar.find('.ddmenu_parent ul').hide();
    $('body').removeClass('noscroll');
  }

  //-------------------------------------------------
  // メニューを開く共通関数
  //-------------------------------------------------
  function openMenu() {
    $menubarHdr.addClass('ham');
    $menubar.show();
    $overlay.show();
    $menubar.find('.ddmenu_parent ul').hide();
    if ($(window).width() < breakPoint) {
      $('body').addClass('noscroll');
    }
  }

  //-------------------------------------------------
  // ドロップダウン用の初期化関数
  //-------------------------------------------------
  function initDropdown($menu, isTouch) {
    // ドロップダウンメニューが存在するliにクラス追加
    $menu.find('ul li').each(function() {
      if ($(this).find('ul').length) {
        $(this).addClass('ddmenu_parent');
        $(this).children('a').addClass('ddmenu');
      }
    });

    // 子メニューは初期状態で閉じる（ちらつき防止）
    $menu.find('.ddmenu_parent ul').hide();

    // 万一の再初期化に備えてイベントを解除（多重バインド防止）
    $menu.find('.ddmenu').off('click.ddmenu');
    $menu.find('.ddmenu_parent').off('mouseenter.ddmenu mouseleave.ddmenu');

    //---------------------------------------------
    // ▼ブレイクポイント未満（開閉メニュー時）は
    //   PCでも「クリックで開閉」に統一（hover無効）
    //---------------------------------------------
    $menu.find('.ddmenu').on('click.ddmenu', function(e) {
      if (!isTouch && $(window).width() >= breakPoint) return; // PC大画面はhover運用

      e.preventDefault();
      e.stopPropagation();

      const $dropdownMenu = $(this).siblings('ul');
      if ($dropdownMenu.is(':visible')) {
        $dropdownMenu.hide();
      } else {
        $menu.find('.ddmenu_parent ul').hide(); // 他を閉じる
        $dropdownMenu.show();
      }
    });

    //---------------------------------------------
    // ▼PC大画面（breakPoint以上）のみ hover で開閉
    //---------------------------------------------
    $menu.find('.ddmenu_parent').on('mouseenter.ddmenu', function() {
      if (isTouch) return;
      if ($(window).width() < breakPoint) return; // 開閉メニュー時はhover無効
      $(this).children('ul').show();
    }).on('mouseleave.ddmenu', function() {
      if (isTouch) return;
      if ($(window).width() < breakPoint) return; // 開閉メニュー時はhover無効
      $(this).children('ul').hide();
    });
  }

  //-------------------------------------------------
  // ハンバーガーメニューでの開閉制御関数
  //-------------------------------------------------
  function initHamburger($hamburger) {
    let isAnimating = false;	// 連打防止用フラグ
    $hamburger.on('click', function() {
      if (isAnimating) return;	// アニメーション中は何もしない
      isAnimating = true;

      if ($(this).hasClass('ham')) {
        // 開いている → 閉じる
        closeMenu();
      } else {
        // 閉じている → 開く
        openMenu();
      }

      // メニューのCSSアニメーション(0.2s)完了後にロック解除
      setTimeout(function() { isAnimating = false; }, 300);
    });
  }

  //-------------------------------------------------
  // オーバーレイクリックでメニューを閉じる
  //-------------------------------------------------
  $overlay.on('click', function() {
    closeMenu();
  });

  //-------------------------------------------------
  // レスポンシブ時の表示制御 (リサイズ時)
  //-------------------------------------------------
  const handleResize = debounce(function() {
    const windowWidth = $(window).width();

    // bodyクラスの制御 (small-screen / large-screen)
    if (windowWidth < breakPoint) {
      $('body').removeClass('large-screen').addClass('small-screen');
    } else {
      $('body').removeClass('small-screen').addClass('large-screen');
      // PC表示になったら、ハンバーガー解除 + メニュー・オーバーレイを閉じる
      $menubarHdr.removeClass('ham');
      $menubar.find('.ddmenu_parent ul').hide();
      $overlay.hide();
      $('body').removeClass('noscroll');

      // ▼ #menubar / ハンバーガーの表示切替
      if (KEEP_HAMBURGER) {
        // PC幅でもハンバーガーを出す（常時ハンバーガー型＝PC横メニューと併存）。ドロワーは閉じて待機。
        $menubarHdr.show();
        $menubar.hide();
      } else if (HIDE_MENUBAR_IF_HDR_HIDDEN) {
        $menubarHdr.hide();
        $menubar.hide();
      } else {
        $menubarHdr.hide();
        $menubar.show();
      }
    }

    // スマホ(ブレイクポイント未満)のとき
    if (windowWidth < breakPoint) {
      $menubarHdr.show();
      if (!$menubarHdr.hasClass('ham')) {
        $menubar.hide();
        $overlay.hide();
        $('body').removeClass('noscroll');
      }
    }
  }, 200);

  //-------------------------------------------------
  // 初期化
  //-------------------------------------------------
  // 1) ドロップダウン初期化 (#menubar)
  initDropdown($menubar, isTouchDevice);

  // 2) ハンバーガーメニュー初期化 (#menubar_hdr)
  initHamburger($menubarHdr);

  // 3) レスポンシブ表示の初期処理 & リサイズイベント
  handleResize();
  $(window).on('resize', handleResize);

  //-------------------------------------------------
  // アンカーリンク(#)のクリックイベント
  //-------------------------------------------------
  $menubar.find('a[href*="#"]').on('click', function() {
    // ドロップダウンメニューの親(a.ddmenu)のリンクはメニューを閉じない
    if ($(this).hasClass('ddmenu')) return;

    // スマホ表示＆ハンバーガーが開いている状態なら閉じる
    if ($menubarHdr.is(':visible') && $menubarHdr.hasClass('ham')) {
      closeMenu();
    }
  });

  //-------------------------------------------------
  // 別メニュー（header nav 等）へのドロップダウン適用
  //   frame.json の "menu_dropdowns": ["header nav", ...] で指定する。
  //   #menubar 以外のメニューにドロップダウン挙動を付けたい時に使う。
  //-------------------------------------------------
  var extraDropdowns = (__opts.dropdowns || []);
  if (typeof extraDropdowns === 'string') extraDropdowns = [extraDropdowns];
  $.each(extraDropdowns, function (i, sel) {
    var $m = $(sel);
    if ($m.length) initDropdown($m, isTouchDevice);
  });
});


//===============================================================
// スムーススクロール（※バージョン2025-3）
// 通常タイプ / fixedヘッダー対応 切り替え版
//===============================================================
$(function() {

    //===========================================================
    // 設定
    //===========================================================
    // 'normal' ＝ 通常タイプ（固定ヘッダーなし）
    // 'fixed' ＝ fixedヘッダー対応
    var scrollType = 'normal';

    // fixedヘッダー時に位置計算に使う要素（※fixed版を使う際は必ずチェック。画面上部に貼り付くブロックを指定する。）
    // 例：'header' / '#header' / '.site-header'
    var fixedHeaderSelector = '#menubar';

    // ページ上部へ戻るボタンのセレクター
    var topButton = $('.pagetop');

    // ページトップボタン表示用のクラス名
    var scrollShow = 'pagetop-show';


    //===========================================================
    // fixedヘッダーぶんの補正値を取得
    //===========================================================
    function getHeaderOffset() {

        // 通常タイプなら補正なし
        if(scrollType !== 'fixed') {
            return 0;
        }

        // 指定要素を取得
        var $header = $(fixedHeaderSelector);

        // 要素がなければ補正なし
        if(!$header.length) {
            return 0;
        }

        // 画面上でのヘッダー下端位置を取得
        // 高さ + 上部の余白(topやmarginで見た目上ずれている分)も含めて見られる
        var rect = $header.get(0).getBoundingClientRect();

        // 念のためマイナスは0にする
        return Math.max(0, rect.bottom);
    }


    //===========================================================
    // スムーススクロール本体
    //===========================================================
    function smoothScroll(target) {

        var scrollTo = 0;

        // '#' の場合はページ最上部へ
        if(target === '#') {
            scrollTo = 0;

        } else {

            // スクロール先の要素を取得
            var $target = $(target);

            // 対象が存在しない場合は何もしない
            if(!$target.length) {
                return;
            }

            // 通常位置から、fixedヘッダー分を引く
            scrollTo = $target.offset().top - getHeaderOffset();

            // 0未満にならないように補正
            if(scrollTo < 0) {
                scrollTo = 0;
            }
        }

        // アニメーションでスムーススクロール
        $('html, body').animate({scrollTop: scrollTo}, 500);
    }

	//===========================================================
	// ページ内リンク / ページトップボタン
	//===========================================================
	$('a[href*="#"], .pagetop').click(function(e) {

		// ページトップボタン → 最上部へ
		if($(this).hasClass('pagetop')) {
			e.preventDefault();
			smoothScroll('#');
			return;
		}

		// このリンクのハッシュ（例 "#contact"）。<a>要素がURLを自動解決してくれる。
		var hash = this.hash;

		// href="#"（その場に止める）／ハッシュ無しの通常リンクは触らない
		if(!hash || hash === '#') {
			if(($(this).attr('href') || '') === '#') e.preventDefault();
			return;
		}

		// リンク先が「今いるページ」のときだけスムーススクロール。
		//   "#id" でも "/?p=ページ名#id" でも、現在ページ＋ハッシュなら同一ページ扱い。
		//   別ページ宛てはそのまま遷移させ、読み込み後に下の「ハッシュ付きURLで開いた時」がスクロールする。
		// ★host（ドメイン+ポート）の比較は必須。これが無いと、外部サイトへのハッシュ付きリンク
		//   （例 https://よそのサイト/#access）が、自サイトのトップと pathname/search が
		//   たまたま一致するだけで「同一ページ内リンク」と誤判定され、preventDefault で遷移できなくなる。
		if(this.host !== location.host || this.pathname !== location.pathname || this.search !== location.search) return;

		if($(hash).length) {
			e.preventDefault();
			smoothScroll(hash);
		}
	});

    //===========================================================
    // ページトップボタンの表示切り替え
    //===========================================================
    $(topButton).hide();

    $(window).scroll(function() {
        if($(this).scrollTop() >= 300) {
            $(topButton).fadeIn().addClass(scrollShow);
        } else {
            $(topButton).fadeOut().removeClass(scrollShow);
        }
    });


    //===========================================================
    // ハッシュ付きURLで開いた時
    //===========================================================
    if(window.location.hash) {
        $('html, body').scrollTop(0);

        setTimeout(function() {
            smoothScroll(window.location.hash);
        }, 500);
    }

});


//===============================================================
// メイン画像の動画：画面幅に応じて <source media> をリアルタイム切替
//   ・<video> に media 付き <source> が2つ以上ある時だけ動作
//   ・media の中身（max-width:800px に限らず min-width/orientation 等）を
//     そのまま判定に使う＝フレーム側で自由に指定できる
//   ・切替時は頭から再生し直す（仕様）。各フレームの js/main.js にある
//     再生/停止制御（IntersectionObserver）と併用してOK
//===============================================================
$(function () {
  'use strict';
  if (!window.matchMedia) return;
  var videos = document.querySelectorAll('video');
  if (!videos.length) return;

  Array.prototype.forEach.call(videos, function (video) {
    var sources = Array.prototype.slice.call(video.querySelectorAll('source[src]'));
    var hasMedia = sources.some(function (s) { return s.getAttribute('media'); });
    // 出し分けが必要な動画（source 2つ以上＋media付きが1つ以上）だけ対象
    if (sources.length < 2 || !hasMedia) return;

    // ブラウザの <source> 選択規則を再現：
    // 先頭から見て「media無し」または「media一致」の最初の src を採用
    function pickSrc() {
      for (var i = 0; i < sources.length; i++) {
        var m = sources[i].getAttribute('media');
        if (!m || window.matchMedia(m).matches) {
          return sources[i].getAttribute('src');
        }
      }
      return null;
    }

    function inView(el) {
      var r = el.getBoundingClientRect();
      var h = window.innerHeight || document.documentElement.clientHeight;
      return r.bottom > 0 && r.top < h;
    }

    function apply() {
      var url = pickSrc();
      if (!url) return;
      var cur = video.currentSrc || video.getAttribute('src') || '';
      if (cur && cur.indexOf(url) !== -1) return; // 既に同じ動画なら何もしない

      var wasPlaying = !video.paused && !video.ended;
      video.setAttribute('src', url); // src属性が付くと <source> より優先される
      video.load();
      if (wasPlaying || inView(video)) {
        var p = video.play();
        if (p && typeof p.catch === 'function') { p.catch(function () {}); }
      }
    }

    // 各 media クエリの変化を監視（幅の増減・向き変更などで再評価）
    sources.forEach(function (s) {
      var m = s.getAttribute('media');
      if (!m) return;
      var mql = window.matchMedia(m);
      if (mql.addEventListener) { mql.addEventListener('change', apply); }
      else if (mql.addListener) { mql.addListener(apply); } // 旧Safari/Edge
    });

    apply(); // 初期適用（通常は現状と同じ＝何も起きない）
  });
});
