<?php
if (!defined('_GNUBOARD_')) exit;
add_stylesheet('<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">', 0);
add_stylesheet('<link rel="stylesheet" href="'.$board_skin_url.'/style.write.css">', 0);
include_once(G5_LIB_PATH.'/thumbnail.lib.php');
$view_content = get_view_thumbnail($view['content']);
$x2_txt_raw = isset($view['x2_txt']) ? $view['x2_txt'] : '';
$code_filename = $bo_table.'-'.$view['wr_id'].'.php';
$content_text = trim(strip_tags($view_content));
$has_images = false;
$has_files = false;
$has_links = false;
if (!empty($view['file']['count'])) {
for ($i = 0; $i < count($view['file']); $i++) {
if (!isset($view['file'][$i]['source'])) continue;
if (isset($view['file'][$i]['view']) && $view['file'][$i]['view']) {
$has_images = true;
} else {
$has_files = true;
}
}
}
for ($i = 1; $i <= (int)count($view['link']); $i++) {
if (!empty($view['link'][$i])) {
$has_links = true;
break;
}
}
$has_content = ($has_images || $content_text !== '');
$memo_text = isset($view['x2_memo']) ? trim($view['x2_memo']) : '';
$memo_clean = isset($view['x2_memo_clean']) && $view['x2_memo_clean'] === '1';
$tag_source = isset($view['wr_1']) ? $view['wr_1'] : '';
$tag_items = array_filter(array_map('trim', explode(',', $tag_source)));
$same_category_href = G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&sca='.urlencode(isset($view['ca_name']) ? $view['ca_name'] : '');
$same_ca2_href = G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&s_ca2='.urlencode(isset($view['x2_ca2']) ? $view['x2_ca2'] : '');
$same_ca3_href = G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&s_ca3='.urlencode(isset($view['x2_ca3']) ? $view['x2_ca3'] : '');
$same_top_href = G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&is_top=y&sfl=x2_top&stx=1';
$same_label_href = G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&is_label=y&sfl=x2_label&stx=1';
$same_ok_href = G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&is_ok=y&sfl=x2_ok&stx=1';
$same_set_href = G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&is_set=y&sfl=x2_set&stx=1';
$recent_ca3_rows = array();
$prev_ca3_rows = array();
if (!empty($view['x2_ca3'])) {
$x2_ca3_sql = sql_real_escape_string($view['x2_ca3']);
$wr_id_sql = (int)$view['wr_id'];
$sql_recent = " SELECT wr_id, wr_subject, wr_datetime
FROM {$write_table}
WHERE wr_is_comment = '0'
AND x2_ca3 = '{$x2_ca3_sql}'
AND wr_id > '{$wr_id_sql}'
ORDER BY wr_id DESC
LIMIT 3 ";
$rs_recent = sql_query($sql_recent, false);
if ($rs_recent) {
while ($row = sql_fetch_array($rs_recent)) {
$recent_ca3_rows[] = $row;
}
}
$sql_prev = " SELECT wr_id, wr_subject, wr_datetime
FROM {$write_table}
WHERE wr_is_comment = '0'
AND x2_ca3 = '{$x2_ca3_sql}'
AND wr_id < '{$wr_id_sql}'
ORDER BY wr_id DESC
LIMIT 3 ";
$rs_prev = sql_query($sql_prev, false);
if ($rs_prev) {
while ($row = sql_fetch_array($rs_prev)) {
$prev_ca3_rows[] = $row;
}
}
}
$extract_wr_id = function($href) {
if (!$href) return 0;
if (preg_match('/[?&]wr_id=(\d+)/', $href, $m)) {
return (int)$m[1];
}
return 0;
};
$load_nav_meta = function($target_wr_id) use ($write_table) {
$meta = array();
if (!$target_wr_id) return $meta;
$sql = " SELECT ca_name, x2_ca2, x2_ca3, x2_ca4, x2_top, x2_label, x2_ok, x2_set
FROM {$write_table}
WHERE wr_id = '{$target_wr_id}' ";
$row = sql_fetch($sql, false);
if (is_array($row)) $meta = $row;
return $meta;
};
$prev_meta = $load_nav_meta($extract_wr_id($prev_href));
$next_meta = $load_nav_meta($extract_wr_id($next_href));
$render_nav_meta = function($meta) {
if (empty($meta)) return '';
$parts = array();
if (!empty($meta['ca_name'])) $parts[] = '<span class="nav-meta-chip">분류: '.get_text($meta['ca_name']).'</span>';
if (!empty($meta['x2_ca2'])) $parts[] = '<span class="nav-meta-chip">구분: '.get_text($meta['x2_ca2']).'</span>';
if (!empty($meta['x2_ca3'])) $parts[] = '<span class="nav-meta-chip">형태: '.get_text($meta['x2_ca3']).'</span>';
if (!empty($meta['x2_ca4'])) $parts[] = '<span class="nav-meta-chip">종류: '.get_text($meta['x2_ca4']).'</span>';
$extra = array();
if (!empty($meta['x2_top']) && $meta['x2_top'] == '1') $extra[] = '우선';
if (!empty($meta['x2_label']) && $meta['x2_label'] == '1') $extra[] = '라벨';
if (!empty($meta['x2_ok']) && $meta['x2_ok'] == '1') $extra[] = '완성';
if (!empty($meta['x2_set']) && $meta['x2_set'] == '1') $extra[] = '세트';
if (!empty($extra)) $parts[] = '<span class="nav-meta-chip">옵션: '.implode(', ', $extra).'</span>';
return implode('', $parts);
};
?>
<article id="VIEW">
<div class="Board-Info-Header">
<div>
<span class="terminal-label">CORE TERMINAL</span>
<div class="board-title"><i class="fa-solid fa-database board-title-icon"></i><?php echo $board['bo_subject']; ?></div>
</div>
<div class="Btns-Right">
<button onclick="location.href='<?php echo $list_href; ?>'"><i class="fa-solid fa-list"></i> LIST</button>
<?php if ($update_href) { ?><button onclick="location.href='<?php echo $update_href; ?>'"><i class="fa-solid fa-pen-to-square"></i> EDIT</button><?php } ?>
<?php if ($write_href) { ?><button onclick="location.href='<?php echo $write_href; ?>'" class="Write-Btn"><i class="fa-solid fa-pen"></i> WRITE</button><?php } ?>
</div>
</div>
<header class="Header-Main-Section">
<h1><?php echo get_text($view['wr_subject']); ?></h1>
<div class="wr-datetime"><i class="fa-regular fa-clock datetime-icon"></i> DATE: <?php echo date('Y-m-d H:i', strtotime($view['wr_datetime'])); ?></div>
</header>
<?php if ($has_files || $has_links) { ?>
<div class="View-Attached-Data">
<?php if ($has_files) { ?>
<div class="section-title-row"><i class="fa-solid fa-paperclip"></i> 첨부파일</div>
<?php
if ($view['file']['count']) {
for ($i=0; $i<count($view['file']); $i++) {
if (!isset($view['file'][$i]['source']) || isset($view['file'][$i]['view'])) continue;
?>
<a href="<?php echo $view['file'][$i]['href']; ?>" class="data-item file-item view_file_download">
<div class="data-info">
<i class="fa-solid fa-download"></i>
<div>
<span class="data-name"><?php echo $view['file'][$i]['source']; ?></span>
<?php if(!empty($view['file'][$i]['bf_content'])) { ?><span class="data-description"><?php echo $view['file'][$i]['bf_content']; ?></span><?php } ?>
</div>
</div>
<div class="data-meta"><span><?php echo $view['file'][$i]['size']; ?></span></div>
</a>
<?php
}
}
?>
<?php } ?>
<?php if ($has_links) { ?>
<div class="section-title-row links-under-files"><i class="fa-solid fa-link"></i> 링크</div>
<?php
for ($i=1; $i<=count($view['link']); $i++) {
if (empty($view['link'][$i])) continue;
$link = cut_str($view['link'][$i], 120);
?>
<a href="<?php echo $view['link_href'][$i] ?>" target="_blank" class="data-item link-item-card">
<div class="data-info"><i class="fa-solid fa-link"></i><span class="data-name"><?php echo $link ?></span></div>
<span class="data-meta">OPEN</span>
</a>
<?php } ?>
<?php } ?>
</div>
<?php } ?>
<section class="Extra-Category-Area meta-section">
<div class="section-title-row"><i class="fa-solid fa-table-list"></i> 분류 정보</div>
<div class="meta-item-grid">
<?php if(!empty($view['ca_name'])) { ?><a href="<?php echo $same_category_href; ?>" class="meta-item info-link"><span class="item-label">분류</span><span class="item-value"><?php echo get_text($view['ca_name']); ?></span></a><?php } ?>
<?php if(!empty($view['x2_ca2'])) { ?><a href="<?php echo $same_ca2_href; ?>" class="meta-item info-link"><span class="item-label">구분</span><span class="item-value"><?php echo get_text($view['x2_ca2']); ?></span></a><?php } ?>
<?php if(!empty($view['x2_ca3'])) { ?><a href="<?php echo $same_ca3_href; ?>" class="meta-item info-link"><span class="item-label">형태</span><span class="item-value"><?php echo get_text($view['x2_ca3']); ?></span></a><?php } ?>
<?php if(!empty($view['x2_ca4'])) { ?><span class="meta-item"><span class="item-label">종류</span><span class="item-value"><?php echo get_text($view['x2_ca4']); ?></span></span><?php } ?>
</div>
</section>
<section class="View-Option-Area option-primary-area">
<div class="section-title-row"><i class="fa-solid fa-circle-info"></i> 핵심 항목</div>
<div class="option-item-grid">
<?php if(!empty($view['x2_top']) && $view['x2_top'] == '1') { ?><a href="<?php echo $same_top_href; ?>" class="ca-tag-item option-chip info-link"><i class="fa-solid fa-thumbtack"></i><span class="option-chip-label">우선</span><span class="option-chip-value">TOP</span></a><?php } ?>
<?php if(!empty($view['x2_label']) && $view['x2_label'] == '1') { ?><a href="<?php echo $same_label_href; ?>" class="ca-tag-item option-chip info-link"><i class="fa-solid fa-star"></i><span class="option-chip-label">라벨</span><span class="option-chip-value">LABEL</span></a><?php } ?>
<?php if(!empty($view['x2_ok']) && $view['x2_ok'] == '1') { ?><a href="<?php echo $same_ok_href; ?>" class="ca-tag-item option-chip info-link"><i class="fa-solid fa-check"></i><span class="option-chip-label">완성</span><span class="option-chip-value">DONE</span></a><?php } ?>
<?php if(!empty($view['x2_set']) && $view['x2_set'] == '1') { ?><a href="<?php echo $same_set_href; ?>" class="ca-tag-item option-chip info-link"><i class="fa-solid fa-boxes-stacked"></i><span class="option-chip-label">세트</span><span class="option-chip-value">SET</span></a><?php } ?>
<?php if(!empty($view['x2_ver'])) { ?><div class="ca-tag-item option-chip theme-chip"><i class="fa-solid fa-code-branch"></i><span class="option-chip-label">테마</span><span class="option-chip-value"><?php echo get_text($view['x2_ver']); ?></span></div><?php } ?>
</div>
</section>
<?php if ($has_content) { ?>
<div class="View-Content">
<div class="section-title-row"><i class="fa-solid fa-file-lines"></i> 내용</div>
<div class="View-Body-Inner">
<div id="bo_v_atc">
<div id="bo_v_img">
<?php
if ($view['file']['count']) {
for ($i = 0; $i < count($view['file']); $i++) {
if (isset($view['file'][$i]['view']) && $view['file'][$i]['view']) {
echo get_view_thumbnail($view['file'][$i]['view']);
}
}
}
?>
</div>
<div id="bo_v_con"><?php echo $view_content; ?></div>
</div>
</div>
</div>
<?php } ?>
<?php if($view['x2_txt']) { ?>
<div class="Additional-Code-Area">
<div class="code-header">
<span class="code-title"><i class="fa-solid fa-code"></i> 추가 내용</span>
<div class="code-actions">
<button type="button" class="code-action-btn" id="copyX2TxtBtn"><i class="fa-regular fa-copy"></i> COPY</button>
<button type="button" class="code-action-btn" id="downloadX2TxtBtn"><i class="fa-solid fa-download"></i> DOWNLOAD</button>
</div>
</div>
<pre class="code-body"><code><?php echo htmlspecialchars($view['x2_txt']); ?></code></pre>
</div>
<?php } ?>
<?php if ($memo_text !== '') { ?>
<div class="Work-Memo-View-Area <?php echo $memo_clean ? 'is-cleaned' : ''; ?>">
<div class="work-memo-title"><i class="fa-solid fa-note-sticky"></i> MEMO</div>
<?php if ($memo_clean) { ?><div class="memo-clean-badge"><i class="fa-solid fa-trash-can"></i> 메모 삭제 상태</div><?php } ?>
<div class="work-memo-content"><?php echo nl2br(get_text($memo_text)); ?></div>
</div>
<?php } ?>
<?php if (!empty($view['x2_ca3']) && (!empty($recent_ca3_rows) || !empty($prev_ca3_rows))) { ?>
<section class="View-Option-Area option-secondary-area">
<?php if (!empty($recent_ca3_rows)) { ?>
<div class="section-title-row"><i class="fa-solid fa-clock-rotate-left"></i> 최근 "<?php echo get_text($view['x2_ca3']); ?>" 데이터</div>
<ul class="related-list">
<?php foreach ($recent_ca3_rows as $row) { ?>
<li>
<a href="<?php echo G5_BBS_URL; ?>/board.php?bo_table=<?php echo $bo_table; ?>&wr_id=<?php echo (int)$row['wr_id']; ?>">
<span class="related-subject"><?php echo get_text($row['wr_subject']); ?></span>
<span class="related-date"><?php echo date('Y-m-d H:i', strtotime($row['wr_datetime'])); ?></span>
</a>
</li>
<?php } ?>
</ul>
<?php } ?>
<?php if (!empty($prev_ca3_rows)) { ?>
<div class="section-title-row related-prev-title"><i class="fa-solid fa-clock"></i> 이전 "<?php echo get_text($view['x2_ca3']); ?>" 데이터</div>
<ul class="related-list">
<?php foreach ($prev_ca3_rows as $row) { ?>
<li>
<a href="<?php echo G5_BBS_URL; ?>/board.php?bo_table=<?php echo $bo_table; ?>&wr_id=<?php echo (int)$row['wr_id']; ?>">
<span class="related-subject"><?php echo get_text($row['wr_subject']); ?></span>
<span class="related-date"><?php echo date('Y-m-d H:i', strtotime($row['wr_datetime'])); ?></span>
</a>
</li>
<?php } ?>
</ul>
<?php } ?>
</section>
<?php } ?>
<?php if (!empty($tag_items)) { ?>
<div class="View-Tag-Area">
<?php foreach ($tag_items as $tag) { ?>
<a href="<?php echo G5_BBS_URL; ?>/board.php?bo_table=<?php echo $bo_table; ?>&sfl=wr_1&stx=<?php echo urlencode($tag); ?>" class="tag-item"># <?php echo get_text($tag); ?></a>
<?php } ?>
</div>
<?php } ?>
<nav class="Post-Navigation">
<?php if ($prev_href) { ?>
<a href="<?php echo $prev_href; ?>" class="prev-link">
<span class="nav-label"><i class="fa-solid fa-chevron-left"></i> PREVIOUS POST</span>
<p class="nav-subject"><?php echo $prev_wr_subject; ?></p>
<div class="nav-meta-wrap"><?php echo $render_nav_meta($prev_meta); ?></div>
</a>
<?php } else { ?>
<div class="nav-empty prev-empty">FIRST POST</div>
<?php } ?>
<?php if ($next_href) { ?>
<a href="<?php echo $next_href; ?>" class="next-link">
<span class="nav-label">NEXT POST <i class="fa-solid fa-chevron-right"></i></span>
<p class="nav-subject"><?php echo $next_wr_subject; ?></p>
<div class="nav-meta-wrap"><?php echo $render_nav_meta($next_meta); ?></div>
</a>
<?php } else { ?>
<div class="nav-empty next-empty">LAST POST</div>
<?php } ?>
</nav>
<footer class="View-Bottom-Control">
<div class="Admin-Control">
<?php if ($delete_href) { ?><button onclick="if(confirm('정말 삭제하시겠습니까?')) location.href='<?php echo $delete_href; ?>';"><i class="fa-solid fa-trash-can"></i> DELETE</button><?php } ?>
<?php if ($copy_href) { ?><button onclick="window.open('<?php echo $copy_href; ?>', 'copy_win', 'width=600,height=500');"><i class="fa-solid fa-copy"></i> COPY</button><?php } ?>
<?php if ($move_href) { ?><button onclick="window.open('<?php echo $move_href; ?>', 'move_win', 'width=600,height=500');"><i class="fa-solid fa-truck-moving"></i> MOVE</button><?php } ?>
</div>
<button onclick="location.href='<?php echo $list_href; ?>'" class="List-Btn-Footer"><i class="fa-solid fa-list-ul"></i> BACK TO LIST</button>
</footer>
</article>
<script src="<?php echo G5_JS_URL; ?>/viewimageresize.js"></script>
<?php include_once("{$board_skin_path}/view/view.script.php"); ?>