/**
 * 飯塚地区消防本部 - animations.js
 * Intersection Observer によるスクロール連動アニメーション制御
 */
(function () {
  'use strict';

  document.addEventListener('DOMContentLoaded', function () {
    initScrollAnimations();
    initHeroAnimation();
  });

  /**
   * Intersection Observer でスクロール連動アニメーションを制御
   * data-animate 属性を持つ要素がビューポートに入ったら is-visible クラスを付与
   * data-delay 属性で表示までの遅延（ms）を指定可能
   */
  function initScrollAnimations() {
    var animateElements = document.querySelectorAll('[data-animate]');

    if (!animateElements.length) return;

    if (!('IntersectionObserver' in window)) {
      animateElements.forEach(function (el) {
        el.classList.add('is-visible');
      });
      return;
    }

    var observer = new IntersectionObserver(
      function (entries) {
        entries.forEach(function (entry) {
          if (entry.isIntersecting) {
            var el = entry.target;
            var delay = parseInt(el.dataset.delay, 10) || 0;

            if (delay > 0) {
              setTimeout(function () {
                el.classList.add('is-visible');
              }, delay);
            } else {
              el.classList.add('is-visible');
            }

            observer.unobserve(el);
          }
        });
      },
      {
        threshold: 0.1,
        rootMargin: '0px 0px -40px 0px'
      }
    );

    animateElements.forEach(function (el) {
      observer.observe(el);
    });
  }

  /**
   * ヒーローセクションのページ読み込みアニメーション
   * .ifd-hero に hero-animate クラスを付与して CSS アニメーションを発火
   */
  function initHeroAnimation() {
    var hero = document.querySelector('.ifd-hero');
    if (!hero) return;

    requestAnimationFrame(function () {
      hero.classList.add('hero-animate');
    });
  }
})();

/**
 * 飯塚地区消防本部 - navigation.js
 * ヘッダーのスクロール変化 / スムーズスクロール
 */
(function () {
  'use strict';

  document.addEventListener('DOMContentLoaded', function () {
    initHeaderScroll();
    initSmoothScroll();
    initHamburgerMenu();
  });

  /**
   * スクロール時にヘッダーに is-scrolled クラスを付与
   * glassmorphism 効果 + box-shadow を適用
   */
  function initHeaderScroll() {
    var header = document.querySelector('.ifd-header') || document.querySelector('.v3-header');
    if (!header) return;

    var scrollThreshold = 60;
    var ticking = false;

    function updateHeader() {
      if (window.scrollY > scrollThreshold) {
        header.classList.add('is-scrolled');
      } else {
        header.classList.remove('is-scrolled');
      }
      ticking = false;
    }

    window.addEventListener('scroll', function () {
      if (!ticking) {
        requestAnimationFrame(updateHeader);
        ticking = true;
      }
    }, { passive: true });

    updateHeader();
  }

  /**
   * ハンバーガーメニューの開閉（モバイル）
   */
  function initHamburgerMenu() {
    var hamburger = document.querySelector('.ifd-hamburger') || document.querySelector('.v3-hamburger');
    var header = document.querySelector('.ifd-header') || document.querySelector('.v3-header');
    if (!hamburger || !header) return;

    var navSelector = header.classList.contains('v3-header') ? '.v3-header-nav a' : '.ifd-global-nav a';

    hamburger.addEventListener('click', function () {
      var isOpen = header.classList.toggle('is-menu-open');
      hamburger.setAttribute('aria-expanded', isOpen ? 'true' : 'false');
      hamburger.setAttribute('aria-label', isOpen ? 'メニューを閉じる' : 'メニューを開く');
    });

    var navLinks = header.querySelectorAll(navSelector);
    navLinks.forEach(function (link) {
      link.addEventListener('click', function () {
        header.classList.remove('is-menu-open');
        hamburger.setAttribute('aria-expanded', 'false');
        hamburger.setAttribute('aria-label', 'メニューを開く');
      });
    });

    window.addEventListener('resize', function () {
      if (window.innerWidth > 768 && header.classList.contains('is-menu-open')) {
        header.classList.remove('is-menu-open');
        hamburger.setAttribute('aria-expanded', 'false');
        hamburger.setAttribute('aria-label', 'メニューを開く');
      }
    });
  }

  /**
   * アンカーリンクのスムーズスクロール
   */
  function initSmoothScroll() {
    document.querySelectorAll('a[href^="#"]').forEach(function (anchor) {
      anchor.addEventListener('click', function (e) {
        var href = this.getAttribute('href');
        if (href === '#') return;

        var target = document.querySelector(href);
        if (!target) return;

        e.preventDefault();

        var header = document.querySelector('.ifd-header') || document.querySelector('.v3-header');
        var headerHeight = header ? header.offsetHeight : 0;
        var targetPosition = target.getBoundingClientRect().top + window.scrollY - headerHeight - 10;

        window.scrollTo({
          top: targetPosition,
          behavior: 'smooth'
        });
      });
    });
  }
})();

/*document.addEventListener('DOMContentLoaded', function () {
  var titles = document.querySelectorAll('.ifd-news-title a');

  for (var i = 0; i < titles.length; i++) {
    var text = titles[i].textContent.trim();

    if (text.length > 20) {
      titles[i].setAttribute('title', text); // マウスを乗せると元の全文が見える
      titles[i].textContent = text.slice(0, 20) + '…';
    }
  }
});*/

/**
 * 飯塚地区消防本部 - main.js
 * 初期化処理 / ユーティリティ
 */
(function () {
  'use strict';

  document.addEventListener('DOMContentLoaded', function () {
    console.log('飯塚地区消防本部 WEB - initialized');
    initHeroSlider();
  });

  function initHeroSlider() {
    var slider = document.querySelector('.ifd-hero-slider');
    if (!slider) return;

    var track = slider.querySelector('.content-list') || slider.querySelector('.ifd-hero-track');
    var slides = track ? track.querySelectorAll('.ifd-hero-slide') : [];
    var dotsContainer = slider.querySelector('.ifd-hero-dots');

    if (!track || slides.length === 0) return;

    if (slides.length < 2) {
      if (dotsContainer) dotsContainer.style.display = 'none';
      return;
    }

    var total = slides.length;

    var clone = slides[0].cloneNode(true);
    clone.classList.add('ifd-hero-slide--clone');
    clone.setAttribute('aria-hidden', 'true');
    track.appendChild(clone);

    slides.forEach(function (_, i) {
      var dot = document.createElement('button');
      dot.className = 'ifd-hero-dot' + (i === 0 ? ' is-active' : '');
      dot.setAttribute('aria-label', 'スライド' + (i + 1));
      dotsContainer.appendChild(dot);
    });

    var dots = dotsContainer.querySelectorAll('.ifd-hero-dot');
    var current = 0;
    var interval = 5000;
    var timer = null;
    var transitioning = false;

    function updateDots() {
      var dotIndex = current % total;
      dots.forEach(function (d) { d.classList.remove('is-active'); });
      if (dots[dotIndex]) dots[dotIndex].classList.add('is-active');
    }

    function slideTo(index, animate) {
      if (animate !== false) {
        track.style.transition = 'transform 600ms cubic-bezier(0.4, 0, 0.2, 1)';
      } else {
        track.style.transition = 'none';
      }
      current = index;
      track.style.transform = 'translateX(-' + (current * 100) + '%)';
      updateDots();
    }

    track.addEventListener('transitionend', function () {
      transitioning = false;
      if (current >= total) {
        slideTo(0, false);
      }
    });

    function next() {
      if (transitioning) return;
      transitioning = true;
      slideTo(current + 1, true);
    }

    function goTo(index) {
      if (transitioning) return;
      transitioning = true;
      slideTo(index, true);
    }

    function startAuto() {
      stopAuto();
      timer = setInterval(next, interval);
    }

    function stopAuto() {
      if (timer) {
        clearInterval(timer);
        timer = null;
      }
    }

    dots.forEach(function (dot, i) {
      dot.addEventListener('click', function () {
        goTo(i);
        startAuto();
      });
    });

    slider.addEventListener('mouseenter', stopAuto);
    slider.addEventListener('mouseleave', startAuto);

    startAuto();
  }
})();