최초 커밋

This commit is contained in:
root
2026-07-23 16:15:57 +09:00
commit c8f5efb6b7
14652 changed files with 4812531 additions and 0 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 339 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 B

+292
View File
@@ -0,0 +1,292 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// 선택옵션으로 인해 셀합치기가 가변적으로 변함
$colspan = 5;
if ($is_checkbox) $colspan++;
if ($is_good) $colspan++;
if ($is_nogood) $colspan++;
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
add_stylesheet('<link rel="stylesheet" href="'.$board_skin_url.'/style.css">', 0);
?>
<!-- 게시판 목록 시작 { -->
<div id="bo_list" style="width:<?php echo $width; ?>">
<!-- 게시판 카테고리 시작 { -->
<?php if ($is_category) { ?>
<nav id="bo_cate">
<h2><?php echo $board['bo_subject'] ?> 카테고리</h2>
<ul id="bo_cate_ul">
<?php echo $category_option ?>
</ul>
</nav>
<?php } ?>
<!-- } 게시판 카테고리 끝 -->
<form name="fboardlist" id="fboardlist" action="<?php echo G5_BBS_URL; ?>/board_list_update.php" onsubmit="return fboardlist_submit(this);" method="post">
<input type="hidden" name="bo_table" value="<?php echo $bo_table ?>">
<input type="hidden" name="sfl" value="<?php echo $sfl ?>">
<input type="hidden" name="stx" value="<?php echo $stx ?>">
<input type="hidden" name="spt" value="<?php echo $spt ?>">
<input type="hidden" name="sca" value="<?php echo $sca ?>">
<input type="hidden" name="sst" value="<?php echo $sst ?>">
<input type="hidden" name="sod" value="<?php echo $sod ?>">
<input type="hidden" name="page" value="<?php echo $page ?>">
<input type="hidden" name="sw" value="">
<!-- 게시판 페이지 정보 및 버튼 시작 { -->
<div id="bo_btn_top">
<div id="bo_list_total">
<span>Total <?php echo number_format($total_count) ?>건</span>
<?php echo $page ?> 페이지
</div>
<ul class="btn_bo_user">
<?php if ($admin_href) { ?><li><a href="<?php echo $admin_href ?>" class="btn_admin btn" title="관리자"><i class="fa fa-cog fa-spin fa-fw"></i><span class="sound_only">관리자</span></a></li><?php } ?>
<?php if ($rss_href) { ?><li><a href="<?php echo $rss_href ?>" class="btn_b01 btn" title="RSS"><i class="fa fa-rss" aria-hidden="true"></i><span class="sound_only">RSS</span></a></li><?php } ?>
<li>
<button type="button" class="btn_bo_sch btn_b01 btn" title="게시판 검색"><i class="fa fa-search" aria-hidden="true"></i><span class="sound_only">게시판 검색</span></button>
</li>
<?php if ($write_href) { ?><li><a href="<?php echo $write_href ?>" class="btn_b01 btn" title="글쓰기"><i class="fa fa-pencil" aria-hidden="true"></i><span class="sound_only">글쓰기</span></a></li><?php } ?>
<?php if ($is_admin == 'super' || $is_auth) { ?>
<li>
<button type="button" class="btn_more_opt is_list_btn btn_b01 btn" title="게시판 리스트 옵션"><i class="fa fa-ellipsis-v" aria-hidden="true"></i><span class="sound_only">게시판 리스트 옵션</span></button>
<?php if ($is_checkbox) { ?>
<ul class="more_opt is_list_btn">
<li><button type="submit" name="btn_submit" value="선택삭제" onclick="document.pressed=this.value"><i class="fa fa-trash-o" aria-hidden="true"></i> 선택삭제</button></li>
<li><button type="submit" name="btn_submit" value="선택복사" onclick="document.pressed=this.value"><i class="fa fa-files-o" aria-hidden="true"></i> 선택복사</button></li>
<li><button type="submit" name="btn_submit" value="선택이동" onclick="document.pressed=this.value"><i class="fa fa-arrows" aria-hidden="true"></i> 선택이동</button></li>
</ul>
<?php } ?>
</li>
<?php } ?>
</ul>
</div>
<!-- } 게시판 페이지 정보 및 버튼 끝 -->
<div class="tbl_head01 tbl_wrap">
<table>
<caption><?php echo $board['bo_subject'] ?> 목록</caption>
<thead>
<tr>
<?php if ($is_checkbox) { ?>
<th scope="col" class="all_chk chk_box">
<input type="checkbox" id="chkall" onclick="if (this.checked) all_checked(true); else all_checked(false);" class="selec_chk">
<label for="chkall">
<span></span>
<b class="sound_only">현재 페이지 게시물 전체선택</b>
</label>
</th>
<?php } ?>
<th scope="col">번호</th>
<th scope="col">제목</th>
<th scope="col">글쓴이</th>
<th scope="col"><?php echo subject_sort_link('wr_hit', $qstr2, 1) ?>조회 </a></th>
<?php if ($is_good) { ?><th scope="col"><?php echo subject_sort_link('wr_good', $qstr2, 1) ?>추천 </a></th><?php } ?>
<?php if ($is_nogood) { ?><th scope="col"><?php echo subject_sort_link('wr_nogood', $qstr2, 1) ?>비추천 </a></th><?php } ?>
<th scope="col"><?php echo subject_sort_link('wr_datetime', $qstr2, 1) ?>날짜 </a></th>
</tr>
</thead>
<tbody>
<?php
for ($i=0; $i<count($list); $i++) {
if ($i%2==0) $lt_class = "even";
else $lt_class = "";
?>
<tr class="<?php if ($list[$i]['is_notice']) echo "bo_notice"; ?> <?php echo $lt_class ?>">
<?php if ($is_checkbox) { ?>
<td class="td_chk chk_box">
<input type="checkbox" name="chk_wr_id[]" value="<?php echo $list[$i]['wr_id'] ?>" id="chk_wr_id_<?php echo $i ?>" class="selec_chk">
<label for="chk_wr_id_<?php echo $i ?>">
<span></span>
<b class="sound_only"><?php echo $list[$i]['subject'] ?></b>
</label>
</td>
<?php } ?>
<td class="td_num2">
<?php
if ($list[$i]['is_notice']) // 공지사항
echo '<strong class="notice_icon">공지</strong>';
else if ($wr_id == $list[$i]['wr_id'])
echo "<span class=\"bo_current\">열람중</span>";
else
echo $list[$i]['num'];
?>
</td>
<td class="td_subject" style="padding-left:<?php echo $list[$i]['reply'] ? (strlen($list[$i]['wr_reply'])*10) : '0'; ?>px">
<?php
if ($is_category && $list[$i]['ca_name']) {
?>
<a href="<?php echo $list[$i]['ca_name_href'] ?>" class="bo_cate_link"><?php echo $list[$i]['ca_name'] ?></a>
<?php } ?>
<div class="bo_tit">
<a href="<?php echo $list[$i]['href'] ?>">
<?php echo $list[$i]['icon_reply'] ?>
<?php
if (isset($list[$i]['icon_secret'])) echo rtrim($list[$i]['icon_secret']);
?>
<?php echo $list[$i]['subject'] ?>
</a>
<?php
if ($list[$i]['icon_new']) echo "<span class=\"new_icon\">N<span class=\"sound_only\">새글</span></span>";
// if ($list[$i]['file']['count']) { echo '<'.$list[$i]['file']['count'].'>'; }
if (isset($list[$i]['icon_hot'])) echo rtrim($list[$i]['icon_hot']);
if (isset($list[$i]['icon_file'])) echo rtrim($list[$i]['icon_file']);
if (isset($list[$i]['icon_link'])) echo rtrim($list[$i]['icon_link']);
?>
<?php if ($list[$i]['comment_cnt']) { ?><span class="sound_only">댓글</span><span class="cnt_cmt"><?php echo $list[$i]['wr_comment']; ?></span><span class="sound_only">개</span><?php } ?>
</div>
</td>
<td class="td_name sv_use"><?php echo $list[$i]['name'] ?></td>
<td class="td_num"><?php echo $list[$i]['wr_hit'] ?></td>
<?php if ($is_good) { ?><td class="td_num"><?php echo $list[$i]['wr_good'] ?></td><?php } ?>
<?php if ($is_nogood) { ?><td class="td_num"><?php echo $list[$i]['wr_nogood'] ?></td><?php } ?>
<td class="td_datetime"><?php echo $list[$i]['datetime2'] ?></td>
</tr>
<?php } ?>
<?php if (count($list) == 0) { echo '<tr><td colspan="'.$colspan.'" class="empty_table">게시물이 없습니다.</td></tr>'; } ?>
</tbody>
</table>
</div>
<!-- 페이지 -->
<?php echo $write_pages; ?>
<!-- 페이지 -->
<?php if ($list_href || $is_checkbox || $write_href) { ?>
<div class="bo_fx">
<?php if ($list_href || $write_href) { ?>
<ul class="btn_bo_user">
<?php if ($admin_href) { ?><li><a href="<?php echo $admin_href ?>" class="btn_admin btn" title="관리자"><i class="fa fa-cog fa-spin fa-fw"></i><span class="sound_only">관리자</span></a></li><?php } ?>
<?php if ($rss_href) { ?><li><a href="<?php echo $rss_href ?>" class="btn_b01 btn" title="RSS"><i class="fa fa-rss" aria-hidden="true"></i><span class="sound_only">RSS</span></a></li><?php } ?>
<?php if ($write_href) { ?><li><a href="<?php echo $write_href ?>" class="btn_b01 btn" title="글쓰기"><i class="fa fa-pencil" aria-hidden="true"></i><span class="sound_only">글쓰기</span></a></li><?php } ?>
</ul>
<?php } ?>
</div>
<?php } ?>
</form>
<!-- 게시판 검색 시작 { -->
<div class="bo_sch_wrap">
<fieldset class="bo_sch">
<h3>검색</h3>
<form name="fsearch" method="get">
<input type="hidden" name="bo_table" value="<?php echo $bo_table ?>">
<input type="hidden" name="sca" value="<?php echo $sca ?>">
<input type="hidden" name="sop" value="and">
<label for="sfl" class="sound_only">검색대상</label>
<select name="sfl" id="sfl">
<?php echo get_board_sfl_select_options($sfl); ?>
</select>
<label for="stx" class="sound_only">검색어<strong class="sound_only"> 필수</strong></label>
<div class="sch_bar">
<input type="text" name="stx" value="<?php echo stripslashes($stx) ?>" required id="stx" class="sch_input" size="25" maxlength="20" placeholder=" 검색어를 입력해주세요">
<button type="submit" value="검색" class="sch_btn"><i class="fa fa-search" aria-hidden="true"></i><span class="sound_only">검색</span></button>
</div>
<button type="button" class="bo_sch_cls" title="닫기"><i class="fa fa-times" aria-hidden="true"></i><span class="sound_only">닫기</span></button>
</form>
</fieldset>
<div class="bo_sch_bg"></div>
</div>
<script>
jQuery(function($){
// 게시판 검색
$(".btn_bo_sch").on("click", function() {
$(".bo_sch_wrap").toggle();
})
$('.bo_sch_bg, .bo_sch_cls').click(function(){
$('.bo_sch_wrap').hide();
});
});
</script>
<!-- } 게시판 검색 끝 -->
</div>
<?php if($is_checkbox) { ?>
<noscript>
<p>자바스크립트를 사용하지 않는 경우<br>별도의 확인 절차 없이 바로 선택삭제 처리하므로 주의하시기 바랍니다.</p>
</noscript>
<?php } ?>
<?php if ($is_checkbox) { ?>
<script>
function all_checked(sw) {
var f = document.fboardlist;
for (var i=0; i<f.length; i++) {
if (f.elements[i].name == "chk_wr_id[]")
f.elements[i].checked = sw;
}
}
function fboardlist_submit(f) {
var chk_count = 0;
for (var i=0; i<f.length; i++) {
if (f.elements[i].name == "chk_wr_id[]" && f.elements[i].checked)
chk_count++;
}
if (!chk_count) {
alert(document.pressed + "할 게시물을 하나 이상 선택하세요.");
return false;
}
if(document.pressed == "선택복사") {
select_copy("copy");
return;
}
if(document.pressed == "선택이동") {
select_copy("move");
return;
}
if(document.pressed == "선택삭제") {
if (!confirm("선택한 게시물을 정말 삭제하시겠습니까?\n\n한번 삭제한 자료는 복구할 수 없습니다\n\n답변글이 있는 게시글을 선택하신 경우\n답변글도 선택하셔야 게시글이 삭제됩니다."))
return false;
f.removeAttribute("target");
f.action = g5_bbs_url+"/board_list_update.php";
}
return true;
}
// 선택한 게시물 복사 및 이동
function select_copy(sw) {
var f = document.fboardlist;
if (sw == "copy")
str = "복사";
else
str = "이동";
var sub_win = window.open("", "move", "left=50, top=50, width=500, height=550, scrollbars=1");
f.sw.value = sw;
f.target = "move";
f.action = g5_bbs_url+"/move.php";
f.submit();
}
// 게시판 리스트 관리자 옵션
jQuery(function($){
$(".btn_more_opt.is_list_btn").on("click", function(e) {
e.stopPropagation();
$(".more_opt.is_list_btn").toggle();
});
$(document).on("click", function (e) {
if(!$(e.target).closest('.is_list_btn').length) {
$(".more_opt.is_list_btn").hide();
}
});
});
</script>
<?php } ?>
<!-- } 게시판 목록 끝 -->
+341
View File
@@ -0,0 +1,341 @@
@charset "utf-8";
/* 게시판 목록 */
#bo_list {position:relative;margin-bottom:20px}
#bo_list:after {display:block;visibility:hidden;clear:both;content:""}
#bo_list .td_board {width:120px;text-align:center}
#bo_list .td_chk {width:30px;text-align:center;border-top:1px solid #ecf0f1;border-bottom:1px solid #ecf0f1}
#bo_list .td_date {width:60px;text-align:center}
#bo_list .td_datetime {width:60px;text-align:center}
#bo_list .td_group {width:100px;text-align:center}
#bo_list .td_mb_id {width:100px;text-align:center}
#bo_list .td_mng {width:80px;text-align:center}
#bo_list .td_name {width:90px;text-align:left;padding:10px 0}
#bo_list .td_nick {width:100px;text-align:center}
#bo_list .td_num {width:50px;text-align:center}
#bo_list .td_num2 {width:50px;text-align:center}
#bo_list .td_numbig {width:80px;text-align:center}
#bo_list .txt_active {color:#5d910b}
#bo_list .txt_expired {color:#ccc}
#bo_list tbody tr {border-left:2px solid transparent}
#bo_list tbody tr:hover {border-left:2px solid #253dbe}
#bo_list tbody .even td {background:#fbfbfb}
#bo_cate {margin:25px 0}
#bo_cate h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
#bo_cate ul {zoom:1}
#bo_cate ul:after {display:block;visibility:hidden;clear:both;content:""}
#bo_cate li {display:inline-block;padding:2px}
#bo_cate a {display:block;line-height:28px;padding:5px 15px;border-radius:30px;border:1px solid #d6e9ff;color:#6794d3}
#bo_cate a:focus, #bo_cate a:hover, #bo_cate a:active {text-decoration:none;background:#3a8afd;color:#fff}
#bo_cate #bo_cate_on {z-index:2;background:#3a8afd;color:#fff;font-weight:bold;border:1px solid #3a8afd;
-webkit-box-shadow:inset 0 2px 5px rgb(33, 135, 202);
-moz-box-shadow:inset 0 2px 5px rgb(33, 135, 202);
box-shadow:inset 0 2px 5px rgb(33, 135, 202)}
.td_subject img {margin-left:5px}
/* 게시판 목록 공통 */
.selec_chk {position:absolute;top:0;left:0;width:0;height:0;opacity:0;outline:0;z-index:-1;overflow:hidden}
.chk_box {position:relative}
.chk_box input[type="checkbox"] + label {position:relative;color:#676e70}
.chk_box input[type="checkbox"] + label:hover {color:#2172f8}
.chk_box input[type="checkbox"] + label span {float:left;width:15px;height:15px;display:block;background:#fff;border:1px solid #d0d4df;border-radius:3px}
.write_div .chk_box input[type="checkbox"] + label, .bo_vc_w .chk_box input[type="checkbox"] + label {padding-left:20px}
.write_div .chk_box input[type="checkbox"] + label span, .bo_vc_w .chk_box input[type="checkbox"] + label span {position:absolute;top:2px;left:0;width:15px;height:15px;display:block;margin:0;background:#fff;border:1px solid #d0d4df;border-radius:3px}
.chk_box input[type="checkbox"]:checked + label {color:#000}
.chk_box input[type="checkbox"]:checked + label span {background:url(./img/chk.png) no-repeat 50% 50% #3a8afd;border-color:#1471f6;border-radius:3px}
#bo_btn_top {margin:10px 0}
#bo_btn_top:after {display:block;visibility:hidden;clear:both;content:""}
.bo_fx {margin-bottom:5px;float:right;zoom:1}
.bo_fx:after {display:block;visibility:hidden;clear:both;content:""}
.bo_fx ul {margin:0;padding:0;list-style:none}
#bo_list_total {float:left;line-height:34px;font-size:0.92em;color:#4e546f}
.btn_bo_user {float:right;margin:0;padding:0;list-style:none}
.btn_bo_user li {float:left;width:40px;text-align:center;margin-left:5px;background:#fff}
.btn_bo_user > li {position:relative}
.btn_bo_adm {float:left}
.btn_bo_adm li {float:left;margin-right:5px}
.btn_bo_adm input {padding:0 8px;border:0;background:#d4d4d4;color:#666;text-decoration:none;vertical-align:middle}
.bo_notice td {background:#fff6fa !important;border-bottom:1px solid #f8e6ee}
.bo_notice td a {font-weight:bold}
.bo_notice .notice_icon {display:inline-block;line-height:25px;border-radius:5px;font-weight:bold;color:#f9267f}
.more_opt {display:none;position:absolute;top:45px;right:0;background:#fff;border:1px solid #b8bfc4;z-index:999}
.more_opt:before {content:"";position:absolute;top:-8px;right:13px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #b8bfc4 transparent}
.more_opt:after {content:"";position:absolute;top:-6px;right:13px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #fff transparent}
.more_opt li {border-bottom:1px solid #f1f1f1;padding:10px;float:inherit;width:90px;margin:0;color:#6b757c;text-align:left}
.more_opt li:last-child {border-bottom:0}
.more_opt li button, .more_opt li a {width:100%;border:0;background:#fff;color:#6b757c}
.more_opt li:hover a,
.more_opt li:hover button {color:#000}
.more_opt li i {float:right;line-height:20px}
.td_num strong {color:#000}
.bo_cate_link {float:left;display:inline-block;margin-right:10px;background:#e2eaf6;color:#3a8afd;font-weight:normal !important;height:20px;line-height:10px;padding:5px 8px;border-radius:5px;font-size:0.95em} /* 글제목줄 분류스타일 */
.bo_cate_link:hover {text-decoration:none}
.bo_tit {display:block;color:#000;font-weight:bold}
.bo_current {color:#e8180c}
#bo_list .profile_img img {border-radius:50%}
#bo_list .cnt_cmt {background:#e9eff5;color:#3a8afd;font-size:11px;height:16px;line-height:16px;padding:0 5px;border-radius:3px;vertical-align:middle}
#bo_list .bo_tit .title_icon {margin-right:2px}
#bo_list .bo_tit .fa-heart {color:#ff0000}
#bo_list .bo_tit .fa-lock {display:inline-block;line-height:14px;width:16px;font-size:0.833em;color:#4f818c;background:#cbe3e8;text-align:center;border-radius:2px;font-size:12px;border:1px solid #cbe3e8;vertical-align:middle}
#bo_list .bo_tit .new_icon {display:inline-block;width:16px;line-height:16px;font-size:0.833em;color:#23db79;background:#b9ffda;text-align:center;border-radius:2px;margin-left:2px;font-weight:bold;vertical-align:middle}
#bo_list .bo_tit .hot_icon {display:inline-block;width:16px;line-height:16px;font-size:0.833em;color:#ff0000;background:#ffb9b9;text-align:center;border-radius:2px;vertical-align:middle}
#bo_list .bo_tit .fa-caret-right {color:#bbb}
#bo_list .bo_tit .fa-download {display:inline-block;width:16px;line-height:16px;font-size:0.833em;color:#daae37;background:#ffefb9;text-align:center;border-radius:2px;margin-left:5px;vertical-align:middle}
#bo_list .bo_tit .fa-link {display:inline-block;width:16px;line-height:16px;font-size:0.833em;color:#b451fd;background:#edd3fd;text-align:center;border-radius:2px;margin-left:5px;vertical-align:middle}
.bo_sch_wrap {display:none;width:100%;height:100%;position:fixed;top:0;left:0;z-index:999}
.bo_sch {position:absolute;top:50%;left:50%;background:#fff;text-align:left;width:330px;max-height:300px;margin-left:-125px;margin-top:-180px;overflow-y:auto;border-radius:5px;-webkit-box-shadow:1px 1px 18px rgba(0,0,0,0.2);-moz-box-shadow:1px 1px 18px rgba(0,0,0,0.2);box-shadow:1px 1px 18px rgba(0,0,0,0.2);border:1px solid #dde7e9;background:#fff;border-radius:3px}
.bo_sch:after {display:block;visibility:hidden;clear:both;content:""}
.bo_sch h3 {padding:15px;border-bottom:1px solid #e8e8e8}
.bo_sch legend {background:red}
.bo_sch form {padding:15px;display:block}
.bo_sch select {border:0;width:100%;height:40px;border:1px solid #d0d3db;border-radius:2px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075);
-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075);
box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075)}
.bo_sch .sch_bar {display:inline-block;width:100%;clear:both;margin-top:15px;border:1px solid #d0d3db;border-radius:2px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075);
-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075);
box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075)}
.bo_sch .sch_input {width:250px;height:38px;border:0;padding:0;background-color:transparent;float:left}
.bo_sch .sch_btn {height:38px;float:right;color:#656565;background:none;border:0;width:40px;font-size:15px}
.bo_sch .bo_sch_cls {position:absolute;right:0;top:0;color:#b5b8bb;border:0;padding:12px 15px;font-size:16px;background:#fff}
.bo_sch_bg {background:#000;background:rgba(0,0,0,0.1);width:100%;height:100%}
/* 게시판 쓰기 */
#char_count_desc {display:block;margin:0 0 5px;padding:0}
#char_count_wrap {margin:5px 0 0;text-align:right}
#char_count {font-weight:bold}
#autosave_wrapper {position:relative}
#autosave_pop {display:none;z-index:10;position:absolute !important;top:34px;right:0;width:350px;height:auto !important;height:180px;max-height:180px;border:1px solid #565656;background:#fff;
-webkit-box-shadow:2px 2px 3px 0px rgba(0,0,0,0.2);
-moz-box-shadow:2px 2px 3px 0px rgba(0,0,0,0.2);
box-shadow:2px 2px 3px 0px rgba(0,0,0,0.2)}
#autosave_pop:before {content:"";position:absolute;top:-8px;right:45px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #000 transparent}
#autosave_pop:after {content:"";position:absolute;top:-7px;right:45px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #fff transparent}
html.no-overflowscrolling #autosave_pop {height:auto;max-height:10000px !important} /* overflow 미지원 기기 대응 */
#autosave_pop strong {position:absolute;font-size:0;line-height:0;overflow:hidden}
#autosave_pop div {text-align:center;margin:0 !important}
#autosave_pop button {margin:0;padding:0;border:0}
#autosave_pop ul {padding:15px;border-top:1px solid #e9e9e9;list-style:none;overflow-y:scroll;height:130px;border-bottom:1px solid #e8e8e8}
#autosave_pop li {padding:8px 5px;border-bottom:1px solid #fff;background:#eee;zoom:1}
#autosave_pop li:after {display:block;visibility:hidden;clear:both;content:""}
#autosave_pop a {display:block;float:left}
#autosave_pop span {display:block;float:right;font-size:0.92em;font-style:italic;color:#999}
.autosave_close {cursor:pointer;width:100%;height:30px;background:none;color:#888;font-weight:bold;font-size:0.92em}
.autosave_close:hover {background:#f3f3f3;color:#3597d9}
.autosave_content {display:none}
.autosave_del {background:url(./img/close_btn.png) no-repeat 50% 50%;text-indent:-999px;overflow:hidden;height:20px;width:20px}
/* 게시판 읽기 */
#bo_v {margin-bottom:20px;background:#fff;box-sizing:border-box}
#bo_v_table {position:absolute;top:0;right:16px;margin:0;padding:0 5px;height:25px;background:#ff3061;color:#fff;font-weight:bold;line-height:2.2em}
#bo_v_title {}
#bo_v_title .bo_v_cate {display:inline-block;line-height:20px;background:#e2eaf6;color:#3a8afd;padding:0 10px;border-radius:3px;}
#bo_v_title .bo_v_tit {display:block;font-size:2em;margin:5px 0 0;word-break:break-all}
#bo_v_info {margin:0;border-bottom:1px solid #f1f1f1;color:#666}
#bo_v_info:after {display:block;visibility:hidden;clear:both;content:""}
#bo_v_info h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
#bo_v_info .profile_info {margin:20px 0 10px;display:inline-block;float:left}
#bo_v_info .profile_info .pf_img {float:left;margin-right:10px}
#bo_v_info .profile_info .pf_img img {border-radius:50%;width:50px;height:50px}
#bo_v_info .profile_info .profile_info_ct {float:left;padding:5px 0;line-height:18px}
#bo_v_info strong {display:inline-block;margin:0 10px 0 0;font-weight:normal}
#bo_v_info .sv_member,
#bo_v_info .sv_guest,
#bo_v_info .member,
#bo_v_info .guest {font-weight:bold}
#bo_v_info .profile_img {display:none}
#bo_v_info .sv_member {color:#000}
#bo_v_info .if_date {margin:0;color:#888}
#bo_v_file h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
#bo_v_file ul {margin:0;list-style:none}
#bo_v_file li {padding:15px;position:relative;margin:10px 0;border:1px solid #dfdfdf;border-radius:5px;
-webkit-box-shadow:1px 1px 5px 0px hsl(232, 36%, 96%);
-moz-box-shadow:1px 1px 5px 0px hsl(232, 36%, 96%);
box-shadow:1px 1px 5px 0px hsl(232, 36%, 96%)}
#bo_v_file li i {float:left;color:#b2b2b2;font-size:2.35em;margin-right:20px}
#bo_v_file a {float:left;display:block;text-decoration:none;word-wrap:break-word;color:#000}
#bo_v_file a:focus, #bo_v_file li:hover a, #bo_v_file a:active {text-decoration:underline;color:#3a8afd}
#bo_v_file img {float:left;margin:0 10px 0 0}
#bo_v_file .bo_v_file_cnt {color:#b2b2b2;font-size:0.92em}
#bo_v_file li:hover {border-color:#bed4f4;color:#bed4f4}
#bo_v_file li:hover i {color:#3a8afd}
#bo_v_file li:hover .bo_v_file_cnt {color:#99c2fc}
#bo_v_link h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
#bo_v_file ul {margin:0;list-style:none}
#bo_v_link li {padding:15px;position:relative;margin:10px 0;border:1px solid #dfdfdf;border-radius:5px;
-webkit-box-shadow:1px 1px 5px 0px hsl(232, 36%, 96%);
-moz-box-shadow:1px 1px 5px 0px hsl(232, 36%, 96%);
box-shadow:1px 1px 5px 0px hsl(232, 36%, 96%)}
#bo_v_link li i {float:left;color:#b2b2b2;font-size:2.35em;margin-right:20px}
#bo_v_link a {float:left;display:block;text-decoration:none;word-wrap:break-word;color:#000}
#bo_v_link a:focus, #bo_v_link li:hover a, #bo_v_link a:active {text-decoration:underline;color:#3a8afd}
#bo_v_link .bo_v_link_cnt {color:#b2b2b2;font-size:0.92em}
#bo_v_link li:hover {border-color:#bed4f4;color:#bed4f4}
#bo_v_link li:hover i {color:#3a8afd}
#bo_v_link li:hover .bo_v_link_cnt {color:#99c2fc}
#bo_v_top {zoom:1}
#bo_v_top:after {display:block;visibility:hidden;clear:both;content:""}
#bo_v_top h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
#bo_v_top ul {padding:0;list-style:none;word-break:break-all;background:#fff}
#bo_v_bot {zoom:1}
#bo_v_bot:after {display:block;visibility:hidden;clear:both;content:""}
#bo_v_bot h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
#bo_v_bot ul {padding:0;list-style:none}
.bo_v_com {margin:20px 0;float:right}
.bo_v_com > li {position:relative;float:left;margin-left:5px}
.bo_v_nb {position:relative;margin:20px 0;clear:both;text-align:left}
.bo_v_nb:after {display:block;visibility:hidden;clear:both;content:""}
.bo_v_nb li {border-top:1px solid #f1f1f1;padding:13px}
.bo_v_nb li:last-child {border-bottom:1px solid #f1f1f1}
.bo_v_nb li:hover {background:#f6f6f6}
.bo_v_nb li i {font-size:13px;color:#b3b3b3}
.bo_v_nb li .nb_tit {display:inline-block;padding-right:20px;color:#b3b3b3}
.bo_v_nb li .nb_date {float:right;color:#b3b3b3}
#bo_v_atc {min-height:200px;height:auto !important;height:200px}
#bo_v_atc_title {position:absolute;font-size:0;line-height:0;overflow:hidden}
#bo_v_img {width:100%;overflow:hidden;zoom:1}
#bo_v_img:after {display:block;visibility:hidden;clear:both;content:""}
#bo_v_img a.view_image {display:block}
#bo_v_img img {margin-bottom:20px;max-width:100%;height:auto}
#bo_v_con {margin:10px 0 30px;width:100%;line-height:1.7em;min-height:200px;word-break:break-all;overflow:hidden}
#bo_v_con a {color:#000;text-decoration:underline}
#bo_v_con img {max-width:100%;height:auto}
#bo_v_act {margin-bottom:30px;text-align:center}
#bo_v_act .bo_v_act_gng {position:relative}
#bo_v_act a {margin-right:5px;vertical-align:middle;color:#4a5158}
#bo_v_act a:hover {background-color:#fff;color:#ff484f;border-color:#ff484f}
#bo_v_act i {font-size:1.4em;margin-right:5px}
#bo_v_act_good, #bo_v_act_nogood {display:none;position:absolute;top:30px;left:0;z-index:9999;padding:10px 0;width:165px;background:#ff3061;color:#fff;text-align:center}
#bo_v_act .bo_v_good {display:inline-block;border:1px solid #dedede;width:70px;line-height:46px;border-radius:30px}
#bo_v_act .bo_v_nogood {display:inline-block;border:1px solid #dedede;width:70px;line-height:46px;border-radius:30px}
#bo_v_sns {padding:0;list-style:none;zoom:1;float:left;display:inline-block}
#bo_v_sns:after {display:block;visibility:hidden;clear:both;content:""}
#bo_v_sns li {float:left;width:135px;margin-right:5px;text-align:left}
#bo_v_sns li a {height:35px;line-height:35px;text-align:center;border-radius:5px;color:#fff;font-size:0.95em}
#bo_v_sns li img {vertical-align:middle;margin-right:5px}
#bo_v_sns li .sns_f {display:block;background:#3b5997}
#bo_v_sns li .sns_t {display:block;background:#09aeee}
#bo_v_sns li .sns_g {display:block;background:#ea4026}
#bo_v_sns li .sns_k {display:block;background:#fbe300}
#bo_v_share {position:relative;padding:20px 0}
#bo_v_share:after {display:block;visibility:hidden;clear:both;content:""}
#bo_v_share .btn {padding:0 10px;color:#555;font-weight:normal;font-size:1em;width:80px;line-height:35px;height:35px;border-color:#d5d5d5;border-radius:5px}
#bo_v_share .btn:hover {background:#fff}
#bo_v_share .btn i {margin-right:5px;color:#4b5259;vertical-align:middle}
/* 게시판 댓글 */
.cmt_btn {width:100%;text-align:left;border:0;border-bottom:1px solid #f0f0f0;background:#fff;font-weight:bold;margin:30px 0 0px;padding:0 0 15px}
.cmt_btn span.total {position:relative;display:inline-block;margin-right:5px;font-size:1em;color:#3a8afd}
.cmt_btn span.cmt_more {float:right;display:inline-block;width:15px;height:10px;background:url(./img/btn_cmt.png) no-repeat right 2px;margin-top:5px}
.cmt_btn_op span.cmt_more {background-position:right -8px}
.cmt_btn b {font-size:1.2em;color:#000}
.cmt_btn span.total:after {position:absolute;bottom:-17px;left:0;display:inline-block;background:#3a8afd;content:"";width:100%;height:2px}
#bo_vc {}
#bo_vc h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
#bo_vc article {margin:20px 0;position:relative;border-bottom:1px solid #f0f0f0}
#bo_vc article:after {display:block;visibility:hidden;clear:both;content:""}
#bo_vc article .profile_img img {border-radius:50%}
#bo_vc article .pf_img {float:left;margin-right:10px}
#bo_vc article .pf_img img {border-radius:50%;width:50px;height:50px}
#bo_vc article .cm_wrap {float:left;max-width:870px;width:90%}
#bo_vc header {position:relative;width:100%}
#bo_vc header:after {display:block;visibility:hidden;clear:both;content:""}
#bo_vc header .profile_img {display:none}
#bo_vc header .icon_reply {position:absolute;top:15px;left:-20px}
#bo_vc .member, #bo_vc .guest, #bo_vc .sv_member, #bo_vc .sv_guest {font-weight:bold}
.bo_vc_hdinfo {color:#777}
#bo_vc h1 {position:absolute;font-size:0;line-height:0;overflow:hidden}
#bo_vc .cmt_contents {line-height:1.8em;padding:0 0 20px}
#bo_vc p a {text-decoration:underline}
#bo_vc p a.s_cmt {text-decoration:underline;color:#ed6479}
#bo_vc_empty {margin:0;padding:80px 0 !important;color:#777;text-align:center}
#bo_vc #bo_vc_winfo {float:left}
#bo_vc .bo_vl_opt {position:absolute;top:0;right:0}
.bo_vc_act {display:none;position:absolute;right:0;top:40px;width:58px;text-align:right;border:1px solid #b8bfc4;margin:0;list-style:none;background:#fff;zoom:1;z-index:9999}
.bo_vc_act:before {content:"";position:absolute;top:-8px;right:5px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #b8bfc4 transparent}
.bo_vc_act:after {content:"";position:absolute;top:-6px;right:5px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #fff transparent}
.bo_vc_act li {border-bottom:1px solid #f0f0f0}
.bo_vc_act li:last-child {border-bottom:0}
.bo_vc_act li a {display:inline-block;padding:10px 15px}
.bo_vc_act li a:hover {color:#3a8afd}
.bo_vc_w {position:relative;margin:10px 0;display:block}
.bo_vc_w:after {display:block;visibility:hidden;clear:both;content:""}
.bo_vc_w h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
.bo_vc_w #char_cnt {display:block;margin:0 0 5px}
.bo_vc_w textarea {border:1px solid #ccc;background:#fff;color:#000;vertical-align:middle;border-radius:3px;padding:5px;width:100%;height:120px;
-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);
-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);
box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1)}
#wr_secret {}
.bo_vc_w_info {margin:10px 0;float:left}
.bo_vc_w_info:after {display:block;visibility:hidden;clear:both;content:""}
.bo_vc_w_info .frm_input {float:left;margin-right:5px}
.bo_vc_w_info #captcha {padding-top:10px;display:block;clear:both}
.bo_vc_w .btn_confirm {clear:both;margin-top:10px}
.bo_vc_w .btn_confirm label {display:inline-block;margin-right:10px;border-radius:3px;font-size:1.5em;text-align:center}
.bo_vc_w .btn_submit {height:45px;padding:0 20px;border-radius:3px;font-weight:bold;font-size:1.083em}
.bo_vc_w .btn_confirm .secret_cm label {font-size:1em !important}
.bo_vc_w_wr:after {display:block;visibility:hidden;clear:both;content:""}
.secret_cm {display:inline-block;float:left}
#bo_vc_send_sns {display:inline-block;float:left}
#bo_vc_sns {display:inline-block;margin:0;padding:0;list-style:none;zoom:1}
#bo_vc_sns:after {display:block;visibility:hidden;clear:both;content:""}
#bo_vc_sns li {float:left;margin:0 5px 0 0}
#bo_vc_sns .sns_li_f {border-radius:3px;background:#3a589b;height:40px;line-height:40px;padding:0 0 0 10px}
#bo_vc_sns .sns_li_t {border-radius:3px;background:#00aced;height:40px;line-height:40px;padding:0 0 0 10px}
#bo_vc_sns .sns_li_off {background:#bbb}
#bo_vc_sns a {display:inline-block;padding:0 15px 0 5px}
#bo_vc_sns input {margin:0 5px 0 0}
/*글쓰기*/
#bo_w .bo_v_option li {display:inline-block;float:left;text-align:left;margin:0 5px 0 0}
#bo_w .bo_v_option li label {vertical-align:baseline}
#bo_w .bo_v_option .chk_box input[type="checkbox"] + label span {margin-left:0;margin-right:5px}
#bo_w .write_div {margin:10px 0;position:relative}
#bo_w .write_div:after {display:block;visibility:hidden;clear:both;content:""}
#bo_w .bo_w_info:after {display:block;visibility:hidden;clear:both;content:""}
#bo_w .bo_w_info .frm_input {float:left;margin-bottom:1%}
#bo_w #wr_password, #bo_w #wr_homepage {margin-left:1%}
#bo_w .wr_content.smarteditor2 iframe {background:#fff}
#bo_w .bo_w_tit {position:relative}
#bo_w .bo_w_tit .frm_input {padding-right:120px}
#bo_w .bo_w_tit #btn_autosave {position:absolute;top:5px;right:5px;line-height:30px;height:30px}
#bo_w .bo_w_link label {position:absolute;top:1px;left:1px;border-radius:3px 0 0 3px;height:38px;line-height:38px;width:40px;font-size:1.2em;text-align:center;color:#b2b2b2}
#bo_w .bo_w_link .frm_input {padding-left:50px}
#bo_w .bo_w_flie .lb_icon {position:absolute;top:0px;left:0px;border-radius:3px 0 0 3px;height:38px;line-height:38px;width:40px;font-size:1.2em;text-align:center;color:#b2b2b2}
#bo_w .bo_w_flie .frm_file {padding-left:50px;margin-top:3px}
#bo_w .bo_w_flie .file_wr {position:relative;border:1px solid #ccc;background:#fff;color:#000;vertical-align:middle;border-radius:3px;padding:5px;height:40px;margin:0}
#bo_w .bo_w_flie .frm_input {margin:10px 0 0}
#bo_w .bo_w_flie .file_del {position:absolute;top:10px;right:10px;font-size:0.92em;color:#7d7d7d}
#bo_w .bo_w_select select {border:1px solid #d0d3db;width:100%;height:40px;border-radius:3px}
#bo_w .btn_submit {padding:0 20px;font-size:1.167em}
#bo_w .btn_cancel {border-radius:3px;font-size:1.167em}
+300
View File
@@ -0,0 +1,300 @@
<?php
if (!defined("_GNUBOARD_")) exit; // 개별 페이지 접근 불가
include_once(G5_LIB_PATH.'/thumbnail.lib.php');
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
add_stylesheet('<link rel="stylesheet" href="'.$board_skin_url.'/style.css">', 0);
?>
<script src="<?php echo G5_JS_URL; ?>/viewimageresize.js"></script>
<!-- 게시물 읽기 시작 { -->
<article id="bo_v" style="width:<?php echo $width; ?>">
<header>
<h2 id="bo_v_title">
<?php if ($category_name) { ?>
<span class="bo_v_cate"><?php echo $view['ca_name']; // 분류 출력 끝 ?></span>
<?php } ?>
<span class="bo_v_tit">
<?php
echo cut_str(get_text($view['wr_subject']), 70); // 글제목 출력
?></span>
</h2>
</header>
<section id="bo_v_info">
<h2>페이지 정보</h2>
<div class="profile_info">
<div class="pf_img"><?php echo get_member_profile_img($view['mb_id']) ?></div>
<div class="profile_info_ct">
<span class="sound_only">작성자</span> <strong><?php echo $view['name'] ?><?php if ($is_ip_view) { echo "&nbsp;($ip)"; } ?></strong><br>
<span class="sound_only">댓글</span><strong><a href="#bo_vc"> <i class="fa fa-commenting-o" aria-hidden="true"></i> <?php echo number_format($view['wr_comment']) ?>건</a></strong>
<span class="sound_only">조회</span><strong><i class="fa fa-eye" aria-hidden="true"></i> <?php echo number_format($view['wr_hit']) ?>회</strong>
<strong class="if_date"><span class="sound_only">작성일</span><i class="fa fa-clock-o" aria-hidden="true"></i> <?php echo date("y-m-d H:i", strtotime($view['wr_datetime'])) ?></strong>
</div>
</div>
<!-- 게시물 상단 버튼 시작 { -->
<div id="bo_v_top">
<?php ob_start(); ?>
<ul class="btn_bo_user bo_v_com">
<li><a href="<?php echo $list_href ?>" class="btn_b01 btn" title="목록"><i class="fa fa-list" aria-hidden="true"></i><span class="sound_only">목록</span></a></li>
<?php if ($reply_href) { ?><li><a href="<?php echo $reply_href ?>" class="btn_b01 btn" title="답변"><i class="fa fa-reply" aria-hidden="true"></i><span class="sound_only">답변</span></a></li><?php } ?>
<?php if ($write_href) { ?><li><a href="<?php echo $write_href ?>" class="btn_b01 btn" title="글쓰기"><i class="fa fa-pencil" aria-hidden="true"></i><span class="sound_only">글쓰기</span></a></li><?php } ?>
<?php if($update_href || $delete_href || $copy_href || $move_href || $search_href) { ?>
<li>
<button type="button" class="btn_more_opt is_view_btn btn_b01 btn"><i class="fa fa-ellipsis-v" aria-hidden="true"></i><span class="sound_only">게시판 리스트 옵션</span></button>
<ul class="more_opt is_view_btn">
<?php if ($update_href) { ?><li><a href="<?php echo $update_href ?>">수정<i class="fa fa-pencil-square-o" aria-hidden="true"></i></a></li><?php } ?>
<?php if ($delete_href) { ?><li><a href="<?php echo $delete_href ?>" onclick="del(this.href); return false;">삭제<i class="fa fa-trash-o" aria-hidden="true"></i></a></li><?php } ?>
<?php if ($copy_href) { ?><li><a href="<?php echo $copy_href ?>" onclick="board_move(this.href); return false;">복사<i class="fa fa-files-o" aria-hidden="true"></i></a></li><?php } ?>
<?php if ($move_href) { ?><li><a href="<?php echo $move_href ?>" onclick="board_move(this.href); return false;">이동<i class="fa fa-arrows" aria-hidden="true"></i></a></li><?php } ?>
<?php if ($search_href) { ?><li><a href="<?php echo $search_href ?>">검색<i class="fa fa-search" aria-hidden="true"></i></a></li><?php } ?>
</ul>
</li>
<?php } ?>
</ul>
<script>
jQuery(function($){
// 게시판 보기 버튼 옵션
$(".btn_more_opt.is_view_btn").on("click", function(e) {
e.stopPropagation();
$(".more_opt.is_view_btn").toggle();
})
;
$(document).on("click", function (e) {
if(!$(e.target).closest('.is_view_btn').length) {
$(".more_opt.is_view_btn").hide();
}
});
});
</script>
<?php
$link_buttons = ob_get_contents();
ob_end_flush();
?>
</div>
<!-- } 게시물 상단 버튼 끝 -->
</section>
<section id="bo_v_atc">
<h2 id="bo_v_atc_title">본문</h2>
<div id="bo_v_share">
<?php include_once(G5_SNS_PATH."/view.sns.skin.php"); ?>
<?php if ($scrap_href) { ?><a href="<?php echo $scrap_href; ?>" target="_blank" class="btn btn_b03" onclick="win_scrap(this.href); return false;"><i class="fa fa-bookmark" aria-hidden="true"></i> 스크랩</a><?php } ?>
</div>
<?php
// 파일 출력
$v_img_count = count($view['file']);
if($v_img_count) {
echo "<div id=\"bo_v_img\">\n";
foreach($view['file'] as $view_file) {
echo get_file_thumbnail($view_file);
}
echo "</div>\n";
}
?>
<!-- 본문 내용 시작 { -->
<div id="bo_v_con"><?php echo get_view_thumbnail($view['content']); ?></div>
<?php //echo $view['rich_content']; // {이미지:0} 과 같은 코드를 사용할 경우 ?>
<!-- } 본문 내용 끝 -->
<?php if ($is_signature) { ?><p><?php echo $signature ?></p><?php } ?>
<!-- 추천 비추천 시작 { -->
<?php if ( $good_href || $nogood_href) { ?>
<div id="bo_v_act">
<?php if ($good_href) { ?>
<span class="bo_v_act_gng">
<a href="<?php echo $good_href.'&amp;'.$qstr ?>" id="good_button" class="bo_v_good"><i class="fa fa-thumbs-o-up" aria-hidden="true"></i><span class="sound_only">추천</span><strong><?php echo number_format($view['wr_good']) ?></strong></a>
<b id="bo_v_act_good"></b>
</span>
<?php } ?>
<?php if ($nogood_href) { ?>
<span class="bo_v_act_gng">
<a href="<?php echo $nogood_href.'&amp;'.$qstr ?>" id="nogood_button" class="bo_v_nogood"><i class="fa fa-thumbs-o-down" aria-hidden="true"></i><span class="sound_only">비추천</span><strong><?php echo number_format($view['wr_nogood']) ?></strong></a>
<b id="bo_v_act_nogood"></b>
</span>
<?php } ?>
</div>
<?php } else {
if($board['bo_use_good'] || $board['bo_use_nogood']) {
?>
<div id="bo_v_act">
<?php if($board['bo_use_good']) { ?><span class="bo_v_good"><i class="fa fa-thumbs-o-up" aria-hidden="true"></i><span class="sound_only">추천</span><strong><?php echo number_format($view['wr_good']) ?></strong></span><?php } ?>
<?php if($board['bo_use_nogood']) { ?><span class="bo_v_nogood"><i class="fa fa-thumbs-o-down" aria-hidden="true"></i><span class="sound_only">비추천</span><strong><?php echo number_format($view['wr_nogood']) ?></strong></span><?php } ?>
</div>
<?php
}
}
?>
<!-- } 추천 비추천 끝 -->
</section>
<?php
$cnt = 0;
if ($view['file']['count']) {
for ($i=0; $i<count($view['file']); $i++) {
if (isset($view['file'][$i]['source']) && $view['file'][$i]['source'] && !$view['file'][$i]['view'])
$cnt++;
}
}
?>
<?php if($cnt) { ?>
<!-- 첨부파일 시작 { -->
<section id="bo_v_file">
<h2>첨부파일</h2>
<ul>
<?php
// 가변 파일
for ($i=0; $i<count($view['file']); $i++) {
if (isset($view['file'][$i]['source']) && $view['file'][$i]['source'] && !$view['file'][$i]['view']) {
?>
<li>
<i class="fa fa-folder-open" aria-hidden="true"></i>
<a href="<?php echo $view['file'][$i]['href']; ?>" class="view_file_download">
<strong><?php echo $view['file'][$i]['source'] ?></strong> <?php echo $view['file'][$i]['content'] ?> (<?php echo $view['file'][$i]['size'] ?>)
</a>
<br>
<span class="bo_v_file_cnt"><?php echo $view['file'][$i]['download'] ?>회 다운로드 | DATE : <?php echo $view['file'][$i]['datetime'] ?></span>
</li>
<?php
}
}
?>
</ul>
</section>
<!-- } 첨부파일 끝 -->
<?php } ?>
<?php if(isset($view['link']) && array_filter($view['link'])) { ?>
<!-- 관련링크 시작 { -->
<section id="bo_v_link">
<h2>관련링크</h2>
<ul>
<?php
// 링크
$cnt = 0;
for ($i=1; $i<=count($view['link']); $i++) {
if ($view['link'][$i]) {
$cnt++;
$link = cut_str($view['link'][$i], 70);
?>
<li>
<i class="fa fa-link" aria-hidden="true"></i>
<a href="<?php echo $view['link_href'][$i] ?>" target="_blank">
<strong><?php echo $link ?></strong>
</a>
<br>
<span class="bo_v_link_cnt"><?php echo $view['link_hit'][$i] ?>회 연결</span>
</li>
<?php
}
}
?>
</ul>
</section>
<!-- } 관련링크 끝 -->
<?php } ?>
<?php if ($prev_href || $next_href) { ?>
<ul class="bo_v_nb">
<?php if ($prev_href) { ?><li class="btn_prv"><span class="nb_tit"><i class="fa fa-chevron-up" aria-hidden="true"></i> 이전글</span><a href="<?php echo $prev_href ?>"><?php echo $prev_wr_subject;?></a> <span class="nb_date"><?php echo str_replace('-', '.', substr($prev_wr_date, '2', '8')); ?></span></li><?php } ?>
<?php if ($next_href) { ?><li class="btn_next"><span class="nb_tit"><i class="fa fa-chevron-down" aria-hidden="true"></i> 다음글</span><a href="<?php echo $next_href ?>"><?php echo $next_wr_subject;?></a> <span class="nb_date"><?php echo str_replace('-', '.', substr($next_wr_date, '2', '8')); ?></span></li><?php } ?>
</ul>
<?php } ?>
<?php
// 코멘트 입출력
include_once(G5_BBS_PATH.'/view_comment.php');
?>
</article>
<!-- } 게시판 읽기 끝 -->
<script>
<?php if ($board['bo_download_point'] < 0) { ?>
$(function() {
$("a.view_file_download").click(function() {
if(!g5_is_member) {
alert("다운로드 권한이 없습니다.\n회원이시라면 로그인 후 이용해 보십시오.");
return false;
}
var msg = "파일을 다운로드 하시면 포인트가 차감(<?php echo number_format($board['bo_download_point']) ?>점)됩니다.\n\n포인트는 게시물당 한번만 차감되며 다음에 다시 다운로드 하셔도 중복하여 차감하지 않습니다.\n\n그래도 다운로드 하시겠습니까?";
if(confirm(msg)) {
var href = $(this).attr("href")+"&js=on";
$(this).attr("href", href);
return true;
} else {
return false;
}
});
});
<?php } ?>
function board_move(href)
{
window.open(href, "boardmove", "left=50, top=50, width=500, height=550, scrollbars=1");
}
</script>
<script>
$(function() {
$("a.view_image").click(function() {
window.open(this.href, "large_image", "location=yes,links=no,toolbar=no,top=10,left=10,width=10,height=10,resizable=yes,scrollbars=no,status=no");
return false;
});
// 추천, 비추천
$("#good_button, #nogood_button").click(function() {
var $tx;
if(this.id == "good_button")
$tx = $("#bo_v_act_good");
else
$tx = $("#bo_v_act_nogood");
excute_good(this.href, $(this), $tx);
return false;
});
// 이미지 리사이즈
$("#bo_v_atc").viewimageresize();
});
function excute_good(href, $el, $tx)
{
$.post(
href,
{ js: "on" },
function(data) {
if(data.error) {
alert(data.error);
return false;
}
if(data.count) {
$el.find("strong").text(number_format(String(data.count)));
if($tx.attr("id").search("nogood") > -1) {
$tx.text("이 글을 비추천하셨습니다.");
$tx.fadeIn(200).delay(2500).fadeOut(200);
} else {
$tx.text("이 글을 추천하셨습니다.");
$tx.fadeIn(200).delay(2500).fadeOut(200);
}
}
}, "json"
);
}
</script>
<!-- } 게시글 읽기 끝 -->
+355
View File
@@ -0,0 +1,355 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
?>
<script>
// 글자수 제한
var char_min = parseInt(<?php echo $comment_min ?>); // 최소
var char_max = parseInt(<?php echo $comment_max ?>); // 최대
</script>
<button type="button" class="cmt_btn"><span class="total"><b>댓글</b> <?php echo $view['wr_comment']; ?></span><span class="cmt_more"></span></button>
<!-- 댓글 시작 { -->
<section id="bo_vc">
<h2>댓글목록</h2>
<?php
$cmt_amt = count($list);
for ($i=0; $i<$cmt_amt; $i++) {
$comment_id = $list[$i]['wr_id'];
$cmt_depth = strlen($list[$i]['wr_comment_reply']) * 50;
$comment = $list[$i]['content'];
/*
if (strstr($list[$i]['wr_option'], "secret")) {
$str = $str;
}
*/
$comment = preg_replace("/\[\<a\s.*href\=\"(http|https|ftp|mms)\:\/\/([^[:space:]]+)\.(mp3|wma|wmv|asf|asx|mpg|mpeg)\".*\<\/a\>\]/i", "<script>doc_write(obj_movie('$1://$2.$3'));</script>", $comment);
$cmt_sv = $cmt_amt - $i + 1; // 댓글 헤더 z-index 재설정 ie8 이하 사이드뷰 겹침 문제 해결
$c_reply_href = $comment_common_url.'&amp;c_id='.$comment_id.'&amp;w=c#bo_vc_w';
$c_edit_href = $comment_common_url.'&amp;c_id='.$comment_id.'&amp;w=cu#bo_vc_w';
$is_comment_reply_edit = ($list[$i]['is_reply'] || $list[$i]['is_edit'] || $list[$i]['is_del']) ? 1 : 0;
?>
<article id="c_<?php echo $comment_id ?>" <?php if ($cmt_depth) { ?>style="margin-left:<?php echo $cmt_depth ?>px;border-top-color:#e0e0e0"<?php } ?>>
<div class="pf_img"><?php echo get_member_profile_img($list[$i]['mb_id']); ?></div>
<div class="cm_wrap">
<header style="z-index:<?php echo $cmt_sv; ?>">
<h2><?php echo get_text($list[$i]['wr_name']); ?>님의 <?php if ($cmt_depth) { ?><span class="sound_only">댓글의</span><?php } ?> 댓글</h2>
<?php echo $list[$i]['name'] ?>
<?php if ($is_ip_view) { ?>
<span class="sound_only">아이피</span>
<span>(<?php echo $list[$i]['ip']; ?>)</span>
<?php } ?>
<span class="sound_only">작성일</span>
<span class="bo_vc_hdinfo"><i class="fa fa-clock-o" aria-hidden="true"></i> <time datetime="<?php echo date('Y-m-d\TH:i:s+09:00', strtotime($list[$i]['datetime'])) ?>"><?php echo $list[$i]['datetime'] ?></time></span>
<?php
include(G5_SNS_PATH.'/view_comment_list.sns.skin.php');
?>
</header>
<!-- 댓글 출력 -->
<div class="cmt_contents">
<p>
<?php if (strstr($list[$i]['wr_option'], "secret")) { ?><img src="<?php echo $board_skin_url; ?>/img/icon_secret.gif" alt="비밀글"><?php } ?>
<?php echo $comment ?>
</p>
<?php if($is_comment_reply_edit) {
if($w == 'cu') {
$sql = " select wr_id, wr_content, mb_id from $write_table where wr_id = '$c_id' and wr_is_comment = '1' ";
$cmt = sql_fetch($sql);
if (isset($cmt)) {
if (!($is_admin || ($member['mb_id'] == $cmt['mb_id'] && $cmt['mb_id']))) {
$cmt['wr_content'] = '';
}
$c_wr_content = $cmt['wr_content'];
}
}
?>
<?php } ?>
</div>
<span id="edit_<?php echo $comment_id ?>" class="bo_vc_w"></span><!-- 수정 -->
<span id="reply_<?php echo $comment_id ?>" class="bo_vc_w"></span><!-- 답변 -->
<input type="hidden" value="<?php echo strstr($list[$i]['wr_option'],"secret") ?>" id="secret_comment_<?php echo $comment_id ?>">
<textarea id="save_comment_<?php echo $comment_id ?>" style="display:none"><?php echo get_text($list[$i]['content1'], 0) ?></textarea>
</div>
<?php if($is_comment_reply_edit) { ?>
<div class="bo_vl_opt">
<button type="button" class="btn_cm_opt btn_b01 btn"><i class="fa fa-ellipsis-v" aria-hidden="true"></i><span class="sound_only">댓글 옵션</span></button>
<ul class="bo_vc_act">
<?php if ($list[$i]['is_reply']) { ?><li><a href="<?php echo $c_reply_href; ?>" onclick="comment_box('<?php echo $comment_id ?>', 'c'); return false;">답변</a></li><?php } ?>
<?php if ($list[$i]['is_edit']) { ?><li><a href="<?php echo $c_edit_href; ?>" onclick="comment_box('<?php echo $comment_id ?>', 'cu'); return false;">수정</a></li><?php } ?>
<?php if ($list[$i]['is_del']) { ?><li><a href="<?php echo $list[$i]['del_link']; ?>" onclick="return comment_delete();">삭제</a></li><?php } ?>
</ul>
</div>
<?php } ?>
<script>
$(function() {
// 댓글 옵션창 열기
$(".btn_cm_opt").on("click", function(){
$(this).parent("div").children(".bo_vc_act").show();
});
// 댓글 옵션창 닫기
$(document).mouseup(function (e){
var container = $(".bo_vc_act");
if( container.has(e.target).length === 0)
container.hide();
});
});
</script>
</article>
<?php } ?>
<?php if ($i == 0) { //댓글이 없다면 ?><p id="bo_vc_empty">등록된 댓글이 없습니다.</p><?php } ?>
</section>
<!-- } 댓글 끝 -->
<?php if ($is_comment_write) {
if($w == '')
$w = 'c';
?>
<!-- 댓글 쓰기 시작 { -->
<aside id="bo_vc_w" class="bo_vc_w">
<h2>댓글쓰기</h2>
<form name="fviewcomment" id="fviewcomment" action="<?php echo $comment_action_url; ?>" onsubmit="return fviewcomment_submit(this);" method="post" autocomplete="off">
<input type="hidden" name="w" value="<?php echo $w ?>" id="w">
<input type="hidden" name="bo_table" value="<?php echo $bo_table ?>">
<input type="hidden" name="wr_id" value="<?php echo $wr_id ?>">
<input type="hidden" name="comment_id" value="<?php echo $c_id ?>" id="comment_id">
<input type="hidden" name="sca" value="<?php echo $sca ?>">
<input type="hidden" name="sfl" value="<?php echo $sfl ?>">
<input type="hidden" name="stx" value="<?php echo $stx ?>">
<input type="hidden" name="spt" value="<?php echo $spt ?>">
<input type="hidden" name="page" value="<?php echo $page ?>">
<input type="hidden" name="is_good" value="">
<span class="sound_only">내용</span>
<?php if ($comment_min || $comment_max) { ?><strong id="char_cnt"><span id="char_count"></span>글자</strong><?php } ?>
<textarea id="wr_content" name="wr_content" maxlength="10000" required class="required" title="내용" placeholder="댓글내용을 입력해주세요"
<?php if ($comment_min || $comment_max) { ?>onkeyup="check_byte('wr_content', 'char_count');"<?php } ?>><?php echo $c_wr_content; ?></textarea>
<?php if ($comment_min || $comment_max) { ?><script> check_byte('wr_content', 'char_count'); </script><?php } ?>
<script>
$(document).on("keyup change", "textarea#wr_content[maxlength]", function() {
var str = $(this).val()
var mx = parseInt($(this).attr("maxlength"))
if (str.length > mx) {
$(this).val(str.substr(0, mx));
return false;
}
});
</script>
<div class="bo_vc_w_wr">
<div class="bo_vc_w_info">
<?php if ($is_guest) { ?>
<label for="wr_name" class="sound_only">이름<strong> 필수</strong></label>
<input type="text" name="wr_name" value="<?php echo get_cookie("ck_sns_name"); ?>" id="wr_name" required class="frm_input required" size="25" placeholder="이름">
<label for="wr_password" class="sound_only">비밀번호<strong> 필수</strong></label>
<input type="password" name="wr_password" id="wr_password" required class="frm_input required" size="25" placeholder="비밀번호">
<?php
}
?>
<?php
if($board['bo_use_sns'] && ($config['cf_facebook_appid'] || $config['cf_twitter_key'])) {
?>
<span class="sound_only">SNS 동시등록</span>
<span id="bo_vc_send_sns"></span>
<?php } ?>
<?php if ($is_guest) { ?>
<?php echo $captcha_html; ?>
<?php } ?>
</div>
<div class="btn_confirm">
<span class="secret_cm chk_box">
<input type="checkbox" name="wr_secret" value="secret" id="wr_secret" class="selec_chk">
<label for="wr_secret"><span></span>비밀글</label>
</span>
<button type="submit" id="btn_submit" class="btn_submit">댓글등록</button>
</div>
</div>
</form>
</aside>
<script>
var save_before = '';
var save_html = document.getElementById('bo_vc_w').innerHTML;
function good_and_write()
{
var f = document.fviewcomment;
if (fviewcomment_submit(f)) {
f.is_good.value = 1;
f.submit();
} else {
f.is_good.value = 0;
}
}
function fviewcomment_submit(f)
{
var pattern = /(^\s*)|(\s*$)/g; // \s 공백 문자
f.is_good.value = 0;
var subject = "";
var content = "";
$.ajax({
url: g5_bbs_url+"/ajax.filter.php",
type: "POST",
data: {
"subject": "",
"content": f.wr_content.value
},
dataType: "json",
async: false,
cache: false,
success: function(data, textStatus) {
subject = data.subject;
content = data.content;
}
});
if (content) {
alert("내용에 금지단어('"+content+"')가 포함되어있습니다");
f.wr_content.focus();
return false;
}
// 양쪽 공백 없애기
var pattern = /(^\s*)|(\s*$)/g; // \s 공백 문자
document.getElementById('wr_content').value = document.getElementById('wr_content').value.replace(pattern, "");
if (char_min > 0 || char_max > 0)
{
check_byte('wr_content', 'char_count');
var cnt = parseInt(document.getElementById('char_count').innerHTML);
if (char_min > 0 && char_min > cnt)
{
alert("댓글은 "+char_min+"글자 이상 쓰셔야 합니다.");
return false;
} else if (char_max > 0 && char_max < cnt)
{
alert("댓글은 "+char_max+"글자 이하로 쓰셔야 합니다.");
return false;
}
}
else if (!document.getElementById('wr_content').value)
{
alert("댓글을 입력하여 주십시오.");
return false;
}
if (typeof(f.wr_name) != 'undefined')
{
f.wr_name.value = f.wr_name.value.replace(pattern, "");
if (f.wr_name.value == '')
{
alert('이름이 입력되지 않았습니다.');
f.wr_name.focus();
return false;
}
}
if (typeof(f.wr_password) != 'undefined')
{
f.wr_password.value = f.wr_password.value.replace(pattern, "");
if (f.wr_password.value == '')
{
alert('비밀번호가 입력되지 않았습니다.');
f.wr_password.focus();
return false;
}
}
<?php if($is_guest) echo chk_captcha_js(); ?>
set_comment_token(f);
document.getElementById("btn_submit").disabled = "disabled";
return true;
}
function comment_box(comment_id, work)
{
var el_id,
form_el = 'fviewcomment',
respond = document.getElementById(form_el);
// 댓글 아이디가 넘어오면 답변, 수정
if (comment_id)
{
if (work == 'c')
el_id = 'reply_' + comment_id;
else
el_id = 'edit_' + comment_id;
}
else
el_id = 'bo_vc_w';
if (save_before != el_id)
{
if (save_before)
{
document.getElementById(save_before).style.display = 'none';
}
document.getElementById(el_id).style.display = '';
document.getElementById(el_id).appendChild(respond);
//입력값 초기화
document.getElementById('wr_content').value = '';
// 댓글 수정
if (work == 'cu')
{
document.getElementById('wr_content').value = document.getElementById('save_comment_' + comment_id).value;
if (typeof char_count != 'undefined')
check_byte('wr_content', 'char_count');
if (document.getElementById('secret_comment_'+comment_id).value)
document.getElementById('wr_secret').checked = true;
else
document.getElementById('wr_secret').checked = false;
}
document.getElementById('comment_id').value = comment_id;
document.getElementById('w').value = work;
if(save_before)
$("#captcha_reload").trigger("click");
save_before = el_id;
}
}
function comment_delete()
{
return confirm("이 댓글을 삭제하시겠습니까?");
}
comment_box('', 'c'); // 댓글 입력폼이 보이도록 처리하기위해서 추가 (root님)
<?php if($board['bo_use_sns'] && ($config['cf_facebook_appid'] || $config['cf_twitter_key'])) { ?>
$(function() {
// sns 등록
$("#bo_vc_send_sns").load(
"<?php echo G5_SNS_URL; ?>/view_comment_write.sns.skin.php?bo_table=<?php echo $bo_table; ?>",
function() {
save_html = document.getElementById('bo_vc_w').innerHTML;
}
);
});
<?php } ?>
</script>
<?php } ?>
<!-- } 댓글 쓰기 끝 -->
<script>
jQuery(function($) {
//댓글열기
$(".cmt_btn").click(function(e){
e.preventDefault();
$(this).toggleClass("cmt_btn_op");
$("#bo_vc").toggle();
});
});
</script>
+255
View File
@@ -0,0 +1,255 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
add_stylesheet('<link rel="stylesheet" href="'.$board_skin_url.'/style.css">', 0);
?>
<section id="bo_w">
<h2 class="sound_only"><?php echo $g5['title'] ?></h2>
<!-- 게시물 작성/수정 시작 { -->
<form name="fwrite" id="fwrite" action="<?php echo $action_url ?>" onsubmit="return fwrite_submit(this);" method="post" enctype="multipart/form-data" autocomplete="off" style="width:<?php echo $width; ?>">
<input type="hidden" name="uid" value="<?php echo get_uniqid(); ?>">
<input type="hidden" name="w" value="<?php echo $w ?>">
<input type="hidden" name="bo_table" value="<?php echo $bo_table ?>">
<input type="hidden" name="wr_id" value="<?php echo $wr_id ?>">
<input type="hidden" name="sca" value="<?php echo $sca ?>">
<input type="hidden" name="sfl" value="<?php echo $sfl ?>">
<input type="hidden" name="stx" value="<?php echo $stx ?>">
<input type="hidden" name="spt" value="<?php echo $spt ?>">
<input type="hidden" name="sst" value="<?php echo $sst ?>">
<input type="hidden" name="sod" value="<?php echo $sod ?>">
<input type="hidden" name="page" value="<?php echo $page ?>">
<?php
$option = '';
$option_hidden = '';
if ($is_notice || $is_html || $is_secret || $is_mail) {
$option = '';
if ($is_notice) {
$option .= PHP_EOL.'<li class="chk_box"><input type="checkbox" id="notice" name="notice" class="selec_chk" value="1" '.$notice_checked.'>'.PHP_EOL.'<label for="notice"><span></span>공지</label></li>';
}
if ($is_html) {
if ($is_dhtml_editor) {
$option_hidden .= '<input type="hidden" value="html1" name="html">';
} else {
$option .= PHP_EOL.'<li class="chk_box"><input type="checkbox" id="html" name="html" onclick="html_auto_br(this);" class="selec_chk" value="'.$html_value.'" '.$html_checked.'>'.PHP_EOL.'<label for="html"><span></span>html</label></li>';
}
}
if ($is_secret) {
if ($is_admin || $is_secret==1) {
$option .= PHP_EOL.'<li class="chk_box"><input type="checkbox" id="secret" name="secret" class="selec_chk" value="secret" '.$secret_checked.'>'.PHP_EOL.'<label for="secret"><span></span>비밀글</label></li>';
} else {
$option_hidden .= '<input type="hidden" name="secret" value="secret">';
}
}
if ($is_mail) {
$option .= PHP_EOL.'<li class="chk_box"><input type="checkbox" id="mail" name="mail" class="selec_chk" value="mail" '.$recv_email_checked.'>'.PHP_EOL.'<label for="mail"><span></span>답변메일받기</label></li>';
}
}
echo $option_hidden;
?>
<?php if ($is_category) { ?>
<div class="bo_w_select write_div">
<label for="ca_name" class="sound_only">분류<strong>필수</strong></label>
<select name="ca_name" id="ca_name" required>
<option value="">분류를 선택하세요</option>
<?php echo $category_option ?>
</select>
</div>
<?php } ?>
<div class="bo_w_info write_div">
<?php if ($is_name) { ?>
<label for="wr_name" class="sound_only">이름<strong>필수</strong></label>
<input type="text" name="wr_name" value="<?php echo $name ?>" id="wr_name" required class="frm_input half_input required" placeholder="이름">
<?php } ?>
<?php if ($is_password) { ?>
<label for="wr_password" class="sound_only">비밀번호<strong>필수</strong></label>
<input type="password" name="wr_password" id="wr_password" <?php echo $password_required ?> class="frm_input half_input <?php echo $password_required ?>" placeholder="비밀번호">
<?php } ?>
<?php if ($is_email) { ?>
<label for="wr_email" class="sound_only">이메일</label>
<input type="text" name="wr_email" value="<?php echo $email ?>" id="wr_email" class="frm_input half_input email " placeholder="이메일">
<?php } ?>
<?php if ($is_homepage) { ?>
<label for="wr_homepage" class="sound_only">홈페이지</label>
<input type="text" name="wr_homepage" value="<?php echo $homepage ?>" id="wr_homepage" class="frm_input half_input" size="50" placeholder="홈페이지">
<?php } ?>
</div>
<?php if ($option) { ?>
<div class="write_div">
<span class="sound_only">옵션</span>
<ul class="bo_v_option">
<?php echo $option ?>
</ul>
</div>
<?php } ?>
<div class="bo_w_tit write_div">
<label for="wr_subject" class="sound_only">제목<strong>필수</strong></label>
<div id="autosave_wrapper" class="write_div">
<input type="text" name="wr_subject" value="<?php echo $subject ?>" id="wr_subject" required class="frm_input full_input required" size="50" maxlength="255" placeholder="제목">
<?php if ($is_member) { // 임시 저장된 글 기능 ?>
<script src="<?php echo G5_JS_URL; ?>/autosave.js"></script>
<?php if($editor_content_js) echo $editor_content_js; ?>
<button type="button" id="btn_autosave" class="btn_frmline">임시 저장된 글 (<span id="autosave_count"><?php echo $autosave_count; ?></span>)</button>
<div id="autosave_pop">
<strong>임시 저장된 글 목록</strong>
<ul></ul>
<div><button type="button" class="autosave_close">닫기</button></div>
</div>
<?php } ?>
</div>
</div>
<div class="write_div">
<label for="wr_content" class="sound_only">내용<strong>필수</strong></label>
<div class="wr_content <?php echo $is_dhtml_editor ? $config['cf_editor'] : ''; ?>">
<?php if($write_min || $write_max) { ?>
<!-- 최소/최대 글자 수 사용 시 -->
<p id="char_count_desc">이 게시판은 최소 <strong><?php echo $write_min; ?></strong>글자 이상, 최대 <strong><?php echo $write_max; ?></strong>글자 이하까지 글을 쓰실 수 있습니다.</p>
<?php } ?>
<?php echo $editor_html; // 에디터 사용시는 에디터로, 아니면 textarea 로 노출 ?>
<?php if($write_min || $write_max) { ?>
<!-- 최소/최대 글자 수 사용 시 -->
<div id="char_count_wrap"><span id="char_count"></span>글자</div>
<?php } ?>
</div>
</div>
<?php for ($i=1; $is_link && $i<=G5_LINK_COUNT; $i++) { ?>
<div class="bo_w_link write_div">
<label for="wr_link<?php echo $i ?>"><i class="fa fa-link" aria-hidden="true"></i><span class="sound_only"> 링크 #<?php echo $i ?></span></label>
<input type="text" name="wr_link<?php echo $i ?>" value="<?php if($w=="u"){ echo $write['wr_link'.$i]; } ?>" id="wr_link<?php echo $i ?>" class="frm_input full_input" size="50">
</div>
<?php } ?>
<?php for ($i=0; $is_file && $i<$file_count; $i++) { ?>
<div class="bo_w_flie write_div">
<div class="file_wr write_div">
<label for="bf_file_<?php echo $i+1 ?>" class="lb_icon"><i class="fa fa-folder-open" aria-hidden="true"></i><span class="sound_only"> 파일 #<?php echo $i+1 ?></span></label>
<input type="file" name="bf_file[]" id="bf_file_<?php echo $i+1 ?>" title="파일첨부 <?php echo $i+1 ?> : 용량 <?php echo $upload_max_filesize ?> 이하만 업로드 가능" class="frm_file ">
</div>
<?php if ($is_file_content) { ?>
<input type="text" name="bf_content[]" value="<?php echo ($w == 'u') ? $file[$i]['bf_content'] : ''; ?>" title="파일 설명을 입력해주세요." class="full_input frm_input" size="50" placeholder="파일 설명을 입력해주세요.">
<?php } ?>
<?php if($w == 'u' && $file[$i]['file']) { ?>
<span class="file_del">
<input type="checkbox" id="bf_file_del<?php echo $i ?>" name="bf_file_del[<?php echo $i; ?>]" value="1"> <label for="bf_file_del<?php echo $i ?>"><?php echo $file[$i]['source'].'('.$file[$i]['size'].')'; ?> 파일 삭제</label>
</span>
<?php } ?>
</div>
<?php } ?>
<?php if ($is_use_captcha) { //자동등록방지 ?>
<div class="write_div">
<?php echo $captcha_html ?>
</div>
<?php } ?>
<div class="btn_confirm write_div">
<a href="<?php echo get_pretty_url($bo_table); ?>" class="btn_cancel btn">취소</a>
<button type="submit" id="btn_submit" accesskey="s" class="btn_submit btn">작성완료</button>
</div>
</form>
<script>
<?php if($write_min || $write_max) { ?>
// 글자수 제한
var char_min = parseInt(<?php echo $write_min; ?>); // 최소
var char_max = parseInt(<?php echo $write_max; ?>); // 최대
check_byte("wr_content", "char_count");
$(function() {
$("#wr_content").on("keyup", function() {
check_byte("wr_content", "char_count");
});
});
<?php } ?>
function html_auto_br(obj)
{
if (obj.checked) {
result = confirm("자동 줄바꿈을 하시겠습니까?\n\n자동 줄바꿈은 게시물 내용중 줄바뀐 곳을<br>태그로 변환하는 기능입니다.");
if (result)
obj.value = "html2";
else
obj.value = "html1";
}
else
obj.value = "";
}
function fwrite_submit(f)
{
<?php echo $editor_js; // 에디터 사용시 자바스크립트에서 내용을 폼필드로 넣어주며 내용이 입력되었는지 검사함 ?>
var subject = "";
var content = "";
$.ajax({
url: g5_bbs_url+"/ajax.filter.php",
type: "POST",
data: {
"subject": f.wr_subject.value,
"content": f.wr_content.value
},
dataType: "json",
async: false,
cache: false,
success: function(data, textStatus) {
subject = data.subject;
content = data.content;
}
});
if (subject) {
alert("제목에 금지단어('"+subject+"')가 포함되어있습니다");
f.wr_subject.focus();
return false;
}
if (content) {
alert("내용에 금지단어('"+content+"')가 포함되어있습니다");
if (typeof(ed_wr_content) != "undefined")
ed_wr_content.returnFalse();
else
f.wr_content.focus();
return false;
}
if (document.getElementById("char_count")) {
if (char_min > 0 || char_max > 0) {
var cnt = parseInt(check_byte("wr_content", "char_count"));
if (char_min > 0 && char_min > cnt) {
alert("내용은 "+char_min+"글자 이상 쓰셔야 합니다.");
return false;
}
else if (char_max > 0 && char_max < cnt) {
alert("내용은 "+char_max+"글자 이하로 쓰셔야 합니다.");
return false;
}
}
}
<?php echo $captcha_js; // 캡챠 사용시 자바스크립트에서 입력된 캡챠를 검사함 ?>
document.getElementById("btn_submit").disabled = "disabled";
return true;
}
</script>
</section>
<!-- } 게시물 작성/수정 끝 -->
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 B

+302
View File
@@ -0,0 +1,302 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
include_once(G5_LIB_PATH.'/thumbnail.lib.php');
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
add_stylesheet('<link rel="stylesheet" href="'.$board_skin_url.'/style.css">', 0);
?>
<!-- 게시판 목록 시작 { -->
<div id="bo_gall" style="width:<?php echo $width; ?>">
<?php if ($is_category) { ?>
<nav id="bo_cate">
<h2><?php echo $board['bo_subject'] ?> 카테고리</h2>
<ul id="bo_cate_ul">
<?php echo $category_option ?>
</ul>
</nav>
<?php } ?>
<form name="fboardlist" id="fboardlist" action="<?php echo G5_BBS_URL; ?>/board_list_update.php" onsubmit="return fboardlist_submit(this);" method="post">
<input type="hidden" name="bo_table" value="<?php echo $bo_table ?>">
<input type="hidden" name="sfl" value="<?php echo $sfl ?>">
<input type="hidden" name="stx" value="<?php echo $stx ?>">
<input type="hidden" name="spt" value="<?php echo $spt ?>">
<input type="hidden" name="sst" value="<?php echo $sst ?>">
<input type="hidden" name="sod" value="<?php echo $sod ?>">
<input type="hidden" name="page" value="<?php echo $page ?>">
<input type="hidden" name="sw" value="">
<!-- 게시판 페이지 정보 및 버튼 시작 { -->
<div id="bo_btn_top">
<div id="bo_list_total">
<span>Total <?php echo number_format($total_count) ?>건</span>
<?php echo $page ?> 페이지
</div>
<ul class="btn_bo_user">
<?php if ($admin_href) { ?><li><a href="<?php echo $admin_href ?>" class="btn_admin btn" title="관리자"><i class="fa fa-cog fa-spin fa-fw"></i><span class="sound_only">관리자</span></a></li><?php } ?>
<?php if ($rss_href) { ?><li><a href="<?php echo $rss_href ?>" class="btn_b01 btn" title="RSS"><i class="fa fa-rss" aria-hidden="true"></i><span class="sound_only">RSS</span></a></li><?php } ?>
<li>
<button type="button" class="btn_bo_sch btn_b01 btn" title="게시판 검색"><i class="fa fa-search" aria-hidden="true"></i><span class="sound_only">게시판 검색</span></button>
</li>
<?php if ($write_href) { ?><li><a href="<?php echo $write_href ?>" class="btn_b01 btn" title="글쓰기"><i class="fa fa-pencil" aria-hidden="true"></i><span class="sound_only">글쓰기</span></a></li><?php } ?>
<?php if ($is_admin == 'super' || $is_auth) { ?>
<li>
<button type="button" class="btn_more_opt is_list_btn btn_b01 btn" title="게시판 리스트 옵션"><i class="fa fa-ellipsis-v" aria-hidden="true"></i><span class="sound_only">게시판 리스트 옵션</span></button>
<?php if ($is_checkbox) { ?>
<ul class="more_opt is_list_btn">
<li><button type="submit" name="btn_submit" value="선택삭제" onclick="document.pressed=this.value"><i class="fa fa-trash-o" aria-hidden="true"></i> 선택삭제</button></li>
<li><button type="submit" name="btn_submit" value="선택복사" onclick="document.pressed=this.value"><i class="fa fa-files-o" aria-hidden="true"></i> 선택복사</button></li>
<li><button type="submit" name="btn_submit" value="선택이동" onclick="document.pressed=this.value"><i class="fa fa-arrows" aria-hidden="true"></i> 선택이동</button></li>
</ul>
<?php } ?>
</li>
<?php } ?>
</ul>
</div>
<!-- } 게시판 페이지 정보 및 버튼 끝 -->
<?php if ($is_checkbox) { ?>
<div id="gall_allchk" class="all_chk chk_box">
<input type="checkbox" id="chkall" onclick="if (this.checked) all_checked(true); else all_checked(false);" class="selec_chk">
<label for="chkall">
<span></span>
<b class="sound_only">현재 페이지 게시물 </b> 전체선택
</label>
</div>
<?php } ?>
<ul id="gall_ul" class="gall_row">
<?php for ($i=0; $i<count($list); $i++) {
$classes = array();
$classes[] = 'gall_li';
$classes[] = 'col-gn-'.$bo_gallery_cols;
if( $i && ($i % $bo_gallery_cols == 0) ){
$classes[] = 'box_clear';
}
if( $wr_id && $wr_id == $list[$i]['wr_id'] ){
$classes[] = 'gall_now';
}
$line_height_style = ($board['bo_gallery_height'] > 0) ? 'line-height:'.$board['bo_gallery_height'].'px' : '';
?>
<li class="<?php echo implode(' ', $classes); ?>">
<div class="gall_box">
<div class="gall_chk chk_box">
<?php if ($is_checkbox) { ?>
<input type="checkbox" name="chk_wr_id[]" value="<?php echo $list[$i]['wr_id'] ?>" id="chk_wr_id_<?php echo $i ?>" class="selec_chk">
<label for="chk_wr_id_<?php echo $i ?>">
<span></span>
<b class="sound_only"><?php echo $list[$i]['subject'] ?></b>
</label>
<?php } ?>
<span class="sound_only">
<?php
if ($wr_id == $list[$i]['wr_id'])
echo "<span class=\"bo_current\">열람중</span>";
else
echo $list[$i]['num'];
?>
</span>
</div>
<div class="gall_con">
<div class="gall_img" style="<?php if ($board['bo_gallery_height'] > 0) echo 'height:'.$board['bo_gallery_height'].'px;max-height:'.$board['bo_gallery_height'].'px'; ?>">
<a href="<?php echo $list[$i]['href'] ?>">
<?php
if ($list[$i]['is_notice']) { // 공지사항 ?>
<span class="is_notice" style="<?php echo $line_height_style; ?>">공지</span>
<?php } else {
$thumb = get_list_thumbnail($board['bo_table'], $list[$i]['wr_id'], $board['bo_gallery_width'], $board['bo_gallery_height'], false, true);
if($thumb['src']) {
$img_content = '<img src="'.$thumb['src'].'" alt="'.$thumb['alt'].'" >';
} else {
$img_content = '<span class="no_image" style="'.$line_height_style.'">no image</span>';
}
echo run_replace('thumb_image_tag', $img_content, $thumb);
}
?>
</a>
</div>
<div class="gall_text_href">
<?php if ($is_category && $list[$i]['ca_name']) { ?>
<a href="<?php echo $list[$i]['ca_name_href'] ?>" class="bo_cate_link"><?php echo $list[$i]['ca_name'] ?></a>
<?php } ?>
<a href="<?php echo $list[$i]['href'] ?>" class="bo_tit">
<?php // echo $list[$i]['icon_reply']; ?>
<!-- 갤러리 댓글기능 사용시 주석을 제거하세요. -->
<?php echo $list[$i]['subject'] ?>
<?php
// if ($list[$i]['file']['count']) { echo '<'.$list[$i]['file']['count'].'>'; }
if ($list[$i]['icon_new']) echo "<span class=\"new_icon\">N<span class=\"sound_only\">새글</span></span>";
if (isset($list[$i]['icon_hot'])) echo rtrim($list[$i]['icon_hot']);
//if (isset($list[$i]['icon_file'])) echo rtrim($list[$i]['icon_file']);
//if (isset($list[$i]['icon_link'])) echo rtrim($list[$i]['icon_link']);
if (isset($list[$i]['icon_secret'])) echo rtrim($list[$i]['icon_secret']);
?>
<?php if ($list[$i]['comment_cnt']) { ?><span class="sound_only">댓글</span><span class="cnt_cmt"><?php echo $list[$i]['wr_comment']; ?></span><span class="sound_only">개</span><?php } ?>
</a>
<span class="bo_cnt"><?php echo utf8_strcut(strip_tags($list[$i]['wr_content']), 68, '..'); ?></span>
</div>
<div class="gall_info">
<span class="sound_only">작성자 </span><?php echo $list[$i]['name'] ?>
<span class="gall_date"><span class="sound_only">작성일 </span><i class="fa fa-clock-o" aria-hidden="true"></i> <?php echo $list[$i]['datetime2'] ?></span>
<span class="gall_view"><span class="sound_only">조회 </span><i class="fa fa-eye" aria-hidden="true"></i> <?php echo $list[$i]['wr_hit'] ?></span>
</div>
<div class="gall_option">
<?php if ($is_good) { ?><span class="sound_only">추천</span><strong><i class="fa fa-thumbs-o-up" aria-hidden="true"></i> <?php echo $list[$i]['wr_good'] ?></strong><?php } ?>
<?php if ($is_nogood) { ?><span class="sound_only">비추천</span><strong><i class="fa fa-thumbs-o-down" aria-hidden="true"></i> <?php echo $list[$i]['wr_nogood'] ?></strong><?php } ?>
</div>
</div>
</div>
</li>
<?php } ?>
<?php if (count($list) == 0) { echo "<li class=\"empty_list\">게시물이 없습니다.</li>"; } ?>
</ul>
<!-- 페이지 -->
<?php echo $write_pages; ?>
<!-- 페이지 -->
<?php if ($list_href || $is_checkbox || $write_href) { ?>
<div class="bo_fx">
<?php if ($list_href || $write_href) { ?>
<ul class="btn_bo_user">
<?php if ($admin_href) { ?><li><a href="<?php echo $admin_href ?>" class="btn_admin btn" title="관리자"><i class="fa fa-cog fa-spin fa-fw"></i><span class="sound_only">관리자</span></a></li><?php } ?>
<?php if ($rss_href) { ?><li><a href="<?php echo $rss_href ?>" class="btn_b01 btn" title="RSS"><i class="fa fa-rss" aria-hidden="true"></i><span class="sound_only">RSS</span></a></li><?php } ?>
<?php if ($write_href) { ?><li><a href="<?php echo $write_href ?>" class="btn_b01 btn" title="글쓰기"><i class="fa fa-pencil" aria-hidden="true"></i><span class="sound_only">글쓰기</span></a></li><?php } ?>
</ul>
<?php } ?>
</div>
<?php } ?>
</form>
<!-- 게시판 검색 시작 { -->
<div class="bo_sch_wrap">
<fieldset class="bo_sch">
<h3>검색</h3>
<form name="fsearch" method="get">
<input type="hidden" name="bo_table" value="<?php echo $bo_table ?>">
<input type="hidden" name="sca" value="<?php echo $sca ?>">
<input type="hidden" name="sop" value="and">
<label for="sfl" class="sound_only">검색대상</label>
<select name="sfl" id="sfl">
<?php echo get_board_sfl_select_options($sfl); ?>
</select>
<label for="stx" class="sound_only">검색어<strong class="sound_only"> 필수</strong></label>
<div class="sch_bar">
<input type="text" name="stx" value="<?php echo stripslashes($stx) ?>" required id="stx" class="sch_input" size="25" maxlength="20" placeholder="검색어를 입력해주세요">
<button type="submit" value="검색" class="sch_btn"><i class="fa fa-search" aria-hidden="true"></i><span class="sound_only">검색</span></button>
</div>
<button type="button" class="bo_sch_cls"><i class="fa fa-times" aria-hidden="true"></i><span class="sound_only">닫기</span></button>
</form>
</fieldset>
<div class="bo_sch_bg"></div>
</div>
<script>
// 게시판 검색
$(".btn_bo_sch").on("click", function() {
$(".bo_sch_wrap").toggle();
})
$('.bo_sch_bg, .bo_sch_cls').click(function(){
$('.bo_sch_wrap').hide();
});
</script>
<!-- } 게시판 검색 끝 -->
</div>
<?php if($is_checkbox) { ?>
<noscript>
<p>자바스크립트를 사용하지 않는 경우<br>별도의 확인 절차 없이 바로 선택삭제 처리하므로 주의하시기 바랍니다.</p>
</noscript>
<?php } ?>
<?php if ($is_checkbox) { ?>
<script>
function all_checked(sw) {
var f = document.fboardlist;
for (var i=0; i<f.length; i++) {
if (f.elements[i].name == "chk_wr_id[]")
f.elements[i].checked = sw;
}
}
function fboardlist_submit(f) {
var chk_count = 0;
for (var i=0; i<f.length; i++) {
if (f.elements[i].name == "chk_wr_id[]" && f.elements[i].checked)
chk_count++;
}
if (!chk_count) {
alert(document.pressed + "할 게시물을 하나 이상 선택하세요.");
return false;
}
if(document.pressed == "선택복사") {
select_copy("copy");
return;
}
if(document.pressed == "선택이동") {
select_copy("move");
return;
}
if(document.pressed == "선택삭제") {
if (!confirm("선택한 게시물을 정말 삭제하시겠습니까?\n\n한번 삭제한 자료는 복구할 수 없습니다\n\n답변글이 있는 게시글을 선택하신 경우\n답변글도 선택하셔야 게시글이 삭제됩니다."))
return false;
f.removeAttribute("target");
f.action = g5_bbs_url+"/board_list_update.php";
}
return true;
}
// 선택한 게시물 복사 및 이동
function select_copy(sw) {
var f = document.fboardlist;
if (sw == 'copy')
str = "복사";
else
str = "이동";
var sub_win = window.open("", "move", "left=50, top=50, width=500, height=550, scrollbars=1");
f.sw.value = sw;
f.target = "move";
f.action = g5_bbs_url+"/move.php";
f.submit();
}
// 게시판 리스트 관리자 옵션
jQuery(function($){
$(".btn_more_opt.is_list_btn").on("click", function(e) {
e.stopPropagation();
$(".more_opt.is_list_btn").toggle();
});
$(document).on("click", function (e) {
if(!$(e.target).closest('.is_list_btn').length) {
$(".more_opt.is_list_btn").hide();
}
});
});
</script>
<?php } ?>
<!-- } 게시판 목록 끝 -->
+375
View File
@@ -0,0 +1,375 @@
@charset "utf-8";
/* 게시판 목록 */
#bo_cate {margin:25px 0}
#bo_cate h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
#bo_cate ul {zoom:1}
#bo_cate ul:after {display:block;visibility:hidden;clear:both;content:""}
#bo_cate li {display:inline-block;padding:2px}
#bo_cate a {display:block;line-height:28px;padding:5px 15px;border-radius:30px;border:1px solid #d6e9ff;color:#6794d3}
#bo_cate a:focus, #bo_cate a:hover, #bo_cate a:active {text-decoration:none;background:#3a8afd;color:#fff}
#bo_cate #bo_cate_on {z-index:2;background:#3a8afd;color:#fff;font-weight:bold;border:1px solid #3a8afd;
-webkit-box-shadow:inset 0 2px 5px rgb(33, 135, 202);
-moz-box-shadow:inset 0 2px 5px rgb(33, 135, 202);
box-shadow:inset 0 2px 5px rgb(33, 135, 202)}
.td_subject img {margin-left:3px}
.selec_chk {position:absolute;top:0;left:0;width:0;height:0;opacity:0;outline:0;z-index:-1;overflow:hidden}
.chk_box {position:relative}
.chk_box input[type="checkbox"] + label {position:relative;padding-left:20px;color:#676e70;vertical-align:baseline}
.chk_box input[type="checkbox"] + label:hover{color:#2172f8}
.chk_box input[type="checkbox"] + label span {position:absolute;top:10px;left:10px;width:15px;height:15px;display:block;background:#fff;border:1px solid #d0d4df;border-radius:3px}
.write_div .chk_box input[type="checkbox"] + label, .bo_vc_w .chk_box input[type="checkbox"] + label {padding-left:20px}
.write_div .chk_box input[type="checkbox"] + label span, .bo_vc_w .chk_box input[type="checkbox"] + label span {position:absolute;top:2px;left:0;width:15px;height:15px;display:block;margin:0;background:#fff;border:1px solid #d0d4df;border-radius:3px}
.chk_box input[type="checkbox"]:checked + label {color:#000}
.chk_box input[type="checkbox"]:checked + label span {background:url(./img/chk.png) no-repeat 50% 50% #3a8afd;border-color:#1471f6;border-radius:3px}
.all_chk.chk_box input[type="checkbox"] + label span {top:0;left:0}
/* 갤러리 목록 */
#bo_gall h2 {margin:0;padding:0;width:1px;height:1px;font-size:0;line-height:0;overflow:hidden}
#bo_gall #gall_ul {margin:10px -10px 0;padding:0;list-style:none;zoom:1}
#bo_gall #gall_ul:after {display:block;visibility:hidden;clear:both;content:""}
#bo_gall .gall_li {}
#bo_gall .gall_li .gall_chk {position:absolute;top:0;left:0;padding:5px;z-index:1}
#bo_gall .gall_box {position:relative;margin:0 0 50px 0;border-radius:0 0 2px 2px}
#bo_gall .gall_con {position:relative}
.gall_row .col-gn-0,.gall_row .col-gn-1,.gall_row .col-gn-2,.gall_row .col-gn-3,.gall_row .col-gn-4,.gall_row .col-gn-5,.gall_row .col-gn-6,.gall_row .col-gn-7,.gall_row .col-gn-8,.gall_row .col-gn-9,.gall_row .col-gn-10 {position:relative;min-height:1px;padding-left:10px;*padding-left:0;padding-right:10px;*padding-right:0;float:left;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin-left:0}
.gall_row .col-gn-0,.gall_row .col-gn-1 {width:100%}
.gall_row .col-gn-2 {width:50%}
.gall_row .col-gn-3 {width:33.33333333%}
.gall_row .col-gn-4 {width:25%}
.gall_row .col-gn-5 {width:20%}
.gall_row .col-gn-6 {width:16.66666667%}
.gall_row .col-gn-7 {width:14.28571428%}
.gall_row .col-gn-8 {width:12.5%}
.gall_row .col-gn-9 {width:11.11111111%}
.gall_row .col-gn-10 {width:10%}
.gall_row .box_clear {clear:both}
#bo_gall .gall_now .gall_text_href a {color:#ff3061}
#bo_gall .gall_href a:link, #bo_gall .gall_href a:focus, #bo_gall .gall_href a:hover {text-decoration:none}
#bo_gall .gall_img {border-bottom:1px solid #eee;text-align:center;overflow:hidden}
#bo_gall .gall_img a,#bo_gall .gall_img .no_image,#bo_gall .gall_img .is_notice {display:block}
#bo_gall .gall_img img, #bo_gall .gall_img video {max-width:100%;height:auto !important}
#bo_gall .gall_img span {display:inline-block;background:#eaeaea;text-align:center;text-transform:uppercase;font-weight:bold;font-size:1.25em;color:#777}
#bo_gall .gall_text_href {margin:10px 0}
#bo_gall .gall_text_href a {font-weight:bold}
#bo_gall .gall_text_href img {margin:0 0 0 4px}
#bo_gall .bo_tit {display:block;line-height:30px;font-weight:bold;color:#000;font-size:1.2em}
#bo_gall .bo_tit .cnt_cmt {background:#e9eff5;color:#3a8afd;font-size:11px;height:16px;line-height:16px;padding:0 5px;border-radius:3px;vertical-align:middle}
#bo_gall .bo_cnt {color:#acacac;line-height:18px}
#bo_gall .profile_img img {border-radius:50%}
#bo_gall .bo_tit .fa-download {width:16px;height:16px;line-height:16px;background:#e89f31;color:#fff;text-align:center;font-size:10px;border-radius:2px;margin-right:2px;vertical-align:middle}
#bo_gall .bo_tit .fa-link {width:16px;height:16px;line-height:16px;background:#ad68d8;color:#fff;text-align:center;font-size:10px;border-radius:2px;margin-right:2px;vertical-align:middle;font-weight:normal}
#bo_gall .bo_tit .fa-link {width:16px;height:16px;line-height:16px;background:#ad68d8;color:#fff;text-align:center;font-size:10px;border-radius:2px;margin-right:2px;vertical-align:middle;margin-right:2px}
#bo_gall .bo_tit .new_icon {display:inline-block;width:16px;line-height:16px;font-size:0.825em;color:#23db79;background:#b9ffda;text-align:center;border-radius:2px;margin-left:2px;font-weight:bold;vertical-align:baseline}
#bo_gall .bo_tit .hot_icon {display:inline-block;width:16px;line-height:16px;font-size:0.833em;color:#fff;background:#e52955;text-align:center;border-radius:2px;vertical-align:middle;margin-right:2px}
#bo_gall .bo_tit .fa-lock {display:inline-block;line-height:16px;color:#999;text-align:center;vertical-align:middle}
#bo_gall .gall_info {line-height:1.5em;line-height:20px}
#bo_gall .gall_info strong {display:inline-block;margin:0}
#bo_gall .gall_info i {font-size:12px}
#bo_gall .gall_info .gall_date,
#bo_gall .gall_info .gall_view {display:inline-block;margin-left:10px;color:#777}
#bo_gall .gall_option {position:absolute;top:10px;right:10px}
#bo_gall .gall_option strong {background:#fff;padding:5px 10px;border-radius:30px;-webkit-box-shadow:2px 2px 3px 0px rgba(0,0,0,0.2);
-moz-box-shadow:2px 2px 3px 0px rgba(0,0,0,0.2);
box-shadow:2px 2px 3px 0px rgba(0,0,0,0.2)}
/* 게시판 목록 공통 */
#bo_btn_top {margin:10px 0}
#bo_btn_top:after {display:block;visibility:hidden;clear:both;content:""}
.bo_fx {margin-bottom:5px;float:right;zoom:1}
.bo_fx:after {display:block;visibility:hidden;clear:both;content:""}
.bo_fx ul {margin:0;padding:0;list-style:none}
#bo_list_total {float:left;line-height:34px;font-size:0.92em;color:#4e546f}
.btn_bo_user {float:right;margin:0;padding:0;list-style:none}
.btn_bo_user li {float:left;width:40px;text-align:center;margin-left:5px;background:#fff}
.btn_bo_user > li {position:relative}
.btn_bo_adm {float:left}
.btn_bo_adm li {float:left;margin-right:5px}
.btn_bo_adm input {padding:0 8px;border:0;background:#d4d4d4;color:#666;text-decoration:none;vertical-align:middle}
.bo_notice td {background:#fff6fa !important;border-bottom:1px solid #f8e6ee}
.bo_notice td a {font-weight:bold}
.bo_notice .notice_icon {display:inline-block;line-height:25px;border-radius:5px;font-weight:bold;color:#f9267f}
.more_opt {display:none;position:absolute;top:45px;right:0;background:#fff;border:1px solid #b8bfc4;z-index:999}
.more_opt:before {content:"";position:absolute;top:-8px;right:13px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #b8bfc4 transparent}
.more_opt:after {content:"";position:absolute;top:-6px;right:13px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #fff transparent}
.more_opt li {border-bottom:1px solid #f1f1f1;padding:10px;float:inherit;width:90px;margin:0;color:#6b757c;text-align:left}
.more_opt li:last-child {border-bottom:0}
.more_opt li button, .more_opt li a {width:100%;border:0;background:#fff;color:#6b757c}
.more_opt li:hover a,
.more_opt li:hover button {color:#000}
.more_opt li i {float:right;line-height:20px}
.td_num strong {color:#000}
.bo_cate_link {display:inline-block;background:#e2eaf6;color:#3a8afd;font-weight:normal !important;height:20px;line-height:10px;padding:5px 8px;border-radius:5px;font-size:0.95em} /* 글제목줄 분류스타일 */
.bo_cate_link:hover {text-decoration:none}
.bo_current {color:#e8180c}
#bo_list .profile_img {display:inline-block;margin-right:5px}
#bo_list .profile_img img {border-radius:50%}
#bo_list .cnt_cmt {display:inline-block;margin:0 0 0 3px;font-weight:bold;color:#ed6478;font-size:0.86em}
#bo_gall li.empty_list {padding:85px 0;text-align:center}
.bo_sch_wrap {display:none;width:100%;height:100%;position:fixed;top:0;left:0;z-index:999}
.bo_sch {position:absolute;top:50%;left:50%;background:#fff;text-align:left;width:330px;max-height:300px;margin-left:-125px;margin-top:-180px;overflow-y:auto;border-radius:5px;-webkit-box-shadow:1px 1px 18px rgba(0,0,0,0.2);-moz-box-shadow:1px 1px 18px rgba(0,0,0,0.2);box-shadow:1px 1px 18px rgba(0,0,0,0.2);border:1px solid #dde7e9;background:#fff;border-radius:3px}
.bo_sch:after {display:block;visibility:hidden;clear:both;content:""}
.bo_sch h3 {padding:15px;border-bottom:1px solid #e8e8e8}
.bo_sch legend {background:red}
.bo_sch form {padding:15px;display:block}
.bo_sch select {border:0;width:100%;height:40px;border:1px solid #d0d3db;border-radius:2px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075);
-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075);
box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075)}
.bo_sch .sch_bar {display:inline-block;width:100%;clear:both;margin-top:15px;border:1px solid #d0d3db;border-radius:2px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075);
-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075);
box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075)}
.bo_sch .sch_input {width:250px;height:38px;border:0;padding:0;background-color:transparent;float:left}
.bo_sch .sch_btn {height:38px;float:right;color:#656565;background:none;border:0;width:40px;font-size:15px}
.bo_sch .bo_sch_cls {position:absolute;right:0;top:0;color:#b5b8bb;border:0;padding:12px 15px;font-size:16px;background:#fff}
.bo_sch_bg {background:#000;background:rgba(0,0,0,0.1);width:100%;height:100%}
/* 게시판 쓰기 */
#char_count_desc {display:block;margin:0 0 5px;padding:0}
#char_count_wrap {margin:5px 0 0;text-align:right}
#char_count {font-weight:bold}
#autosave_wrapper {position:relative}
#autosave_pop {display:none;z-index:10;position:absolute !important;top:34px;right:0;width:350px;height:auto !important;height:180px;max-height:180px;border:1px solid #565656;background:#fff;
-webkit-box-shadow:2px 2px 3px 0px rgba(0,0,0,0.2);
-moz-box-shadow:2px 2px 3px 0px rgba(0,0,0,0.2);
box-shadow:2px 2px 3px 0px rgba(0,0,0,0.2)}
#autosave_pop:before {content:"";position:absolute;top:-8px;right:45px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #000 transparent}
#autosave_pop:after {content:"";position:absolute;top:-7px;right:45px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #fff transparent}
html.no-overflowscrolling #autosave_pop {height:auto;max-height:10000px !important} /* overflow 미지원 기기 대응 */
#autosave_pop strong {position:absolute;font-size:0;line-height:0;overflow:hidden}
#autosave_pop div {text-align:center;margin:0 !important}
#autosave_pop button {margin:0;padding:0;border:0}
#autosave_pop ul {padding:15px;border-top:1px solid #e9e9e9;list-style:none;overflow-y:scroll;height:130px;border-bottom:1px solid #e8e8e8}
#autosave_pop li {padding:8px 5px;border-bottom:1px solid #fff;background:#eee;zoom:1}
#autosave_pop li:after {display:block;visibility:hidden;clear:both;content:""}
#autosave_pop a {display:block;float:left}
#autosave_pop span {display:block;float:right;font-size:0.92em;font-style:italic;color:#999}
.autosave_close {cursor:pointer;width:100%;height:30px;background:none;color:#888;font-weight:bold;font-size:0.92em}
.autosave_close:hover {background:#f3f3f3;color:#3597d9}
.autosave_content {display:none}
.autosave_del {background:url(./img/close_btn.png) no-repeat 50% 50%;text-indent:-999px;overflow:hidden;height:20px;width:20px}
/* 게시판 읽기 */
#bo_v {margin-bottom:20px;background:#fff;box-sizing:border-box}
#bo_v_table {position:absolute;top:0;right:16px;margin:0;padding:0 5px;height:25px;background:#ff3061;color:#fff;font-weight:bold;line-height:2.2em}
#bo_v_title {}
#bo_v_title .bo_v_cate {display:inline-block;line-height:20px;background:#e2eaf6;color:#3a8afd;padding:0 10px;border-radius:3px;}
#bo_v_title .bo_v_tit {display:block;font-size:2em;margin:5px 0 0;word-break:break-all}
#bo_v_info {margin:0;border-bottom:1px solid #f1f1f1;color:#666}
#bo_v_info:after {display:block;visibility:hidden;clear:both;content:""}
#bo_v_info h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
#bo_v_info .profile_info {margin:20px 0 10px;display:inline-block;float:left}
#bo_v_info .profile_info .pf_img {float:left;margin-right:10px}
#bo_v_info .profile_info .pf_img img {border-radius:50%;width:50px;height:50px}
#bo_v_info .profile_info .profile_info_ct {float:left;padding:5px 0;line-height:18px}
#bo_v_info strong {display:inline-block;margin:0 10px 0 0;font-weight:normal}
#bo_v_info .sv_member,
#bo_v_info .sv_guest,
#bo_v_info .member,
#bo_v_info .guest {font-weight:bold}
#bo_v_info .profile_img {display:none}
#bo_v_info .sv_member {color:#000}
#bo_v_info .if_date {margin:0;color:#888}
#bo_v_file h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
#bo_v_file ul {margin:0;list-style:none}
#bo_v_file li {padding:15px;position:relative;margin:10px 0;border:1px solid #dfdfdf;border-radius:5px;
-webkit-box-shadow:1px 1px 5px 0px hsl(232, 36%, 96%);
-moz-box-shadow:1px 1px 5px 0px hsl(232, 36%, 96%);
box-shadow:1px 1px 5px 0px hsl(232, 36%, 96%)}
#bo_v_file li i {float:left;color:#b2b2b2;font-size:2.35em;margin-right:20px}
#bo_v_file a {float:left;display:block;text-decoration:none;word-wrap:break-word;color:#000}
#bo_v_file a:focus, #bo_v_file li:hover a, #bo_v_file a:active {text-decoration:underline;color:#3a8afd}
#bo_v_file img {float:left;margin:0 10px 0 0}
#bo_v_file .bo_v_file_cnt {color:#b2b2b2;font-size:0.92em}
#bo_v_file li:hover {border-color:#bed4f4;color:#bed4f4}
#bo_v_file li:hover i {color:#3a8afd}
#bo_v_file li:hover .bo_v_file_cnt {color:#99c2fc}
#bo_v_link h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
#bo_v_file ul {margin:0;list-style:none}
#bo_v_link li {padding:15px;position:relative;margin:10px 0;border:1px solid #dfdfdf;border-radius:5px;
-webkit-box-shadow:1px 1px 5px 0px hsl(232, 36%, 96%);
-moz-box-shadow:1px 1px 5px 0px hsl(232, 36%, 96%);
box-shadow:1px 1px 5px 0px hsl(232, 36%, 96%)}
#bo_v_link li i {float:left;color:#b2b2b2;font-size:2.35em;margin-right:20px}
#bo_v_link a {float:left;display:block;text-decoration:none;word-wrap:break-word;color:#000}
#bo_v_link a:focus, #bo_v_link li:hover a, #bo_v_link a:active {text-decoration:underline;color:#3a8afd}
#bo_v_link .bo_v_link_cnt {color:#b2b2b2;font-size:0.92em}
#bo_v_link li:hover {border-color:#bed4f4;color:#bed4f4}
#bo_v_link li:hover i {color:#3a8afd}
#bo_v_link li:hover .bo_v_link_cnt {color:#99c2fc}
#bo_v_top {zoom:1}
#bo_v_top:after {display:block;visibility:hidden;clear:both;content:""}
#bo_v_top h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
#bo_v_top ul {padding:0;list-style:none;word-break:break-all}
#bo_v_bot {zoom:1}
#bo_v_bot:after {display:block;visibility:hidden;clear:both;content:""}
#bo_v_bot h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
#bo_v_bot ul {padding:0;list-style:none}
.bo_v_com {margin:20px 0;float:right}
.bo_v_com > li {position:relative;float:left;margin-left:5px}
.bo_v_nb {margin:20px 0;position:relative;clear:both;text-align:left}
.bo_v_nb:after {display:block;visibility:hidden;clear:both;content:""}
.bo_v_nb li {border-top:1px solid #f1f1f1;padding:13px}
.bo_v_nb li:last-child {border-bottom:1px solid #f1f1f1}
.bo_v_nb li:hover {background:#f6f6f6}
.bo_v_nb li i {font-size:13px;color:#b3b3b3}
.bo_v_nb li .nb_tit {display:inline-block;padding-right:20px;color:#b3b3b3}
.bo_v_nb li .nb_date {float:right;color:#b3b3b3}
#bo_v_atc {min-height:200px;height:auto !important;height:200px}
#bo_v_atc_title {position:absolute;font-size:0;line-height:0;overflow:hidden}
#bo_v_img {width:100%;overflow:hidden;zoom:1}
#bo_v_img:after {display:block;visibility:hidden;clear:both;content:""}
#bo_v_img a.view_image {display:block}
#bo_v_img img {margin-bottom:20px;max-width:100%;height:auto}
#bo_v_con {margin:10px 0 30px;width:100%;line-height:1.7em;min-height:200px;word-break:break-all;overflow:hidden}
#bo_v_con a {color:#000;text-decoration:underline}
#bo_v_con img {max-width:100%;height:auto}
#bo_v_act {margin-bottom:30px;text-align:center}
#bo_v_act .bo_v_act_gng {position:relative}
#bo_v_act a {margin-right:5px;vertical-align:middle;color:#4a5158}
#bo_v_act a:hover {background-color:#fff;color:#ff484f;border-color:#ff484f}
#bo_v_act i {font-size:1.4em;margin-right:5px}
#bo_v_act_good, #bo_v_act_nogood {display:none;position:absolute;top:30px;left:0;z-index:9999;padding:10px 0;width:165px;background:#ff3061;color:#fff;text-align:center}
#bo_v_act .bo_v_good {display:inline-block;border:1px solid #dedede;width:70px;line-height:46px;border-radius:30px}
#bo_v_act .bo_v_nogood {display:inline-block;border:1px solid #dedede;width:70px;line-height:46px;border-radius:30px}
#bo_v_sns {padding:0;list-style:none;zoom:1;float:left;display:inline-block}
#bo_v_sns:after {display:block;visibility:hidden;clear:both;content:""}
#bo_v_sns li {float:left;width:135px;margin-right:5px;text-align:left}
#bo_v_sns li a {height:35px;line-height:35px;text-align:center;border-radius:5px;color:#fff;font-size:0.95em}
#bo_v_sns li img {vertical-align:middle;margin-right:5px}
#bo_v_sns li .sns_f {display:block;background:#3b5997}
#bo_v_sns li .sns_t {display:block;background:#09aeee}
#bo_v_sns li .sns_g {display:block;background:#ea4026}
#bo_v_sns li .sns_k {display:block;background:#fbe300}
#bo_v_share {position:relative;padding:20px 0}
#bo_v_share:after {display:block;visibility:hidden;clear:both;content:""}
#bo_v_share .btn {padding:0 10px;color:#555;font-weight:normal;font-size:1em;width:80px;line-height:35px;height:35px;border-color:#d5d5d5;border-radius:5px}
#bo_v_share .btn:hover {background:#fff}
#bo_v_share .btn i {margin-right:5px;color:#4b5259;vertical-align:middle}
/* 게시판 댓글 */
.cmt_btn {width:100%;text-align:left;border:0;border-bottom:1px solid #f0f0f0;background:#fff;font-weight:bold;margin:30px 0 0px;padding:0 0 15px}
.cmt_btn span.total {position:relative;display:inline-block;margin-right:5px;font-size:1em;color:#3a8afd}
.cmt_btn span.cmt_more {float:right;display:inline-block;width:15px;height:10px;background:url(./img/btn_cmt.png) no-repeat right 2px;margin-top:5px}
.cmt_btn_op span.cmt_more {background-position:right -8px}
.cmt_btn b {font-size:1.2em;color:#000}
.cmt_btn span.total:after {position:absolute;bottom:-17px;left:0;display:inline-block;background:#3a8afd;content:"";width:100%;height:2px}
#bo_vc {}
#bo_vc h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
#bo_vc article {margin:20px 0;position:relative;border-bottom:1px solid #f0f0f0}
#bo_vc article:after {display:block;visibility:hidden;clear:both;content:""}
#bo_vc article .profile_img img {border-radius:50%}
#bo_vc article .pf_img {float:left;margin-right:10px}
#bo_vc article .pf_img img {border-radius:50%;width:50px;height:50px}
#bo_vc article .cm_wrap {float:left;max-width:870px;width:90%}
#bo_vc header {position:relative;width:100%}
#bo_vc header:after {display:block;visibility:hidden;clear:both;content:""}
#bo_vc header .profile_img {display:none}
#bo_vc header .icon_reply {position:absolute;top:15px;left:-20px}
#bo_vc .member, #bo_vc .guest, #bo_vc .sv_member, #bo_vc .sv_guest {font-weight:bold}
.bo_vc_hdinfo {color:#777}
#bo_vc h1 {position:absolute;font-size:0;line-height:0;overflow:hidden}
#bo_vc .cmt_contents {line-height:1.8em;padding:0 0 20px}
#bo_vc p a {text-decoration:underline}
#bo_vc p a.s_cmt {text-decoration:underline;color:#ed6479}
#bo_vc_empty {margin:0;padding:80px 0 !important;color:#777;text-align:center}
#bo_vc #bo_vc_winfo {float:left}
#bo_vc .bo_vl_opt {position:absolute;top:0;right:0}
.bo_vc_act {display:none;position:absolute;right:0;top:40px;width:58px;text-align:right;border:1px solid #b8bfc4;margin:0;list-style:none;background:#fff;zoom:1;z-index:9999}
.bo_vc_act:before {content:"";position:absolute;top:-8px;right:5px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #b8bfc4 transparent}
.bo_vc_act:after {content:"";position:absolute;top:-6px;right:5px;width:0;height:0;border-style:solid;border-width:0 6px 8px 6px;border-color:transparent transparent #fff transparent}
.bo_vc_act li {border-bottom:1px solid #f0f0f0}
.bo_vc_act li:last-child {border-bottom:0}
.bo_vc_act li a {display:inline-block;padding:10px 15px}
.bo_vc_act li a:hover {color:#3a8afd}
.bo_vc_w {position:relative;margin:10px 0;display:block}
.bo_vc_w:after {display:block;visibility:hidden;clear:both;content:""}
.bo_vc_w h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
.bo_vc_w #char_cnt {display:block;margin:0 0 5px}
.bo_vc_w textarea {border:1px solid #ccc;background:#fff;color:#000;vertical-align:middle;border-radius:3px;padding:5px;width:100%;height:120px;
-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);
-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);
box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1)}
#wr_secret {}
.bo_vc_w_info {margin:10px 0;float:left}
.bo_vc_w_info:after {display:block;visibility:hidden;clear:both;content:""}
.bo_vc_w_info .frm_input {float:left;margin-right:5px}
.bo_vc_w_info #captcha {padding-top:10px;display:block;clear:both}
.bo_vc_w .btn_confirm {clear:both;margin-top:10px}
.bo_vc_w .btn_confirm label {display:inline-block;margin-right:10px;border-radius:3px;font-size:1.5em;text-align:center}
.bo_vc_w .btn_submit {height:45px;padding:0 20px;border-radius:3px;font-weight:bold;font-size:1.083em}
.bo_vc_w .btn_confirm .secret_cm label {font-size:1em !important}
.bo_vc_w_wr:after {display:block;visibility:hidden;clear:both;content:""}
.secret_cm {display:inline-block;float:left}
#bo_vc_send_sns {display:inline-block;float:left}
#bo_vc_sns {display:inline-block;margin:0;padding:0;list-style:none;zoom:1}
#bo_vc_sns:after {display:block;visibility:hidden;clear:both;content:""}
#bo_vc_sns li {float:left;margin:0 5px 0 0}
#bo_vc_sns .sns_li_f {border-radius:3px;background:#3a589b;height:40px;line-height:40px;padding:0 0 0 10px}
#bo_vc_sns .sns_li_t {border-radius:3px;background:#00aced;height:40px;line-height:40px;padding:0 0 0 10px}
#bo_vc_sns .sns_li_off {background:#bbb}
#bo_vc_sns a {display:inline-block;padding:0 15px 0 5px}
#bo_vc_sns input {margin:0 5px 0 0}
/*글쓰기*/
#bo_w .bo_v_option li {display:inline-block;float:left;text-align:left;margin:0 5px 0 0}
#bo_w .bo_v_option li label {vertical-align:baseline}
#bo_w .bo_v_option .chk_box input[type="checkbox"] + label span {margin-left:0;margin-right:5px}
#bo_w .write_div {margin:10px 0;position:relative}
#bo_w .write_div:after {display:block;visibility:hidden;clear:both;content:""}
#bo_w .bo_w_info:after {display:block;visibility:hidden;clear:both;content:""}
#bo_w .bo_w_info .frm_input {float:left;margin-bottom:1%}
#bo_w #wr_password, #bo_w #wr_homepage {margin-left:1%}
#bo_w .wr_content.smarteditor2 iframe {background:#fff}
#bo_w .bo_w_tit {position:relative}
#bo_w .bo_w_tit .frm_input {padding-right:120px}
#bo_w .bo_w_tit #btn_autosave {position:absolute;top:5px;right:5px;line-height:30px;height:30px}
#bo_w .bo_w_link label {position:absolute;top:1px;left:1px;border-radius:3px 0 0 3px;height:38px;line-height:38px;width:40px;font-size:1.2em;text-align:center;color:#b2b2b2}
#bo_w .bo_w_link .frm_input {padding-left:50px}
#bo_w .bo_w_flie .lb_icon {position:absolute;top:0px;left:0px;border-radius:3px 0 0 3px;height:38px;line-height:38px;width:40px;font-size:1.2em;text-align:center;color:#b2b2b2}
#bo_w .bo_w_flie .frm_file {padding-left:50px;margin-top:3px}
#bo_w .bo_w_flie .file_wr {position:relative;border:1px solid #ccc;background:#fff;color:#000;vertical-align:middle;border-radius:3px;padding:5px;height:40px;margin:0}
#bo_w .bo_w_flie .frm_input {margin:10px 0 0}
#bo_w .bo_w_flie .file_del {position:absolute;top:10px;right:10px;font-size:0.92em;color:#7d7d7d}
#bo_w .bo_w_select select {border:1px solid #d0d3db;width:100%;height:40px;border-radius:3px}
#bo_w .btn_submit {padding:0 20px;font-size:1.167em}
#bo_w .btn_cancel {border-radius:3px;font-size:1.167em}
+300
View File
@@ -0,0 +1,300 @@
<?php
if (!defined("_GNUBOARD_")) exit; // 개별 페이지 접근 불가
include_once(G5_LIB_PATH.'/thumbnail.lib.php');
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
add_stylesheet('<link rel="stylesheet" href="'.$board_skin_url.'/style.css">', 0);
?>
<script src="<?php echo G5_JS_URL; ?>/viewimageresize.js"></script>
<!-- 게시물 읽기 시작 { -->
<article id="bo_v" style="width:<?php echo $width; ?>">
<header>
<h2 id="bo_v_title">
<?php if ($category_name) { ?>
<span class="bo_v_cate"><?php echo $view['ca_name']; // 분류 출력 끝 ?></span>
<?php } ?>
<span class="bo_v_tit">
<?php
echo cut_str(get_text($view['wr_subject']), 70); // 글제목 출력
?></span>
</h2>
</header>
<section id="bo_v_info">
<h2>페이지 정보</h2>
<div class="profile_info">
<div class="pf_img"><?php echo get_member_profile_img($view['mb_id']) ?></div>
<div class="profile_info_ct">
<span class="sound_only">작성자</span> <strong><?php echo $view['name'] ?><?php if ($is_ip_view) { echo "&nbsp;($ip)"; } ?></strong><br>
<span class="sound_only">댓글</span><strong><a href="#bo_vc"> <i class="fa fa-commenting-o" aria-hidden="true"></i> <?php echo number_format($view['wr_comment']) ?>건</a></strong>
<span class="sound_only">조회</span><strong><i class="fa fa-eye" aria-hidden="true"></i> <?php echo number_format($view['wr_hit']) ?>회</strong>
<strong class="if_date"><span class="sound_only">작성일</span><i class="fa fa-clock-o" aria-hidden="true"></i> <?php echo date("y-m-d H:i", strtotime($view['wr_datetime'])) ?></strong>
</div>
</div>
<!-- 게시물 상단 버튼 시작 { -->
<div id="bo_v_top">
<?php ob_start(); ?>
<ul class="btn_bo_user bo_v_com">
<li><a href="<?php echo $list_href ?>" class="btn_b01 btn" title="목록"><i class="fa fa-list" aria-hidden="true"></i><span class="sound_only">목록</span></a></li>
<?php if ($reply_href) { ?><li><a href="<?php echo $reply_href ?>" class="btn_b01 btn" title="답변"><i class="fa fa-reply" aria-hidden="true"></i><span class="sound_only">답변</span></a></li><?php } ?>
<?php if ($write_href) { ?><li><a href="<?php echo $write_href ?>" class="btn_b01 btn" title="글쓰기"><i class="fa fa-pencil" aria-hidden="true"></i><span class="sound_only">글쓰기</span></a></li><?php } ?>
<?php if($update_href || $delete_href || $copy_href || $move_href || $search_href) { ?>
<li>
<button type="button" class="btn_more_opt is_view_btn btn_b01 btn" title="게시판 리스트 옵션"><i class="fa fa-ellipsis-v" aria-hidden="true"></i><span class="sound_only">게시판 리스트 옵션</span></button>
<ul class="more_opt is_view_btn">
<?php if ($update_href) { ?><li><a href="<?php echo $update_href ?>">수정<i class="fa fa-pencil-square-o" aria-hidden="true"></i></a></li><?php } ?>
<?php if ($delete_href) { ?><li><a href="<?php echo $delete_href ?>" onclick="del(this.href); return false;">삭제<i class="fa fa-trash-o" aria-hidden="true"></i></a></li><?php } ?>
<?php if ($copy_href) { ?><li><a href="<?php echo $copy_href ?>" onclick="board_move(this.href); return false;">복사<i class="fa fa-files-o" aria-hidden="true"></i></a></li><?php } ?>
<?php if ($move_href) { ?><li><a href="<?php echo $move_href ?>" onclick="board_move(this.href); return false;">이동<i class="fa fa-arrows" aria-hidden="true"></i></a></li><?php } ?>
<?php if ($search_href) { ?><li><a href="<?php echo $search_href ?>">검색<i class="fa fa-search" aria-hidden="true"></i></a></li><?php } ?>
</ul>
</li>
<?php } ?>
</ul>
<script>
jQuery(function($){
// 게시판 보기 버튼 옵션
$(".btn_more_opt.is_view_btn").on("click", function(e) {
e.stopPropagation();
$(".more_opt.is_view_btn").toggle();
})
;
$(document).on("click", function (e) {
if(!$(e.target).closest('.is_view_btn').length) {
$(".more_opt.is_view_btn").hide();
}
});
});
</script>
<?php
$link_buttons = ob_get_contents();
ob_end_flush();
?>
</div>
<!-- } 게시물 상단 버튼 끝 -->
</section>
<section id="bo_v_atc">
<h2 id="bo_v_atc_title">본문</h2>
<div id="bo_v_share">
<?php include_once(G5_SNS_PATH."/view.sns.skin.php"); ?>
<?php if ($scrap_href) { ?><a href="<?php echo $scrap_href; ?>" target="_blank" class="btn btn_b03" onclick="win_scrap(this.href); return false;"><i class="fa fa-bookmark" aria-hidden="true"></i> 스크랩</a><?php } ?>
</div>
<?php
// 파일 출력
$v_img_count = count($view['file']);
if($v_img_count) {
echo "<div id=\"bo_v_img\">\n";
foreach($view['file'] as $view_file) {
echo get_file_thumbnail($view_file);
}
echo "</div>\n";
}
?>
<!-- 본문 내용 시작 { -->
<div id="bo_v_con"><?php echo get_view_thumbnail($view['content']); ?></div>
<?php //echo $view['rich_content']; // {이미지:0} 과 같은 코드를 사용할 경우 ?>
<!-- } 본문 내용 끝 -->
<?php if ($is_signature) { ?><p><?php echo $signature ?></p><?php } ?>
<!-- 추천 비추천 시작 { -->
<?php if ( $good_href || $nogood_href) { ?>
<div id="bo_v_act">
<?php if ($good_href) { ?>
<span class="bo_v_act_gng">
<a href="<?php echo $good_href.'&amp;'.$qstr ?>" id="good_button" class="bo_v_good"><i class="fa fa-thumbs-o-up" aria-hidden="true"></i><span class="sound_only">추천</span><strong><?php echo number_format($view['wr_good']) ?></strong></a>
<b id="bo_v_act_good"></b>
</span>
<?php } ?>
<?php if ($nogood_href) { ?>
<span class="bo_v_act_gng">
<a href="<?php echo $nogood_href.'&amp;'.$qstr ?>" id="nogood_button" class="bo_v_nogood"><i class="fa fa-thumbs-o-down" aria-hidden="true"></i><span class="sound_only">비추천</span><strong><?php echo number_format($view['wr_nogood']) ?></strong></a>
<b id="bo_v_act_nogood"></b>
</span>
<?php } ?>
</div>
<?php } else {
if($board['bo_use_good'] || $board['bo_use_nogood']) {
?>
<div id="bo_v_act">
<?php if($board['bo_use_good']) { ?><span class="bo_v_good"><i class="fa fa-thumbs-o-up" aria-hidden="true"></i><span class="sound_only">추천</span><strong><?php echo number_format($view['wr_good']) ?></strong></span><?php } ?>
<?php if($board['bo_use_nogood']) { ?><span class="bo_v_nogood"><i class="fa fa-thumbs-o-down" aria-hidden="true"></i><span class="sound_only">비추천</span><strong><?php echo number_format($view['wr_nogood']) ?></strong></span><?php } ?>
</div>
<?php
}
}
?>
<!-- } 추천 비추천 끝 -->
</section>
<?php
$cnt = 0;
if ($view['file']['count']) {
for ($i=0; $i<count($view['file']); $i++) {
if (isset($view['file'][$i]['source']) && $view['file'][$i]['source'] && !$view['file'][$i]['view'])
$cnt++;
}
}
?>
<?php if($cnt) { ?>
<!-- 첨부파일 시작 { -->
<section id="bo_v_file">
<h2>첨부파일</h2>
<ul>
<?php
// 가변 파일
for ($i=0; $i<count($view['file']); $i++) {
if (isset($view['file'][$i]['source']) && $view['file'][$i]['source'] && !$view['file'][$i]['view']) {
?>
<li>
<i class="fa fa-folder-open" aria-hidden="true"></i>
<a href="<?php echo $view['file'][$i]['href']; ?>" class="view_file_download">
<strong><?php echo $view['file'][$i]['source'] ?></strong> <?php echo $view['file'][$i]['content'] ?> (<?php echo $view['file'][$i]['size'] ?>)
</a>
<br>
<span class="bo_v_file_cnt"><?php echo $view['file'][$i]['download'] ?>회 다운로드 | DATE : <?php echo $view['file'][$i]['datetime'] ?></span>
</li>
<?php
}
}
?>
</ul>
</section>
<!-- } 첨부파일 끝 -->
<?php } ?>
<?php if(isset($view['link']) && array_filter($view['link'])) { ?>
<!-- 관련링크 시작 { -->
<section id="bo_v_link">
<h2>관련링크</h2>
<ul>
<?php
// 링크
$cnt = 0;
for ($i=1; $i<=count($view['link']); $i++) {
if ($view['link'][$i]) {
$cnt++;
$link = cut_str($view['link'][$i], 70);
?>
<li>
<i class="fa fa-link" aria-hidden="true"></i>
<a href="<?php echo $view['link_href'][$i] ?>" target="_blank">
<strong><?php echo $link ?></strong>
</a>
<br>
<span class="bo_v_link_cnt"><?php echo $view['link_hit'][$i] ?>회 연결</span>
</li>
<?php
}
}
?>
</ul>
</section>
<!-- } 관련링크 끝 -->
<?php } ?>
<?php if ($prev_href || $next_href) { ?>
<ul class="bo_v_nb">
<?php if ($prev_href) { ?><li class="btn_prv"><span class="nb_tit"><i class="fa fa-chevron-up" aria-hidden="true"></i> 이전글</span><a href="<?php echo $prev_href ?>"><?php echo $prev_wr_subject;?></a> <span class="nb_date"><?php echo str_replace('-', '.', substr($prev_wr_date, '2', '8')); ?></span></li><?php } ?>
<?php if ($next_href) { ?><li class="btn_next"><span class="nb_tit"><i class="fa fa-chevron-down" aria-hidden="true"></i> 다음글</span><a href="<?php echo $next_href ?>"><?php echo $next_wr_subject;?></a> <span class="nb_date"><?php echo str_replace('-', '.', substr($next_wr_date, '2', '8')); ?></span></li><?php } ?>
</ul>
<?php } ?>
<?php
// 코멘트 입출력
include_once(G5_BBS_PATH.'/view_comment.php');
?>
</article>
<!-- } 게시판 읽기 끝 -->
<script>
<?php if ($board['bo_download_point'] < 0) { ?>
$(function() {
$("a.view_file_download").click(function() {
if(!g5_is_member) {
alert("다운로드 권한이 없습니다.\n회원이시라면 로그인 후 이용해 보십시오.");
return false;
}
var msg = "파일을 다운로드 하시면 포인트가 차감(<?php echo number_format($board['bo_download_point']) ?>점)됩니다.\n\n포인트는 게시물당 한번만 차감되며 다음에 다시 다운로드 하셔도 중복하여 차감하지 않습니다.\n\n그래도 다운로드 하시겠습니까?";
if(confirm(msg)) {
var href = $(this).attr("href")+"&js=on";
$(this).attr("href", href);
return true;
} else {
return false;
}
});
});
<?php } ?>
function board_move(href)
{
window.open(href, "boardmove", "left=50, top=50, width=500, height=550, scrollbars=1");
}
</script>
<script>
$(function() {
$("a.view_image").click(function() {
window.open(this.href, "large_image", "location=yes,links=no,toolbar=no,top=10,left=10,width=10,height=10,resizable=yes,scrollbars=no,status=no");
return false;
});
// 추천, 비추천
$("#good_button, #nogood_button").click(function() {
var $tx;
if(this.id == "good_button")
$tx = $("#bo_v_act_good");
else
$tx = $("#bo_v_act_nogood");
excute_good(this.href, $(this), $tx);
return false;
});
// 이미지 리사이즈
$("#bo_v_atc").viewimageresize();
});
function excute_good(href, $el, $tx)
{
$.post(
href,
{ js: "on" },
function(data) {
if(data.error) {
alert(data.error);
return false;
}
if(data.count) {
$el.find("strong").text(number_format(String(data.count)));
if($tx.attr("id").search("nogood") > -1) {
$tx.text("이 글을 비추천하셨습니다.");
$tx.fadeIn(200).delay(2500).fadeOut(200);
} else {
$tx.text("이 글을 추천하셨습니다.");
$tx.fadeIn(200).delay(2500).fadeOut(200);
}
}
}, "json"
);
}
</script>
<!-- } 게시글 읽기 끝 -->
@@ -0,0 +1,356 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
?>
<script>
// 글자수 제한
var char_min = parseInt(<?php echo $comment_min ?>); // 최소
var char_max = parseInt(<?php echo $comment_max ?>); // 최대
</script>
<button type="button" class="cmt_btn"><span class="total"><b>댓글</b> <?php echo $view['wr_comment']; ?></span><span class="cmt_more"></span></button>
<!-- 댓글 시작 { -->
<section id="bo_vc">
<h2>댓글목록</h2>
<?php
$cmt_amt = count($list);
for ($i=0; $i<$cmt_amt; $i++) {
$comment_id = $list[$i]['wr_id'];
$cmt_depth = strlen($list[$i]['wr_comment_reply']) * 50;
$comment = $list[$i]['content'];
/*
if (strstr($list[$i]['wr_option'], "secret")) {
$str = $str;
}
*/
$comment = preg_replace("/\[\<a\s.*href\=\"(http|https|ftp|mms)\:\/\/([^[:space:]]+)\.(mp3|wma|wmv|asf|asx|mpg|mpeg)\".*\<\/a\>\]/i", "<script>doc_write(obj_movie('$1://$2.$3'));</script>", $comment);
$cmt_sv = $cmt_amt - $i + 1; // 댓글 헤더 z-index 재설정 ie8 이하 사이드뷰 겹침 문제 해결
$c_reply_href = $comment_common_url.'&amp;c_id='.$comment_id.'&amp;w=c#bo_vc_w';
$c_edit_href = $comment_common_url.'&amp;c_id='.$comment_id.'&amp;w=cu#bo_vc_w';
$is_comment_reply_edit = ($list[$i]['is_reply'] || $list[$i]['is_edit'] || $list[$i]['is_del']) ? 1 : 0;
?>
<article id="c_<?php echo $comment_id ?>" <?php if ($cmt_depth) { ?>style="margin-left:<?php echo $cmt_depth ?>px;border-top-color:#e0e0e0"<?php } ?>>
<div class="pf_img"><?php echo get_member_profile_img($list[$i]['mb_id']) ?></div>
<div class="cm_wrap">
<header style="z-index:<?php echo $cmt_sv; ?>">
<h2><?php echo get_text($list[$i]['wr_name']); ?>님의 <?php if ($cmt_depth) { ?><span class="sound_only">댓글의</span><?php } ?> 댓글</h2>
<?php echo $list[$i]['name'] ?>
<?php if ($is_ip_view) { ?>
<span class="sound_only">아이피</span>
<span>(<?php echo $list[$i]['ip']; ?>)</span>
<?php } ?>
<span class="sound_only">작성일</span>
<span class="bo_vc_hdinfo"><i class="fa fa-clock-o" aria-hidden="true"></i> <time datetime="<?php echo date('Y-m-d\TH:i:s+09:00', strtotime($list[$i]['datetime'])) ?>"><?php echo $list[$i]['datetime'] ?></time></span>
<?php
include(G5_SNS_PATH.'/view_comment_list.sns.skin.php');
?>
</header>
<!-- 댓글 출력 -->
<div class="cmt_contents">
<p>
<?php if (strstr($list[$i]['wr_option'], "secret")) { ?><img src="<?php echo $board_skin_url; ?>/img/icon_secret.gif" alt="비밀글"><?php } ?>
<?php echo $comment ?>
</p>
<?php if($is_comment_reply_edit) {
if($w == 'cu') {
$sql = " select wr_id, wr_content, mb_id from $write_table where wr_id = '$c_id' and wr_is_comment = '1' ";
$cmt = sql_fetch($sql);
if (isset($cmt)) {
if (!($is_admin || ($member['mb_id'] == $cmt['mb_id'] && $cmt['mb_id']))) {
$cmt['wr_content'] = '';
}
$c_wr_content = $cmt['wr_content'];
}
}
?>
<?php } ?>
</div>
<span id="edit_<?php echo $comment_id ?>" class="bo_vc_w"></span><!-- 수정 -->
<span id="reply_<?php echo $comment_id ?>" class="bo_vc_w"></span><!-- 답변 -->
<input type="hidden" value="<?php echo strstr($list[$i]['wr_option'],"secret") ?>" id="secret_comment_<?php echo $comment_id ?>">
<textarea id="save_comment_<?php echo $comment_id ?>" style="display:none"><?php echo get_text($list[$i]['content1'], 0) ?></textarea>
</div>
<?php if($is_comment_reply_edit) { ?>
<div class="bo_vl_opt">
<button type="button" class="btn_cm_opt btn_b01 btn"><i class="fa fa-ellipsis-v" aria-hidden="true"></i><span class="sound_only">댓글 옵션</span></button>
<ul class="bo_vc_act">
<?php if ($list[$i]['is_reply']) { ?><li><a href="<?php echo $c_reply_href; ?>" onclick="comment_box('<?php echo $comment_id ?>', 'c'); return false;">답변</a></li><?php } ?>
<?php if ($list[$i]['is_edit']) { ?><li><a href="<?php echo $c_edit_href; ?>" onclick="comment_box('<?php echo $comment_id ?>', 'cu'); return false;">수정</a></li><?php } ?>
<?php if ($list[$i]['is_del']) { ?><li><a href="<?php echo $list[$i]['del_link']; ?>" onclick="return comment_delete();">삭제</a></li><?php } ?>
</ul>
</div>
<?php } ?>
<script>
$(function() {
// 댓글 옵션창 열기
$(".btn_cm_opt").on("click", function(){
$(this).parent("div").children(".bo_vc_act").show();
});
// 댓글 옵션창 닫기
$(document).mouseup(function (e){
var container = $(".bo_vc_act");
if( container.has(e.target).length === 0)
container.hide();
});
});
</script>
</article>
<?php } ?>
<?php if ($i == 0) { //댓글이 없다면 ?><p id="bo_vc_empty">등록된 댓글이 없습니다.</p><?php } ?>
</section>
<!-- } 댓글 끝 -->
<?php if ($is_comment_write) {
if($w == '')
$w = 'c';
?>
<!-- 댓글 쓰기 시작 { -->
<aside id="bo_vc_w" class="bo_vc_w">
<h2>댓글쓰기</h2>
<form name="fviewcomment" id="fviewcomment" action="<?php echo $comment_action_url; ?>" onsubmit="return fviewcomment_submit(this);" method="post" autocomplete="off">
<input type="hidden" name="w" value="<?php echo $w ?>" id="w">
<input type="hidden" name="bo_table" value="<?php echo $bo_table ?>">
<input type="hidden" name="wr_id" value="<?php echo $wr_id ?>">
<input type="hidden" name="comment_id" value="<?php echo $c_id ?>" id="comment_id">
<input type="hidden" name="sca" value="<?php echo $sca ?>">
<input type="hidden" name="sfl" value="<?php echo $sfl ?>">
<input type="hidden" name="stx" value="<?php echo $stx ?>">
<input type="hidden" name="spt" value="<?php echo $spt ?>">
<input type="hidden" name="page" value="<?php echo $page ?>">
<input type="hidden" name="is_good" value="">
<span class="sound_only">내용</span>
<?php if ($comment_min || $comment_max) { ?><strong id="char_cnt"><span id="char_count"></span>글자</strong><?php } ?>
<textarea id="wr_content" name="wr_content" maxlength="10000" required class="required" title="내용" placeholder="댓글내용을 입력해주세요"
<?php if ($comment_min || $comment_max) { ?>onkeyup="check_byte('wr_content', 'char_count');"<?php } ?>><?php echo $c_wr_content; ?></textarea>
<?php if ($comment_min || $comment_max) { ?><script> check_byte('wr_content', 'char_count'); </script><?php } ?>
<script>
$(document).on("keyup change", "textarea#wr_content[maxlength]", function() {
var str = $(this).val()
var mx = parseInt($(this).attr("maxlength"))
if (str.length > mx) {
$(this).val(str.substr(0, mx));
return false;
}
});
</script>
<div class="bo_vc_w_wr">
<div class="bo_vc_w_info">
<?php if ($is_guest) { ?>
<label for="wr_name" class="sound_only">이름<strong> 필수</strong></label>
<input type="text" name="wr_name" value="<?php echo get_cookie("ck_sns_name"); ?>" id="wr_name" required class="frm_input required" size="25" placeholder="이름">
<label for="wr_password" class="sound_only">비밀번호<strong> 필수</strong></label>
<input type="password" name="wr_password" id="wr_password" required class="frm_input required" size="25" placeholder="비밀번호">
<?php
}
?>
<?php
if($board['bo_use_sns'] && ($config['cf_facebook_appid'] || $config['cf_twitter_key'])) {
?>
<span class="sound_only">SNS 동시등록</span>
<span id="bo_vc_send_sns"></span>
<?php } ?>
<?php if ($is_guest) { ?>
<?php echo $captcha_html; ?>
<?php } ?>
</div>
<div class="btn_confirm">
<span class="secret_cm chk_box">
<input type="checkbox" name="wr_secret" value="secret" id="wr_secret" class="selec_chk">
<label for="wr_secret"><span></span>비밀글</label>
</span>
<button type="submit" id="btn_submit" class="btn_submit">댓글등록</button>
</div>
</div>
</form>
</aside>
<script>
var save_before = '';
var save_html = document.getElementById('bo_vc_w').innerHTML;
function good_and_write()
{
var f = document.fviewcomment;
if (fviewcomment_submit(f)) {
f.is_good.value = 1;
f.submit();
} else {
f.is_good.value = 0;
}
}
function fviewcomment_submit(f)
{
var pattern = /(^\s*)|(\s*$)/g; // \s 공백 문자
f.is_good.value = 0;
var subject = "";
var content = "";
$.ajax({
url: g5_bbs_url+"/ajax.filter.php",
type: "POST",
data: {
"subject": "",
"content": f.wr_content.value
},
dataType: "json",
async: false,
cache: false,
success: function(data, textStatus) {
subject = data.subject;
content = data.content;
}
});
if (content) {
alert("내용에 금지단어('"+content+"')가 포함되어있습니다");
f.wr_content.focus();
return false;
}
// 양쪽 공백 없애기
var pattern = /(^\s*)|(\s*$)/g; // \s 공백 문자
document.getElementById('wr_content').value = document.getElementById('wr_content').value.replace(pattern, "");
if (char_min > 0 || char_max > 0)
{
check_byte('wr_content', 'char_count');
var cnt = parseInt(document.getElementById('char_count').innerHTML);
if (char_min > 0 && char_min > cnt)
{
alert("댓글은 "+char_min+"글자 이상 쓰셔야 합니다.");
return false;
} else if (char_max > 0 && char_max < cnt)
{
alert("댓글은 "+char_max+"글자 이하로 쓰셔야 합니다.");
return false;
}
}
else if (!document.getElementById('wr_content').value)
{
alert("댓글을 입력하여 주십시오.");
return false;
}
if (typeof(f.wr_name) != 'undefined')
{
f.wr_name.value = f.wr_name.value.replace(pattern, "");
if (f.wr_name.value == '')
{
alert('이름이 입력되지 않았습니다.');
f.wr_name.focus();
return false;
}
}
if (typeof(f.wr_password) != 'undefined')
{
f.wr_password.value = f.wr_password.value.replace(pattern, "");
if (f.wr_password.value == '')
{
alert('비밀번호가 입력되지 않았습니다.');
f.wr_password.focus();
return false;
}
}
<?php if($is_guest) echo chk_captcha_js(); ?>
set_comment_token(f);
document.getElementById("btn_submit").disabled = "disabled";
return true;
}
function comment_box(comment_id, work)
{
var el_id,
form_el = 'fviewcomment',
respond = document.getElementById(form_el);
// 댓글 아이디가 넘어오면 답변, 수정
if (comment_id)
{
if (work == 'c')
el_id = 'reply_' + comment_id;
else
el_id = 'edit_' + comment_id;
}
else
el_id = 'bo_vc_w';
if (save_before != el_id)
{
if (save_before)
{
document.getElementById(save_before).style.display = 'none';
}
document.getElementById(el_id).style.display = '';
document.getElementById(el_id).appendChild(respond);
//입력값 초기화
document.getElementById('wr_content').value = '';
// 댓글 수정
if (work == 'cu')
{
document.getElementById('wr_content').value = document.getElementById('save_comment_' + comment_id).value;
if (typeof char_count != 'undefined')
check_byte('wr_content', 'char_count');
if (document.getElementById('secret_comment_'+comment_id).value)
document.getElementById('wr_secret').checked = true;
else
document.getElementById('wr_secret').checked = false;
}
document.getElementById('comment_id').value = comment_id;
document.getElementById('w').value = work;
if(save_before)
$("#captcha_reload").trigger("click");
save_before = el_id;
}
}
function comment_delete()
{
return confirm("이 댓글을 삭제하시겠습니까?");
}
comment_box('', 'c'); // 댓글 입력폼이 보이도록 처리하기위해서 추가 (root님)
<?php if($board['bo_use_sns'] && ($config['cf_facebook_appid'] || $config['cf_twitter_key'])) { ?>
$(function() {
// sns 등록
$("#bo_vc_send_sns").load(
"<?php echo G5_SNS_URL; ?>/view_comment_write.sns.skin.php?bo_table=<?php echo $bo_table; ?>",
function() {
save_html = document.getElementById('bo_vc_w').innerHTML;
}
);
});
<?php } ?>
</script>
<?php } ?>
<!-- } 댓글 쓰기 끝 -->
<script>
jQuery(function($) {
//댓글열기
$(".cmt_btn").click(function(e){
e.preventDefault();
$(this).toggleClass("cmt_btn_op");
$("#bo_vc").toggle();
});
});
</script>
+253
View File
@@ -0,0 +1,253 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
add_stylesheet('<link rel="stylesheet" href="'.$board_skin_url.'/style.css">', 0);
?>
<section id="bo_w">
<h2 class="sound_only"><?php echo $g5['title'] ?></h2>
<!-- 게시물 작성/수정 시작 { -->
<form name="fwrite" id="fwrite" action="<?php echo $action_url ?>" onsubmit="return fwrite_submit(this);" method="post" enctype="multipart/form-data" autocomplete="off" style="width:<?php echo $width; ?>">
<input type="hidden" name="uid" value="<?php echo get_uniqid(); ?>">
<input type="hidden" name="w" value="<?php echo $w ?>">
<input type="hidden" name="bo_table" value="<?php echo $bo_table ?>">
<input type="hidden" name="wr_id" value="<?php echo $wr_id ?>">
<input type="hidden" name="sca" value="<?php echo $sca ?>">
<input type="hidden" name="sfl" value="<?php echo $sfl ?>">
<input type="hidden" name="stx" value="<?php echo $stx ?>">
<input type="hidden" name="spt" value="<?php echo $spt ?>">
<input type="hidden" name="sst" value="<?php echo $sst ?>">
<input type="hidden" name="sod" value="<?php echo $sod ?>">
<input type="hidden" name="page" value="<?php echo $page ?>">
<?php
$option = '';
$option_hidden = '';
if ($is_notice || $is_html || $is_secret || $is_mail) {
$option = '';
if ($is_notice) {
$option .= PHP_EOL.'<li class="chk_box"><input type="checkbox" id="notice" name="notice" class="selec_chk" value="1" '.$notice_checked.'>'.PHP_EOL.'<label for="notice"><span></span>공지</label></li>';
}
if ($is_html) {
if ($is_dhtml_editor) {
$option_hidden .= '<input type="hidden" value="html1" name="html">';
} else {
$option .= PHP_EOL.'<li class="chk_box"><input type="checkbox" id="html" name="html" onclick="html_auto_br(this);" class="selec_chk" value="'.$html_value.'" '.$html_checked.'>'.PHP_EOL.'<label for="html"><span></span>html</label></li>';
}
}
if ($is_secret) {
if ($is_admin || $is_secret==1) {
$option .= PHP_EOL.'<li class="chk_box"><input type="checkbox" id="secret" name="secret" class="selec_chk" value="secret" '.$secret_checked.'>'.PHP_EOL.'<label for="secret"><span></span>비밀글</label></li>';
} else {
$option_hidden .= '<input type="hidden" name="secret" value="secret">';
}
}
if ($is_mail) {
$option .= PHP_EOL.'<li class="chk_box"><input type="checkbox" id="mail" name="mail" class="selec_chk" value="mail" '.$recv_email_checked.'>'.PHP_EOL.'<label for="mail"><span></span>답변메일받기</label></li>';
}
}
echo $option_hidden;
?>
<?php if ($is_category) { ?>
<div class="bo_w_select write_div">
<label for="ca_name" class="sound_only">분류<strong>필수</strong></label>
<select name="ca_name" id="ca_name" required>
<option value="">분류를 선택하세요</option>
<?php echo $category_option ?>
</select>
</div>
<?php } ?>
<div class="bo_w_info write_div">
<?php if ($is_name) { ?>
<label for="wr_name" class="sound_only">이름<strong>필수</strong></label>
<input type="text" name="wr_name" value="<?php echo $name ?>" id="wr_name" required class="frm_input half_input required" placeholder="이름">
<?php } ?>
<?php if ($is_password) { ?>
<label for="wr_password" class="sound_only">비밀번호<strong>필수</strong></label>
<input type="password" name="wr_password" id="wr_password" <?php echo $password_required ?> class="frm_input half_input <?php echo $password_required ?>" placeholder="비밀번호">
<?php } ?>
<?php if ($is_email) { ?>
<label for="wr_email" class="sound_only">이메일</label>
<input type="text" name="wr_email" value="<?php echo $email ?>" id="wr_email" class="frm_input half_input email " placeholder="이메일">
<?php } ?>
<?php if ($is_homepage) { ?>
<label for="wr_homepage" class="sound_only">홈페이지</label>
<input type="text" name="wr_homepage" value="<?php echo $homepage ?>" id="wr_homepage" class="frm_input half_input" size="50" placeholder="홈페이지">
<?php } ?>
</div>
<?php if ($option) { ?>
<div class="write_div">
<span class="sound_only">옵션</span>
<ul class="bo_v_option">
<?php echo $option ?>
</ul>
</div>
<?php } ?>
<div class="bo_w_tit write_div">
<label for="wr_subject" class="sound_only">제목<strong>필수</strong></label>
<div id="autosave_wrapper" class="write_div">
<input type="text" name="wr_subject" value="<?php echo $subject ?>" id="wr_subject" required class="frm_input full_input required" size="50" maxlength="255" placeholder="제목">
<?php if ($is_member) { // 임시 저장된 글 기능 ?>
<script src="<?php echo G5_JS_URL; ?>/autosave.js"></script>
<?php if($editor_content_js) echo $editor_content_js; ?>
<button type="button" id="btn_autosave" class="btn_frmline">임시 저장된 글 (<span id="autosave_count"><?php echo $autosave_count; ?></span>)</button>
<div id="autosave_pop">
<strong>임시 저장된 글 목록</strong>
<ul></ul>
<div><button type="button" class="autosave_close">닫기</button></div>
</div>
<?php } ?>
</div>
</div>
<div class="write_div">
<label for="wr_content" class="sound_only">내용<strong>필수</strong></label>
<div class="wr_content <?php echo $is_dhtml_editor ? $config['cf_editor'] : ''; ?>">
<?php if($write_min || $write_max) { ?>
<!-- 최소/최대 글자 수 사용 시 -->
<p id="char_count_desc">이 게시판은 최소 <strong><?php echo $write_min; ?></strong>글자 이상, 최대 <strong><?php echo $write_max; ?></strong>글자 이하까지 글을 쓰실 수 있습니다.</p>
<?php } ?>
<?php echo $editor_html; // 에디터 사용시는 에디터로, 아니면 textarea 로 노출 ?>
<?php if($write_min || $write_max) { ?>
<!-- 최소/최대 글자 수 사용 시 -->
<div id="char_count_wrap"><span id="char_count"></span>글자</div>
<?php } ?>
</div>
</div>
<?php for ($i=1; $is_link && $i<=G5_LINK_COUNT; $i++) { ?>
<div class="bo_w_link write_div">
<label for="wr_link<?php echo $i ?>"><i class="fa fa-link" aria-hidden="true"></i><span class="sound_only"> 링크 #<?php echo $i ?></span></label>
<input type="text" name="wr_link<?php echo $i ?>" value="<?php if($w=="u"){ echo $write['wr_link'.$i]; } ?>" id="wr_link<?php echo $i ?>" class="frm_input full_input" size="50">
</div>
<?php } ?>
<?php for ($i=0; $is_file && $i<$file_count; $i++) { ?>
<div class="bo_w_flie write_div">
<div class="file_wr write_div">
<label for="bf_file_<?php echo $i+1 ?>" class="lb_icon"><i class="fa fa-folder-open" aria-hidden="true"></i><span class="sound_only"> 파일 #<?php echo $i+1 ?></span></label>
<input type="file" name="bf_file[]" id="bf_file_<?php echo $i+1 ?>" title="파일첨부 <?php echo $i+1 ?> : 용량 <?php echo $upload_max_filesize ?> 이하만 업로드 가능" class="frm_file ">
</div>
<?php if ($is_file_content) { ?>
<input type="text" name="bf_content[]" value="<?php echo ($w == 'u') ? $file[$i]['bf_content'] : ''; ?>" title="파일 설명을 입력해주세요." class="full_input frm_input" size="50" placeholder="파일 설명을 입력해주세요.">
<?php } ?>
<?php if($w == 'u' && $file[$i]['file']) { ?>
<span class="file_del">
<input type="checkbox" id="bf_file_del<?php echo $i ?>" name="bf_file_del[<?php echo $i; ?>]" value="1"> <label for="bf_file_del<?php echo $i ?>"><?php echo $file[$i]['source'].'('.$file[$i]['size'].')'; ?> 파일 삭제</label>
</span>
<?php } ?>
</div>
<?php } ?>
<?php if ($is_use_captcha) { //자동등록방지 ?>
<div class="write_div">
<?php echo $captcha_html ?>
</div>
<?php } ?>
<div class="btn_confirm write_div">
<a href="<?php echo get_pretty_url($bo_table); ?>" class="btn_cancel btn">취소</a>
<button type="submit" id="btn_submit" accesskey="s" class="btn_submit btn">작성완료</button>
</div>
</form>
<script>
<?php if($write_min || $write_max) { ?>
// 글자수 제한
var char_min = parseInt(<?php echo $write_min; ?>); // 최소
var char_max = parseInt(<?php echo $write_max; ?>); // 최대
check_byte("wr_content", "char_count");
$(function() {
$("#wr_content").on("keyup", function() {
check_byte("wr_content", "char_count");
});
});
<?php } ?>
function html_auto_br(obj)
{
if (obj.checked) {
result = confirm("자동 줄바꿈을 하시겠습니까?\n\n자동 줄바꿈은 게시물 내용중 줄바뀐 곳을<br>태그로 변환하는 기능입니다.");
if (result)
obj.value = "html2";
else
obj.value = "html1";
}
else
obj.value = "";
}
function fwrite_submit(f)
{
<?php echo $editor_js; // 에디터 사용시 자바스크립트에서 내용을 폼필드로 넣어주며 내용이 입력되었는지 검사함 ?>
var subject = "";
var content = "";
$.ajax({
url: g5_bbs_url+"/ajax.filter.php",
type: "POST",
data: {
"subject": f.wr_subject.value,
"content": f.wr_content.value
},
dataType: "json",
async: false,
cache: false,
success: function(data, textStatus) {
subject = data.subject;
content = data.content;
}
});
if (subject) {
alert("제목에 금지단어('"+subject+"')가 포함되어있습니다");
f.wr_subject.focus();
return false;
}
if (content) {
alert("내용에 금지단어('"+content+"')가 포함되어있습니다");
if (typeof(ed_wr_content) != "undefined")
ed_wr_content.returnFalse();
else
f.wr_content.focus();
return false;
}
if (document.getElementById("char_count")) {
if (char_min > 0 || char_max > 0) {
var cnt = parseInt(check_byte("wr_content", "char_count"));
if (char_min > 0 && char_min > cnt) {
alert("내용은 "+char_min+"글자 이상 쓰셔야 합니다.");
return false;
}
else if (char_max > 0 && char_max < cnt) {
alert("내용은 "+char_max+"글자 이하로 쓰셔야 합니다.");
return false;
}
}
}
<?php echo $captcha_js; // 캡챠 사용시 자바스크립트에서 입력된 캡챠를 검사함 ?>
document.getElementById("btn_submit").disabled = "disabled";
return true;
}
</script>
</section>
<!-- } 게시물 작성/수정 끝 -->
+9
View File
@@ -0,0 +1,9 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// 회원수는 $row['mb_cnt'];
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
add_stylesheet('<link rel="stylesheet" href="'.$connect_skin_url.'/style.css">', 0);
?>
<?php echo $row['total_cnt'];
@@ -0,0 +1,35 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
add_stylesheet('<link rel="stylesheet" href="'.$connect_skin_url.'/style.css">', 0);
?>
<!-- 현재접속자 목록 시작 { -->
<div id="current_connect">
<ul>
<?php
for ($i=0; $i<count($list); $i++) {
//$location = conv_content($list[$i]['lo_location'], 0);
$location = $list[$i]['lo_location'];
// 최고관리자에게만 허용
// 이 조건문은 가능한 변경하지 마십시오.
if ($list[$i]['lo_url'] && $is_admin == 'super') $display_location = "<a href=\"".$list[$i]['lo_url']."\">".$location."</a>";
else $display_location = $location;
?>
<li>
<span class="crt_num"><?php echo $list[$i]['num'] ?></span>
<span class="crt_profile"><?php echo get_member_profile_img($list[$i]['mb_id']); ?></span>
<div class="crt_info">
<span class="crt_name"><?php echo $list[$i]['name'] ?></span>
<span class="crt_lct"><?php echo $display_location ?></span>
</div>
</li>
<?php
}
if ($i == 0)
echo "<li class=\"empty_li\">현재 접속자가 없습니다.</li>";
?>
</ul>
</div>
<!-- } 현재접속자 목록 끝 -->
+18
View File
@@ -0,0 +1,18 @@
@charset "utf-8";
/* 현재접속자 */
#current_connect ul {margin:0;padding:0;list-style:none;zoom:1}
#current_connect ul:after {display:block;visibility:hidden;clear:both;content:""}
#current_connect li:after {display:block;visibility:hidden;clear:both;content:""}
#current_connect li {position:relative;padding:18px 0;border-bottom:1px solid #ececec;min-height:1px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin-left:0}
#current_connect li:first-child {border-top:1px solid #ececec}
#current_connect .crt_num {float:left;line-height:45px;margin-right:20px;color:#777;font-weight:bold}
#current_connect .crt_profile {float:left;margin-right:20px;line-height:45px}
#current_connect .crt_profile > img {width:45px;height:45px;border-radius:50%}
#current_connect .crt_info {float:left;margin-top:5px}
#current_connect .crt_name {display:block}
#current_connect .sv_member {font-weight:bold;line-height:20px;font-size:1.2em}
#current_connect .profile_img {display:none}
#current_connect .crt_lct {display:block}
#current_connect .crt_lct a {color:#797979}
#current_connect li.empty_li {width:100%;padding:200px 0;border:0;color:#666;text-align:center}
+17
View File
@@ -0,0 +1,17 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
add_stylesheet('<link rel="stylesheet" href="'.$content_skin_url.'/style.css">', 0);
?>
<article id="ctt" class="ctt_<?php echo $co_id; ?>">
<header>
<h1><?php echo $g5['title']; ?></h1>
</header>
<div id="ctt_con">
<?php echo $str; ?>
</div>
</article>
+10
View File
@@ -0,0 +1,10 @@
@charset "utf-8";
/* 내용관리 */
#ctt {margin:10px 0;padding:20px;background:#fff}
.ctt_admin {text-align:right}
#ctt header h1 {position:absolute;font-size:0;line-height:0;overflow:hidden}
#ctt_con {padding:10px 0;line-height:1.6em}
#ctt_con img{max-width:100%;height:auto}
.ctt_img {text-align:center}
+198
View File
@@ -0,0 +1,198 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
add_stylesheet('<link rel="stylesheet" href="'.$faq_skin_url.'/style.css">', 0);
?>
<head>
<link rel="stylesheet" href="../theme/basic/css/default.css?ver=2303229">
<link rel="stylesheet" href="../js/font-awesome/css/font-awesome.min.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/connect/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/popular/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/faq/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/outlogin/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/latest/notice/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/visit/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../js/owlcarousel/owl.carousel.min.css?ver=2303229">
<script>
// 자바스크립트에서 사용하는 전역변수 선언
var g5_url = "http://localhost/tova";
var g5_bbs_url = "http://localhost/tova/bbs";
var g5_is_member = "1";
var g5_is_admin = "super";
var g5_is_mobile = "";
var g5_bo_table = "";
var g5_sca = "";
var g5_editor = "";
var g5_cookie_domain = "";
var g5_theme_shop_url = "http://localhost/tova/theme/basic/shop";
var g5_shop_url = "http://localhost/tova/shop";
</script>
<script src="js/jquery-1.12.4.min.js?ver=2304171"></script>
<script src="js/jquery-migrate-1.4.1.min.js?ver=2304171"></script>
<script src="js/jquery.menu.js?ver=2304171"></script>
<script src="js/common.js?ver=2304171"></script>
<script src="js/wrest.js?ver=2304171"></script>
<script src="js/placeholders.min.js?ver=2304171"></script>
<script src="js/owlcarousel/owl.carousel.min.js?ver=2304171"></script>
<script src="js/jquery.bxslider.js?ver=2304171"></script>
<!-- 디자인팀 작성 -->
<link rel="stylesheet" href="../css/reset.css"/>
<link rel="stylesheet" href="../css/font.css"/>
<link rel="stylesheet" href="../css/style.css"/>
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css"/>
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script type="text/javascript" src="../js/jquery-3.6.1.min.js"></script>
<script type="text/javascript" src="../js/jquery.mousewheel.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
<!-- <script type="text/javascript" src="js/common.js"></script> -->
<script type="text/javascript" src="../js/popup.js"></script>
<!-- //디자인팀 작성 -->
</head>
<!-- FAQ 시작 { -->
<?php
if ($himg_src)
echo '<div id="faq_himg" class="faq_img"><img src="'.$himg_src.'" alt=""></div>';
// 상단 HTML
echo '<div id="faq_hhtml">'.conv_content($fm['fm_head_html'], 1).'</div>';
?>
<fieldset id="faq_sch">
<legend>FAQ 검색</legend>
<form name="faq_search_form" method="get">
<span class="sch_tit">FAQ 검색</span>
<input type="hidden" name="fm_id" value="<?php echo $fm_id;?>">
<label for="stx" class="sound_only">검색어<strong class="sound_only"> 필수</strong></label>
<input type="text" name="stx" value="<?php echo $stx;?>" required id="stx" class="frm_input" size="15" maxlength="15">
<button type="submit" value="검색" class="btn_submit"><i class="fa fa-search" aria-hidden="true"></i> 검색</button>
</form>
</fieldset>
<?php
if( count($faq_master_list) ){
?>
<nav id="bo_cate">
<h2>자주하시는질문 분류</h2>
<ul id="bo_cate_ul">
<?php
foreach( $faq_master_list as $v ){
$category_msg = '';
$category_option = '';
if($v['fm_id'] == $fm_id){ // 현재 선택된 카테고리라면
$category_option = ' id="bo_cate_on"';
$category_msg = '<span class="sound_only">열린 분류 </span>';
}
?>
<li><a href="<?php echo $category_href;?>?fm_id=<?php echo $v['fm_id'];?>" <?php echo $category_option;?> ><?php echo $category_msg.$v['fm_subject'];?></a></li>
<?php
}
?>
</ul>
</nav>
<?php } ?>
<div id="faq_wrap" class="faq_<?php echo $fm_id; ?>">
<?php // FAQ 내용
if( count($faq_list) ){
?>
<section id="faq_con">
<h2><?php echo $g5['title']; ?> 목록</h2>
<ol>
<?php
foreach($faq_list as $key=>$v){
if(empty($v))
continue;
?>
<li>
<h3>
<span class="tit_bg">Q</span><a href="#none" onclick="return faq_open(this);"><?php echo conv_content($v['fa_subject'], 1); ?></a>
<button class="tit_btn" onclick="return faq_open(this);"><i class="fa fa-plus" aria-hidden="true"></i><span class="sound_only">열기</span></button>
</h3>
<div class="con_inner">
<?php echo conv_content($v['fa_content'], 1); ?>
<button type="button" class="closer_btn"><i class="fa fa-minus" aria-hidden="true"></i><span class="sound_only">닫기</span></button>
</div>
</li>
<?php
}
?>
</ol>
</section>
<?php
} else {
if($stx){
echo '<p class="empty_list">검색된 게시물이 없습니다.</p>';
} else {
echo '<div class="empty_list">등록된 FAQ가 없습니다.';
if($is_admin)
echo '<br><a href="'.G5_ADMIN_URL.'/faqmasterlist.php">FAQ를 새로 등록하시려면 FAQ관리</a> 메뉴를 이용하십시오.';
echo '</div>';
}
}
?>
</div>
<?php echo get_paging($page_rows, $page, $total_page, $_SERVER['SCRIPT_NAME'].'?'.$qstr.'&amp;page='); ?>
<?php
// 하단 HTML
echo '<div id="faq_thtml">'.conv_content($fm['fm_tail_html'], 1).'</div>';
if ($timg_src)
echo '<div id="faq_timg" class="faq_img"><img src="'.$timg_src.'" alt=""></div>';
?>
<!-- } FAQ 끝 -->
<?php
if ($admin_href)
echo '<div class="faq_admin"><a href="'.$admin_href.'" class="btn_admin btn" title="FAQ 수정"><i class="fa fa-cog fa-spin fa-fw"></i><span class="sound_only">FAQ 수정</span></a></div>';
?>
<script src="<?php echo G5_JS_URL; ?>/viewimageresize.js"></script>
<script>
jQuery(function() {
$(".closer_btn").on("click", function() {
$(this).closest(".con_inner").slideToggle('slow', function() {
var $h3 = $(this).closest("li").find("h3");
$("#faq_con li h3").removeClass("faq_li_open");
if($(this).is(":visible")) {
$h3.addClass("faq_li_open");
}
});
});
});
function faq_open(el)
{
var $con = $(el).closest("li").find(".con_inner"),
$h3 = $(el).closest("li").find("h3");
if($con.is(":visible")) {
$con.slideUp();
$h3.removeClass("faq_li_open");
} else {
$("#faq_con .con_inner:visible").css("display", "none");
$con.slideDown(
function() {
// 이미지 리사이즈
$con.viewimageresize2();
$("#faq_con li h3").removeClass("faq_li_open");
$h3.addClass("faq_li_open");
}
);
}
return false;
}
</script>
+564
View File
@@ -0,0 +1,564 @@
<!DOCTYPE html>
<html lang="en">
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
//add_stylesheet('<link rel="stylesheet" href="'.$faq_skin_url.'/style.css">', 0);
?>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<head>
<title>Q&A</title>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-STZ2R5Q7HG"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-STZ2R5Q7HG');
</script>
<link rel="stylesheet" href="../theme/basic/css/default.css?ver=2303229">
<link rel="stylesheet" href="../js/font-awesome/css/font-awesome.min.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/connect/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/popular/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/faq/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/outlogin/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/latest/notice/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/visit/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../js/owlcarousel/owl.carousel.min.css?ver=2303229">
<script>
// 자바스크립트에서 사용하는 전역변수 선언
// var g5_url = "http://localhost/tova";
// var g5_bbs_url = "http://localhost/tova/bbs";
// var g5_is_member = "1";
// var g5_is_admin = "";
// var g5_is_mobile = "";
// var g5_bo_table = "";
// var g5_sca = "";
// var g5_editor = "";
// var g5_cookie_domain = "";
// var g5_theme_shop_url = "http://localhost/tova/theme/basic/shop";
// var g5_shop_url = "http://localhost/tova/shop";
</script>
<script src="../js/jquery-1.12.4.min.js?ver=2304171"></script>
<script src="../js/jquery-migrate-1.4.1.min.js?ver=2304171"></script>
<script src="../js/jquery.menu.js?ver=2304171"></script>
<!-- <script src="../js/common.js?ver=2304171"></script> -->
<script src="../js/wrest.js?ver=2304171"></script>
<script src="../js/placeholders.min.js?ver=2304171"></script>
<script src="../js/owlcarousel/owl.carousel.min.js?ver=2304171"></script>
<script src="../js/jquery.bxslider.js?ver=2304171"></script>
<!-- //그누보드 작성 -->
<!-- 디자인팀 작성 -->
<script type="text/javascript" src="../js/jquery-3.6.1.min.js"></script>
<script type="text/javascript" src="../js/jquery.mousewheel.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css"/>
<link rel="stylesheet" href="https://unpkg.com/lenis@1.1.9/dist/lenis.css">
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script src="https://unpkg.com/lenis@1.1.9/dist/lenis.min.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="../js/popup.js"></script>
<link rel="stylesheet" href="../css/reset.css"/>
<link rel="stylesheet" href="../css/font.css"/>
<link rel="stylesheet" href="../css/style.css"/>
<!-- //디자인팀 작성 -->
</head>
<!-- FAQ 시작 { -->
<?php
if ($himg_src)
echo '<div id="faq_himg" class="faq_img"><img src="'.$himg_src.'" alt=""></div>';
// 상단 HTML
echo '<div id="faq_hhtml">'.conv_content($fm['fm_head_html'], 1).'</div>';
?>
<body>
<div class="wrapper">
<input id="hid_mb_id" type="hidden" value="<?echo $_SESSION['session_id'];?>"></input>
<!-- HEADER -->
<?php include_once($member_skin_path.'/main_header.skin.php'); ?>
<!-- //Header -->
<!-- 모든 팝업페이지 경로 -->
<?php
include_once($member_skin_path.'/login.skin.php');
include_once($member_skin_path.'/mypage01.skin.php');
include_once($member_skin_path.'/register.skin.php');
include_once($member_skin_path.'/register_form.skin.php');
include_once($member_skin_path.'/mypage02.skin.php');
include_once($member_skin_path.'/mypage03.skin.php');
include_once($member_skin_path.'/sitemap.skin.php');
include_once($member_skin_path.'/privacy.skin.php');
include_once($member_skin_path.'/password_lost.skin.php');
?>
<!-- 모든 팝업페이지 경로 -->
<div class="container faq">
<section class="intro">
<div class="top js__dark">
<h2 data-aos="fade-down" data-aos-duration="1000">FAQ</h2>
<span>EG-BIM 관련 자주하는 질문</span>
</div>
<ul class="sub_tab">
<li class="on"><a href="<?php echo G5_BBS_URL ?>/faq.php">자주하는 질문(FAQ)</a></li>
<li><a href="/egbim/bbs/descope_qa_list.php">문의하기(Q&A)</a></li>
<!-- <li><a href="#" onclick="alert('문의하기 게시판은 준비중입니다.'); return false;">문의하기(Q&A)</a></li> -->
<li><a href="https://939.co.kr/saman/" target="_blank">원격지원</a></li>
</ul>
</section>
<span class="sub_tit">자주하는 질문(FAQ)</span>
<div id="wrapper">
<div id="container_wr">
<div id="container">
<fieldset id="faq_sch">
<legend>FAQ 검색</legend>
<form name="faq_search_form" method="get">
<span class="sch_tit">FAQ 검색</span>
<input type="hidden" name="fm_id" value="<?php echo $fm_id;?>">
<label for="stx" class="sound_only">검색어<strong class="sound_only"> 필수</strong></label>
<input type="text" name="stx" value="<?php echo $stx;?>" required id="stx" class="frm_input" size="15" maxlength="15">
<button type="submit" value="검색" class="btn_submit"><i class="fa fa-search" aria-hidden="true"></i> 검색</button>
</form>
</fieldset>
<?php
if( count($faq_master_list) ){
?>
<nav id="bo_cate">
<h2>자주하시는질문 분류</h2>
<ul id="bo_cate_ul" style="display:none">
<?php
foreach( $faq_master_list as $v ){
$category_msg = '';
$category_option = '';
if($v['fm_id'] == $fm_id){ // 현재 선택된 카테고리라면
$category_option = ' id="bo_cate_on"';
$category_msg = '<span class="sound_only">열린 분류 </span>';
}
?>
<li><a href="<?php echo $category_href;?>?fm_id=<?php echo $v['fm_id'];?>" <?php echo $category_option;?> ><?php echo $category_msg.$v['fm_subject'];?></a></li>
<?php
}
?>
</ul>
</nav>
<?php } ?>
<div id="faq_wrap" class="faq_<?php echo $fm_id; ?>">
<?php // FAQ 내용
if( count($faq_list) ){
?>
<section id="faq_con">
<h2><?php echo $g5['title']; ?> 목록</h2>
<ol>
<?php
foreach($faq_list as $key=>$v){
if(empty($v))
continue;
?>
<li>
<h3>
<span class="tit_bg">Q</span><a href="#none" onclick="return faq_open(this);"><?php echo conv_content($v['fa_subject'], 1); ?></a>
<button class="tit_btn" onclick="return faq_open(this);"><i class="fa fa-plus" aria-hidden="true"></i><span class="sound_only">열기</span></button>
</h3>
<div class="con_inner">
<?php echo conv_content($v['fa_content'], 1); ?>
<button type="button" class="closer_btn"><i class="fa fa-minus" aria-hidden="true"></i><span class="sound_only">닫기</span></button>
</div>
</li>
<?php
}
?>
</ol>
</section>
<?php
} else {
if($stx){
echo '<p class="empty_list">검색된 게시물이 없습니다.</p>';
} else {
echo '<div class="empty_list">등록된 FAQ가 없습니다.';
if($is_admin)
echo '<br><a href="'.G5_ADMIN_URL.'/faqmasterlist.php">FAQ를 새로 등록하시려면 FAQ관리</a> 메뉴를 이용하십시오.';
echo '</div>';
}
}
?>
</div>
<?php echo get_paging($page_rows, $page, $total_page, $_SERVER['SCRIPT_NAME'].'?'.$qstr.'&amp;page='); ?>
<?php
// 하단 HTML
echo '<div id="faq_thtml">'.conv_content($fm['fm_tail_html'], 1).'</div>';
if ($timg_src)
echo '<div id="faq_timg" class="faq_img"><img src="'.$timg_src.'" alt=""></div>';
?>
</div>
<?php
// if ($admin_href)
// echo '<div class="faq_admin"><a href="'.$admin_href.'" class="btn_admin btn" title="FAQ 수정"><i class="fa fa-cog fa-spin fa-fw"></i><span class="sound_only">FAQ 수정</span></a></div>';
?>
</div>
</div>
</div>
<!-- FOOTER -->
<?php include_once($member_skin_path.'/main_footer.skin.php'); ?>
<!-- //FOOTER -->
<script>
AOS.init();
const lenis = new Lenis()
lenis.on('scroll', (e) => {
// console.log(e)
})
lenis.on('scroll', ScrollTrigger.update)
gsap.ticker.add((time)=>{
lenis.raf(time * 1000)
})
gsap.ticker.lagSmoothing(0)
</script>
</div>
</body>
<script src="<?php echo G5_JS_URL; ?>/viewimageresize.js"></script>
<script>
jQuery(function() {
$(".closer_btn").on("click", function() {
$(this).closest(".con_inner").slideToggle('slow', function() {
var $h3 = $(this).closest("li").find("h3");
$("#faq_con li h3").removeClass("faq_li_open");
if($(this).is(":visible")) {
$h3.addClass("faq_li_open");
}
});
});
});
function faq_open(el)
{
var $con = $(el).closest("li").find(".con_inner"),
$h3 = $(el).closest("li").find("h3");
if($con.is(":visible")) {
$con.slideUp();
$h3.removeClass("faq_li_open");
} else {
$("#faq_con .con_inner:visible").css("display", "none");
$con.slideDown(
function() {
// 이미지 리사이즈
$con.viewimageresize2();
$("#faq_con li h3").removeClass("faq_li_open");
$h3.addClass("faq_li_open");
}
);
}
return false;
}
</script>
<!-- 상단(헤더) 스크립트 구문 -->
<script>
$(function(){
// footer family site toggle
$('.family_btn').click(function(e){
e.stopPropagation();
$('.family_list, .family_btn').toggleClass('family_on');
});
$(document).click(function(e){
if(!$(e.target).closest('.family_wrap').length){
$('.family_list, .family_btn').removeClass('family_on');
}
});
});
// 회원 탈퇴
function member_leave() {
if (confirm("회원에서 탈퇴 하시겠습니까?"))
location.href = '<?php echo G5_BBS_URL ?>/member_leave.php';
}
// 회원 탈퇴
let x = document.cookie;
if(x.includes("tmp_1=John")){
deleteCookie("tmp_1");
$('#pop_mypage02').show();
}
function deleteCookie(name) {
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/egbim;";
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/egbim/bbs;";
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/egbim/faq;";
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/egbim/qa;";
}
function getCookie(cname) {
let name = cname + "=";
let decodedCookie = decodeURIComponent(document.cookie);
let ca = decodedCookie.split(';');
for(let i = 0; i <ca.length; i++) {
let c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
}
//descope 로그인, 로그아웃 js
function updateHeaderMenu() {
var isLoggedIn = !!sessionStorage.getItem("sessionJwt");
// role 체크 예시 (로그인 시 저장해놓은 값)
var isAdmin = sessionStorage.getItem('userRole') === 'super';
if (isLoggedIn) {
$('.my_join2, .my_login2').show();
$('.my_join, .my_login').hide();
// 마이페이지/관리자 메뉴 동적 출력
if (isAdmin) {
$('#my_join2').html("<a href='http://eg-bim.com/egbim/adm/index.php' target='_blank'>관리페이지</a>");
} else {
$('#my_join2').html("<a href='javascript:mypage03();'>마이페이지</a>");
}
} else {
$('.my_join2, .my_login2').hide();
$('.my_join, .my_login').show();
$('#my_join2').html(""); // 혹시모를 내용 초기화
}
}
function descopeLogout() {
fetch('/egbim/skin/member/basic/descope_logout.php', {
method: 'POST',
credentials: 'include' // PHPSESSID 쿠키 전송
})
.then(res => {
if (!res.ok) throw new Error('서버 로그아웃 실패');
// 1) 로컬 저장소 정리
// sessionStorage.removeItem("refreshJwt");
// sessionStorage.removeItem("sessionJwt");
// sessionStorage.removeItem("userRole");
// sessionStorage.removeItem("userName");
// sessionStorage.removeItem("loginId");
sessionStorage.clear();
localStorage.clear();
// 2) UI 갱신
updateHeaderMenu();
// 3) 로그인 페이지로 이동
window.location.href = '/egbim/index.php';
})
.catch(err => {
console.error(err);
alert('로그아웃 중 오류가 발생했습니다.');
});
}
$(document).ready(function() {
// 기존에 있던 updateHeaderMenu() 호출 뒤에
$('#my_login2 a').off('click').on('click', function(e){
e.preventDefault();
descopeLogout();
});
});
$(document).ready(function() {
updateHeaderMenu();
// (필요하다면, 로그인 성공 후에도 항상 updateHeaderMenu(); 호출)
});
//descope login
$('#flogin button[type=submit]').click(function(e){
e.preventDefault();
let mb_id = $('#login_id').val();
let mb_password = $('#login_pw').val();
$.ajax({
url : '/egbim/skin/member/basic/descope_login.php',
data : {
'mb_id' : mb_id,
'mb_password' : mb_password
},
type : "POST",
dataType : "json",
success : function(res){
if(res.status === "ok") {
// 토큰 저장
// sessionStorage.setItem("refreshJwt", res.refreshJwt);
sessionStorage.setItem("sessionJwt", res.sessionJwt);
// ✅ 사용자 정보 저장
if (res.user) {
sessionStorage.setItem("loginId", res.user.loginIds?.[0] || '');
sessionStorage.setItem("userName", res.user.name || '');
sessionStorage.setItem("company", res.user.customAttributes?.company || '');
sessionStorage.setItem("familyCompany", res.user.customAttributes?.familyCompany || '');
sessionStorage.setItem("position", res.user.customAttributes?.position || '');
sessionStorage.setItem("team", res.user.customAttributes?.team || '');
sessionStorage.setItem("familyUniqueKey", res.user.customAttributes?.familyUniqueKey || '');
sessionStorage.setItem("phone", res.user.phone || '');
}
// ✅ 추가: 관리자 등 정보 저장
if(res.user && res.user.roleNames && res.user.roleNames[0])
sessionStorage.setItem("userRole", res.user.roleNames[0]);
else
sessionStorage.removeItem("userRole");
// ✅ 로그인 후 메뉴 갱신
updateHeaderMenu();
// UI 처리
$('.popup_wrap').hide();
$('body').css('overflow', '');
lenis.start();
// alert('로그인 하셨습니다.');
} else {
alert(res.message || "로그인 실패");
// 🔴 실패 횟수에 따라 안내 배너 교체
if (res.failCount && res.failCount >= 8) {
updateLoginBanner("fail");
}
}
},
error : function(err){
alert(err.statusText || "통신 오류");
}
});
});
// ✅ 배너 교체 함수
function updateLoginBanner(type = "default") {
const $banner = $('#login_notice_banner');
if (!$banner.length) return;
if (type === "default") {
$banner.css({ background: "#063e01ff", color: "#fff" });
$banner.find("strong").text("[로그인 시스템 변경 안내]");
$banner.find("p.left").html(`
더 나은 보안을 위해 2025년 8월 8일부터 로그인 시스템이 변경되었습니다.<br>
기존 회원 또한 신규 시스템에 맞춰 재가입을 진행해주시기 바랍니다.
`);
$banner.find("p:last").html(`※ 로그인 및 가입 관련 문의: <strong>010-8721-7453</strong>`);
}
if (type === "fail") {
$banner.css({ background: "#6a0202ff", color: "#faf6f6ff" });
$banner.find("strong").text("[로그인 시도 제한 안내]");
$banner.find("p.left").html(`
비밀번호 입력을 <strong>7회 이상 연속 실패</strong>하셨습니다.<br>
<strong>8번째 시도부터 3분 대기</strong>가 적용됩니다.<br>
10회 이상 실패 시 계정이 잠금 처리됩니다.
`);
$banner.find("p:last").text("");
}
}
//회원가입 약관동의
$('#fregister button[type=submit]').click(function(e){
e.preventDefault();
let agree11 = $('#agree11').val();
let agree21 = $('#agree21').val();
$.ajax({
url : '<?php echo G5_URL ?>/bbs/register_form.php',
type : "POST",
datatype : "json",
contentType: 'application/json; charset=utf-8',
data : {
'agree11' : agree11,
'agree21' : agree21
},
success : function(data){
var ss='';
for(i=0; i<data.length; i++){
ss=ss + data[i];
}
},
error : function(err){
alert(err);
}
});
});
// 이지빔 프로그램 회원가입 url 쿼리스트링 파싱 함수
function getQueryString(name) {
const intro = document.querySelector('.intro_wrap');
intro.style.display = "none";
const mainMask = document.querySelector('.main_mask');
mainMask.classList.add('skip');
// mainMask.style.aimation = 'none';
const urlParams = new URLSearchParams(window.location.search);
return urlParams.get(name);
}
$(document).ready(function() {
const popupParam = getQueryString('popup');
if (popupParam === 'signup') {
console.log('쿼리 감지: signup → 회원가입 팝업 자동 오픈 시도');
$('#pop_agreement').show(); // 팝업 보여주기
// 스크롤 잠금 (사용 중이면)
$('body').css('overflow', 'hidden');
if (typeof lenis !== 'undefined') {
lenis.stop();
}
}
// 팝업 닫기 버튼 이벤트 연결
$('#pop_agreement .btn_close').on('click', function() {
$('#pop_agreement').hide();
$('body').css('overflow', '');
if (typeof lenis !== 'undefined') {
lenis.start();
}
});
});
//이지빔 프로그램 비밀번호 재설정 url 쿼리스트링 파싱 함수
$(document).ready(function() {
const urlParams = new URLSearchParams(window.location.search);
const popup = urlParams.get('popup');
const token = urlParams.get('t');
if (popup === 'pwreset') {
// 팝업 전체 열기
$('#pop_search').show();
$('body').css('overflow', 'hidden');
// 내부 컨텐츠 모두 숨기기
$('#pop_search .popup_contents_wrap').hide();
if (token) {
// 토큰이 있으면 비밀번호 재설정 단계
if (!sessionStorage.getItem('pwreset_shown')) {
$('#password_reset').show();
sessionStorage.setItem('pwreset_shown', '1');
}
} else {
// 토큰이 없으면 아이디 입력 단계 (첫 번째 .popup_contents_wrap)
$('#pop_search .popup_contents_wrap').first().show();
}
}
// 닫기 버튼
$('#pop_search .btn_close').on('click', function() {
$('#pop_search').hide();
$('body').css('overflow', '');
});
});
</script>
+765
View File
@@ -0,0 +1,765 @@
<!DOCTYPE html>
<html lang="en">
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
//add_stylesheet('<link rel="stylesheet" href="'.$faq_skin_url.'/style.css">', 0);
?>
<head>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-STZ2R5Q7HG"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-STZ2R5Q7HG');
</script>
<link rel="stylesheet" href="../theme/basic/css/default.css?ver=2303229">
<link rel="stylesheet" href="../js/font-awesome/css/font-awesome.min.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/connect/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/popular/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/faq/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/outlogin/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/latest/notice/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/visit/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../js/owlcarousel/owl.carousel.min.css?ver=2303229">
<script>
// 자바스크립트에서 사용하는 전역변수 선언
// var g5_url = "http://localhost/tova";
// var g5_bbs_url = "http://localhost/tova/bbs";
// var g5_is_member = "1";
// var g5_is_admin = "";
// var g5_is_mobile = "";
// var g5_bo_table = "";
// var g5_sca = "";
// var g5_editor = "";
// var g5_cookie_domain = "";
// var g5_theme_shop_url = "http://localhost/tova/theme/basic/shop";
// var g5_shop_url = "http://localhost/tova/shop";
</script>
<script src="../js/jquery-1.12.4.min.js?ver=2304171"></script>
<script src="../js/jquery-migrate-1.4.1.min.js?ver=2304171"></script>
<script src="../js/jquery.menu.js?ver=2304171"></script>
<script src="../js/common.js?ver=2304171"></script>
<script src="../js/wrest.js?ver=2304171"></script>
<script src="../js/placeholders.min.js?ver=2304171"></script>
<script src="../js/owlcarousel/owl.carousel.min.js?ver=2304171"></script>
<script src="../js/jquery.bxslider.js?ver=2304171"></script>
<!-- //그누보드 작성 -->
<!-- 디자인팀 작성 -->
<link rel="stylesheet" href="../css/reset.css"/>
<link rel="stylesheet" href="../css/font.css"/>
<link rel="stylesheet" href="../css/style.css"/>
<script type="text/javascript" src="../js/jquery-3.6.1.min.js"></script>
<script type="text/javascript" src="../js/jquery.mousewheel.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
<script type="text/javascript" src="<?php echo G5_URL ?>/js/jquery-3.6.1.min.js"></script>
<script type="text/javascript" src="<?php echo G5_URL ?>/js/jquery.mousewheel.min.js"></script>
<script type="text/javascript" src="<?php echo G5_URL ?>/js/common.js"></script>
<script type="text/javascript" src="<?php echo G5_URL ?>/js/popup.js"></script>
<script type="text/javascript" src="<?php echo G5_URL ?>/js/index.js"></script>
<!-- <script type="text/javascript" src="js/common.js"></script> -->
<script type="text/javascript" src="../js/popup.js"></script>
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css"/>
<link rel="stylesheet" href="https://unpkg.com/lenis@1.1.9/dist/lenis.css">
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script src="https://unpkg.com/lenis@1.1.9/dist/lenis.min.js"></script>
<!-- //디자인팀 작성 -->
</head>
<!-- FAQ 시작 { -->
<?php
if ($himg_src)
echo '<div id="faq_himg" class="faq_img"><img src="'.$himg_src.'" alt=""></div>';
// 상단 HTML
echo '<div id="faq_hhtml">'.conv_content($fm['fm_head_html'], 1).'</div>';
?>
<body>
<div class="wrapper">
<input id="hid_mb_id" type="hidden" value="<?echo $_SESSION['session_id'];?>"></input>
<!-- HEADER -->
<header class="js__header">
<?php include_once($member_skin_path.'/main_header.skin.php'); ?>
</header>
<!-- //Header -->
<!-- floating_menu -->
<div class="floating_menu">
<ul>
<li class="floating_faq"><a href="<?php echo G5_BBS_URL ?>/faq.php">
<i></i>
<span>FAQ</span>
</a></li>
<li class="floating_buy"><a href="<?php echo G5_BBS_URL ?>/buy.php">
<i></i>
<span>구매하기</span>
</a></li>
</ul>
</div>
<!-- //floating_menu -->
<!-- 모든 팝업페이지 경로 -->
<?php
include_once($member_skin_path.'/login.skin.php');
include_once($member_skin_path.'/mypage01.skin.php');
include_once($member_skin_path.'/register.skin.php');
include_once($member_skin_path.'/register_form.skin.php');
include_once($member_skin_path.'/mypage02.skin.php');
include_once($member_skin_path.'/mypage03.skin.php');
include_once($member_skin_path.'/sitemap.skin.php');
include_once($member_skin_path.'/privacy.skin.php');
include_once($member_skin_path.'/password_lost.skin.php');
?>
<!-- 모든 팝업페이지 경로 -->
<div class="container faq">
<section class="intro">
<div class="top js__dark">
<h2 data-aos="fade-down" data-aos-duration="1000">FAQ</h2>
<span>EG-BIM 관련 문의하기</span>
</div>
<ul class="sub_tab">
<li class="on"><a href="<?php echo G5_BBS_URL ?>/faq.php">자주하는 질문</a></li>
<li><a href="<?php echo G5_BBS_URL ?>/qalist.php">1:1 문의하기</a></li>
</ul>
</section>
<span class="sub_tit">자주하는 질문</span>
<div id="wrapper">
<div id="container_wr">
<div id="container">
<fieldset id="faq_sch">
<legend>FAQ 검색</legend>
<form name="faq_search_form" method="get">
<span class="sch_tit">FAQ 검색</span>
<input type="hidden" name="fm_id" value="<?php echo $fm_id;?>">
<label for="stx" class="sound_only">검색어<strong class="sound_only"> 필수</strong></label>
<input type="text" name="stx" value="<?php echo $stx;?>" required id="stx" class="frm_input" size="15" maxlength="15">
<button type="submit" value="검색" class="btn_submit"><i class="fa fa-search" aria-hidden="true"></i> 검색</button>
</form>
</fieldset>
<?php
if( count($faq_master_list) ){
?>
<nav id="bo_cate">
<h2>자주하시는질문 분류</h2>
<ul id="bo_cate_ul" style="display:none">
<?php
foreach( $faq_master_list as $v ){
$category_msg = '';
$category_option = '';
if($v['fm_id'] == $fm_id){ // 현재 선택된 카테고리라면
$category_option = ' id="bo_cate_on"';
$category_msg = '<span class="sound_only">열린 분류 </span>';
}
?>
<li><a href="<?php echo $category_href;?>?fm_id=<?php echo $v['fm_id'];?>" <?php echo $category_option;?> ><?php echo $category_msg.$v['fm_subject'];?></a></li>
<?php
}
?>
</ul>
</nav>
<?php } ?>
<div id="faq_wrap" class="faq_<?php echo $fm_id; ?>">
<?php // FAQ 내용
if( count($faq_list) ){
?>
<section id="faq_con">
<h2><?php echo $g5['title']; ?> 목록</h2>
<ol>
<?php
foreach($faq_list as $key=>$v){
if(empty($v))
continue;
?>
<li>
<h3>
<span class="tit_bg">Q</span><a href="#none" onclick="return faq_open(this);"><?php echo conv_content($v['fa_subject'], 1); ?></a>
<button class="tit_btn" onclick="return faq_open(this);"><i class="fa fa-plus" aria-hidden="true"></i><span class="sound_only">열기</span></button>
</h3>
<div class="con_inner">
<?php echo conv_content($v['fa_content'], 1); ?>
<button type="button" class="closer_btn"><i class="fa fa-minus" aria-hidden="true"></i><span class="sound_only">닫기</span></button>
</div>
</li>
<?php
}
?>
</ol>
</section>
<?php
} else {
if($stx){
echo '<p class="empty_list">검색된 게시물이 없습니다.</p>';
} else {
echo '<div class="empty_list">등록된 FAQ가 없습니다.';
if($is_admin)
echo '<br><a href="'.G5_ADMIN_URL.'/faqmasterlist.php">FAQ를 새로 등록하시려면 FAQ관리</a> 메뉴를 이용하십시오.';
echo '</div>';
}
}
?>
</div>
<?php echo get_paging($page_rows, $page, $total_page, $_SERVER['SCRIPT_NAME'].'?'.$qstr.'&amp;page='); ?>
<?php
// 하단 HTML
echo '<div id="faq_thtml">'.conv_content($fm['fm_tail_html'], 1).'</div>';
if ($timg_src)
echo '<div id="faq_timg" class="faq_img"><img src="'.$timg_src.'" alt=""></div>';
?>
</div>
<?php
// if ($admin_href)
// echo '<div class="faq_admin"><a href="'.$admin_href.'" class="btn_admin btn" title="FAQ 수정"><i class="fa fa-cog fa-spin fa-fw"></i><span class="sound_only">FAQ 수정</span></a></div>';
?>
</div>
</div>
</div>
<!-- } FAQ 끝 -->
<button class="btn_top js__top" onclick="window.scrollTo(0,0);"><div class="arrow"></div></button>
<footer class="footer_off">
<?php include_once($member_skin_path.'/main_footer.skin.php'); ?>
</footer>
<!-- //FOOTER -->
<script>
AOS.init();
const lenis = new Lenis()
lenis.on('scroll', (e) => {
// console.log(e)
})
lenis.on('scroll', ScrollTrigger.update)
gsap.ticker.add((time)=>{
lenis.raf(time * 1000)
})
gsap.ticker.lagSmoothing(0)
</script>
</div>
</body>
<script src="<?php echo G5_JS_URL; ?>/viewimageresize.js"></script>
<script>
jQuery(function() {
$(".closer_btn").on("click", function() {
$(this).closest(".con_inner").slideToggle('slow', function() {
var $h3 = $(this).closest("li").find("h3");
$("#faq_con li h3").removeClass("faq_li_open");
if($(this).is(":visible")) {
$h3.addClass("faq_li_open");
}
});
});
});
function faq_open(el)
{
var $con = $(el).closest("li").find(".con_inner"),
$h3 = $(el).closest("li").find("h3");
if($con.is(":visible")) {
$con.slideUp();
$h3.removeClass("faq_li_open");
} else {
$("#faq_con .con_inner:visible").css("display", "none");
$con.slideDown(
function() {
// 이미지 리사이즈
$con.viewimageresize2();
$("#faq_con li h3").removeClass("faq_li_open");
$h3.addClass("faq_li_open");
}
);
}
return false;
}
</script>
<!-- 상단(헤더) 스크립트 구문 -->
<script>
// 회원 탈퇴
function member_leave() {
if (confirm("회원에서 탈퇴 하시겠습니까?"))
location.href = '<?php echo G5_BBS_URL ?>/member_leave.php';
}
// 회원 탈퇴
if($('#hid_mb_id').val()==''){
document.getElementById('my_join2').style.display = 'none';
document.getElementById('my_login2').style.display = 'none';
document.getElementById('my_join').style.display = '';
document.getElementById('my_login').style.display = '';
}else{
document.getElementById('my_join2').style.display = '';
document.getElementById('my_login2').style.display = '';
document.getElementById('my_join').style.display = 'none';
document.getElementById('my_login').style.display = 'none';
}
let x = document.cookie;
if(x.includes("tmp_1=John")){
deleteCookie("tmp_1");
$('#pop_mypage02').show();
}
function deleteCookie(name) {
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/egbim/bbs;";
}
function getCookie(cname) {
let name = cname + "=";
let decodedCookie = decodeURIComponent(document.cookie);
let ca = decodedCookie.split(';');
for(let i = 0; i <ca.length; i++) {
let c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
}
//alert(getCookie("tmp_1"));
//로그인
$('#flogin button[type=submit]').click(function(e){
e.preventDefault();
let mb_id = $('#login_id').val();
let mb_password = $('#login_pw').val();
//alert('<?php echo G5_URL ?>/bbs/login.php');
$.ajax({
url : '<?php echo G5_URL ?>/bbs/login_check_tova.php',
data : {
'mb_id' : mb_id,
'mb_password' : mb_password
},
type : "POST",
datatype : "json",
success : function(data){
var ss='';
for(i=0; i<data.length; i++){
ss=ss + data[i];
}
//alert(ss.replace('"','').replace('"',''));
if(ss.replace('"','').replace('"','') == "success" || ss.replace('"','').replace('"','') == "super"){
//$(".popup_wrap").show();
$('.btn_close').hide();
$('#pop_login').hide();
$('#hid_mb_id').val(mb_id);
document.getElementById('my_join2').style.display = '';
document.getElementById('my_login2').style.display = '';
document.getElementById('my_join').style.display = 'none';
document.getElementById('my_login').style.display = 'none';
//location.href="<?php echo G5_URL ?>/bbs/session.php?id="+mb_id;
if(ss.replace('"','').replace('"','') == "super"){
$('#my_join2').html("<a href='http://eg-bim.com/egbim/adm/index.php' target='_blank'>관리페이지</a>");
}else{
$('#my_join2').html("<a href='javascript:mypage01();'>마이페이지</a>");
}
}else
{
alert(trim(ss));
}
},
error : function(err){
//alert(err);
alert(err.status);
alert(err.statusText);
}
});
});
//회원가입 약관동의
$('#fregister button[type=submit]').click(function(e){
e.preventDefault();
let agree11 = $('#agree11').val();
let agree21 = $('#agree21').val();
$.ajax({
url : '<?php echo G5_URL ?>/bbs/register_form.php',
type : "POST",
datatype : "json",
contentType: 'application/json; charset=utf-8',
data : {
'agree11' : agree11,
'agree21' : agree21
},
success : function(data){
var ss='';
for(i=0; i<data.length; i++){
ss=ss + data[i];
}
},
error : function(err){
alert(err);
}
});
});
//회원가입 정보입력
$('#fregisterform button[type=submit]').click(function(e){
e.preventDefault();
let mb_id = $('#reg_mb_id').val();
let mb_password = $('#reg_mb_password').val();
let mb_password_re = $('#reg_mb_password_re').val();
let mb_name = $('#reg_mb_name').val();
let mb_email1 = $('#reg_mb_email1').val();
let mb_email2 = $('#mb_email2').val();
let reg_domain2 = $('#register_domain2').val();
let mb_hp = $('#reg_mb_hp').val();
let mb_comp = $('#reg_mb_comp').val();
let mb_comp_team = $('#reg_mb_comp_team').val();
//alert(mb_password+' '+mb_password_re+' '+mb_name+' '+mb_email1+' '+mb_email2+' '+mb_hp+' '+mb_comp+' '+mb_comp_team);
if (mb_id.length < 4) {
alert("아이디를 4글자 이상 입력하십시오.");
mb_id.focus();
return false;
}
var special_pattern = /[`~!@#$%^&*|\\\'\";:\/?]/gi
if (special_pattern.test(mb_id) == true) {
alert("아이디는 특수문자를 사용할수 없습니다.");
mb_id.focus();
return false;
}
// 비밀번호 검사
if(!/^(?=.*[a-zA-Z])(?=.*[!@#$%^*+=-])(?=.*[0-9]).{8,25}$/.test(mb_password)){
alert('비밀번호는 숫자+영문자+특수문자 조합으로 8자리 이상 사용해야 합니다.');
mb_password.focus();
return false;
}
// if (mb_password_re.length < 8 || mb_password.length < 8) {
// alert("비밀번호를 8글자 이상 입력하십시오.");
// mb_password.focus();
// return false;
// }
// 비밀번호 & 2차비밀번호 검사
if (mb_password != mb_password_re) {
alert("비밀번호가 같지 않습니다.");
mb_password_re.focus();
return false;
}
// 이름 검사
if (mb_name == "") {
if (mb_name.length < 1) {
alert("이름을 입력하십시오.");
mb_name.focus();
return false;
}
}
// 메일 검사
if (mb_email1 == "") {
if (mb_email1.length < 1) {
alert("메일 주소를 입력하십시오.");
mb_email1.focus();
return false;
}
}
if (mb_email2 == "type"){
mb_email2 = '@' + reg_domain2;
}
// 핸드폰 번호 검사
if (mb_hp.length < 11) {
alert("휴대전화번호 11자리를 입력하십시오.");
mb_hp.focus();
return false;
}
if(isNaN(mb_hp)){
alert("휴대전화번호는 숫자만 입력가능합니다.");
mb_hp.focus();
return false;
}
// 회사명 검사
if (mb_comp == "") {
if (mb_comp.length < 1) {
alert("회사명을 입력하십시오");
mb_comp.focus();
return false;
}
}
// 팀명 검사
if (mb_comp_team == "") {
if (mb_comp_team.length < 1) {
alert("팀명을 입력하십시오");
mb_comp_team.focus();
return false;
}
}
$.ajax({
url : '<?php echo G5_URL ?>/bbs/register_form_update.php',
data : {
'mb_id' : mb_id,
'mb_password' : mb_password,
'mb_password_re' : mb_password_re,
'mb_name' : mb_name,
'mb_email1' : mb_email1,
'mb_email2' : mb_email2,
'mb_hp' : mb_hp,
'mb_comp' : mb_comp,
'mb_comp_team' : mb_comp_team,
},
type : "POST",
datatype : "json",
success : function(data){
var ss='';
for(i=0; i<data.length; i++){
ss=ss + data[i];
}
if(ss){
// $(".popup_wrap").show();
$('.btn_close').hide();
$('#pop_login').hide();
$('#pop_agreement').hide();
$('#pop_join').hide();
$('#pop_mypage01').hide();
$('#pop_search').hide();
$('#pop_mypage02').hide();
$('#pop_mypage03').hide();
$('#pop_privacy').hide();
// $('.register_fs').hide();
// $('.join_progress .join_step').removeClass('on');
// $('.join_progress .join_step').eq(2).addClass('on');
// $('.messages').show();
alert('회원가입이 완료됐습니다.\n다시 로그인 해주세요');
$('#reg_mb_id').val('');
$('#reg_mb_password').val('');
$('#reg_mb_password_re').val('');
$('#reg_mb_name').val('');
$('#reg_mb_email1').val('');
$('#reg_mb_hp').val('');
$('#reg_mb_comp').val('');
$('#reg_mb_comp_team').val('');
$('#dupl_check_yn').val('N');
}else{
alert('실패했습니다.');
}
},
error : function(err){
alert('에러');
alert(err);
alert(err.status);
alert(err.statusText);
}
});
// $.removeCookie(mb_id,{path:'<?php //echo G5_URL ?>/bbs/register_form_update.php'});
});
//회원정보 수정
$('#fregisterform_up button[type=submit]').click(function(e){
e.preventDefault();
let mb_id = $('#update_mb_id').val();
let mb_password = $('#update_mb_password').val();
let mb_password_re = $('#update_mb_password_re').val();
let mb_name = $('#update_mb_name').val();
let mb_email1 = $('#update_mb_email1').val();
let mb_email2 = $('#update_mb_email2').val();
let update_domain2 = $('#update_domain2').val();
if (mb_email2 == "type"){
mb_email2 = '@' + update_domain2;
}
let mb_hp = $('#update_mb_hp').val();
let mb_comp = $('#update_mb_comp').val();
let mb_comp_team = $('#update_mb_comp_team').val();
//alert(mb_password+' '+mb_password_re+' '+mb_name+' '+mb_email1+' '+mb_email2+' '+mb_hp+' '+mb_comp+' '+mb_comp_team);
if (mb_id.length < 4) {
alert('1');
alert("아이디를 4글자 이상 입력하십시오.");
mb_id.focus();
return false;
}
var special_pattern = /[`~!@#$%^&*|\\\'\";:\/?]/gi
if (special_pattern.test(mb_id) == true) {
alert("아이디는 특수문자를 사용할수 없습니다.");
mb_id.focus();
return false;
}
// 비밀번호 검사
if(!/^(?=.*[a-zA-Z])(?=.*[!@#$%^*+=-])(?=.*[0-9]).{8,25}$/.test(mb_password)){
alert('비밀번호는 숫자+영문자+특수문자 조합으로 8자리 이상 사용해야 합니다.');
mb_password.focus();
return false;
}
// if (mb_password_re.length < 8 || mb_password.length < 8) {
// alert("비밀번호를 8글자 이상 입력하십시오.");
// mb_password.focus();
// return false;
// }
// 비밀번호 & 2차비밀번호 검사
if (mb_password != mb_password_re) {
alert(mb_password_re);
alert("비밀번호가 같지 않습니다.");
mb_password_re.focus();
return false;
}
// 이름 검사
if (mb_name == "") {
if (mb_name.length < 1) {
alert("이름을 입력하십시오.");
mb_name.focus();
return false;
}
}
// 메일 검사
if (mb_email1 == "") {
if (mb_email1.length < 1) {
alert("메일 주소를 입력하십시오.");
mb_email1.focus();
return false;
}
}
// 핸드폰 번호 검사
if (mb_hp.length < 11) {
alert("휴대전화번호 11자리를 입력하십시오.");
mb_hp.focus();
return false;
}
if(isNaN(mb_hp)){
alert("휴대전화번호는 숫자만 입력가능합니다.");
mb_hp.focus();
return false;
}
// 회사명 검사
if (mb_comp == "") {
if (mb_comp.length < 1) {
alert("회사명을 입력하십시오");
mb_comp.focus();
return false;
}
}
// 팀명 검사
if (mb_comp_team == "") {
if (mb_comp_team.length < 1) {
alert("팀명을 입력하십시오");
mb_comp_team.focus();
return false;
}
}
$.ajax({
url : '<?php echo G5_URL ?>/bbs/mypage03.php',
data : {
'mb_id' : mb_id,
'mb_password' : mb_password,
'mb_password_re' : mb_password_re,
'mb_name' : mb_name,
'mb_email1' : mb_email1,
'mb_email2' : mb_email2,
'mb_hp' : mb_hp,
'mb_comp' : mb_comp,
'mb_comp_team' : mb_comp_team,
},
type : "POST",
datatype : "json",
success : function(data){
var ss='';
for(i=0; i<data.length; i++){
ss=ss + data[i];
}
if(ss.replace('"','').replace('"','') == "success"){
// $(".popup_wrap").show();
$('.btn_close').show();
$('#pop_login').hide();
$('#pop_agreement').hide();
$('#pop_join').hide();
$('#pop_mypage01').hide();
$('#pop_search').hide();
$('#pop_mypage02').show();
$('#pop_mypage03').hide();
$('#pop_privacy').hide();
// $('.register_fs').hide();
// $('.join_progress .join_step').removeClass('on');
// $('.join_progress .join_step').eq(2).addClass('on');
// $('.messages').show();
alert('회원정보 수정이 완료됐습니다.');
document.getElementById("span_email").innerText=mb_email1+mb_email2;
document.getElementById("span_hp").innerText=mb_hp;
document.getElementById("span_comp").innerText=mb_comp;
document.getElementById("span_comp_team").innerText=mb_comp_team;
// $('#update_mb_id').val('');
// $('#update_mb_password').val('');
// $('#update_mb_password_re').val('');
// $('#update_mb_name').val('');
// $('#update_mb_email1').val('');
// $('#update_mb_hp').val('');
// $('#update_mb_comp').val('');
// $('#update_mb_comp_team').val('');
// $('#dupl_check_yn').val('N');
}else{
alert('실패했습니다.');
}
},
error : function(err){
alert('에러');
alert(err);
alert(err.status);
alert(err.statusText);
}
});
});
$('#fmyconfirmpw button[type=submit]').click(function(e){
e.preventDefault();
let l_mb_password = $('#password_mypage').val();
let l_mb_id = $('#hid_mb_id').val();
$.ajax({
url : '<?php echo G5_URL ?>/bbs/mypage02.php',
data : {
'mb_id' : l_mb_id,
'mb_password' : l_mb_password,
},
type : "POST",
datatype : "json",
success : function(data){
var ss='';
for(i=0; i<data.length; i++){
ss=ss + data[i];
}
//alert(ss.replace('"','').replace('"',''));
if(ss.replace('"','').replace('"','') == "success"){
$('#password_mypage').val('');
//mypage02();
document.cookie = "tmp_1=John";
location.href="<?php echo G5_URL ?>/bbs/faq.php";
}else
{
alert(trim(ss));
$('#password_mypage').select();
}
},
error : function(err){
alert(err);
alert(err.status);
alert(err.statusText);
}
});
});
</script>
+33
View File
@@ -0,0 +1,33 @@
@charset "utf-8";
#bo_cate {margin-bottom:28px}
#bo_cate h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
#bo_cate ul {zoom:1}
#bo_cate ul:after {display:block;visibility:hidden;clear:both;content:""}
#bo_cate li {display:inline-block;padding:2px}
#bo_cate a {display:block;line-height:28px;padding:5px 15px;border-radius:30px;border:1px solid #d6e9ff;color:#6794d3}
#bo_cate a:focus, #bo_cate a:hover, #bo_cate a:active {text-decoration:none;background:#3a8afd;color:#fff}
#bo_cate #bo_cate_on {z-index:2;background:#3a8afd;color:#fff;font-weight:bold;border:1px solid #3a8afd;
-webkit-box-shadow:inset 0 2px 5px rgb(33, 135, 202);
-moz-box-shadow:inset 0 2px 5px rgb(33, 135, 202);
box-shadow:inset 0 2px 5px rgb(33, 135, 202)}
#faq_wrap {margin:10px 0 30px}
#faq_wrap h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
.faq_admin {text-align:right}
#faq_wrap ol {margin:0;padding:0;list-style:none}
#faq_wrap li {border-bottom:1px solid #ececec;background:#fff;position:relative}
#faq_wrap li:first-child {border-top:1px solid #ececec}
#faq_wrap li h3 {min-height:50px;line-height:30px;padding:15px;padding-left:50px;position:relative}
#faq_wrap li h3 .tit_btn {position:absolute;right:15px;top:15px;border:0;width:30px;height:30px;background:#fff;color:#c5cdd8;font-size:1.2em}
#faq_wrap li h3 .tit_bg {display:inline-block;position:absolute;top:15px;left:15px;text-align:center;color:#000;font-size:1.6em}
#faq_wrap li h3.faq_li_open a {color:#3a8afd}
#faq_con .con_inner {display:none;padding:5px 5px 20px 50px}
#faq_con .con_inner .tit_bg {display:inline-block;position:absolute;top:10px;left:10px;text-align:center;background:#777;color:#fff;border-radius:50%;width:30px;line-height:30px;height:30px}
#faq_con .con_inner .closer_btn {position:absolute;right:15px;top:15px;border:0;width:30px;height:30px;background:#fff;color:#3a8afd;font-size:1.2em}
#faq_sch {background:#f7f7f7;padding:30px;text-align:center;margin:0 0 10px}
#faq_sch .sch_tit {position:absolute;margin:0;padding:0;font-size:0;line-height:0;text-indent:-9999em;overflow:hidden}
#faq_sch .frm_input {border:1px solid #d0d3db;width:300px;height:45px;border-radius:0;border-radius:3px}
#faq_sch .btn_submit {padding:0 10px;height:45px;width:88px;font-size:1.083em;font-weight:bold;color:#fff;background:#434a54}
+969
View File
@@ -0,0 +1,969 @@
// 전역 변수
var errmsg = "";
var errfld = null;
// 필드 검사
function check_field(fld, msg)
{
if ((fld.value = trim(fld.value)) == "")
error_field(fld, msg);
else
clear_field(fld);
return;
}
// 필드 오류 표시
function error_field(fld, msg)
{
if (msg != "")
errmsg += msg + "\n";
if (!errfld) errfld = fld;
fld.style.background = "#BDDEF7";
}
// 필드를 깨끗하게
function clear_field(fld)
{
fld.style.background = "#FFFFFF";
}
function trim(s)
{
var t = "";
var from_pos = to_pos = 0;
for (i=0; i<s.length; i++)
{
if (s.charAt(i) == ' ')
continue;
else
{
from_pos = i;
break;
}
}
for (i=s.length; i>=0; i--)
{
if (s.charAt(i-1) == ' ')
continue;
else
{
to_pos = i;
break;
}
}
t = s.substring(from_pos, to_pos);
// alert(from_pos + ',' + to_pos + ',' + t+'.');
return t;
}
// 자바스크립트로 PHP의 number_format 흉내를 냄
// 숫자에 , 를 출력
function number_format(data)
{
var tmp = '';
var number = '';
var cutlen = 3;
var comma = ',';
var i;
data = data + '';
var sign = data.match(/^[\+\-]/);
if(sign) {
data = data.replace(/^[\+\-]/, "");
}
len = data.length;
mod = (len % cutlen);
k = cutlen - mod;
for (i=0; i<data.length; i++)
{
number = number + data.charAt(i);
if (i < data.length - 1)
{
k++;
if ((k % cutlen) == 0)
{
number = number + comma;
k = 0;
}
}
}
if(sign != null)
number = sign+number;
return number;
}
// 새 창
function popup_window(url, winname, opt)
{
window.open(url, winname, opt);
}
// 폼메일 창
function popup_formmail(url)
{
opt = 'scrollbars=yes,width=417,height=385,top=10,left=20';
popup_window(url, "wformmail", opt);
}
// , 를 없앤다.
function no_comma(data)
{
var tmp = '';
var comma = ',';
var i;
for (i=0; i<data.length; i++)
{
if (data.charAt(i) != comma)
tmp += data.charAt(i);
}
return tmp;
}
// 삭제 검사 확인
function del(href)
{
if(confirm("한번 삭제한 자료는 복구할 방법이 없습니다.\n\n정말 삭제하시겠습니까?")) {
document.location.href = href;
}
}
// 쿠키 입력
function set_cookie(name, value, expirehours, domain)
{
var today = new Date();
today.setTime(today.getTime() + (60*60*1000*expirehours));
document.cookie = name + "=" + escape( value ) + "; path=/; expires=" + today.toGMTString() + ";";
if (domain) {
document.cookie += "domain=" + domain + ";";
}
}
// 쿠키 얻음
function get_cookie(name)
{
var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
if (match) return unescape(match[2]);
return "";
}
// 쿠키 지움
function delete_cookie(name)
{
var today = new Date();
today.setTime(today.getTime() - 1);
var value = get_cookie(name);
if(value != "")
document.cookie = name + "=" + value + "; path=/; expires=" + today.toGMTString();
}
var last_id = null;
function menu(id)
{
if (id != last_id)
{
if (last_id != null)
document.getElementById(last_id).style.display = "none";
document.getElementById(id).style.display = "block";
last_id = id;
}
else
{
document.getElementById(id).style.display = "none";
last_id = null;
}
}
function textarea_decrease(id, row)
{
if (document.getElementById(id).rows - row > 0)
document.getElementById(id).rows -= row;
}
function textarea_original(id, row)
{
document.getElementById(id).rows = row;
}
function textarea_increase(id, row)
{
document.getElementById(id).rows += row;
}
// 글숫자 검사
function check_byte(content, target)
{
var i = 0;
var cnt = 0;
var ch = '';
var cont = document.getElementById(content).value;
for (i=0; i<cont.length; i++) {
ch = cont.charAt(i);
if (escape(ch).length > 4) {
cnt += 2;
} else {
cnt += 1;
}
}
// 숫자를 출력
document.getElementById(target).innerHTML = cnt;
return cnt;
}
// 브라우저에서 오브젝트의 왼쪽 좌표
function get_left_pos(obj)
{
var parentObj = null;
var clientObj = obj;
//var left = obj.offsetLeft + document.body.clientLeft;
var left = obj.offsetLeft;
while((parentObj=clientObj.offsetParent) != null)
{
left = left + parentObj.offsetLeft;
clientObj = parentObj;
}
return left;
}
// 브라우저에서 오브젝트의 상단 좌표
function get_top_pos(obj)
{
var parentObj = null;
var clientObj = obj;
//var top = obj.offsetTop + document.body.clientTop;
var top = obj.offsetTop;
while((parentObj=clientObj.offsetParent) != null)
{
top = top + parentObj.offsetTop;
clientObj = parentObj;
}
return top;
}
function flash_movie(src, ids, width, height, wmode)
{
var wh = "";
if (parseInt(width) && parseInt(height))
wh = " width='"+width+"' height='"+height+"' ";
return "<object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0' "+wh+" id="+ids+"><param name=wmode value="+wmode+"><param name=movie value="+src+"><param name=quality value=high><embed src="+src+" quality=high wmode="+wmode+" type='application/x-shockwave-flash' pluginspage='http://www.macromedia.com/shockwave/download/index.cgi?p1_prod_version=shockwaveflash' "+wh+"></embed></object>";
}
function obj_movie(src, ids, width, height, autostart)
{
var wh = "";
if (parseInt(width) && parseInt(height))
wh = " width='"+width+"' height='"+height+"' ";
if (!autostart) autostart = false;
return "<embed src='"+src+"' "+wh+" autostart='"+autostart+"'></embed>";
}
function doc_write(cont)
{
document.write(cont);
}
var win_password_lost = function(href) {
window.open(href, "win_password_lost", "left=50, top=50, width=617, height=330, scrollbars=1");
}
$(document).ready(function(){
$("#login_password_lost, #ol_password_lost").click(function(){
win_password_lost(this.href);
return false;
});
});
/**
* 포인트 창
**/
var win_point = function(href) {
var new_win = window.open(href, 'win_point', 'left=100,top=100,width=600, height=600, scrollbars=1');
new_win.focus();
}
/**
* 쪽지 창
**/
var win_memo = function(href) {
var new_win = window.open(href, 'win_memo', 'left=100,top=100,width=620,height=500,scrollbars=1');
new_win.focus();
}
/**
* 쪽지 창
**/
var check_goto_new = function(href, event) {
if( !(typeof g5_is_mobile != "undefined" && g5_is_mobile) ){
if (window.opener && window.opener.document && window.opener.document.getElementById) {
event.preventDefault ? event.preventDefault() : (event.returnValue = false);
window.open(href);
//window.opener.document.location.href = href;
}
}
}
/**
* 메일 창
**/
var win_email = function(href) {
var new_win = window.open(href, 'win_email', 'left=100,top=100,width=600,height=580,scrollbars=1');
new_win.focus();
}
/**
* 자기소개 창
**/
var win_profile = function(href) {
var new_win = window.open(href, 'win_profile', 'left=100,top=100,width=620,height=510,scrollbars=1');
new_win.focus();
}
/**
* 스크랩 창
**/
var win_scrap = function(href) {
var new_win = window.open(href, 'win_scrap', 'left=100,top=100,width=600,height=600,scrollbars=1');
new_win.focus();
}
/**
* 홈페이지 창
**/
var win_homepage = function(href) {
var new_win = window.open(href, 'win_homepage', '');
new_win.focus();
}
/**
* 우편번호 창
**/
var win_zip = function(frm_name, frm_zip, frm_addr1, frm_addr2, frm_addr3, frm_jibeon) {
if(typeof daum === "undefined"){
alert("KAKAO 우편번호 서비스 postcode.v2.js 파일이 로드되지 않았습니다.");
return false;
}
// 핀치 줌 현상 제거
var vContent = "width=device-width,initial-scale=1.0,minimum-scale=0,maximum-scale=10";
$("#meta_viewport").attr("content", vContent + ",user-scalable=no");
var zip_case = 1; //0이면 레이어, 1이면 페이지에 끼워 넣기, 2이면 새창
var complete_fn = function(data){
// 팝업에서 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.
// 각 주소의 노출 규칙에 따라 주소를 조합한다.
// 내려오는 변수가 값이 없는 경우엔 공백('')값을 가지므로, 이를 참고하여 분기 한다.
var fullAddr = ''; // 최종 주소 변수
var extraAddr = ''; // 조합형 주소 변수
// 사용자가 선택한 주소 타입에 따라 해당 주소 값을 가져온다.
if (data.userSelectedType === 'R') { // 사용자가 도로명 주소를 선택했을 경우
fullAddr = data.roadAddress;
} else { // 사용자가 지번 주소를 선택했을 경우(J)
fullAddr = data.jibunAddress;
}
// 사용자가 선택한 주소가 도로명 타입일때 조합한다.
if(data.userSelectedType === 'R'){
//법정동명이 있을 경우 추가한다.
if(data.bname !== ''){
extraAddr += data.bname;
}
// 건물명이 있을 경우 추가한다.
if(data.buildingName !== ''){
extraAddr += (extraAddr !== '' ? ', ' + data.buildingName : data.buildingName);
}
// 조합형주소의 유무에 따라 양쪽에 괄호를 추가하여 최종 주소를 만든다.
extraAddr = (extraAddr !== '' ? ' ('+ extraAddr +')' : '');
}
// 우편번호와 주소 정보를 해당 필드에 넣고, 커서를 상세주소 필드로 이동한다.
var of = document[frm_name];
of[frm_zip].value = data.zonecode;
of[frm_addr1].value = fullAddr;
of[frm_addr3].value = extraAddr;
if(of[frm_jibeon] !== undefined){
of[frm_jibeon].value = data.userSelectedType;
}
setTimeout(function(){
$("#meta_viewport").attr("content", vContent);
of[frm_addr2].focus();
} , 100);
};
switch(zip_case) {
case 1 : //iframe을 이용하여 페이지에 끼워 넣기
var daum_pape_id = 'daum_juso_page'+frm_zip,
element_wrap = document.getElementById(daum_pape_id),
currentScroll = Math.max(document.body.scrollTop, document.documentElement.scrollTop);
if (element_wrap == null) {
element_wrap = document.createElement("div");
element_wrap.setAttribute("id", daum_pape_id);
element_wrap.style.cssText = 'display:none;border:1px solid;left:0;width:100%;height:300px;margin:5px 0;position:relative;-webkit-overflow-scrolling:touch;';
element_wrap.innerHTML = '<img src="//t1.daumcdn.net/postcode/resource/images/close.png" id="btnFoldWrap" style="cursor:pointer;position:absolute;right:0px;top:-21px;z-index:1" class="close_daum_juso" alt="접기 버튼">';
jQuery('form[name="'+frm_name+'"]').find('input[name="'+frm_addr1+'"]').before(element_wrap);
jQuery("#"+daum_pape_id).off("click", ".close_daum_juso").on("click", ".close_daum_juso", function(e){
e.preventDefault();
$("#meta_viewport").attr("content", vContent);
jQuery(this).parent().hide();
});
}
new daum.Postcode({
oncomplete: function(data) {
complete_fn(data);
// iframe을 넣은 element를 안보이게 한다.
element_wrap.style.display = 'none';
// 우편번호 찾기 화면이 보이기 이전으로 scroll 위치를 되돌린다.
document.body.scrollTop = currentScroll;
},
// 우편번호 찾기 화면 크기가 조정되었을때 실행할 코드를 작성하는 부분.
// iframe을 넣은 element의 높이값을 조정한다.
onresize : function(size) {
element_wrap.style.height = size.height + "px";
},
maxSuggestItems : g5_is_mobile ? 6 : 10,
width : '100%',
height : '100%'
}).embed(element_wrap);
// iframe을 넣은 element를 보이게 한다.
element_wrap.style.display = 'block';
break;
case 2 : //새창으로 띄우기
new daum.Postcode({
oncomplete: function(data) {
complete_fn(data);
}
}).open();
break;
default : //iframe을 이용하여 레이어 띄우기
var rayer_id = 'daum_juso_rayer'+frm_zip,
element_layer = document.getElementById(rayer_id);
if (element_layer == null) {
element_layer = document.createElement("div");
element_layer.setAttribute("id", rayer_id);
element_layer.style.cssText = 'display:none;border:5px solid;position:fixed;width:300px;height:460px;left:50%;margin-left:-155px;top:50%;margin-top:-235px;overflow:hidden;-webkit-overflow-scrolling:touch;z-index:10000';
element_layer.innerHTML = '<img src="//i1.daumcdn.net/localimg/localimages/07/postcode/320/close.png" id="btnCloseLayer" style="cursor:pointer;position:absolute;right:-3px;top:-3px;z-index:1" class="close_daum_juso" alt="닫기 버튼">';
document.body.appendChild(element_layer);
jQuery("#"+rayer_id).off("click", ".close_daum_juso").on("click", ".close_daum_juso", function(e){
e.preventDefault();
$("#meta_viewport").attr("content", vContent);
jQuery(this).parent().hide();
});
}
new daum.Postcode({
oncomplete: function(data) {
complete_fn(data);
// iframe을 넣은 element를 안보이게 한다.
element_layer.style.display = 'none';
},
maxSuggestItems : g5_is_mobile ? 6 : 10,
width : '100%',
height : '100%'
}).embed(element_layer);
// iframe을 넣은 element를 보이게 한다.
element_layer.style.display = 'block';
}
}
/**
* 새로운 비밀번호 분실 창 : 101123
**/
win_password_lost = function(href)
{
var new_win = window.open(href, 'win_password_lost', 'width=617, height=330, scrollbars=1');
new_win.focus();
}
/**
* 설문조사 결과
**/
var win_poll = function(href) {
var new_win = window.open(href, 'win_poll', 'width=616, height=500, scrollbars=1');
new_win.focus();
}
/**
* 쿠폰
**/
var win_coupon = function(href) {
var new_win = window.open(href, "win_coupon", "left=100,top=100,width=700, height=600, scrollbars=1");
new_win.focus();
}
/**
* 스크린리더 미사용자를 위한 스크립트 - 지운아빠 2013-04-22
* alt 값만 갖는 그래픽 링크에 마우스오버 시 title 값 부여, 마우스아웃 시 title 값 제거
**/
$(function() {
$('a img').mouseover(function() {
$a_img_title = $(this).attr('alt');
$(this).attr('title', $a_img_title);
}).mouseout(function() {
$(this).attr('title', '');
});
});
/**
* 텍스트 리사이즈
**/
function font_resize(id, rmv_class, add_class, othis)
{
var $el = $("#"+id);
if((typeof rmv_class !== "undefined" && rmv_class) || (typeof add_class !== "undefined" && add_class)){
$el.removeClass(rmv_class).addClass(add_class);
set_cookie("ck_font_resize_rmv_class", rmv_class, 1, g5_cookie_domain);
set_cookie("ck_font_resize_add_class", add_class, 1, g5_cookie_domain);
}
if(typeof othis !== "undefined"){
$(othis).addClass('select').siblings().removeClass('select');
}
}
/**
* 댓글 수정 토큰
**/
function set_comment_token(f)
{
if(typeof f.token === "undefined")
$(f).prepend('<input type="hidden" name="token" value="">');
$.ajax({
url: g5_bbs_url+"/ajax.comment_token.php",
type: "GET",
dataType: "json",
async: false,
cache: false,
success: function(data, textStatus) {
f.token.value = data.token;
}
});
}
$(function(){
$(".win_point").click(function() {
win_point(this.href);
return false;
});
$(".win_memo").click(function() {
win_memo(this.href);
return false;
});
$(".win_email").click(function() {
win_email(this.href);
return false;
});
$(".win_scrap").click(function() {
win_scrap(this.href);
return false;
});
$(".win_profile").click(function() {
win_profile(this.href);
return false;
});
$(".win_homepage").click(function() {
win_homepage(this.href);
return false;
});
$(".win_password_lost").click(function() {
win_password_lost(this.href);
return false;
});
/*
$(".win_poll").click(function() {
win_poll(this.href);
return false;
});
*/
$(".win_coupon").click(function() {
win_coupon(this.href);
return false;
});
// 사이드뷰
var sv_hide = false;
$(".sv_member, .sv_guest").click(function() {
$(".sv").removeClass("sv_on");
$(this).closest(".sv_wrap").find(".sv").addClass("sv_on");
});
$(".sv, .sv_wrap").hover(
function() {
sv_hide = false;
},
function() {
sv_hide = true;
}
);
$(".sv_member, .sv_guest").focusin(function() {
sv_hide = false;
$(".sv").removeClass("sv_on");
$(this).closest(".sv_wrap").find(".sv").addClass("sv_on");
});
$(".sv a").focusin(function() {
sv_hide = false;
});
$(".sv a").focusout(function() {
sv_hide = true;
});
// 셀렉트 ul
var sel_hide = false;
$('.sel_btn').click(function() {
$('.sel_ul').removeClass('sel_on');
$(this).siblings('.sel_ul').addClass('sel_on');
});
$(".sel_wrap").hover(
function() {
sel_hide = false;
},
function() {
sel_hide = true;
}
);
$('.sel_a').focusin(function() {
sel_hide = false;
});
$('.sel_a').focusout(function() {
sel_hide = true;
});
$(document).click(function() {
if(sv_hide) { // 사이드뷰 해제
$(".sv").removeClass("sv_on");
}
if (sel_hide) { // 셀렉트 ul 해제
$('.sel_ul').removeClass('sel_on');
}
});
$(document).focusin(function() {
if(sv_hide) { // 사이드뷰 해제
$(".sv").removeClass("sv_on");
}
if (sel_hide) { // 셀렉트 ul 해제
$('.sel_ul').removeClass('sel_on');
}
});
$(document).on( "keyup change", "textarea#wr_content[maxlength]", function(){
var str = $(this).val();
var mx = parseInt($(this).attr("maxlength"));
if (str.length > mx) {
$(this).val(str.substr(0, mx));
return false;
}
});
});
function get_write_token(bo_table)
{
var token = "";
$.ajax({
type: "POST",
url: g5_bbs_url+"/write_token.php",
data: { bo_table: bo_table },
cache: false,
async: false,
dataType: "json",
success: function(data) {
if(data.error) {
alert(data.error);
if(data.url)
document.location.href = data.url;
return false;
}
token = data.token;
}
});
return token;
}
$(function() {
$(document).on("click", "form[name=fwrite] input:submit, form[name=fwrite] button:submit, form[name=fwrite] input:image", function() {
var f = this.form;
if (typeof(f.bo_table) == "undefined") {
return;
}
var bo_table = f.bo_table.value;
var token = get_write_token(bo_table);
if(!token) {
alert("토큰 정보가 올바르지 않습니다.");
return false;
}
var $f = $(f);
if(typeof f.token === "undefined")
$f.prepend('<input type="hidden" name="token" value="">');
$f.find("input[name=token]").val(token);
return true;
});
});
//디자인팀 작업 내용 추가
// include.js
window.addEventListener('load', function() {
var allElements = document.getElementsByTagName('*');
Array.prototype.forEach.call(allElements, function(el) {
var includePath = el.dataset.includePath;
if (includePath) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
el.outerHTML = this.responseText;
}
};
xhttp.open('GET', includePath, true);
xhttp.send();
}
});
});
// ★★ lenis 멈추기★★
function handlePopupScroll() {
$('body').css('overflow', 'hidden');
$('body').on('wheel', function(e) {
e.stopPropagation();
});
lenis.stop();
}
// 각 팝업창 불러오기
function agreement(){
$(".popup_wrap").hide();
$('.btn_close').show();
$('#pop_agreement').show(0, function(){
$.getScript("./js/popup.js", function() {
handlePopupScroll();
});
});
};
function join(){
$(".popup_wrap").hide();
$('#pop_join').show(0, function(){
$.getScript("./js/popup.js", function() {
handlePopupScroll();
});});
};
function login(){
$(".popup_wrap").hide();
$('#pop_login').show(0, function(){
$.getScript("./js/popup.js", function() {
handlePopupScroll();
});});
};
function mypage01(){
$(".popup_wrap").hide();
$('.btn_close').show();
$('#pop_mypage01').show(0, function(){
$.getScript("./js/popup.js", function() {
handlePopupScroll();
});});
};
function mypage02(){
$(".popup_wrap").hide();
$('#pop_mypage02').show(0, function(){
$.getScript("./js/popup.js", function() {
handlePopupScroll();
});});
};
function mypage03(){
$(".popup_wrap").hide();
$('#pop_mypage03').show(0, function(){
$.getScript("./js/popup.js", function() {
handlePopupScroll();
});});
};
function search(){
$(".popup_wrap").hide();
$('#pop_search').show(0, function(){
$.getScript("./js/popup.js", function() {
handlePopupScroll();
});});
};
function sitemap(){
$(".popup_sitemap").hide();
$('#sitemap').show(0, function(){
$.getScript("./js/popup.js", function() {
handlePopupScroll();
});});
};
function privacy(type) {
$(".popup_wrap").hide();
$('#pop_privacy').show(0, function() {
if (type === 'privacy') {
$('#pop_privacy li.tab_privacy').addClass('on');
$('#pop_privacy li.tab_agreement').removeClass('on');
$('.content.pri').addClass('show').removeClass('hide');
$('.content.agr').removeClass('show').addClass('hide');
} else if (type === 'agreement') {
$('#pop_privacy li.tab_agreement').addClass('on');
$('#pop_privacy li.tab_privacy').removeClass('on');
$('.content.agr').addClass('show').removeClass('hide');
$('.content.pri').removeClass('show').addClass('hide');
}
$('body').css('overflow', 'hidden');
$('#pop_privacy .content').css('overflow', 'auto');
$('#pop_privacy .content').on('wheel', function(e) {
e.stopPropagation();
});
$.getScript("./js/popup.js", function() {
lenis.stop();
});
});
};
// FOOTER - top버튼 위치 조정하기
document.addEventListener('DOMContentLoaded', (event)=> {
const topButton = document.querySelector('.btn_top');
function adjustButtonPosition() {
const scrollY = window.scrollY; // 현재 스크롤 위치
const windowHeight = window.innerHeight; // 윈도우 높이
const documentHeight = document.documentElement.scrollHeight; // 문서 전체 높이
const bottomSpace = 230; // 탑 버튼이 아래에서 떨어져 있어야 하는 거리
// const buttonHeight = topButton.offsetHeight; // 탑 버튼의 높이
// 문서의 맨 아래로부터 300px 떨어지기 위한 계산
if (scrollY + windowHeight >= documentHeight - bottomSpace) {
topButton.style.bottom = `${bottomSpace + (scrollY + windowHeight - documentHeight)}px`;
} else {
topButton.style.bottom = '60px'; // 원래의 위치
}
}
window.addEventListener('scroll', adjustButtonPosition);
window.addEventListener('load', adjustButtonPosition);
const showNav = gsap.from(".js__header", {
yPercent: -200,
paused: true,
duration: 0.2
}).progress(1);
ScrollTrigger.create({
start: "top top",
end: 99999,
onUpdate: (self) => {
self.direction === -1 ? showNav.play() : showNav.reverse()
}
});
});
// FOOTER - 패밀리사이트 열고닫기
$(function(){
$('.menu_my').mouseover(function(){
$('.menu_my_list').show();
})
$('.menu_my').mouseout(function(){
$('.menu_my_list').hide();
})
//footer family site toggle
$('.family_btn').click(function(){
$('.family_list').toggleClass('family_on');
$('.family_btn').toggleClass('family_on');
});
});
// HEADER - faq버튼이 배경에 따라 블랙&화이트로 변하기
document.addEventListener('DOMContentLoaded', function() {
const goFaq = document.querySelector('.floating_faq');
const darkSections = document.querySelectorAll('.js__dark');
const observerOptions = {
root: null,
rootMargin: '0px',
threshold: 0.5
};
const observerCallback = (entries) => {
let darkSectionVisible = false;
entries.forEach(entry => {
if (entry.isIntersecting) {
darkSectionVisible = true;
}
});
if (darkSectionVisible) {
goFaq.style.backgroundColor = '#fff';
goFaq.style.color = '#000';
} else {
goFaq.style.backgroundColor = '#000';
goFaq.style.color = '#fff';
}
};
const observer = new IntersectionObserver(observerCallback, observerOptions);
darkSections.forEach(section => observer.observe(section));
});
Binary file not shown.

After

Width:  |  Height:  |  Size: 77 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 B

+50
View File
@@ -0,0 +1,50 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
add_stylesheet('<link rel="stylesheet" href="'.$latest_skin_url.'/style.css">', 0);
$list_count = (is_array($list) && $list) ? count($list) : 0;
?>
<div class="lat">
<h2 class="lat_title"><a href="<?php echo get_pretty_url($bo_table); ?>"><?php echo $bo_subject ?></a></h2>
<ul>
<?php for ($i=0; $i<$list_count; $i++) { ?>
<li class="basic_li">
<?php
if ($list[$i]['icon_secret']) echo "<i class=\"fa fa-lock\" aria-hidden=\"true\"></i><span class=\"sound_only\">비밀글</span> ";
echo "<a href=\"".get_pretty_url($bo_table, $list[$i]['wr_id'])."\"> ";
if ($list[$i]['is_notice'])
echo "<strong>".$list[$i]['subject']."</strong>";
else
echo $list[$i]['subject'];
echo "</a>";
if ($list[$i]['icon_hot']) echo "<span class=\"hot_icon\"><i class=\"fa fa-heart\" aria-hidden=\"true\"></i><span class=\"sound_only\">인기글</span></span>";
if ($list[$i]['icon_new']) echo "<span class=\"new_icon\">N<span class=\"sound_only\">새글</span></span>";
// if ($list[$i]['link']['count']) { echo "[{$list[$i]['link']['count']}]"; }
// if ($list[$i]['file']['count']) { echo "<{$list[$i]['file']['count']}>"; }
echo $list[$i]['icon_reply']." ";
if ($list[$i]['icon_file']) echo " <i class=\"fa fa-download\" aria-hidden=\"true\"></i>" ;
if ($list[$i]['icon_link']) echo " <i class=\"fa fa-link\" aria-hidden=\"true\"></i>" ;
if ($list[$i]['comment_cnt']) echo "
<span class=\"lt_cmt\"><span class=\"sound_only\">댓글</span>".$list[$i]['comment_cnt']."</span>";
?>
<div class="lt_info">
<span class="lt_nick"><?php echo $list[$i]['name'] ?></span>
<span class="lt_date"><?php echo $list[$i]['datetime2'] ?></span>
</div>
</li>
<?php } ?>
<?php if ($list_count == 0) { //게시물이 없을 때 ?>
<li class="empty_li">게시물이 없습니다.</li>
<?php } ?>
</ul>
<a href="<?php echo get_pretty_url($bo_table); ?>" class="lt_more"><span class="sound_only"><?php echo $bo_subject ?></span>더보기</a>
</div>
+31
View File
@@ -0,0 +1,31 @@
@charset "utf-8";
/* 새글 스킨 (latest) */
.lat {position:relative;margin-bottom:20px;background:#fff}
.lat .lat_title {display:block;line-height:45px;font-size:1.2em;color:#253dbe}
.lat .lat_title a {position:relative;color:#000;display:inline-block}
.lat ul {padding:10px 0}
.lat li {position:relative;line-height:18px;border-bottom:1px solid #e5ecee;margin-bottom:10px}
.lat li a {font-weight:bold;font-size:1.2em;line-height:20px;vertical-align:middle}
.lat li a:hover {color:#3a8afd}
.lat li .fa-heart {color:#ff0000}
.lat li .fa-lock {display:inline-block;line-height:14px;width:16px;font-size:0.833em;color:#4f818c;background:#cbe3e8;text-align:center;border-radius:2px;font-size:12px;border:1px solid #cbe3e8;vertical-align:middle}
.lat li .new_icon {display:inline-block;width:16px;line-height:16px;font-size:0.833em;color:#23db79;background:#b9ffda;text-align:center;border-radius:2px;margin-left:2px;font-weight:bold;vertical-align:middle}
.lat li .hot_icon {display:inline-block;width:16px;line-height:16px;font-size:0.833em;color:#ff0000;background:#ffb9b9;text-align:center;border-radius:2px;vertical-align:middle}
.lat li .fa-caret-right {color:#bbb}
.lat li .fa-download {display:inline-block;width:16px;line-height:16px;font-size:0.833em;color:#daae37;background:#ffefb9;text-align:center;border-radius:2px;vertical-align:middle}
.lat li .fa-link {display:inline-block;width:16px;line-height:16px;font-size:0.833em;color:#b451fd;background:#edd3fd;text-align:center;border-radius:2px;vertical-align:middle}
.lat .profile_img img{border-radius:50%}
.lt_info {padding:10px 0}
.lt_info .lt_nick {}
.lt_info .lt_date {color:#888}
.lat .empty_li {line-height:145px;color:#666;text-align:center;padding:0}
.lat .empty_li:before {background:none;padding:0}
.lat .lt_cmt {background:#e9eff5;color:#3a8afd;font-size:11px;height:16px;line-height:16px;padding:0 5px;border-radius:3px;vertical-align:middle}
.lat .lt_more {position:absolute;top:11px;right:0;display:block;width:40px;line-height:25px;color:#3a8afd;border-radius:3px;text-align:center}
.lat .lt_more:hover {color:#777}
@@ -0,0 +1,198 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
add_stylesheet('<link rel="stylesheet" href="'.$faq_skin_url.'/style.css">', 0);
?>
<head>
<link rel="stylesheet" href="../theme/basic/css/default.css?ver=2303229">
<link rel="stylesheet" href="../js/font-awesome/css/font-awesome.min.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/connect/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/popular/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/faq/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/outlogin/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/latest/notice/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/visit/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../js/owlcarousel/owl.carousel.min.css?ver=2303229">
<script>
// 자바스크립트에서 사용하는 전역변수 선언
var g5_url = "http://localhost/tova";
var g5_bbs_url = "http://localhost/tova/bbs";
var g5_is_member = "1";
var g5_is_admin = "super";
var g5_is_mobile = "";
var g5_bo_table = "";
var g5_sca = "";
var g5_editor = "";
var g5_cookie_domain = "";
var g5_theme_shop_url = "http://localhost/tova/theme/basic/shop";
var g5_shop_url = "http://localhost/tova/shop";
</script>
<script src="js/jquery-1.12.4.min.js?ver=2304171"></script>
<script src="js/jquery-migrate-1.4.1.min.js?ver=2304171"></script>
<script src="js/jquery.menu.js?ver=2304171"></script>
<script src="js/common.js?ver=2304171"></script>
<script src="js/wrest.js?ver=2304171"></script>
<script src="js/placeholders.min.js?ver=2304171"></script>
<script src="js/owlcarousel/owl.carousel.min.js?ver=2304171"></script>
<script src="js/jquery.bxslider.js?ver=2304171"></script>
<!-- 디자인팀 작성 -->
<link rel="stylesheet" href="../css/reset.css"/>
<link rel="stylesheet" href="../css/font.css"/>
<link rel="stylesheet" href="../css/style.css"/>
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css"/>
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script type="text/javascript" src="../js/jquery-3.6.1.min.js"></script>
<script type="text/javascript" src="../js/jquery.mousewheel.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
<!-- <script type="text/javascript" src="js/common.js"></script> -->
<script type="text/javascript" src="../js/popup.js"></script>
<!-- //디자인팀 작성 -->
</head>
<!-- FAQ 시작 { -->
<?php
if ($himg_src)
echo '<div id="faq_himg" class="faq_img"><img src="'.$himg_src.'" alt=""></div>';
// 상단 HTML
echo '<div id="faq_hhtml">'.conv_content($fm['fm_head_html'], 1).'</div>';
?>
<fieldset id="faq_sch">
<legend>FAQ 검색</legend>
<form name="faq_search_form" method="get">
<span class="sch_tit">FAQ 검색</span>
<input type="hidden" name="fm_id" value="<?php echo $fm_id;?>">
<label for="stx" class="sound_only">검색어<strong class="sound_only"> 필수</strong></label>
<input type="text" name="stx" value="<?php echo $stx;?>" required id="stx" class="frm_input" size="15" maxlength="15">
<button type="submit" value="검색" class="btn_submit"><i class="fa fa-search" aria-hidden="true"></i> 검색</button>
</form>
</fieldset>
<?php
if( count($faq_master_list) ){
?>
<nav id="bo_cate">
<h2>자주하시는질문 분류</h2>
<ul id="bo_cate_ul">
<?php
foreach( $faq_master_list as $v ){
$category_msg = '';
$category_option = '';
if($v['fm_id'] == $fm_id){ // 현재 선택된 카테고리라면
$category_option = ' id="bo_cate_on"';
$category_msg = '<span class="sound_only">열린 분류 </span>';
}
?>
<li><a href="<?php echo $category_href;?>?fm_id=<?php echo $v['fm_id'];?>" <?php echo $category_option;?> ><?php echo $category_msg.$v['fm_subject'];?></a></li>
<?php
}
?>
</ul>
</nav>
<?php } ?>
<div id="faq_wrap" class="faq_<?php echo $fm_id; ?>">
<?php // FAQ 내용
if( count($faq_list) ){
?>
<section id="faq_con">
<h2><?php echo $g5['title']; ?> 목록</h2>
<ol>
<?php
foreach($faq_list as $key=>$v){
if(empty($v))
continue;
?>
<li>
<h3>
<span class="tit_bg">Q</span><a href="#none" onclick="return faq_open(this);"><?php echo conv_content($v['fa_subject'], 1); ?></a>
<button class="tit_btn" onclick="return faq_open(this);"><i class="fa fa-plus" aria-hidden="true"></i><span class="sound_only">열기</span></button>
</h3>
<div class="con_inner">
<?php echo conv_content($v['fa_content'], 1); ?>
<button type="button" class="closer_btn"><i class="fa fa-minus" aria-hidden="true"></i><span class="sound_only">닫기</span></button>
</div>
</li>
<?php
}
?>
</ol>
</section>
<?php
} else {
if($stx){
echo '<p class="empty_list">검색된 게시물이 없습니다.</p>';
} else {
echo '<div class="empty_list">등록된 FAQ가 없습니다.';
if($is_admin)
echo '<br><a href="'.G5_ADMIN_URL.'/faqmasterlist.php">FAQ를 새로 등록하시려면 FAQ관리</a> 메뉴를 이용하십시오.';
echo '</div>';
}
}
?>
</div>
<?php echo get_paging($page_rows, $page, $total_page, $_SERVER['SCRIPT_NAME'].'?'.$qstr.'&amp;page='); ?>
<?php
// 하단 HTML
echo '<div id="faq_thtml">'.conv_content($fm['fm_tail_html'], 1).'</div>';
if ($timg_src)
echo '<div id="faq_timg" class="faq_img"><img src="'.$timg_src.'" alt=""></div>';
?>
<!-- } FAQ 끝 -->
<?php
if ($admin_href)
echo '<div class="faq_admin"><a href="'.$admin_href.'" class="btn_admin btn" title="FAQ 수정"><i class="fa fa-cog fa-spin fa-fw"></i><span class="sound_only">FAQ 수정</span></a></div>';
?>
<script src="<?php echo G5_JS_URL; ?>/viewimageresize.js"></script>
<script>
jQuery(function() {
$(".closer_btn").on("click", function() {
$(this).closest(".con_inner").slideToggle('slow', function() {
var $h3 = $(this).closest("li").find("h3");
$("#faq_con li h3").removeClass("faq_li_open");
if($(this).is(":visible")) {
$h3.addClass("faq_li_open");
}
});
});
});
function faq_open(el)
{
var $con = $(el).closest("li").find(".con_inner"),
$h3 = $(el).closest("li").find("h3");
if($con.is(":visible")) {
$con.slideUp();
$h3.removeClass("faq_li_open");
} else {
$("#faq_con .con_inner:visible").css("display", "none");
$con.slideDown(
function() {
// 이미지 리사이즈
$con.viewimageresize2();
$("#faq_con li h3").removeClass("faq_li_open");
$h3.addClass("faq_li_open");
}
);
}
return false;
}
</script>
+564
View File
@@ -0,0 +1,564 @@
<!DOCTYPE html>
<html lang="en">
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
//add_stylesheet('<link rel="stylesheet" href="'.$faq_skin_url.'/style.css">', 0);
?>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<head>
<title>Q&A</title>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-STZ2R5Q7HG"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-STZ2R5Q7HG');
</script>
<link rel="stylesheet" href="../theme/basic/css/default.css?ver=2303229">
<link rel="stylesheet" href="../js/font-awesome/css/font-awesome.min.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/connect/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/popular/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/faq/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/outlogin/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/latest/notice/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/visit/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../js/owlcarousel/owl.carousel.min.css?ver=2303229">
<script>
// 자바스크립트에서 사용하는 전역변수 선언
// var g5_url = "http://localhost/tova";
// var g5_bbs_url = "http://localhost/tova/bbs";
// var g5_is_member = "1";
// var g5_is_admin = "";
// var g5_is_mobile = "";
// var g5_bo_table = "";
// var g5_sca = "";
// var g5_editor = "";
// var g5_cookie_domain = "";
// var g5_theme_shop_url = "http://localhost/tova/theme/basic/shop";
// var g5_shop_url = "http://localhost/tova/shop";
</script>
<script src="../js/jquery-1.12.4.min.js?ver=2304171"></script>
<script src="../js/jquery-migrate-1.4.1.min.js?ver=2304171"></script>
<script src="../js/jquery.menu.js?ver=2304171"></script>
<!-- <script src="../js/common.js?ver=2304171"></script> -->
<script src="../js/wrest.js?ver=2304171"></script>
<script src="../js/placeholders.min.js?ver=2304171"></script>
<script src="../js/owlcarousel/owl.carousel.min.js?ver=2304171"></script>
<script src="../js/jquery.bxslider.js?ver=2304171"></script>
<!-- //그누보드 작성 -->
<!-- 디자인팀 작성 -->
<script type="text/javascript" src="../js/jquery-3.6.1.min.js"></script>
<script type="text/javascript" src="../js/jquery.mousewheel.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css"/>
<link rel="stylesheet" href="https://unpkg.com/lenis@1.1.9/dist/lenis.css">
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script src="https://unpkg.com/lenis@1.1.9/dist/lenis.min.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="../js/popup.js"></script>
<link rel="stylesheet" href="../css/reset.css"/>
<link rel="stylesheet" href="../css/font.css"/>
<link rel="stylesheet" href="../css/style.css"/>
<!-- //디자인팀 작성 -->
</head>
<!-- FAQ 시작 { -->
<?php
if ($himg_src)
echo '<div id="faq_himg" class="faq_img"><img src="'.$himg_src.'" alt=""></div>';
// 상단 HTML
echo '<div id="faq_hhtml">'.conv_content($fm['fm_head_html'], 1).'</div>';
?>
<body>
<div class="wrapper">
<input id="hid_mb_id" type="hidden" value="<?echo $_SESSION['session_id'];?>"></input>
<!-- HEADER -->
<?php include_once($member_skin_path.'/main_header.skin.php'); ?>
<!-- //Header -->
<!-- 모든 팝업페이지 경로 -->
<?php
include_once($member_skin_path.'/login.skin.php');
include_once($member_skin_path.'/mypage01.skin.php');
include_once($member_skin_path.'/register.skin.php');
include_once($member_skin_path.'/register_form.skin.php');
include_once($member_skin_path.'/mypage02.skin.php');
include_once($member_skin_path.'/mypage03.skin.php');
include_once($member_skin_path.'/sitemap.skin.php');
include_once($member_skin_path.'/privacy.skin.php');
include_once($member_skin_path.'/password_lost.skin.php');
?>
<!-- 모든 팝업페이지 경로 -->
<div class="container faq">
<section class="intro">
<div class="top js__dark">
<h2 data-aos="fade-down" data-aos-duration="1000">FAQ</h2>
<span>EG-BIM FAQs</span>
</div>
<ul class="sub_tab">
<li class="on"><a href="<?php echo G5_BBS_URL ?>/faq.php">FAQ</a></li>
<li><a href="/eng/bbs/descope_qa_list.php">Q&A</a></li>
<!-- <li><a href="#" onclick="alert('문의하기 게시판은 준비중입니다.'); return false;">문의하기(Q&A)</a></li> -->
<li><a href="https://939.co.kr/saman/" target="_blank">Remote Support</a></li>
</ul>
</section>
<span class="sub_tit">FAQ</span>
<div id="wrapper">
<div id="container_wr">
<div id="container">
<fieldset id="faq_sch">
<legend>FAQ 검색</legend>
<form name="faq_search_form" method="get">
<span class="sch_tit">FAQ 검색</span>
<input type="hidden" name="fm_id" value="<?php echo $fm_id;?>">
<label for="stx" class="sound_only">검색어<strong class="sound_only"> 필수</strong></label>
<input type="text" name="stx" value="<?php echo $stx;?>" required id="stx" class="frm_input" size="15" maxlength="15">
<button type="submit" value="검색" class="btn_submit"><i class="fa fa-search" aria-hidden="true"></i>Search</button>
</form>
</fieldset>
<?php
if( count($faq_master_list) ){
?>
<nav id="bo_cate">
<h2>자주하시는질문 분류</h2>
<ul id="bo_cate_ul" style="display:none">
<?php
foreach( $faq_master_list as $v ){
$category_msg = '';
$category_option = '';
if($v['fm_id'] == $fm_id){ // 현재 선택된 카테고리라면
$category_option = ' id="bo_cate_on"';
$category_msg = '<span class="sound_only">열린 분류 </span>';
}
?>
<li><a href="<?php echo $category_href;?>?fm_id=<?php echo $v['fm_id'];?>" <?php echo $category_option;?> ><?php echo $category_msg.$v['fm_subject'];?></a></li>
<?php
}
?>
</ul>
</nav>
<?php } ?>
<div id="faq_wrap" class="faq_<?php echo $fm_id; ?>">
<?php // FAQ 내용
if( count($faq_list) ){
?>
<section id="faq_con">
<h2><?php echo $g5['title']; ?> 목록</h2>
<ol>
<?php
foreach($faq_list as $key=>$v){
if(empty($v))
continue;
?>
<li>
<h3>
<span class="tit_bg">Q</span><a href="#none" onclick="return faq_open(this);"><?php echo conv_content($v['fa_subject'], 1); ?></a>
<button class="tit_btn" onclick="return faq_open(this);"><i class="fa fa-plus" aria-hidden="true"></i><span class="sound_only">열기</span></button>
</h3>
<div class="con_inner">
<?php echo conv_content($v['fa_content'], 1); ?>
<button type="button" class="closer_btn"><i class="fa fa-minus" aria-hidden="true"></i><span class="sound_only">닫기</span></button>
</div>
</li>
<?php
}
?>
</ol>
</section>
<?php
} else {
if($stx){
echo '<p class="empty_list">검색된 게시물이 없습니다.</p>';
} else {
echo '<div class="empty_list">등록된 FAQ가 없습니다.';
if($is_admin)
echo '<br><a href="'.G5_ADMIN_URL.'/faqmasterlist.php">FAQ를 새로 등록하시려면 FAQ관리</a> 메뉴를 이용하십시오.';
echo '</div>';
}
}
?>
</div>
<?php echo get_paging($page_rows, $page, $total_page, $_SERVER['SCRIPT_NAME'].'?'.$qstr.'&amp;page='); ?>
<?php
// 하단 HTML
echo '<div id="faq_thtml">'.conv_content($fm['fm_tail_html'], 1).'</div>';
if ($timg_src)
echo '<div id="faq_timg" class="faq_img"><img src="'.$timg_src.'" alt=""></div>';
?>
</div>
<?php
// if ($admin_href)
// echo '<div class="faq_admin"><a href="'.$admin_href.'" class="btn_admin btn" title="FAQ 수정"><i class="fa fa-cog fa-spin fa-fw"></i><span class="sound_only">FAQ 수정</span></a></div>';
?>
</div>
</div>
</div>
<!-- FOOTER -->
<?php include_once($member_skin_path.'/main_footer.skin.php'); ?>
<!-- //FOOTER -->
<script>
AOS.init();
const lenis = new Lenis()
lenis.on('scroll', (e) => {
// console.log(e)
})
lenis.on('scroll', ScrollTrigger.update)
gsap.ticker.add((time)=>{
lenis.raf(time * 1000)
})
gsap.ticker.lagSmoothing(0)
</script>
</div>
</body>
<script src="<?php echo G5_JS_URL; ?>/viewimageresize.js"></script>
<script>
jQuery(function() {
$(".closer_btn").on("click", function() {
$(this).closest(".con_inner").slideToggle('slow', function() {
var $h3 = $(this).closest("li").find("h3");
$("#faq_con li h3").removeClass("faq_li_open");
if($(this).is(":visible")) {
$h3.addClass("faq_li_open");
}
});
});
});
function faq_open(el)
{
var $con = $(el).closest("li").find(".con_inner"),
$h3 = $(el).closest("li").find("h3");
if($con.is(":visible")) {
$con.slideUp();
$h3.removeClass("faq_li_open");
} else {
$("#faq_con .con_inner:visible").css("display", "none");
$con.slideDown(
function() {
// 이미지 리사이즈
$con.viewimageresize2();
$("#faq_con li h3").removeClass("faq_li_open");
$h3.addClass("faq_li_open");
}
);
}
return false;
}
</script>
<!-- 상단(헤더) 스크립트 구문 -->
<script>
$(function(){
// footer family site toggle
$('.family_btn').click(function(e){
e.stopPropagation();
$('.family_list, .family_btn').toggleClass('family_on');
});
$(document).click(function(e){
if(!$(e.target).closest('.family_wrap').length){
$('.family_list, .family_btn').removeClass('family_on');
}
});
});
// 회원 탈퇴
function member_leave() {
if (confirm("회원에서 탈퇴 하시겠습니까?"))
location.href = '<?php echo G5_BBS_URL ?>/member_leave.php';
}
// 회원 탈퇴
let x = document.cookie;
if(x.includes("tmp_1=John")){
deleteCookie("tmp_1");
$('#pop_mypage02').show();
}
function deleteCookie(name) {
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng;";
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/bbs;";
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/faq;";
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/qa;";
}
function getCookie(cname) {
let name = cname + "=";
let decodedCookie = decodeURIComponent(document.cookie);
let ca = decodedCookie.split(';');
for(let i = 0; i <ca.length; i++) {
let c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
}
//descope 로그인, 로그아웃 js
function updateHeaderMenu() {
var isLoggedIn = !!sessionStorage.getItem("sessionJwt");
// role 체크 예시 (로그인 시 저장해놓은 값)
var isAdmin = sessionStorage.getItem('userRole') === 'super';
if (isLoggedIn) {
$('.my_join2, .my_login2').show();
$('.my_join, .my_login').hide();
// 마이페이지/관리자 메뉴 동적 출력
if (isAdmin) {
$('#my_join2').html("<a href='http://eg-bim.com/eng/adm/index.php' target='_blank'>관리페이지</a>");
} else {
$('#my_join2').html("<a href='javascript:mypage03();'>마이페이지</a>");
}
} else {
$('.my_join2, .my_login2').hide();
$('.my_join, .my_login').show();
$('#my_join2').html(""); // 혹시모를 내용 초기화
}
}
function descopeLogout() {
fetch('/eng/skin/member/basic/descope_logout.php', {
method: 'POST',
credentials: 'include' // PHPSESSID 쿠키 전송
})
.then(res => {
if (!res.ok) throw new Error('서버 로그아웃 실패');
// 1) 로컬 저장소 정리
// sessionStorage.removeItem("refreshJwt");
// sessionStorage.removeItem("sessionJwt");
// sessionStorage.removeItem("userRole");
// sessionStorage.removeItem("userName");
// sessionStorage.removeItem("loginId");
sessionStorage.clear();
localStorage.clear();
// 2) UI 갱신
updateHeaderMenu();
// 3) 로그인 페이지로 이동
window.location.href = '/eng/index.php';
})
.catch(err => {
console.error(err);
alert('로그아웃 중 오류가 발생했습니다.');
});
}
$(document).ready(function() {
// 기존에 있던 updateHeaderMenu() 호출 뒤에
$('#my_login2 a').off('click').on('click', function(e){
e.preventDefault();
descopeLogout();
});
});
$(document).ready(function() {
updateHeaderMenu();
// (필요하다면, 로그인 성공 후에도 항상 updateHeaderMenu(); 호출)
});
//descope login
$('#flogin button[type=submit]').click(function(e){
e.preventDefault();
let mb_id = $('#login_id').val();
let mb_password = $('#login_pw').val();
$.ajax({
url : '/eng/skin/member/basic/descope_login.php',
data : {
'mb_id' : mb_id,
'mb_password' : mb_password
},
type : "POST",
dataType : "json",
success : function(res){
if(res.status === "ok") {
// 토큰 저장
// sessionStorage.setItem("refreshJwt", res.refreshJwt);
sessionStorage.setItem("sessionJwt", res.sessionJwt);
// ✅ 사용자 정보 저장
if (res.user) {
sessionStorage.setItem("loginId", res.user.loginIds?.[0] || '');
sessionStorage.setItem("userName", res.user.name || '');
sessionStorage.setItem("company", res.user.customAttributes?.company || '');
sessionStorage.setItem("familyCompany", res.user.customAttributes?.familyCompany || '');
sessionStorage.setItem("position", res.user.customAttributes?.position || '');
sessionStorage.setItem("team", res.user.customAttributes?.team || '');
sessionStorage.setItem("familyUniqueKey", res.user.customAttributes?.familyUniqueKey || '');
sessionStorage.setItem("phone", res.user.phone || '');
}
// ✅ 추가: 관리자 등 정보 저장
if(res.user && res.user.roleNames && res.user.roleNames[0])
sessionStorage.setItem("userRole", res.user.roleNames[0]);
else
sessionStorage.removeItem("userRole");
// ✅ 로그인 후 메뉴 갱신
updateHeaderMenu();
// UI 처리
$('.popup_wrap').hide();
$('body').css('overflow', '');
lenis.start();
// alert('로그인 하셨습니다.');
} else {
alert(res.message || "로그인 실패");
// 🔴 실패 횟수에 따라 안내 배너 교체
if (res.failCount && res.failCount >= 8) {
updateLoginBanner("fail");
}
}
},
error : function(err){
alert(err.statusText || "통신 오류");
}
});
});
// ✅ 배너 교체 함수
function updateLoginBanner(type = "default") {
const $banner = $('#login_notice_banner');
if (!$banner.length) return;
if (type === "default") {
$banner.css({ background: "#063e01ff", color: "#fff" });
$banner.find("strong").text("[로그인 시스템 변경 안내]");
$banner.find("p.left").html(`
더 나은 보안을 위해 2025년 8월 8일부터 로그인 시스템이 변경되었습니다.<br>
기존 회원 또한 신규 시스템에 맞춰 재가입을 진행해주시기 바랍니다.
`);
$banner.find("p:last").html(`※ 로그인 및 가입 관련 문의: <strong>010-8721-7453</strong>`);
}
if (type === "fail") {
$banner.css({ background: "#6a0202ff", color: "#faf6f6ff" });
$banner.find("strong").text("[로그인 시도 제한 안내]");
$banner.find("p.left").html(`
비밀번호 입력을 <strong>7회 이상 연속 실패</strong>하셨습니다.<br>
<strong>8번째 시도부터 3분 대기</strong>가 적용됩니다.<br>
10회 이상 실패 시 계정이 잠금 처리됩니다.
`);
$banner.find("p:last").text("");
}
}
//회원가입 약관동의
$('#fregister button[type=submit]').click(function(e){
e.preventDefault();
let agree11 = $('#agree11').val();
let agree21 = $('#agree21').val();
$.ajax({
url : '<?php echo G5_URL ?>/bbs/register_form.php',
type : "POST",
datatype : "json",
contentType: 'application/json; charset=utf-8',
data : {
'agree11' : agree11,
'agree21' : agree21
},
success : function(data){
var ss='';
for(i=0; i<data.length; i++){
ss=ss + data[i];
}
},
error : function(err){
alert(err);
}
});
});
// 이지빔 프로그램 회원가입 url 쿼리스트링 파싱 함수
function getQueryString(name) {
const intro = document.querySelector('.intro_wrap');
intro.style.display = "none";
const mainMask = document.querySelector('.main_mask');
mainMask.classList.add('skip');
// mainMask.style.aimation = 'none';
const urlParams = new URLSearchParams(window.location.search);
return urlParams.get(name);
}
$(document).ready(function() {
const popupParam = getQueryString('popup');
if (popupParam === 'signup') {
console.log('쿼리 감지: signup → 회원가입 팝업 자동 오픈 시도');
$('#pop_agreement').show(); // 팝업 보여주기
// 스크롤 잠금 (사용 중이면)
$('body').css('overflow', 'hidden');
if (typeof lenis !== 'undefined') {
lenis.stop();
}
}
// 팝업 닫기 버튼 이벤트 연결
$('#pop_agreement .btn_close').on('click', function() {
$('#pop_agreement').hide();
$('body').css('overflow', '');
if (typeof lenis !== 'undefined') {
lenis.start();
}
});
});
//이지빔 프로그램 비밀번호 재설정 url 쿼리스트링 파싱 함수
$(document).ready(function() {
const urlParams = new URLSearchParams(window.location.search);
const popup = urlParams.get('popup');
const token = urlParams.get('t');
if (popup === 'pwreset') {
// 팝업 전체 열기
$('#pop_search').show();
$('body').css('overflow', 'hidden');
// 내부 컨텐츠 모두 숨기기
$('#pop_search .popup_contents_wrap').hide();
if (token) {
// 토큰이 있으면 비밀번호 재설정 단계
if (!sessionStorage.getItem('pwreset_shown')) {
$('#password_reset').show();
sessionStorage.setItem('pwreset_shown', '1');
}
} else {
// 토큰이 없으면 아이디 입력 단계 (첫 번째 .popup_contents_wrap)
$('#pop_search .popup_contents_wrap').first().show();
}
}
// 닫기 버튼
$('#pop_search .btn_close').on('click', function() {
$('#pop_search').hide();
$('body').css('overflow', '');
});
});
</script>
@@ -0,0 +1,765 @@
<!DOCTYPE html>
<html lang="en">
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
//add_stylesheet('<link rel="stylesheet" href="'.$faq_skin_url.'/style.css">', 0);
?>
<head>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-STZ2R5Q7HG"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-STZ2R5Q7HG');
</script>
<link rel="stylesheet" href="../theme/basic/css/default.css?ver=2303229">
<link rel="stylesheet" href="../js/font-awesome/css/font-awesome.min.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/connect/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/popular/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/faq/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/outlogin/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/latest/notice/style.css?ver=2303229">
<link rel="stylesheet" href="../theme/basic/skin/visit/basic/style.css?ver=2303229">
<link rel="stylesheet" href="../js/owlcarousel/owl.carousel.min.css?ver=2303229">
<script>
// 자바스크립트에서 사용하는 전역변수 선언
// var g5_url = "http://localhost/tova";
// var g5_bbs_url = "http://localhost/tova/bbs";
// var g5_is_member = "1";
// var g5_is_admin = "";
// var g5_is_mobile = "";
// var g5_bo_table = "";
// var g5_sca = "";
// var g5_editor = "";
// var g5_cookie_domain = "";
// var g5_theme_shop_url = "http://localhost/tova/theme/basic/shop";
// var g5_shop_url = "http://localhost/tova/shop";
</script>
<script src="../js/jquery-1.12.4.min.js?ver=2304171"></script>
<script src="../js/jquery-migrate-1.4.1.min.js?ver=2304171"></script>
<script src="../js/jquery.menu.js?ver=2304171"></script>
<script src="../js/common.js?ver=2304171"></script>
<script src="../js/wrest.js?ver=2304171"></script>
<script src="../js/placeholders.min.js?ver=2304171"></script>
<script src="../js/owlcarousel/owl.carousel.min.js?ver=2304171"></script>
<script src="../js/jquery.bxslider.js?ver=2304171"></script>
<!-- //그누보드 작성 -->
<!-- 디자인팀 작성 -->
<link rel="stylesheet" href="../css/reset.css"/>
<link rel="stylesheet" href="../css/font.css"/>
<link rel="stylesheet" href="../css/style.css"/>
<script type="text/javascript" src="../js/jquery-3.6.1.min.js"></script>
<script type="text/javascript" src="../js/jquery.mousewheel.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
<script type="text/javascript" src="<?php echo G5_URL ?>/js/jquery-3.6.1.min.js"></script>
<script type="text/javascript" src="<?php echo G5_URL ?>/js/jquery.mousewheel.min.js"></script>
<script type="text/javascript" src="<?php echo G5_URL ?>/js/common.js"></script>
<script type="text/javascript" src="<?php echo G5_URL ?>/js/popup.js"></script>
<script type="text/javascript" src="<?php echo G5_URL ?>/js/index.js"></script>
<!-- <script type="text/javascript" src="js/common.js"></script> -->
<script type="text/javascript" src="../js/popup.js"></script>
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css"/>
<link rel="stylesheet" href="https://unpkg.com/lenis@1.1.9/dist/lenis.css">
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script src="https://unpkg.com/lenis@1.1.9/dist/lenis.min.js"></script>
<!-- //디자인팀 작성 -->
</head>
<!-- FAQ 시작 { -->
<?php
if ($himg_src)
echo '<div id="faq_himg" class="faq_img"><img src="'.$himg_src.'" alt=""></div>';
// 상단 HTML
echo '<div id="faq_hhtml">'.conv_content($fm['fm_head_html'], 1).'</div>';
?>
<body>
<div class="wrapper">
<input id="hid_mb_id" type="hidden" value="<?echo $_SESSION['session_id'];?>"></input>
<!-- HEADER -->
<header class="js__header">
<?php include_once($member_skin_path.'/main_header.skin.php'); ?>
</header>
<!-- //Header -->
<!-- floating_menu -->
<div class="floating_menu">
<ul>
<li class="floating_faq"><a href="<?php echo G5_BBS_URL ?>/faq.php">
<i></i>
<span>FAQ</span>
</a></li>
<li class="floating_buy"><a href="<?php echo G5_BBS_URL ?>/buy.php">
<i></i>
<span>구매하기</span>
</a></li>
</ul>
</div>
<!-- //floating_menu -->
<!-- 모든 팝업페이지 경로 -->
<?php
include_once($member_skin_path.'/login.skin.php');
include_once($member_skin_path.'/mypage01.skin.php');
include_once($member_skin_path.'/register.skin.php');
include_once($member_skin_path.'/register_form.skin.php');
include_once($member_skin_path.'/mypage02.skin.php');
include_once($member_skin_path.'/mypage03.skin.php');
include_once($member_skin_path.'/sitemap.skin.php');
include_once($member_skin_path.'/privacy.skin.php');
include_once($member_skin_path.'/password_lost.skin.php');
?>
<!-- 모든 팝업페이지 경로 -->
<div class="container faq">
<section class="intro">
<div class="top js__dark">
<h2 data-aos="fade-down" data-aos-duration="1000">FAQ</h2>
<span>EG-BIM 관련 문의하기</span>
</div>
<ul class="sub_tab">
<li class="on"><a href="<?php echo G5_BBS_URL ?>/faq.php">자주하는 질문</a></li>
<li><a href="<?php echo G5_BBS_URL ?>/qalist.php">1:1 문의하기</a></li>
</ul>
</section>
<span class="sub_tit">자주하는 질문</span>
<div id="wrapper">
<div id="container_wr">
<div id="container">
<fieldset id="faq_sch">
<legend>FAQ 검색</legend>
<form name="faq_search_form" method="get">
<span class="sch_tit">FAQ 검색</span>
<input type="hidden" name="fm_id" value="<?php echo $fm_id;?>">
<label for="stx" class="sound_only">검색어<strong class="sound_only"> 필수</strong></label>
<input type="text" name="stx" value="<?php echo $stx;?>" required id="stx" class="frm_input" size="15" maxlength="15">
<button type="submit" value="검색" class="btn_submit"><i class="fa fa-search" aria-hidden="true"></i> 검색</button>
</form>
</fieldset>
<?php
if( count($faq_master_list) ){
?>
<nav id="bo_cate">
<h2>자주하시는질문 분류</h2>
<ul id="bo_cate_ul" style="display:none">
<?php
foreach( $faq_master_list as $v ){
$category_msg = '';
$category_option = '';
if($v['fm_id'] == $fm_id){ // 현재 선택된 카테고리라면
$category_option = ' id="bo_cate_on"';
$category_msg = '<span class="sound_only">열린 분류 </span>';
}
?>
<li><a href="<?php echo $category_href;?>?fm_id=<?php echo $v['fm_id'];?>" <?php echo $category_option;?> ><?php echo $category_msg.$v['fm_subject'];?></a></li>
<?php
}
?>
</ul>
</nav>
<?php } ?>
<div id="faq_wrap" class="faq_<?php echo $fm_id; ?>">
<?php // FAQ 내용
if( count($faq_list) ){
?>
<section id="faq_con">
<h2><?php echo $g5['title']; ?> 목록</h2>
<ol>
<?php
foreach($faq_list as $key=>$v){
if(empty($v))
continue;
?>
<li>
<h3>
<span class="tit_bg">Q</span><a href="#none" onclick="return faq_open(this);"><?php echo conv_content($v['fa_subject'], 1); ?></a>
<button class="tit_btn" onclick="return faq_open(this);"><i class="fa fa-plus" aria-hidden="true"></i><span class="sound_only">열기</span></button>
</h3>
<div class="con_inner">
<?php echo conv_content($v['fa_content'], 1); ?>
<button type="button" class="closer_btn"><i class="fa fa-minus" aria-hidden="true"></i><span class="sound_only">닫기</span></button>
</div>
</li>
<?php
}
?>
</ol>
</section>
<?php
} else {
if($stx){
echo '<p class="empty_list">검색된 게시물이 없습니다.</p>';
} else {
echo '<div class="empty_list">등록된 FAQ가 없습니다.';
if($is_admin)
echo '<br><a href="'.G5_ADMIN_URL.'/faqmasterlist.php">FAQ를 새로 등록하시려면 FAQ관리</a> 메뉴를 이용하십시오.';
echo '</div>';
}
}
?>
</div>
<?php echo get_paging($page_rows, $page, $total_page, $_SERVER['SCRIPT_NAME'].'?'.$qstr.'&amp;page='); ?>
<?php
// 하단 HTML
echo '<div id="faq_thtml">'.conv_content($fm['fm_tail_html'], 1).'</div>';
if ($timg_src)
echo '<div id="faq_timg" class="faq_img"><img src="'.$timg_src.'" alt=""></div>';
?>
</div>
<?php
// if ($admin_href)
// echo '<div class="faq_admin"><a href="'.$admin_href.'" class="btn_admin btn" title="FAQ 수정"><i class="fa fa-cog fa-spin fa-fw"></i><span class="sound_only">FAQ 수정</span></a></div>';
?>
</div>
</div>
</div>
<!-- } FAQ 끝 -->
<button class="btn_top js__top" onclick="window.scrollTo(0,0);"><div class="arrow"></div></button>
<footer class="footer_off">
<?php include_once($member_skin_path.'/main_footer.skin.php'); ?>
</footer>
<!-- //FOOTER -->
<script>
AOS.init();
const lenis = new Lenis()
lenis.on('scroll', (e) => {
// console.log(e)
})
lenis.on('scroll', ScrollTrigger.update)
gsap.ticker.add((time)=>{
lenis.raf(time * 1000)
})
gsap.ticker.lagSmoothing(0)
</script>
</div>
</body>
<script src="<?php echo G5_JS_URL; ?>/viewimageresize.js"></script>
<script>
jQuery(function() {
$(".closer_btn").on("click", function() {
$(this).closest(".con_inner").slideToggle('slow', function() {
var $h3 = $(this).closest("li").find("h3");
$("#faq_con li h3").removeClass("faq_li_open");
if($(this).is(":visible")) {
$h3.addClass("faq_li_open");
}
});
});
});
function faq_open(el)
{
var $con = $(el).closest("li").find(".con_inner"),
$h3 = $(el).closest("li").find("h3");
if($con.is(":visible")) {
$con.slideUp();
$h3.removeClass("faq_li_open");
} else {
$("#faq_con .con_inner:visible").css("display", "none");
$con.slideDown(
function() {
// 이미지 리사이즈
$con.viewimageresize2();
$("#faq_con li h3").removeClass("faq_li_open");
$h3.addClass("faq_li_open");
}
);
}
return false;
}
</script>
<!-- 상단(헤더) 스크립트 구문 -->
<script>
// 회원 탈퇴
function member_leave() {
if (confirm("회원에서 탈퇴 하시겠습니까?"))
location.href = '<?php echo G5_BBS_URL ?>/member_leave.php';
}
// 회원 탈퇴
if($('#hid_mb_id').val()==''){
document.getElementById('my_join2').style.display = 'none';
document.getElementById('my_login2').style.display = 'none';
document.getElementById('my_join').style.display = '';
document.getElementById('my_login').style.display = '';
}else{
document.getElementById('my_join2').style.display = '';
document.getElementById('my_login2').style.display = '';
document.getElementById('my_join').style.display = 'none';
document.getElementById('my_login').style.display = 'none';
}
let x = document.cookie;
if(x.includes("tmp_1=John")){
deleteCookie("tmp_1");
$('#pop_mypage02').show();
}
function deleteCookie(name) {
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/egbim/bbs;";
}
function getCookie(cname) {
let name = cname + "=";
let decodedCookie = decodeURIComponent(document.cookie);
let ca = decodedCookie.split(';');
for(let i = 0; i <ca.length; i++) {
let c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
}
//alert(getCookie("tmp_1"));
//로그인
$('#flogin button[type=submit]').click(function(e){
e.preventDefault();
let mb_id = $('#login_id').val();
let mb_password = $('#login_pw').val();
//alert('<?php echo G5_URL ?>/bbs/login.php');
$.ajax({
url : '<?php echo G5_URL ?>/bbs/login_check_tova.php',
data : {
'mb_id' : mb_id,
'mb_password' : mb_password
},
type : "POST",
datatype : "json",
success : function(data){
var ss='';
for(i=0; i<data.length; i++){
ss=ss + data[i];
}
//alert(ss.replace('"','').replace('"',''));
if(ss.replace('"','').replace('"','') == "success" || ss.replace('"','').replace('"','') == "super"){
//$(".popup_wrap").show();
$('.btn_close').hide();
$('#pop_login').hide();
$('#hid_mb_id').val(mb_id);
document.getElementById('my_join2').style.display = '';
document.getElementById('my_login2').style.display = '';
document.getElementById('my_join').style.display = 'none';
document.getElementById('my_login').style.display = 'none';
//location.href="<?php echo G5_URL ?>/bbs/session.php?id="+mb_id;
if(ss.replace('"','').replace('"','') == "super"){
$('#my_join2').html("<a href='http://eg-bim.com/egbim/adm/index.php' target='_blank'>관리페이지</a>");
}else{
$('#my_join2').html("<a href='javascript:mypage01();'>마이페이지</a>");
}
}else
{
alert(trim(ss));
}
},
error : function(err){
//alert(err);
alert(err.status);
alert(err.statusText);
}
});
});
//회원가입 약관동의
$('#fregister button[type=submit]').click(function(e){
e.preventDefault();
let agree11 = $('#agree11').val();
let agree21 = $('#agree21').val();
$.ajax({
url : '<?php echo G5_URL ?>/bbs/register_form.php',
type : "POST",
datatype : "json",
contentType: 'application/json; charset=utf-8',
data : {
'agree11' : agree11,
'agree21' : agree21
},
success : function(data){
var ss='';
for(i=0; i<data.length; i++){
ss=ss + data[i];
}
},
error : function(err){
alert(err);
}
});
});
//회원가입 정보입력
$('#fregisterform button[type=submit]').click(function(e){
e.preventDefault();
let mb_id = $('#reg_mb_id').val();
let mb_password = $('#reg_mb_password').val();
let mb_password_re = $('#reg_mb_password_re').val();
let mb_name = $('#reg_mb_name').val();
let mb_email1 = $('#reg_mb_email1').val();
let mb_email2 = $('#mb_email2').val();
let reg_domain2 = $('#register_domain2').val();
let mb_hp = $('#reg_mb_hp').val();
let mb_comp = $('#reg_mb_comp').val();
let mb_comp_team = $('#reg_mb_comp_team').val();
//alert(mb_password+' '+mb_password_re+' '+mb_name+' '+mb_email1+' '+mb_email2+' '+mb_hp+' '+mb_comp+' '+mb_comp_team);
if (mb_id.length < 4) {
alert("아이디를 4글자 이상 입력하십시오.");
mb_id.focus();
return false;
}
var special_pattern = /[`~!@#$%^&*|\\\'\";:\/?]/gi
if (special_pattern.test(mb_id) == true) {
alert("아이디는 특수문자를 사용할수 없습니다.");
mb_id.focus();
return false;
}
// 비밀번호 검사
if(!/^(?=.*[a-zA-Z])(?=.*[!@#$%^*+=-])(?=.*[0-9]).{8,25}$/.test(mb_password)){
alert('비밀번호는 숫자+영문자+특수문자 조합으로 8자리 이상 사용해야 합니다.');
mb_password.focus();
return false;
}
// if (mb_password_re.length < 8 || mb_password.length < 8) {
// alert("비밀번호를 8글자 이상 입력하십시오.");
// mb_password.focus();
// return false;
// }
// 비밀번호 & 2차비밀번호 검사
if (mb_password != mb_password_re) {
alert("비밀번호가 같지 않습니다.");
mb_password_re.focus();
return false;
}
// 이름 검사
if (mb_name == "") {
if (mb_name.length < 1) {
alert("이름을 입력하십시오.");
mb_name.focus();
return false;
}
}
// 메일 검사
if (mb_email1 == "") {
if (mb_email1.length < 1) {
alert("메일 주소를 입력하십시오.");
mb_email1.focus();
return false;
}
}
if (mb_email2 == "type"){
mb_email2 = '@' + reg_domain2;
}
// 핸드폰 번호 검사
if (mb_hp.length < 11) {
alert("휴대전화번호 11자리를 입력하십시오.");
mb_hp.focus();
return false;
}
if(isNaN(mb_hp)){
alert("휴대전화번호는 숫자만 입력가능합니다.");
mb_hp.focus();
return false;
}
// 회사명 검사
if (mb_comp == "") {
if (mb_comp.length < 1) {
alert("회사명을 입력하십시오");
mb_comp.focus();
return false;
}
}
// 팀명 검사
if (mb_comp_team == "") {
if (mb_comp_team.length < 1) {
alert("팀명을 입력하십시오");
mb_comp_team.focus();
return false;
}
}
$.ajax({
url : '<?php echo G5_URL ?>/bbs/register_form_update.php',
data : {
'mb_id' : mb_id,
'mb_password' : mb_password,
'mb_password_re' : mb_password_re,
'mb_name' : mb_name,
'mb_email1' : mb_email1,
'mb_email2' : mb_email2,
'mb_hp' : mb_hp,
'mb_comp' : mb_comp,
'mb_comp_team' : mb_comp_team,
},
type : "POST",
datatype : "json",
success : function(data){
var ss='';
for(i=0; i<data.length; i++){
ss=ss + data[i];
}
if(ss){
// $(".popup_wrap").show();
$('.btn_close').hide();
$('#pop_login').hide();
$('#pop_agreement').hide();
$('#pop_join').hide();
$('#pop_mypage01').hide();
$('#pop_search').hide();
$('#pop_mypage02').hide();
$('#pop_mypage03').hide();
$('#pop_privacy').hide();
// $('.register_fs').hide();
// $('.join_progress .join_step').removeClass('on');
// $('.join_progress .join_step').eq(2).addClass('on');
// $('.messages').show();
alert('회원가입이 완료됐습니다.\n다시 로그인 해주세요');
$('#reg_mb_id').val('');
$('#reg_mb_password').val('');
$('#reg_mb_password_re').val('');
$('#reg_mb_name').val('');
$('#reg_mb_email1').val('');
$('#reg_mb_hp').val('');
$('#reg_mb_comp').val('');
$('#reg_mb_comp_team').val('');
$('#dupl_check_yn').val('N');
}else{
alert('실패했습니다.');
}
},
error : function(err){
alert('에러');
alert(err);
alert(err.status);
alert(err.statusText);
}
});
// $.removeCookie(mb_id,{path:'<?php //echo G5_URL ?>/bbs/register_form_update.php'});
});
//회원정보 수정
$('#fregisterform_up button[type=submit]').click(function(e){
e.preventDefault();
let mb_id = $('#update_mb_id').val();
let mb_password = $('#update_mb_password').val();
let mb_password_re = $('#update_mb_password_re').val();
let mb_name = $('#update_mb_name').val();
let mb_email1 = $('#update_mb_email1').val();
let mb_email2 = $('#update_mb_email2').val();
let update_domain2 = $('#update_domain2').val();
if (mb_email2 == "type"){
mb_email2 = '@' + update_domain2;
}
let mb_hp = $('#update_mb_hp').val();
let mb_comp = $('#update_mb_comp').val();
let mb_comp_team = $('#update_mb_comp_team').val();
//alert(mb_password+' '+mb_password_re+' '+mb_name+' '+mb_email1+' '+mb_email2+' '+mb_hp+' '+mb_comp+' '+mb_comp_team);
if (mb_id.length < 4) {
alert('1');
alert("아이디를 4글자 이상 입력하십시오.");
mb_id.focus();
return false;
}
var special_pattern = /[`~!@#$%^&*|\\\'\";:\/?]/gi
if (special_pattern.test(mb_id) == true) {
alert("아이디는 특수문자를 사용할수 없습니다.");
mb_id.focus();
return false;
}
// 비밀번호 검사
if(!/^(?=.*[a-zA-Z])(?=.*[!@#$%^*+=-])(?=.*[0-9]).{8,25}$/.test(mb_password)){
alert('비밀번호는 숫자+영문자+특수문자 조합으로 8자리 이상 사용해야 합니다.');
mb_password.focus();
return false;
}
// if (mb_password_re.length < 8 || mb_password.length < 8) {
// alert("비밀번호를 8글자 이상 입력하십시오.");
// mb_password.focus();
// return false;
// }
// 비밀번호 & 2차비밀번호 검사
if (mb_password != mb_password_re) {
alert(mb_password_re);
alert("비밀번호가 같지 않습니다.");
mb_password_re.focus();
return false;
}
// 이름 검사
if (mb_name == "") {
if (mb_name.length < 1) {
alert("이름을 입력하십시오.");
mb_name.focus();
return false;
}
}
// 메일 검사
if (mb_email1 == "") {
if (mb_email1.length < 1) {
alert("메일 주소를 입력하십시오.");
mb_email1.focus();
return false;
}
}
// 핸드폰 번호 검사
if (mb_hp.length < 11) {
alert("휴대전화번호 11자리를 입력하십시오.");
mb_hp.focus();
return false;
}
if(isNaN(mb_hp)){
alert("휴대전화번호는 숫자만 입력가능합니다.");
mb_hp.focus();
return false;
}
// 회사명 검사
if (mb_comp == "") {
if (mb_comp.length < 1) {
alert("회사명을 입력하십시오");
mb_comp.focus();
return false;
}
}
// 팀명 검사
if (mb_comp_team == "") {
if (mb_comp_team.length < 1) {
alert("팀명을 입력하십시오");
mb_comp_team.focus();
return false;
}
}
$.ajax({
url : '<?php echo G5_URL ?>/bbs/mypage03.php',
data : {
'mb_id' : mb_id,
'mb_password' : mb_password,
'mb_password_re' : mb_password_re,
'mb_name' : mb_name,
'mb_email1' : mb_email1,
'mb_email2' : mb_email2,
'mb_hp' : mb_hp,
'mb_comp' : mb_comp,
'mb_comp_team' : mb_comp_team,
},
type : "POST",
datatype : "json",
success : function(data){
var ss='';
for(i=0; i<data.length; i++){
ss=ss + data[i];
}
if(ss.replace('"','').replace('"','') == "success"){
// $(".popup_wrap").show();
$('.btn_close').show();
$('#pop_login').hide();
$('#pop_agreement').hide();
$('#pop_join').hide();
$('#pop_mypage01').hide();
$('#pop_search').hide();
$('#pop_mypage02').show();
$('#pop_mypage03').hide();
$('#pop_privacy').hide();
// $('.register_fs').hide();
// $('.join_progress .join_step').removeClass('on');
// $('.join_progress .join_step').eq(2).addClass('on');
// $('.messages').show();
alert('회원정보 수정이 완료됐습니다.');
document.getElementById("span_email").innerText=mb_email1+mb_email2;
document.getElementById("span_hp").innerText=mb_hp;
document.getElementById("span_comp").innerText=mb_comp;
document.getElementById("span_comp_team").innerText=mb_comp_team;
// $('#update_mb_id').val('');
// $('#update_mb_password').val('');
// $('#update_mb_password_re').val('');
// $('#update_mb_name').val('');
// $('#update_mb_email1').val('');
// $('#update_mb_hp').val('');
// $('#update_mb_comp').val('');
// $('#update_mb_comp_team').val('');
// $('#dupl_check_yn').val('N');
}else{
alert('실패했습니다.');
}
},
error : function(err){
alert('에러');
alert(err);
alert(err.status);
alert(err.statusText);
}
});
});
$('#fmyconfirmpw button[type=submit]').click(function(e){
e.preventDefault();
let l_mb_password = $('#password_mypage').val();
let l_mb_id = $('#hid_mb_id').val();
$.ajax({
url : '<?php echo G5_URL ?>/bbs/mypage02.php',
data : {
'mb_id' : l_mb_id,
'mb_password' : l_mb_password,
},
type : "POST",
datatype : "json",
success : function(data){
var ss='';
for(i=0; i<data.length; i++){
ss=ss + data[i];
}
//alert(ss.replace('"','').replace('"',''));
if(ss.replace('"','').replace('"','') == "success"){
$('#password_mypage').val('');
//mypage02();
document.cookie = "tmp_1=John";
location.href="<?php echo G5_URL ?>/bbs/faq.php";
}else
{
alert(trim(ss));
$('#password_mypage').select();
}
},
error : function(err){
alert(err);
alert(err.status);
alert(err.statusText);
}
});
});
</script>
+33
View File
@@ -0,0 +1,33 @@
@charset "utf-8";
#bo_cate {margin-bottom:28px}
#bo_cate h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
#bo_cate ul {zoom:1}
#bo_cate ul:after {display:block;visibility:hidden;clear:both;content:""}
#bo_cate li {display:inline-block;padding:2px}
#bo_cate a {display:block;line-height:28px;padding:5px 15px;border-radius:30px;border:1px solid #d6e9ff;color:#6794d3}
#bo_cate a:focus, #bo_cate a:hover, #bo_cate a:active {text-decoration:none;background:#3a8afd;color:#fff}
#bo_cate #bo_cate_on {z-index:2;background:#3a8afd;color:#fff;font-weight:bold;border:1px solid #3a8afd;
-webkit-box-shadow:inset 0 2px 5px rgb(33, 135, 202);
-moz-box-shadow:inset 0 2px 5px rgb(33, 135, 202);
box-shadow:inset 0 2px 5px rgb(33, 135, 202)}
#faq_wrap {margin:10px 0 30px}
#faq_wrap h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
.faq_admin {text-align:right}
#faq_wrap ol {margin:0;padding:0;list-style:none}
#faq_wrap li {border-bottom:1px solid #ececec;background:#fff;position:relative}
#faq_wrap li:first-child {border-top:1px solid #ececec}
#faq_wrap li h3 {min-height:50px;line-height:30px;padding:15px;padding-left:50px;position:relative}
#faq_wrap li h3 .tit_btn {position:absolute;right:15px;top:15px;border:0;width:30px;height:30px;background:#fff;color:#c5cdd8;font-size:1.2em}
#faq_wrap li h3 .tit_bg {display:inline-block;position:absolute;top:15px;left:15px;text-align:center;color:#000;font-size:1.6em}
#faq_wrap li h3.faq_li_open a {color:#3a8afd}
#faq_con .con_inner {display:none;padding:5px 5px 20px 50px}
#faq_con .con_inner .tit_bg {display:inline-block;position:absolute;top:10px;left:10px;text-align:center;background:#777;color:#fff;border-radius:50%;width:30px;line-height:30px;height:30px}
#faq_con .con_inner .closer_btn {position:absolute;right:15px;top:15px;border:0;width:30px;height:30px;background:#fff;color:#3a8afd;font-size:1.2em}
#faq_sch {background:#f7f7f7;padding:30px;text-align:center;margin:0 0 10px}
#faq_sch .sch_tit {position:absolute;margin:0;padding:0;font-size:0;line-height:0;text-indent:-9999em;overflow:hidden}
#faq_sch .frm_input {border:1px solid #d0d3db;width:300px;height:45px;border-radius:0;border-radius:3px}
#faq_sch .btn_submit {padding:0 10px;height:45px;width:88px;font-size:1.083em;font-weight:bold;color:#fff;background:#434a54}
+969
View File
@@ -0,0 +1,969 @@
// 전역 변수
var errmsg = "";
var errfld = null;
// 필드 검사
function check_field(fld, msg)
{
if ((fld.value = trim(fld.value)) == "")
error_field(fld, msg);
else
clear_field(fld);
return;
}
// 필드 오류 표시
function error_field(fld, msg)
{
if (msg != "")
errmsg += msg + "\n";
if (!errfld) errfld = fld;
fld.style.background = "#BDDEF7";
}
// 필드를 깨끗하게
function clear_field(fld)
{
fld.style.background = "#FFFFFF";
}
function trim(s)
{
var t = "";
var from_pos = to_pos = 0;
for (i=0; i<s.length; i++)
{
if (s.charAt(i) == ' ')
continue;
else
{
from_pos = i;
break;
}
}
for (i=s.length; i>=0; i--)
{
if (s.charAt(i-1) == ' ')
continue;
else
{
to_pos = i;
break;
}
}
t = s.substring(from_pos, to_pos);
// alert(from_pos + ',' + to_pos + ',' + t+'.');
return t;
}
// 자바스크립트로 PHP의 number_format 흉내를 냄
// 숫자에 , 를 출력
function number_format(data)
{
var tmp = '';
var number = '';
var cutlen = 3;
var comma = ',';
var i;
data = data + '';
var sign = data.match(/^[\+\-]/);
if(sign) {
data = data.replace(/^[\+\-]/, "");
}
len = data.length;
mod = (len % cutlen);
k = cutlen - mod;
for (i=0; i<data.length; i++)
{
number = number + data.charAt(i);
if (i < data.length - 1)
{
k++;
if ((k % cutlen) == 0)
{
number = number + comma;
k = 0;
}
}
}
if(sign != null)
number = sign+number;
return number;
}
// 새 창
function popup_window(url, winname, opt)
{
window.open(url, winname, opt);
}
// 폼메일 창
function popup_formmail(url)
{
opt = 'scrollbars=yes,width=417,height=385,top=10,left=20';
popup_window(url, "wformmail", opt);
}
// , 를 없앤다.
function no_comma(data)
{
var tmp = '';
var comma = ',';
var i;
for (i=0; i<data.length; i++)
{
if (data.charAt(i) != comma)
tmp += data.charAt(i);
}
return tmp;
}
// 삭제 검사 확인
function del(href)
{
if(confirm("한번 삭제한 자료는 복구할 방법이 없습니다.\n\n정말 삭제하시겠습니까?")) {
document.location.href = href;
}
}
// 쿠키 입력
function set_cookie(name, value, expirehours, domain)
{
var today = new Date();
today.setTime(today.getTime() + (60*60*1000*expirehours));
document.cookie = name + "=" + escape( value ) + "; path=/; expires=" + today.toGMTString() + ";";
if (domain) {
document.cookie += "domain=" + domain + ";";
}
}
// 쿠키 얻음
function get_cookie(name)
{
var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
if (match) return unescape(match[2]);
return "";
}
// 쿠키 지움
function delete_cookie(name)
{
var today = new Date();
today.setTime(today.getTime() - 1);
var value = get_cookie(name);
if(value != "")
document.cookie = name + "=" + value + "; path=/; expires=" + today.toGMTString();
}
var last_id = null;
function menu(id)
{
if (id != last_id)
{
if (last_id != null)
document.getElementById(last_id).style.display = "none";
document.getElementById(id).style.display = "block";
last_id = id;
}
else
{
document.getElementById(id).style.display = "none";
last_id = null;
}
}
function textarea_decrease(id, row)
{
if (document.getElementById(id).rows - row > 0)
document.getElementById(id).rows -= row;
}
function textarea_original(id, row)
{
document.getElementById(id).rows = row;
}
function textarea_increase(id, row)
{
document.getElementById(id).rows += row;
}
// 글숫자 검사
function check_byte(content, target)
{
var i = 0;
var cnt = 0;
var ch = '';
var cont = document.getElementById(content).value;
for (i=0; i<cont.length; i++) {
ch = cont.charAt(i);
if (escape(ch).length > 4) {
cnt += 2;
} else {
cnt += 1;
}
}
// 숫자를 출력
document.getElementById(target).innerHTML = cnt;
return cnt;
}
// 브라우저에서 오브젝트의 왼쪽 좌표
function get_left_pos(obj)
{
var parentObj = null;
var clientObj = obj;
//var left = obj.offsetLeft + document.body.clientLeft;
var left = obj.offsetLeft;
while((parentObj=clientObj.offsetParent) != null)
{
left = left + parentObj.offsetLeft;
clientObj = parentObj;
}
return left;
}
// 브라우저에서 오브젝트의 상단 좌표
function get_top_pos(obj)
{
var parentObj = null;
var clientObj = obj;
//var top = obj.offsetTop + document.body.clientTop;
var top = obj.offsetTop;
while((parentObj=clientObj.offsetParent) != null)
{
top = top + parentObj.offsetTop;
clientObj = parentObj;
}
return top;
}
function flash_movie(src, ids, width, height, wmode)
{
var wh = "";
if (parseInt(width) && parseInt(height))
wh = " width='"+width+"' height='"+height+"' ";
return "<object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0' "+wh+" id="+ids+"><param name=wmode value="+wmode+"><param name=movie value="+src+"><param name=quality value=high><embed src="+src+" quality=high wmode="+wmode+" type='application/x-shockwave-flash' pluginspage='http://www.macromedia.com/shockwave/download/index.cgi?p1_prod_version=shockwaveflash' "+wh+"></embed></object>";
}
function obj_movie(src, ids, width, height, autostart)
{
var wh = "";
if (parseInt(width) && parseInt(height))
wh = " width='"+width+"' height='"+height+"' ";
if (!autostart) autostart = false;
return "<embed src='"+src+"' "+wh+" autostart='"+autostart+"'></embed>";
}
function doc_write(cont)
{
document.write(cont);
}
var win_password_lost = function(href) {
window.open(href, "win_password_lost", "left=50, top=50, width=617, height=330, scrollbars=1");
}
$(document).ready(function(){
$("#login_password_lost, #ol_password_lost").click(function(){
win_password_lost(this.href);
return false;
});
});
/**
* 포인트 창
**/
var win_point = function(href) {
var new_win = window.open(href, 'win_point', 'left=100,top=100,width=600, height=600, scrollbars=1');
new_win.focus();
}
/**
* 쪽지 창
**/
var win_memo = function(href) {
var new_win = window.open(href, 'win_memo', 'left=100,top=100,width=620,height=500,scrollbars=1');
new_win.focus();
}
/**
* 쪽지 창
**/
var check_goto_new = function(href, event) {
if( !(typeof g5_is_mobile != "undefined" && g5_is_mobile) ){
if (window.opener && window.opener.document && window.opener.document.getElementById) {
event.preventDefault ? event.preventDefault() : (event.returnValue = false);
window.open(href);
//window.opener.document.location.href = href;
}
}
}
/**
* 메일 창
**/
var win_email = function(href) {
var new_win = window.open(href, 'win_email', 'left=100,top=100,width=600,height=580,scrollbars=1');
new_win.focus();
}
/**
* 자기소개 창
**/
var win_profile = function(href) {
var new_win = window.open(href, 'win_profile', 'left=100,top=100,width=620,height=510,scrollbars=1');
new_win.focus();
}
/**
* 스크랩 창
**/
var win_scrap = function(href) {
var new_win = window.open(href, 'win_scrap', 'left=100,top=100,width=600,height=600,scrollbars=1');
new_win.focus();
}
/**
* 홈페이지 창
**/
var win_homepage = function(href) {
var new_win = window.open(href, 'win_homepage', '');
new_win.focus();
}
/**
* 우편번호 창
**/
var win_zip = function(frm_name, frm_zip, frm_addr1, frm_addr2, frm_addr3, frm_jibeon) {
if(typeof daum === "undefined"){
alert("KAKAO 우편번호 서비스 postcode.v2.js 파일이 로드되지 않았습니다.");
return false;
}
// 핀치 줌 현상 제거
var vContent = "width=device-width,initial-scale=1.0,minimum-scale=0,maximum-scale=10";
$("#meta_viewport").attr("content", vContent + ",user-scalable=no");
var zip_case = 1; //0이면 레이어, 1이면 페이지에 끼워 넣기, 2이면 새창
var complete_fn = function(data){
// 팝업에서 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.
// 각 주소의 노출 규칙에 따라 주소를 조합한다.
// 내려오는 변수가 값이 없는 경우엔 공백('')값을 가지므로, 이를 참고하여 분기 한다.
var fullAddr = ''; // 최종 주소 변수
var extraAddr = ''; // 조합형 주소 변수
// 사용자가 선택한 주소 타입에 따라 해당 주소 값을 가져온다.
if (data.userSelectedType === 'R') { // 사용자가 도로명 주소를 선택했을 경우
fullAddr = data.roadAddress;
} else { // 사용자가 지번 주소를 선택했을 경우(J)
fullAddr = data.jibunAddress;
}
// 사용자가 선택한 주소가 도로명 타입일때 조합한다.
if(data.userSelectedType === 'R'){
//법정동명이 있을 경우 추가한다.
if(data.bname !== ''){
extraAddr += data.bname;
}
// 건물명이 있을 경우 추가한다.
if(data.buildingName !== ''){
extraAddr += (extraAddr !== '' ? ', ' + data.buildingName : data.buildingName);
}
// 조합형주소의 유무에 따라 양쪽에 괄호를 추가하여 최종 주소를 만든다.
extraAddr = (extraAddr !== '' ? ' ('+ extraAddr +')' : '');
}
// 우편번호와 주소 정보를 해당 필드에 넣고, 커서를 상세주소 필드로 이동한다.
var of = document[frm_name];
of[frm_zip].value = data.zonecode;
of[frm_addr1].value = fullAddr;
of[frm_addr3].value = extraAddr;
if(of[frm_jibeon] !== undefined){
of[frm_jibeon].value = data.userSelectedType;
}
setTimeout(function(){
$("#meta_viewport").attr("content", vContent);
of[frm_addr2].focus();
} , 100);
};
switch(zip_case) {
case 1 : //iframe을 이용하여 페이지에 끼워 넣기
var daum_pape_id = 'daum_juso_page'+frm_zip,
element_wrap = document.getElementById(daum_pape_id),
currentScroll = Math.max(document.body.scrollTop, document.documentElement.scrollTop);
if (element_wrap == null) {
element_wrap = document.createElement("div");
element_wrap.setAttribute("id", daum_pape_id);
element_wrap.style.cssText = 'display:none;border:1px solid;left:0;width:100%;height:300px;margin:5px 0;position:relative;-webkit-overflow-scrolling:touch;';
element_wrap.innerHTML = '<img src="//t1.daumcdn.net/postcode/resource/images/close.png" id="btnFoldWrap" style="cursor:pointer;position:absolute;right:0px;top:-21px;z-index:1" class="close_daum_juso" alt="접기 버튼">';
jQuery('form[name="'+frm_name+'"]').find('input[name="'+frm_addr1+'"]').before(element_wrap);
jQuery("#"+daum_pape_id).off("click", ".close_daum_juso").on("click", ".close_daum_juso", function(e){
e.preventDefault();
$("#meta_viewport").attr("content", vContent);
jQuery(this).parent().hide();
});
}
new daum.Postcode({
oncomplete: function(data) {
complete_fn(data);
// iframe을 넣은 element를 안보이게 한다.
element_wrap.style.display = 'none';
// 우편번호 찾기 화면이 보이기 이전으로 scroll 위치를 되돌린다.
document.body.scrollTop = currentScroll;
},
// 우편번호 찾기 화면 크기가 조정되었을때 실행할 코드를 작성하는 부분.
// iframe을 넣은 element의 높이값을 조정한다.
onresize : function(size) {
element_wrap.style.height = size.height + "px";
},
maxSuggestItems : g5_is_mobile ? 6 : 10,
width : '100%',
height : '100%'
}).embed(element_wrap);
// iframe을 넣은 element를 보이게 한다.
element_wrap.style.display = 'block';
break;
case 2 : //새창으로 띄우기
new daum.Postcode({
oncomplete: function(data) {
complete_fn(data);
}
}).open();
break;
default : //iframe을 이용하여 레이어 띄우기
var rayer_id = 'daum_juso_rayer'+frm_zip,
element_layer = document.getElementById(rayer_id);
if (element_layer == null) {
element_layer = document.createElement("div");
element_layer.setAttribute("id", rayer_id);
element_layer.style.cssText = 'display:none;border:5px solid;position:fixed;width:300px;height:460px;left:50%;margin-left:-155px;top:50%;margin-top:-235px;overflow:hidden;-webkit-overflow-scrolling:touch;z-index:10000';
element_layer.innerHTML = '<img src="//i1.daumcdn.net/localimg/localimages/07/postcode/320/close.png" id="btnCloseLayer" style="cursor:pointer;position:absolute;right:-3px;top:-3px;z-index:1" class="close_daum_juso" alt="닫기 버튼">';
document.body.appendChild(element_layer);
jQuery("#"+rayer_id).off("click", ".close_daum_juso").on("click", ".close_daum_juso", function(e){
e.preventDefault();
$("#meta_viewport").attr("content", vContent);
jQuery(this).parent().hide();
});
}
new daum.Postcode({
oncomplete: function(data) {
complete_fn(data);
// iframe을 넣은 element를 안보이게 한다.
element_layer.style.display = 'none';
},
maxSuggestItems : g5_is_mobile ? 6 : 10,
width : '100%',
height : '100%'
}).embed(element_layer);
// iframe을 넣은 element를 보이게 한다.
element_layer.style.display = 'block';
}
}
/**
* 새로운 비밀번호 분실 창 : 101123
**/
win_password_lost = function(href)
{
var new_win = window.open(href, 'win_password_lost', 'width=617, height=330, scrollbars=1');
new_win.focus();
}
/**
* 설문조사 결과
**/
var win_poll = function(href) {
var new_win = window.open(href, 'win_poll', 'width=616, height=500, scrollbars=1');
new_win.focus();
}
/**
* 쿠폰
**/
var win_coupon = function(href) {
var new_win = window.open(href, "win_coupon", "left=100,top=100,width=700, height=600, scrollbars=1");
new_win.focus();
}
/**
* 스크린리더 미사용자를 위한 스크립트 - 지운아빠 2013-04-22
* alt 값만 갖는 그래픽 링크에 마우스오버 시 title 값 부여, 마우스아웃 시 title 값 제거
**/
$(function() {
$('a img').mouseover(function() {
$a_img_title = $(this).attr('alt');
$(this).attr('title', $a_img_title);
}).mouseout(function() {
$(this).attr('title', '');
});
});
/**
* 텍스트 리사이즈
**/
function font_resize(id, rmv_class, add_class, othis)
{
var $el = $("#"+id);
if((typeof rmv_class !== "undefined" && rmv_class) || (typeof add_class !== "undefined" && add_class)){
$el.removeClass(rmv_class).addClass(add_class);
set_cookie("ck_font_resize_rmv_class", rmv_class, 1, g5_cookie_domain);
set_cookie("ck_font_resize_add_class", add_class, 1, g5_cookie_domain);
}
if(typeof othis !== "undefined"){
$(othis).addClass('select').siblings().removeClass('select');
}
}
/**
* 댓글 수정 토큰
**/
function set_comment_token(f)
{
if(typeof f.token === "undefined")
$(f).prepend('<input type="hidden" name="token" value="">');
$.ajax({
url: g5_bbs_url+"/ajax.comment_token.php",
type: "GET",
dataType: "json",
async: false,
cache: false,
success: function(data, textStatus) {
f.token.value = data.token;
}
});
}
$(function(){
$(".win_point").click(function() {
win_point(this.href);
return false;
});
$(".win_memo").click(function() {
win_memo(this.href);
return false;
});
$(".win_email").click(function() {
win_email(this.href);
return false;
});
$(".win_scrap").click(function() {
win_scrap(this.href);
return false;
});
$(".win_profile").click(function() {
win_profile(this.href);
return false;
});
$(".win_homepage").click(function() {
win_homepage(this.href);
return false;
});
$(".win_password_lost").click(function() {
win_password_lost(this.href);
return false;
});
/*
$(".win_poll").click(function() {
win_poll(this.href);
return false;
});
*/
$(".win_coupon").click(function() {
win_coupon(this.href);
return false;
});
// 사이드뷰
var sv_hide = false;
$(".sv_member, .sv_guest").click(function() {
$(".sv").removeClass("sv_on");
$(this).closest(".sv_wrap").find(".sv").addClass("sv_on");
});
$(".sv, .sv_wrap").hover(
function() {
sv_hide = false;
},
function() {
sv_hide = true;
}
);
$(".sv_member, .sv_guest").focusin(function() {
sv_hide = false;
$(".sv").removeClass("sv_on");
$(this).closest(".sv_wrap").find(".sv").addClass("sv_on");
});
$(".sv a").focusin(function() {
sv_hide = false;
});
$(".sv a").focusout(function() {
sv_hide = true;
});
// 셀렉트 ul
var sel_hide = false;
$('.sel_btn').click(function() {
$('.sel_ul').removeClass('sel_on');
$(this).siblings('.sel_ul').addClass('sel_on');
});
$(".sel_wrap").hover(
function() {
sel_hide = false;
},
function() {
sel_hide = true;
}
);
$('.sel_a').focusin(function() {
sel_hide = false;
});
$('.sel_a').focusout(function() {
sel_hide = true;
});
$(document).click(function() {
if(sv_hide) { // 사이드뷰 해제
$(".sv").removeClass("sv_on");
}
if (sel_hide) { // 셀렉트 ul 해제
$('.sel_ul').removeClass('sel_on');
}
});
$(document).focusin(function() {
if(sv_hide) { // 사이드뷰 해제
$(".sv").removeClass("sv_on");
}
if (sel_hide) { // 셀렉트 ul 해제
$('.sel_ul').removeClass('sel_on');
}
});
$(document).on( "keyup change", "textarea#wr_content[maxlength]", function(){
var str = $(this).val();
var mx = parseInt($(this).attr("maxlength"));
if (str.length > mx) {
$(this).val(str.substr(0, mx));
return false;
}
});
});
function get_write_token(bo_table)
{
var token = "";
$.ajax({
type: "POST",
url: g5_bbs_url+"/write_token.php",
data: { bo_table: bo_table },
cache: false,
async: false,
dataType: "json",
success: function(data) {
if(data.error) {
alert(data.error);
if(data.url)
document.location.href = data.url;
return false;
}
token = data.token;
}
});
return token;
}
$(function() {
$(document).on("click", "form[name=fwrite] input:submit, form[name=fwrite] button:submit, form[name=fwrite] input:image", function() {
var f = this.form;
if (typeof(f.bo_table) == "undefined") {
return;
}
var bo_table = f.bo_table.value;
var token = get_write_token(bo_table);
if(!token) {
alert("토큰 정보가 올바르지 않습니다.");
return false;
}
var $f = $(f);
if(typeof f.token === "undefined")
$f.prepend('<input type="hidden" name="token" value="">');
$f.find("input[name=token]").val(token);
return true;
});
});
//디자인팀 작업 내용 추가
// include.js
window.addEventListener('load', function() {
var allElements = document.getElementsByTagName('*');
Array.prototype.forEach.call(allElements, function(el) {
var includePath = el.dataset.includePath;
if (includePath) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
el.outerHTML = this.responseText;
}
};
xhttp.open('GET', includePath, true);
xhttp.send();
}
});
});
// ★★ lenis 멈추기★★
function handlePopupScroll() {
$('body').css('overflow', 'hidden');
$('body').on('wheel', function(e) {
e.stopPropagation();
});
lenis.stop();
}
// 각 팝업창 불러오기
function agreement(){
$(".popup_wrap").hide();
$('.btn_close').show();
$('#pop_agreement').show(0, function(){
$.getScript("./js/popup.js", function() {
handlePopupScroll();
});
});
};
function join(){
$(".popup_wrap").hide();
$('#pop_join').show(0, function(){
$.getScript("./js/popup.js", function() {
handlePopupScroll();
});});
};
function login(){
$(".popup_wrap").hide();
$('#pop_login').show(0, function(){
$.getScript("./js/popup.js", function() {
handlePopupScroll();
});});
};
function mypage01(){
$(".popup_wrap").hide();
$('.btn_close').show();
$('#pop_mypage01').show(0, function(){
$.getScript("./js/popup.js", function() {
handlePopupScroll();
});});
};
function mypage02(){
$(".popup_wrap").hide();
$('#pop_mypage02').show(0, function(){
$.getScript("./js/popup.js", function() {
handlePopupScroll();
});});
};
function mypage03(){
$(".popup_wrap").hide();
$('#pop_mypage03').show(0, function(){
$.getScript("./js/popup.js", function() {
handlePopupScroll();
});});
};
function search(){
$(".popup_wrap").hide();
$('#pop_search').show(0, function(){
$.getScript("./js/popup.js", function() {
handlePopupScroll();
});});
};
function sitemap(){
$(".popup_sitemap").hide();
$('#sitemap').show(0, function(){
$.getScript("./js/popup.js", function() {
handlePopupScroll();
});});
};
function privacy(type) {
$(".popup_wrap").hide();
$('#pop_privacy').show(0, function() {
if (type === 'privacy') {
$('#pop_privacy li.tab_privacy').addClass('on');
$('#pop_privacy li.tab_agreement').removeClass('on');
$('.content.pri').addClass('show').removeClass('hide');
$('.content.agr').removeClass('show').addClass('hide');
} else if (type === 'agreement') {
$('#pop_privacy li.tab_agreement').addClass('on');
$('#pop_privacy li.tab_privacy').removeClass('on');
$('.content.agr').addClass('show').removeClass('hide');
$('.content.pri').removeClass('show').addClass('hide');
}
$('body').css('overflow', 'hidden');
$('#pop_privacy .content').css('overflow', 'auto');
$('#pop_privacy .content').on('wheel', function(e) {
e.stopPropagation();
});
$.getScript("./js/popup.js", function() {
lenis.stop();
});
});
};
// FOOTER - top버튼 위치 조정하기
document.addEventListener('DOMContentLoaded', (event)=> {
const topButton = document.querySelector('.btn_top');
function adjustButtonPosition() {
const scrollY = window.scrollY; // 현재 스크롤 위치
const windowHeight = window.innerHeight; // 윈도우 높이
const documentHeight = document.documentElement.scrollHeight; // 문서 전체 높이
const bottomSpace = 230; // 탑 버튼이 아래에서 떨어져 있어야 하는 거리
// const buttonHeight = topButton.offsetHeight; // 탑 버튼의 높이
// 문서의 맨 아래로부터 300px 떨어지기 위한 계산
if (scrollY + windowHeight >= documentHeight - bottomSpace) {
topButton.style.bottom = `${bottomSpace + (scrollY + windowHeight - documentHeight)}px`;
} else {
topButton.style.bottom = '60px'; // 원래의 위치
}
}
window.addEventListener('scroll', adjustButtonPosition);
window.addEventListener('load', adjustButtonPosition);
const showNav = gsap.from(".js__header", {
yPercent: -200,
paused: true,
duration: 0.2
}).progress(1);
ScrollTrigger.create({
start: "top top",
end: 99999,
onUpdate: (self) => {
self.direction === -1 ? showNav.play() : showNav.reverse()
}
});
});
// FOOTER - 패밀리사이트 열고닫기
$(function(){
$('.menu_my').mouseover(function(){
$('.menu_my_list').show();
})
$('.menu_my').mouseout(function(){
$('.menu_my_list').hide();
})
//footer family site toggle
$('.family_btn').click(function(){
$('.family_list').toggleClass('family_on');
$('.family_btn').toggleClass('family_on');
});
});
// HEADER - faq버튼이 배경에 따라 블랙&화이트로 변하기
document.addEventListener('DOMContentLoaded', function() {
const goFaq = document.querySelector('.floating_faq');
const darkSections = document.querySelectorAll('.js__dark');
const observerOptions = {
root: null,
rootMargin: '0px',
threshold: 0.5
};
const observerCallback = (entries) => {
let darkSectionVisible = false;
entries.forEach(entry => {
if (entry.isIntersecting) {
darkSectionVisible = true;
}
});
if (darkSectionVisible) {
goFaq.style.backgroundColor = '#fff';
goFaq.style.color = '#000';
} else {
goFaq.style.backgroundColor = '#000';
goFaq.style.color = '#fff';
}
};
const observer = new IntersectionObserver(observerCallback, observerOptions);
darkSections.forEach(section => observer.observe(section));
});
+43
View File
@@ -0,0 +1,43 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
add_stylesheet('<link rel="stylesheet" href="'.$latest_skin_url.'/style.css">', 0);
add_javascript('<script src="'.G5_JS_URL.'/jquery.bxslider.js"></script>', 10);
$list_count = (is_array($list) && $list) ? count($list) : 0;
?>
<div class="notice ft_cnt">
<h2><a href="<?php echo get_pretty_url($bo_table); ?>"><?php echo $bo_subject ?></a></h2>
<ul>
<?php for ($i=0; $i<$list_count; $i++) { ?>
<li>
<?php
if ($list[$i]['icon_secret']) echo "<span class=\"lock_icon\"><i class=\"fa fa-lock\" aria-hidden=\"true\"></i></span> ";
if ($list[$i]['icon_new']) echo "<span class=\"new_icon\">N<span class=\"sound_only\">새글</span></span>";
//echo $list[$i]['icon_reply']." ";
echo "<a href=\"".get_pretty_url($bo_table, $list[$i]['wr_id'])."\">";
if ($list[$i]['is_notice'])
echo "<strong>".$list[$i]['subject']."</strong>";
else
echo $list[$i]['subject'];
if ($list[$i]['comment_cnt'])
echo $list[$i]['comment_cnt'];
echo "</a>";
// if ($list[$i]['link']['count']) { echo "[{$list[$i]['link']['count']}]"; }
// if ($list[$i]['file']['count']) { echo "<{$list[$i]['file']['count']}>"; }
//if ($list[$i]['icon_file']) echo " <i class=\"fa fa-download\" aria-hidden=\"true\"></i>" ;
//if ($list[$i]['icon_link']) echo " <i class=\"fa fa-link\" aria-hidden=\"true\"></i>" ;
//if ($list[$i]['icon_hot']) echo " <i class=\"fa fa-heart\" aria-hidden=\"true\"></i>";
?>
</li>
<?php } ?>
<?php if ($list_count == 0) { //게시물이 없을 때 ?>
<li class="empty_li">게시물이 없습니다.</li>
<?php } ?>
</ul>
</div>
+12
View File
@@ -0,0 +1,12 @@
@charset "utf-8";
/* 새글 스킨 (latest) */
.notice {position:relative;padding:15px 50px}
.notice h2 {margin-bottom:20px}
.notice h2 a {font-size:1.2em;color:#fff}
.notice li {text-overflow:ellipsis;overflow:hidden;white-space:nowrap;border-bottom:1px solid #343434}
.notice li a, .notice li.empty_li {color:#e3e3e3;padding:11px 0;display:inline-block}
.notice li .lock_icon {display:inline-block;line-height:14px;width:16px;font-size:0.833em;color:#4f818c;background:#cbe3e8;text-align:center;border-radius:2px;font-size: 12px;border:1px solid #a2c6ce;vertical-align:baseline}
.notice li .new_icon {display:inline-block;line-height:16px;width:16px;font-size:0.833em;color:#ffff00;background:#6db142;text-align:center;margin-right:3px;border-radius:2px;vertical-align:baseline}
.notice .cnt_cm {background:#5c85c1;color:#fff;font-size:11px;height:16px;line-height:16px;padding:0 5px;border-radius:3px;white-space:nowrap;margin-left:5px}
.notice li.empty_li {border-bottom:0;line-height:120px}
+67
View File
@@ -0,0 +1,67 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
include_once(G5_LIB_PATH.'/thumbnail.lib.php');
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
add_stylesheet('<link rel="stylesheet" href="'.$latest_skin_url.'/style.css">', 0);
$thumb_width = 210;
$thumb_height = 150;
$list_count = (is_array($list) && $list) ? count($list) : 0;
?>
<div class="pic_lt">
<h2 class="lat_title"><a href="<?php echo get_pretty_url($bo_table); ?>"><?php echo $bo_subject ?></a></h2>
<ul>
<?php
for ($i=0; $i<$list_count; $i++) {
$thumb = get_list_thumbnail($bo_table, $list[$i]['wr_id'], $thumb_width, $thumb_height, false, true);
if($thumb['src']) {
$img = $thumb['src'];
} else {
$img = G5_IMG_URL.'/no_img.png';
$thumb['alt'] = '이미지가 없습니다.';
}
$img_content = '<img src="'.$img.'" alt="'.$thumb['alt'].'" >';
$wr_href = get_pretty_url($bo_table, $list[$i]['wr_id']);
?>
<li class="gallery_li">
<a href="<?php echo $wr_href; ?>" class="lt_img"><?php echo run_replace('thumb_image_tag', $img_content, $thumb); ?></a>
<?php
if ($list[$i]['icon_secret']) echo "<i class=\"fa fa-lock\" aria-hidden=\"true\"></i><span class=\"sound_only\">비밀글</span> ";
echo "<a href=\"".$wr_href."\"> ";
if ($list[$i]['is_notice'])
echo "<strong>".$list[$i]['subject']."</strong>";
else
echo $list[$i]['subject'];
echo "</a>";
if ($list[$i]['icon_new']) echo "<span class=\"new_icon\">N<span class=\"sound_only\">새글</span></span>";
if ($list[$i]['icon_hot']) echo "<span class=\"hot_icon\">H<span class=\"sound_only\">인기글</span></span>";
// if ($list[$i]['link']['count']) { echo "[{$list[$i]['link']['count']}]"; }
// if ($list[$i]['file']['count']) { echo "<{$list[$i]['file']['count']}>"; }
// echo $list[$i]['icon_reply']." ";
// if ($list[$i]['icon_file']) echo " <i class=\"fa fa-download\" aria-hidden=\"true\"></i>" ;
// if ($list[$i]['icon_link']) echo " <i class=\"fa fa-link\" aria-hidden=\"true\"></i>" ;
if ($list[$i]['comment_cnt']) echo "
<span class=\"lt_cmt\">".$list[$i]['wr_comment']."</span>";
?>
<div class="lt_info">
<span class="lt_nick"><?php echo $list[$i]['name'] ?></span>
<span class="lt_date"><?php echo $list[$i]['datetime2'] ?></span>
</div>
</li>
<?php } ?>
<?php if ($list_count == 0) { //게시물이 없을 때 ?>
<li class="empty_li">게시물이 없습니다.</li>
<?php } ?>
</ul>
<a href="<?php echo get_pretty_url($bo_table); ?>" class="lt_more"><span class="sound_only"><?php echo $bo_subject ?></span>더보기</a>
</div>
+36
View File
@@ -0,0 +1,36 @@
@charset "utf-8";
/* 새글 스킨 (latest) */
.pic_lt {position:relative;margin-bottom:20px;background:#fff}
.pic_lt .lat_title {display:block;line-height:45px;font-size:1.2em;color:#253dbe}
.pic_lt .lat_title a {color:#000;display:inline-block;position:relative}
.pic_lt .lt_more {position:absolute;top:11px;right:10px;display:block;width:25px;line-height:25px;color:#aaa;border-radius:3px;text-align:center;}
.pic_lt .lt_more:hover {color:#777}
.pic_lt ul:after {display:block;visibility:hidden;clear:both;content:""}
.pic_lt ul {margin: 0 -10px}
.pic_lt li {float:left;width:25%;padding:0 10px}
.pic_lt li.gallery_li:nth-child(4n+1) {clear: both!important}
.pic_lt li .lt_img {margin:5px 0;display:block}
.pic_lt li .lt_img img, .pic_lt li .lt_img video {width:100%;height:auto}
.pic_lt li a:hover {color:#a22121}
.pic_lt li .fa-heart {color:#ff0000}
.pic_lt li .fa-lock {display:inline-block;line-height:14px;width:16px;color:#4f818c;background:#cbe3e8;text-align:center;border-radius:2px;font-size:12px;border:1px solid #cbe3e8;vertical-align:middle}
.pic_lt li .new_icon {display:inline-block;width:16px;line-height:16px;font-size:0.833em;color:#23db79;background:#b9ffda;text-align:center;border-radius:2px;margin-left:2px;font-weight:bold;vertical-align:middle}
.pic_lt li .hot_icon {display:inline-block;width:16px;line-height:16px;font-size:0.833em;color:#ff0000;background:#ffb9b9;text-align:center;border-radius:2px;vertical-align:middle}
.pic_lt li .fa-caret-right {color:#bbb}
.pic_lt li .fa-download {display:inline-block;width:16px;line-height:16px;font-size:0.833em;color:#daae37;background:#ffefb9;text-align:center;border-radius:2px;vertical-align:middle}
.pic_lt li .fa-link {display:inline-block;width:16px;line-height:16px;font-size:0.833em;color:#b451fd;background:#edd3fd;text-align:center;border-radius:2px;vertical-align:middle}
.pic_lt .profile_img img{border-radius:50%}
.lt_info {padding:10px 0}
.lt_info .lt_nick {}
.lt_info .lt_date {color:#888}
.pic_lt .empty_li {line-height:145px ;color:#666;text-align:center;padding:0}
.pic_lt .empty_li:before {background:none;padding:0}
.pic_lt .lt_cmt {background:#e9eff5;color:#3a8afd;font-size:11px;height:16px;line-height:16px;padding:0 5px;border-radius:3px;vertical-align:middle}
.pic_lt .lt_more {position:absolute;top:11px;right:0;display:block;width:40px;line-height:25px;color:#3a8afd;border-radius:3px;text-align:center}
.pic_lt .lt_more:hover {color:#777}
+75
View File
@@ -0,0 +1,75 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
include_once(G5_LIB_PATH.'/thumbnail.lib.php');
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
add_stylesheet('<link rel="stylesheet" href="'.$latest_skin_url.'/style.css">', 0);
$thumb_width = 297;
$thumb_height = 212;
$list_count = (is_array($list) && $list) ? count($list) : 0;
?>
<div class="pic_li_lt">
<h2 class="lat_title"><a href="<?php echo get_pretty_url($bo_table); ?>"><?php echo $bo_subject ?></a></h2>
<ul>
<?php
for ($i=0; $i<$list_count; $i++) {
$img_link_html = '';
$wr_href = get_pretty_url($bo_table, $list[$i]['wr_id']);
if( $i === 0 ) {
$thumb = get_list_thumbnail($bo_table, $list[$i]['wr_id'], $thumb_width, $thumb_height, false, true);
if($thumb['src']) {
$img = $thumb['src'];
} else {
$img = G5_IMG_URL.'/no_img.png';
$thumb['alt'] = '이미지가 없습니다.';
}
$img_content = '<img src="'.$img.'" alt="'.$thumb['alt'].'" >';
$img_link_html = '<a href="'.$wr_href.'" class="lt_img" >'.run_replace('thumb_image_tag', $img_content, $thumb).'</a>';
}
?>
<li>
<?php echo $img_link_html; ?>
<?php
if ($list[$i]['icon_secret']) echo "<i class=\"fa fa-lock\" aria-hidden=\"true\"></i><span class=\"sound_only\">비밀글</span> ";
echo "<a href=\"".$wr_href."\" class=\"pic_li_tit\"> ";
if ($list[$i]['is_notice'])
echo "<strong>".$list[$i]['subject']."</strong>";
else
echo $list[$i]['subject'];
echo "</a>";
if ($list[$i]['icon_new']) echo "<span class=\"new_icon\">N<span class=\"sound_only\">새글</span></span>";
if ($list[$i]['icon_hot']) echo "<span class=\"hot_icon\">H<span class=\"sound_only\">인기글</span></span>";
// if ($list[$i]['link']['count']) { echo "[{$list[$i]['link']['count']}]"; }
// if ($list[$i]['file']['count']) { echo "<{$list[$i]['file']['count']}>"; }
//echo $list[$i]['icon_reply']." ";
// if ($list[$i]['icon_file']) echo " <i class=\"fa fa-download\" aria-hidden=\"true\"></i>" ;
//if ($list[$i]['icon_link']) echo " <i class=\"fa fa-link\" aria-hidden=\"true\"></i>" ;
if ($list[$i]['comment_cnt']) echo "
<span class=\"lt_cmt\">".$list[$i]['wr_comment']."</span>";
?>
<div class="lt_info">
<span class="lt_nick"><?php echo $list[$i]['name'] ?></span>
<span class="lt_date"><?php echo $list[$i]['datetime2'] ?></span>
</div>
</li>
<?php } ?>
<?php if ($list_count == 0) { //게시물이 없을 때 ?>
<li class="empty_li">게시물이 없습니다.</li>
<?php } ?>
</ul>
<a href="<?php echo get_pretty_url($bo_table); ?>" class="lt_more"><span class="sound_only"><?php echo $bo_subject ?></span>더보기</a>
</div>
+37
View File
@@ -0,0 +1,37 @@
@charset "utf-8";
/* 새글 스킨 (latest) */
.pic_li_lt {position:relative;width:33.3333%;float:left;padding:0 10px;background:#fff}
.pic_li_lt .lat_title {display:block;line-height:45px;font-size:1.2em;color:#253dbe}
.pic_li_lt .lat_title a {color:#000;display:inline-block;position:relative}
.latest_top_wr .pic_li_lt:nth-child(3n+1) {clear: both!important}
.pic_li_lt .lt_more {position:absolute;top:11px;right:10px;display:block;width:25px;line-height:25px;color:#aaa;border-radius:3px;text-align:center}
.pic_li_lt .lt_more:hover {color:#777}
.pic_li_lt ul:after {display:block;visibility:hidden;clear:both;content:""}
.pic_li_lt li {border-bottom:1px solid #e5ecee;margin-bottom:10px}
.pic_li_lt li .lt_img {display:none}
.pic_li_lt li:first-child .lt_img {display:block;margin:0 0 10px;}
.pic_li_lt li:first-child .lt_img img, .pic_li_lt li .lt_img video {width:100%;height:auto}
.pic_li_lt li .pic_li_tit {font-weight:bold;font-size:1.2em;line-height:20px;vertical-align:middle}
.pic_li_lt li .fa-heart {color:#ff0000}
.pic_li_lt li .fa-lock {display:inline-block;line-height:14px;width:16px;color:#4f818c;background:#cbe3e8;text-align:center;border-radius:2px;font-size:12px;border:1px solid #cbe3e8;vertical-align:middle}
.pic_li_lt li .new_icon {display:inline-block;width:16px;line-height:16px;font-size:0.833em;color:#23db79;background:#b9ffda;text-align:center;border-radius:2px;margin-left:2px;font-weight:bold;vertical-align:middle}
.pic_li_lt li .hot_icon {display:inline-block;width:16px;line-height:16px;font-size:0.833em;color:#ff0000;background:#ffb9b9;text-align:center;border-radius:2px;vertical-align:middle}
.pic_li_lt li .fa-caret-right {color:#bbb}
.pic_li_lt li .fa-download {display:inline-block;width:16px;line-height:16px;font-size:0.833em;color:#daae37;background:#ffefb9;text-align:center;border-radius:2px;vertical-align:middle}
.pic_li_lt li .fa-link {display:inline-block;width:16px;line-height:16px;font-size:0.833em;color:#b451fd;background:#edd3fd;text-align:center;border-radius:2px;vertical-align:middle}
.pic_li_lt .profile_img img{border-radius:50%}
.lt_info {padding:10px 0}
.lt_info .lt_nick {}
.lt_info .lt_date {color:#888}
.pic_li_lt .empty_li {line-height:145px;color:#666;text-align:center;padding:0}
.pic_li_lt .empty_li:before {background:none;padding:0}
.pic_li_lt .lt_cmt {background:#e9eff5;color:#3a8afd;font-size:11px;height:16px;line-height:16px;padding:0 5px;border-radius:3px;vertical-align:middle}
.pic_li_lt .lt_more {position:absolute;top:11px;right:10px;display:block;width:40px;line-height:25px;color:#3a8afd;border-radius:3px;text-align:center}
.pic_li_lt .lt_more:hover {color:#777}
Binary file not shown.

After

Width:  |  Height:  |  Size: 107 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 B

@@ -0,0 +1,41 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
add_stylesheet('<link rel="stylesheet" href="'.$latest_skin_url.'/style.css">', 0);
?>
<div class="lat">
<strong class="lat_title"><i class="fa fa-list-ul" aria-hidden="true"></i> <a href="<?php echo G5_BBS_URL ?>/board.php?bo_table=<?php echo $bo_table ?>"><?php echo $bo_subject ?></a></strong>
<ul>
<?php for ($i=0; $i<count($list); $i++) { ?>
<li>
<?php
//echo $list[$i]['icon_reply']." ";
echo "<a href=\"".$list[$i]['href']."\">";
if ($list[$i]['is_notice'])
echo "<strong>".$list[$i]['subject']."</strong>";
else
echo $list[$i]['subject'];
if ($list[$i]['comment_cnt'])
echo $list[$i]['comment_cnt'];
echo "</a>";
// if ($list[$i]['link']['count']) { echo "[{$list[$i]['link']['count']}]"; }
// if ($list[$i]['file']['count']) { echo "<{$list[$i]['file']['count']}>"; }
if (isset($list[$i]['icon_new']) && $list[$i]['icon_new']) echo " <span class=\"new_icon\">NEW</span>";
//if (isset($list[$i]['icon_hot'])) echo " <i class=\"fa fa-heart\" aria-hidden=\"true\"></i>" ;
//if (isset($list[$i]['icon_file'])) echo " <i class=\"fa fa-download\" aria-hidden=\"true\"></i>" ;
//if (isset($list[$i]['icon_link'])) echo " <i class=\"fa fa-link\" aria-hidden=\"true\"></i>" ;
//if (isset($list[$i]['icon_secret'])) echo " <i class=\"fa fa-lock\" aria-hidden=\"true\"></i>" ;
?>
</li>
<?php } ?>
<?php if (count($list) == 0) { //게시물이 없을 때 ?>
<li>게시물이 없습니다.</li>
<?php } ?>
</ul>
</div>
+12
View File
@@ -0,0 +1,12 @@
@charset "utf-8";
/* 새글 스킨 (latest) */
.lat {position:relative;}
.lat ul {margin:0 0 10px;padding:0;list-style:none;border:1px solid #e5e5e5}
.lat li {border-top:1px solid #f3f3f3;padding:10px}
.lat li:first-child{border:0}
.lat li i{color:#9da4bc}
.lat li .fa-heart{color:#ff0000}
.lat li .new_icon{display:inline-block;padding: 0 3px;line-height:14px ;font-size:0.833em;color:#fff;background:#c56bed}
.lat li .cnt_cmt{color:#ff3970}
.lat_title {display:block;padding:10px 0 8px;font-size:1.167em}
.lat_more {position:absolute;top:10px;right:0;}
+20
View File
@@ -0,0 +1,20 @@
<?php
//if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
include_once("../../../common.php");
extract($_REQUEST);
//아이디 중복체크
if( $ActionKind =="dupl_check" && isset($reg_mb_id) ){
$sql = "select count(*) cnt from g5_member where mb_id = TRIM('$reg_mb_id')";
$mb = sql_fetch($sql);
echo $mb["cnt"];
exit();
}
?>
+18
View File
@@ -0,0 +1,18 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
if (!function_exists('eng_img_url')) {
function eng_img_url($path = '')
{
$baseUrl = '/eng/img';
$cdnBaseUrl = '';
if ($cdnBaseUrl !== '') {
$baseUrl = rtrim($cdnBaseUrl, '/');
}
$path = ltrim((string) $path, '/');
return $path === '' ? $baseUrl : $baseUrl . '/' . $path;
}
}
+407
View File
@@ -0,0 +1,407 @@
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-STZ2R5Q7HG"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-STZ2R5Q7HG');
</script>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>구매하기</title>
<link rel="stylesheet" href="../css/reset.css"/>
<link rel="stylesheet" href="../css/font.css"/>
<link rel="stylesheet" href="../css/style.css"/>
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css"/>
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script src="https://unpkg.com/lenis@1.1.9/dist/lenis.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/lenis@1.1.9/dist/lenis.css">
<script type="text/javascript" src="../js/jquery-3.6.1.min.js"></script>
<script type="text/javascript" src="../js/jquery.mousewheel.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="../js/popup.js"></script>
</head>
<body>
<div class="wrapper">
<input id="hid_mb_id" name="hid_mb_id" type="hidden" value="<?echo $_SESSION['session_id'];?>">
<!-- HEADER -->
<?php include_once($member_skin_path.'/main_header.skin.php'); ?>
<!-- //Header -->
<!-- 모든 팝업페이지 경로 -->
<?php
include_once($member_skin_path.'/login.skin.php');
include_once($member_skin_path.'/mypage01.skin.php');
include_once($member_skin_path.'/register.skin.php');
include_once($member_skin_path.'/register_form.skin.php');
include_once($member_skin_path.'/mypage02.skin.php');
include_once($member_skin_path.'/mypage03.skin.php');
include_once($member_skin_path.'/sitemap.skin.php');
include_once($member_skin_path.'/privacy.skin.php');
include_once($member_skin_path.'/password_lost.skin.php');
?>
<!-- //모든 팝업페이지 경로 -->
<!-- 컨텐츠 시작 -->
<div class="container buy">
<section class="intro">
<div class="top js__dark">
<h2 data-aos="fade-down" data-aos-duration="1000">Contact</h2>
<span>EG-BIM Purchase Inquiries & Product Information</span>
</div>
</section>
<section class="contents_wrap">
<div class="ask_area">
<div class="ask_l">
<span class="mid_tit">Experience the next-generation <br>S/W with <font class="egbim k">EG-BIM S/W</font></span>
</div>
<div class="ask_r">
<span class="sub_text"><em>License usage <font style="color: var(--color-orange)">may be restricted</font></em> if duplicate licenses are detected.</span>
<div class="ask_btn">
<a href="/eng/bbs/descope_qa_list.php" class="btn_ask" ><i></i>EG-BIM Purchase Inquiry</a>
<!-- <a href="#" onclick="alert('문의 게시판은 준비중입니다.'); return false;" class="btn_ask" ><i></i>EG-BIM 구매 문의</a> -->
<a href="../download/EGBIM_leaflet_v01.pdf" download class="btn_brochure"><i></i>Brochure</a>
<a href="../download/EGBIM_manual.pdf" download class="btn_manual"><i></i>Manual</a>
</div>
</div>
</div>
<div class="video_area" data-aos="fade-right" data-aos-duration="1000">
<div class="vod_wrap"><video autoplay muted loop playsinline><source src="../img/EGBIM_buy.mp4"></video></div>
<div class="contact_area">
<p>
<span class="mid_tit">Purchase Consultation</span>
<span class="sub_text">Contact the EG-BIM team directly</span>
</p>
<div class="line"></div>
<ul>
<li class="tel"><i></i><a href="tel:0214147434">02 - 2141 - 7434</a></li>
<li class="mail"><i></i>baroncs@baroncs.co.kr</li>
</ul>
</div>
</div>
</section>
</div>
<!-- //컨텐츠 시작 -->
<!-- FOOTER -->
<?php include_once($member_skin_path.'/main_footer.skin.php'); ?>
<!-- //FOOTER -->
</div>
<script>
AOS.init();
const lenis = new Lenis()
lenis.on('scroll', (e) => {
// console.log(e)
})
lenis.on('scroll', ScrollTrigger.update)
gsap.ticker.add((time)=>{
lenis.raf(time * 1000)
})
gsap.ticker.lagSmoothing(0)
</script>
</body>
<script>
$(function(){
// footer family site toggle
$('.family_btn').click(function(e){
e.stopPropagation();
$('.family_list, .family_btn').toggleClass('family_on');
});
$(document).click(function(e){
if(!$(e.target).closest('.family_wrap').length){
$('.family_list, .family_btn').removeClass('family_on');
}
});
});
// 회원 탈퇴
function member_leave() {
if (confirm("회원에서 탈퇴 하시겠습니까?"))
location.href = '<?php echo G5_BBS_URL ?>/member_leave.php';
}
// 회원 탈퇴
let x = document.cookie;
if(x.includes("tmp_1=John")){
deleteCookie("tmp_1");
$('#pop_mypage02').show();
}
function deleteCookie(name) {
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng;";
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/bbs;";
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/faq;";
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/qa;";
}
function getCookie(cname) {
let name = cname + "=";
let decodedCookie = decodeURIComponent(document.cookie);
let ca = decodedCookie.split(';');
for(let i = 0; i <ca.length; i++) {
let c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
}
//descope 로그인, 로그아웃 js
function updateHeaderMenu() {
var isLoggedIn = !!sessionStorage.getItem("sessionJwt");
// role 체크 예시 (로그인 시 저장해놓은 값)
var isAdmin = sessionStorage.getItem('userRole') === 'super';
if (isLoggedIn) {
$('.my_join2, .my_login2').show();
$('.my_join, .my_login').hide();
// 마이페이지/관리자 메뉴 동적 출력
if (isAdmin) {
$('#my_join2').html("<a href='http://eg-bim.com/eng/adm/index.php' target='_blank'>관리페이지</a>");
} else {
$('#my_join2').html("<a href='javascript:mypage03();'>My Page</a>");
}
} else {
$('.my_join2, .my_login2').hide();
$('.my_join, .my_login').show();
$('#my_join2').html(""); // 혹시모를 내용 초기화
}
}
function descopeLogout() {
fetch('/eng/skin/member/basic/descope_logout.php', {
method: 'POST',
credentials: 'include' // PHPSESSID 쿠키 전송
})
.then(res => {
if (!res.ok) throw new Error('서버 로그아웃 실패');
// 1) 로컬 저장소 정리
// sessionStorage.removeItem("refreshJwt");
// sessionStorage.removeItem("sessionJwt");
// sessionStorage.removeItem("userRole");
// sessionStorage.removeItem("userName");
// sessionStorage.removeItem("loginId");
sessionStorage.clear();
localStorage.clear();
// 2) UI 갱신
updateHeaderMenu();
// 3) 로그인 페이지로 이동
window.location.href = '/eng/index.php';
})
.catch(err => {
console.error(err);
alert('로그아웃 중 오류가 발생했습니다.');
});
}
$(document).ready(function() {
// 기존에 있던 updateHeaderMenu() 호출 뒤에
$('#my_login2 a').off('click').on('click', function(e){
e.preventDefault();
descopeLogout();
});
});
$(document).ready(function() {
updateHeaderMenu();
// (필요하다면, 로그인 성공 후에도 항상 updateHeaderMenu(); 호출)
});
//descope login
$('#flogin button[type=submit]').click(function(e){
e.preventDefault();
let mb_id = $('#login_id').val();
let mb_password = $('#login_pw').val();
$.ajax({
url : '/eng/skin/member/basic/descope_login.php',
data : {
'mb_id' : mb_id,
'mb_password' : mb_password
},
type : "POST",
dataType : "json",
success : function(res){
if(res.status === "ok") {
// 토큰 저장
// sessionStorage.setItem("refreshJwt", res.refreshJwt);
sessionStorage.setItem("sessionJwt", res.sessionJwt);
// ✅ 사용자 정보 저장
if (res.user) {
sessionStorage.setItem("loginId", res.user.loginIds?.[0] || '');
sessionStorage.setItem("userName", res.user.name || '');
sessionStorage.setItem("company", res.user.customAttributes?.company || '');
sessionStorage.setItem("familyCompany", res.user.customAttributes?.familyCompany || '');
sessionStorage.setItem("position", res.user.customAttributes?.position || '');
sessionStorage.setItem("team", res.user.customAttributes?.team || '');
sessionStorage.setItem("familyUniqueKey", res.user.customAttributes?.familyUniqueKey || '');
sessionStorage.setItem("phone", res.user.phone || '');
}
// ✅ 추가: 관리자 등 정보 저장
if(res.user && res.user.roleNames && res.user.roleNames[0])
sessionStorage.setItem("userRole", res.user.roleNames[0]);
else
sessionStorage.removeItem("userRole");
// ✅ 로그인 후 메뉴 갱신
updateHeaderMenu();
// UI 처리
$('.popup_wrap').hide();
$('body').css('overflow', '');
lenis.start();
// alert('로그인 하셨습니다.');
} else {
alert(res.message || "로그인 실패");
// 🔴 실패 횟수에 따라 안내 배너 교체
if (res.failCount && res.failCount >= 8) {
updateLoginBanner("fail");
}
}
},
error : function(err){
alert(err.statusText || "통신 오류");
}
});
});
// ✅ 배너 교체 함수
function updateLoginBanner(type = "default") {
const $banner = $('#login_notice_banner');
if (!$banner.length) return;
if (type === "default") {
$banner.css({ background: "#063e01ff", color: "#fff" });
$banner.find("strong").text("[로그인 시스템 변경 안내]");
$banner.find("p.left").html(`
더 나은 보안을 위해 2025년 8월 8일부터 로그인 시스템이 변경되었습니다.<br>
기존 회원 또한 신규 시스템에 맞춰 재가입을 진행해주시기 바랍니다.
`);
$banner.find("p:last").html(`※ 로그인 및 가입 관련 문의: <strong>010-8721-7453</strong>`);
}
if (type === "fail") {
$banner.css({ background: "#6a0202ff", color: "#faf6f6ff" });
$banner.find("strong").text("[로그인 시도 제한 안내]");
$banner.find("p.left").html(`
비밀번호 입력을 <strong>7회 이상 연속 실패</strong>하셨습니다.<br>
<strong>8번째 시도부터 3분 대기</strong>가 적용됩니다.<br>
10회 이상 실패 시 계정이 잠금 처리됩니다.
`);
$banner.find("p:last").text("");
}
}
//회원가입 약관동의
// $('#fregister button[type=submit]').click(function(e){
// e.preventDefault();
// let agree11 = $('#agree11').val();
// let agree21 = $('#agree21').val();
// $.ajax({
// url : '<?php echo G5_URL ?>/bbs/register_form.php',
// type : "POST",
// datatype : "json",
// contentType: 'application/json; charset=utf-8',
// data : {
// 'agree11' : agree11,
// 'agree21' : agree21
// },
// success : function(data){
// var ss='';
// for(i=0; i<data.length; i++){
// ss=ss + data[i];
// }
// },
// error : function(err){
// alert(err);
// }
// });
// });
// 이지빔 프로그램 회원가입 url 쿼리스트링 파싱 함수
function getQueryString(name) {
const intro = document.querySelector('.intro_wrap');
intro.style.display = "none";
const mainMask = document.querySelector('.main_mask');
mainMask.classList.add('skip');
// mainMask.style.aimation = 'none';
const urlParams = new URLSearchParams(window.location.search);
return urlParams.get(name);
}
$(document).ready(function() {
const popupParam = getQueryString('popup');
if (popupParam === 'signup') {
console.log('쿼리 감지: signup → 회원가입 팝업 자동 오픈 시도');
$('#pop_agreement').show(); // 팝업 보여주기
// 스크롤 잠금 (사용 중이면)
$('body').css('overflow', 'hidden');
if (typeof lenis !== 'undefined') {
lenis.stop();
}
}
// 팝업 닫기 버튼 이벤트 연결
$('#pop_agreement .btn_close').on('click', function() {
$('#pop_agreement').hide();
$('body').css('overflow', '');
if (typeof lenis !== 'undefined') {
lenis.start();
}
});
});
//이지빔 프로그램 비밀번호 재설정 url 쿼리스트링 파싱 함수
$(document).ready(function() {
const urlParams = new URLSearchParams(window.location.search);
const popup = urlParams.get('popup');
const token = urlParams.get('t');
if (popup === 'pwreset') {
// 팝업 전체 열기
$('#pop_search').show();
$('body').css('overflow', 'hidden');
// 내부 컨텐츠 모두 숨기기
$('#pop_search .popup_contents_wrap').hide();
if (token) {
// 토큰이 있으면 비밀번호 재설정 단계
if (!sessionStorage.getItem('pwreset_shown')) {
$('#password_reset').show();
sessionStorage.setItem('pwreset_shown', '1');
}
} else {
// 토큰이 없으면 아이디 입력 단계 (첫 번째 .popup_contents_wrap)
$('#pop_search .popup_contents_wrap').first().show();
}
}
// 닫기 버튼
$('#pop_search .btn_close').on('click', function() {
$('#pop_search').hide();
$('body').css('overflow', '');
});
});
</script>
@@ -0,0 +1,159 @@
<?php
// header('Content-Type: application/json; charset=utf-8');
// ini_set('display_errors', 1);
// error_reporting(E_ALL);
// // 수신
// $email = trim($_POST['email'] ?? '');
// // $email = 'sdi9429@naver.com';
// if (!$email) {
// echo json_encode([
// 'status' => 'error',
// 'message' => '이메일이 전달되지 않았습니다.'
// ]);
// exit;
// }
// // Descope 설정
// $management_key = 'K32l5ORmzy32OvaaPvpdZsMY3JmKQb7a3vvrl10PgjlJUGk3K7EssMH3uW5VGQSbrgtEdPj'; // 예: P2w0N5fY1K...
// $project_id = 'P2wON5fy1K6kyia269VpeIzYP8oP'; // 예: PRJ-xxxx
// // API URL
// $url = 'https://api.descope.com/v1/mgmt/user?loginId=' . urlencode($email);
// // CURL 호출
// $ch = curl_init($url);
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// curl_setopt($ch, CURLOPT_HTTPHEADER, [
// "Authorization: Bearer {$project_id}:{$management_key}",
// "Content-Type: application/json"
// ]);
// // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
// $response = curl_exec($ch);
// $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// $curl_error = curl_error($ch);
// curl_close($ch);
// $response_json = json_decode($response, true);
// // 처리 로직
// if ($http_code === 200 && isset($response_json['user'])) {
// // 아이디가 이미 존재 (중복)
// echo json_encode([
// 'status' => 'duplicate',
// 'message' => '이미 등록된 이메일입니다.'
// ]);
// } elseif ($http_code === 404) {
// // 아이디가 존재하지 않음 (사용 가능)
// echo json_encode([
// 'status' => 'ok',
// 'message' => '사용 가능한 이메일입니다.'
// ]);
// } else {
// // 기타 오류
// echo json_encode([
// 'status' => 'error',
// 'message' => 'Descope API 호출 실패',
// 'http_code' => $http_code,
// 'error_detail' => $response_json,
// 'curl_error' => $curl_error
// ]);
// }
// exit;
?>
<?php
header('Content-Type: application/json; charset=utf-8');
ini_set('display_errors', 1);
error_reporting(E_ALL);
// 수신
$email = trim($_POST['email'] ?? '');
if (!$email) {
echo json_encode([
'status' => 'error',
'message' => '이메일이 전달되지 않았습니다.'
]);
exit;
}
// Descope 설정
$management_key = 'K32l5ORmzy32OvaaPvpdZsMY3JmKQb7a3vvrl10PgjlJUGk3K7EssMH3uW5VGQSbrgtEdPj';
$project_id = 'P2wON5fy1K6kyia269VpeIzYP8oP';
// API URL
$url = 'https://api.descope.com/v1/mgmt/user?loginId=' . urlencode($email);
// CURL 호출
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer {$project_id}:{$management_key}",
"Content-Type: application/json"
]);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curl_error = curl_error($ch);
curl_close($ch);
$response_json = json_decode($response, true);
// ================================
// 존재하는 사용자일 때
// ================================
if ($http_code === 200 && isset($response_json['user'])) {
$user = $response_json["user"];
// 비밀번호 여부
$hasPassword = $user["providerInfo"]["email"]["password"] ?? false;
// 추가정보 입력 여부 (completeForm)
$completeForm = $user["customAttributes"]["completeForm"] ?? false;
// -------------------------
// 미완성 사용자 감지!!
// -------------------------
if (!$hasPassword && !$completeForm) {
echo json_encode([
'status' => 'incomplete',
'message' => '미완성 사용자입니다. 추가정보 입력이 필요합니다.',
'email' => $email
]);
exit;
}
// 완성된 사용자 → 재가입 불가
echo json_encode([
'status' => 'duplicate',
'message' => '이미 등록된 이메일입니다.'
]);
exit;
}
// ================================
// 신규 사용자 (404)
// ================================
if ($http_code === 404) {
echo json_encode([
'status' => 'ok',
'message' => '사용 가능한 이메일입니다.'
]);
exit;
}
// ================================
// 기타 오류
// ================================
echo json_encode([
'status' => 'error',
'message' => 'Descope API 호출 실패',
'http_code' => $http_code,
'error_detail' => $response_json,
'curl_error' => $curl_error
]);
exit;
?>
+131
View File
@@ -0,0 +1,131 @@
<?php
session_start();
function set_descope_session_cookies(array $user): void {
$expire = time() + 86400;
$cookieOptions = [
'expires' => $expire,
'path' => '/',
'samesite' => 'Lax',
];
$customAttributes = $user['customAttributes'] ?? [];
$roleNames = $user['roleNames'] ?? [];
setcookie('descope_login_id', (string)($user['loginIds'][0] ?? ''), $cookieOptions);
setcookie('descope_user_id', (string)($user['userId'] ?? ''), $cookieOptions);
setcookie('descope_user_name', (string)($user['name'] ?? ''), $cookieOptions);
setcookie('descope_user_email', (string)($user['email'] ?? ''), $cookieOptions);
setcookie('descope_user_phone', (string)($user['phone'] ?? ''), $cookieOptions);
setcookie('descope_custom_attributes', base64_encode(json_encode($customAttributes, JSON_UNESCAPED_UNICODE)), $cookieOptions);
setcookie('descope_role_names', base64_encode(json_encode($roleNames, JSON_UNESCAPED_UNICODE)), $cookieOptions);
}
$email = trim($_POST['mb_id'] ?? '');
$password = trim($_POST['mb_password'] ?? '');
if (!$email || !$password) {
echo json_encode(['status'=>'fail', 'message'=>'아이디와 비밀번호는 필수입력입니다.']);
exit;
}
$descope_project_id = "P2wON5fy1K6kyia269VpeIzYP8oP";
$api_url = "https://api.descope.com/v1/auth/password/signin";
$data = [
"loginId" => $email,
"password" => $password,
// "loginOptions" => [ ... ] // 옵션 필요시
];
$headers = [
'Content-Type: application/json',
'Authorization: Bearer ' . $descope_project_id,
];
$ch = curl_init($api_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$res_data = json_decode($response, true);
if ($http_code === 200 && isset($res_data['sessionJwt'])) {
// 로그인 성공 → 실패횟수 초기화
$_SESSION['login_fail_count'] = 0;
//session으로도 저장
$_SESSION['user'] = $res_data['user']; // userId, email 등
$_SESSION['sessionJwt'] = $res_data['sessionJwt'];
$_SESSION['refreshJwt'] = $res_data['refreshJwt'];
set_descope_session_cookies($res_data['user'] ?? []);
echo json_encode([
'status' => 'ok',
'sessionJwt' => $res_data['sessionJwt'] ?? '',
// 'refreshJwt' => $res_data['refreshJwt'] ?? '',
'user' => $res_data['user'] ?? [],
'session' => $_SESSION,
]);
// } else {
// // $msg = $res_data['errorDescription'] ?? '로그인 실패';
// // echo json_encode(['status'=>'fail', 'message'=>$msg]);
// // Descope 에러 메시지
// $errorMsg = $res_data['errorDescription']
// ?? $res_data['errorMessage']
// ?? '로그인에 실패했습니다.';
// // 2) 한글 매핑
// if (stripos($errorMsg, 'invalid signin credentials') !== false) {
// $msg = '비밀번호가 일치하지 않습니다.';
// } elseif (stripos($errorMsg, 'user not found') !== false) {
// $msg = "계정을 찾을 수 없습니다.\n로그인에 문제가 있으신 경우 010-8721-7453으로 문의해 주세요.";
// } else {
// $msg = $errorMsg;
// }
// echo json_encode([
// 'status' => 'fail',
// 'message' => $msg
// ]);
// }
} else {
// 실패 → 카운트 증가
if (!isset($_SESSION['login_fail_count'])) {
$_SESSION['login_fail_count'] = 0;
}
$_SESSION['login_fail_count']++;
$failCount = $_SESSION['login_fail_count'];
// 에러 메시지 가공
$errorMsg = $res_data['errorDescription']
?? $res_data['errorMessage']
?? '로그인에 실패했습니다.';
// 한글 매핑
if (stripos($errorMsg, 'Login is temporarily locked') !== false) {
$msg = "Login is temporarily locked. Please try again later.";
} elseif (stripos($errorMsg, 'account locked') !== false) {
$msg = "Your account has been locked due to too many login attempts.\nPlease contact the administrator.";
} elseif (stripos($errorMsg, 'invalid signin credentials') !== false) {
$msg = "The password does not match.";
} elseif (stripos($errorMsg, 'user not found') !== false) {
$msg = "The account could not be found.\nIf you are experiencing login issues, please contact +82-2-2141-7434";
} else {
$msg = $errorMsg;
}
echo json_encode([
'status' => 'fail',
'message' => $msg,
'failCount' => $failCount
]);
}
exit;
?>
+35
View File
@@ -0,0 +1,35 @@
<?php
// descope_logout.php
// session_start();
// $_SESSION = [];
// if (ini_get("session.use_cookies")) {
// $p = session_get_cookie_params();
// setcookie(session_name(), '', time()-42000,
// $p['path'], $p['domain'], $p['secure'], $p['httponly']
// );
// }
// session_destroy();
// // ✅ 그누보드 세션 변수도 제거
// unset($_SESSION['ss_mb_id'], $_SESSION['ss_mb_level']);
// http_response_code(200);
// echo json_encode(['status'=>'ok']);
// exit;
session_start();
$_SESSION = [];
foreach (['PHPSESSID', 'G5sessphp', 'descope_login_id', 'descope_user_id', 'descope_user_name', 'descope_user_email', 'descope_user_phone', 'descope_custom_attributes', 'descope_role_names'] as $cookieName) {
setcookie($cookieName, '', [
'expires' => time() - 42000,
'path' => '/',
'samesite' => 'Lax',
]);
}
session_destroy();
http_response_code(200);
echo json_encode(['status'=>'ok']);
exit;
?>
@@ -0,0 +1,108 @@
<?php
// ini_set('display_errors', 1);
// ini_set('display_startup_errors', 1);
// error_reporting(E_ALL);
// header('Content-Type: application/json');
// // require_once './descope_config.php';
// $email = trim($_POST['email'] ?? '');
// $password = trim($_POST['password'] ?? '');
// $refreshJwt = trim($_POST['refreshJwt'] ?? '');
// if (!$email || !$password || !$refreshJwt) {
// echo json_encode(['status' => 'fail', 'message' => '필수값 없음']);
// exit;
// }
// // Descope API - 비밀번호 변경 엔드포인트 사용
// $url = "https://api.descope.com/v1/auth/password/update";
// $data = [
// // "loginId" => $email,
// "newPassword" => $password,
// ];
// $ch = curl_init($url);
// curl_setopt($ch, CURLOPT_HTTPHEADER, [
// "Authorization: Bearer " . $refreshJwt,
// "Content-Type: application/json"
// ]);
// curl_setopt($ch, CURLOPT_POST, 1);
// curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// $response = curl_exec($ch);
// $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// curl_close($ch);
// if ($code == 200) {
// echo json_encode(['status' => 'ok']);
// } else {
// $resData = json_decode($response, true);
// $msg = $resData['errorDescription'] ?? '비밀번호 변경 실패';
// echo json_encode(['status' => 'fail', 'message' => $msg, 'raw' => $response]);
// }
// ini_set('display_errors', 1);
// ini_set('display_startup_errors', 1);
// error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
header('Content-Type: application/json');
// require_once './descope_config.php';
$projectId = 'P2wON5fy1K6kyia269VpeIzYP8oP';
$email = trim($_POST['email'] ?? '');
$password = trim($_POST['password'] ?? '');
$refreshJwt = trim($_POST['refreshJwt'] ?? '');
// if (!$email || !$password || !$refreshJwt) {
// echo json_encode(['status' => 'fail', 'message' => '필수값 없음']);
// exit;
// }
if (!$email || !$password || !$refreshJwt) {
echo json_encode([
'status' => 'fail',
'message' => '필수값 없음',
'debug' => [
'email' => $email,
'password' => $password,
'refreshJwt' => $refreshJwt // <<< 확인!
]
]);
exit;
}
// Descope API - 비밀번호 변경 엔드포인트 사용
$url = "https://api.descope.com/v1/auth/password/update";
$data = [
"loginId" => $email,
"newPassword" => $password,
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer {$projectId}:{$refreshJwt}",
"Content-Type: application/json",
// "x-descope-project-id: $projectId"
]);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($code == 200) {
echo json_encode(['status' => 'ok']);
} else {
$resData = json_decode($response, true);
$msg = $resData['errorDescription'] ?? '비밀번호 변경 실패';
echo json_encode(['status' => 'fail', 'message' => $msg, 'raw' => $response]);
}
?>
@@ -0,0 +1,54 @@
<?php
session_start();
header('Content-Type: application/json; charset=UTF-8');
function set_descope_session_cookies(array $user): void {
$expire = time() + 86400;
$cookieOptions = [
'expires' => $expire,
'path' => '/',
'samesite' => 'Lax',
];
setcookie('descope_login_id', (string)($user['loginIds'][0] ?? ''), $cookieOptions);
setcookie('descope_user_id', (string)($user['userId'] ?? ''), $cookieOptions);
setcookie('descope_user_name', (string)($user['name'] ?? ''), $cookieOptions);
setcookie('descope_user_email', (string)($user['email'] ?? ''), $cookieOptions);
setcookie('descope_user_phone', (string)($user['phone'] ?? ''), $cookieOptions);
setcookie('descope_custom_attributes', base64_encode(json_encode($user['customAttributes'] ?? [], JSON_UNESCAPED_UNICODE)), $cookieOptions);
setcookie('descope_role_names', base64_encode(json_encode($user['roleNames'] ?? [], JSON_UNESCAPED_UNICODE)), $cookieOptions);
}
$loginId = trim((string)($_POST['loginId'] ?? ''));
$sessionJwt = trim((string)($_POST['sessionJwt'] ?? ''));
if ($loginId === '' || substr_count($sessionJwt, '.') !== 2) {
http_response_code(400);
echo json_encode(['status' => 'fail', 'message' => 'invalid session payload']);
exit;
}
$user = [
'userId' => trim((string)($_POST['userId'] ?? $loginId)),
'loginIds' => [$loginId],
'name' => trim((string)($_POST['userName'] ?? $loginId)),
'email' => trim((string)($_POST['email'] ?? $loginId)),
'phone' => trim((string)($_POST['phone'] ?? '')),
'customAttributes' => [
'company' => trim((string)($_POST['company'] ?? '')),
'familyCompany' => trim((string)($_POST['familyCompany'] ?? '')),
'position' => trim((string)($_POST['position'] ?? '')),
'team' => trim((string)($_POST['team'] ?? '')),
'familyUniqueKey' => trim((string)($_POST['familyUniqueKey'] ?? '')),
],
'roleNames' => array_values(array_filter([trim((string)($_POST['userRole'] ?? ''))])),
];
$_SESSION['user'] = $user;
$_SESSION['sessionJwt'] = $sessionJwt;
set_descope_session_cookies($user);
echo json_encode(['status' => 'ok']);
exit;
?>
@@ -0,0 +1,74 @@
<?php
// header('Content-Type: application/json');
// require_once './descope_config.php'; // Descope API 키 등 공통설정
// $email = trim($_POST['email'] ?? '');
// if (!$email) {
// echo json_encode(['status' => 'fail', 'message' => '이메일 없음']);
// exit;
// }
// // Descope OTP 메일 전송 (예: signup/send/otp)
// $url = 'https://api.descope.com/v1/auth/magiclink/email/send'; // API 버전에 맞게!
// $data = [
// "loginId" => $email,
// "user" => ["email" => $email]
// ];
// $ch = curl_init($url);
// curl_setopt($ch, CURLOPT_HTTPHEADER, [
// "Authorization: Bearer " . $DESCOPE_API_KEY,
// "Content-Type: application/json"
// ]);
// curl_setopt($ch, CURLOPT_POST, 1);
// curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// $response = curl_exec($ch);
// $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// curl_close($ch);
// if ($code == 200) {
// echo json_encode(['status' => 'ok']);
// } else {
// echo json_encode(['status' => 'fail', 'message' => 'OTP 발송 실패', 'raw' => $response]);
// }
?>
<?php
header('Content-Type: application/json; charset=utf-8');
$email = $_POST['email'] ?? '';
// $email = 'sdi9429@naver.com';
// $redirectUrl = 'https://eg-bim.com/eng/index.php?popup=pwreset';
if (!$email) exit(json_encode(['status'=>'fail', 'message'=>'이메일 누락']));
$api_key = "P2wON5fy1K6kyia269VpeIzYP8oP";
$url = "https://api.descope.com/v1/auth/password/reset";
$data = [
"loginId" => $email,
"redirectUrl" => 'https://eg-bim.co.kr/eng/index.php?popup=pwreset'
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer {$api_key}",
"Content-Type: application/json"
]);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$res = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code == 200) {
$res_data = json_decode($res, true); // 응답 파싱
$linkId = $res_data['linkId'] ?? '';
echo json_encode([
'status'=>'ok',
'linkId'=>$linkId,
'raw_response'=>$res_data // (디버깅용 전체도 같이 보고 싶으면)
]);
} else {
echo json_encode(['status'=>'fail','message'=>'Failed to send.']);
}
?>
+148
View File
@@ -0,0 +1,148 @@
<?php
// // descope_session.php
// // 1) 에러 출력 (개발용)
// // ini_set('display_errors', 1);
// // error_reporting(E_ALL);
// // 2) 세션 시작 (중복 호출 방지)
// if (session_status() === PHP_SESSION_NONE) {
// session_start();
// }
// // 3) 로그인 검사
// // 로그인 시 $_SESSION['user']['userId'] 와 $_SESSION['user']['loginIds'][0] 를 설정해 두었다면
// // if (empty($_SESSION['user']['userId'])) {
// // // 로그인 필요 알림 후 로그인 페이지로 이동
// // echo <<<HTML
// // <script>
// // alert('Q&A를 이용하시려면 로그인이 필요합니다.');
// // window.location.href = '/egbim/index.php';
// // </script>
// // HTML;
// // exit;
// // }
// // ✅ Descope 로그인 성공 시 g5_member 세션 동기화
// $loginId = $_SESSION['user']['loginIds'][0] ?? '';
// if ($loginId === 'b24014@hanmaceng.co.kr') {
// // g5_member 계정이 이미 존재한다고 가정
// $_SESSION['ss_mb_id'] = $loginId;
// $_SESSION['ss_mb_level'] = 10;
// $is_member = true;
// $is_admin = 'super';
// $member = [
// 'mb_id' => $loginId,
// 'mb_name' => $_SESSION['user']['name'] ?? '관리자',
// 'mb_email' => $_SESSION['user']['email'] ?? '',
// 'mb_level' => 10,
// 'mb_nick' => '관리자',
// ];
// }
// // Descope 로그인 성공 시 (예: descope_session.php 내부)
// if (!empty($_SESSION['user']['loginIds'][0])) {
// $loginId = $_SESSION['user']['loginIds'][0];
// // g5_member 테이블에 계정이 존재한다고 가정
// $_SESSION['ss_mb_id'] = $loginId;
// $_SESSION['ss_mb_level'] = 10; // 관리자 레벨
// // 그누보드 전역 변수 보정
// $is_member = true;
// $is_admin = 'super';
// $member = [
// 'mb_id' => $loginId,
// 'mb_name' => $_SESSION['user']['name'] ?? '관리자',
// 'mb_email' => $_SESSION['user']['email'] ?? '',
// 'mb_level' => 10,
// 'mb_nick' => '관리자',
// ];
// }
// descope_session.php
// 1) 세션 시작
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
if (empty($_SESSION['user']['userId']) && !empty($_COOKIE['descope_login_id'])) {
$customAttributes = json_decode(base64_decode($_COOKIE['descope_custom_attributes'] ?? ''), true);
$roleNames = json_decode(base64_decode($_COOKIE['descope_role_names'] ?? ''), true);
$loginIdFromCookie = trim((string)($_COOKIE['descope_login_id'] ?? ''));
$_SESSION['user'] = [
'userId' => trim((string)($_COOKIE['descope_user_id'] ?? $loginIdFromCookie)),
'loginIds' => $loginIdFromCookie !== '' ? [$loginIdFromCookie] : [],
'name' => trim((string)($_COOKIE['descope_user_name'] ?? '')),
'email' => trim((string)($_COOKIE['descope_user_email'] ?? '')),
'phone' => trim((string)($_COOKIE['descope_user_phone'] ?? '')),
'customAttributes' => is_array($customAttributes) ? $customAttributes : [],
'roleNames' => is_array($roleNames) ? $roleNames : [],
];
}
// 2) 로그인 검사 (비로그인 차단)
// if (empty($_SESSION['user']['userId'])) {
// // 세션 없으면 바로 차단
// session_destroy();
// echo "<script>
// alert('로그인이 필요합니다.');
// // 로그인 팝업 자동 오픈 플래그 전달
// window.location.href = '/egbim/index.php?popup=login';
// </script>";
// exit;
// }
// 3) 로그인 정보 추출
$loginIds = $_SESSION['user']['loginIds'] ?? [];
$loginId = (is_array($loginIds) && !empty($loginIds)) ? $loginIds[0] : '';
$userName = $_SESSION['user']['name'] ?? '';
$userEmail = $_SESSION['user']['email'] ?? '';
// 4) 관리자/일반 사용자 구분
$ADMIN_EMAILS = [
'kjy0426@hanmaceng.co.kr',
'b24014@hanmaceng.co.kr',
'b23065@hanmaceng.co.kr',
'shyeom1@samaneng.com',
'cjy627@hanmaceng.co.kr',
'b23072@hanmaceng.co.kr',
'cozyjin@hanmaceng.co.kr',
'm24031@hanmaceng.co.kr',
'b24051@hanmaceng.co.kr',
'rmsgud1202@hanmaceng.co.kr',
'm21318@hanmaceng.co.kr',
'b25023@hanmaceng.co.kr',
'sdi9429@naver.com',
'junsuy@hanmail.net',
'ilphilo92@gmail.com'
];
// $isAdmin = in_array($loginId, $ADMIN_EMAILS, true);
$isAdmin = $loginId && in_array($loginId, $ADMIN_EMAILS, true);
// ✅ 그누보드 전역 세션 동기화
if ($loginId) {
$_SESSION['ss_mb_id'] = $loginId;
$_SESSION['ss_mb_level'] = $isAdmin ? 10 : 2;
$is_member = true;
$is_admin = $isAdmin ? 'super' : '';
$member = [
'mb_id' => $loginId,
'mb_name' => $userName ?: $loginId,
'mb_email' => $userEmail,
'mb_level' => $_SESSION['ss_mb_level'],
'mb_nick' => $userName ?: $loginId,
];
} else {
// ✅ 비회원: 로그인 세션 없음
$is_member = false;
$is_admin = '';
$member = [];
}
?>
+205
View File
@@ -0,0 +1,205 @@
<?php
// header('Content-Type: application/json; charset=utf-8');
// ini_set('display_errors', 1);
// error_reporting(E_ALL);
// $email = trim($_POST['email'] ?? '');
// $password = trim($_POST['password'] ?? '');
// if (!$email || !$password) {
// echo json_encode(['status' => 'error', 'message' => '이메일 또는 비밀번호가 없습니다.']);
// exit;
// }
// $project_id = 'P2wON5fy1K6kyia269VpeIzYP8oP'; // 너의 Descope 프로젝트 ID
// $url = 'https://api.descope.com/v1/auth/password/signup';
// $data = [
// "email" => $email,
// "password" => $password
// ];
// $ch = curl_init($url);
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// curl_setopt($ch, CURLOPT_POST, true);
// curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
// "loginId" => $email,
// "user" => [
// "loginId" => $email,
// "email" => $email
// ],
// "password" => $password
// ]));
// curl_setopt($ch, CURLOPT_HTTPHEADER, [
// "Content-Type: application/json",
// "Authorization: Bearer $project_id"
// ]);
// $response = curl_exec($ch);
// $err = curl_error($ch);
// $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// curl_close($ch);
// if ($http_code === 200) {
// echo json_encode(['status' => 'ok']);
// } else {
// $response_json = json_decode($response, true);
// echo json_encode([
// 'status' => 'error',
// 'message' => $response_json['errorDescription'] ?? 'Descope API 호출 실패',
// 'code' => $http_code,
// 'error' => $err
// ]);
// }
// exit;
?>
<?php
// ini_set('display_errors', 1);
// ini_set('display_startup_errors', 1);
// error_reporting(E_ALL);
// header('Content-Type: application/json; charset=utf-8');
// // $email = trim($_POST['email'] ?? '');
// // $password = trim($_POST['password'] ?? '');
// $email = 'sdi9429@gmail.com';
// // if (!$email || !$password) {
// // echo json_encode(['status' => 'error', 'message' => '이메일 또는 비밀번호가 없습니다.']);
// // exit;
// // }
// if (!$email) {
// echo json_encode(['status' => 'error', 'message' => '이메일이 없습니다.']);
// exit;
// }
// $project_id = 'P2wON5fy1K6kyia269VpeIzYP8oP'; // Descope 프로젝트 ID
// // // 1. 비밀번호 회원가입 (Password Signup)
// // $url_signup = 'https://api.descope.com/v1/auth/password/signup';
// // $signup_data = [
// // "loginId" => $email,
// // "user" => [
// // "loginId" => $email,
// // "email" => $email
// // ],
// // "password" => $password
// // ];
// // $ch = curl_init($url_signup);
// // curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// // curl_setopt($ch, CURLOPT_POST, true);
// // curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($signup_data));
// // curl_setopt($ch, CURLOPT_HTTPHEADER, [
// // "Content-Type: application/json",
// // "Authorization: Bearer $project_id"
// // ]);
// // $response_signup = curl_exec($ch);
// // $err_signup = curl_error($ch);
// // $http_code_signup = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// // curl_close($ch);
// // if ($http_code_signup !== 200) {
// // $response_json = json_decode($response_signup, true);
// // echo json_encode([
// // 'status' => 'error',
// // 'message' => $response_json['errorDescription'] ?? 'Descope 회원가입 API 호출 실패',
// // 'code' => $http_code_signup,
// // 'error' => $err_signup
// // ]);
// // exit;
// // }
// // 2. OTP 이메일 전송
// $url = "https://api.descope.com/v1/auth/otp/signup/email";
// $data = [
// "loginId" => $email, // 이메일 주소
// "email" => $email
// ];
// $ch = curl_init($url);
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// curl_setopt($ch, CURLOPT_POST, true);
// curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
// curl_setopt($ch, CURLOPT_HTTPHEADER, [
// "Content-Type: application/json",
// "Authorization: Bearer $project_id"
// ]);
// $response = curl_exec($ch);
// $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// curl_close($ch);
// // if ($http_code === 200) {
// // echo json_encode(['status' => 'ok']);
// // } else {
// // $response_json = json_decode($response, true);
// // echo json_encode([
// // 'status' => 'error',
// // 'message' => $response_json['errorDescription'] ?? 'Descope API 호출 실패',
// // 'code' => $http_code
// // ]);
// // }
// // sessionJwt는 반드시 프론트에 넘겨야 함!
// if ($http_code === 200 && !empty($res_data['sessionJwt'])) {
// echo json_encode(['status'=>'ok', 'sessionJwt'=>$res_data['sessionJwt']]);
// } else {
// $msg = $res_data['errorDescription'] ?? 'Descope OTP 발송 실패';
// echo json_encode(['status'=>'fail', 'message'=>$msg, 'debug'=>$res_data]);
// }
// echo json_encode([
// 'status'=>'debug',
// 'raw'=> $response, // $response: curl_exec 결과
// 'php_error'=> error_get_last()
// ]);
// exit;
?>
<?php
header('Content-Type: application/json; charset=utf-8');
ini_set('display_errors', 1);
error_reporting(E_ALL);
$email = trim($_POST['email'] ?? '');
// 생략 가능: $email = 'test123@test.com';
$project_id = 'P2wON5fy1K6kyia269VpeIzYP8oP'; // 실제 프로젝트 ID로 변경
$url = "https://api.descope.com/v1/auth/otp/signup/email";
$data = [
"loginId" => $email,
"email" => $email
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Content-Type: application/json",
"Authorization: Bearer $project_id"
]);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$res_data = json_decode($response, true); // 항상 선언
if ($http_code === 200 && isset($res_data['maskedEmail'])) {
// 성공 케이스
echo json_encode(['status' => 'ok', 'maskedEmail' => $res_data['maskedEmail']]);
} else {
// 실패 케이스
$msg = $res_data['errorDescription'] ?? 'Descope OTP 발송 실패';
echo json_encode([
'status' => 'fail',
'message' => $msg,
'debug' => $res_data
]);
}
exit;
?>
@@ -0,0 +1,32 @@
<?php
header('Content-Type: application/json; charset=utf-8');
$email = $_POST['email'] ?? '';
if (!$email) exit(json_encode(['status'=>'fail', 'message'=>'이메일 누락']));
// 아래 내용은 실제 사용중인 Descope OTP 전송 API와 맞게 수정해야 함
$api_key = "P2wON5fy1K6kyia269VpeIzYP8oP";
$url = "https://api.descope.com/v1/auth/otp/signup/email";
$data = [
"loginId" => $email,
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer {$api_key}",
"Content-Type: application/json"
]);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$res = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code == 200) {
echo json_encode(['status'=>'ok']);
} else {
echo json_encode(['status'=>'fail','message'=>'OTP 재전송 실패']);
}
?>
+177
View File
@@ -0,0 +1,177 @@
<?php
session_start();
// -- JSON 응답 보장 --
header('Content-Type: application/json; charset=UTF-8');
// -- 실서비스 전에는 환경변수 사용 권장 --
$projectId = 'P2wON5fy1K6kyia269VpeIzYP8oP';
$managementKey = 'K32l5ORmzy32OvaaPvpdZsMY3JmKQb7a3vvrl10PgjlJUGk3K7EssMH3uW5VGQSbrgtEdPj';
// -- POST 입력값 (여기서 name 값 등 반드시 필수체크 필요!) --
$email = trim($_POST['email'] ?? '');
$name = trim($_POST['name'] ?? '');
$password = trim($_POST['password'] ?? '');
$family = trim($_POST['familyCompany'] ?? ''); // Machine Name: familycompany
$familyUniqueKey = trim($_POST['familyUniqueKey'] ?? ''); // Machine Name: familyUniqueKey
$team = trim($_POST['team'] ?? ''); // Machine Name: team
$position = trim($_POST['position'] ?? ''); // Machine Name: position
$hp = trim($_POST['phone'] ?? ''); // phone
// $completeForm = ($_POST['completeForm'] ?? '') ? true : false; // Boolean 처리
$completeForm = filter_var($_POST['completeForm'] ?? false, FILTER_VALIDATE_BOOLEAN);
$refreshJwt = trim($_POST['refreshJwt']);
// $refreshJwt = $_SESSION['refreshJwt'] ?? '';
$company = trim($_POST['company'] ?? ''); // Machine Name: company 외부사용자 회사명
// if (!$refreshJwt) {
// // 필수 값 누락시 에러 반환
// echo json_encode(["error" => "refreshJWT is missing"]);
// exit;
// }
if (!$refreshJwt) {
echo json_encode([
"status" => "fail",
"message" => "세션이 만료되었습니다. 다시 로그인해 주세요."
]);
exit;
}
$internalDomains = [
"hanmaceng.co.kr",
"samaneng.com",
"jangheon.co.kr",
"hallasanup.com",
"pre-cast.co.kr",
"baroncs.co.kr"
];
$domain = explode('@', $email)[1] ?? '';
// if (in_array($domain, $internalDomains)) {
// $tenantId = "T2wQcWCBhUfJgUWHWgNwLg4iUDVY"; //내부
// } else {
// $tenantId = "T2x4TDzxasp7auPCPcN8uOrxXchh"; //외부
// }
if (in_array($domain, $internalDomains)) {
// 내부 사용자 → 내부 tenant 하나만
$userTenants = [
[
"tenantId" => "T2wQcWCBhUfJgUWHWgNwLg4iUDVY" // 내부 tenantId
]
];
} else {
// 외부 사용자 → customer + egbim 두 개 tenant 자동 등록
$userTenants = [
[
"tenantId" => "T2x4TDzxasp7auPCPcN8uOrxXchh" // customer tenantId
],
[
"tenantId" => "T2yGFrGSnFX601G22JOMojJX7OMd" // egbim tenantId
]
];
}
//라이센스 만료일 계산
$now = new DateTime('now', new DateTimeZone('Asia/Seoul'));
$expiry = (clone $now)->modify('+90 days')->format(DateTime::ATOM);
// -- Custom Attribute 실제 Machine Name에 맞춰서 할당 (Descope 콘솔 기준) --
$custom = [
"familyCompany" => $family, // 소속 가족사
"familyUniqueKey" => $familyUniqueKey, // 사번
"team" => $team, // 소속팀
"position" => $position, // 직위
"completeForm" => $completeForm, // 정보입력완료 (Boolean)
// "egBimLExpiryDate" => $expiry //egbim 라이센스 만료일
// 필요하면 추가로 다른 Machine Name도 사용 가능
];
if (! in_array($domain, $internalDomains, true)) {
$custom["egBimLExpiryDate"] = $expiry;
}
if ($company) {
$custom["company"] = $company; // 외부사용자 회사명 추가
}
// -- 1. 사용자 정보 업데이트 --
$update_body = [
"loginId" => $email,
"email" => $email,
"name" => $name,
"phone" => $hp,
"verifiedPhone" => false,
"customAttributes" => $custom,
// "roleNames" => [ "Default User" ],
"userTenants" => $userTenants
];
$ch = curl_init('https://api.descope.com/v1/mgmt/user/update');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Authorization: Bearer {$projectId}:{$managementKey}"
],
CURLOPT_POSTFIELDS => json_encode($update_body),
]);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$res_data = json_decode($response, true);
// -- 1-1. 사용자 정보 업데이트 실패시 --
if ($http_code !== 200) {
$msg = $res_data['errorDescription'] ?? 'Descope 정보 업데이트 실패';
echo json_encode([
'status' => 'fail',
'step' => 'info',
'message' => $msg,
'raw' => $response
]);
exit;
}
// -- 2. 비밀번호 변경 (입력값이 있을 경우) --
if ($password) {
$pw_body = [
"loginId" => $email,
"newPassword" => $password
];
error_log("Descope password update payload: " . json_encode($pw_body));
error_log("Using refreshJwt for password update: " . $refreshJwt);
$ch2 = curl_init('https://api.descope.com/v1/auth/password/update');
curl_setopt_array($ch2, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Authorization: Bearer {$projectId}:{$refreshJwt}"
],
CURLOPT_POSTFIELDS => json_encode($pw_body),
]);
$response2 = curl_exec($ch2);
$http_code2 = curl_getinfo($ch2, CURLINFO_HTTP_CODE);
curl_close($ch2);
$res_data2 = json_decode($response2, true);
if ($http_code2 !== 200) {
$msg2 = $res_data2['errorDescription'] ?? 'Descope 비밀번호 변경 실패';
echo json_encode([
'status' => 'fail',
'step' => 'password',
'message' => $msg2,
'raw' => $response2
]);
exit;
}
}
// -- 3. 모두 성공 --
echo json_encode(['status' => 'ok']);
?>
@@ -0,0 +1,45 @@
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
header('Content-Type: application/json');
require_once './descope_config.php';
$email = trim($_POST['email'] ?? '');
$password = trim($_POST['password'] ?? '');
$refreshJwt = trim($_POST['refreshJwt'] ?? '');
if (!$email || !$password || !$refreshJwt) {
echo json_encode(['status' => 'fail', 'message' => '필수값 없음']);
exit;
}
// Descope API - 비밀번호 변경 엔드포인트 사용
$url = "https://api.descope.com/v1/auth/password/update";
$data = [
"loginId" => $email,
"newPassword" => $password,
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer " . $refreshJwt,
"Content-Type: application/json"
]);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($code == 200) {
echo json_encode(['status' => 'ok']);
} else {
$resData = json_decode($response, true);
$msg = $resData['errorDescription'] ?? '비밀번호 변경 실패';
echo json_encode(['status' => 'fail', 'message' => $msg, 'raw' => $response]);
}
?>
@@ -0,0 +1,32 @@
<?php
$projectId = 'P2wON5fy1K6kyia269VpeIzYP8oP';
$managementKey = 'K32l5ORmzy32OvaaPvpdZsMY3JmKQb7a3vvrl10PgjlJUGk3K7EssMH3uW5VGQSbrgtEdPj';
$loginId = 'sdi9429@gmail.com'; // 테스트할 사용자
$status = 'disabled'; // 또는 'enabled'
$headers = [
"Content-Type: application/json",
"Authorization: Bearer {$projectId}:{$managementKey}"
];
$body = [
"loginId" => $loginId,
"status" => $status
];
$ch = curl_init('https://api.descope.com/v1/mgmt/user/update/status');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// 결과 출력
header('Content-Type: application/json');
echo json_encode([
'httpCode' => $httpCode,
'response' => json_decode($response, true)
]);
@@ -0,0 +1,95 @@
<?php
// header('Content-Type: application/json');
// $management_key = 'P2wON5fy1K6kyia269VpeIzYP8oP:K2ycqpjeh1voPBdxXxzB3ScZOQ6v9aiLmU2cIj70X1H8Kcoz0KWfCWmofUwAsAkJroXA8QC';
// // userId 또는 loginId 사용 가능
// $userId = $_POST['userId'] ?? '';
// $loginId = $_POST['loginId'] ?? '';
// if (!$userId && !$loginId) {
// echo json_encode(['status' => 'fail', 'message' => 'userId 또는 loginId 누락']);
// exit;
// }
// $url = "https://api.descope.com/v1/mgmt/user/delete";
// $payload = json_encode([
// "userId" => $userId,
// "loginId" => $loginId
// ]);
// $headers = [
// "Authorization: Bearer $management_key",
// "Content-Type: application/json"
// ];
// $ch = curl_init($url);
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
// curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// $response = curl_exec($ch);
// $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// curl_close($ch);
// if ($http_code === 200) {
// echo json_encode(['status' => 'ok', 'message' => '탈퇴 성공']);
// } else {
// echo json_encode([
// 'status' => 'fail',
// 'message' => '탈퇴 실패',
// 'code' => $http_code,
// 'response' => $response
// ]);
// }
?>
<?php
header('Content-Type: application/json');
// TODO: 환경변수/별도 설정파일에서 읽어오세요.
$management_key = 'P2wON5fy1K6kyia269VpeIzYP8oP:K32l5ORmzy32OvaaPvpdZsMY3JmKQb7a3vvrl10PgjlJUGk3K7EssMH3uW5VGQSbrgtEdPj';
$userId = $_POST['userId'] ?? '';
$loginId = $_POST['loginId'] ?? '';
if (!$userId && !$loginId) {
echo json_encode(['status' => 'fail', 'message' => 'userId 또는 loginId가 필요합니다.']);
exit;
}
$url = "https://api.descope.com/v1/mgmt/user/delete";
$payload = [];
if ($userId) $payload['userId'] = $userId;
if ($loginId) $payload['loginId'] = $loginId;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer {$management_key}",
"Content-Type: application/json"
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$err = curl_error($ch);
curl_close($ch);
if ($err) {
echo json_encode(['status' => 'fail', 'message' => 'cURL error', 'error' => $err]);
exit;
}
if ($http_code === 200) {
echo json_encode(['status' => 'ok', 'message' => '탈퇴 처리 완료']);
} else {
echo json_encode([
'status' => 'fail',
'message' => 'Descope delete 실패',
'code' => $http_code,
'res' => $response
]);
}
?>
@@ -0,0 +1,347 @@
<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/eng/skin/member/basic/descope_session.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/eng/bbs/userlist_admin_guard.php';
?>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Descope 유저 리스트</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
<script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
<style>
#tableContainer { max-height: 80vh; overflow-y: auto; overflow-x: hidden; }
#floatingScroll {
position: sticky; bottom: 0; left: 0; right: 0;
height: 16px; overflow-x: auto; overflow-y: hidden;
background: #f9f9f9; border-top: 1px solid #ccc; z-index: 50;
}
#floatingScrollInner { height: 1px; }
thead th { position: sticky; top: 0; z-index: 60; background: #e5e7eb; }
</style>
</head>
<body class="bg-gray-100 p-6">
<div class="max-w-[1800px] mx-auto pb-10 bg-white shadow rounded-lg pl-5 pt-5 pr-5">
<h1 class="text-2xl font-bold mb-4">Descope 유저 리스트</h1>
<!-- ✅ 검색 영역 -->
<div class="flex items-center gap-2 mb-4">
<select id="mode" class="border px-2 py-1 rounded">
<option value="created">가입일 기준</option>
<option value="lastSignIn">마지막 로그인 기준</option>
<option value="license">라이센스 만료일 기준</option>
<option value="serverLogin">최근 로그인 기준 (EGBIM)</option> <!-- ✅ 추가 -->
</select>
<input type="text" id="startDate" placeholder="시작일" class="border px-2 py-1 rounded">
<span>~</span>
<input type="text" id="endDate" placeholder="종료일" class="border px-2 py-1 rounded">
<button id="filterBtn" class="bg-blue-500 text-white px-4 py-1 rounded">검색</button>
<button id="resetBtn" class="bg-gray-400 text-white px-4 py-1 rounded">초기화</button>
<!-- ✅ 테넌트 체크박스 -->
<div id="tenantFilter" class="flex items-center gap-2 ml-4">
<label><input type="checkbox" name="tenant" value="Hanmac Family"> Hanmac Family</label>
<label><input type="checkbox" name="tenant" value="Customer"> Customer</label>
<label><input type="checkbox" name="tenant" value="egBIM-edu"> egBIM-edu</label>
</div>
<!-- ✅ CSV 대량 생성 버튼 -->
<button id="btn-import-descope" class="bg-green-600 text-white px-4 py-1 rounded hover:bg-green-700">계정 일괄 생성</button>
<!-- ✅ CSV Import 팝업 -->
<div id="importModal" class="fixed inset-0 bg-black bg-opacity-40 flex items-center justify-center hidden z-50">
<div class="bg-white rounded-lg shadow-lg p-6 w-[590px] max-w-[90%] relative">
<h2 class="text-lg font-semibold mb-4">Descope 대량 생성</h2>
<label class="block text-sm font-medium mb-1">Google Sheet CSV URL</label>
<input id="csvUrl" type="url"
class="w-full border px-3 py-2 rounded mb-3"
placeholder="https://docs.google.com/spreadsheets/d/.../export?format=csv&gid=..." />
<label class="block text-sm font-medium mb-1">egBIM 라이선스 만료일</label>
<input id="expiry" type="date" class="w-full border px-3 py-2 rounded mb-3" />
<!-- <label class="inline-flex items-center mb-4">
<input id="sendReset" type="checkbox" class="mr-2" checked>
<span>비밀번호 재설정 메일 발송</span>
</label> -->
<!-- ✅ Tenant Type 선택 -->
<label class="block text-sm font-medium mb-1">소속 테넌트 선택</label>
<div class="flex gap-4 mb-3">
<label class="flex items-center gap-1">
<input type="radio" name="tenant_type" value="customer" checked />
<span>Customer (외부)</span>
</label>
<label class="flex items-center gap-1">
<input type="radio" name="tenant_type" value="family" />
<span>Hanmac Family (내부)</span>
</label>
<label class="flex items-center gap-1">
<input type="radio" name="tenant_type" value="edu" />
<span>egBIM-edu (교육용)</span>
</label>
</div>
<div id="importMsg" class="text-gray-500 text-sm mb-4"></div>
<div class="flex justify-end gap-2">
<button id="importCancel" class="px-4 py-1 bg-gray-400 text-white rounded">취소</button>
<button id="importRun" class="px-4 py-1 bg-blue-600 text-white rounded">실행</button>
</div>
</div>
</div>
<!-- ✅ 우측 검색창 -->
<div class="flex justify-end flex-1">
<input type="text" id="keyword" placeholder="소속 가족사 / 외부회사 검색"
class="border px-2 py-1 rounded w-72">
<button id="keywordBtn"
class="ml-2 bg-blue-500 text-white px-4 py-1 rounded">검색</button>
</div>
</div>
<!-- ✅ 테이블 -->
<div id="tableContainer" class="w-full pb-10 bg-white shadow rounded-lg overflow-x-auto">
<table id="userTableWrapper"
class="min-w-[2500px] text-sm text-center text-gray-700 border table-fixed">
<thead class="bg-gray-200 text-xs uppercase">
<tr>
<th class="px-4 py-2 w-12">#</th>
<th class="px-4 py-2 min-w-[150px]">Login ID</th>
<th class="px-4 py-2 min-w-[160px]">Display Name</th>
<th class="px-4 py-2 min-w-[140px]">직위</th>
<th class="px-4 py-2 min-w-[180px]">Phone</th>
<th class="px-4 py-2 min-w-[250px]">Created Time</th>
<th class="px-4 py-2 min-w-[220px]">Tenants</th>
<th class="px-4 py-2 min-w-[160px]">소속 가족사</th>
<th class="px-4 py-2 min-w-[200px]">소속회사(외부용)</th>
<th class="px-4 py-2 min-w-[100px]">Status</th>
<th class="px-4 py-2 min-w-[220px]">Email</th>
<th class="px-4 py-2 min-w-[140px]">정보입력완료</th>
<th class="px-4 py-2 min-w-[200px]">egBIM 라이센스 만료일</th>
<th class="px-4 py-2 min-w-[120px]">사번</th>
<th class="px-4 py-2 min-w-[180px]">마지막 접속 IP</th>
<th class="px-4 py-2 min-w-[200px]">Beps 마지막 로그인날짜</th>
<th class="px-4 py-2 min-w-[210px]">egBIM 최근 로그인</th>
<th class="px-4 py-2 min-w-[200px]">소속센터/부/실</th>
</tr>
</thead>
<tbody id="userTable" class="divide-y"></tbody>
</table>
</div>
<div id="floatingScroll"><div id="floatingScrollInner"></div></div>
</div>
<script>
function formatDate(value) {
if (!value) return "";
let ts = parseInt(value, 10);
if (isNaN(ts)) return value;
if (ts < 1e12) ts *= 1000; // 초 단위 → 밀리초 보정
return new Date(ts).toLocaleString("ko-KR");
}
// ✅ EGBIM DB에서 오는 VARCHAR (ex: "2025-09-16 18:49:48") 전용 포맷터
function formatServerLogin(value) {
if (!value) return "-";
// "2025-09-16 18:49:48"
const parts = value.split(" ");
if (parts.length < 2) return value;
const datePart = parts[0].replace(/-/g, ". "); // "2025. 09. 16"
const timePart = parts[1]; // "18:49:48"
let [h, m, s] = timePart.split(":").map(Number);
const meridiem = h >= 12 ? "오후" : "오전";
if (h === 0) h = 12;
else if (h > 12) h -= 12;
return `${datePart}. ${meridiem} ${h}:${String(m).padStart(2,"0")}:${String(s).padStart(2,"0")}`;
}
function loadUserList(start=null, end=null, mode="created") {
let url = "/eng/bbs/descope_user_list.php";
const params = [];
if (start) params.push("start=" + encodeURIComponent(start));
if (end) params.push("end=" + encodeURIComponent(end));
if (mode) params.push("mode=" + encodeURIComponent(mode));
const keyword = $("#keyword").val().trim();
if (keyword) params.push("keyword=" + encodeURIComponent(keyword));
const tenants = $("input[name='tenant']:checked")
.map(function(){ return this.value; })
.get();
if (tenants.length) {
params.push("tenants=" + encodeURIComponent(tenants.join(",")));
}
if (params.length) url += "?" + params.join("&");
$.getJSON(url, function(data) {
let rows = "";
if (data.status === "ok" && data.users) {
data.users.forEach((u, idx) => {
let tenantInfo = "";
if (u.userTenants && Array.isArray(u.userTenants)) {
tenantInfo = u.userTenants.map(t => t.tenantName || "").join("<br>");
}
rows += `
<tr class="hover:bg-gray-50">
<td class="px-4 py-2 text-center">${idx+1}</td>
<td class="px-4 py-2">${u.loginIds?.[0] || "-"}</td>
<td class="px-4 py-2">${u.name || "-"}</td>
<td class="px-4 py-2">${u.customAttributes?.position || "-"}</td>
<td class="px-4 py-2">${u.phone || "-"}</td>
<td class="px-4 py-2">${formatDate(u.createdTime) || "-"}</td>
<td class="px-4 py-2">${tenantInfo || "-"}</td>
<td class="px-4 py-2">${u.customAttributes?.familyCompany || "-"}</td>
<td class="px-4 py-2">${u.customAttributes?.company || "-"}</td>
<td class="px-4 py-2">${u.status || "-"}</td>
<td class="px-4 py-2">${u.email || "-"}</td>
<td class="px-4 py-2">${u.customAttributes?.completeForm ? "완료" : "미완료"}</td>
<td class="px-4 py-2">${formatDate(u.customAttributes?.egBimLExpiryDate) || "-"}</td>
<td class="px-4 py-2">${u.customAttributes?.familyUniqueKey || "-"}</td>
<td class="px-4 py-2">${u.customAttributes?.lastAccessIp || "-"}</td>
<td class="px-4 py-2">${formatDate(u.customAttributes?.lastSignInDate) || "-"}</td>
<!-- ✅ EGBIM 최근 로그인 표시 -->
<td class="px-4 py-2">${formatServerLogin(u.customAttributes?.serverLastLogin) || "-"}</td>
<td class="px-4 py-2">${u.customAttributes?.team || "-"}</td>
</tr>`;
});
} else {
rows = `<tr><td colspan="18" class="text-center text-red-500">데이터 없음</td></tr>`;
}
$("#userTable").html(rows);
const $tableContainer = $("#tableContainer");
const $scroll = $("#floatingScroll");
const $scrollInner = $("#floatingScrollInner");
function syncWidth() {
const tableWidth = $("#userTableWrapper").outerWidth();
const containerWidth = $tableContainer.width();
$scrollInner.width(Math.max(tableWidth, containerWidth));
}
$scroll.off("scroll").on("scroll", () =>
$tableContainer.scrollLeft($scroll.scrollLeft())
);
$tableContainer.off("scroll").on("scroll", () =>
$scroll.scrollLeft($tableContainer.scrollLeft())
);
setTimeout(syncWidth, 500);
$(window).off("resize.syncScroll").on("resize.syncScroll", syncWidth);
});
}
// ✅ 체크박스 클릭 시 즉시 필터링
$(document).on("change", "input[name='tenant']", function() {
loadUserList($("#startDate").val(), $("#endDate").val(), $("#mode").val());
});
$(document).ready(function() {
flatpickr("#startDate", { dateFormat: "Y-m-d" });
flatpickr("#endDate", { dateFormat: "Y-m-d" });
$("#filterBtn").on("click", function() {
loadUserList($("#startDate").val(), $("#endDate").val(), $("#mode").val());
});
$("#resetBtn").on("click", function() {
$("#startDate").val("");
$("#endDate").val("");
$("#mode").val("created");
$("input[name='tenant']").prop("checked", false);
$("#keyword").val(""); // ✅ 검색창 초기화
loadUserList();
});
$("#keywordBtn").on("click", function() {
loadUserList($("#startDate").val(), $("#endDate").val(), $("#mode").val());
});
$("#keyword").on("keypress", function(e) {
if (e.which === 13) {
loadUserList($("#startDate").val(), $("#endDate").val(), $("#mode").val());
}
});
loadUserList();
});
</script>
</body>
</html>
<script>
$(function(){
// ✅ 모달 열기
$("#btn-import-descope").on("click", () => {
$("#importModal").removeClass("hidden");
$("#importMsg").text("");
$("#importRun").prop("disabled", false).text("실행");
});
// ✅ 모달 닫기 (밖 클릭 포함)
$("#importCancel, #importModal").on("click", (e) => {
if (e.target.id === "importCancel" || e.target.id === "importModal") {
$("#importModal").addClass("hidden");
}
});
// ✅ 실행 버튼 클릭
$("#importRun").on("click", async () => {
const csvUrl = $("#csvUrl").val().trim();
const expiry = $("#expiry").val().trim();
const tenantType = $('input[name="tenant_type"]:checked').val(); // ✅ 올바른 name 참조
if (!csvUrl) {
$("#importMsg").text("❗ CSV URL을 입력하세요.");
return;
}
$("#importRun").prop("disabled", true).text("실행 중...");
$("#importMsg").html("<span class='text-blue-600'>처리 중입니다... 잠시만 기다려주세요.</span>");
try {
const res = await fetch("/eng/bbs/descope_import.php", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
csv_url: csvUrl,
expiry: expiry,
tenant_type: tenantType // ✅ 서버로 전달
})
});
const data = await res.json();
console.log("📦 응답:", data);
if (data.status === "ok") {
$("#importMsg").html(`
✅ 완료: <b>${data.created}</b> 생성 /
<b>${data.updated}</b> 갱신 /
<b>${data.failed}</b> 실패
`);
if (data.failed > 0 && data.errors?.length) {
console.warn("실패 목록:", data.errors);
$("#importMsg").append(`<br><span class='text-gray-600'>일부 실패 로그는 콘솔에서 확인하세요.</span>`);
}
} else {
$("#importMsg").html(`❌ 실패: ${data.message || "서버 오류"}`);
console.error("서버 응답:", data);
}
} catch (err) {
console.error("통신 오류:", err);
$("#importMsg").html("<span class='text-red-600'>❌ 통신 오류가 발생했습니다.</span>");
} finally {
$("#importRun").prop("disabled", false).text("실행");
}
});
});
</script>
@@ -0,0 +1,93 @@
<?php
// header('Content-Type: application/json');
// $management_key = 'P2wON5fy1K6kyia269VpeIzYP8oP:K2ycqpjeh1voPBdxXxzB3ScZOQ6v9aiLmU2cIj70X1H8Kcoz0KWfCWmofUwAsAkJroXA8QC';
// $loginId = $_POST['loginId'] ?? '';
// $url = "https://api.descope.com/v2/mgmt/user/search";
// $payload = json_encode([
// "loginId" => $loginId,
// "limit" => 1
// ]);
// $headers = [
// "Authorization: Bearer $management_key",
// "Content-Type: application/json"
// ];
// $ch = curl_init($url);
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
// curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// $response = curl_exec($ch);
// $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// curl_close($ch);
// if ($http_code === 200) {
// $res = json_decode($response, true);
// if (!empty($res['users'][0])) {
// // ✅ 먼저 $user에 복사
// $user = $res['users'][0];
// // ✅ 값이 없으면 테스트용 기본값 삽입
// $user['name'] = $user['name'] ?: '홍길동';
// $user['phone'] = $user['phone'] ?: '01012345678';
// $user['customAttributes']['company'] = $user['customAttributes']['company'] ?? '한맥ENG';
// $user['customAttributes']['team'] = $user['customAttributes']['team'] ?? '설계팀';
// $user['customAttributes']['employeeId'] = $user['customAttributes']['employeeId'] ?? 'HM2024';
// // ✅ 수정된 $user 사용
// echo json_encode(['status' => 'ok', 'user' => $user]);
// } else {
// echo json_encode(['status' => 'fail', 'message' => '사용자를 찾을 수 없음']);
// }
// } else {
// echo json_encode(['status' => 'fail', 'message' => 'Descope API 오류', 'code' => $http_code]);
// }
?>
<?php
header('Content-Type: application/json');
$management_key = 'P2wON5fy1K6kyia269VpeIzYP8oP:K32l5ORmzy32OvaaPvpdZsMY3JmKQb7a3vvrl10PgjlJUGk3K7EssMH3uW5VGQSbrgtEdPj';
$loginId = $_POST['loginId'] ?? '';
$url = "https://api.descope.com/v2/mgmt/user/search";
$payload = json_encode([
"loginId" => $loginId,
"limit" => 1
]);
$headers = [
"Authorization: Bearer $management_key",
"Content-Type: application/json"
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code === 200) {
$res = json_decode($response, true);
if (!empty($res['users'][0])) {
$user = $res['users'][0];
// ✅ 실제 값이 있으면 그대로 사용, 없으면 빈 문자열
$user['name'] = $user['name'] ?? '';
$user['phone'] = $user['phone'] ?? '';
$user['customAttributes']['company'] = $user['customAttributes']['company'] ?? '';
$user['customAttributes']['team'] = $user['customAttributes']['team'] ?? '';
$user['customAttributes']['employeeId'] = $user['customAttributes']['employeeId'] ?? '';
echo json_encode(['status' => 'ok', 'user' => $user]);
} else {
echo json_encode(['status' => 'fail', 'message' => '사용자를 찾을 수 없음']);
}
} else {
echo json_encode(['status' => 'fail', 'message' => 'Descope API 오류', 'code' => $http_code]);
}
+204
View File
@@ -0,0 +1,204 @@
<?php
// // descope_verify.php
// // _GNUBOARD_ 등 시스템 상수 포함 필요
// include_once('../../common.php');
// // POST 데이터 받기
// $otp_code = trim($_POST['otp_code'] ?? '');
// $email = trim($_POST['email'] ?? '');
// // $email = 'sdi9429@gmail.com'; // ★ 실제 인증번호 메일 받은 주소
// // $otp_code = '378484';
// if (strlen($otp_code) !== 6) {
// echo json_encode(['status'=>'fail', 'message'=>'잘못된 인증번호']);
// exit;
// }
// // 1. Descope API에 검증 요청 (curl 또는 file_get_contents)
// $descope_project_id = "P2wON5fy1K6kyia269VpeIzYP8oP";
// $descope_api_url = "https://api.descope.com/v1/auth/otp/verify/email"; // email 인증 기준
// // $data = [
// // 'loginId' => $email, // 이메일 아이디
// // 'code' => $otp_code, // 입력받은 6자리 코드
// // ];
// // $headers = [
// // 'Content-Type: application/json',
// // 'Accept: application/json',
// // "x-descope-project-id: $descope_project_id"
// // ];
// // $ch = curl_init();
// // curl_setopt($ch, CURLOPT_URL, $descope_api_url);
// // curl_setopt($ch, CURLOPT_POST, true);
// // curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
// // curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// // curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// // $response = curl_exec($ch);
// // $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// // curl_close($ch);
// // $res_data = json_decode($response, true);
// // if ($http_code === 200 && isset($res_data['user'])) {
// // // 인증 성공
// // echo json_encode(['status'=>'ok']);
// // } else {
// // // 실패, 에러 메시지 출력
// // $msg = $res_data['errorDescription'] ?? '인증 실패';
// // echo json_encode(['status'=>'fail', 'message'=>$msg]);
// // }
// $data = [
// 'loginId' => $email,
// 'code' => $otp_code,
// ];
// $headers = [
// 'Content-Type: application/json',
// 'Authorization: Bearer ' . $descope_project_id,
// ];
// $ch = curl_init('https://api.descope.com/v1/auth/otp/verify/email');
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// curl_setopt($ch, CURLOPT_POST, true);
// curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
// curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// $response = curl_exec($ch);
// $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// curl_close($ch);
// $res_data = json_decode($response, true);
// if ($http_code === 200 && isset($res_data['sessionJwt'])) {
// // 인증 성공
// echo json_encode([
// 'status'=>'ok',
// 'refreshJwt' => $res_data['refreshJwt'] ?? '',
// ]);
// } else {
// // 인증 실패
// $msg = $res_data['errorDescription'] ?? '인증 실패';
// echo json_encode(['status'=>'fail', 'message'=>$msg]);
// }
// exit;
?>
<?php
// descope_verify.php
header('Content-Type: application/json; charset=UTF-8');
$commonPath = dirname(__DIR__, 3) . '/common.php';
if (file_exists($commonPath)) {
include_once($commonPath);
}
// POST 데이터 받기
$otp_code = trim($_POST['otp_code'] ?? '');
$email = trim($_POST['email'] ?? '');
if (strlen($otp_code) !== 6 || !$email) {
echo json_encode(['status'=>'fail', 'message'=>'잘못된 입력']);
exit;
}
// Descope 설정
$projectId = 'P2wON5fy1K6kyia269VpeIzYP8oP';
$managementKey = 'K32l5ORmzy32OvaaPvpdZsMY3JmKQb7a3vvrl10PgjlJUGk3K7EssMH3uW5VGQSbrgtEdPj'; // baron Access Key
// 1. OTP 인증 요청
$data = [
'loginId' => $email,
'code' => $otp_code,
];
$headers = [
'Content-Type: application/json',
'Authorization: Bearer ' . $projectId,
];
$ch = curl_init('https://api.descope.com/v1/auth/otp/verify/email');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// 응답 파싱
$res_data = json_decode($response, true);
if ($http_code === 200 && isset($res_data['user'])) {
$user = $res_data['user'];
$userId = $user['userId'] ?? '';
$email = $user['email'] ?? '';
$refreshJwt = $res_data['refreshJwt'] ?? '';
// 도메인 분리
$domain = explode('@', $email)[1];
$internalDomains = [
"hanmaceng.co.kr",
"samaneng.com",
"jangheon.co.kr",
"hallasanup.com",
"pre-cast.co.kr",
"baroncs.co.kr"
];
// 테넌트 결정
if (in_array($domain, $internalDomains)) {
$tenantId = "T2wQcWCBhUfJgUWHWgNwLg4iUDVY"; // 내부
$isInternal = true;
} else {
$tenantId = "T2x4TDzxasp7auPCPcN8uOrxXchh"; // 외부
$isInternal = false;
}
// 2. 테넌트 연결 요청
$tenantPayload = [
"identifier" => $userId,
"tenantId" => $tenantId,
"roleNames" => ["Default User"]
];
$ch2 = curl_init('https://api.descope.com/v1/mgmt/user/update/tenant/add');
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_POST, true);
curl_setopt($ch2, CURLOPT_POSTFIELDS, json_encode($tenantPayload));
curl_setopt($ch2, CURLOPT_HTTPHEADER, [
"Authorization: Bearer {$projectId}:{$managementKey}",
"Content-Type: application/json"
]);
$tenantRes = curl_exec($ch2);
$tenantHttpCode = curl_getinfo($ch2, CURLINFO_HTTP_CODE);
curl_close($ch2);
// if ($tenantHttpCode !== 200) {
// echo json_encode(['status'=>'fail', 'message'=>'테넌트 연결 실패', 'descope_response' => $tenantRes]);
// exit;
// }
// ✅ 중복 연결은 오류로 간주하지 않음
if ($tenantHttpCode !== 200 && !str_contains($tenantRes, 'Tenant already exists')) {
echo json_encode(['status'=>'fail', 'message'=>'테넌트 연결 실패', 'descope_response' => $tenantRes]);
exit;
}
// 성공 응답
echo json_encode([
'status' => 'ok',
'refreshJwt' => $refreshJwt,
'loginId' => $email,
'isInternal' => $isInternal
]);
} else {
$msg = $res_data['errorDescription'] ?? '인증 실패';
echo json_encode(['status'=>'fail', 'message'=>$msg]);
}
exit;
?>
@@ -0,0 +1,37 @@
<?php
// descope_verify_magiclink.php
header('Content-Type: application/json');
$api_key = "P2wON5fy1K6kyia269VpeIzYP8oP"; // 본인 Descope API Key로 교체
$token = $_POST['token'] ?? '';
if (!$token) exit(json_encode(['status'=>'fail', 'message'=>'토큰 없음']));
$url = "https://api.descope.com/v1/auth/magiclink/verify";
$data = [ "token" => $token ];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer $api_key",
"Content-Type: application/json"
]);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$resData = json_decode($response, true);
if ($code == 200 && !empty($resData['refreshJwt'])) {
echo json_encode([
'status' => 'ok',
'refreshJwt' => $resData['refreshJwt'],
'email' => $resData['user']['email'] ?? ($resData['user']['loginIds'][0] ?? '')
]);
} else {
$msg = $resData['errorDescription'] ?? '인증 실패';
echo json_encode(['status'=>'fail', 'message'=>$msg, 'raw'=>$resData]);
}
?>
@@ -0,0 +1,43 @@
<?php
header('Content-Type: application/json');
require_once './descope_config.php';
$email = trim($_POST['email'] ?? '');
$otp_code = trim($_POST['otp_code'] ?? '');
if (!$email || !$otp_code) {
echo json_encode(['status' => 'fail', 'message' => '이메일/OTP 없음']);
exit;
}
// Descope OTP 인증 (verify)
$url = 'https://api.descope.com/v1/auth/otp/verify/email';
$data = [
"loginId" => $email,
"code" => $otp_code
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer " . $DESCOPE_API_KEY,
"Content-Type: application/json"
]);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$resData = json_decode($response, true);
if ($code == 200 && isset($resData['refreshJwt'])) {
echo json_encode([
'status' => 'ok',
'refreshJwt' => $resData['refreshJwt'],
]);
} else {
$msg = $resData['errorDescription'] ?? 'OTP 인증 실패';
echo json_encode(['status' => 'fail', 'message' => $msg, 'raw' => $response]);
}
+651
View File
@@ -0,0 +1,651 @@
<?php include_once __DIR__ . '/asset_urls.php'; ?>
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-STZ2R5Q7HG"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-STZ2R5Q7HG');
</script>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>도면관리</title>
<link rel="stylesheet" href="../css/reset.css" />
<link rel="stylesheet" href="../css/font.css" />
<link rel="stylesheet" href="../css/style.css" />
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css" />
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script src="https://unpkg.com/lenis@1.1.9/dist/lenis.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/lenis@1.1.9/dist/lenis.css">
<script type="text/javascript" src="../js/jquery-3.6.1.min.js"></script>
<script type="text/javascript" src="../js/jquery.mousewheel.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="../js/popup.js"></script>
<script type="text/javascript" src="../js/floorplan.js"></script>
</head>
<body>
<!-- "js__"로 시작하는 클래스는 only 자바스크립트용입니다. -->
<!-- XXXX js__넣어서 css 작성 금지 XXXX -->
<div class="wrapper">
<input id="hid_mb_id" type="hidden" value="<?echo $_SESSION['session_id'];?>"></input>
<!-- HEADER -->
<?php include_once($member_skin_path.'/main_header.skin.php'); ?>
<!-- //Header -->
<!-- 모든 팝업페이지 경로 -->
<?php
include_once($member_skin_path.'/login.skin.php');
include_once($member_skin_path.'/mypage01.skin.php');
include_once($member_skin_path.'/register.skin.php');
include_once($member_skin_path.'/register_form.skin.php');
include_once($member_skin_path.'/mypage02.skin.php');
include_once($member_skin_path.'/mypage03.skin.php');
include_once($member_skin_path.'/sitemap.skin.php');
include_once($member_skin_path.'/privacy.skin.php');
include_once($member_skin_path.'/password_lost.skin.php');
?>
<!-- //모든 팝업페이지 경로 -->
<div class="container floorplan">
<section class="intro">
<div class="top js__dark">
<h2 data-aos="fade-down" data-aos-duration="1000">Drawing Management</h2>
<span>Efficient Management of Large-Scale Design Drawings</span>
</div>
<div class="keyword">
<i class="egbim_obj k"></i>
<span>Provides functions to easily find, review, edit,<br> and plot drawings without opening each file</span>
<p>By utilizing drawing information such as project name, drawing title,<br> and drawing number recorded within the file, users can efficiently manage<br> a large number of design drawings with simple search, convenient editing, and batch plotting.</p>
</div>
<div class="diagram_wrap" data-aos="fade-up" data-aos-duration="1000">
<div class="dia_elements_wrap">
<div class="dia_element dia_element01">
<i></i>
<span class="dia_tit">Convenient drawing search &<br> information viewing</span>
<div class="line"></div>
</div>
<div class="dia_element dia_element02">
<i></i>
<span class="dia_tit">Batch editing of<br> drawing information</span>
<div class="line"></div>
</div>
<div class="dia_element dia_element03">
<i></i>
<span class="dia_tit">Batch plotting of<br> multiple drawings</span>
<div class="line"></div>
</div>
</div>
<div class="dia_circles_wrap">
<div class="circle_dash"></div>
<div class="circle_belt"></div>
<div class="circle_core">
<span>Efficient</span>
<span>Drawing<br> Management</span>
</div>
<div class="circle_dots move">
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
</div>
<div class="circle_dots">
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
</div>
</div>
</div>
</section>
<section class="key find layout_fix_left">
<div class="left">
<div class="mid_tit">
<span data-aos="fade-right" data-aos-duration="600">Drawing Search &<br> <em>Information<br class="brk"> Viewing</em></span>
</div>
<ul data-aos="fade-right" data-aos-duration="1000" data-aos-delay="300" class="js__fixLeft_tit">
<li class="on"><span><em>01</em>User-Defined Folder</span></li>
<li><span><em>02</em>Drawing Information Viewing</span></li>
<li><span><em>03</em>Drawing Preview</span></li>
</ul>
</div>
<div class="right js__fixLeft_secs">
<div id="content1" class="find01">
<span class="sub_tit">User-Defined Folder</span>
<div class="sub_text">
Add frequently used folders to the User-Defined Folder panel by dragging and dropping from the folder explorer, so you can quickly access them when needed.
</div>
<div class="sub_figs">
<div class="imgs">
<object data="<?php echo eng_img_url('find_img_01_01.svg'); ?>" alt="" class="apx"></object>
<img src="<?php echo eng_img_url('find_img_01.png'); ?>" alt="">
</div>
<div class="text">
<div class="top">
<b>Add frequently used folders</b><br> to the User-Defined Folder panel
</div>
<div class="line">
<img src="<?php echo eng_img_url('ico_find_tri.svg'); ?>" alt="">
</div>
<div class="bottom">
<img src="<?php echo eng_img_url('ico_find_01.svg'); ?>" alt="">
<div class="bottom_txt">
<b>Reduce folder search time</b><br> for more efficient work.
</div>
</div>
</div>
</div>
</div>
<div id="content2" class="find02">
<span class="sub_tit">Drawing Information Viewing</span>
<div class="sub_text">
Easily load and check drawing information such as project name, drawing title, and drawing number.
</div>
<div class="sub_figs">
<div class="imgs">
<img src="<?php echo eng_img_url('find_img_02_01.png'); ?>" alt="" class="apx">
<img src="<?php echo eng_img_url('find_img_02.png'); ?>" alt="">
</div>
<div class="text">
<div class="top">
<b>Instantly view the drawing<br> information you need</b>
</div>
<div class="line">
<img src="<?php echo eng_img_url('ico_find_tri.svg'); ?>" alt="">
</div>
<div class="bottom">
<img src="<?php echo eng_img_url('ico_find_02.svg'); ?>" alt="">
<div class="bottom_txt">
Improve accuracy<br> and efficiency with<br><b> faster data access</b>
</div>
</div>
</div>
</div>
</div>
<div id="content3" class="find03">
<span class="sub_tit">Drawing Preview</span>
<div class="sub_text">
In dual mode, the drawing preview window can be separated for flexible use.<br> Each preview window can be placed on different monitors,<br> allowing users to conveniently view drawings without opening the actual files.
</div>
<div class="sub_figs">
<div class="imgs">
<img src="<?php echo eng_img_url('find_img_03_02.png'); ?>" alt="" class="apx">
<div class="find_03_move">
<img src="<?php echo eng_img_url('find_img_03_03.png'); ?>" alt="">
<img src="<?php echo eng_img_url('find_img_03_01.png'); ?>" alt="" class="element">
<img src="<?php echo eng_img_url('find_img_03.png'); ?>" alt="">
</div>
</div>
<div class="text">
<div class="top">
<b>Separate the drawing preview</b><br> window in dual mode
</div>
<div class="line">
<img src="<?php echo eng_img_url('ico_find_tri.svg'); ?>" alt="">
</div>
<div class="bottom">
<img src="<?php echo eng_img_url('ico_find_03.svg'); ?>" alt="">
<div class="bottom_txt">
View drawings conveniently<br><b> without opening them</b>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="key info layout_fix_left">
<div class="left">
<div class="mid_tit">
<span data-aos="fade-right" data-aos-duration="600">Drawing Information<br> <em>Selection &<br class="brk"> Editing</em></span>
</div>
<ul data-aos="fade-right" data-aos-duration="1000" data-aos-delay="300" class="js__fixLeft_tit">
<li class=" on"><span><em>01</em>Edit Drawing Information</span></li>
<li><span><em>02</em>Select Drawing Information to View </span></li>
</ul>
</div>
<div class="right js__fixLeft_secs">
<div id="content4" class="info01">
<span class="sub_tit">Editing Drawing Information</span>
<div class="sub_text">
Select the desired drawing information to edit multiple drawings at once.<br> Batch editing is supported with an Excel-style drag interface for quick and easy updates.
</div>
<div class="sub_figs">
<div class="imgs">
<img src="<?php echo eng_img_url('info_img_01_01.svg'); ?>" alt="" class="apx">
<img src="<?php echo eng_img_url('info_img_01.png'); ?>" alt="">
</div>
<div class="text">
<div class="top">
Batch editing with<br><b> Excel-style drag control</b>
</div>
<div class="line">
<img src="<?php echo eng_img_url('ico_find_tri.svg'); ?>" alt="">
</div>
<div class="bottom">
<img src="<?php echo eng_img_url('ico_info_01.svg'); ?>" alt="">
<div class="bottom_txt">
<b>Reduce repetitive tasks</b><br> for faster and<br> more accurate edits
</div>
</div>
</div>
</div>
</div>
<div id="content5" class="info02">
<span class="sub_tit">Selecting Drawing Information to View</span>
<div class="sub_text">
Select which drawing information to display, and easily add or remove it from the drawing list.<br> The interface also indicates which data is currently being modified.
</div>
<div class="sub_figs">
<div class="imgs">
<img src="<?php echo eng_img_url('info_img_02_01.png'); ?>" alt="" class="apx">
<img src="<?php echo eng_img_url('info_img_02.png'); ?>" alt="">
</div>
<div class="text">
<div class="top">
Select drawing information<br> <b>to add or remove from the list</b>
</div>
<div class="line">
<img src="<?php echo eng_img_url('ico_find_tri.svg'); ?>" alt="">
</div>
<div class="bottom">
<img src="<?php echo eng_img_url('ico_info_02.svg'); ?>" alt="">
<div class="bottom_txt">
<b>Flexible drawing<br> management</b> for more<br> efficient workflow
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="key print layout_fix_left">
<div class="left">
<div class="mid_tit">
<span data-aos="fade-right" data-aos-duration="600">Plot Option Settings &<br> <em>Batch<br class="brk"> Plotting</em></span>
</div>
<ul data-aos="fade-right" data-aos-duration="1000" data-aos-delay="300" class="js__fixLeft_tit">
<li class="on"><span><em>01</em>Select Files and View Plot Options</span></li>
<li><span><em>02</em>Adjust Plot Options & Preview</span></li>
</ul>
</div>
<div class="right js__fixLeft_secs">
<div id="content6" class="print01">
<span class="sub_tit">Select Files and View Plot Options</span>
<div class="sub_text">
The drawing list of the selected folder appears in the explorer,<br> allowing users to select drawings for plotting and check their plot options.
</div>
<div class="sub_figs">
<div class="imgs">
<img src="<?php echo eng_img_url('print_img_01.png'); ?>" alt="">
</div>
<div class="text">
<div class="top">
View the drawing list<br><b> for multiple selections<br> and plot options</b>
</div>
<div class="line">
<img src="<?php echo eng_img_url('ico_find_tri.svg'); ?>" alt="">
</div>
<div class="bottom">
<img src="<?php echo eng_img_url('ico_print_01.svg'); ?>" alt="">
<div class="bottom_txt">
<b>Quickly review drawings</b><br> and process batch output<br> with ease
</div>
</div>
</div>
</div>
</div>
<div id="content7" class="print02">
<span class="sub_tit">Adjust Plot Options & Preview</span>
<div class="sub_text">
Plot options can be adjusted individually or in batches,<br> and previewing before plotting is available to ensure accuracy.
</div>
<div class="sub_figs">
<div class="imgs">
<img src="<?php echo eng_img_url('print_img_02.png'); ?>" alt="">
</div>
<div class="text">
<div class="top">
Adjust plot options<br><b> individually or in batches and<br> preview before plotting</b>
</div>
<div class="line">
<img src="<?php echo eng_img_url('ico_find_tri.svg'); ?>" alt="">
</div>
<div class="bottom">
<img src="<?php echo eng_img_url('ico_print_02.svg'); ?>" alt="">
<div class="bottom_txt">
<b>Review plot options</b><br> first to reduce errors<br> and improve accuracy
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
<!-- footer -->
<?php include_once($member_skin_path.'/main_footer.skin.php'); ?>
<!-- //footer -->
</div>
<script>
AOS.init();
const lenis = new Lenis()
lenis.on('scroll', (e) => {
//console.log(e)
})
lenis.on('scroll', ScrollTrigger.update)
gsap.ticker.add((time) => {
lenis.raf(time * 1000)
})
gsap.ticker.lagSmoothing(0)
</script>
</body>
<script>
$(function(){
// footer family site toggle
$('.family_btn').click(function(e){
e.stopPropagation();
$('.family_list, .family_btn').toggleClass('family_on');
});
$(document).click(function(e){
if(!$(e.target).closest('.family_wrap').length){
$('.family_list, .family_btn').removeClass('family_on');
}
});
});
// 회원 탈퇴
function member_leave() {
if (confirm("회원에서 탈퇴 하시겠습니까?"))
location.href = '<?php echo G5_BBS_URL ?>/member_leave.php';
}
// 회원 탈퇴
let x = document.cookie;
if(x.includes("tmp_1=John")){
deleteCookie("tmp_1");
$('#pop_mypage02').show();
}
function deleteCookie(name) {
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng;";
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/bbs;";
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/faq;";
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/qa;";
}
function getCookie(cname) {
let name = cname + "=";
let decodedCookie = decodeURIComponent(document.cookie);
let ca = decodedCookie.split(';');
for(let i = 0; i <ca.length; i++) {
let c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
}
//descope 로그인, 로그아웃 js
function updateHeaderMenu() {
var isLoggedIn = !!sessionStorage.getItem("sessionJwt");
// role 체크 예시 (로그인 시 저장해놓은 값)
var isAdmin = sessionStorage.getItem('userRole') === 'super';
if (isLoggedIn) {
$('.my_join2, .my_login2').show();
$('.my_join, .my_login').hide();
// 마이페이지/관리자 메뉴 동적 출력
if (isAdmin) {
$('#my_join2').html("<a href='http://eg-bim.com/eng/adm/index.php' target='_blank'>관리페이지</a>");
} else {
$('#my_join2').html("<a href='javascript:mypage03();'>My Page</a>");
}
} else {
$('.my_join2, .my_login2').hide();
$('.my_join, .my_login').show();
$('#my_join2').html(""); // 혹시모를 내용 초기화
}
}
function descopeLogout() {
fetch('/eng/skin/member/basic/descope_logout.php', {
method: 'POST',
credentials: 'include' // PHPSESSID 쿠키 전송
})
.then(res => {
if (!res.ok) throw new Error('서버 로그아웃 실패');
// 1) 로컬 저장소 정리
// sessionStorage.removeItem("refreshJwt");
// sessionStorage.removeItem("sessionJwt");
// sessionStorage.removeItem("userRole");
// sessionStorage.removeItem("userName");
// sessionStorage.removeItem("loginId");
sessionStorage.clear();
localStorage.clear();
// 2) UI 갱신
updateHeaderMenu();
// 3) 로그인 페이지로 이동
window.location.href = '/eng/index.php';
})
.catch(err => {
console.error(err);
alert('로그아웃 중 오류가 발생했습니다.');
});
}
$(document).ready(function() {
// 기존에 있던 updateHeaderMenu() 호출 뒤에
$('#my_login2 a').off('click').on('click', function(e){
e.preventDefault();
descopeLogout();
});
});
$(document).ready(function() {
updateHeaderMenu();
// (필요하다면, 로그인 성공 후에도 항상 updateHeaderMenu(); 호출)
});
//descope login
$('#flogin button[type=submit]').click(function(e){
e.preventDefault();
let mb_id = $('#login_id').val();
let mb_password = $('#login_pw').val();
$.ajax({
url : '/eng/skin/member/basic/descope_login.php',
data : {
'mb_id' : mb_id,
'mb_password' : mb_password
},
type : "POST",
dataType : "json",
success : function(res){
if(res.status === "ok") {
// 토큰 저장
// sessionStorage.setItem("refreshJwt", res.refreshJwt);
sessionStorage.setItem("sessionJwt", res.sessionJwt);
// ✅ 사용자 정보 저장
if (res.user) {
sessionStorage.setItem("loginId", res.user.loginIds?.[0] || '');
sessionStorage.setItem("userName", res.user.name || '');
sessionStorage.setItem("company", res.user.customAttributes?.company || '');
sessionStorage.setItem("familyCompany", res.user.customAttributes?.familyCompany || '');
sessionStorage.setItem("position", res.user.customAttributes?.position || '');
sessionStorage.setItem("team", res.user.customAttributes?.team || '');
sessionStorage.setItem("familyUniqueKey", res.user.customAttributes?.familyUniqueKey || '');
sessionStorage.setItem("phone", res.user.phone || '');
}
// ✅ 추가: 관리자 등 정보 저장
if(res.user && res.user.roleNames && res.user.roleNames[0])
sessionStorage.setItem("userRole", res.user.roleNames[0]);
else
sessionStorage.removeItem("userRole");
// ✅ 로그인 후 메뉴 갱신
updateHeaderMenu();
// UI 처리
$('.popup_wrap').hide();
$('body').css('overflow', '');
lenis.start();
// alert('로그인 하셨습니다.');
} else {
alert(res.message || "로그인 실패");
// 🔴 실패 횟수에 따라 안내 배너 교체
if (res.failCount && res.failCount >= 8) {
updateLoginBanner("fail");
}
}
},
error : function(err){
alert(err.statusText || "통신 오류");
}
});
});
// ✅ 배너 교체 함수
function updateLoginBanner(type = "default") {
const $banner = $('#login_notice_banner');
if (!$banner.length) return;
if (type === "default") {
$banner.css({ background: "#063e01ff", color: "#fff" });
$banner.find("strong").text("[로그인 시스템 변경 안내]");
$banner.find("p.left").html(`
더 나은 보안을 위해 2025년 8월 8일부터 로그인 시스템이 변경되었습니다.<br>
기존 회원 또한 신규 시스템에 맞춰 재가입을 진행해주시기 바랍니다.
`);
$banner.find("p:last").html(`※ 로그인 및 가입 관련 문의: <strong>010-8721-7453</strong>`);
}
if (type === "fail") {
$banner.css({ background: "#6a0202ff", color: "#faf6f6ff" });
$banner.find("strong").text("[로그인 시도 제한 안내]");
$banner.find("p.left").html(`
비밀번호 입력을 <strong>7회 이상 연속 실패</strong>하셨습니다.<br>
<strong>8번째 시도부터 3분 대기</strong>가 적용됩니다.<br>
10회 이상 실패 시 계정이 잠금 처리됩니다.
`);
$banner.find("p:last").text("");
}
}
//회원가입 약관동의
// $('#fregister button[type=submit]').click(function(e){
// e.preventDefault();
// let agree11 = $('#agree11').val();
// let agree21 = $('#agree21').val();
// $.ajax({
// url : '<?php echo G5_URL ?>/bbs/register_form.php',
// type : "POST",
// datatype : "json",
// contentType: 'application/json; charset=utf-8',
// data : {
// 'agree11' : agree11,
// 'agree21' : agree21
// },
// success : function(data){
// var ss='';
// for(i=0; i<data.length; i++){
// ss=ss + data[i];
// }
// },
// error : function(err){
// alert(err);
// }
// });
// });
// 이지빔 프로그램 회원가입 url 쿼리스트링 파싱 함수
function getQueryString(name) {
const intro = document.querySelector('.intro_wrap');
intro.style.display = "none";
const mainMask = document.querySelector('.main_mask');
mainMask.classList.add('skip');
// mainMask.style.aimation = 'none';
const urlParams = new URLSearchParams(window.location.search);
return urlParams.get(name);
}
$(document).ready(function() {
const popupParam = getQueryString('popup');
if (popupParam === 'signup') {
console.log('쿼리 감지: signup → 회원가입 팝업 자동 오픈 시도');
$('#pop_agreement').show(); // 팝업 보여주기
// 스크롤 잠금 (사용 중이면)
$('body').css('overflow', 'hidden');
if (typeof lenis !== 'undefined') {
lenis.stop();
}
}
// 팝업 닫기 버튼 이벤트 연결
$('#pop_agreement .btn_close').on('click', function() {
$('#pop_agreement').hide();
$('body').css('overflow', '');
if (typeof lenis !== 'undefined') {
lenis.start();
}
});
});
//이지빔 프로그램 비밀번호 재설정 url 쿼리스트링 파싱 함수
$(document).ready(function() {
const urlParams = new URLSearchParams(window.location.search);
const popup = urlParams.get('popup');
const token = urlParams.get('t');
if (popup === 'pwreset') {
// 팝업 전체 열기
$('#pop_search').show();
$('body').css('overflow', 'hidden');
// 내부 컨텐츠 모두 숨기기
$('#pop_search .popup_contents_wrap').hide();
if (token) {
// 토큰이 있으면 비밀번호 재설정 단계
if (!sessionStorage.getItem('pwreset_shown')) {
$('#password_reset').show();
sessionStorage.setItem('pwreset_shown', '1');
}
} else {
// 토큰이 없으면 아이디 입력 단계 (첫 번째 .popup_contents_wrap)
$('#pop_search .popup_contents_wrap').first().show();
}
}
// 닫기 버튼
$('#pop_search .btn_close').on('click', function() {
$('#pop_search').hide();
$('body').css('overflow', '');
});
});
</script>
+501
View File
@@ -0,0 +1,501 @@
<?php include_once __DIR__ . '/asset_urls.php'; ?>
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-STZ2R5Q7HG"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-STZ2R5Q7HG');
</script>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>for BIM</title>
<link rel="stylesheet" href="../css/reset.css" />
<link rel="stylesheet" href="../css/font.css" />
<link rel="stylesheet" href="../css/style.css" />
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css" />
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script src="https://unpkg.com/lenis@1.1.9/dist/lenis.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/lenis@1.1.9/dist/lenis.css">
<script type="text/javascript" src="../js/jquery-3.6.1.min.js"></script>
<script type="text/javascript" src="../js/jquery.mousewheel.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="../js/popup.js"></script>
<script type="text/javascript" src="../js/forbim.js"></script>
</head>
<body>
<!-- "js__"로 시작하는 클래스는 only 자바스크립트용입니다. -->
<!-- XXXX js__넣어서 css 작성 금지 XXXX -->
<div class="wrapper">
<input id="hid_mb_id" type="hidden" value="<?echo $_SESSION['session_id'];?>"></input>
<!-- HEADER -->
<?php include_once($member_skin_path.'/main_header.skin.php'); ?>
<!-- //Header -->
<!-- 모든 팝업페이지 경로 -->
<?php
include_once($member_skin_path.'/login.skin.php');
include_once($member_skin_path.'/mypage01.skin.php');
include_once($member_skin_path.'/register.skin.php');
include_once($member_skin_path.'/register_form.skin.php');
include_once($member_skin_path.'/mypage02.skin.php');
include_once($member_skin_path.'/mypage03.skin.php');
include_once($member_skin_path.'/sitemap.skin.php');
include_once($member_skin_path.'/privacy.skin.php');
include_once($member_skin_path.'/password_lost.skin.php');
?>
<!-- 컨텐츠 시작 -->
<div class="container forbim">
<section class="intro">
<div class="top js__dark">
<h2 data-aos="fade-down" data-aos-duration="1000">for BIM</h2>
<span>In the Digital Transformation Era, View Drawings and BIM Models Together</span>
</div>
<div class="keyword">
<i class="egbim_obj k"></i>
<span>View 3D BIM Models<br> Alongside Drawings with a Double Click</span>
<p>EG-BIM provides a feature that allows users to easily view complex design information<br> that is difficult to check from drawings alone together with BIM models through the 3D Viewer.</p>
</div>
<div class="visual" data-aos="fade-up" data-aos-duration="1000">
<img src="<?php echo eng_img_url('forbim_visual.png'); ?>" alt="">
</div>
</section>
<section class="theorys js__dark full_screen">
<span class="mid_tit" data-aos="fade-down" data-aos-duration="1000">
“ Cross Checking Between<br class="brk"><b class="gr_txt">BIM Model Data</b> & <b class="og_txt">Drawings</b> ”
</span>
<div class="diagram_wrap" data-aos="fade-up" data-aos-duration="1000">
<div class="dia_elements_wrap">
<div class="dia_element">
<ul class="dia_text">
<li>Location Data</li>
<li>Shape Data</li>
<li>Property Information</li>
</ul>
<div class="line"></div>
</div>
<div class="dia_element">
<ul class="dia_text">
<li>Longitudinal Section</li>
<li>General Drawing</li>
<li>Detail Drawing</li>
</ul>
<div class="line"></div>
</div>
</div>
<div class="dia_circles_wrap">
<div class="circle_bim">
<div class="circle_belt"></div>
<div class="circle_core">
<span>BIM Model</span>
<i></i>
</div>
<div class="circle_dots move">
<div class="dot"></div>
</div>
<div class="circle_dots">
<div class="dot"></div>
</div>
</div>
<div class="circle_floorplan">
<div class="circle_belt"></div>
<div class="circle_core">
<span>Drawing</span>
<i></i>
</div>
<div class="circle_dots move">
<div class="dot"></div>
</div>
<div class="circle_dots">
<div class="dot"></div>
</div>
</div>
</div>
</div>
</section>
<section class="layout_fix_left process">
<div class="left" data-aos="fade-right" data-aos-duration="1000">
<div class="bg js__fixLeft_bg on"></div>
<div class="bg js__fixLeft_bg"></div>
<span class="mid_tit js__fixLeft_tit on">
<font class="num">01. </font>Simultaneous<br> <em>Drawing & BIM View</em>
</span>
<span class="mid_tit js__fixLeft_tit">
<font class="num">02. </font><em>Detailed<br> </em>BIM Model View</em>
</span>
</div>
<div class="right js__fixLeft_secs">
<span class="mid_tit m" style="display:none;">
<font class="num">01. </font>Simultaneous Drawing & BIM View
</span>
<div id="content1" class="link">
<span class="sub_tit">
<img src="<?php echo eng_img_url('ico_forbim_link.svg'); ?>" alt="">
Data Linkage Between Drawings and BIM Models
</span>
<div class="sub_text">
With data linkage between drawings and BIM models, selected components are displayed in real time, enabling users to view both simultaneously and check their location, shape, and property information.
</div>
<div class="sub_figs">
<div class="fig01"><span>Drawings</span></div>
<div class="fig02"><span>BIM Models</span></div>
<div class="fig03"><span>Property Information</span></div>
<div class="fig04"><span>Real-time display of selected components</span></div>
</div>
</div>
<span class="mid_tit m" style="display:none;">
<font class="num">02. </font>Detailed BIM Model View
</span>
<div id="content2" class="info">
<span class="sub_tit">
<img src="<?php echo eng_img_url('ico_forbim_check.svg'); ?>" alt="">
Check BIM Model Property Information and Geometry
</span>
<div class="sub_text">
<span>
Through the various visualization features of the 3D Viewer, users can closely examine the models geometry and the interference relationships between each component.
</span>
</div>
<div class="sub_figs">
<div><span>Displays component-specific property information, toggles layers On/Off, applies clipping and transparency, and adjusts scale</span></div>
</div>
</div>
</div>
</section>
</div>
<!-- FOOTER -->
<?php include_once($member_skin_path.'/main_footer.skin.php'); ?>
<!-- //FOOTER -->
</div>
<script>
AOS.init();
const lenis = new Lenis()
lenis.on('scroll', (e) => {
// console.log(e)
})
lenis.on('scroll', ScrollTrigger.update)
gsap.ticker.add((time) => {
lenis.raf(time * 1000)
})
gsap.ticker.lagSmoothing(0)
</script>
</body>
<script>
$(function(){
// footer family site toggle
$('.family_btn').click(function(e){
e.stopPropagation();
$('.family_list, .family_btn').toggleClass('family_on');
});
$(document).click(function(e){
if(!$(e.target).closest('.family_wrap').length){
$('.family_list, .family_btn').removeClass('family_on');
}
});
});
// 회원 탈퇴
function member_leave() {
if (confirm("회원에서 탈퇴 하시겠습니까?"))
location.href = '<?php echo G5_BBS_URL ?>/member_leave.php';
}
// 회원 탈퇴
let x = document.cookie;
if(x.includes("tmp_1=John")){
deleteCookie("tmp_1");
$('#pop_mypage02').show();
}
function deleteCookie(name) {
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng;";
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/bbs;";
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/faq;";
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/qa;";
}
function getCookie(cname) {
let name = cname + "=";
let decodedCookie = decodeURIComponent(document.cookie);
let ca = decodedCookie.split(';');
for(let i = 0; i <ca.length; i++) {
let c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
}
//descope 로그인, 로그아웃 js
function updateHeaderMenu() {
var isLoggedIn = !!sessionStorage.getItem("sessionJwt");
// role 체크 예시 (로그인 시 저장해놓은 값)
var isAdmin = sessionStorage.getItem('userRole') === 'super';
if (isLoggedIn) {
$('.my_join2, .my_login2').show();
$('.my_join, .my_login').hide();
// 마이페이지/관리자 메뉴 동적 출력
if (isAdmin) {
$('#my_join2').html("<a href='http://eg-bim.com/eng/adm/index.php' target='_blank'>관리페이지</a>");
} else {
$('#my_join2').html("<a href='javascript:mypage03();'>My Page</a>");
}
} else {
$('.my_join2, .my_login2').hide();
$('.my_join, .my_login').show();
$('#my_join2').html(""); // 혹시모를 내용 초기화
}
}
function descopeLogout() {
fetch('/eng/skin/member/basic/descope_logout.php', {
method: 'POST',
credentials: 'include' // PHPSESSID 쿠키 전송
})
.then(res => {
if (!res.ok) throw new Error('서버 로그아웃 실패');
// 1) 로컬 저장소 정리
// sessionStorage.removeItem("refreshJwt");
// sessionStorage.removeItem("sessionJwt");
// sessionStorage.removeItem("userRole");
// sessionStorage.removeItem("userName");
// sessionStorage.removeItem("loginId");
sessionStorage.clear();
localStorage.clear();
// 2) UI 갱신
updateHeaderMenu();
// 3) 로그인 페이지로 이동
window.location.href = '/eng/index.php';
})
.catch(err => {
console.error(err);
alert('로그아웃 중 오류가 발생했습니다.');
});
}
$(document).ready(function() {
// 기존에 있던 updateHeaderMenu() 호출 뒤에
$('#my_login2 a').off('click').on('click', function(e){
e.preventDefault();
descopeLogout();
});
});
$(document).ready(function() {
updateHeaderMenu();
// (필요하다면, 로그인 성공 후에도 항상 updateHeaderMenu(); 호출)
});
//descope login
$('#flogin button[type=submit]').click(function(e){
e.preventDefault();
let mb_id = $('#login_id').val();
let mb_password = $('#login_pw').val();
$.ajax({
url : '/eng/skin/member/basic/descope_login.php',
data : {
'mb_id' : mb_id,
'mb_password' : mb_password
},
type : "POST",
dataType : "json",
success : function(res){
if(res.status === "ok") {
// 토큰 저장
// sessionStorage.setItem("refreshJwt", res.refreshJwt);
sessionStorage.setItem("sessionJwt", res.sessionJwt);
// ✅ 사용자 정보 저장
if (res.user) {
sessionStorage.setItem("loginId", res.user.loginIds?.[0] || '');
sessionStorage.setItem("userName", res.user.name || '');
sessionStorage.setItem("company", res.user.customAttributes?.company || '');
sessionStorage.setItem("familyCompany", res.user.customAttributes?.familyCompany || '');
sessionStorage.setItem("position", res.user.customAttributes?.position || '');
sessionStorage.setItem("team", res.user.customAttributes?.team || '');
sessionStorage.setItem("familyUniqueKey", res.user.customAttributes?.familyUniqueKey || '');
sessionStorage.setItem("phone", res.user.phone || '');
}
// ✅ 추가: 관리자 등 정보 저장
if(res.user && res.user.roleNames && res.user.roleNames[0])
sessionStorage.setItem("userRole", res.user.roleNames[0]);
else
sessionStorage.removeItem("userRole");
// ✅ 로그인 후 메뉴 갱신
updateHeaderMenu();
// UI 처리
$('.popup_wrap').hide();
$('body').css('overflow', '');
lenis.start();
// alert('로그인 하셨습니다.');
} else {
alert(res.message || "로그인 실패");
// 🔴 실패 횟수에 따라 안내 배너 교체
if (res.failCount && res.failCount >= 8) {
updateLoginBanner("fail");
}
}
},
error : function(err){
alert(err.statusText || "통신 오류");
}
});
});
// ✅ 배너 교체 함수
function updateLoginBanner(type = "default") {
const $banner = $('#login_notice_banner');
if (!$banner.length) return;
if (type === "default") {
$banner.css({ background: "#063e01ff", color: "#fff" });
$banner.find("strong").text("[로그인 시스템 변경 안내]");
$banner.find("p.left").html(`
더 나은 보안을 위해 2025년 8월 8일부터 로그인 시스템이 변경되었습니다.<br>
기존 회원 또한 신규 시스템에 맞춰 재가입을 진행해주시기 바랍니다.
`);
$banner.find("p:last").html(`※ 로그인 및 가입 관련 문의: <strong>010-8721-7453</strong>`);
}
if (type === "fail") {
$banner.css({ background: "#6a0202ff", color: "#faf6f6ff" });
$banner.find("strong").text("[로그인 시도 제한 안내]");
$banner.find("p.left").html(`
비밀번호 입력을 <strong>7회 이상 연속 실패</strong>하셨습니다.<br>
<strong>8번째 시도부터 3분 대기</strong>가 적용됩니다.<br>
10회 이상 실패 시 계정이 잠금 처리됩니다.
`);
$banner.find("p:last").text("");
}
}
//회원가입 약관동의
// $('#fregister button[type=submit]').click(function(e){
// e.preventDefault();
// let agree11 = $('#agree11').val();
// let agree21 = $('#agree21').val();
// $.ajax({
// url : '<?php echo G5_URL ?>/bbs/register_form.php',
// type : "POST",
// datatype : "json",
// contentType: 'application/json; charset=utf-8',
// data : {
// 'agree11' : agree11,
// 'agree21' : agree21
// },
// success : function(data){
// var ss='';
// for(i=0; i<data.length; i++){
// ss=ss + data[i];
// }
// },
// error : function(err){
// alert(err);
// }
// });
// });
// 이지빔 프로그램 회원가입 url 쿼리스트링 파싱 함수
function getQueryString(name) {
const intro = document.querySelector('.intro_wrap');
const mainMask = document.querySelector('.main_mask');
if (intro) {
intro.style.display = "none";
}
if (mainMask) {
mainMask.classList.add('skip');
}
// mainMask.style.aimation = 'none';
const urlParams = new URLSearchParams(window.location.search);
return urlParams.get(name);
}
$(document).ready(function() {
const popupParam = getQueryString('popup');
if (popupParam === 'signup') {
console.log('쿼리 감지: signup → 회원가입 팝업 자동 오픈 시도');
$('#pop_agreement').show(); // 팝업 보여주기
// 스크롤 잠금 (사용 중이면)
$('body').css('overflow', 'hidden');
if (typeof lenis !== 'undefined') {
lenis.stop();
}
}
// 팝업 닫기 버튼 이벤트 연결
$('#pop_agreement .btn_close').on('click', function() {
$('#pop_agreement').hide();
$('body').css('overflow', '');
if (typeof lenis !== 'undefined') {
lenis.start();
}
});
});
//이지빔 프로그램 비밀번호 재설정 url 쿼리스트링 파싱 함수
$(document).ready(function() {
const urlParams = new URLSearchParams(window.location.search);
const popup = urlParams.get('popup');
const token = urlParams.get('t');
if (popup === 'pwreset') {
// 팝업 전체 열기
$('#pop_search').show();
$('body').css('overflow', 'hidden');
// 내부 컨텐츠 모두 숨기기
$('#pop_search .popup_contents_wrap').hide();
if (token) {
// 토큰이 있으면 비밀번호 재설정 단계
if (!sessionStorage.getItem('pwreset_shown')) {
$('#password_reset').show();
sessionStorage.setItem('pwreset_shown', '1');
}
} else {
// 토큰이 없으면 아이디 입력 단계 (첫 번째 .popup_contents_wrap)
$('#pop_search .popup_contents_wrap').first().show();
}
}
// 닫기 버튼
$('#pop_search .btn_close').on('click', function() {
$('#pop_search').hide();
$('body').css('overflow', '');
});
});
</script>
+103
View File
@@ -0,0 +1,103 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">', 0);
?>
<!-- 폼메일 시작 { -->
<div id="formmail" class="new_win">
<h1 id="win_title"><?php echo $name ?>님께 메일보내기</h1>
<form name="fformmail" action="./formmail_send.php" onsubmit="return fformmail_submit(this);" method="post" enctype="multipart/form-data" style="margin:0px;">
<input type="hidden" name="to" value="<?php echo $email ?>">
<input type="hidden" name="attach" value="2">
<?php if ($is_member) { // 회원이면 ?>
<input type="hidden" name="fnick" value="<?php echo get_text($member['mb_nick']) ?>">
<input type="hidden" name="fmail" value="<?php echo $member['mb_email'] ?>">
<?php } ?>
<div class="form_01 new_win_con">
<h2 class="sound_only">메일쓰기</h2>
<ul>
<?php if (!$is_member) { ?>
<li>
<label for="fnick" class="sound_only">이름<strong>필수</strong></label>
<input type="text" name="fnick" id="fnick" required class="frm_input full_input required" placeholder="이름">
</li>
<li>
<label for="fmail" class="sound_only">E-mail<strong>필수</strong></label>
<input type="text" name="fmail" id="fmail" required class="frm_input full_input required" placeholder="E-mail">
</li>
<?php } ?>
<li>
<label for="subject" class="sound_only">제목<strong>필수</strong></label>
<input type="text" name="subject" id="subject" required class="frm_input full_input required" placeholder="제목">
</li>
<li class="chk_box">
<span class="sound_only">형식</span>
<input type="radio" name="type" value="0" id="type_text" checked>
<label for="type_text"><span></span>TEXT</label>
<input type="radio" name="type" value="1" id="type_html">
<label for="type_html"><span></span>HTML</label>
<input type="radio" name="type" value="2" id="type_both">
<label for="type_both"><span></span>TEXT+HTML</label>
</li>
<li>
<label for="content" class="sound_only">내용<strong>필수</strong></label>
<textarea name="content" id="content" required class="required"></textarea>
</li>
<li class="formmail_flie">
<div class="file_wr">
<label for="file1" class="lb_icon"><i class="fa fa-download" aria-hidden="true"></i><span class="sound_only"> 첨부 파일 1</span></label>
<input type="file" name="file1" id="file1" class="frm_file full_input">
</div>
<div class="frm_info">첨부 파일은 누락될 수 있으므로 메일을 보낸 후 파일이 첨부 되었는지 반드시 확인해 주시기 바랍니다.</div>
</li>
<li class="formmail_flie">
<div class="file_wr">
<label for="file2" class="lb_icon"><i class="fa fa-download" aria-hidden="true"></i><span class="sound_only"> 첨부 파일 2</span></label>
<input type="file" name="file2" id="file2" class="frm_file full_input">
</div>
</li>
<li>
<span class="sound_only">자동등록방지</span>
<?php echo captcha_html(); ?>
</li>
</ul>
<div class="win_btn">
<button type="submit" id="btn_submit" class="btn_b02 reply_btn">메일발송</button>
<button type="button" onclick="window.close();" class="btn_close">창닫기</button>
</div>
</div>
</form>
</div>
<script>
with (document.fformmail) {
if (typeof fname != "undefined")
fname.focus();
else if (typeof subject != "undefined")
subject.focus();
}
function fformmail_submit(f)
{
<?php echo chk_captcha_js(); ?>
if (f.file1.value || f.file2.value) {
// 4.00.11
if (!confirm("첨부파일의 용량이 큰경우 전송시간이 오래 걸립니다.\n\n메일보내기가 완료되기 전에 창을 닫거나 새로고침 하지 마십시오."))
return false;
}
document.getElementById('btn_submit').disabled = true;
return true;
}
</script>
<!-- } 폼메일 끝 -->
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 B

+515
View File
@@ -0,0 +1,515 @@
<?php include_once __DIR__ . '/asset_urls.php'; ?>
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-STZ2R5Q7HG"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-STZ2R5Q7HG');
</script>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>인터페이스</title>
<link rel="stylesheet" href="../css/reset.css"/>
<link rel="stylesheet" href="../css/font.css"/>
<link rel="stylesheet" href="../css/style.css"/>
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css"/>
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script src="https://unpkg.com/lenis@1.1.9/dist/lenis.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/lenis@1.1.9/dist/lenis.css">
<script type="text/javascript" src="../js/jquery-3.6.1.min.js"></script>
<script type="text/javascript" src="../js/jquery.mousewheel.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
<!-- 듀얼모니터 시퀀스애니메이션 스크립트 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/2.1.3/TweenMax.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.7/ScrollMagic.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.7/plugins/animation.gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.7/plugins/debug.addIndicators.min.js"></script>
<!-- 듀얼모니터 시퀀스애니메이션 스크립트 -->
<script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="../js/popup.js"></script>
<script type="text/javascript" src="../js/interface.js"></script>
</head>
<body>
<!-- "js__"로 시작하는 클래스는 only 자바스크립트용입니다. -->
<!-- XXXX js__넣어서 css 작성 금지 XXXX -->
<div class="wrapper">
<input id="hid_mb_id" type="hidden" value="<?echo $_SESSION['session_id'];?>"></input>
<!-- HEADER -->
<?php include_once($member_skin_path.'/main_header.skin.php'); ?>
<!-- //Header -->
<!-- 모든 팝업페이지 경로 -->
<?php
include_once($member_skin_path.'/login.skin.php');
include_once($member_skin_path.'/mypage01.skin.php');
include_once($member_skin_path.'/register.skin.php');
include_once($member_skin_path.'/register_form.skin.php');
include_once($member_skin_path.'/mypage02.skin.php');
include_once($member_skin_path.'/mypage03.skin.php');
include_once($member_skin_path.'/sitemap.skin.php');
include_once($member_skin_path.'/privacy.skin.php');
include_once($member_skin_path.'/password_lost.skin.php');
?>
<!-- 컨텐츠 시작 -->
<div class="container interface">
<div class="mouse_mark js__mouse_mark" style="display:none"><span>SCROLL</span></div>
<div class="mouse_mark js__mouse_mark02" style="display:none"><span>SCROLL</span></div>
<section class="intro">
<div class="top js__dark">
<h2 data-aos="fade-down" data-aos-duration="1000">Interface</h2>
<span>UX design refined through real user experience</span>
</div>
</section>
<section class="route js__mouse_area">
<div class="fix">
<div class="keyword">
<i class="egbim_obj k"></i>
<span>Easy & Simple</span>
<p>Leave complex work environments behind and <b>enjoy a simple, intuitive interface.</b></p>
</div>
<div class="content">
<ul class="subs">
<li class="on">
<span class="sub_tit">Interface</span>
<span class="mid_tit">Easy & Simple<br> <b>Interface</b></span>
<span class="sub_text">
Designed with user convenience as the top priority, EG-BIM replaces the complex and cluttered interface with <b>a clean, intuitive menu layout</b> that anyone can use with ease.
</span>
</li>
<li>
<span class="sub_tit">Grouping</span>
<span class="mid_tit"><b>Grouped by Function,</b><br> Refined in design</span>
<span class="sub_text">
The interface is <b>simplified and systemized by function</b>, allowing users to easily locate the tools they need through structured menus.
</span>
</li>
<li>
<span class="sub_tit">Imaging</span>
<span class="mid_tit"><b>Visualized</b><br> Information Delivery</span>
<span class="sub_text">
Object Property Information is displayed visually with images, making it easier for users to understand and improving clarity in information delivery.
<ul>
<li>Property windows by object type</li>
<li>Displays basic, geometric, and positional data</li>
<li>Improves readability and work efficiency</li>
</ul>
</span>
</li>
</ul>
<ul class="imgs">
<li class="on">
<span>File Menu</span>
<span>Object Properties Display</span>
<span>Workspace Settings</span>
<span>Command Icons</span>
<span>Spacious Workspace</span>
<div class="img_box">
<object data="<?php echo eng_img_url('interface_img_01.svg'); ?>"></object>
</div>
</li>
<li>
<span>Object Properties Menu</span>
<span>Home Menu</span>
<span>Workspace Icon Bar</span>
<span>Command Icon Bar</span>
<div class="img_box">
<object data="<?php echo eng_img_url('interface_img_02.png'); ?>"></object>
</div>
</li>
<li>
<span>Object Property Window</span>
<div class="img_box">
<object data="<?php echo eng_img_url('interface_img_03.svg'); ?>"></object>
</div>
</li>
</ul>
</div>
</div>
<div id="sec1"></div>
<div id="sec2"></div>
<div id="sec3"></div>
</section>
<section class="dual full_screen" id="dualm">
<div class="dual_top js__mouse_area02">
<div class="sub_tit">
Dual-Monitor Workspace <br>
Experience a new workspace with <b>dual-monitor support.</b>
</div>
<div id="imagesequence" class="pin" style="text-align: center;">
<!-- <img id="myimg" src="<?php echo eng_img_url('com_img/comp_1.png'); ?>"> KR sequence -->
<img id="myimg" src="<?php echo eng_img_url('com_img/eng/comp_1.png'); ?>"><!-- 영문시퀀스 -->
</div>
</div>
<div class="detail">
<div class="sub_tit">
Simultaneous Work<br><b> through Linked Workspace</b>
</div>
<div class="subs">
<div class="element">
<div class="exam">
<div class="exam_01">
<span>Model Space</span>
<img src="<?php echo eng_img_url('dual_img01_01.png'); ?>" alt="">
</div>
<div class="exam_02">
<span>Layout Space</span>
<img src="<?php echo eng_img_url('dual_img01_02.png'); ?>" alt="">
</div>
</div>
<div class="sub_text">
<span>
Work seamlessly between model and layout spaces <b>without switching back and forth, thanks to linked workspace functionality.</b>
</span>
</div>
</div>
<div class="element">
<div class="exam">
<div class="exam_01">
<span>Working Drawing</span>
<img src="<?php echo eng_img_url('dual_img02_01.png'); ?>" alt="">
</div>
<div class="exam_02">
<span>Reference Drawing</span>
<img src="<?php echo eng_img_url('dual_img02_02.png'); ?>" alt="">
</div>
</div>
<div class="sub_text">
<span>Separate the workspace for reference drawing <b>to prevent accidental changes, and work safely</b> in read-only mode.</span>
</div>
</div>
</div>
</div>
</section>
</div>
<!-- FOOTER -->
<?php include_once($member_skin_path.'/main_footer.skin.php'); ?>
<!-- //FOOTER -->
</div>
<script>
AOS.init();
const lenis = new Lenis()
lenis.on('scroll', (e) => {
// console.log(e)
})
lenis.on('scroll', ScrollTrigger.update)
gsap.ticker.add((time)=>{
lenis.raf(time * 1000)
})
gsap.ticker.lagSmoothing(0)
// 페이지 로드 시에도 실행하여 초기 상태 확인
if (window.innerWidth <= 1200) {
const element = document.getElementById('dualm');
if (element) {
console.log('b')
element.removeAttribute('id');
}
}
</script>
</body>
<script>
$(function(){
// footer family site toggle
$('.family_btn').click(function(e){
e.stopPropagation();
$('.family_list, .family_btn').toggleClass('family_on');
});
$(document).click(function(e){
if(!$(e.target).closest('.family_wrap').length){
$('.family_list, .family_btn').removeClass('family_on');
}
});
});
// 회원 탈퇴
function member_leave() {
if (confirm("회원에서 탈퇴 하시겠습니까?"))
location.href = '<?php echo G5_BBS_URL ?>/member_leave.php';
}
// 회원 탈퇴
let x = document.cookie;
if(x.includes("tmp_1=John")){
deleteCookie("tmp_1");
$('#pop_mypage02').show();
}
function deleteCookie(name) {
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng;";
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/bbs;";
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/faq;";
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/qa;";
}
function getCookie(cname) {
let name = cname + "=";
let decodedCookie = decodeURIComponent(document.cookie);
let ca = decodedCookie.split(';');
for(let i = 0; i <ca.length; i++) {
let c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
}
//descope 로그인, 로그아웃 js
function updateHeaderMenu() {
var isLoggedIn = !!sessionStorage.getItem("sessionJwt");
// role 체크 예시 (로그인 시 저장해놓은 값)
var isAdmin = sessionStorage.getItem('userRole') === 'super';
if (isLoggedIn) {
$('.my_join2, .my_login2').show();
$('.my_join, .my_login').hide();
// 마이페이지/관리자 메뉴 동적 출력
if (isAdmin) {
$('#my_join2').html("<a href='http://eg-bim.com/eng/adm/index.php' target='_blank'>관리페이지</a>");
} else {
$('#my_join2').html("<a href='javascript:mypage03();'>My Page</a>");
}
} else {
$('.my_join2, .my_login2').hide();
$('.my_join, .my_login').show();
$('#my_join2').html(""); // 혹시모를 내용 초기화
}
}
function descopeLogout() {
fetch('/eng/skin/member/basic/descope_logout.php', {
method: 'POST',
credentials: 'include' // PHPSESSID 쿠키 전송
})
.then(res => {
if (!res.ok) throw new Error('서버 로그아웃 실패');
// 1) 로컬 저장소 정리
// sessionStorage.removeItem("refreshJwt");
// sessionStorage.removeItem("sessionJwt");
// sessionStorage.removeItem("userRole");
// sessionStorage.removeItem("userName");
// sessionStorage.removeItem("loginId");
sessionStorage.clear();
localStorage.clear();
// 2) UI 갱신
updateHeaderMenu();
// 3) 로그인 페이지로 이동
window.location.href = '/eng/index.php';
})
.catch(err => {
console.error(err);
alert('로그아웃 중 오류가 발생했습니다.');
});
}
$(document).ready(function() {
// 기존에 있던 updateHeaderMenu() 호출 뒤에
$('#my_login2 a').off('click').on('click', function(e){
e.preventDefault();
descopeLogout();
});
});
$(document).ready(function() {
updateHeaderMenu();
// (필요하다면, 로그인 성공 후에도 항상 updateHeaderMenu(); 호출)
});
//descope login
$('#flogin button[type=submit]').click(function(e){
e.preventDefault();
let mb_id = $('#login_id').val();
let mb_password = $('#login_pw').val();
$.ajax({
url : '/eng/skin/member/basic/descope_login.php',
data : {
'mb_id' : mb_id,
'mb_password' : mb_password
},
type : "POST",
dataType : "json",
success : function(res){
if(res.status === "ok") {
// 토큰 저장
// sessionStorage.setItem("refreshJwt", res.refreshJwt);
sessionStorage.setItem("sessionJwt", res.sessionJwt);
// ✅ 사용자 정보 저장
if (res.user) {
sessionStorage.setItem("loginId", res.user.loginIds?.[0] || '');
sessionStorage.setItem("userName", res.user.name || '');
sessionStorage.setItem("company", res.user.customAttributes?.company || '');
sessionStorage.setItem("familyCompany", res.user.customAttributes?.familyCompany || '');
sessionStorage.setItem("position", res.user.customAttributes?.position || '');
sessionStorage.setItem("team", res.user.customAttributes?.team || '');
sessionStorage.setItem("familyUniqueKey", res.user.customAttributes?.familyUniqueKey || '');
sessionStorage.setItem("phone", res.user.phone || '');
}
// ✅ 추가: 관리자 등 정보 저장
if(res.user && res.user.roleNames && res.user.roleNames[0])
sessionStorage.setItem("userRole", res.user.roleNames[0]);
else
sessionStorage.removeItem("userRole");
// ✅ 로그인 후 메뉴 갱신
updateHeaderMenu();
// UI 처리
$('.popup_wrap').hide();
$('body').css('overflow', '');
lenis.start();
// alert('로그인 하셨습니다.');
} else {
alert(res.message || "로그인 실패");
// 🔴 실패 횟수에 따라 안내 배너 교체
if (res.failCount && res.failCount >= 8) {
updateLoginBanner("fail");
}
}
},
error : function(err){
alert(err.statusText || "통신 오류");
}
});
});
// ✅ 배너 교체 함수
function updateLoginBanner(type = "default") {
const $banner = $('#login_notice_banner');
if (!$banner.length) return;
if (type === "default") {
$banner.css({ background: "#063e01ff", color: "#fff" });
$banner.find("strong").text("[로그인 시스템 변경 안내]");
$banner.find("p.left").html(`
더 나은 보안을 위해 2025년 8월 8일부터 로그인 시스템이 변경되었습니다.<br>
기존 회원 또한 신규 시스템에 맞춰 재가입을 진행해주시기 바랍니다.
`);
$banner.find("p:last").html(`※ 로그인 및 가입 관련 문의: <strong>010-8721-7453</strong>`);
}
if (type === "fail") {
$banner.css({ background: "#6a0202ff", color: "#faf6f6ff" });
$banner.find("strong").text("[로그인 시도 제한 안내]");
$banner.find("p.left").html(`
비밀번호 입력을 <strong>7회 이상 연속 실패</strong>하셨습니다.<br>
<strong>8번째 시도부터 3분 대기</strong>가 적용됩니다.<br>
10회 이상 실패 시 계정이 잠금 처리됩니다.
`);
$banner.find("p:last").text("");
}
}
//회원가입 약관동의
// $('#fregister button[type=submit]').click(function(e){
// e.preventDefault();
// let agree11 = $('#agree11').val();
// let agree21 = $('#agree21').val();
// $.ajax({
// url : '<?php echo G5_URL ?>/bbs/register_form.php',
// type : "POST",
// datatype : "json",
// contentType: 'application/json; charset=utf-8',
// data : {
// 'agree11' : agree11,
// 'agree21' : agree21
// },
// success : function(data){
// var ss='';
// for(i=0; i<data.length; i++){
// ss=ss + data[i];
// }
// },
// error : function(err){
// alert(err);
// }
// });
// });
// 이지빔 프로그램 회원가입 url 쿼리스트링 파싱 함수
function getQueryString(name) {
const intro = document.querySelector('.intro_wrap');
intro.style.display = "none";
const mainMask = document.querySelector('.main_mask');
mainMask.classList.add('skip');
// mainMask.style.aimation = 'none';
const urlParams = new URLSearchParams(window.location.search);
return urlParams.get(name);
}
$(document).ready(function() {
const popupParam = getQueryString('popup');
if (popupParam === 'signup') {
console.log('쿼리 감지: signup → 회원가입 팝업 자동 오픈 시도');
$('#pop_agreement').show(); // 팝업 보여주기
// 스크롤 잠금 (사용 중이면)
$('body').css('overflow', 'hidden');
if (typeof lenis !== 'undefined') {
lenis.stop();
}
}
// 팝업 닫기 버튼 이벤트 연결
$('#pop_agreement .btn_close').on('click', function() {
$('#pop_agreement').hide();
$('body').css('overflow', '');
if (typeof lenis !== 'undefined') {
lenis.start();
}
});
});
//이지빔 프로그램 비밀번호 재설정 url 쿼리스트링 파싱 함수
$(document).ready(function() {
const urlParams = new URLSearchParams(window.location.search);
const popup = urlParams.get('popup');
const token = urlParams.get('t');
if (popup === 'pwreset') {
// 팝업 전체 열기
$('#pop_search').show();
$('body').css('overflow', 'hidden');
// 내부 컨텐츠 모두 숨기기
$('#pop_search .popup_contents_wrap').hide();
if (token) {
// 토큰이 있으면 비밀번호 재설정 단계
if (!sessionStorage.getItem('pwreset_shown')) {
$('#password_reset').show();
sessionStorage.setItem('pwreset_shown', '1');
}
} else {
// 토큰이 없으면 아이디 입력 단계 (첫 번째 .popup_contents_wrap)
$('#pop_search .popup_contents_wrap').first().show();
}
}
// 닫기 버튼
$('#pop_search .btn_close').on('click', function() {
$('#pop_search').hide();
$('body').css('overflow', '');
});
});
</script>
@@ -0,0 +1,513 @@
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-STZ2R5Q7HG"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-STZ2R5Q7HG');
</script>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>인터페이스</title>
<link rel="stylesheet" href="../css/reset.css"/>
<link rel="stylesheet" href="../css/font.css"/>
<link rel="stylesheet" href="../css/style.css"/>
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css"/>
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script src="https://unpkg.com/lenis@1.1.9/dist/lenis.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/lenis@1.1.9/dist/lenis.css">
<script type="text/javascript" src="../js/jquery-3.6.1.min.js"></script>
<script type="text/javascript" src="../js/jquery.mousewheel.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
<!-- 듀얼모니터 시퀀스애니메이션 스크립트 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/2.1.3/TweenMax.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.7/ScrollMagic.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.7/plugins/animation.gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.7/plugins/debug.addIndicators.min.js"></script>
<!-- 듀얼모니터 시퀀스애니메이션 스크립트 -->
<script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="../js/popup.js"></script>
<script type="text/javascript" src="../js/interface.js"></script>
</head>
<body>
<!-- "js__" 시작하는 클래스는 only 자바스크립트용입니다. -->
<!-- XXXX js__넣어서 css 작성 금지 XXXX -->
<div class="wrapper">
<input id="hid_mb_id" type="hidden" value="<?echo $_SESSION['session_id'];?>"></input>
<!-- HEADER -->
<?php include_once($member_skin_path.'/main_header.skin.php'); ?>
<!-- //Header -->
<!-- 모든 팝업페이지 경로 -->
<?php
include_once($member_skin_path.'/login.skin.php');
include_once($member_skin_path.'/mypage01.skin.php');
include_once($member_skin_path.'/register.skin.php');
include_once($member_skin_path.'/register_form.skin.php');
include_once($member_skin_path.'/mypage02.skin.php');
include_once($member_skin_path.'/mypage03.skin.php');
include_once($member_skin_path.'/sitemap.skin.php');
include_once($member_skin_path.'/privacy.skin.php');
include_once($member_skin_path.'/password_lost.skin.php');
?>
<!-- 컨텐츠 시작 -->
<div class="container interface">
<div class="mouse_mark js__mouse_mark" style="display:none"><span>SCROLL</span></div>
<div class="mouse_mark js__mouse_mark02" style="display:none"><span>SCROLL</span></div>
<section class="intro">
<div class="top js__dark">
<h2 data-aos="fade-down" data-aos-duration="1000">Interface</h2>
<span>UX design refined through real user experience</span>
</div>
</section>
<section class="route js__mouse_area">
<div class="fix">
<div class="keyword">
<i class="egbim_obj k"></i>
<span>Easy & Simple</span>
<p>Leave complex work environments behind and <b>enjoy a simple, intuitive interface.</b></p>
</div>
<div class="content">
<ul class="subs">
<li class="on">
<span class="sub_tit">Interface</span>
<span class="mid_tit">Easy & Simple<br> <b>Interface</b></span>
<span class="sub_text">
Designed with user convenience as the top priority, EG-BIM replaces the complex and cluttered interface with <b>a clean, intuitive menu layout</b> that anyone can use with ease.
</span>
</li>
<li>
<span class="sub_tit">Grouping</span>
<span class="mid_tit"><b>Grouped by Function,</b><br> Refined in design</span>
<span class="sub_text">
The interface is <b>simplified and systemized by function</b>, allowing users to easily locate the tools they need through structured menus.
</span>
</li>
<li>
<span class="sub_tit">Imaging</span>
<span class="mid_tit"><b>Visualized</b><br> Information Delivery</span>
<span class="sub_text">
Object Property Information is displayed visually with images, making it easier for users to understand and improving clarity in information delivery.
<ul>
<li>Property windows by object type</li>
<li>Displays basic, geometric, and positional data</li>
<li>Improves readability and work efficiency</li>
</ul>
</span>
</li>
</ul>
<ul class="imgs">
<li class="on">
<span>File Menu</span>
<span>Object Properties Display</span>
<span>Workspace Settings</span>
<span>Command Icons</span>
<span>Spacious Workspace</span>
<div class="img_box">
<object data="../img/interface_img_01.svg"></object>
</div>
</li>
<li>
<span>Object Properties Menu</span>
<span>Home Menu</span>
<span>Workspace Icon Bar</span>
<span>Command Icon Bar</span>
<div class="img_box">
<object data="../img/interface_img_02.png"></object>
</div>
</li>
<li>
<span>Object Property Window</span>
<div class="img_box">
<object data="../img/interface_img_03.svg"></object>
</div>
</li>
</ul>
</div>
</div>
<div id="sec1"></div>
<div id="sec2"></div>
<div id="sec3"></div>
</section>
<section class="dual" id="dualm">
<div class="dual_top js__mouse_area02">
<div class="sub_tit">
Dual-Monitor Workspace <br>
Experience a new workspace with <b>dual-monitor support.</b>
</div>
<div id="imagesequence" class="pin" style="text-align: center;">
<img id="myimg" src="../img/com_img/comp_1.png">
</div>
</div>
<div class="detail">
<div class="sub_tit">
Simultaneous Work<br><b> through Linked Workspace</b>
</div>
<div class="subs">
<div class="element">
<div class="exam">
<div class="exam_01">
<span>Model Space</span>
<img src="../img/dual_img01_01.png" alt="">
</div>
<div class="exam_02">
<span>Layout Space</span>
<img src="../img/dual_img01_02.png" alt="">
</div>
</div>
<div class="sub_text">
<span>
Work seamlessly between model and layout spaces <b>without switching back and forth, thanks to linked workspace functionality.</b>
</span>
</div>
</div>
<div class="element">
<div class="exam">
<div class="exam_01">
<span>Working Drawing</span>
<img src="../img/dual_img02_01.png" alt="">
</div>
<div class="exam_02">
<span>Reference Drawing</span>
<img src="../img/dual_img02_02.png" alt="">
</div>
</div>
<div class="sub_text">
<span>Separate the workspace for reference drawing <b>to prevent accidental changes, and work safely</b> in read-only mode.</span>
</div>
</div>
</div>
</div>
</section>
</div>
<!-- FOOTER -->
<?php include_once($member_skin_path.'/main_footer.skin.php'); ?>
<!-- //FOOTER -->
</div>
<script>
AOS.init();
const lenis = new Lenis()
lenis.on('scroll', (e) => {
// console.log(e)
})
lenis.on('scroll', ScrollTrigger.update)
gsap.ticker.add((time)=>{
lenis.raf(time * 1000)
})
gsap.ticker.lagSmoothing(0)
// 페이지 로드 시에도 실행하여 초기 상태 확인
if (window.innerWidth <= 1200) {
const element = document.getElementById('dualm');
if (element) {
console.log('b')
element.removeAttribute('id');
}
}
</script>
</body>
<script>
$(function(){
// footer family site toggle
$('.family_btn').click(function(e){
e.stopPropagation();
$('.family_list, .family_btn').toggleClass('family_on');
});
$(document).click(function(e){
if(!$(e.target).closest('.family_wrap').length){
$('.family_list, .family_btn').removeClass('family_on');
}
});
});
// 회원 탈퇴
function member_leave() {
if (confirm("회원에서 탈퇴 하시겠습니까?"))
location.href = '<?php echo G5_BBS_URL ?>/member_leave.php';
}
// 회원 탈퇴
let x = document.cookie;
if(x.includes("tmp_1=John")){
deleteCookie("tmp_1");
$('#pop_mypage02').show();
}
function deleteCookie(name) {
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng;";
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/bbs;";
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/faq;";
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/qa;";
}
function getCookie(cname) {
let name = cname + "=";
let decodedCookie = decodeURIComponent(document.cookie);
let ca = decodedCookie.split(';');
for(let i = 0; i <ca.length; i++) {
let c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
}
//descope 로그인, 로그아웃 js
function updateHeaderMenu() {
var isLoggedIn = !!sessionStorage.getItem("sessionJwt");
// role 체크 예시 (로그인 시 저장해놓은 값)
var isAdmin = sessionStorage.getItem('userRole') === 'super';
if (isLoggedIn) {
$('.my_join2, .my_login2').show();
$('.my_join, .my_login').hide();
// 마이페이지/관리자 메뉴 동적 출력
if (isAdmin) {
$('#my_join2').html("<a href='http://eg-bim.com/eng/adm/index.php' target='_blank'>관리페이지</a>");
} else {
$('#my_join2').html("<a href='javascript:mypage03();'>My Page</a>");
}
} else {
$('.my_join2, .my_login2').hide();
$('.my_join, .my_login').show();
$('#my_join2').html(""); // 혹시모를 내용 초기화
}
}
function descopeLogout() {
fetch('/eng/skin/member/basic/descope_logout.php', {
method: 'POST',
credentials: 'include' // PHPSESSID 쿠키 전송
})
.then(res => {
if (!res.ok) throw new Error('서버 로그아웃 실패');
// 1) 로컬 저장소 정리
// sessionStorage.removeItem("refreshJwt");
// sessionStorage.removeItem("sessionJwt");
// sessionStorage.removeItem("userRole");
// sessionStorage.removeItem("userName");
// sessionStorage.removeItem("loginId");
sessionStorage.clear();
localStorage.clear();
// 2) UI 갱신
updateHeaderMenu();
// 3) 로그인 페이지로 이동
window.location.href = '/eng/index.php';
})
.catch(err => {
console.error(err);
alert('로그아웃 중 오류가 발생했습니다.');
});
}
$(document).ready(function() {
// 기존에 있던 updateHeaderMenu() 호출 뒤에
$('#my_login2 a').off('click').on('click', function(e){
e.preventDefault();
descopeLogout();
});
});
$(document).ready(function() {
updateHeaderMenu();
// (필요하다면, 로그인 성공 후에도 항상 updateHeaderMenu(); 호출)
});
//descope login
$('#flogin button[type=submit]').click(function(e){
e.preventDefault();
let mb_id = $('#login_id').val();
let mb_password = $('#login_pw').val();
$.ajax({
url : '/eng/skin/member/basic/descope_login.php',
data : {
'mb_id' : mb_id,
'mb_password' : mb_password
},
type : "POST",
dataType : "json",
success : function(res){
if(res.status === "ok") {
// 토큰 저장
// sessionStorage.setItem("refreshJwt", res.refreshJwt);
sessionStorage.setItem("sessionJwt", res.sessionJwt);
// ✅ 사용자 정보 저장
if (res.user) {
sessionStorage.setItem("loginId", res.user.loginIds?.[0] || '');
sessionStorage.setItem("userName", res.user.name || '');
sessionStorage.setItem("company", res.user.customAttributes?.company || '');
sessionStorage.setItem("familyCompany", res.user.customAttributes?.familyCompany || '');
sessionStorage.setItem("position", res.user.customAttributes?.position || '');
sessionStorage.setItem("team", res.user.customAttributes?.team || '');
sessionStorage.setItem("familyUniqueKey", res.user.customAttributes?.familyUniqueKey || '');
sessionStorage.setItem("phone", res.user.phone || '');
}
// ✅ 추가: 관리자 등 정보 저장
if(res.user && res.user.roleNames && res.user.roleNames[0])
sessionStorage.setItem("userRole", res.user.roleNames[0]);
else
sessionStorage.removeItem("userRole");
// ✅ 로그인 후 메뉴 갱신
updateHeaderMenu();
// UI 처리
$('.popup_wrap').hide();
$('body').css('overflow', '');
lenis.start();
// alert('로그인 하셨습니다.');
} else {
alert(res.message || "로그인 실패");
// 🔴 실패 횟수에 따라 안내 배너 교체
if (res.failCount && res.failCount >= 8) {
updateLoginBanner("fail");
}
}
},
error : function(err){
alert(err.statusText || "통신 오류");
}
});
});
// ✅ 배너 교체 함수
function updateLoginBanner(type = "default") {
const $banner = $('#login_notice_banner');
if (!$banner.length) return;
if (type === "default") {
$banner.css({ background: "#063e01ff", color: "#fff" });
$banner.find("strong").text("[로그인 시스템 변경 안내]");
$banner.find("p.left").html(`
더 나은 보안을 위해 2025년 8월 8일부터 로그인 시스템이 변경되었습니다.<br>
기존 회원 또한 신규 시스템에 맞춰 재가입을 진행해주시기 바랍니다.
`);
$banner.find("p:last").html(`※ 로그인 및 가입 관련 문의: <strong>010-8721-7453</strong>`);
}
if (type === "fail") {
$banner.css({ background: "#6a0202ff", color: "#faf6f6ff" });
$banner.find("strong").text("[로그인 시도 제한 안내]");
$banner.find("p.left").html(`
비밀번호 입력을 <strong>7회 이상 연속 실패</strong>하셨습니다.<br>
<strong>8번째 시도부터 3분 대기</strong>가 적용됩니다.<br>
10회 이상 실패 시 계정이 잠금 처리됩니다.
`);
$banner.find("p:last").text("");
}
}
//회원가입 약관동의
// $('#fregister button[type=submit]').click(function(e){
// e.preventDefault();
// let agree11 = $('#agree11').val();
// let agree21 = $('#agree21').val();
// $.ajax({
// url : '<?php echo G5_URL ?>/bbs/register_form.php',
// type : "POST",
// datatype : "json",
// contentType: 'application/json; charset=utf-8',
// data : {
// 'agree11' : agree11,
// 'agree21' : agree21
// },
// success : function(data){
// var ss='';
// for(i=0; i<data.length; i++){
// ss=ss + data[i];
// }
// },
// error : function(err){
// alert(err);
// }
// });
// });
// 이지빔 프로그램 회원가입 url 쿼리스트링 파싱 함수
function getQueryString(name) {
const intro = document.querySelector('.intro_wrap');
intro.style.display = "none";
const mainMask = document.querySelector('.main_mask');
mainMask.classList.add('skip');
// mainMask.style.aimation = 'none';
const urlParams = new URLSearchParams(window.location.search);
return urlParams.get(name);
}
$(document).ready(function() {
const popupParam = getQueryString('popup');
if (popupParam === 'signup') {
console.log('쿼리 감지: signup → 회원가입 팝업 자동 오픈 시도');
$('#pop_agreement').show(); // 팝업 보여주기
// 스크롤 잠금 (사용 중이면)
$('body').css('overflow', 'hidden');
if (typeof lenis !== 'undefined') {
lenis.stop();
}
}
// 팝업 닫기 버튼 이벤트 연결
$('#pop_agreement .btn_close').on('click', function() {
$('#pop_agreement').hide();
$('body').css('overflow', '');
if (typeof lenis !== 'undefined') {
lenis.start();
}
});
});
//이지빔 프로그램 비밀번호 재설정 url 쿼리스트링 파싱 함수
$(document).ready(function() {
const urlParams = new URLSearchParams(window.location.search);
const popup = urlParams.get('popup');
const token = urlParams.get('t');
if (popup === 'pwreset') {
// 팝업 전체 열기
$('#pop_search').show();
$('body').css('overflow', 'hidden');
// 내부 컨텐츠 모두 숨기기
$('#pop_search .popup_contents_wrap').hide();
if (token) {
// 토큰이 있으면 비밀번호 재설정 단계
if (!sessionStorage.getItem('pwreset_shown')) {
$('#password_reset').show();
sessionStorage.setItem('pwreset_shown', '1');
}
} else {
// 토큰이 없으면 아이디 입력 단계 (첫 번째 .popup_contents_wrap)
$('#pop_search .popup_contents_wrap').first().show();
}
}
// 닫기 버튼
$('#pop_search .btn_close').on('click', function() {
$('#pop_search').hide();
$('body').css('overflow', '');
});
});
</script>
+166
View File
@@ -0,0 +1,166 @@
<script type="text/javascript" src="<?php echo G5_URL ?>/js/jquery-3.6.1.min.js"></script>
<script type="text/javascript" src="<?php echo G5_URL ?>/js/jquery.mousewheel.min.js"></script>
<script type="text/javascript" src="<?php echo G5_URL ?>/js/common.js"></script>
<script type="text/javascript" src="<?php echo G5_URL ?>/js/include.js"></script>
<script type="text/javascript" src="<?php echo G5_URL ?>/js/popup.js?v=20260723"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css">
<!--popup_wrap-->
<div id="pop_login" class="popup_wrap">
<!--popup_in-->
<div class="popup_in">
<button class="btn_close">
<div class="close_div"><img src="<?php echo G5_URL ?>/img/ico_close.svg" alt="sdi"></div>
</button>
<!--popup_container-->
<div class="popup_container login">
<!--popup_tit-->
<div class="popup_tit">
<h1 class="h_1">Login</h1>
<h3 class="h_3">
Log in to access <br><br class="brk"><strong>1:1 purchase inquiries and <br>product support services.</strong>
</h3>
</div>
<!--//popup_tit-->
<!-- popup_contents_wrap -->
<div class="popup_contents_wrap">
<form id="flogin" name="flogin" action="<?php //echo $login_action_url?>" onsubmit="return flogin_submit(this);" method="post">
<input type="hidden" name="url" value="<?php //echo $login_url?>">
<div class="input_wrap id">
<i class="id"></i><input type="text" name="mb_id" id="login_id" required class="id " placeholder="ID">
</div>
<div class="input_wrap pw" style="position: relative;">
<i class="pw"></i><input type="password" name="mb_password" id="login_pw" required class="pw " size="20" maxLength="20" placeholder="Password" onkeyup="ufn_loginpw_onkeyup(this);">
<!-- 👁 Font Awesome 아이콘 -->
<i id="toggle_pw"
class="fa-solid fa-eye"
style="position:absolute; right:10px; top:50%;
transform:translateY(-50%);
cursor:pointer; color:#888;"></i>
<!-- CapsLock 경고 (커서 오른쪽 표시용) -->
<div id="capslock_hint"
style="display:none;
position:absolute;
left:0;
bottom:-20px;
font-size:13px;
color:#f87171;
pointer-events:none;
animation:fadein 0.15s ease;">
⚠️ Caps Lock is on.
</div>
</div>
<style>
@keyframes fadein { from { opacity:0; } to { opacity:1; } }
</style>
<div class="join_btn_wrap">
<button type="submit" id="btn_login">Login</button>
</div>
<div class="btn_go">
<div class="go_signup"><a href="javascript:agreement();"><span>Sign up</span><i class="arrow_r"></i></a></div>
<div class="go_find"><a href="javascript:search();"><span>Reset Password</span><i class="arrow_r"></i></a></div>
</div>
</form>
</div>
<!-- //popup_contents_wrap -->
</div>
<!--//popup_container-->
</div>
<!--//popup_in-->
</div>
<!--//popup_wrap-->
<script>
function ufn_loginpw_onkeyup(l_pw){
var loginButton = document.getElementById('btn_login');
if (!loginButton) {
return;
}
loginButton.disabled = !(l_pw && l_pw.value.length > 0);
}
</script>
<script>
// (function () {
// // 1) 공지 팝업 DOM이 없으면 생성
// if (!document.getElementById('egbimNotice')) {
// $('body').append(`
// <div class="notice-backdrop" style="display:none;position:fixed;inset:0;background:rgba(0,0,0,.6);z-index:9998;"></div>
// <div class="notice-box" id="egbimNotice" style="display:none;position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);z-index:9999;background:#103a2f;color:#fff;border-radius:14px;max-width:520px;width:92%;box-shadow:0 10px 30px rgba(0,0,0,.35);padding:28px;">
// <button class="notice-close" aria-label="닫기" style="position:absolute;right:10px;top:8px;border:none;background:transparent;color:#fff;font-size:24px;cursor:pointer;">×</button>
// <h3 style="margin:0 0 10px;font-size:20px;font-weight:700;">공지사항</h3>
// <p style="line-height:1.6;margin:0 0 18px;">
// EG-BIM 프로그램 사용자 인증 신규 시스템 도입으로 인해<br>
// 기존 회원분들께서는 <strong>재가입</strong> 해주시기 바랍니다.
// </p>
// <div class="notice-actions" style="display:flex;gap:8px;justify-content:flex-end;">
// <button class="btn-ok" style="padding:10px 16px;border:none;border-radius:10px;background:#ffb02e;color:#111;cursor:pointer;font-weight:700;">확인</button>
// </div>
// </div>
// `);
// }
// // 팝업 열기/닫기
// function openNotice(onConfirm) {
// $('.notice-backdrop, #egbimNotice').fadeIn(120);
// const close = () => {
// $('#egbimNotice .btn-ok, #egbimNotice .notice-close').off('click');
// $('.notice-backdrop, #egbimNotice').fadeOut(120);
// };
// $('#egbimNotice .notice-close').on('click', close);
// $('#egbimNotice .btn-ok').on('click', function () {
// close();
// if (typeof onConfirm === 'function') onConfirm();
// });
// }
// // 2) 로그인 버튼 클릭 → 공지 팝업 먼저 띄우고, 확인 시 로그인 실행
// $('#btn_login').off('click.notice').on('click.notice', function (e) {
// e.preventDefault();
// openNotice(doLoginAjax);
// });
// })();
//
</script>
<script>
$(document).ready(function () {
// form submit (Enter 눌러도 실행됨)
$('#flogin').on('submit', function(e) {
e.preventDefault(); // 기본 제출 막기
$('#btn_login').click(); // 버튼 클릭 이벤트 재사용
});
});
document.addEventListener("DOMContentLoaded", () => {
const pwInput = document.getElementById("login_pw");
const toggle = document.getElementById("toggle_pw");
const hint = document.getElementById("capslock_hint");
// 👁 토글 기능
toggle.addEventListener("click", () => {
const isHidden = pwInput.type === "password";
pwInput.type = isHidden ? "text" : "password";
toggle.classList.toggle("fa-eye");
toggle.classList.toggle("fa-eye-slash");
});
// ⚠ CapsLock 감지
pwInput.addEventListener("keydown", e => {
const caps = e.getModifierState && e.getModifierState("CapsLock");
hint.style.display = caps ? "block" : "none";
});
pwInput.addEventListener("keyup", e => {
const caps = e.getModifierState && e.getModifierState("CapsLock");
hint.style.display = caps ? "block" : "none";
});
pwInput.addEventListener("blur", () => hint.style.display = "none");
// 🚫 한글 차단
pwInput.addEventListener("input", function() {
this.value = this.value.replace(/[-|-|-]/g, '');
});
});
</script>
@@ -0,0 +1,4 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// 자신만의 코드를 넣어주세요.
+694
View File
@@ -0,0 +1,694 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
include_once __DIR__ . '/asset_urls.php';
?>
<head>
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-5GX3FS9R');
</script>
<!-- End Google Tag Manager -->
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-7J3S6MHW3Y"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-7J3S6MHW3Y');
</script>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="디지털전환시대 EG-BIM, 도면과 3차원 정보모델을 하나의 S/W로" />
<meta name="keywords" content="EG-BIM, 이지빔, egbim, eg bim, CAD, 대안CAD, 도면, BIM, 삼안, 한맥, 바론컨설턴트" />
<!-- Open Graph: 카카오톡 미리보기용 -->
<meta property="og:title" content="EG-BIM" />
<meta property="og:description" content="디지털전환시대 EG-BIM, 도면과 3차원 정보모델을 하나의 S/W로" />
<meta property="og:image" content="<?php echo eng_img_url('og-main-thumb.JPG'); ?>" />
<meta property="og:url" content="/eng/" />
<meta property="og:type" content="website" />
<title>EG-BIM</title>
<link rel="stylesheet" href="/eng/css/reset.css" />
<link rel="stylesheet" href="/eng/css/font.css" />
<link rel="stylesheet" href="/eng/css/style.css" />
<link rel="stylesheet" href="/eng/theme/basic/skin/qa/basic/style.css?ver=2303229">
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css"/>
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script src="https://unpkg.com/lenis@1.1.9/dist/lenis.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/lenis@1.1.9/dist/lenis.css">
<script type="text/javascript" src="/eng/js/jquery-3.6.1.min.js"></script>
<script type="text/javascript" src="/eng/js/jquery.mousewheel.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
<script type="text/javascript" src="/eng/js/common.js"></script>
<script type="text/javascript" src="/eng/js/popup.js"></script>
<script>
window.EGBIM_IMG_BASE_URL = <?php echo json_encode(eng_img_url()); ?>;
</script>
<script type="text/javascript" src="/eng/js/index.js"></script>
<link rel="icon" href="/favicon.ico" type="image/x-icon">
</head>
<body>
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5GX3FS9R"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
<div class="wrapper">
<div class="main_mask">
<!-- Header -->
<?php include_once($member_skin_path.'/main_header.skin.php'); ?>
<!-- //Header -->
<!-- 모든 팝업페이지 경로 -->
<?php
include_once($member_skin_path.'/login.skin.php');
include_once($member_skin_path.'/mypage01.skin.php');
include_once($member_skin_path.'/register.skin.php');
include_once($member_skin_path.'/register_form.skin.php');
include_once($member_skin_path.'/mypage02.skin.php');
include_once($member_skin_path.'/mypage03.skin.php');
include_once($member_skin_path.'/sitemap.skin.php');
include_once($member_skin_path.'/privacy.skin.php');
include_once($member_skin_path.'/password_lost.skin.php');
?>
<?php
// 오늘 날짜 (Y-m-d 형식)
$main_today = date('Y-m-d');
// 시작일과 종료일
$main_startDate = '2025-10-25';
$main_endDate = '2026-01-31';
// 기간 내에 있으면 배너 표시
if ($main_today >= $main_startDate && $main_today <= $main_endDate) {
// 쿠키 확인
$popup_hidden = isset($_COOKIE['hide_popup']) ? $_COOKIE['hide_popup'] : '';
if ($popup_hidden !== date('Y-m-d'))
include_once($member_skin_path.'/main_popup.skin.php');
}
?>
<!-- 모든 팝업페이지 경로 -->
<!-- main -->
<div class="main">
<ul class="pagination_main">
<li><div class="page_01 page_on">Value of EG-BIM</div><span>01</span></li>
<li><div class="page_02">Interface</div><span>02</span></li>
<li><div class="page_03">Key Features</div><span>03</span></li>
<li><div class="page_04">Drawing Management</div><span>04</span></li>
<li><div class="page_05">for BIM</div><span>05</span></li>
</ul>
<div class="main_link">
<a href="#01" class="main_link_01 link_on" onclick="location.href='<?php echo G5_BBS_URL ?>/value.php'"></a>
<a href="#02" class="main_link_02" onclick="location.href='<?php echo G5_BBS_URL ?>/interface.php'"></a>
<a href="#03" class="main_link_03" onclick="location.href='<?php echo G5_BBS_URL ?>/primary.php'"></a>
<a href="#04" class="main_link_04" onclick="location.href='<?php echo G5_BBS_URL ?>/floorplan.php'"></a>
<a href="#05" class="main_link_05" onclick="location.href='<?php echo G5_BBS_URL ?>/forbim.php'"></a>
</div>
<div class="bg_video">
<video id="video_play" muted playsinline>
<source src="<?php echo eng_img_url('main_1.mp4'); ?>" type="video/mp4" class="main_video_01">
</video>
</div>
<!-- <button class="btn_top js__top" onclick="window.scrollTo(0,0);"><div class="arrow"></div></button> -->
<!-- FOOTER -->
<?php include_once($member_skin_path.'/main_footer.skin.php'); ?>
<!-- //FOOTER -->
</div>
</div>
<div class="intro_wrap">
<div class="intro_mask"></div>
<div class="intro_txt">
<div class="txt_mask"><span><b>Digital Transformation Era</b></span></div>
<div class="txt_mask"><span><font class="egbim k">EG-BIM_software</font></span></div>
<div class="txt_mask"><span><em>Drawings</em> & <em>3D Information Models</em> <br class="brk">in One Software</span></div>
</div>
</div>
</div>
<script>
AOS.init();
const lenis = new Lenis()
lenis.on('scroll', (e) => {
// console.log(e)
})
lenis.on('scroll', ScrollTrigger.update)
gsap.ticker.add((time)=>{
lenis.raf(time * 1000)
})
gsap.ticker.lagSmoothing(0)
</script>
</body>
<script>
$(function(){
// footer family site toggle
$('.family_btn').click(function(e){
e.stopPropagation();
$('.family_list, .family_btn').toggleClass('family_on');
});
$(document).click(function(e){
if(!$(e.target).closest('.family_wrap').length){
$('.family_list, .family_btn').removeClass('family_on');
}
});
});
// 회원 탈퇴
function member_leave() {
if (confirm("회원에서 탈퇴 하시겠습니까?"))
location.href = '<?php echo G5_BBS_URL ?>/member_leave.php';
}
// 회원 탈퇴
let x = document.cookie;
if(x.includes("tmp_1=John")){
deleteCookie("tmp_1");
$('#pop_mypage02').show();
}
function deleteCookie(name) {
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng;";
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/bbs;";
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/faq;";
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/qa;";
}
function getCookie(cname) {
let name = cname + "=";
let decodedCookie = decodeURIComponent(document.cookie);
let ca = decodedCookie.split(';');
for(let i = 0; i <ca.length; i++) {
let c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
}
//descope 로그인, 로그아웃 js
function updateHeaderMenu() {
var isLoggedIn = !!sessionStorage.getItem("sessionJwt");
// role 체크 예시 (로그인 시 저장해놓은 값)
var adminList = [
'b24014@hanmaceng.co.kr',
'kjy0426@hanmaceng.co.kr',
'b23065@hanmaceng.co.kr',
'b23008@baroncs.co.kr',
'cjy627@hanmaceng.co.kr',
'b23072@hanmaceng.co.kr'
];
var loginId = sessionStorage.getItem('loginId') || '';
var normalizedLoginId = loginId.toLowerCase();
var isAdmin = adminList.includes(normalizedLoginId);
if ($('#hid_mb_id').length) {
$('#hid_mb_id').val(isLoggedIn ? loginId : '');
}
if (isLoggedIn) {
$('.my_join2, .my_login2').show();
$('.my_join, .my_login').hide();
// 마이페이지/관리자 메뉴 동적 출력
if (isAdmin) {
$('#my_join2').html("<a href='https://eg-bim.co.kr/eng/adm/index.php' target='_blank'>관리페이지</a>");
} else {
$('#my_join2').html("<a href='javascript:mypage03();'>My Page</a>");
}
} else {
$('.my_join2, .my_login2').hide();
$('.my_join, .my_login').show();
$('#my_join2').html(""); // 혹시모를 내용 초기화
}
}
function descopeLogout() {
fetch('/eng/skin/member/basic/descope_logout.php', {
method: 'POST',
credentials: 'include' // PHPSESSID 쿠키 전송
})
.then(res => {
if (!res.ok) throw new Error('서버 로그아웃 실패');
// 1) 로컬 저장소 정리
// sessionStorage.removeItem("refreshJwt");
// sessionStorage.removeItem("sessionJwt");
// sessionStorage.removeItem("userRole");
// sessionStorage.removeItem("userName");
// sessionStorage.removeItem("loginId");
sessionStorage.clear();
localStorage.clear();
// 2) UI 갱신
updateHeaderMenu();
window.dispatchEvent(new CustomEvent('descope-auth-changed', {
detail: { loginId: '' }
}));
// 3) 로그인 페이지로 이동
window.location.href = '/eng/index.php';
})
.catch(err => {
console.error(err);
alert('로그아웃 중 오류가 발생했습니다.');
});
}
$(document).ready(function() {
// 기존에 있던 updateHeaderMenu() 호출 뒤에
$('#my_login2 a').off('click').on('click', function(e){
e.preventDefault();
descopeLogout();
});
});
$(document).ready(function() {
updateHeaderMenu();
// (필요하다면, 로그인 성공 후에도 항상 updateHeaderMenu(); 호출)
});
//descope login
$('#flogin button[type=submit]').click(function(e){
e.preventDefault();
let mb_id = $('#login_id').val();
let mb_password = $('#login_pw').val();
$.ajax({
url : '/eng/skin/member/basic/descope_login.php',
data : {
'mb_id' : mb_id,
'mb_password' : mb_password
},
type : "POST",
dataType : "json",
success : function(res){
if(res.status === "ok") {
// 토큰 저장
// sessionStorage.setItem("refreshJwt", res.refreshJwt);
sessionStorage.setItem("sessionJwt", res.sessionJwt);
// ✅ 사용자 정보 저장
if (res.user) {
sessionStorage.setItem("loginId", res.user.loginIds?.[0] || '');
sessionStorage.setItem("userName", res.user.name || '');
sessionStorage.setItem("company", res.user.customAttributes?.company || '');
sessionStorage.setItem("familyCompany", res.user.customAttributes?.familyCompany || '');
sessionStorage.setItem("position", res.user.customAttributes?.position || '');
sessionStorage.setItem("team", res.user.customAttributes?.team || '');
sessionStorage.setItem("familyUniqueKey", res.user.customAttributes?.familyUniqueKey || '');
sessionStorage.setItem("phone", res.user.phone || '');
}
// ✅ 추가: 관리자 등 정보 저장
if(res.user && res.user.roleNames && res.user.roleNames[0])
sessionStorage.setItem("userRole", res.user.roleNames[0]);
else
sessionStorage.removeItem("userRole");
// ✅ 로그인 후 메뉴 갱신
updateHeaderMenu();
window.dispatchEvent(new CustomEvent('descope-auth-changed', {
detail: {
loginId: res.user?.loginIds?.[0] || '',
user: res.user || null
}
}));
// UI 처리
$('.popup_wrap').hide();
$('body').css('overflow', '');
lenis.start();
// alert('로그인 하셨습니다.');
} else {
alert(res.message || "로그인 실패");
// 🔴 실패 횟수에 따라 안내 배너 교체
if (res.failCount && res.failCount >= 8) {
updateLoginBanner("fail");
}
}
},
error : function(err){
alert(err.statusText || "통신 오류");
}
});
});
// ✅ 배너 교체 함수
function updateLoginBanner(type = "default") {
const $banner = $('#login_notice_banner');
if (!$banner.length) return;
if (type === "default") {
$banner.css({ background: "#063e01ff", color: "#fff" });
$banner.find("strong").text("[로그인 시스템 변경 안내]");
$banner.find("p.left").html(`
더 나은 보안을 위해 2025년 8월 8일부터 로그인 시스템이 변경되었습니다.<br>
기존 회원 또한 신규 시스템에 맞춰 재가입을 진행해주시기 바랍니다.
`);
$banner.find("p:last").html(`※ 로그인 및 가입 관련 문의: <strong>010-8721-7453</strong>`);
}
if (type === "fail") {
$banner.css({ background: "#6a0202ff", color: "#faf6f6ff" });
$banner.find("strong").text("[로그인 시도 제한 안내]");
$banner.find("p.left").html(`
비밀번호 입력을 <strong>7회 이상 연속 실패</strong>하셨습니다.<br>
<strong>8번째 시도부터 3분 대기</strong>가 적용됩니다.<br>
10회 이상 실패 시 계정이 잠금 처리됩니다.
`);
$banner.find("p:last").text("");
}
}
//회원가입 약관동의
// $('#fregister button[type=submit]').click(function(e){
// e.preventDefault();
// let agree11 = $('#agree11').val();
// let agree21 = $('#agree21').val();
// $.ajax({
// url : '<?php echo G5_URL ?>/bbs/register_form.php',
// type : "POST",
// datatype : "json",
// contentType: 'application/json; charset=utf-8',
// data : {
// 'agree11' : agree11,
// 'agree21' : agree21
// },
// success : function(data){
// var ss='';
// for(i=0; i<data.length; i++){
// ss=ss + data[i];
// }
// },
// error : function(err){
// alert(err);
// }
// });
// });
// 회원가입 약관동의 (중복 바인딩 방지용 네임스페이스 사용)
// $('#fregister button[type=submit]').off('click.agree').on('click.agree', function (e) {
// e.preventDefault();
// // ① 체크 여부는 is(':checked') 로 판단
// var agree1 = $('#agree11').is(':checked');
// var agree2 = $('#agree21').is(':checked');
// if (!(agree1 && agree2)) {
// alert('약관에 모두 동의해주세요.');
// return false;
// }
// // ② 둘 다 체크되어 있으면 서버로 넘길 값 만들기
// // (PHP register_form.php에서 $_POST['agree'], $_POST['agree2']로 받게)
// $.ajax({
// url: '<?php echo G5_URL ?>/bbs/register_form.php',
// type: 'POST',
// dataType: 'html', // or 'json' (서버 응답 형식에 맞게)
// // contentType/processData 기본값 유지 ← JSON 전송 아니면 이게 맞습니다.
// data: {
// agree: 1,
// agree2: 1
// },
// success: function (data) {
// // 통과 시 다음 화면으로 전환
// $('#pop_agreement').hide();
// $('#pop_register_form').show(); // 실제 다음 팝업 ID에 맞춰 수정
// $('body').css('overflow', 'hidden');
// },
// error: function (xhr) {
// alert('처리 중 오류가 발생했습니다.\n다시 시도해주세요.');
// }
// });
// });
// $(document).ready(function() {
// // 기존에 바인딩된 거 있으면 제거 (중복 방지)
// $('#fregister button[type=submit], #btn_agree').off('click.agree');
// $('#fregister button[type=submit], #btn_agree').on('click.agree', function(e){
// e.preventDefault();
// e.stopPropagation();
// e.stopImmediatePropagation();
// // 체크 여부는 반드시 :checked 로 확인해야 함
// var a1 = $('#agree11').is(':checked');
// var a2 = $('#agree21').is(':checked');
// if (!(a1 && a2)) {
// alert('약관에 모두 동의해주세요.');
// return false; // 진행 막기
// }
// // === 여기부터는 통과 시 동작(필요 없으면 주석 처리 가능) ===
// // AJAX 그대로 유지하되, 실제 동작하려면 서버가 받는 파라미터명에 맞추세요.
// // 서버 기본 로직은 보통 'agree', 'agree2'를 받습니다.
// $.ajax({
// url : '<?php echo G5_URL ?>/bbs/register_form.php',
// type : 'POST',
// dataType : 'json',
// // contentType 은 JSON 전송할 때만 쓰세요. 지금은 기본 폼 인코딩으로 보냅니다.
// // contentType: 'application/json; charset=utf-8',
// data : {
// 'agree' : a1 ? 1 : 0, // 서버가 'agree' 로 받는 경우
// 'agree2' : a2 ? 1 : 0
// },
// success : function(data){
// // 필요 시 다음 단계 이동
// // $('#pop_agreement').hide();
// // $('#pop_register_form').show();
// // $('body').css('overflow','hidden');
// },
// error : function(err){
// alert('오류가 발생했습니다. 잠시 후 다시 시도해주세요.');
// console.error(err);
// }
// });
// });
// });
//이지빔 프로그램 회원가입 url 쿼리스트링 파싱 함수
function getQueryString(name) {
const urlParams = new URLSearchParams(window.location.search);
return urlParams.get(name);
}
$(document).ready(function() {
const popupParam = getQueryString('popup');
if (popupParam === 'signup') {
console.log('쿼리 감지: signup → 회원가입 팝업 자동 오픈 시도');
//251013 위치 이동
const intro = document.querySelector('.intro_wrap');
intro.style.display = "none";
const mainMask = document.querySelector('.main_mask');
mainMask.classList.add('skip');
// mainMask.style.aimation = 'none';
//251013 위치 이동 END
$('#pop_agreement').show(); // 팝업 보여주기
// 스크롤 잠금 (사용 중이면)
$('body').css('overflow', 'hidden');
if (typeof lenis !== 'undefined') {
lenis.stop();
}
}
// 팝업 닫기 버튼 이벤트 연결
$('#pop_agreement .btn_close').on('click', function() {
$('#pop_agreement').hide();
$('body').css('overflow', '');
if (typeof lenis !== 'undefined') {
lenis.start();
}
});
});
//이지빔 프로그램 비밀번호 재설정 url 쿼리스트링 파싱 함수
$(document).ready(function() {
const urlParams = new URLSearchParams(window.location.search);
const popup = urlParams.get('popup');
const token = urlParams.get('t');
if (popup === 'pwreset') {
// 팝업 전체 열기
$('#pop_search').show();
$('body').css('overflow', 'hidden');
// 내부 컨텐츠 모두 숨기기
$('#pop_search .popup_contents_wrap').hide();
if (token) {
// 토큰이 있으면 비밀번호 재설정 단계
if (!sessionStorage.getItem('pwreset_shown')) {
$('#password_reset').show();
sessionStorage.setItem('pwreset_shown', '1');
}
} else {
// 토큰이 없으면 아이디 입력 단계 (첫 번째 .popup_contents_wrap)
$('#pop_search .popup_contents_wrap').first().show();
}
}
// 닫기 버튼
$('#pop_search .btn_close').on('click', function() {
$('#pop_search').hide();
$('body').css('overflow', '');
});
});
//로그인 팝업창 쿼리스트링
document.addEventListener("DOMContentLoaded", function(){
const urlParams = new URLSearchParams(window.location.search);
if (urlParams.get("popup") === "login") {
const $popup = $("#pop_login");
if ($popup.length) {
$popup.show();
// ✅ 배너가 없으면 붙이기
if (!$("#login_notice_banner").length) {
const bannerHtml = `
<div id="login_notice_banner" class="login-notice-banner" style="
background:#0f3a2f;color:#fff;border-radius:12px;padding:14px 44px 14px 14px;
position:relative;margin:0 0 12px 0;line-height:1.6;word-break:keep-all;">
<button type="button" class="lnb-close" aria-label="닫기" style="
position:absolute;right:10px;top:8px;background:transparent;border:0;
color:#fff;font-size:20px;cursor:pointer;">×</button>
<strong style="display:block;margin-bottom:6px;">[로그인 시스템 변경 안내]</strong>
<p class="left" style="margin:0 0 6px;">
더 나은 보안을 위해 2025년 8월 8일부터
로그인 시스템이 변경되었습니다.
기존 회원 또한 신규 시스템에 맞춰<br>
재가입을 진행해주시기 바랍니다.
</p>
<p style="margin:0;">※ 로그인 및 가입 관련 문의: <strong>02-2141-7434</strong></p>
</div>
`;
$("#pop_login .popup_contents_wrap").prepend(bannerHtml);
// 닫기 버튼 동작
$("#login_notice_banner .lnb-close").on("click", function(){
$("#login_notice_banner").fadeOut(120);
});
} else {
$("#login_notice_banner").show();
}
}
}
});
// //공지사항 팝업 스크립트
// (function(){
// const KEY = 'egbim_notice_2025-08-07'; // 키 바꾸면 전체 사용자에게 다시 노출
// const dim = document.getElementById('egbimNoticeDim');
// const box = document.getElementById('egbimNoticeBox');
// const btnX = document.getElementById('egbimNoticeClose');
// const btnOk = document.getElementById('egbimNoticeOk');
// const btnToday = document.getElementById('egbimNoticeToday');
// function todayStr(){
// const d = new Date(); return d.toISOString().slice(0,10);
// }
// function shouldShow(){
// const v = localStorage.getItem(KEY);
// // 항상 띄우고 싶으면 다음 줄을 `return true;` 로 바꾸세요.
// return v !== todayStr();
// }
// function openNotice(){
// dim.style.display = 'block';
// box.style.display = 'block';
// document.body.style.overflow = 'hidden';
// if (typeof lenis !== 'undefined') try{ lenis.stop(); }catch(_){}
// }
// function closeNotice(storeToday){
// if (storeToday) localStorage.setItem(KEY, todayStr());
// dim.style.display = 'none';
// box.style.display = 'none';
// document.body.style.overflow = '';
// if (typeof lenis !== 'undefined') try{ lenis.start(); }catch(_){}
// }
// btnOk.addEventListener('click', () => closeNotice(true)); // 확인 누르면 오늘은 다시 안봄
// btnToday.addEventListener('click', () => closeNotice(true)); // 오늘 하루 보지 않기
// btnX.addEventListener('click', () => closeNotice(true));
// dim.addEventListener('click', () => closeNotice(true));
// document.addEventListener('DOMContentLoaded', () => {
// if (shouldShow()) openNotice();
// });
// })();
/* 메인 마우스 클릭 문구 */
if (window.location.pathname === '/eng/index.php' || window.location.pathname === '/eng/' || window.location.pathname === '/eng') {
// 커서 따라다니는 텍스트 요소 생성
const cursorText = document.createElement('div');
cursorText.className = 'cursor-text';
cursorText.textContent = 'Click!';
cursorText.style.cssText = `
position: fixed;
pointer-events: none;
z-index: 9999;
font-size: 20px;
color: #fff;
font-weight: 500;
white-space: nowrap;
transform: translate(-0%, -50%);
transition: opacity 0.3s;
`;
document.body.appendChild(cursorText);
// 마우스 움직임 추적
document.addEventListener('mousemove', (e) => {
// 마우스 위치의 요소 확인
const elementUnderMouse = document.elementFromPoint(e.clientX, e.clientY);
// footer 또는 .popup_wrap 영역인지 확인
const isInFooter = elementUnderMouse?.closest('footer');
const isInPopup = elementUnderMouse?.closest('.popup_wrap');
const isInFloating = elementUnderMouse?.closest('.floating_menu');
const isInPagination = elementUnderMouse?.closest('.pagination_main');
const isInHeader = elementUnderMouse?.closest('.js__header');
const isInSitemap = elementUnderMouse?.closest('.popup_sitemap');
// footer나 popup 영역이면 숨김
if (isInFooter || isInPopup || isInFloating || isInPagination || isInHeader || isInSitemap) {
cursorText.style.opacity = '0';
} else {
cursorText.style.opacity = '1';
// 커서 오른쪽 아래에 위치
cursorText.style.left = (e.clientX + 15) + 'px';
cursorText.style.top = (e.clientY + 15) + 'px';
}
});
// 마우스가 페이지를 벗어나면 숨김
document.addEventListener('mouseleave', () => {
cursorText.style.opacity = '0';
});
document.addEventListener('mouseenter', () => {
cursorText.style.opacity = '1';
});
}
</script>
@@ -0,0 +1,46 @@
<?php include_once __DIR__ . '/asset_urls.php'; ?>
<button class="btn_top js__top" onclick="window.scrollTo(0,0);"><div class="arrow"></div></button>
<footer class="footer_off">
<div class="footer_close"></div>
<div class="footer_wrap">
<div class="comp_info">
<img class="logo_baron" src="<?php echo eng_img_url('baron_logo_eng.svg'); ?>" alt="">
<span class="ceo">CEO <em>Jang Jong Chan</em></span>
</div>
<div class="comp_inner">
<span class="btn_privacy"><a href="javascript:privacy('privacy');"><em>Privacy Policy</em></a><a href="javascript:privacy('agreement');">Terms of Service</a></span>
<div class="comp_contact">
<ul class="footer_menu">
<li><a href="<?php echo G5_BBS_URL ?>/value.php">Value of EG-BIM</a></li>
<li><a href="<?php echo G5_BBS_URL ?>/interface.php">Interface</a></li>
<li><a href="<?php echo G5_BBS_URL ?>/primary.php">Key Features</a></li>
<li><a href="<?php echo G5_BBS_URL ?>/floorplan.php">Drawing Management</a></li>
<li><a href="<?php echo G5_BBS_URL ?>/forbim.php">for BIM</a></li>
</ul>
<div class="footer_sitemap">
<!-- <span>TOVA의 <em>다양한 소식</em>을 만나보세요</span>
<div class="tova_sns">
<a href="https://cafe.naver.com/imtas" class="tova_cafe"><img src="<?php echo G5_URL ?>/img/ico_cafe.svg" alt=""></a>
<a href="" class="tova_facebook"><img src="<?php echo G5_URL ?>/img/ico_facebook.svg" alt=""></a>
</div>-->
<div class="family_wrap">
<div class="family_btn"><span>Family Site</span><i></i></div>
<ul class="family_list">
<li><a href="http://k-tova.com/eng/" target="_blank">TOVA</a></li>
<li><a href="http://k-gaia.co.kr/eng/" target="_blank">GAIA</a></li>
<!--li>바론컨설턴트(준비중)</li-->
<!-- <li><a href="http://baroncs.co.kr" target="_blank">바론컨설턴트</a></li> -->
</ul>
</div>
</div>
</div>
<span class="address">554, Ogeum-ro, Songpa-gu, Seoul, Republic of Korea<br class="brk"> <em class="tel">Tel : +82-2-2141-7434</em></span>
<span class="copyright">© BARON Consultants Co,.Ltd All Rights Reserved.</span>
</div>
</div>
</footer>
+210
View File
@@ -0,0 +1,210 @@
<?php
include_once __DIR__ . '/asset_urls.php';
// include_once $_SERVER['DOCUMENT_ROOT']."/egbim/skin/member/basic/descope_session.php";
// 디버깅용 출력
echo "<!-- isAdmin = " . (isset($isAdmin) ? ($isAdmin ? "true" : "false") : "unset") . " -->";
// ✅ DB 연결
$pdo = new PDO("mysql:host=db;dbname=egbim;charset=utf8mb4", "egbim", "baron3840!!", [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
// ✅ EG-BIM (product_code=8) 기준 최신 external_version 가져오기
$stmt = $pdo->prepare("
SELECT external_version
FROM deploy_versions
WHERE product_code = 1
ORDER BY updated_at DESC
LIMIT 1
");
$stmt->execute();
$version = $stmt->fetchColumn() ?: '1.0.0'; // fallback
// ✅ 다운로드 URL 자동 생성
$download_url = "https://release-download.hmac.kr/eg-bim/{$version}/setup_eg-bim_{$version}.exe";
?>
<header class="js__header">
<h1><a href="/eng/index.php"></a></h1>
<!-- ✅ 사용자 관리 아이콘 (관리자 전용, 기본 숨김) -->
<div id="userListBtnWrap" class="menu_userlist" style="display:none;">
<a href="/eng/skin/member/basic/descope_user_list_skin_w3.php">
<img src="<?php echo eng_img_url('ico_userlist.svg'); ?>" alt="사용자 관리">
</a>
</div>
<div class="language">
<a href="/egbim/">KR</a>
<a href="#" class="on">EN</a>
</div>
<!-- ✅ 업로드 아이콘 (관리자 전용, 기본 숨김) -->
<div id="uploadBtnWrap" class="menu_upload" style="display:none;">
<a href="/eng/sw_upload/upload_page.php">
<img src="<?php echo eng_img_url('ico_upload.svg'); ?>" alt="업로드">
</a>
</div>
<div class="menu_my">
<img src="<?php echo eng_img_url('ico_my.svg'); ?>" alt="">
<ul class="menu_my_list" style="display: none;">
<li id="my_join2" class="my_join2">
<!-- JS에서 "마이페이지" or "관리페이지" 링크를 넣어줌 -->
</li>
<li id="my_login2" class="my_login2">
<a href="javascript:descopeLogout();">Logout</a>
</li>
<li id="my_join" class="my_join">
<a href="javascript:agreement();">Sign up</a>
</li>
<li id="my_login" class="my_login">
<a href="javascript:login();">Login</a>
</li>
</ul>
</div>
<div class="menu_ham"><a href="javascript:sitemap();"><div></div><div></div><div></div></a></div>
</header>
<!-- floating_menu -->
<div class="floating_menu">
<ul>
<li class="floating_faq"><a href="/eng/bbs/descope_qa_list.php">
<i></i>
<span>Q&A</span>
</a></li>
<li class="floating_guide"><a href="https://baron-consultant.github.io/eg-bim_guide\help" target="_blank">
<i></i>
<span>Guide</span>
</a></li>
<li class="floating_download">
<a href="<?= htmlspecialchars($download_url) ?>">
<i></i>
<span>Download</span>
</a></li>
<li class="floating_buy"><a href="/eng/bbs/buy.php">
<i></i>
<span>Contact</span>
</a></li>
</ul>
</div>
<!-- //floating_menu -->
<script>
// 다운로드 버튼 안내
// $(document).on('click', '.floating_download a', function (e) {
// e.preventDefault(); // 링크 이동 막기
// alert('다운로드 기능은 준비중입니다.');
// });
</script>
<script>
(function () {
const ADMIN_ICON_IDS = [
'b24014@hanmaceng.co.kr',
'kjy0426@hanmaceng.co.kr',
'b23065@hanmaceng.co.kr',
'shyeom1@samaneng.com',
'cjy627@hanmaceng.co.kr',
'b23072@hanmaceng.co.kr',
'b23018@hanmaceng.co.kr',
'm20331@hanmaceng.co.kr',
'cozyjin@hanmaceng.co.kr',
'm24031@hanmaceng.co.kr',
'b24051@hanmaceng.co.kr',
'rmsgud1202@hanmaceng.co.kr',
'm21318@hanmaceng.co.kr',
'b21367@hanmaceng.co.kr',
'b25023@hanmaceng.co.kr',
'sdi9429@naver.com',
'junsuy@hanmail.net',
'ilphilo92@gmail.com'
];
function normalizeLoginId(loginId) {
return String(loginId || '').trim().toLowerCase();
}
function isAdminLoginId(loginId) {
return ADMIN_ICON_IDS.includes(normalizeLoginId(loginId));
}
function applyAdminIconVisibility(loginId) {
const visible = isAdminLoginId(loginId || sessionStorage.getItem('loginId'));
$('#uploadBtnWrap').toggle(visible);
$('#userListBtnWrap').toggle(visible);
}
// 공지 HTML (닫기 가능 / 입력 방해 X)
const bannerHtml = `
<div id="login_notice_banner" class="login-notice-banner" style="
background:#0f3a2f;color:#fff;border-radius:12px;padding:14px 44px 14px 14px;
position:relative;margin:0 0 12px 0;line-height:1.6;word-break:keep-all;">
<button type="button" class="lnb-close" aria-label="Close" style="
position:absolute;right:10px;top:8px;background:transparent;border:0;
color:#fff;font-size:20px;cursor:pointer;">×</button>
<strong style="display:block;margin-bottom:6px;">[Login System Notice]</strong>
<p class="left" style="margin:0 0 6px;">
For improved security, the login system changed on August 8, 2025.<br>
Existing users also need to sign up again in the new system.
</p>
<p style="margin:0;">Support: <strong>+82-2-2141-7434</strong></p>
</div>
`;
function injectBanner() {
const $wrap = $('#pop_login .popup_contents_wrap');
if (!$wrap.length) return false;
if (!$('#login_notice_banner').length) {
$wrap.prepend(bannerHtml);
// 닫기 버튼
$('#login_notice_banner .lnb-close').on('click', function () {
$('#login_notice_banner').fadeOut(120);
});
} else {
$('#login_notice_banner').show();
}
return true;
}
// 로그인 메뉴 클릭 → 기존 login() 실행 + 배너 주입(팝업 DOM 뜰 때까지 재시도)
$(document).on('click', '#my_login a, .my_login a', function (e) {
e.preventDefault();
if (typeof login === 'function') login();
let tries = 0;
const maxTries = 20; // 1초 정도 재시도(50ms*20)
const iv = setInterval(() => {
tries++;
if (injectBanner() || tries >= maxTries) clearInterval(iv);
}, 50);
});
// 혹시 로그인 팝업을 다른 곳에서 열어도 배너가 필요하면, 팝업 열릴 때 한 번 더 시도
$(document).on('show-login-popup', function () {
injectBanner();
});
$(function () {
applyAdminIconVisibility();
});
window.addEventListener('storage', function (e) {
if (e.key === 'loginId') {
applyAdminIconVisibility(e.newValue || '');
}
});
window.addEventListener('descope-auth-changed', function (e) {
applyAdminIconVisibility(e.detail?.loginId || '');
});
let checkCount = 0;
const checkInterval = setInterval(function () {
checkCount += 1;
const loginId = sessionStorage.getItem('loginId') || '';
if (loginId || checkCount >= 20) {
applyAdminIconVisibility(loginId);
clearInterval(checkInterval);
}
}, 300);
})();
</script>
+270
View File
@@ -0,0 +1,270 @@
<!--popup_wrap-->
<div id="pop_noti" class="popup_wrap popup-notice" style="display:none">
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/8.4.7/swiper-bundle.min.css"
/>
<!--popup_in-->
<div class="popup_in">
<span class="border-effect"></span>
<div class="popup_container notice">
<style>
.popup-notice a.link {
cursor: pointer;
}
.popup-notice .swiper-wrapper {
height: auto !important;
}
.popup_container.notice img {
max-width: 420px;
}
.popup-notice .swiper-pagination {
width: auto;
right: 8px;
left: auto;
padding: 4px 12px;
border-radius: 25px;
background: rgba(255,255,255,0.6);
font-size:14px
}
.popup-notice .popupSwiper {
max-width: 420px; /* 기본: 1280px 미만 */
}
/* PC */
@media (min-width: 1280px) {
.popup-notice .popupSwiper {
max-width:900px;
}
.popup-notice .swiper-slide:nth-child(2n) {
position: relative;
}
.popup-notice .swiper-slide:nth-child(2n):before {
content:" ";
position: absolute;
left: 0;
top:0;
width: 1px;height: 100%;
background:#9E958F;
}
.popup-notice .swiper-slide {
min-width: 450px;
height: 598px;
}
.popup_container.notice img {
max-width: 450px;
}
.popup-notice .swiper-pagination {
display:none;
}
}
@media (max-width: 721px) {
.popup_wrap.popup-notice .popup_in ,
.popup_container.notice img,
.popup_container.notice img {
max-width: 320px;
}
}
</style>
<div class="pop-content" >
<div class="swiper popupSwiper">
<div class="swiper-wrapper">
<?php
// 오늘 날짜 (Y-m-d 형식)
$main_today = date('Y-m-d');
// 시작일과 종료일
$mainpop_startDate = '2025-12-01';
$mainpop_endDate = '2025-12-31';
// 기간 내에 있으면 배너 표시
if ($main_today >= $mainpop_startDate && $main_today <= $mainpop_endDate) {
?>
<!-- 슬라이드 1 -->
<div class="swiper-slide">
<a class="link" href="http://www.ggherald.com/default/index_view_page.php?part_idx=119&idx=74819" target="_blank" alt="‘경기헤럴드’ 기사 전문 바로가기">
<picture>
<source
media="(max-width: 721px)"
srcset="./img/main_popup/251128_main_popup_m.png?251223"
/>
<img
src="./img/main_popup/251128_main_popup.png"
alt="EG-BIM X 의왕도시공사 민관 상호 협력 성장 지원을 위한 업무 협약 체결"
/>
</picture>
</a>
</div>
<?php
}
?>
<!-- 슬라이드 2 -->
<div class="swiper-slide">
<picture>
<source
media="(max-width: 721px)"
srcset="./img/main_popup/251223_main_popup_m.png?251223"
/>
<img
src="./img/main_popup/251223_main_popup.png"
alt="EG-BIM X 베트남 Nam Can Tho University "
/>
</picture>
</div>
</div>
<!-- 페이지네이션 -->
<div class="swiper-pagination"></div>
</div>
</div>
<div class="btn-wrap">
<button id="todayClose" type="button">Dont show again today</button>
<button id="popupClose" type="button">Close</button>
</div>
</div>
</div>
<!--//popup_in-->
</div>
<!--//popup_wrap-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/8.4.7/swiper-bundle.min.js"></script>
<script>
(function() {
// 쿠키 읽기 함수
function getCookie(name) {
var value = "; " + document.cookie;
var parts = value.split("; " + name + "=");
if (parts.length === 2) return parts.pop().split(";").shift();
return null;
}
// 페이지 로드시 쿠키 확인
var hidePopup = getCookie("hide_popup");
var today = new Date().toISOString().split('T')[0];
var popup = document.getElementById("pop_noti");
if (!popup) return;
// 오늘 날짜와 쿠키 날짜가 같으면 팝업 숨김
if (hidePopup === today) {
popup.style.display = "none";
} else {
popup.style.display = "block";
}
// 팝업 외부 클릭 시 닫기
popup.onclick = function(e) {
if (e.target === popup) {
popup.style.display = "none";
}
};
// 닫기 버튼
var closeBtn = document.getElementById("popupClose");
if (closeBtn) {
closeBtn.onclick = function() {
popup.style.display = "none";
};
}
// 오늘 하루 보지 않기 버튼
var todayChk = document.getElementById("todayClose");
if (todayChk) {
todayChk.onclick = function() {
var today = new Date();
var expire = new Date();
expire.setHours(23, 59, 59, 999);
document.cookie = "hide_popup=" + today.toISOString().split('T')[0] + "; path=/; expires=" + expire.toUTCString();
popup.style.display = "none";
};
}
let swiper = null;
let resizeTimer = null;
let currentMode = window.innerWidth >= 1280 ? 'pc' : 'mo';
function initSwiper() {
const slideCount = document.querySelectorAll(
'.popupSwiper .swiper-slide'
).length;
const isSingleSlide = slideCount <= 1;
const isPC = window.innerWidth >= 1280;
swiper = new Swiper('.popupSwiper', {
speed: 600,
watchOverflow: true,
slidesPerView: isSingleSlide ? 1 : (isPC ? 2 : 1),
slidesPerGroup: isSingleSlide ? 1 : (isPC ? 2 : 1),
loop: false, // ⭐ loop 고정 (중요)
allowTouchMove: !isPC,
observer: true,
observeParents: true,
updateOnWindowResize: false,
pagination: {
el: '.swiper-pagination',
type: 'fraction',
},
on: {
init(swiper) {
// single slide면 pagination 숨김
if (isSingleSlide && swiper.pagination?.el) {
swiper.pagination.el.style.display = 'none';
} else if (swiper.pagination?.el) {
swiper.pagination.el.style.display = isPC ? 'none' : 'block';
}
},
// fraction NaN 방어
paginationUpdate(swiper, el) {
if (el && el.textContent.includes('NaN')) {
swiper.slideTo(0, 0, false);
swiper.update();
requestAnimationFrame(() => {
swiper.pagination.render();
swiper.pagination.update();
});
}
}
}
});
}
// 최초 실행
initSwiper();
// PC ↔ MO 경계 통과 시에만 재생성
window.addEventListener('resize', function () {
clearTimeout(resizeTimer);
resizeTimer = setTimeout(() => {
const newMode = window.innerWidth >= 1280 ? 'pc' : 'mo';
if (newMode !== currentMode) {
currentMode = newMode;
if (swiper) {
swiper.destroy(true, true);
swiper = null;
}
initSwiper();
}
}, 200);
});
})();
</script>
@@ -0,0 +1,148 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
add_stylesheet('<link rel="stylesheet" href="' . $member_skin_url . '/style.css">', 0);
if ($config['cf_cert_use'] && ($config['cf_cert_simple'] || $config['cf_cert_ipin'] || $config['cf_cert_hp']))
add_javascript('<script src="'.G5_JS_URL.'/certify.js?v='.G5_JS_VER.'"></script>', 0);
?>
<!-- 기존 회원 본인인증 시작 { -->
<div class="member_cert_refresh">
<form name="fcertrefreshform" id="member_cert_refresh" action="<?php echo $action_url ?>" onsubmit="return fcertrefreshform_submit(this);" method="POST" autocomplete="off">
<input type="hidden" name="w" value="<?php echo $w ?>">
<input type="hidden" name="url" value="<?php echo $urlencode ?>">
<input type="hidden" name="cert_type" value="<?php echo $member['mb_certify']; ?>">
<input type="hidden" name="mb_id" value="<?php echo $member['mb_id']; ?>">
<input type="hidden" name="mb_hp" value="<?php echo $member['mb_hp']; ?>">
<input type="hidden" name="mb_name" value="<?php echo $member['mb_name']; ?>">
<input type="hidden" name="cert_no" value="">
<section id="member_cert_refresh_private">
<h2>(필수) 추가 개인정보처리방침 안내</h2>
<div>
<div class="tbl_head01 tbl_wrap">
<table>
<caption>추가 개인정보처리방침 안내</caption>
<thead>
<tr>
<th>목적</th>
<th>항목</th>
<th>보유기간</th>
</tr>
</thead>
<tbody>
<tr>
<td>이용자 식별 및 본인여부 확인</td>
<td>생년월일<?php echo (empty($member['mb_dupinfo']))? ", 휴대폰 번호(아이핀 제외)" : ""; ?>, 암호화된 개인식별부호(CI)</td>
<td>회원 탈퇴 시까지</td>
</tr>
</tbody>
</table>
</div>
</div>
<fieldset class="member_cert_refresh_agree">
<input type="checkbox" name="agree2" value="1" id="agree21" class="selec_chk">
<label for="agree21"><span></span><b class="sound_only">추가 개인정보처리방침에 동의합니다.</b></label>
</fieldset>
</section>
<section id="find_info" class="new_win">
<h2>인증수단 선택하기</h2>
<div class="find_btn">
<?php
if ($config['cf_cert_use']) {
echo '<div class="cert_btn">';
if ($config['cf_cert_simple']) {
echo '<button type="button" id="win_sa_kakao_cert" class="btn_submit win_sa_cert" data-type="">간편인증</button>' . PHP_EOL;
}
if ($config['cf_cert_hp'])
echo '<button type="button" id="win_hp_cert" class="btn_submit">휴대폰 본인확인</button>' . PHP_EOL;
if ($config['cf_cert_ipin'])
echo '<button type="button" id="win_ipin_cert" class="btn_submit">아이핀 본인확인</button>' . PHP_EOL;
echo '</div>';
echo '<noscript>본인확인을 위해서는 자바스크립트 사용이 가능해야합니다.</noscript>' . PHP_EOL;
}
?>
</div>
</section>
</form>
<script>
$(function() {
var pageTypeParam = "pageType=register";
var f = document.fcertrefreshform;
<?php if ($config['cf_cert_use'] && $config['cf_cert_simple']) { ?>
// 이니시스 간편인증
var url = "<?php echo G5_INICERT_URL; ?>/ini_request.php";
var type = "";
var params = "";
var request_url = "";
$(".win_sa_cert").click(function() {
if (!fcertrefreshform_submit(f)) return false;
type = $(this).data("type");
params = "?directAgency=" + type + "&" + pageTypeParam;
request_url = url + params;
call_sa(request_url);
});
<?php } ?>
<?php if ($config['cf_cert_use'] && $config['cf_cert_ipin']) { ?>
// 아이핀인증
var params = "";
$("#win_ipin_cert").click(function() {
if (!fcertrefreshform_submit(f)) return false;
params = "?" + pageTypeParam;
var url = "<?php echo G5_OKNAME_URL; ?>/ipin1.php" + params;
certify_win_open('kcb-ipin', url);
return;
});
<?php } ?>
<?php if ($config['cf_cert_use'] && $config['cf_cert_hp']) { ?>
// 휴대폰인증
var params = "";
$("#win_hp_cert").click(function() {
if (!fcertrefreshform_submit(f)) return false;
params = "?" + pageTypeParam;
<?php
switch ($config['cf_cert_hp']) {
case 'kcb':
$cert_url = G5_OKNAME_URL.'/hpcert1.php';
$cert_type = 'kcb-hp';
break;
case 'kcp':
$cert_url = G5_KCPCERT_URL.'/kcpcert_form.php';
$cert_type = 'kcp-hp';
break;
case 'lg':
$cert_url = G5_LGXPAY_URL.'/AuthOnlyReq.php';
$cert_type = 'lg-hp';
break;
default:
echo 'alert("기본환경설정에서 휴대폰 본인확인 설정을 해주십시오");';
echo 'return false;';
break;
}
?>
certify_win_open("<?php echo $cert_type; ?>", "<?php echo $cert_url; ?>" + params);
return;
});
<?php } ?>
});
function fcertrefreshform_submit(f) {
if (!f.agree2.checked) {
alert("추가 개인정보처리방침에 동의하셔야 인증을 진행하실 수 있습니다.");
f.agree2.focus();
return false;
}
return true;
}
</script>
</div>
<!-- } 기존 회원 본인인증 끝 -->
@@ -0,0 +1,145 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">', 0);
?>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>TOVA Join</title>
<link rel="stylesheet" href="../css/reset.css" />
<link rel="stylesheet" href="../css/font.css" />
<link rel="stylesheet" href="../css/style.css" />
<script src="../js/jquery-3.6.1.min.js"></script>
<script src="../js/common.js"></script>
</head>
<!-- 회원 비밀번호 확인 시작 { -->
<div id="mb_confirm" class="mbskin">
<h1><?php echo $g5['title'] ?></h1>
<p>
<!-- <strong>비밀번호를 한번 더 입력해주세요.</strong> -->
<?php if ($url == 'member_leave.php') { ?>
비밀번호를 입력하시면 회원탈퇴가 완료됩니다.
<?php }else{ ?>
회원님의 정보를 안전하게 보호하기 위해 비밀번호를 한번 더 확인합니다.
<?php } ?>
</p>
<form name="fmemberconfirm" action="<?php echo $url ?>" onsubmit="return fmemberconfirm_submit(this);" method="post">
<input type="hidden" name="mb_id" value="<?php echo $member['mb_id'] ?>">
<input type="hidden" name="w" value="u">
<!-- <fieldset>
<span class="confirm_id">회원아이디</span>
<span id="mb_confirm_id"><?php //echo $member['mb_id'] ?></span>
<label for="confirm_mb_password" class="sound_only">비밀번호<strong>필수</strong></label>
<input type="password" name="mb_password" id="confirm_mb_password" required class="required frm_input" size="15" maxLength="20" placeholder="비밀번호">
<input type="submit" value="확인" id="btn_submit" class="btn_submit">
</fieldset> -->
<body>
<div class="wrapper">
<!-- Header -->
<header class="header">
<h1>
<img src="../img/logo_w.svg" alt="">
</h1>
<div class="menu_wrap">
<div class="menu_my"><img src="../img/ico_my.svg" alt=""></div>
<div class="menu_ham"><img src="../img/ico_ham.svg" alt=""></div>
</div>
</header>
<!-- //Header -->
<!--popup_wrap-->
<div class="popup_wrap ">
<!--popup_in-->
<div class="popup_in">
<hgroup>
<div class="pop_close_wrap">
<button class="btn_close">
<div class="close_div"><img src="../img/ico_close.svg" alt=""></div>
</button>
</div>
</hgroup>
<!--popup_content-->
<div class="popup_content join">
<!--pop_join_left-->
<div class="pop_join_left">
<?php if ($url == 'member_leave.php') { ?>
<span class="bg_tit_left">Canc</span>
<div class="join_info">
<h1 class="h_1"> 회원탈퇴 </h1>
<h3 class="h_3">
회원님의 <em>정보 보호</em>를 <br>
위하여 <em>비밀번호</em>를 한번 더 확인합니다.
</h3>
</div>
<?php }else{ ?>
<span class="bg_tit_left">My pa</span>
<div class="join_info">
<h1 class="h_1"> My Page </h1>
<h3 class="h_3">
회원님의 <em>정보 보호</em>를 <br>
위하여 <em>비밀번호</em>를 한번 더 확인합니다.
</h3>
</div>
<?php } ?>
</div>
<!--//pop_join_right-->
<div class="pop_input_wrap pop_join_right">
<?php if ($url == 'member_leave.php') { ?>
<span class="bg_tit_right">el</span>
<?php }else{ ?>
<span class="bg_tit_right">ge</span>
<?php } ?>
<div class="contents_wrap">
<div class="content">
<table class="ph">
<tbody>
<tr>
<th class="h_4">비밀번호 확인</th>
<td>
<div class="id_wrap">
<input type="password" name="mb_password" id="confirm_mb_password" required class="required frm_input" placeholder="비밀번호 입력" required>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="join_btn_wrap">
<button id="btn_submit" type="submit" class="btn_submit">확인</button>
</div>
</div>
</div>
<!--//pop_join_right-->
</div>
<!--//popup_content-->
</div>
<!--//popup_in-->
</div>
<!--//popup_wrap-->
</div>
</body>
</form>
</div>
<script>
function fmemberconfirm_submit(f)
{
document.getElementById("btn_submit").disabled = true;
return true;
}
</script>
<!-- } 회원 비밀번호 확인 끝 -->
+57
View File
@@ -0,0 +1,57 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">', 0);
?>
<!-- 쪽지 목록 시작 { -->
<div id="memo_list" class="new_win">
<h1 id="win_title">
<?php echo $g5['title'] ?>
<div class="win_total">전체 <?php echo $kind_title ?>쪽지 <?php echo $total_count ?>통<br></div>
</h1>
<div class="new_win_con2">
<ul class="win_ul">
<li class="<?php if ($kind == 'recv') { ?>selected<?php } ?>"><a href="./memo.php?kind=recv">받은쪽지</a></li>
<li class="<?php if ($kind == 'send') { ?>selected<?php } ?>"><a href="./memo.php?kind=send">보낸쪽지</a></li>
<li><a href="./memo_form.php">쪽지쓰기</a></li>
</ul>
<div class="memo_list">
<ul>
<?php
for ($i=0; $i<count($list); $i++) {
$readed = (substr($list[$i]['me_read_datetime'],0,1) == 0) ? '' : 'read';
$memo_preview = utf8_strcut(strip_tags($list[$i]['me_memo']), 30, '..');
?>
<li class="<?php echo $readed; ?>">
<div class="memo_li profile_big_img">
<?php echo get_member_profile_img($list[$i]['mb_id']); ?>
<?php if (! $readed){ ?><span class="no_read">안 읽은 쪽지</span><?php } ?>
</div>
<div class="memo_li memo_name">
<?php echo $list[$i]['name']; ?> <span class="memo_datetime"><i class="fa fa-clock-o" aria-hidden="true"></i> <?php echo $list[$i]['send_datetime']; ?></span>
<div class="memo_preview">
<a href="<?php echo $list[$i]['view_href']; ?>"><?php echo $memo_preview; ?></a>
</div>
</div>
<a href="<?php echo $list[$i]['del_href']; ?>" onclick="del(this.href); return false;" class="memo_del"><i class="fa fa-trash-o" aria-hidden="true"></i> <span class="sound_only">삭제</span></a>
</li>
<?php } ?>
<?php if ($i==0) { echo '<li class="empty_table">자료가 없습니다.</li>'; } ?>
</ul>
</div>
<!-- 페이지 -->
<?php echo $write_pages; ?>
<p class="win_desc"><i class="fa fa-info-circle" aria-hidden="true"></i> 쪽지 보관일수는 최장 <strong><?php echo $config['cf_memo_del'] ?></strong>일 입니다.
</p>
<div class="win_btn">
<button type="button" onclick="window.close();" class="btn_close">창닫기</button>
</div>
</div>
</div>
<!-- } 쪽지 목록 끝 -->
+60
View File
@@ -0,0 +1,60 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">', 0);
?>
<!-- 쪽지 보내기 시작 { -->
<div id="memo_write" class="new_win">
<h1 id="win_title"><i class="fa fa-envelope-o" aria-hidden="true"></i> 쪽지 보내기</h1>
<div class="new_win_con2">
<ul class="win_ul">
<li><a href="./memo.php?kind=recv">받은쪽지</a></li>
<li><a href="./memo.php?kind=send">보낸쪽지</a></li>
<li class="selected"><a href="./memo_form.php">쪽지쓰기</a></li>
</ul>
<form name="fmemoform" action="<?php echo $memo_action_url; ?>" onsubmit="return fmemoform_submit(this);" method="post" autocomplete="off">
<div class="form_01">
<h2 class="sound_only">쪽지쓰기</h2>
<ul>
<li>
<label for="me_recv_mb_id" class="sound_only">받는 회원아이디<strong>필수</strong></label>
<input type="text" name="me_recv_mb_id" value="<?php echo $me_recv_mb_id; ?>" id="me_recv_mb_id" required class="frm_input full_input required" size="47" placeholder="받는 회원아이디">
<span class="frm_info">여러 회원에게 보낼때는 컴마(,)로 구분하세요.</span>
<?php if ($config['cf_memo_send_point']) { ?>
<br ><span class="frm_info">쪽지 보낼때 회원당 <?php echo number_format($config['cf_memo_send_point']); ?>점의 포인트를 차감합니다.</span>
<?php } ?>
</li>
<li>
<label for="me_memo" class="sound_only">내용</label>
<textarea name="me_memo" id="me_memo" required class="required"><?php echo $content ?></textarea>
</li>
<li>
<span class="sound_only">자동등록방지</span>
<?php echo captcha_html(); ?>
</li>
</ul>
</div>
<div class="win_btn">
<button type="submit" id="btn_submit" class="btn btn_b02 reply_btn">보내기</button>
<button type="button" onclick="window.close();" class="btn_close">창닫기</button>
</div>
</div>
</form>
</div>
<script>
function fmemoform_submit(f)
{
<?php echo chk_captcha_js(); ?>
return true;
}
</script>
<!-- } 쪽지 보내기 끝 -->

Some files were not shown because too many files have changed in this diff Show More