<?php
// 버전 : 2.3.0 이미0개적용 1개적용 버튼 하단으로 이동. 
// 버번 : 2.3.1 상단 메뉴 달력보이는것 숨김 기능 , 가로 크기 보이게.
// 버번 : 2.3.2 편집기 바이트수
// 버번 : 2.3.3 저장버튼 수정되면 활성화표시 복원.
// 예상 업데이트  검색어. 바꿀말 입력시  하단에 byte계산 실시간으로 표시.
define("_CMD_", true); 
error_reporting(E_ALL);
if (!defined('G5_SET_TIME_LIMIT')) define('G5_SET_TIME_LIMIT', 0);
include_once "yyy_allowed_ips.php";
include_once __DIR__ . "/yyy_config_host.php";   
include_once __DIR__ . "/yyy_func.php";   
// yyy_host_link.php

/* ===============================
   기존 POST / GET 처리 (원본 유지)
   =============================== */ 
 
$R = $_REQUEST;
$req_bool = function($k){ return isset($_REQUEST[$k]) && $_REQUEST[$k] == '1'; };

// (중간 로직 전부 원본 그대로 유지)
if (isset($_REQUEST['save_file']) && $_REQUEST['save_file'] == '1') { 
    
    $file_path  = $_REQUEST['file_path']  ?? '';
    $content    = $_REQUEST['content']    ?? '';
    $no_bak     = $_REQUEST['no_bak']     ?? false;
    $save_mode  = trim((string)($_REQUEST['save_mode'] ?? 'quick'));
    
    if (!$file_path) die("❌ 파일 경로가 없습니다.");
    
    // 디렉토리가 없으면 생성
    $dir = dirname($file_path);
    if (!is_dir($dir)) {
        if (!mkdir($dir, 0755, true)) {
            die("❌ 디렉토리 생성 실패: " . htmlspecialchars($dir));
        }
    }

    // save_as : 기존 파일 먼저 백업 후 저장
    if ($save_mode === 'save_as') {
        if (file_exists($file_path)) {
            if (!createBackup($file_path, $no_bak)) {
                $err = getBackupLastError();
                if ($err) {
                    echo ("yy71:[{$err['code']}] {$err['message']}\n");
                } else { 
                    echo ("[UNKNOWN] 알 수 없는 오류\n");
                }
                exit;
            }
        }
    }
    
    $result = file_put_contents($file_path, $content);
    if ($result === false) die("❌ 파일 저장에 실패했습니다.");

    // quick : 저장된 최신본을 다시 백업해서 2중 저장
    if ($save_mode === 'quick') {
        if (!createBackup($file_path, $no_bak)) {
            $err = getBackupLastError();
            if ($err) {
                echo ("yy72:[{$err['code']}] 최신백업 실패: {$err['message']}\n");
            } else {
                echo ("yy72:[UNKNOWN] 최신백업 실패\n");
            }
            exit;
        }
    }
 
    echo "✅ 저장 성공: " . htmlspecialchars($file_path) . " (" . number_format($result) . " bytes)";
 
}

$file_path   = $_GET['view'] ?? '';
$filename    = ($file_path !== '') ? basename($file_path) : '';
$target_line = (int)($_GET['line'] ?? 0);
$file_exists = ($file_path !== '' && file_exists($file_path) && is_file($file_path));
$file_size   = ($file_exists ? filesize($file_path) : 0);

$content = '';
if ($file_exists) {
    $max = 1024 * 1024;
    $content = ($file_size > $max)
        ? file_get_contents($file_path, false, null, 0, $max)
        : file_get_contents($file_path);
}

$file_ext = strtolower(pathinfo($file_path, PATHINFO_EXTENSION));
$language_map = [
    'php'=>'php','phtml'=>'php','inc'=>'php','bak'=>'php',
    'js'=>'javascript','ts'=>'javascript','jsx'=>'javascript','tsx'=>'javascript',
    'css'=>'css','scss'=>'css','sass'=>'css','less'=>'css',
    'html'=>'htmlmixed','htm'=>'htmlmixed','xml'=>'xml','xhtml'=>'htmlmixed','ejs'=>'htmlmixed',
    'sql'=>'sql','py'=>'python',
    'sh'=>'shell','bash'=>'shell','zsh'=>'shell','htaccess'=>'shell','csv'=>'shell',
    'hlp'=>'properties','ini'=>'properties','env'=>'properties','conf'=>'properties','cnf'=>'properties',    
    'json'=>'javascript','yaml'=>'yaml','yml'=>'yaml','toml'=>'toml',
    'md'=>'markdown','txt'=>'plaintext','log'=>'plaintext'
];
$language = $language_map[$file_ext] ?? 'plaintext';
if (in_array($file_ext,['html','htm','xml','phtml'],true) && strpos($content,'<?php')!==false) $language='php';
if ($file_ext==='htaccess' || basename($file_path)==='.htaccess') $language='shell';

$has_pair = false;
if ($file_path !== '') {
    $filename = basename($file_path); $dir_path = dirname($file_path);
if (preg_match('/^(.+?)(?:_s)?\.(php|py|js|css|html|htm|ejs|sql|txt|md|conf|ini|sh)$/i',$filename,$m)) {
        $base=$m[1]; $ext=strtolower($m[2]);
        if (file_exists("{$dir_path}/{$base}.{$ext}") && file_exists("{$dir_path}/{$base}_s.{$ext}")) $has_pair=true;
    }
}

$ye_file_path = '';
$ye_exists = false; 
if ($file_path !== '') {
    $ye_src_dir  = dirname($file_path);
    $ye_src_file = basename($file_path);
    if (!defined('YE_ROOT_FS'))  define('YE_ROOT_FS',  '/data/yE');
    $ye_file_path = YE_ROOT_FS . $ye_src_dir . '/yE_' . $ye_src_file . '.html';
    $ye_exists = (file_exists($ye_file_path) && is_file($ye_file_path));
}
$title_name = ($file_path !== '' ? basename($file_path) : 'YYY Editor');
$cm_wrap = (isset($_COOKIE['cm_wrap']) && $_COOKIE['cm_wrap']==='1') ? 1 : 0;

$YY_VIEW_SELF = basename($_SERVER['SCRIPT_NAME'] ?? 'yyy_view.php');
$YY_VIEW_JS = preg_replace('/\.php$/i', '.js', $YY_VIEW_SELF);
if (!is_file(__DIR__ . '/' . $YY_VIEW_JS)) {
    $YY_VIEW_JS = 'yyy_view.js';
}


?>
<!DOCTYPE html>
<html lang="ko" data-bs-theme="<?= htmlspecialchars($_COOKIE['theme'] ?? 'light', ENT_QUOTES) ?>">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=yes">
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='0.9em' font-size='90'>💾</text></svg>">
<title><?php echo htmlspecialchars($title_name); ?></title>
  
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css" rel="stylesheet">
<?php include "yyy__theme_style.php"; ?>

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/dracula.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/xml/xml.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/javascript/javascript.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/css/css.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/htmlmixed/htmlmixed.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/clike/clike.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/php/php.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/sql/sql.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/python/python.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/shell/shell.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/properties/properties.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/yaml/yaml.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/markdown/markdown.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/addon/scroll/scrollpastend.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/addon/fold/foldgutter.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/addon/fold/foldcode.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/addon/fold/foldgutter.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/addon/fold/xml-fold.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/addon/fold/brace-fold.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/addon/fold/indent-fold.min.js"></script> 
<link rel="stylesheet" href="yyy_view.css?v=2.12.6">
<style>
@media (max-width: 1200px){
  .my-date-input{
    display:none !important;
  }
}
</style>
<!-- style> 
body { margin:0; }
#editor-wrap{ background:var(--panel); }

html[data-bs-theme="dark"] #editor-wrap{ background:#1e1e1e; }
html[data-bs-theme="light"] #editor-wrap,
html:not([data-bs-theme]) #editor-wrap{ background:#fff; }
</style -->
</head>
<body
  data-file-path="<?= htmlspecialchars($file_path, ENT_QUOTES, 'UTF-8') ?>"
  data-target-line="<?= (int)$target_line ?>"
  data-language="<?= htmlspecialchars($language, ENT_QUOTES, 'UTF-8') ?>"
>
<div id="yyy-view-shell0">
    <div id="yyy-view-shell">
<!-- ══════════════════════════════
     툴바
══════════════════════════════ -->
<div class="toolbar">

  <!-- ── 좌측 그룹: 토글류 + 파일명 ── -->
 
  <!-- Split 토글 (아이콘 버튼) -->
  <button class="btn tb-btn icon-only" id="splitBtn"  data-bs-placement="bottom"  data-bs-toggle="tooltip"  data-bs title="화면 분할 (위/아래)">
    <i class="bi bi-layout-split"></i>
  </button>

  <!-- Wrap 토글 (아이콘 버튼) -->
  <button class="btn tb-btn icon-only" id="wrapBtn"  data-bs-placement="bottom"  data-bs-toggle="tooltip"  data-bs title="자동줄바꿈 Wrap">
    <i class="bi bi-text-wrap"></i>
  </button>

  <div class="tb-sep"></div>

  <a class="tb-btn icon-only" href="yyy_find.php?path=<?=dirname($file_path)?>" target="yyy"  data-bs-placement="bottom"  data-bs-toggle="tooltip"  data-bs title="검색 <?=dirname($file_path)?>">🔥</a>
  <a class="tb-btn icon-only" href="yyy_view.php?view=yyy_view.php&line=1" target="yyy_view"  data-bs-placement="bottom"  data-bs-toggle="tooltip"  data-bs title="이 파일 열기">📝</a>
  <a class="tb-btn icon-only" href="yyy_cmd.php?command=ls -al <?=dirname($file_path);?>" target="yyy_cmd"   data-bs-placement="bottom"  data-bs-toggle="tooltip"  data-bs title="터미널 <?=dirname($file_path);?>">💻</a>

  <div class="tb-sep"></div>

  <?php 
  $LINK_ECHO=1; if(file_exists("yyy_host_link.php")) include_once "yyy_host_link.php"; 
  
	//ai_help보내주기복사
	$protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https')) ? 'https' : 'http';    
	$web_url2 = get_web_url('ai_help.php').'?token='.YYY_TOKEN; 
    $filePath = get_fulllpath($file_path);
  ?>

  <!-- ── 우측 그룹: 액션 버튼 ── -->
  <div class="tb-sep"></div>

<script src="_docs/yy_alarm_ds2gt_final_fulld.js.php?v=1.23"></script>    
 <div class="icon-btn"  id="yy-alarm-icon-here">⏰</div>  
 
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
<script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
<script src="https://cdn.jsdelivr.net/npm/flatpickr/dist/l10n/ko.js"></script>
<?php $now=date("Y-m-d H:i"); ?>
<input type="text" id="dateTime"   class="tb-btn"  value="<?=$now?>">
 
<script src="yy_drag_resize.js?v=1.7.4"></script>
<script src="yy-clip-board.js?v=1.0"></script> 
<script src="yy-color-picker.js?v=4.3"></script>

<div style="color:#000;" id="yy-color-picker"
     data-yy-scope="<?= htmlspecialcharsX($filename, ENT_QUOTES) ?>"
     data-yyDragHandle=".card-header"
     data-bs-toggle="tooltip"
     data-bs-placement="bottom"
     data-bs title="칼러 피커"></div>
     
    <script>
document.addEventListener("DOMContentLoaded", function() {
  flatpickr("#dateTime", {
    enableTime: true,        // 🔥 시간 활성화
    time_24hr: true,         // 24시간제
    dateFormat: "Y-m-d H:i",         // 🔥 서버값과 동일 형식
    altInput: true,
    altFormat: "Y-m-d (D) H:i",      // 🔥 화면 표시용 (요일 포함)
    locale: "ko",          // 🔥 이게 핵심
    disableMobile: true,      // 🔥 모바일 네이티브 차단
	altInputClass: "my-date-input", 
  });
});
         
</script>

  <div class="tb-sep"></div>
  <button class="btn tb-btn green  icon-only" id="saveBtn" data-bs-placement="bottom" data-bs-toggle="tooltip" data-bs title="저장 (파일명 수정 가능)">💾S</button>
  <button class="btn tb-btn orange icon-only" id="downloadBtn" data-bs-placement="bottom" data-bs-toggle="tooltip" data-bs title="현재창 다운로드">📥</button>
  <button class="btn tb-btn blue icon-only" id="copyBtn" data-bs-placement="bottom" data-bs-toggle="tooltip" data-bs title="편집기 내용 클립보드 복사">📋C</button>
    
<button class="btn tb-btn icon-only <?php echo $has_pair?'orange':'gray'; ?>" id="diffBtn" data-bs-placement="bottom" data-bs-placement="bottom"  data-bs-toggle="tooltip"  data-bs title="파일 비교">🆚</button>
    
  <div class="tb-sep"></div>
 
  <div  id="themeToggle" class="tb-btn icon-only pointer" data-bs-placement="bottom"  data-bs-toggle="tooltip"  data-bs title="다크모드 토글"></div>

  <button class="tb-btn btn icon-only" id="searchPanelBtn" data-bs-placement="bottom"  data-bs-toggle="tooltip"  data-bs title="내용검색 패널">🔍</button>
  <div id="funcBtn" class="tb-btn icon-only pointer" data-bs-placement="bottom"  data-bs-toggle="tooltip"  data-bs title="함수/클래스 목록">ƒ</div> 
 <!-- button class="btn tb-btn gray icon-only" id="closeBtn"  data-bs-placement="bottom"  data-bs-toggle="tooltip"  data-bs title="현재창 닫기">🔚</button -->
 
   <button class="btn tb-btn <?php echo $ye_exists ? 'orange' : 'gray'; ?>" id="openYeBtn"
    data-ye-file="<?= htmlspecialchars($ye_file_path."&Me=1", ENT_QUOTES, 'UTF-8') ?>"
    data-ye-exists="<?= $ye_exists ? '1' : '0' ?>"
    data-bs-placement="bottom"
    data-bs-toggle="tooltip"
    data-bs title="yE 보관/메모 팝업 <?= htmlspecialchars($ye_file_path, ENT_QUOTES, 'UTF-8') ?>">yE</button>
    
<!-- div class="btn-group yy-mini-toggles flex-shrink-0" role="group" aria-label="표시 토글">
  <input class="btn-check" type="checkbox" id="text-truncate" data-toggle-class="text-truncate" checked>
  <label class="btn tb-btn yy-tg yy-tg-tr" for="text-truncate"
         data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="함수명 표시">tr</label>

  <input class="btn-check" type="checkbox" id="text-yyCopySel" data-toggle-class="yyCopySel" checked>
  <label class="btn tb-btn yy-tg yy-tg-cs" for="text-yyCopySel"
         data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-html="true" data-bs-custom-class="yy-tip-left yy-tip-st" data-bs-title="A: 폰트·스텝<br>Lh: 줄간격·스텝<br>cc.top: 커서 Y<br>info.top: 스크롤 Y<br>info.cH: 보이는 높이<br>info.cW: 보이는 너비<br>Y: 화면 커서 세로 위치<br>F: 화면 커서 세로 비율<br>V: 보이는 라인 범위<hr>X: 화면 커서 가로 위치<hr>Split: 상하 분할비">Cs</label>

  <input class="btn-check" type="checkbox" id="text-yyFile" data-toggle-class="yyFile" checked>
  <label class="btn tb-btn yy-tg yy-tg-fi" for="text-yyFile"
         data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="파일 정보 표시 토글">Fi</label>
</div -->
<div class="yySeg flex-shrink-0" id="yyTopMiniToggles">
  <label class="yyTopMiniToggles"
         data-key="dk-fn"
         data-position="left"
         data-color="info"
         data-target="#cm-sticky-text"
         data-mode="show"
         data-on="1"
         data-bs-toggle="tooltip"
         data-bs-placement="bottom"
         data-bs-title="함수명 표시 토글">Fn</label>

  <label class="yyTopMiniToggles"
         data-position="center"
         data-key="dk-st"
         data-color="success"
         data-target=".yyCopySel"
         data-mode="show"
         data-on="1"
         data-bs-toggle="tooltip"
         data-bs-placement="bottom"
         data-bs-html="true"
         data-bs-custom-class="yy-seg-tip-left"
         data-bs-title="A: 폰트·스텝<br>Lh: 줄간격·스텝<br>cc.top: 커서 Y<br>info.top: 스크롤 Y<br>info.cH: 보이는 높이<br>info.cW: 보이는 너비<br>Y: 화면 커서 세로 위치<br>F: 화면 커서 세로 비율<br>V: 보이는 라인 범위<hr>X: 화면 커서 가로 위치<hr>Split: 상하 분할비">St</label>
 
  <label id="yySelLiveMarkBtn"
         class="yyTopMiniToggles"
         data-position="center"
         data-key="dk-hl"
         data-color="warning"
         data-target="#yySelLiveMarkSentinel"
         data-mode="show"
         data-on="0"
         data-bs-toggle="tooltip"
         data-bs-placement="bottom"
         data-bs-title="선택한 문구와 같은 문구 강조">Hl</label>
    

  <span id="yySelLiveMarkSentinel" style="display:none;"></span>

  <label class="yyTopMiniToggles"
         data-position="right"
         data-key="dk-fi"
         data-color="primary"
         data-target=".yyFile"
         data-mode="show"
         data-on="1"
         data-bs-toggle="tooltip"
         data-bs-placement="bottom"
         data-bs-title="파일정보 표시 토글">Fi</label>
</div>    
    
    
</div EndOf="184?">

<div id="cm-sticky-func">
  <div id="cm-sticky-text" class="text-truncate" style="min-width:0;"></div>

  <div id="cm-sticky-tools" class="d-flex gap-1 align-items-center">

  <!-- 파일명 -->
  <div class="title yyFile">   
      <span  class="file-path"  data-bs-toggle="tooltip" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="클립보드 file_json_url복사"  onclick="copyToClipboard('<?= get_file_json_url($file_path); ?>')">✨<?=$file_path;?></span>
    <small>
      <span id="yy-file-bytes"><?php echo $file_exists?(number_format($file_size).' bytes'):'NOFILE'; ?></span>
      :: <b><?php echo htmlspecialchars($language); ?></b>
    </small>
  </div>
      
        <span id="cur-height" class="tb-btn small yyCopySel" style="opacity:.75;">Y:0px 0%</span>
        <span id="cur-width" class="tb-btn small yyCopySel" style="opacity:.75;">X:0px 0%</span>
        <span id="cur-split" class="tb-btn small yyCopySel" style="opacity:.70;">Split:--</span> 
      
        <span id="cur-line" class="tb-btn small yyCopySel" style="opacity:.85;">Line:1</span>
      
    <button class="btn tb-btn icon-only" id="fontResetBtn"
      data-bs-toggle="tooltip" data-bs title="글자 크기 기본값">A0</button>

    <button class="btn tb-btn icon-only" id="fontMinusBtn"
      data-bs-toggle="tooltip" data-bs title="글자 작게">A−</button>

    <button class="btn tb-btn icon-only" id="fontPlusBtn"
      data-bs-toggle="tooltip" data-bs title="글자 크게">A+</button>

    <span class="tb-sep" style="height:16px;"></span>

    <button class="btn tb-btn icon-only" id="lhResetBtn"
      data-bs-toggle="tooltip" data-bs title="줄간격 기본값">Lh0</button>

    <button class="btn tb-btn icon-only" id="lhMinusBtn"
      data-bs-toggle="tooltip" data-bs title="줄간격 좁게">Lh−</button>

    <button class="btn tb-btn icon-only" id="lhPlusBtn"
      data-bs-toggle="tooltip" data-bs title="줄간격 넓게">Lh+</button>

    <button class="btn tb-btn icon-only" id="preQuickBtn"
      data-bs-toggle="tooltip" data-bs title="pre 블록 삽입 / Ctrl+Enter 현재줄을 pre로 변환">pre+</button>
  </div>
</div>
        
<div id="editor-wrap">  
  <textarea id="code-editor"  style="display:none;"><?php echo htmlspecialchars($content, ENT_QUOTES|ENT_SUBSTITUTE, 'UTF-8'); ?></textarea>
</div>

<!-- ── ƒ 함수목록 모달 ── -->
<div class="modal fade  "  id="funcModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-dialog-scrollable modal-lg yyDrag yyResize" data-yy-key="func_modal_dialog" data-yyDragHandle=".modal-header" data-yyMinW="520" data-yyMinH="260" >
     
    <div class="modal-content" style="background:var(--panel);color:var(--text);border:1px solid var(--border);">
      <div class="modal-header" style="background:var(--panel2);border-bottom:1px solid var(--border);">
      
          <h6 class="modal-title m-0">ƒ 함수 / 클래스 목록</h6>
           &nbsp; &nbsp;
        <span id="funcSortBtn"
              class="pl-3 tb-btn icon-only yyNoDrag"
              role="button"
              tabindex="0"
              title="정렬: 라인순 / 이름순 "
              aria-pressed="false"  data-bs-placement="bottom"  data-bs-toggle="tooltip"  data-bs title="정렬" >
          <i class="bi bi-sort-numeric-down" id="funcSortBtnIcon"></i>
        </span>
          &nbsp;
          <span id="funcAddToSpRstBtn"
              class="pl-3 tb-btn icon-only yyNoDrag"
              role="button"
              tabindex="0"
              data-bs title="우측창에 추가"
              aria-pressed="false"
              data-bs-placement="bottom"
              data-bs-toggle="tooltip">
          <i class="bi bi-box-arrow-in-right" id="funcAddToSpRstiCon"></i>
        </span>
          
        <span type="button" class="tb-btn  icon-only btn-close" data-bs-dismiss="modal"  data-bs-placement="bottom"  data-bs-toggle="tooltip"  data-bs title="닫기"  aria-label="Close"></span>
      
        </div>
      <div class="modal-body">
        <div class="d-flex gap-2 align-items-center mb-2">
          <input type="text" id="funcSearch" class="form-control form-control-sm"
                 placeholder="검색 (함수명/클래스명) …" autocomplete="off">            
          <span id="funcMeta" class="small" style="opacity:.7;white-space:nowrap;"></span>  
        </div>
        <div id="funcList"></div>
      </div>
        <div class="modal-footer" style="background:var(--panel2);border-top:1px solid var(--border);">
          <span class="small" style="opacity:.7;">Ctrl+Shift+F</span>
          <span id="funcFooterMeta" class="small ms-2" style="opacity:.85;"></span>  <!-- ✅ 추가 -->
          <button type="button" class="btn btn-sm btn-outline-secondary" data-bs-dismiss="modal">닫기</button>
        
    <span  class="file-path"  data-bs-toggle="tooltip" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="클립보드 ai_help복사 <?=$web_url2?>"  
          onclick="copyToClipboard('<?=  $web_url2 ?>')">🍎</span> 
            
        </div>
    </div>
  </div>
</div>
 
<div id="search-panel">
  <div id="sp-resize-handle"></div>
  <div id="sp-header">
      
      <span id="sp-close" class="btn tb-btn  icon-only "  data-bs-placement="bottom"  data-bs-toggle="tooltip"  data-bs title="닫기" >✕</span>  
        
    <button class="btn tb-btn  icon-only  " id="saveBtn1"   data-bs-placement="bottom"  data-bs-toggle="tooltip"  data-bs title="묻지마 저장">💾</button>  

  <div class="tb-sep"></div>      
        

    <button id="spWholeLineBtn" class="btn icon-only tb-btn" data-bs-placement="bottom" data-bs-toggle="tooltip" data-bs title="검색: 전체라인일치">
         <i class="bi-hr"></i>         
        </button>
       
    <button id="spTrimBtn" class="btn icon-only  tb-btn" data-bs-placement="bottom" data-bs-toggle="tooltip" data-bs title="검색: 라인별 앞뒤공백무시">
        <i class="bi-arrows-angle-contract"></i>        
      </button>   
      
    <button id="spCaseBtn"  class="btn tb-btn icon-only" data-bs-placement="bottom"  data-bs-toggle="tooltip"  data-bs title="검색: 대소문자 구분">Aa</button>
      
    <button id="spWordBtn"  class="btn tb-btn icon-only" data-bs-placement="bottom"  data-bs-toggle="tooltip"  data-bs title="검색: 단어단위">.*</button> 
      

  <div class="tb-sep"></div>
   
<button type="button" class="btn tb-btn icon-only sp-tool-btn" id="yyy-bf-toggle"  data-bs-placement="bottom"  data-bs-toggle="tooltip"  data-bs title="검색: 백업에서 찾기">bF</button>
      
      

      <!-- 우측 검색결과 Wrap 버튼 예시 (패널 헤더 안) -->
    <button class="btn tb-btn icon-only sp-tool-btn" id="spWrapBtn"  data-bs-placement="bottom"  data-bs-toggle="tooltip"  data-bs title="검색결과 줄바꿈" aria-pressed="false">
      <i class="bi bi-text-wrap ico-off"></i>
      <i class="bi bi-card-text ico-on"></i>
    </button> 

  <div class="tb-sep"></div>
      

<!-- button class="btn tb-btn orange icon-only" id="patchBtn"
  onclick="window.open('yyy_patch.php?repo=< ?//= htmlspecialchars(CF_git_repo_root_default, ENT_QUOTES, 'UTF-8') ? >','yyy_patch','width=1200,height=900,resizable=yes,scrollbars=yes'); return false;"
  data-bs-placement="bottom" data-bs-toggle="tooltip" data-bs title="Codex / Git Patch 적용">🩹</button -->
      
    <!-- 테스트 //-->        
    <!-- div class="d-flex gap-2 align-items-center">
      <a  class="btn  btn-sm btn-outline-secondary  text-nowrap" href="/y/yyy_find.php?find=yy_&ext=all&path=%2Fdata%2Fphp56-web%2Fhtdocs%2F__%2F&fileLike=&eXt=zip%2Cjpg%2Cpng%2Cgif%2Cpdf%2Cmp4%2Cavi%2Cexe%2Cdll%2Cxlsx%2Cxls&eXn=&exdir=_rec%2C_alarm%2Ccast_api%2Clogin&mLen=10">🔥/__/yy_</a>  
      <button type="button" class="btn btn-sm btn-outline-secondary"  data-bs-placement="bottom" data-bs-placement="bottom"  data-bs-toggle="tooltip"  data-bs title="검색">
        <i class="bi bi-search"></i>
      </button>
        
      <button type="button" class="btn btn-sm btn-outline-secondary" data-bs-toggle="tooltip"data-bs-placement="top" data-bs title="비교"> ⚖️ </button>
        <button onclick='showToast("오류 메시지",  "error",   4000)'>er</a>
        <button onclick='showToast("경고 메시지",  "warning")'>wa</a>
        <button onclick='showToast("경고 메시지",  "success")'>su</a>
        <button onclick='showToast("경고 메시지",  "info")'>in</a>
        <button onclick='showToast("경고 메시지",  "danger")'>dg</a>
        <button onclick='showToast("경고 메시지",  "dark")'>dk</a>
        <i class="bi  bi-distribute-vertical"></i>
    </div -->
    <!--  테스트 끝//  -->

	</div EndOf="id= sp-header"> 
    
<div id="yyy-bak-find-wrap" data-file-path="<?=$filePath?>"></div>
<script src="/y/yyy_bak_find.js?v=1.1"></script>
<link rel="stylesheet" href="/y/yyy_bak_find.css">
    
    
<div id="sp-input-wrap"> 
      <div class="sp-textarea-wrap mb-2">
        <div id="sp-input-lines" class="sp-lines">1</div>
        <textarea id="sp-input" placeholder="🔍검색어.." autocomplete="off" title="서버에서가 아닌 현재 편집기에서 검색" rows="1"></textarea>
      </div>

         <div class="sp-meta-row">
             
     <?php

	 //웹으로열기
      $BASE = get_self_base_path();      
      $web_url = get_web_url($file_path);    
      $web_icon = $web_url 
           
          
          ? '<a href="'.$web_url.'" target="_blank" class="selct-none text-primary btn icon-only tb-btn" data-bs-placement="bottom"  data-bs-toggle="tooltip"  data-bs title="웹으로 열기 '.$file_path.'">🌐</a>'
          : ''; 
      
      echo $web_icon; 
         
      //php문법검사.
      
      $web_url =  $BASE . '/php_l.php?token='.YYY_TOKEN.'&path='.$filePath.'&fmt=html&noBot=1'; 
      echo '<a href="'.$web_url.'" target="_blank" class="selct-none text-primary btn icon-only tb-btn" data-bs-placement="bottom"  data-bs-toggle="tooltip"  data-bs title="php 문법 검사  '.$web_url.'">🐘</a>' ; 
      
      ?>
<button id="spReplaceBtn" class="btn tb-btn icon-only sp-tool-btn"  data-bs-placement="bottom"  data-bs-toggle="tooltip"  data-bs title="바꾸기 사용" role="button" tabindex="0" aria-pressed="false"><i class="bi bi-arrow-left-right"></i></button>
             
             <div id="sp-meta"></div>
             <span id="search_bytes" class="yy-byte-badge"></span>  			
             <div id="sp-replace-meta" class="small">검색어를 먼저 입력하세요.</div>

         </div>  
    
    
    
          <!-- ✅ Find / Replace 확장 박스 -->
      <div id="sp-replace-box" style="" aria-hidden="false">
          <div class="sp-replace-row">
             <div class="sp-textarea-wrap">
               <div id="sp-replace-lines" class="sp-lines">1</div>
               <textarea class="bt-tbn" id="sp-replace-input" placeholder="바꿀말.." autocomplete="off" rows="1"></textarea>
             </div>
              
<div class="sp-replace-actions">
  <span type="button" id="sp-replace-auto-one" class="tb-btn sp-apply-btn" data-bs-placement="bottom" data-bs-toggle="tooltip" data-bs-title="찾을말 붙여넣기 결과가 1건일 때, 바꿀말 붙여넣기 후 0.3초 뒤 1개적용 자동 실행">At</span>
    
  <span type="button" id="sp-replace-apply" class="tb-btn sp-apply-btn" data-bs-placement="bottom" data-bs-toggle="tooltip"  data-bs-title="검색어를 바꿀말로 전체 적용">전체적용</span>
  <span type="button" id="sp-replace-next" class="tb-btn sp-apply-btn" data-bs-placement="bottom" data-bs-toggle="tooltip"  data-bs-title="현재 위치부터 다음 검색어로 이동">다음찾기</span>
  <span type="button" id="sp-replace-one" class="tb-btn sp-apply-btn"  data-bs-placement="bottom"  data-bs-toggle="tooltip" data-bs-title="현재 선택 또는 현재 위치부터 아래로 1개 찾아 적용">1개적용</span>
                  
<button  id="sp-replace-double-ennter-line-to-one" class="btn icon-only tb-btn" data-bs-placement="bottom" data-bs-toggle="tooltip" data-bs-title="연속 공백줄을 1개 공백줄로 줄이기">
<i class="bi-arrows-collapse"></i></button>     
<span id="replace_bytes" class=""></span>
                  
</div>
              
            </div>
          </div>
    <!--구sp-meta자리 -->
<style>
/*yyy_view.css로이동함*/

#sp-input-wrap .sp-meta-row{
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  gap:4px 4px;
}
 
.yy-byte-badge{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  height:22px;
  padding:0 8px;
  border-radius:999px;
  font-size:11px;
  line-height:22px;
  white-space:nowrap;
  border:1px solid var(--border);
  background:var(--panel2);
  color:var(--text);
  opacity:.92;
}



    
</style> 
  
<a id="sp-paste-jump" href="#sp-paste-jump" style="display:block;height:10px;overflow:hidden;">-----------</a>
    
    </div EndOf="id= sp-input-wrap">
  
      <div id="sp-results"></div> 
    
</div EndOf="id=search-panel">
        
</div EndOf="94 id=yyy-view-shell">
    
<script src="yy__theme.js?v=1.3"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="<?= htmlspecialchars($YY_VIEW_JS, ENT_QUOTES, 'UTF-8') ?>?v=<?= file_exists(__DIR__ . '/' . $YY_VIEW_JS) ? filemtime(__DIR__ . '/' . $YY_VIEW_JS) : "1234" ?>"></script>
<script src="yy_seg_toggle.js?v=1"></script>
    
<div id="yy-alarm-timer-here"></div> 
    
</div>  
<div id="yy-toast-wrap"></div>    
</body>
</html>