
/* ==== part:ui-tools-openclose4 start ==== */

//===============================================================
// 汎用開閉処理
//===============================================================
$(function() {
	$('.ui-tools-openclose4-parts').next().hide();
	$('.ui-tools-openclose4-parts').click(function() {
		$(this).toggleClass('active');
		$(this).next().slideToggle();
		$('.ui-tools-openclose4-parts').not(this).removeClass('active').next().slideUp();
	});
});

/* ==== part:ui-tools-openclose4 end ==== */


/* ==== part:ui-tools-progress1 start ==== */

// ===============================================================
// プログレスバーのアニメーション（inview連動）
// ===============================================================
$(function(){
	$(".ui-tools-progress1-parts.inview").on("inview", function(event, isInView){
		if(isInView){
			$(this).addClass("animated");
		}
	});
});

/* ==== part:ui-tools-progress1 end ==== */


/* ==== part:ui-tools-openclose3 start ==== */

// ===============================================================
// FAQアコーディオン開閉
// ===============================================================
$(function(){
	$(".ui-tools-openclose3-parts .question-parts").on("click", function(){
		var $item = $(this).closest(".faq-item-parts");
		var $answer = $item.find(".answer-parts");
		$item.toggleClass("open");
		$answer.slideToggle(300);
	});
});

/* ==== part:ui-tools-openclose3 end ==== */


/* ==== part:ui-tools-thumbnail-changer3 start ==== */

// ===============================================================
// 詳細ページ：サムネイル切替（画像/動画） + 横スクロール矢印（自動）
// ===============================================================
$(function(){

  // ------------------------------
  // サムネ（video）の初期処理：controls消し、iOS対策、再生アイコン付与
  // ------------------------------
  function setupThumbVideo($v){
    var videoEl = $v[0];

    $v.attr({
      'preload': 'metadata',
      'muted': true,
      'playsinline': true
    });

    videoEl.removeAttribute('controls');

    // iOSで最初のフレームが白になりやすい対策
    function seekThumbFrame(){
      try {
        videoEl.pause();
        videoEl.currentTime = 0.1;
      } catch(e) {}
    }
    // 読み込みタイミングにより効き方が違うので複数で保険
    $v.on('loadedmetadata loadeddata', seekThumbFrame);
    seekThumbFrame();

    // まだラップされていなければラップ＋アイコン
    if (!$v.parent().hasClass('thumb-wrap')) {
      $v.wrap('<span class="thumb-wrap is-video"></span>');
      $v.after('<span class="thumb-play" aria-hidden="true"><i class="ti ti-player-play"></i></span>');
    }
  }

  // ------------------------------
  // サムネ要素（img/video）から、表示用の要素を生成
  // ------------------------------
  function createViewerEl($media){
    if ($media.is('img')) {
      return $('<img>').attr('src', $media.attr('src'));
    }

    if ($media.is('video')) {
      var src = $media.attr('src') || $media.find('source:first').attr('src');
      if (!src) return null;

      var $v = $('<video>').attr({
        src: src,
        controls: true,
        playsinline: true,
        preload: 'metadata'
      });

      // iOSで真っ白防止：0.1秒目を表示
      $v.on('loadedmetadata loadeddata', function(){
        try { this.currentTime = 0.1; } catch(e) {}
      });

      return $v;
    }

    return null;
  }

  // ------------------------------
  // 1セットずつ処理（複数設置に対応）
  // ------------------------------
  $('.thumbnail-view3-parts').each(function(){

    var $view  = $(this);
    var $thumbs = $view.next('.ui-tools-thumbnail-changer3-parts');

    // サムネ内の video を処理（ラップ＆アイコン）
    $thumbs.find('video').each(function(){
      setupThumbVideo($(this));
    });

    // --- サムネ列にナビを動的生成（矢印＋スクロール枠） ---
    // すでに生成済みなら二重に作らない
    if (!$thumbs.parent().hasClass('thumbnail-wrapper3')) {
      var $wrapper = $thumbs.wrap('<div class="thumbnail-wrapper3"></div>').parent();
      var $nav     = $wrapper.wrap('<div class="thumbnail-nav3"></div>').parent();

      var $prev = $('<div class="thumb-arrow3 prev">&#10094;</div>');
      var $next = $('<div class="thumb-arrow3 next">&#10095;</div>');
      $nav.prepend($prev).append($next);

      // 1回のスクロール量（サムネ 3個分）
      function getStep(){
        var $item = $thumbs.children().first();
        var w = $item.outerWidth(true) || 100;
        return w * 3;
      }

      function updateArrows(){
        var max = $thumbs[0].scrollWidth - $wrapper.innerWidth();
        var pos = $wrapper.scrollLeft();

        if (max <= 0) {
          $prev.addClass('is-off');
          $next.addClass('is-off');
        } else {
          $prev.toggleClass('is-off', pos <= 0);
          $next.toggleClass('is-off', pos >= max - 2);
        }
      }

      $prev.on('click', function(){
        $wrapper.animate({scrollLeft: $wrapper.scrollLeft() - getStep()}, 300, updateArrows);
      });
      $next.on('click', function(){
        $wrapper.animate({scrollLeft: $wrapper.scrollLeft() + getStep()}, 300, updateArrows);
      });

      $wrapper.on('scroll', updateArrows);
      $(window).on('resize', updateArrows);
      updateArrows();
    }

    // --- 初期表示：最初の img か video を表示 ---
    var $first = $thumbs.find('img,video').first();
    var $firstEl = createViewerEl($first);

    if ($firstEl) {
      $view.empty().append($firstEl);
    }

  });

  // ------------------------------
  // サムネクリック（pointerdown推奨：iOS/タップ遅延＆誤再生防止）
  // ------------------------------
  $(document).on('pointerdown', '.ui-tools-thumbnail-changer3-parts', function(e){

    // thumb-wrap上のクリックも拾えるように closest で探す
    var $media = $(e.target).closest('img,video');
    if (!$media.length) return;

    e.preventDefault();

    // サムネがvideoなら誤再生防止で止める
    if ($media.is('video')) {
      try { $media[0].pause(); } catch(err) {}
    }

    // 対応する view を取得
    var $view = $(this).closest('.thumbnail-nav3').prev('.thumbnail-view3-parts');
    if (!$view.length) return;

    var $nextEl = createViewerEl($media);
    if (!$nextEl) return;

    // iOS対策：display:none だと白くなる事があるので opacity で切り替え
    $nextEl.css('opacity', 0);

    $view.find('img,video').fadeOut(400, function(){
      $view.empty().append($nextEl);

      // 動画の場合は念のためロード
      if ($nextEl.is('video')) {
        try { $nextEl[0].load(); } catch(e) {}
      }

      $nextEl.animate({opacity: 1}, 400);
    });

  });

});

/* ==== part:ui-tools-thumbnail-changer3 end ==== */


/* ==== part:ui-tools-thumbnail-changer2 start ==== */

// ===============================================================
// 詳細ページ：サムネイル切替（画像/動画） + 横スクロール矢印（自動）
// ===============================================================
$(function(){

  // ------------------------------
  // サムネ（video）の初期処理：controls消し、iOS対策、再生アイコン付与
  // ------------------------------
  function setupThumbVideo($v){
    var videoEl = $v[0];

    $v.attr({
      'preload': 'metadata',
      'muted': true,
      'playsinline': true
    });

    videoEl.removeAttribute('controls');

    // iOSで最初のフレームが白になりやすい対策
    function seekThumbFrame(){
      try {
        videoEl.pause();
        videoEl.currentTime = 0.1;
      } catch(e) {}
    }
    // 読み込みタイミングにより効き方が違うので複数で保険
    $v.on('loadedmetadata loadeddata', seekThumbFrame);
    seekThumbFrame();

    // まだラップされていなければラップ＋アイコン
    if (!$v.parent().hasClass('thumb-wrap')) {
      $v.wrap('<span class="thumb-wrap is-video"></span>');
      $v.after('<span class="thumb-play" aria-hidden="true"><i class="ti ti-player-play"></i></span>');
    }
  }

  // ------------------------------
  // サムネ要素（img/video）から、表示用の要素を生成
  // ------------------------------
  function createViewerEl($media){
    if ($media.is('img')) {
      return $('<img>').attr('src', $media.attr('src'));
    }

    if ($media.is('video')) {
      var src = $media.attr('src') || $media.find('source:first').attr('src');
      if (!src) return null;

      var $v = $('<video>').attr({
        src: src,
        controls: true,
        playsinline: true,
        preload: 'metadata'
      });

      // iOSで真っ白防止：0.1秒目を表示
      $v.on('loadedmetadata loadeddata', function(){
        try { this.currentTime = 0.1; } catch(e) {}
      });

      return $v;
    }

    return null;
  }

  // ------------------------------
  // 1セットずつ処理（複数設置に対応）
  // ------------------------------
  $('.thumbnail-view2-parts').each(function(){

    var $view  = $(this);
    var $thumbs = $view.next('.ui-tools-thumbnail-changer2-parts');

    // サムネ内の video を処理（ラップ＆アイコン）
    $thumbs.find('video').each(function(){
      setupThumbVideo($(this));
    });

    // --- サムネ列にナビを動的生成（矢印＋スクロール枠） ---
    // すでに生成済みなら二重に作らない
    if (!$thumbs.parent().hasClass('thumbnail-wrapper2')) {
      var $wrapper = $thumbs.wrap('<div class="thumbnail-wrapper2"></div>').parent();
      var $nav     = $wrapper.wrap('<div class="thumbnail-nav2"></div>').parent();

      var $prev = $('<div class="thumb-arrow2 prev">&#10094;</div>');
      var $next = $('<div class="thumb-arrow2 next">&#10095;</div>');
      $nav.prepend($prev).append($next);

      // 1回のスクロール量（サムネ 3個分）
      function getStep(){
        var $item = $thumbs.children().first();
        var w = $item.outerWidth(true) || 100;
        return w * 3;
      }

      function updateArrows(){
        var max = $thumbs[0].scrollWidth - $wrapper.innerWidth();
        var pos = $wrapper.scrollLeft();

        if (max <= 0) {
          $prev.addClass('is-off');
          $next.addClass('is-off');
        } else {
          $prev.toggleClass('is-off', pos <= 0);
          $next.toggleClass('is-off', pos >= max - 2);
        }
      }

      $prev.on('click', function(){
        $wrapper.animate({scrollLeft: $wrapper.scrollLeft() - getStep()}, 300, updateArrows);
      });
      $next.on('click', function(){
        $wrapper.animate({scrollLeft: $wrapper.scrollLeft() + getStep()}, 300, updateArrows);
      });

      $wrapper.on('scroll', updateArrows);
      $(window).on('resize', updateArrows);
      updateArrows();
    }

    // --- 初期表示：最初の img か video を表示 ---
    var $first = $thumbs.find('img,video').first();
    var $firstEl = createViewerEl($first);

    if ($firstEl) {
      $view.empty().append($firstEl);
    }

  });

  // ------------------------------
  // サムネクリック（pointerdown推奨：iOS/タップ遅延＆誤再生防止）
  // ------------------------------
  $(document).on('pointerdown', '.ui-tools-thumbnail-changer2-parts', function(e){

    // thumb-wrap上のクリックも拾えるように closest で探す
    var $media = $(e.target).closest('img,video');
    if (!$media.length) return;

    e.preventDefault();

    // サムネがvideoなら誤再生防止で止める
    if ($media.is('video')) {
      try { $media[0].pause(); } catch(err) {}
    }

    // 対応する view を取得
    var $view = $(this).closest('.thumbnail-nav2').prev('.thumbnail-view2-parts');
    if (!$view.length) return;

    var $nextEl = createViewerEl($media);
    if (!$nextEl) return;

    // iOS対策：display:none だと白くなる事があるので opacity で切り替え
    $nextEl.css('opacity', 0);

    $view.find('img,video').fadeOut(400, function(){
      $view.empty().append($nextEl);

      // 動画の場合は念のためロード
      if ($nextEl.is('video')) {
        try { $nextEl[0].load(); } catch(e) {}
      }

      $nextEl.animate({opacity: 1}, 400);
    });

  });

});

/* ==== part:ui-tools-thumbnail-changer2 end ==== */


/* ==== part:ui-tools-thumbnail-changer1 start ==== */

// ===============================================================
// 詳細ページ：サムネイル切替（画像/動画） + 横スクロール矢印（自動）
// ===============================================================
$(function(){

  // ------------------------------
  // サムネ（video）の初期処理：controls消し、iOS対策、再生アイコン付与
  // ------------------------------
  function setupThumbVideo($v){
    var videoEl = $v[0];

    $v.attr({
      'preload': 'metadata',
      'muted': true,
      'playsinline': true
    });

    videoEl.removeAttribute('controls');

    // iOSで最初のフレームが白になりやすい対策
    function seekThumbFrame(){
      try {
        videoEl.pause();
        videoEl.currentTime = 0.1;
      } catch(e) {}
    }
    // 読み込みタイミングにより効き方が違うので複数で保険
    $v.on('loadedmetadata loadeddata', seekThumbFrame);
    seekThumbFrame();

    // まだラップされていなければラップ＋アイコン
    if (!$v.parent().hasClass('thumb-wrap')) {
      $v.wrap('<span class="thumb-wrap is-video"></span>');
      $v.after('<span class="thumb-play" aria-hidden="true"><i class="ti ti-player-play"></i></span>');
    }
  }

  // ------------------------------
  // サムネ要素（img/video）から、表示用の要素を生成
  // ------------------------------
  function createViewerEl($media){
    if ($media.is('img')) {
      return $('<img>').attr('src', $media.attr('src'));
    }

    if ($media.is('video')) {
      var src = $media.attr('src') || $media.find('source:first').attr('src');
      if (!src) return null;

      var $v = $('<video>').attr({
        src: src,
        controls: true,
        playsinline: true,
        preload: 'metadata'
      });

      // iOSで真っ白防止：0.1秒目を表示
      $v.on('loadedmetadata loadeddata', function(){
        try { this.currentTime = 0.1; } catch(e) {}
      });

      return $v;
    }

    return null;
  }

  // ------------------------------
  // 1セットずつ処理（複数設置に対応）
  // ------------------------------
  $('.thumbnail-view1-parts').each(function(){

    var $view  = $(this);
    var $thumbs = $view.next('.ui-tools-thumbnail-changer1-parts');

    // サムネ内の video を処理（ラップ＆アイコン）
    $thumbs.find('video').each(function(){
      setupThumbVideo($(this));
    });

    // --- 初期表示：最初の img か video を表示 ---
    var $first = $thumbs.find('img,video').first();
    var $firstEl = createViewerEl($first);

    if ($firstEl) {
      $view.empty().append($firstEl);
    }

  });

  // ------------------------------
  // サムネクリック（pointerdown推奨：iOS/タップ遅延＆誤再生防止）
  // ------------------------------
  $(document).on('pointerdown', '.ui-tools-thumbnail-changer1-parts', function(e){

    // thumb-wrap上のクリックも拾えるように closest で探す
    var $media = $(e.target).closest('img,video');
    if (!$media.length) return;

    e.preventDefault();

    // サムネがvideoなら誤再生防止で止める
    if ($media.is('video')) {
      try { $media[0].pause(); } catch(err) {}
    }

    // 対応する view を取得
    var $view = $(this).prev('.thumbnail-view1-parts');
    if (!$view.length) return;

    var $nextEl = createViewerEl($media);
    if (!$nextEl) return;

    // iOS対策：display:none だと白くなる事があるので opacity で切り替え
    $nextEl.css('opacity', 0);

    $view.find('img,video').fadeOut(400, function(){
      $view.empty().append($nextEl);

      // 動画の場合は念のためロード
      if ($nextEl.is('video')) {
        try { $nextEl[0].load(); } catch(e) {}
      }

      $nextEl.animate({opacity: 1}, 400);
    });

  });

});

/* ==== part:ui-tools-thumbnail-changer1 end ==== */


/* ==== part:ui-tools-tab1 start ==== */

//===============================================================
// タブ切り替えブロック
//===============================================================
$(function() {

  $('.ui-tools-tab1-parts').each(function() {

    var $menu     = $(this);
    var $tabs     = $menu.children('li');
    var $contents = $menu.nextAll('.ui-tools-tab1-content-parts').slice(0, $tabs.length);

    // 初期状態を整える（HTMLに ui-tools-tab1-active-parts が無くても動く）
    var startIndex = $tabs.filter('.ui-tools-tab1-active-parts').first().index();
    if (startIndex < 0) startIndex = 0;

    $tabs.removeClass('ui-tools-tab1-active-parts').eq(startIndex).addClass('ui-tools-tab1-active-parts');
    $contents.hide().removeClass('ui-tools-tab1-active-parts').eq(startIndex).show().addClass('ui-tools-tab1-active-parts');

    $tabs.on('click', function() {

      var $this = $(this);
      var idx   = $this.index();

      if ($this.hasClass('ui-tools-tab1-active-parts')) return;

      $tabs.removeClass('ui-tools-tab1-active-parts');
      $this.addClass('ui-tools-tab1-active-parts');

      var $current = $contents.filter('.ui-tools-tab1-active-parts');
      var $next    = $contents.eq(idx);

      $current.fadeOut(200, function() {
        $current.removeClass('ui-tools-tab1-active-parts');
        $next.fadeIn(200, function() {
          $next.addClass('ui-tools-tab1-active-parts');
        });
      });

    });

  });

});

/* ==== part:ui-tools-tab1 end ==== */


/* ==== part:ui-tools-fixed2 start ==== */

//===============================================================
// ui-tools-fixed2-parts
//===============================================================
$(function() {

	function isfixed2Desktop() {
		var $main = $('main').first();
		var breakpoint = 600;	// cssのブレイクポイントと合わせる

		if (window.CSS && CSS.supports && CSS.supports('container-type: inline-size')) {
			if ($main.length) {
				return $main.innerWidth() >= breakpoint;
			}
			return window.innerWidth >= breakpoint;
		}

		return window.innerWidth >= breakpoint;
	}

	function resetImgStyle($img) {
		$img.removeClass('is-active-parts').css({
			position: '',
			top: '',
			left: '',
			width: '',
			height: '',
			zIndex: ''
		});
	}

	function setImgState($img, isActive, cssObj) {
		$img.toggleClass('is-active-parts', isActive).css(cssObj);
	}

	function updatefixed2Parts() {
		var isDesktop = isfixed2Desktop();
		var scrollTop = $(window).scrollTop();
		var winH = window.innerHeight;

		$('.ui-tools-fixed2-parts').each(function() {
			var $wrap = $(this);
			var $items = $wrap.children('.list-parts');
			var itemCount = $items.length;
			var imgRate = parseFloat(getComputedStyle(this).getPropertyValue('--img-rate')) || 0.30;

			if (!itemCount) return;

			/*スマホ時は画像を全部リセットして終了*/
			if (!isDesktop) {
				$items.each(function() {
					resetImgStyle($(this).children('.img-parts'));
				});
				return;
			}

			var $firstItem = $items.eq(0);
			var $lastItem = $items.eq(itemCount - 1);
			var firstTop = $firstItem.offset().top;
			var lastTop = $lastItem.offset().top;
			var lastHeight = $lastItem.outerHeight();
			var lastReleaseTop = Math.max(lastTop, lastTop + lastHeight - winH);
			var lastAfterTop = Math.max(lastHeight - winH, 0);
			var activeIndex = 0;
			var stage;
			var $activeItem;
			var stageLeft;
			var stageWidth;
			var triggerLine = scrollTop + (winH * 0.5);	/*切り替え基準線。0.5=画面中央*/

			/*どのブロックが担当中か判定（切り替えは画面中央ライン基準）*/
			$items.each(function(i) {
				if (triggerLine >= $(this).offset().top) {
					activeIndex = i;
				}
			});

			if (scrollTop < firstTop) {
				stage = 'before';
				activeIndex = 0;
			} else if (scrollTop > lastReleaseTop) {
				stage = 'after';
				activeIndex = itemCount - 1;
			} else {
				stage = 'active';
			}

			$activeItem = $items.eq(activeIndex);
			stageLeft = $activeItem[0].getBoundingClientRect().left;
			stageWidth = $activeItem.outerWidth() * imgRate;

			$items.each(function(i) {
				var $item = $(this);
				var $img = $item.children('.img-parts');
				var isActive = (i === activeIndex);

				if (!$img.length) return;

				/*開始前：1枚目だけ通常位置で見せる*/
				if (stage === 'before') {
					if (i === 0) {
						setImgState($img, true, {
							position: 'absolute',
							top: 0,
							left: 0,
							width: '',
							height: winH,
							zIndex: itemCount + 1
						});
					} else {
						setImgState($img, false, {
							position: 'absolute',
							top: 0,
							left: 0,
							width: '',
							height: winH,
							zIndex: 1
						});
					}
				}

				/*担当中：全画像を同じ固定位置に重ね、opacityだけで切り替える*/
				else if (stage === 'active') {
					setImgState($img, isActive, {
						position: 'fixed',
						top: 0,
						left: stageLeft,
						width: stageWidth,
						height: winH,
						zIndex: isActive ? itemCount + 1 : i + 1
					});
				}

				/*終了後：最後の画像だけ通常位置に戻して、そのまま上へ流す*/
				else {
					if (i === itemCount - 1) {
						setImgState($img, true, {
							position: 'absolute',
							top: lastAfterTop,
							left: 0,
							width: '',
							height: winH,
							zIndex: itemCount + 1
						});
					} else {
						setImgState($img, false, {
							position: 'absolute',
							top: 0,
							left: 0,
							width: '',
							height: winH,
							zIndex: 1
						});
					}
				}
			});
		});
	}

	var ticking = false;

	function requestfixed2Update() {
		if (ticking) return;

		ticking = true;

		window.requestAnimationFrame(function() {
			updatefixed2Parts();
			ticking = false;
		});
	}

	$(window).on('load resize scroll', requestfixed2Update);
	requestfixed2Update();

});

/* ==== part:ui-tools-fixed2 end ==== */


/* ==== part:ui-tools-fixed1 start ==== */

//===============================================================
// ui-tools-fixed1-parts
//===============================================================
$(function() {

	function isfixed1Desktop() {
		var $main = $('main').first();
		var breakpoint = 600;	// cssのブレイクポイントと合わせる

		if (window.CSS && CSS.supports && CSS.supports('container-type: inline-size')) {
			if ($main.length) {
				return $main.innerWidth() >= breakpoint;
			}
			return window.innerWidth >= breakpoint;
		}

		return window.innerWidth >= breakpoint;
	}

	function resetImgStyle($img) {
		$img.css({
			position: '',
			top: '',
			left: '',
			width: '',
			height: '',
			zIndex: ''
		});
	}

	function updatefixed1Parts() {
		var isDesktop = isfixed1Desktop();
		var scrollTop = $(window).scrollTop();
		var winH = window.innerHeight;

		$('.ui-tools-fixed1-parts').each(function() {
			var $wrap = $(this);
			var $items = $wrap.children('.list-parts');
			var imgRate = parseFloat(getComputedStyle(this).getPropertyValue('--img-rate')) || 0.30;

			/*スマホ時は画像を全部リセットして終了*/
			if (!isDesktop) {
				$items.each(function() {
					resetImgStyle($(this).children('.img-parts'));
				});
				return;
			}

			$items.each(function(i) {
				var $item = $(this);
				var $img = $item.children('.img-parts');
				var itemTop = $item.offset().top;
				var itemHeight = $item.outerHeight();
				var itemLeft = $item[0].getBoundingClientRect().left;
				var itemWidth = $item.outerWidth();
				var imgWidth = itemWidth * imgRate;
				var afterTop = Math.max(itemHeight - winH, 0);
				var stopTop;

				/*最後以外は「次のブロックの先頭まで固定」*/
				if (i < $items.length - 1) {
					stopTop = $items.eq(i + 1).offset().top;
				} else {
					/*最後は「ブロック終端 - 画像高さ」まで固定。その後に上へ流れる*/
					stopTop = Math.max(itemTop, itemTop + itemHeight - winH);
				}

				/*まだそのブロックに到達していない*/
				if (scrollTop < itemTop) {
					$img.css({
						position: 'absolute',
						top: 0,
						left: 0,
						width: '',
						height: winH,
						zIndex: i + 1
					});
				}

				/*そのブロックの担当中（画面内固定）*/
				else if (scrollTop <= stopTop) {
					$img.css({
						position: 'fixed',
						top: 0,
						left: itemLeft,
						width: imgWidth,
						height: winH,
						zIndex: i + 1
					});
				}

				/*担当終了後*/
				else {
					$img.css({
						position: 'absolute',
						top: afterTop,
						left: 0,
						width: '',
						height: winH,
						zIndex: i + 1
					});
				}
			});
		});
	}

	var ticking = false;

	function requestfixed1Update() {
		if (ticking) return;

		ticking = true;

		window.requestAnimationFrame(function() {
			updatefixed1Parts();
			ticking = false;
		});
	}

	$(window).on('load resize scroll', requestfixed1Update);
	requestfixed1Update();

});

/* ==== part:ui-tools-fixed1 end ==== */


/* ==== part:ui-tools-search1 start ==== */

//===============================================================
// 簡易検索ページ
//===============================================================
$(function() {

    // 検索ボックスに入力があった時の処理
    // 'keyup' を 'input' に変更しました
    // ※ 汎用の #keyword / .list-parts / .no-result をグローバルに掴むと
    //   他パーツの同名要素まで操作してしまう為、このパーツ（.ui-tools-search1系）内に限定する
    $('.ui-tools-search1-keyword-parts input').on('input', function() {

        // 1. 入力された文字を小文字に変換して取得
        var keyword = $(this).val().toLowerCase();

        // 2. 検索対象のリスト（.ui-tools-search1-parts 内の .list-parts のみ）をチェック
        var $listRoot = $('.ui-tools-search1-parts');
        var hitCount = 0; // ヒットした件数を数える変数

        $listRoot.find('.list-parts').each(function() {
            // その項目の data-keyword を取得
            var itemData = $(this).data('keyword');

            // キーワードが含まれているか判定
            if(itemData && itemData.indexOf(keyword) !== -1) {
                $(this).show(); // あれば表示
                hitCount++;     // ヒット件数を+1
            } else {
                $(this).hide(); // なければ非表示
            }
        });

        // 3. 一つもヒットしなかった場合、「見つかりません」を出す
        if(hitCount === 0) {
            $listRoot.find('.no-result').show();
        } else {
            $listRoot.find('.no-result').hide();
        }

    });

});

/* ==== part:ui-tools-search1 end ==== */


/* ==== part:ui-tools-popup3 start ==== */

//===============================================================
// ポップアップ
//===============================================================
$(function() {
	// セッション内でポップアップが既に表示されているかチェック
	// ※ キーはパーツごとに分ける（共有すると複数ポップアップで最初の1つしか表示されない）
	if (!sessionStorage.getItem('ui-tools-popup3-shown')) {
		setTimeout(function(){
			if ($("#popup2-overlay-parts").length) {
				$("#popup2-overlay-parts").fadeIn(300);
			}
			$("#ui-tools-popup3-parts").fadeIn(300);
			sessionStorage.setItem('ui-tools-popup3-shown', 'true');
		}, 3000); // 3秒後にポップアップを表示
	}

	// 閉じるボタンのクリックイベント（このポップアップ内の .close-btn-parts のみ）
	$("#ui-tools-popup3-parts .close-btn-parts").click(function(){
		$("#ui-tools-popup3-parts").fadeOut(300);
		if ($("#popup2-overlay-parts").length) {
			$("#popup2-overlay-parts").fadeOut(300);
		}
	});
});

/* ==== part:ui-tools-popup3 end ==== */


/* ==== part:ui-tools-popup2 start ==== */

//===============================================================
// ポップアップ
//===============================================================
$(function() {
	// セッション内でポップアップが既に表示されているかチェック
	// ※ キーはパーツごとに分ける（共有すると複数ポップアップで最初の1つしか表示されない）
	if (!sessionStorage.getItem('ui-tools-popup2-shown')) {
		setTimeout(function(){
			if ($("#popup2-overlay-parts").length) {
				$("#popup2-overlay-parts").fadeIn(300);
			}
			$("#ui-tools-popup2-parts").fadeIn(300);
			sessionStorage.setItem('ui-tools-popup2-shown', 'true');
		}, 3000); // 3秒後にポップアップを表示
	}

	// 閉じるボタンのクリックイベント（このポップアップ内の .close-btn-parts のみ）
	$("#ui-tools-popup2-parts .close-btn-parts").click(function(){
		$("#ui-tools-popup2-parts").fadeOut(300);
		if ($("#popup2-overlay-parts").length) {
			$("#popup2-overlay-parts").fadeOut(300);
		}
	});
});

/* ==== part:ui-tools-popup2 end ==== */


/* ==== part:ui-tools-popup1 start ==== */

//===============================================================
// ポップアップ
//===============================================================
$(function() {
	// セッション内でポップアップが既に表示されているかチェック
	// ※ キーはパーツごとに分ける（共有すると複数ポップアップで最初の1つしか表示されない）
	if (!sessionStorage.getItem('ui-tools-popup1-shown')) {
		setTimeout(function(){
			if ($("#ui-tools-popup1-overlay-parts").length) {
				$("#ui-tools-popup1-overlay-parts").fadeIn(300);
			}
			$("#ui-tools-popup1-parts").fadeIn(300);
			sessionStorage.setItem('ui-tools-popup1-shown', 'true');
		}, 3000); // 3秒後にポップアップを表示
	}

	// 閉じるボタンのクリックイベント（このポップアップ内の .close-btn-parts のみ）
	$("#ui-tools-popup1-parts .close-btn-parts").click(function(){
		$("#ui-tools-popup1-parts").fadeOut(300);
		if ($("#ui-tools-popup1-overlay-parts").length) {
			$("#ui-tools-popup1-overlay-parts").fadeOut(300);
		}
	});
});

/* ==== part:ui-tools-popup1 end ==== */


/* ==== part:ui-tools-masonary1 start ==== */

//===============================================================
// Masonry + Fancybox + 動画ホバー処理
//===============================================================
$(function () {
  var $grid = $('.ui-tools-maronry1-parts');

  if (!$grid.length) return;

  // iOSで頑固にサムネが出ない場合の「強制描画」処理
  $grid.find('.thumb-video').each(function () {
    var v = this;

    // 1. 属性の強制セット（これがないとJSでの操作が拒否されることがあります）
    $(v).attr({
      'muted': true,       // 必須：音ありだと自動再生とみなされブロックされる
      'playsinline': true, // 必須：全画面にならずに再生する
      'preload': 'metadata'
    });
    
    // 2. 「一瞬だけ再生して、即止める」
    // これを行うと、iOSは必ず映像データを読み込み、描画します。
    var playPromise = v.play();

    if (playPromise !== undefined) {
      playPromise.then(function() {
        // 再生成功（＝読み込み開始）直後にここに来ます
        v.pause();           // 即停止
        v.currentTime = 0.1; // 0.1秒地点を表示
        
        // 動画の高さが確定したはずなので、Masonryレイアウトを再計算
        // （これをしないと動画と次の要素が重なることがあります）
        setTimeout(function(){
            if ($grid.data('masonry')) {
                $grid.masonry('layout');
            }
        }, 100);

      }).catch(function(error) {
        // 省電力モードなどで自動再生が完全にブロックされた場合はここに来ます
        console.log('Autoplay was prevented:', error);
      });
    }
  });

  // 画像(img)の読み込み完了を待ってから Masonry 初期化
  // ※ videoタグはこのimagesLoadedでは感知されないため、上のJS内で layout を呼んでいます
  $grid.imagesLoaded(function () {
    $grid.masonry({
      itemSelector: '.list-parts',
      columnWidth: '.masonry1-size-parts',
      percentPosition: true,
      gutter: 16
    });
  });

  // 画像が1枚ずつ読み込まれたときもレイアウト調整
  $grid.imagesLoaded().progress(function () {
    $grid.masonry('layout');
  });

  // Fancybox 初期化
  $('[data-fancybox]').fancybox({
    loop: true,
    smallBtn: true,
    toolbar: false
  });

  // マウスホバー時の挙動
  $grid.on('mouseenter', '.is-video video', function () {
    this.play();
  });

  $grid.on('mouseleave', '.is-video video', function () {
    this.pause();
  });
});

/* ==== part:ui-tools-masonary1 end ==== */


/* ==== part:ui-tools-openclose2 start ==== */

//===============================================================
// 汎用開閉処理
//===============================================================
$(function() {
	$('.ui-tools-openclose2-parts').next().hide();
	$('.ui-tools-openclose2-parts').click(function() {
		// クリックした要素に active クラスをトグルする
		$(this).toggleClass('active');
		$(this).next().slideToggle();
		// クリックされた要素以外の active クラスを除去し、その dd を閉じる
		$('.ui-tools-openclose2-parts').not(this).removeClass('active').next().slideUp();
	});
});

/* ==== part:ui-tools-openclose2 end ==== */


/* ==== part:ui-tools-openclose1 start ==== */

//===============================================================
// 汎用開閉処理
//===============================================================
$(function() {
	$('.ui-tools-openclose1-parts').next().hide();
	$('.ui-tools-openclose1-parts').click(function() {
		$(this).next().slideToggle();
		$('.ui-tools-openclose1-parts').not(this).next().slideUp();
	});
});

/* ==== part:ui-tools-openclose1 end ==== */


/* ==== part:ui-tools-calender1 start ==== */

//===============================================================
// カレンダー（2026年〜2027年）
//===============================================================
$(function() {
  // リンクで移動可能な期間（例：2026年～2027年）
  const minYear = 2026;
  const maxYear = 2027;
  
  // 祝日（年ごとに指定）削除、追加できます。
  // ※2026/2027 は内閣府の「国民の祝日・休日」一覧に合わせています。
  const holidays = {
    "2026": {
      "01-01": true, // 元日
      "01-12": true, // 成人の日
      "02-11": true, // 建国記念の日
      "02-23": true, // 天皇誕生日
      "03-20": true, // 春分の日
      "04-29": true, // 昭和の日
      "05-03": true, // 憲法記念日
      "05-04": true, // みどりの日
      "05-05": true, // こどもの日
      "05-06": true, // 休日（祝日法第3条第2項による休日）
      "07-20": true, // 海の日
      "08-11": true, // 山の日
      "09-21": true, // 敬老の日
      "09-22": true, // 休日（祝日法第3条第3項による休日）
      "09-23": true, // 秋分の日
      "10-12": true, // スポーツの日
      "11-03": true, // 文化の日
      "11-23": true, // 勤労感謝の日
    },
    "2027": {
      "01-01": true, // 元日
      "01-11": true, // 成人の日
      "02-11": true, // 建国記念の日
      "02-23": true, // 天皇誕生日
      "03-21": true, // 春分の日
      "03-22": true, // 休日（祝日法第3条第2項による休日）
      "04-29": true, // 昭和の日
      "05-03": true, // 憲法記念日
      "05-04": true, // みどりの日
      "05-05": true, // こどもの日
      "07-19": true, // 海の日
      "08-11": true, // 山の日
      "09-20": true, // 敬老の日
      "09-23": true, // 秋分の日
      "10-11": true, // スポーツの日
      "11-03": true, // 文化の日
      "11-23": true, // 勤労感謝の日
    },
  };

  // 毎週指定された定休日（曜日番号：0(日)～6(土)）削除、追加できます。
  const storeClosedWeekDays = {
    3: true, // 3（水曜日）を定休日に設定した例
  };

  // 特別な日（年ごとに指定）削除、追加できます。（例として3つ入れてあります）
  const storeClosedDates = {
    "2026": {
      "01-26": true,
      "06-18": true,
    },
    "2027": {
      "06-15": true,
    },
  };

  // 毎週の定休日を、営業日にしたい場合の設定。（例として3つ入れてあります）
  // ※定休日カラーがリセットされ、平常日扱いになります。
  const storeOpenDates = {
    "2026": {
      "01-07": true, // 水曜を営業日にする例
    },
    "2027": {
      "03-03": true, // 水曜を営業日にする例
      "12-29": true, // 水曜を営業日にする例
    }
  };

  // 現在の年月（グローバル変数として管理）
  const today = new Date();
  let currentYear = today.getFullYear();
  let currentMonth = today.getMonth(); // 0～11
  
  // 範囲外の場合は、設定範囲内に補正
  if(currentYear < minYear){
    currentYear = minYear;
    currentMonth = 0;
  } else if(currentYear > maxYear){
    currentYear = maxYear;
    currentMonth = 11;
  }

  // カレンダー描画用の関数
  function renderCalendar(year, month) {
    // 対象年の祝日、特別な日、営業日オーバーライドのオブジェクト
    const currentHolidays = holidays[year] || {};
    const currentStoreClosedDates = storeClosedDates[year] || {};
    const currentStoreOpenDates = storeOpenDates[year] || {};
    
    // 曜日の名称（日本語）
    const weekDays = ["日", "月", "火", "水", "木", "金", "土"];
    
    // 当月初日・最終日
    const firstDay = new Date(year, month, 1);
    const lastDay = new Date(year, month + 1, 0);
    const numDays = lastDay.getDate();
    const startDay = firstDay.getDay();
    
    let html = "<table class='ui-tools-calender1-parts'>";
    
    // キャプションに前月・翌月のリンクを配置
    html += "<caption>";
    // 前月の計算
    const prevMonth = (month === 0) ? 11 : month - 1;
    const prevYear = (month === 0) ? year - 1 : year;
    if(prevYear >= minYear) {
      html += "<a href='#' class='ui-tools-calender1-prev-parts'><i class=\"ti ti-chevrons-left\"></i></a>";
    } else {
      html += "<i class=\"ti ti-chevrons-left\"></i>";
    }
    html += year + "年 " + (month + 1) + "月";
    // 翌月の計算
    const nextMonth = (month === 11) ? 0 : month + 1;
    const nextYear = (month === 11) ? year + 1 : year;
    if(nextYear <= maxYear) {
      html += "<a href='#' class='ui-tools-calender1-next-parts'><i class=\"ti ti-chevrons-right\"></i></a>";
    } else {
      html += "<i class=\"ti ti-chevrons-right\"></i>";
    }
    html += "</caption>";
    
    // 曜日ヘッダー
    html += "<tr>";
    for (let i = 0; i < weekDays.length; i++){
      html += "<th>" + weekDays[i] + "</th>";
    }
    html += "</tr>";
    
    // 日付セルの生成
    let day = 1;
    for (let i = 0; i < 6; i++){
      html += "<tr>";
      for (let j = 0; j < 7; j++){
        if(i === 0 && j < startDay) {
          html += "<td></td>";
        } else if(day > numDays) {
          html += "<td></td>";
        } else {
          const m = ("0" + (month + 1)).slice(-2);
          const d = ("0" + day).slice(-2);
          const key = m + "-" + d;
          
          if(currentStoreClosedDates[key]){
            html += "<td class='store-specific-parts'>" + day + "</td>";
          } else if(currentStoreOpenDates[key]){
            if(currentHolidays[key]){
              html += "<td class='holiday-parts'>" + day + "</td>";
            } else if(j === 0){
              html += "<td class='sunday-parts'>" + day + "</td>";
            } else if(j === 6){
              html += "<td class='saturday-parts'>" + day + "</td>";
            } else {
              html += "<td>" + day + "</td>";
            }
          } else if(storeClosedWeekDays[j]){
            // 毎週指定された定休日
            html += "<td class='store-weekly-parts'>" + day + "</td>";
          } else if(currentHolidays[key]){
            // 祝日
            html += "<td class='holiday-parts'>" + day + "</td>";
          } else if(j === 0) {
            // 日曜日
            html += "<td class='sunday-parts'>" + day + "</td>";
          } else if(j === 6) {
            // 土曜日
            html += "<td class='saturday-parts'>" + day + "</td>";
          } else {
            html += "<td>" + day + "</td>";
          }
          day++;
        }
      }
      html += "</tr>";
      if(day > numDays) break;
    }
    html += "</table>";
    
    // カレンダー領域に出力
    $("#ui-tools-calender1-parts").html(html);
    
    // 前月リンクのクリックイベント（このカレンダーパーツ内に限定）
    $("#ui-tools-calender1-parts .ui-tools-calender1-prev-parts").click(function(e){
      e.preventDefault();
      if(prevYear < minYear) return;
      currentYear = prevYear;
      currentMonth = prevMonth;
      renderCalendar(currentYear, currentMonth);
    });
    
    // 翌月リンクのクリックイベント（このカレンダーパーツ内に限定）
    $("#ui-tools-calender1-parts .ui-tools-calender1-next-parts").click(function(e){
      e.preventDefault();
      if(nextYear > maxYear) return;
      currentYear = nextYear;
      currentMonth = nextMonth;
      renderCalendar(currentYear, currentMonth);
    });
  }
  
  // 初期描画
  renderCalendar(currentYear, currentMonth);
});

/* ==== part:ui-tools-calender1 end ==== */
