<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>HongcheonDTS</title>
  <!-- Static verification metas (multiple allowed) -->
  <meta name="google-site-verification" content="uDY4MznRg7WRIeJ_rKG8A98oQN6aZjGdV8HwgsCWBo4">
  <meta name="naver-site-verification" content="3f143f30e40d1f37c3b2661fa5601175c9d952ef">
  
  
  
  <link rel="alternate" type="application/rss+xml" title="RSS Feed" href="/rss.xml">
  
  
  <!-- SEO 설정에서 관리한 값이 자동으로 적용됩니다 -->
  <script>
    // Early provisional site meta apply (per-site, from localStorage)
    (function(){
      // 특수 경로는 즉시 종료 (Firebase Functions로 처리)
      var specialPaths = ['/sitemap.xml', '/rss.xml', '/feed.xml'];
      var isSpecialPath = specialPaths.some(function(path) {
        return window.location.pathname === path;
      });
      if (isSpecialPath) {
        return; // 특수 경로는 메타 태그 적용하지 않음
      }
      
      try{
        var params = new URLSearchParams(location.search);
        var site = (params.get('site') || '').toLowerCase();
        if(!site){
          var host = location.hostname.toLowerCase();
          // minimal fallback mapping (same as runtime mapping fallback)
          if(host === 'hongcheondts.com' || host === 'www.hongcheondts.com'){ site = 'hongcheon'; }
        }
        if(!site) return;
        var raw = localStorage.getItem('ywam:siteMeta:' + site);
        if(!raw) return;
        var meta = JSON.parse(raw);
        if(meta && meta.title){
          document.title = meta.title;
        }
        if(meta && meta.faviconUrl){
          // 파비콘 URL을 절대 URL로 변환 (네이버 서치어드바이저가 인식하도록)
          var faviconUrl = meta.faviconUrl;
          if(faviconUrl && !faviconUrl.startsWith('http://') && !faviconUrl.startsWith('https://')){
            faviconUrl = location.origin + (faviconUrl.startsWith('/') ? '' : '/') + faviconUrl;
          }
          var ensure = function(rel, sizes){
            var sel = 'head link[rel=\"' + rel + '\"]' + (sizes ? '[sizes=\"' + sizes + '\"]' : '');
            var el = document.querySelector(sel);
            if(!el){ el = document.createElement('link'); el.rel = rel; if(sizes) el.sizes = sizes; document.head.appendChild(el); }
            el.href = faviconUrl;
          };
          ensure('icon','512x512'); ensure('shortcut icon'); ensure('apple-touch-icon');
        }
        
        // Open Graph 태그 설정 (카카오톡, 페이스북 등 소셜 미디어 공유용)
        if(meta){
          var ensureOgMeta = function(property, content){
            if(!content) return;
            var sel = 'meta[property=\"' + property + '\"]';
            var el = document.querySelector(sel);
            if(!el){ el = document.createElement('meta'); el.setAttribute('property', property); document.head.appendChild(el); }
            el.setAttribute('content', content);
          };
          
          var ensureTwitterMeta = function(name, content){
            if(!content) return;
            var sel = 'meta[name=\"' + name + '\"]';
            var el = document.querySelector(sel);
            if(!el){ el = document.createElement('meta'); el.setAttribute('name', name); document.head.appendChild(el); }
            el.setAttribute('content', content);
          };
          
          var siteTitle = meta.title || meta.siteTitle || '';
          var siteDescription = meta.description || meta.metaDescription || meta.subtitle || '';
          var ogImage = meta.ogImage || meta.image || '';
          var siteDomain = meta.siteDomain || location.origin;
          
          // 도메인 정규화
          if(siteDomain && !siteDomain.startsWith('http://') && !siteDomain.startsWith('https://')){
            siteDomain = 'https://' + siteDomain;
          }
          siteDomain = (siteDomain || location.origin).replace(/\/$/, '');
          
          // 현재 URL (쿼리 파라미터 제거)
          var currentUrl = siteDomain + location.pathname;
          
          // OG 이미지 URL 정규화
          if(ogImage && !ogImage.startsWith('http://') && !ogImage.startsWith('https://')){
            ogImage = siteDomain + (ogImage.startsWith('/') ? '' : '/') + ogImage;
          }
          
          // Open Graph 기본 태그
          ensureOgMeta('og:type', 'website');
          ensureOgMeta('og:title', siteTitle);
          ensureOgMeta('og:description', siteDescription);
          ensureOgMeta('og:url', currentUrl);
          ensureOgMeta('og:locale', 'ko_KR');
          ensureOgMeta('og:site_name', siteTitle);
          
          if(ogImage){
            // HTTPS 이미지인 경우 secure_url도 설정 (카카오톡 최적화)
            if(ogImage.startsWith('https://')){
              ensureOgMeta('og:image', ogImage);
              ensureOgMeta('og:image:secure_url', ogImage);
            } else {
              ensureOgMeta('og:image', ogImage);
            }
            ensureOgMeta('og:image:width', '1200');
            ensureOgMeta('og:image:height', '630');
            ensureOgMeta('og:image:type', 'image/jpeg');
          }
          
          // Twitter Card 태그
          ensureTwitterMeta('twitter:card', ogImage ? 'summary_large_image' : 'summary');
          ensureTwitterMeta('twitter:title', siteTitle);
          ensureTwitterMeta('twitter:description', siteDescription);
          if(ogImage){
            ensureTwitterMeta('twitter:image', ogImage);
          }
        }
      }catch(e){}
    })();
  </script>
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@300;400;500;700&family=Space+Grotesk:wght@400;500;600;700&display=swap" rel="stylesheet" media="print" onload="this.media='all'">
  <link rel="stylesheet" href="css/style.css">
  <link rel="stylesheet" href="css/sections/director.css">
  <link rel="stylesheet" href="css/sections/faq.css">
  <link rel="stylesheet" href="css/sections/apply.css">
  <link rel="stylesheet" href="css/sections/button.css">
  <link rel="stylesheet" href="css/sections/video-slider.css">
  <link rel="stylesheet" href="css/sections/image-slider.css">
  <script>
    // 모듈 버전 초기화 (배포 시마다 update-version.js가 자동으로 업데이트)
    // head에서 먼저 설정하여 모든 스크립트가 사용할 수 있도록 함
    if(typeof window !== 'undefined'){
      if(!window.__modulesVersion){ 
        // 배포 타임스탬프: 배포 시마다 update-version.js가 이 값을 업데이트함
        window.__modulesVersion = 1774682472481;
      }
    }
    // 버전 쿼리 헬퍼 함수 (전역에서 사용 가능)
    window.__getVersion = function() {
      return window.__modulesVersion || Date.now();
    };
  </script>
  <script type="module">
    (async()=>{ 
      const getVersion = window.__getVersion || (() => window.__modulesVersion || Date.now());
      const { initFromConfigFile } = await import(`/js/firebase.js?v=${getVersion()}`);
      const isDev = () => {
        const hostname = window.location.hostname;
        return hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '[::1]';
      };
      try{ window.__fb = await initFromConfigFile('/firebase-config.json'); }catch(e){ if(isDev()) console.warn(e);} 
    })();
  </script>

  <!-- 파비콘 (서버 사이드에서 SEO 설정으로 동적 생성) -->
  <link rel="icon" type="image/png" sizes="512x512" href="https://firebasestorage.googleapis.com/v0/b/ywamweb-93c3b.firebasestorage.app/o/sites%2Fhongcheon%2Fpublic%2Fimages%2Fsingle-faviconUrl-1772389909713-%ED%99%8D%EC%B2%9C%EB%A6%AC%EC%96%BC%EB%A1%9C%EA%B3%A0-removebg-preview.png?alt=media&amp;token=a6fee10f-6853-4b97-8625-e990fb8184cc">
  <link rel="shortcut icon" type="image/png" href="https://firebasestorage.googleapis.com/v0/b/ywamweb-93c3b.firebasestorage.app/o/sites%2Fhongcheon%2Fpublic%2Fimages%2Fsingle-faviconUrl-1772389909713-%ED%99%8D%EC%B2%9C%EB%A6%AC%EC%96%BC%EB%A1%9C%EA%B3%A0-removebg-preview.png?alt=media&amp;token=a6fee10f-6853-4b97-8625-e990fb8184cc">
  <link rel="apple-touch-icon" sizes="512x512" href="https://firebasestorage.googleapis.com/v0/b/ywamweb-93c3b.firebasestorage.app/o/sites%2Fhongcheon%2Fpublic%2Fimages%2Fsingle-faviconUrl-1772389909713-%ED%99%8D%EC%B2%9C%EB%A6%AC%EC%96%BC%EB%A1%9C%EA%B3%A0-removebg-preview.png?alt=media&amp;token=a6fee10f-6853-4b97-8625-e990fb8184cc">

  <!-- Open Graph 태그 (서버 사이드에서 SEO 설정으로 동적 생성) -->
  <meta property="og:type" content="website">
  <meta property="og:title" content="Hongcheon DTS">
  <meta property="og:description" content="Hongcheon DTS Since 1984. 
예수제자훈련학교.">
  <meta property="og:url" content="https://hongcheondts.com/board/product/css/sections/apply.css">
  <meta property="og:locale" content="ko_KR">
  <meta property="og:site_name" content="HongcheonDTS">
  
  <meta property="og:image" content="https://firebasestorage.googleapis.com/v0/b/ywamweb-93c3b.firebasestorage.app/o/sites%2Fhongcheon%2Fpublic%2Fimages%2Fsingle-ogImage-1764765712140-%EB%93%9C%EB%A1%A0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EC%A0%84%EA%B2%BD1.jpg?alt=media&amp;token=3c1d6d49-cc5e-4a73-ac1d-b7e95373093d">
  <meta property="og:image:secure_url" content="https://firebasestorage.googleapis.com/v0/b/ywamweb-93c3b.firebasestorage.app/o/sites%2Fhongcheon%2Fpublic%2Fimages%2Fsingle-ogImage-1764765712140-%EB%93%9C%EB%A1%A0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EC%A0%84%EA%B2%BD1.jpg?alt=media&amp;token=3c1d6d49-cc5e-4a73-ac1d-b7e95373093d">
  <meta property="og:image:width" content="1200">
  <meta property="og:image:height" content="630">
  <meta property="og:image:type" content="image/jpeg">
  
  <!-- Twitter Card 태그 -->
  <meta name="twitter:card" content="summary_large_image">
  <meta name="twitter:title" content="Hongcheon DTS">
  <meta name="twitter:description" content="Hongcheon DTS Since 1984. 
예수제자훈련학교.">
  <meta name="twitter:image" content="https://firebasestorage.googleapis.com/v0/b/ywamweb-93c3b.firebasestorage.app/o/sites%2Fhongcheon%2Fpublic%2Fimages%2Fsingle-ogImage-1764765712140-%EB%93%9C%EB%A1%A0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EC%A0%84%EA%B2%BD1.jpg?alt=media&amp;token=3c1d6d49-cc5e-4a73-ac1d-b7e95373093d">
  
  <!-- 기본 메타 태그 -->
  <meta name="description" content="예수전도단 홍천 예수제자훈련학교 (YWAM Hongcheon DTS Since 1984)">
</head>
<body>
  <div id="site-header"></div>
  <main>
    <div id="page-root"></div>
  </main>
  <script type="module">
    
    // 개발 환경 감지 함수
    const isDev = () => {
      const hostname = window.location.hostname;
      return hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '[::1]';
    };
    
    // 개발 환경에서만 콘솔 로그 출력
    const devLog = {
      log: (...args) => { if(isDev()) console.log(...args); },
      warn: (...args) => { if(isDev()) console.warn(...args); },
      error: (...args) => { if(isDev()) console.error(...args); },
      info: (...args) => { if(isDev()) console.info(...args); }
    };
    
    // 버전 쿼리 헬퍼 함수 (전역 함수 사용)
    const getVersion = window.__getVersion || (() => window.__modulesVersion || Date.now());
    
    (async () => {
      // 특수 경로는 즉시 종료 (Firebase Functions로 처리) - 가장 먼저 체크
      const specialPaths = ['/sitemap.xml', '/rss.xml', '/feed.xml'];
      const isSpecialPath = specialPaths.some(path => window.location.pathname === path);
      if (isSpecialPath) {
        // 특수 경로는 리다이렉트하지 않고 즉시 종료
        devLog.log('[index] 특수 경로 감지, 스크립트 실행 중단:', window.location.pathname);
        return;
      }
      
      // 관리자 페이지 경로에서는 실행하지 않음
      if(window.location.pathname.startsWith('/admin')){
        // 관리자 전용 HTML이 로드되어야 하는 구간이므로 루트 스크립트를 중단
        // console.log('관리자 페이지 경로 감지, index.html 스크립트 실행 중단');
        return;
      }
      
      // 도메인별 자동 site 파라미터 추가 (Firestore에서 로드)
      let domainSiteMap = {};
      try {
        // Firebase 초기화 대기
        let attempts = 0;
        while (!window.__fb && attempts < 50) {
          await new Promise(r => setTimeout(r, 100));
          attempts++;
        }
        
        const fb = window.__fb;
        if (fb?.db) {
          const { getDoc, doc } = await import('https://www.gstatic.com/firebasejs/10.12.2/firebase-firestore.js');
          const mappingDoc = await getDoc(doc(fb.db, 'admin', 'domainMapping'));
          if (mappingDoc.exists()) {
            domainSiteMap = mappingDoc.data() || {};
            devLog.log('[index] 도메인 매핑 로드:', domainSiteMap);
          }
        }
      } catch (e) {
        devLog.warn('[index] 도메인 매핑 로드 실패:', e);
        // 기본값 (폴백) - Firestore 로드 실패 시 하드코딩된 값 사용
        domainSiteMap = {
          'hongcheondts.com': 'hongcheon',
          'www.hongcheondts.com': 'hongcheon',
        };
      }
      
      const currentHost = window.location.hostname.toLowerCase();
      const params = new URLSearchParams(location.search);
      const currentSite = params.get('site');
      
      // 도메인에 매핑된 site가 있고, 현재 쿼리 파라미터에 site가 없으면 자동 추가
      if (domainSiteMap[currentHost] && !currentSite) {
        const mappedSite = domainSiteMap[currentHost];
        const newParams = new URLSearchParams(location.search);
        newParams.set('site', mappedSite);
        const newUrl = `${window.location.pathname}?${newParams.toString()}${window.location.hash}`;
        devLog.log(`[index] 도메인 매핑: ${currentHost} -> site=${mappedSite}, 리다이렉트`);
        window.location.replace(newUrl);
        return;
      }
      
      // 쿼리 파라미터를 즉시 확인 (일반 모드 실행 전에)
      const adminParam = params.get('admin');
      
      // about:blank 페이지에서는 아무것도 하지 않음
      if(location.href === 'about:blank' || location.protocol === 'about:'){
        devLog.log('[index] about:blank page, skipping initialization');
        return;
      }
      
      const initializeAdminPreviewMode = (siteId, logLabel = 'Admin preview mode initialized') => {
        if(window.__adminPreviewInitialized){
          return;
        }
        window.__adminPreviewInitialized = true;
        window.__siteId = siteId;
        document.body.classList.add('admin-preview');

        // 미리보기에서 링크 클릭 시 iframe이 해당 페이지로 이동하도록 처리 (쿼리형 + 경로형 모두)
        document.addEventListener('click', function adminPreviewNavClick(e) {
          const a = e.target.closest('a[href]');
          if(!a) return;
          const href = (a.getAttribute('href') || '').trim();
          if(!href || href.startsWith('#') || href.startsWith('javascript:')) return;
          if(a.target === '_blank' || a.hasAttribute('download')) return;
          try {
            const fullUrl = href.startsWith('http') ? href : (window.location.origin + (href.startsWith('/') ? href : '/' + href));
            const targetUrl = new URL(fullUrl);
            if(targetUrl.origin !== window.location.origin) return;
            e.preventDefault();
            // 이미 page= 또는 site= 가 있으면 admin=1만 보장
            if(href.indexOf('page=') !== -1 || href.indexOf('site=') !== -1){
              const search = targetUrl.searchParams;
              search.set('admin', '1');
              window.location.assign(targetUrl.pathname + '?' + search.toString() + (targetUrl.hash || ''));
              return;
            }
            // 경로형 링크 (예: /TKG/meditation/) -> ?site=...&page=...&admin=1 로 변환
            const pathSegments = targetUrl.pathname.replace(/^\/+|\/+$/g, '').split('/').filter(Boolean);
            const currentSite = (window.__siteId || '').toLowerCase() || 'tkg';
            let siteId = currentSite;
            let pageSlug = '';
            if(pathSegments.length >= 2){
              siteId = pathSegments[0].toLowerCase();
              pageSlug = pathSegments.slice(1).join('/');
            } else if(pathSegments.length === 1){
              pageSlug = pathSegments[0];
            }
            if(!pageSlug) return;
            const goUrl = window.location.origin + '/?site=' + encodeURIComponent(siteId) + '&page=' + encodeURIComponent(pageSlug) + '&admin=1';
            window.location.assign(goUrl);
          } catch(_) {}
        }, true);

        const applySpacingForSection = (element, section) => {
          if(!element || !section) return;
          const toNumber = (value, fallback = 0) => {
            const num = Number(value);
            return Number.isFinite(num) ? num : fallback;
          };
          const spacingTop = toNumber(section.spacingTop, toNumber(section.spacing, 0));
          const spacingBottom = toNumber(section.spacingBottom, 0);
          element.style.setProperty('margin-top', `${spacingTop}px`, 'important');
          element.style.setProperty('margin-bottom', `${spacingBottom}px`, 'important');
        };
        
        window.addEventListener('message', async (e) => {
          const msg = e.data;
          if(!msg || !msg.__ywam) return;
          
          if(msg.type === 'set'){
            const { page, sections = [], selectedIndex = -1 } = msg;
            devLog.log('[preview] Received sections data', { page, sectionsCount: sections.length, selectedIndex });
            
            try {
              const { renderSection, includePartial } = await import(`/js/sections.js?v=${getVersion()}`);
              const currentSite = (window.__siteId || 'tkg').toLowerCase();
              
              let useHomeStyle = true;
              let pageMeta = {};
              try {
                const { waitForFirebase, loadPageMeta, getFirstPageSlug } = await import(`/js/sections/firestore.js?v=${getVersion()}`);
                await waitForFirebase();
                const firstSlug = await getFirstPageSlug();
                if(page){
                  pageMeta = await loadPageMeta(page) || {};
                  const headerType = pageMeta.headerType || (page === firstSlug ? 'home' : 'subpage');
                  useHomeStyle = headerType === 'home' || page === firstSlug;
                } else {
                  useHomeStyle = true;
                }
              } catch(headerTypeError) {
                devLog.warn('헤더 타입 로드 실패:', headerTypeError);
                useHomeStyle = !page;
              }
              window.__pageHeaderType = useHomeStyle ? 'home' : 'subpage';
              
              let headerModule = null;
              let headerData = {};
              let seoData = {};
              try{
                headerModule = await import(`./js/sections/header.js?v=${getVersion()}`);
                headerData = await headerModule.loadHeaderData();
                if(headerModule.applySiteMeta){
                  headerModule.applySiteMeta(headerData);
                }
              }catch(headerModuleError){
                devLog.warn('헤더 모듈 로드 실패:', headerModuleError);
              }
              try{
                const seoModule = await import(`/js/sections/seo.js?v=${getVersion()}`);
                if(seoModule.loadSeoSettings){
                  seoData = await seoModule.loadSeoSettings();
                }
                if(seoModule.applySeoMeta){
                  seoModule.applySeoMeta(seoData, headerData, pageMeta, page || '');
                }
              }catch(seoError){
                devLog.warn('SEO 메타 적용 실패:', seoError);
              }
              
              const root = document.getElementById('page-root');
              if(!root) return;
              
              const headerHost = document.getElementById('site-header');
              if(headerHost){
                try {
                  const headerEl = await includePartial('section/header.html', {});
                  headerHost.innerHTML = '';
                  headerHost.appendChild(headerEl);
                  
                  if(headerModule){
                  if(headerData.logoUrl){
                    headerModule.applyHeaderLogo(headerEl, headerData.logoUrl, headerData.logoAlt);
                  }
                  if(headerModule.renderNavigation){
                      await headerModule.renderNavigation(currentSite);
                    }
                  }
                  headerEl.style.display = useHomeStyle ? '' : 'none';
                } catch(e) {
                  devLog.warn('헤더 렌더링 실패:', e);
                }
              }
              
              const previousTopbar = document.getElementById('topbar');
              if(previousTopbar && previousTopbar.parentElement){
                previousTopbar.parentElement.removeChild(previousTopbar);
              }
              try {
                const topbarEl = await includePartial('section/topbar.html', {});
                document.body.appendChild(topbarEl);
                
                if(headerModule && headerData.logoUrl) {
                  headerModule.applyTopbarLogo(headerData.logoUrl, headerData.logoAlt);
                }
                const topbarLogoLinks = document.querySelectorAll('#topbar a[href="/"]');
                topbarLogoLinks.forEach(link => {
                  link.href = `/?site=${currentSite}`;
                });
                
                // 네비게이션 메뉴 렌더링
                if(headerModule && headerModule.renderNavigation){
                  try {
                    const { waitForFirebase } = await import(`/js/sections/firestore.js?v=${getVersion()}`);
                    await waitForFirebase();
                    const { loadPages } = await import(`/js/sections/firestore.js?v=${getVersion()}`);
                    const pages = await loadPages(currentSite) || [];
                    headerModule.renderNavigation(pages, currentSite);
                  } catch(navError) {
                    devLog.warn('네비게이션 렌더링 실패:', navError);
                    // 에러 발생 시 빈 배열 전달 (하드코딩된 메뉴 표시 방지)
                    if(headerModule.renderNavigation){
                      headerModule.renderNavigation([], currentSite);
                    }
                  }
                }
                
                if(headerModule && headerModule.initTopbarDrawer){
                  headerModule.initTopbarDrawer();
                }
                if(headerModule && headerModule.initTopbarScrollToggle){
                  headerModule.initTopbarScrollToggle();
                }
                const topbar = document.getElementById('topbar');
                if(topbar){
                  if(useHomeStyle){
                    topbar.hidden = true;
                    topbar.classList.remove('visible');
                  } else {
                    topbar.hidden = false;
                    topbar.classList.add('visible');
                  }
                }
              } catch(topbarError) {
                devLog.warn('탑바 렌더링 실패:', topbarError);
              }
              
              const mainEl = document.querySelector('main');
              if(mainEl){
                mainEl.style.paddingTop = useHomeStyle ? '0' : 'var(--header-height, 80px)';
              }
              
              try {
                const { renderFooterForPreview } = await import(`./js/sections/footer.js?v=${getVersion()}`);
                await renderFooterForPreview();
              } catch(e) {
                devLog.warn('푸터 렌더링 실패:', e);
              }
              
              root.innerHTML = '';
              const frag = document.createDocumentFragment();
              
              for(let i = 0; i < sections.length; i++){
                const section = sections[i];
                const node = await renderSection(section);
                
                node.style.setProperty('position', 'relative', 'important');
                node.style.setProperty('cursor', 'pointer', 'important');
                node.style.setProperty('pointer-events', 'auto', 'important');
                node.dataset._idx = String(i);
                node.setAttribute('data-section-click-handler', 'true');
                applySpacingForSection(node, section);
                
                if(i === selectedIndex){
                  node.style.setProperty('outline', '2px solid #2c5aa0', 'important');
                  node.style.setProperty('outline-offset', '2px', 'important');
                }
                
                frag.appendChild(node);
              }
              
              root.appendChild(frag);
              
              if(sections.length === 0){
                const placeholder = document.createElement('div');
                placeholder.className = 'admin-preview-empty';
                placeholder.style.cssText = 'padding:60px 24px;text-align:center;color:#666;background:#f9fafb;border:1px dashed #e5e7eb;border-radius:12px;margin:24px;max-width:480px;margin-left:auto;margin-right:auto;';
                placeholder.innerHTML = '<p style="margin:0 0 8px;font-size:1.1rem;"><strong>섹션이 없습니다</strong></p><p style="margin:0;font-size:0.9rem;">왼쪽 패널에서 「섹션 추가」로 콘텐츠를 넣어보세요.</p>';
                root.appendChild(placeholder);
              }
              
              if(!root._delegationBound){
                root.addEventListener('click', (e) => {
                  const clickableElement = e.target.closest('a, button, input, select, textarea, [role="button"]');
                  if(clickableElement) return;
                  
                  const host = e.target.closest('[data-section-click-handler]');
                  if(!host) return;
                  
                  const idxStr = host.dataset._idx;
                  if(!idxStr) return;
                  
                  const idx = parseInt(idxStr, 10);
                  if(!Number.isFinite(idx) || idx < 0) return;
                  
                  try {
                    devLog.log('[preview] section click -> select', idx);
                    parent.postMessage({ __ywam: true, type: 'select', index: idx }, '*');
                  } catch(err) {
                    devLog.error('[preview] postMessage failed:', err);
                  }
                });
                root._delegationBound = true;
              }
              
            } catch(e) {
              devLog.error('[preview] 렌더링 실패:', e);
            }
          }
          
          if(msg.type === 'highlight'){
            const root = document.getElementById('page-root');
            if(!root) return;
            const idx = msg.index;
            Array.from(root.children).forEach((node, i) => {
              node.style.outline = (i === idx) ? '2px solid #2c5aa0' : 'none';
              const badge = node.querySelector('.__selected_badge');
              if(badge) badge.remove();
              if(i === idx){
                const b = document.createElement('div');
                b.className = '__selected_badge';
                b.textContent = '선택됨';
                b.style.cssText = 'position:absolute;top:6px;right:6px;background:#2c5aa0;color:#fff;font-size:12px;padding:3px 6px;border-radius:4px;pointer-events:none;';
                node.appendChild(b);
              }
            });
          }
          
          if(msg.type === 'reloadFooter'){
            devLog.log('[preview] Reloading footer');
            try {
              const { renderFooterForPreview } = await import(`./js/sections/footer.js?v=${getVersion()}`);
              await renderFooterForPreview();
              devLog.log('[preview] Footer reloaded');
            } catch(e) {
              devLog.error('[preview] Footer reload failed:', e);
            }
          }
        });
        
        (async () => {
          if(document.readyState === 'loading'){
            await new Promise(resolve => {
              if(document.readyState === 'loading'){
                document.addEventListener('DOMContentLoaded', resolve, { once: true });
              } else {
                resolve();
              }
            });
          }
          await new Promise(r => setTimeout(r, 100));
          try {
            parent.postMessage({ __ywam: true, type: 'ready' }, '*');
            devLog.info(`[index] ${logLabel}`);
          } catch(e) {
            devLog.error('[index] Failed to send ready message:', e);
          }
        })();
      };
        
      // 관리자 프리뷰 모드 - 가장 먼저 확인하여 일반 모드 로직이 실행되지 않도록 함
      if(adminParam === '1' || adminParam === 'true'){
        devLog.info('[index] Admin preview mode detected', { 
          admin: adminParam, 
          site: params.get('site'), 
          page: params.get('page'),
          fullSearch: location.search 
        });
        const siteId = (params.get('site') || 'tkg').toLowerCase();
        initializeAdminPreviewMode(siteId, 'Admin preview mode initialized, ready message sent');
        return;
      }
      
      const hasQueryParams = !!location.search && location.search !== '';
      let runningInIframe = false;
      try{
        runningInIframe = window.self !== window.top;
      }catch(e){
        devLog.log('[index] Cross-origin check failed, skipping initialization');
        return;
      }
      
      if(!hasQueryParams){
        if(runningInIframe){
          devLog.log('[index] Running inside iframe without query parameters, initializing admin preview mode');
          const siteId = (params.get('site') || 'tkg').toLowerCase();
          initializeAdminPreviewMode(siteId, 'Admin preview mode initialized (no query params), ready message sent');
          return;
        }
        devLog.log('[index] No query parameters, skipping initialization');
        return;
      }
      
      if(!adminParam && runningInIframe){
        devLog.log('[index] Running inside iframe without admin parameter, initializing admin preview mode');
        const siteId = (params.get('site') || 'tkg').toLowerCase();
        initializeAdminPreviewMode(siteId, 'Admin preview mode initialized (iframe detected), ready message sent');
        return;
      }
      
      // 일반 모드: 쿼리 파라미터에서 site와 page 읽기
      devLog.log('[index] Normal mode', { 
        admin: adminParam, 
        site: params.get('site'), 
        page: params.get('page'),
        fullSearch: location.search 
      });
      let siteId = (params.get('site') || 'tkg').toLowerCase();
      let pagePath = params.get('page') || '';
      window.__siteId = siteId;
      
      // pagePath가 비어있으면 순서상 첫 페이지(홈)로 리다이렉트
      if(!pagePath || pagePath === 'home'){
        const { waitForFirebase, getFirstPageSlug } = await import(`/js/sections/firestore.js?v=${getVersion()}`);
        await waitForFirebase();
        const firstSlug = await getFirstPageSlug();
        if(firstSlug){
          window.location.replace(`/?site=${siteId}&page=${firstSlug}`);
          return;
        }
        // 첫 페이지가 없으면 빈 페이지로 렌더링 (안내 메시지 표시)
        if(!firstSlug){
          const root = document.getElementById('page-root');
          if(root){
            root.innerHTML = `
              <div style="padding: 60px 20px; text-align: center; max-width: 600px; margin: 0 auto;">
                <h1 style="font-size: 2rem; margin-bottom: 1rem; color: #1e3a5f;">사이트가 준비되지 않았습니다</h1>
                <p style="font-size: 1.1rem; color: #666; margin-bottom: 2rem; line-height: 1.6;">
                  이 사이트에는 아직 페이지가 없습니다.<br>
                  관리자 페이지에서 페이지를 추가해주세요.
                </p>
                <a href="/admin/?site=${siteId}" style="display: inline-block; padding: 12px 24px; background: #0ea5e9; color: white; text-decoration: none; border-radius: 8px; font-weight: 500;">
                  관리자 페이지로 이동
                </a>
              </div>
            `;
          }
          return;
        }
        pagePath = firstSlug;
      }
      // 부모 페이지에 하위가 있으면 첫 번째 하위 내용을 보여주되, 주소는 부모 그대로 유지
      const { waitForFirebase, resolveToDisplayPageSlug } = await import(`/js/sections/firestore.js?v=${getVersion()}`);
      await waitForFirebase();
      const displaySlug = await resolveToDisplayPageSlug(pagePath, siteId);
      const { showLoadingOrb, hideLoadingOrb } = await import(`/js/loadingOrb.js?v=${getVersion()}`);
      const LOADING_MAX_MS = 4000;
      showLoadingOrb();
      try {
        const m = await import(`/js/sections.js?v=${getVersion()}`);
        const renderPromise = m.renderPage ? m.renderPage(displaySlug || pagePath) : Promise.resolve();
        const maxWait = new Promise((r) => setTimeout(r, LOADING_MAX_MS));
        await Promise.race([renderPromise, maxWait]);
      } finally {
        hideLoadingOrb();
      }
    })().catch((e) => {
      devLog.warn('[index] 초기화 실패:', e);
    });
  </script>
</body>
</html>
