<?php
// ============================================================================
//  882.kr 메인 — 한별 드라이버 센터 (2026-08-17 재작성, 디자인 D: 한별 별 하나 + 카탈로그)
//  URL 계약(유지): ?code=파일명 | 폴더/파일 | 딸깍설치/ID | 설정파일 (JSON)/ID | ID  → 다운로드
// ============================================================================
require_once __DIR__ . '/lib.php';

// ── 다운로드 핸들러 ──
$code = isset($_GET['code']) ? trim((string)$_GET['code'], '/') : '';
if ($code !== '' && strtolower($code) !== 'index.php') {
    if (($path = hb_resolve_file($code)) !== null) { hb_stream_file($path); exit; }
    if (hb_is_legacy_setup_code($code)) { // 구 OJSETUP 딸깍설치 링크 → 안내
        http_response_code(410); hb_head('딸깍설치 안내'); hb_nav();
        echo '<div class="wrap"><h2>이 자동설치 링크는 새 방식으로 바뀌었습니다</h2><p class="lead">예전 자동설치(구 방식, 코드 <span class="mono">' . e($code) . '</span>)는 2026년 8월 17일부로 종료되었습니다. 이제는 <b>딸깍P드라이버</b>가 프린터를 자동으로 찾아 설치합니다 — 아래에서 받아 실행해 주세요.</p>';
        $f0 = hb_scan()['root'][0] ?? null; if ($f0 && $f0['featured']) echo '<a class="btn" href="/?code=' . rawurlencode($f0['code']) . '">🖨 딸깍P드라이버 다운로드</a> ';
        echo '<a class="btn ghost" href="/setup/">새 딸깍설치 안내 →</a><p class="tip" style="margin-top:14px">문의: ' . e(HB_CONTACT) . '</p></div>'; hb_foot(); exit;
    }
    http_response_code(404);
    hb_head('파일 없음'); hb_nav();
    echo '<div class="wrap"><h2>요청한 파일을 찾을 수 없습니다</h2><p class="lead">주소를 다시 확인해 주세요: <span class="mono">' . e($code) . '</span></p><a class="btn" href="/">홈으로</a></div>'; hb_foot(); exit;
}

// ── 관리자(보안 폴더·삭제 등) 로그인/로그아웃 ──
if (isset($_POST['hb_login'])) {
    if (ADMIN_PASSWORD !== '' && hash_equals(ADMIN_PASSWORD, (string)($_POST['pw'] ?? ''))) setcookie('admin_auth', ADMIN_PASSWORD, ['expires' => time() + 1800, 'path' => '/', 'httponly' => true, 'samesite' => 'Lax']);
    header('Location: /' . (hb_embed() ? '?embed=1' : '')); exit;
}
if (isset($_GET['logout'])) { setcookie('admin_auth', '', ['expires' => 1, 'path' => '/']); header('Location: /'); exit; }

$d = hb_scan();
$root = $d['root']; $featured = null; $others = [];
foreach ($root as $m) { if ($m['featured'] && !$featured) $featured = $m; else $others[] = $m; }
// 딸깍P카운터: 설치기(_설치.exe)를 대표로, 포터블 ZIP 은 보조 링크
$counter = null; $counterZip = null;
foreach ($others as $i => $m) {
    if (mb_stripos($m['name'], '딸깍P카운터_설치') === 0) { $counter = $m; unset($others[$i]); }
    elseif (mb_stripos($m['name'], '딸깍P카운터') === 0) { $counterZip = $m; unset($others[$i]); }
}
if (!$counter && $counterZip) { $counter = $counterZip; $counterZip = null; }
$others = array_values($others);
$notices = $d['notices'];
$glyph = ['교세라' => 'K', '브라더' => 'B', '삼성' => 'S', '엡손' => 'E', 'HP' => 'HP', '시놀로지나스' => 'N', '유틸' => 'U'];
$brandLabel = ['시놀로지나스' => '시놀로지 NAS', '유틸' => '유틸리티'];
$total = count($root); foreach ($d['folders'] as $f) $total += count($f['items']);

hb_head('홈', <<<CSS
.hero-in{max-width:1100px;margin:0 auto;padding:46px 22px 96px;position:relative;z-index:1;display:grid;grid-template-columns:1.1fr .9fr;gap:36px;align-items:center}
.hero .eyebrow{color:var(--blue-light);margin-bottom:12px}
.hero h1{margin:0 0 12px;font-size:38px;line-height:1.18;letter-spacing:-.02em;text-wrap:balance;font-weight:900}.hero h1 em{font-style:normal;color:var(--star)}
.hero p{margin:0 0 22px;color:rgba(255,255,255,.82);max-width:46ch;font-size:15px}
.hero .actions{display:flex;gap:10px;flex-wrap:wrap}
.hero .primary{background:#fff;color:var(--primary);padding:12px 20px;border-radius:12px;font-weight:900;font-size:15px;box-shadow:0 12px 30px rgba(0,0,0,.18)}
.hero .ghost{border:1.5px solid rgba(255,255,255,.35);color:#fff;padding:11px 18px;border-radius:12px;font-weight:700}
.hero .sub{margin-top:14px;font-size:12.5px;color:rgba(255,255,255,.75)}.hero .sub b{color:#9BE7BC}
.starcard{background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.18);border-radius:18px;padding:22px;backdrop-filter:blur(6px)}
.hero-right{display:flex;flex-direction:column;gap:12px}
.starcard.famcard{padding:16px 18px 12px}
.starcard .fam{display:flex;justify-content:space-around;gap:8px;margin:0}
.starcard .fam .fi{background:none;border:0;cursor:pointer;display:flex;flex-direction:column;align-items:center;gap:5px;font-size:11.5px;color:rgba(255,255,255,.85);font-weight:700;text-align:center;padding:6px 8px;border-radius:12px;transition:transform .15s,background .15s;font-family:inherit}
.starcard .fam .fi:hover{transform:translateY(-3px);color:#fff}.starcard .fam .fi.on{background:rgba(255,255,255,.14);color:#fff}
.starcard .fam img{width:64px;height:64px;object-fit:contain;filter:drop-shadow(0 6px 14px rgba(0,0,0,.35))}
.fdesc{margin-top:8px;border-top:1px solid rgba(255,255,255,.14);padding-top:10px;min-height:52px}
.fd{display:none;font-size:13px;color:rgba(255,255,255,.88)}.fd.on{display:block}.fd b{display:block;font-size:14px;color:#fff;margin-bottom:3px}.fd p{margin:0 0 8px;line-height:1.55}.fd .fhint{color:rgba(255,255,255,.6);text-align:center;margin:8px 0 2px}
.fbtn{display:inline-block;background:#fff;color:var(--primary);padding:6px 12px;border-radius:8px;font-weight:800;font-size:12.5px}.fbtn.ghost{background:transparent;color:#fff;border:1.5px solid rgba(255,255,255,.4)}
@media (max-width:520px){.starcard .fam{gap:4px}.starcard .fam img{width:50px;height:50px}.starcard .fam .fi{font-size:10px;padding:4px}}
.starcard h3{margin:0 0 4px;text-align:center;font-size:16px;color:#fff}.starcard p{margin:0 0 14px;text-align:center;color:rgba(255,255,255,.75);font-size:13px}
.starcard .search{display:flex;align-items:center;gap:8px;background:#fff;border-radius:10px;padding:11px 13px;color:#06304A}
.starcard .search input{flex:1;background:none;border:0;outline:0;color:#06304A;font-size:14px;min-width:0}
.starcard .search .qbtn{background:var(--primary);color:#fff;border:0;border-radius:8px;padding:8px 14px;font-weight:800;font-size:13px;cursor:pointer}.starcard .search .qbtn:hover{background:#0A4E72}
.qres{display:none;background:var(--paper);border:1px solid var(--line);border-left:4px solid var(--blue);border-radius:12px;padding:12px 16px;margin:0 0 20px;align-items:center;gap:12px;flex-wrap:wrap}.qres.on{display:flex}.qres b{font-size:15px}.qres .n{color:var(--mute)}.qres .clr{margin-left:auto;font-weight:800;color:var(--blue);cursor:pointer;background:none;border:0;font-size:13px}
body.searching .hidden-by-search{display:none !important}body.searching .sec-hide{display:none !important}
.starcard .hint{margin-top:10px;display:flex;gap:6px;flex-wrap:wrap;justify-content:center}.starcard .hint span{font-size:11.5px;border:1px solid rgba(255,255,255,.25);border-radius:999px;padding:3px 9px;color:rgba(255,255,255,.8);cursor:pointer}
body.embed .hero-in{padding:26px 22px 70px}
.notice{margin:-40px auto 34px;background:var(--paper);border:1px solid var(--line);border-radius:14px;padding:14px 18px;display:flex;gap:14px;align-items:center;box-shadow:0 14px 34px rgba(6,53,79,.10);position:relative;flex-wrap:wrap}
.notice .st{color:var(--star);font-size:18px}.notice b{font-size:14px}.notice small{color:var(--mute)}.notice .more{margin-left:auto;font-weight:800;color:var(--blue);white-space:nowrap}
.notice-list{display:none;width:100%;border-top:1px solid var(--line);margin-top:8px;padding-top:8px;font-size:13px}.notice.open .notice-list{display:block}.notice-list a{display:flex;gap:10px;padding:5px 0}.notice-list a span{color:var(--mute);margin-left:auto;white-space:nowrap}
.cards{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
.pcard{display:flex;flex-direction:column;gap:8px;transition:transform .15s,box-shadow .15s}.pcard:hover{transform:translateY(-3px);box-shadow:0 14px 34px rgba(6,53,79,.12)}
.pcard.lead-card{border-color:var(--blue);background:linear-gradient(160deg,var(--paper) 55%,var(--blue-soft))}
.pcard .k{color:var(--blue)}.pcard h3{margin:0;font-size:17px;display:flex;align-items:center;gap:9px}.pcard h3 .pic{width:36px;height:36px;object-fit:contain;filter:drop-shadow(0 3px 6px rgba(6,53,79,.18))}.pcard p{margin:0;color:var(--mute);font-size:13px;flex:1;display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}
.pcard .m{display:flex;gap:10px;font-size:12px;color:var(--mute);align-items:center;flex-wrap:wrap}.pcard .m .ok{color:var(--ok);font-weight:700}.pcard .m .btn{margin-left:auto}
.brands{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}
.brand{background:var(--paper);border:1px solid var(--line);border-radius:12px;padding:16px 16px 14px;position:relative;overflow:hidden;min-height:112px;transition:border-color .15s,transform .15s;cursor:pointer;display:block}
.brand:hover,.brand.on{border-color:var(--blue);transform:translateY(-2px)}
.brand .glyph{position:absolute;right:-6px;top:-18px;font-size:92px;font-weight:900;letter-spacing:-.06em;color:var(--blue-soft);line-height:1;user-select:none}
.brand h3{margin:0;font-size:16px;position:relative}.brand small{display:block;color:var(--mute);font-size:12px;position:relative;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.brand .n{position:absolute;left:16px;bottom:12px;font-size:12px;color:var(--blue);font-weight:700}
.sheet{display:none;margin-top:16px}.sheet.on{display:block}
tbody td.n{width:96px;text-align:right}tbody td.d{width:92px;color:var(--mute)}tbody td.a{width:96px;text-align:right}
.help{display:grid;grid-template-columns:1fr 1fr 1fr;gap:16px}.help .h b{display:block;font-size:15px;margin-bottom:4px}.help .h p{margin:0;color:var(--mute);font-size:13px}.help .h .l{display:inline-block;margin-top:10px;font-weight:800;color:var(--blue)}
.admin{position:fixed;left:8px;top:8px;width:14px;height:14px;opacity:.15;cursor:pointer;color:var(--star);font-size:14px;z-index:9;line-height:1}.admin:hover{opacity:1}
#pwbox{display:none;position:fixed;inset:0;background:rgba(0,0,0,.4);z-index:20;align-items:center;justify-content:center}#pwbox.on{display:flex}#pwbox form{background:var(--paper);border-radius:14px;padding:22px;width:320px;max-width:92vw}
.hidden-by-search{display:none !important}
@media (max-width:900px){.hero-in{grid-template-columns:1fr;padding:34px 22px 80px}.hero h1{font-size:31px}.cards,.help{grid-template-columns:1fr}.brands{grid-template-columns:repeat(2,1fr)}}
@media (max-width:520px){.hero h1{font-size:26px}.notice{margin-top:-30px;padding:12px 14px}.notice .more{margin-left:0}.hero-in{padding:26px 14px 70px}.starcard{padding:16px}.cards{gap:12px}.pcard{padding:16px}.brands{gap:10px}}
CSS);
?>
<div class="hero">
  <?php hb_nav('home'); ?>
  <div class="hero-in">
    <div>
      <div class="eyebrow">Hanbyeol Driver Center · Since 2008</div>
      <h1>프린터 설치,<br><em>딸깍</em> 한 번이면 됩니다.</h1>
      <p>한별시스템 거래처를 위한 드라이버·프로그램 배포 센터입니다. 딸깍P드라이버가 프린터를 찾아 드라이버를 자동으로 설치하고, 스캔과 카운터까지 정리해 드립니다.</p>
      <div class="actions">
        <?php if ($featured): ?><a class="primary" href="/?code=<?= rawurlencode($featured['code']) ?>">🖨 딸깍P드라이버 다운로드<?php $fv0 = hb_file_version($HB_ROOT . '/' . HB_FILES . '/' . $featured['code']); echo $fv0 ? ' <span style="opacity:.75;font-weight:700">v' . e($fv0) . '</span>' : ''; ?></a><?php endif; ?>
        <?php foreach ($notices as $n) if (mb_stripos($n['name'], '사용설명서') !== false && mb_stripos($n['name'], '드라이버') !== false) { echo '<a class="ghost" href="/?code=' . rawurlencode($n['code']) . '">사용설명서</a>'; break; } ?>
      </div>
      <?php if ($featured): $fv = hb_file_version($HB_ROOT . '/' . HB_FILES . '/' . $featured['code']); ?><div class="sub"><b>✔ 정식 코드서명</b> · 게시자 HANBYEOLSYSTEM<?= $fv ? ' · <b style="color:#FFD166">v' . e($fv) . '</b>' : '' ?> · <?= e($featured['size']) ?> · <?= e($featured['date']) ?> · 받는 파일: <span class="mono"><?= e(hb_download_name($HB_ROOT . '/' . HB_FILES . '/' . $featured['code'])) ?></span></div><?php endif; ?>
    </div>
    <div class="hero-right">
      <div class="starcard famcard">
        <?php $famD = $featured ? '/?code=' . rawurlencode($featured['code']) : '#'; $famC = $counter ? '/?code=' . rawurlencode($counter['code']) : '#'; ?>
        <div class="fam">
          <button type="button" class="fi" data-k="driver"><img src="/brand/icon-driver.png" alt=""><span>딸깍P드라이버</span></button>
          <button type="button" class="fi" data-k="scan"><img src="/brand/icon-scan.png" alt=""><span>딸깍P스캔</span></button>
          <button type="button" class="fi" data-k="counter"><img src="/brand/icon-counter.png" alt=""><span>딸깍P카운터</span></button>
          <button type="button" class="fi" data-k="setup"><img src="/brand/icon-setup.png" alt=""><span>딸깍설치</span></button>
        </div>
        <div class="fdesc" id="fdesc">
          <?php $pdf = fn($n) => '/?code=' . rawurlencode('공지사항/' . $n); ?>
          <div class="fd" data-k="driver"><b>딸깍P드라이버</b><p>네트워크와 USB의 프린터를 스스로 찾아내어, 기종에 맞는 드라이버를 판별하고 설치까지 마무리하는 통합 프린터 관리 도구입니다. 컬러·흑백·팩스 큐를 한 번에 구성하고, 설치 이후의 상태 확인·테스트 인쇄·인쇄 오류 복구까지 한 화면에서 이어집니다.</p><a class="fbtn" href="<?= e($pdf('딸깍P드라이버_사용설명서.pdf')) ?>">사용법 PDF</a></div>
          <div class="fd" data-k="scan"><b>딸깍P스캔</b><p>복합기와 스캐너를 드라이버 설치 없이 바로 연결하여 문서를 PDF·JPG로 담아내는 스캔 도구입니다. 자주 쓰는 스캐너를 기억해 두면 다음부터는 원고를 올리고 [스캔 시작]만 누르면 되며, 내 PC·공유폴더·FTP 어디로든 저장하고 복사기에서 보내는 스캔도 받아 정리합니다.</p><a class="fbtn" href="<?= e($pdf('딸깍P스캔_사용법.pdf')) ?>">사용법 PDF</a></div>
          <div class="fd" data-k="counter"><b>딸깍P카운터</b><p>고객사 PC에 조용히 상주하며 프린터의 인쇄 매수를 주기적으로 읽어 정산 서버로 전달하는 수집 프로그램입니다. 페어링 코드 한 번으로 소속 업체에 연결되고, 이후에는 별도 조작 없이 자동으로 동작합니다.</p><a class="fbtn" href="<?= e($pdf('딸깍P카운터_사용설명서.pdf')) ?>">사용법 PDF</a></div>
          <div class="fd" data-k="setup"><b>딸깍설치</b><p>한 번 완성한 프린터 구성을 거래처 이름으로 서버에 저장해 두고, 다음 PC에서는 거래처를 검색해 불러오는 것만으로 같은 구성을 재현하는 기능입니다. 프린터 이름·컬러/흑백/팩스·양면·기본 프린터 설정이 그대로 복원되며, IP가 달라져도 같은 기종을 찾아 스스로 맞춥니다.</p><a class="fbtn" href="<?= e($pdf('딸깍설치_사용법.pdf')) ?>">사용법 PDF</a></div>
          <div class="fd on" data-k="none"><p class="fhint">아이콘을 누르면 기능 설명이 나옵니다.</p></div>
        </div>
      </div>
      <div class="starcard">
        <h3>필요한 파일을 바로 찾기</h3>
        <p>모델명 · 브랜드 · 파일명 무엇이든 (전체 <?= $total ?>개)</p>
        <form class="search" id="qform">🔎 <input id="q" placeholder="예: M5526cdn, 브라더, KX" autocomplete="off"><button type="submit" class="qbtn">검색</button></form>
        <div class="hint"><span>교세라</span><span>삼성</span><span>엡손</span><span>시놀로지</span></div>
      </div>
    </div>
  </div>
</div>

<div class="wrap">
  <?php if ($notices): $n0 = $notices[0]; ?>
  <div class="notice" id="notice"><span class="st">📢</span><div><b><?= e($n0['desc'] ?: $n0['name']) ?></b></div>
    <a class="more" href="/?code=<?= rawurlencode($n0['code']) ?>">안내문 →</a>
    <?php if (count($notices) > 1): ?><a class="more" href="#" id="nmore" style="margin-left:8px">공지 <?= count($notices) ?>건 ▾</a>
    <div class="notice-list"><?php foreach ($notices as $n): ?><a href="/?code=<?= rawurlencode($n['code']) ?>">• <?= e($n['desc'] ?: $n['name']) ?><span><?= e($n['date']) ?></span></a><?php endforeach; ?></div><?php endif; ?>
  </div>
  <?php endif; ?>

  <div class="qres" id="qres"><b>🔎 "<span id="qword"></span>" 검색 결과</b> <span class="n" id="qcount"></span><button class="clr" id="qclear">✕ 전체 보기</button></div>

  <h2>주요 프로그램</h2>
  <p class="lead">현장에서 가장 자주 쓰는 것. 딸깍P 제품은 모두 한별시스템 서명 파일입니다.</p>
  <div class="cards" id="programs">
    <?php if ($featured): ?>
    <div class="card pcard lead-card" data-s="<?= e(mb_strtolower($featured['name'] . ' ' . $featured['desc'])) ?>"><span class="eyebrow k">추천 · 자동 설치</span><h3><img class="pic" src="/brand/icon-driver.png" alt="">딸깍P드라이버</h3><p><?= e($featured['desc'] ?: '프린터 자동 탐지·설치·스캔·카운터') ?></p><div class="m"><span class="ok">✔ 서명</span><span class="mono"><?= $fv ? 'v' . e($fv) . ' · ' : '' ?><?= e($featured['size']) ?></span><a class="btn" href="/?code=<?= rawurlencode($featured['code']) ?>" title="<?= e(hb_download_name($HB_ROOT . '/' . HB_FILES . '/' . $featured['code'])) ?>">다운로드<?= $fv ? ' v' . e($fv) : '' ?></a></div></div>
    <?php endif; if ($counter): ?>
    <div class="card pcard" data-s="<?= e(mb_strtolower($counter['name'] . ' ' . $counter['desc'] . ($counterZip ? ' ' . $counterZip['name'] : ''))) ?>"><span class="eyebrow k">고객 PC · 설치 프로그램</span><h3><img class="pic" src="/brand/icon-counter.png" alt="">딸깍P카운터</h3><p>고객 PC 카운터 수집기. 설치하면 <b>프로그램 추가/제거</b>에 등록되고 로그온 시 자동 실행됩니다. 페어링 코드로 업체 자동 연결.<?php if ($counterZip): ?> <a href="/?code=<?= rawurlencode($counterZip['code']) ?>" style="color:var(--mute);text-decoration:underline">포터블 ZIP</a>도 있습니다.<?php endif; ?></p><?php $cv = hb_file_version($HB_ROOT . '/' . HB_FILES . '/' . $counter['code']); ?><div class="m"><span class="ok">✔ 서명</span><span class="mono"><?= $cv ? 'v' . e($cv) . ' · ' : '' ?><?= e($counter['size']) ?></span><a class="btn" href="/?code=<?= rawurlencode($counter['code']) ?>">설치 다운로드<?= $cv ? ' v' . e($cv) : '' ?></a></div></div>
    <?php endif; ?>
    <div class="card pcard" data-s="딸깍설치 setup 거래처 프로필 자동설치"><span class="eyebrow k">거래처 프로필</span><h3><img class="pic" src="/brand/icon-setup.png" alt="">딸깍설치</h3><p>거래처마다 저장한 프린터 구성을 딸깍P드라이버가 검색해 한 번에 설치합니다. 첫 방문에 [거래처로 저장], 다음 PC 에선 [거래처 불러오기] → [선택 설치].</p><div class="m"><span class="mono">v1.5.0+</span><a class="btn" href="/setup/">저장된 거래처 보기</a></div></div>
    <?php foreach ($others as $m): if (mb_stripos($m['name'], 'OJSETUP') === 0) continue; ?>
    <div class="card pcard" data-s="<?= e(mb_strtolower($m['name'] . ' ' . $m['desc'])) ?>"><span class="eyebrow k">프로그램</span><h3><?= e(preg_replace('/\.[^.]+$/', '', $m['name'])) ?></h3><p><?= e($m['desc']) ?></p><div class="m"><span class="mono"><?= e($m['size']) ?> · <?= e($m['date']) ?></span><a class="btn" href="/?code=<?= rawurlencode($m['code']) ?>">다운로드</a></div></div>
    <?php endforeach; ?>
  </div>

  <h2>브랜드별 드라이버</h2>
  <p class="lead">딸깍P가 못 잡는 특수 모델이나 원본 파일이 필요할 때. 브랜드를 누르면 파일 명세가 펼쳐집니다.</p>
  <div class="brands" id="brands">
    <?php foreach ($d['folders'] as $i => $f): $t = $f['title']; $names = array_map(fn($x) => preg_replace('/\.[^.]+$/', '', $x['name']), $f['items']); ?>
    <a class="brand" data-t="b<?= $i ?>" data-s="<?= e(mb_strtolower($t . ' ' . ($brandLabel[$t] ?? '') . ' ' . implode(' ', array_map(fn($x) => $x['name'] . ' ' . $x['desc'], $f['items'])))) ?>"><span class="glyph"><?= e($glyph[$t] ?? mb_substr($t, 0, 1)) ?></span><h3><?= e($brandLabel[$t] ?? $t) ?></h3><small><?= e(implode(' · ', array_slice($names, 0, 4))) ?></small><span class="n"><?= count($f['items']) ?>개 파일</span></a>
    <?php endforeach; ?>
  </div>

  <?php foreach ($d['folders'] as $i => $f): ?>
  <div class="sheet" id="b<?= $i ?>"><h2 class="sec"><?= e($brandLabel[$f['title']] ?? $f['title']) ?> — 파일 명세</h2><div class="tw"><table><thead><tr><th>파일</th><th style="text-align:right">크기</th><th>날짜</th><th></th></tr></thead><tbody>
    <?php foreach ($f['items'] as $m): ?><tr data-s="<?= e(mb_strtolower($m['name'] . ' ' . $m['desc'])) ?>"><td class="file"><b><?= e($m['name']) ?></b><?php if ($m['desc']): ?><small><?= e($m['desc']) ?></small><?php endif; ?></td><td class="n mono"><?= e($m['size']) ?></td><td class="d mono"><?= e($m['date']) ?></td><td class="a"><a class="dl" href="/?code=<?= rawurlencode($m['code']) ?>">받기</a></td></tr><?php endforeach; ?>
  </tbody></table></div></div>
  <?php endforeach; ?>

  <h2>도움이 필요하면</h2>
  <div class="help">
    <div class="card h"><b>🛠 드라이버/에러 지원요청</b><p>설치가 안 되거나 오류가 뜨면 사진과 함께 올려 주세요. 한별시스템이 답변합니다.</p><a class="l" href="/board.php">게시판 열기 →</a></div>
    <div class="card h"><b>📋 자동지원 모델표</b><p>딸깍P드라이버가 자동으로 잡는 모델을 제조사별로 확인.</p><a class="l" href="/models.php">모델표 보기 →</a></div>
    <div class="card h"><b>📞 <?= e(HB_CONTACT) ?></b><p>평일 09:00–18:00. 급한 현장은 전화가 가장 빠릅니다.</p><a class="l" href="/createzip/5per.php">📊 5% 밀도 확인 →</a></div>
  </div>
</div>
<?php if (!hb_embed()): ?>
<span class="admin" id="adminDot" title="관리자">✦</span>
<div id="pwbox"><form method="post"><b>관리자</b><label class="l">비밀번호</label><input class="f" type="password" name="pw" autofocus><div style="display:flex;gap:8px;margin-top:12px"><button class="btn" name="hb_login" value="1">확인</button><button class="btn ghost" type="button" id="pwclose">닫기</button><?php if (hb_is_admin()): ?><a class="btn ghost" href="/?logout=1" style="margin-left:auto">로그아웃</a><?php endif; ?></div></form></div>
<?php endif; ?>
<script>
(function(){
  var q=document.getElementById('q'), sheets=[].slice.call(document.querySelectorAll('.sheet')), brands=[].slice.call(document.querySelectorAll('.brand'));
  function open(t){ brands.forEach(function(b){b.classList.toggle('on',b.dataset.t===t)}); sheets.forEach(function(s){s.classList.toggle('on',s.id===t)}); var el=document.getElementById(t); if(el) el.scrollIntoView({behavior:'smooth',block:'start'}); }
  brands.forEach(function(b){ b.addEventListener('click',function(e){ e.preventDefault(); var t=b.dataset.t; if(b.classList.contains('on')){b.classList.remove('on');document.getElementById(t).classList.remove('on');} else open(t); }); });
  var norm=function(s){return (s||'').toLowerCase().replace(/\s+/g,'')};
  var qres=document.getElementById('qres'), qword=document.getElementById('qword'), qcount=document.getElementById('qcount');
  // 섹션 단위: 결과가 없는 섹션(h2 + 그 다음 형제 블록들)은 통째로 숨긴다
  function sectionOf(el){ var h=el; while(h && !(h.tagName==='H2' && !h.classList.contains('sec'))) h=h.previousElementSibling; return h; }
  function search(){
    var v=norm(q.value); var items=document.querySelectorAll('[data-s]');
    document.querySelectorAll('.sec-hide').forEach(function(x){x.classList.remove('sec-hide')});
    if(!v){ document.body.classList.remove('searching'); qres.classList.remove('on'); items.forEach(function(x){x.classList.remove('hidden-by-search')}); sheets.forEach(function(s){ if(!brands.some(function(b){return b.dataset.t===s.id&&b.classList.contains('on')})) s.classList.remove('on'); }); return; }
    var hit=0;
    items.forEach(function(x){ var ok=norm(x.dataset.s).indexOf(v)>=0; x.classList.toggle('hidden-by-search',!ok); if(ok && x.tagName!=='A') hit++; if(ok && x.tagName==='A' && x.classList.contains('brand')) hit++; });
    // 브랜드 명세 시트: 매칭 행이 있으면 펼침, 없으면 숨김. 브랜드 타일은 결과 모드에서 숨기고 시트로 보여준다.
    sheets.forEach(function(s){ var rows=s.querySelectorAll('tr[data-s]:not(.hidden-by-search)'); s.classList.toggle('on',rows.length>0); s.classList.toggle('sec-hide',rows.length===0); });
    var brandsGrid=document.getElementById('brands'); brandsGrid.classList.add('sec-hide');
    // 카드 섹션(주요 프로그램)·도움말: 카드에 매칭 없으면 숨김
    var progs=document.getElementById('programs'); var pv=progs.querySelectorAll('.pcard:not(.hidden-by-search)').length; 
    document.querySelectorAll('.wrap > h2:not(.sec), .wrap > p.lead, .wrap > .help, .wrap > .notice').forEach(function(x){ x.classList.add('sec-hide'); });
    if(pv>0){ var h=sectionOf(progs); if(h){ h.classList.remove('sec-hide'); if(h.nextElementSibling&&h.nextElementSibling.classList.contains('lead')) h.nextElementSibling.classList.remove('sec-hide'); } } else progs.classList.add('sec-hide');
    var rowsHit=0; sheets.forEach(function(s){ rowsHit+=s.querySelectorAll('tr[data-s]:not(.hidden-by-search)').length; });
    document.body.classList.add('searching'); qres.classList.add('on'); qword.textContent=q.value.trim(); qcount.textContent='— 파일 '+rowsHit+'개'+(pv?' · 프로그램 '+pv+'개':'')+(rowsHit+pv===0?' · 결과 없음. 다른 단어로 검색해 보세요':'');
    qres.scrollIntoView({behavior:'smooth',block:'start'});
  }
  document.getElementById('qform').addEventListener('submit',function(e){ e.preventDefault(); search(); });
  document.getElementById('qclear').addEventListener('click',function(){ q.value=''; search(); q.focus(); });
  document.querySelectorAll('.starcard .hint span').forEach(function(h){ h.addEventListener('click',function(){ q.value=h.textContent; search(); }); });
  document.querySelectorAll('.fam .fi').forEach(function(b){ b.addEventListener('click',function(){ var k=b.dataset.k, was=b.classList.contains('on');
    document.querySelectorAll('.fam .fi').forEach(function(x){x.classList.remove('on')}); document.querySelectorAll('.fd').forEach(function(x){x.classList.remove('on')});
    if(was){ document.querySelector('.fd[data-k=none]').classList.add('on'); return; }
    b.classList.add('on'); var d=document.querySelector('.fd[data-k='+k+']'); if(d) d.classList.add('on'); }); });
  var nm=document.getElementById('nmore'); if(nm){ nm.addEventListener('click',function(e){ e.preventDefault(); document.getElementById('notice').classList.toggle('open'); }); }
  var dot=document.getElementById('adminDot'), box=document.getElementById('pwbox'); if(dot){ dot.addEventListener('click',function(){box.classList.add('on')}); document.getElementById('pwclose').addEventListener('click',function(){box.classList.remove('on')}); }
})();
</script>
<?php hb_foot(); ?>
