1326 lines
35 KiB
JavaScript
1326 lines
35 KiB
JavaScript
// 전역 변수
|
|
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();
|
|
}
|
|
});
|
|
});
|
|
|
|
$(function () {
|
|
document.querySelector("head title").textContent = "EG-BIM";
|
|
});
|
|
|
|
// ★★ lenis 멈추기 ★★
|
|
function handlePopupScroll(e) {
|
|
$("body").css("overflow", "hidden");
|
|
$("body").on("wheel", function (e) {
|
|
e.stopPropagation();
|
|
});
|
|
$("body").on("touchmove", function (e) {
|
|
e.stopPropagation();
|
|
});
|
|
lenis.stop();
|
|
}
|
|
|
|
// 각 팝업창 불러오기
|
|
function agreement() {
|
|
$(".popup_wrap").hide();
|
|
$(".btn_close").show();
|
|
$("#pop_agreement").show(0, function () {
|
|
//팝업창 열때 체크박스 모두 해제
|
|
$("#fregister input[type=checkbox]").prop("checked", false);
|
|
$("#reg_mb_id").val("");
|
|
handlePopupScroll();
|
|
console.log("body stop 완료");
|
|
// $.getScript("../js/popup.js", function () {});
|
|
});
|
|
}
|
|
|
|
//250813 송대일 추가 agreement() 수정
|
|
// function agreement() {
|
|
// $(".popup_wrap").hide();
|
|
// $(".btn_close").show();
|
|
|
|
// $("#pop_agreement").show(0, function () {
|
|
// // 팝업 열 때 체크박스 모두 해제
|
|
// $("#fregister input[type=checkbox]").prop("checked", false);
|
|
// $("#reg_mb_id").val("");
|
|
|
|
// // ★ 동의 버튼 강제 활성화 (혹시 다른 스크립트가 disabled 걸었을 경우 대비)
|
|
// $('#btn_agree, #fregister button[type=submit]').prop('disabled', false)
|
|
// .css('pointer-events', 'auto');
|
|
|
|
// handlePopupScroll();
|
|
// console.log("body stop 완료");
|
|
|
|
// // ★ 이 줄이 문제 가능성이 큽니다. 매번 popup.js를 다시 실행시키지 마세요.
|
|
// // $.getScript("../js/popup.js", function () {});
|
|
// });
|
|
// }
|
|
|
|
function join() {
|
|
$(".popup_wrap").hide();
|
|
$("#pop_join").show(0, function () {
|
|
//회원가입 입력창 비밀번호 자동 입력 제거
|
|
$("#reg_mb_password").val("");
|
|
handlePopupScroll();
|
|
console.log("body stop 완료");
|
|
// $.getScript("../js/popup.js", function () {});
|
|
});
|
|
}
|
|
|
|
function login() {
|
|
$(".popup_wrap").hide();
|
|
//새로고침 없이 다시 팝업창 열었을때 자동 입력된 id, pw 제거
|
|
$("#login_id").val("");
|
|
$("#login_pw").val("");
|
|
$("#pop_login").show(0, function () {
|
|
handlePopupScroll();
|
|
console.log("body stop 완료");
|
|
// $.getScript("../js/popup.js", function () {});
|
|
});
|
|
}
|
|
|
|
function mypage01() {
|
|
$(".popup_wrap").hide();
|
|
$(".btn_close").show();
|
|
$("#pop_mypage01").show(0, function () {
|
|
handlePopupScroll();
|
|
console.log("body stop 완료");
|
|
// $.getScript("../js/popup.js", function () {});
|
|
});
|
|
}
|
|
|
|
function mypage02() {
|
|
$(".popup_wrap").hide();
|
|
$("#pop_mypage02").show(0, function () {
|
|
handlePopupScroll();
|
|
console.log("body stop 완료");
|
|
// $.getScript("../js/popup.js", function () {});
|
|
});
|
|
}
|
|
|
|
function mypage03() {
|
|
$(".popup_wrap").hide();
|
|
$("#pop_mypage03").show(0, function () {
|
|
handlePopupScroll();
|
|
// 팝업이 완전히 열릴 때마다 사용자 정보 재조회
|
|
if (typeof loadDescopeUser === "function") {
|
|
loadDescopeUser();
|
|
}
|
|
console.log("body stop 완료");
|
|
// $.getScript("../js/popup.js", function () {});
|
|
});
|
|
}
|
|
|
|
function search() {
|
|
$(".popup_wrap").hide();
|
|
$("#pop_search").show(0, function () {
|
|
handlePopupScroll();
|
|
//비밀번호 재설정 입력창 아이디 자동입력 제거
|
|
$("#txt_name").val("");
|
|
//비밀번호 재설정 입력창 비밀번호 자동입력 제거
|
|
$("#pw_reset1").val("");
|
|
//비밀번호 재설정 버튼 클릭시 아이디 입력창 띄움
|
|
$("#pop_search .popup_contents_wrap").hide();
|
|
$("#pop_search .popup_contents_wrap").eq(0).show();
|
|
console.log("body stop 완료");
|
|
// $.getScript("../js/popup.js", function () {});
|
|
});
|
|
}
|
|
|
|
function sitemap() {
|
|
const $popup = $(".popup_sitemap");
|
|
|
|
if ($popup.css("display") === "none") {
|
|
$("#sitemap").show(0, function () {
|
|
$(".menu_ham").addClass("btn_map_close");
|
|
handlePopupScroll();
|
|
console.log("body stop 완료");
|
|
// $.getScript("../js/popup.js", function () {});
|
|
});
|
|
} else {
|
|
$(".popup_sitemap").hide();
|
|
$(".menu_ham").removeClass("btn_map_close");
|
|
$("body").css("overflow", ""); // 기본 스크롤 상태로 복귀
|
|
lenis.start();
|
|
}
|
|
}
|
|
|
|
function privacy(type) {
|
|
$(".popup_wrap").hide();
|
|
$("#pop_privacy").show(0, function () {
|
|
handlePopupScroll();
|
|
console.log("body stop 완료");
|
|
$.getScript("../js/popup.js", 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");
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
// 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 = 220; // 탑 버튼이 아래에서 떨어져 있어야 하는 거리
|
|
// // 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();
|
|
// },
|
|
// });
|
|
|
|
// // 새로운 코드 추가 - topButton의 표시/숨기기 로직
|
|
// function toggleTopButtonClass() {
|
|
// if (window.scrollY === 0) {
|
|
// topButton.classList.remove("topbtn_on");
|
|
// topButton.classList.add("topbtn_off"); // 스크롤이 맨 위일 때 topbtn_off 추가
|
|
// } else {
|
|
// topButton.classList.remove("topbtn_off");
|
|
// topButton.classList.add("topbtn_on"); // 스크롤이 내려가면 topbtn_on으로 변경
|
|
// }
|
|
// }
|
|
|
|
// window.addEventListener("scroll", toggleTopButtonClass);
|
|
// window.addEventListener("load", toggleTopButtonClass); // 페이지 로드 시 초기 상태 설정
|
|
// });
|
|
|
|
//250812 송대일 수정
|
|
document.addEventListener("DOMContentLoaded", () => {
|
|
const topButton = document.querySelector(".btn_top");
|
|
|
|
// rAF 스로틀링
|
|
let scheduled = false;
|
|
const schedule = (fn) => {
|
|
if (scheduled) return;
|
|
scheduled = true;
|
|
requestAnimationFrame(() => {
|
|
fn();
|
|
scheduled = false;
|
|
});
|
|
};
|
|
|
|
function adjustButtonPosition() {
|
|
if (!topButton) return; // ← 가드
|
|
const scrollY = window.scrollY;
|
|
const windowHeight = window.innerHeight;
|
|
const documentHeight = document.documentElement.scrollHeight;
|
|
const bottomSpace = 120;
|
|
|
|
if (scrollY + windowHeight >= documentHeight - bottomSpace) {
|
|
topButton.style.bottom = `${
|
|
bottomSpace + (scrollY + windowHeight - documentHeight)
|
|
}px`;
|
|
} else {
|
|
topButton.style.bottom = "60px";
|
|
}
|
|
}
|
|
|
|
function toggleTopButtonClass() {
|
|
if (!topButton) return; // ← 가드
|
|
if (window.scrollY === 0) {
|
|
topButton.classList.remove("topbtn_on");
|
|
topButton.classList.add("topbtn_off");
|
|
} else {
|
|
topButton.classList.remove("topbtn_off");
|
|
topButton.classList.add("topbtn_on");
|
|
}
|
|
}
|
|
|
|
// .btn_top 이 있을 때만 바인딩
|
|
if (topButton) {
|
|
const onScroll = () =>
|
|
schedule(() => {
|
|
adjustButtonPosition();
|
|
toggleTopButtonClass();
|
|
});
|
|
window.addEventListener("scroll", onScroll, { passive: true });
|
|
window.addEventListener("load", () => {
|
|
adjustButtonPosition();
|
|
toggleTopButtonClass();
|
|
});
|
|
}
|
|
|
|
// ── 헤더 애니메이션 (GSAP/ScrollTrigger가 있을 때만)
|
|
if (window.gsap) {
|
|
try {
|
|
if (window.ScrollTrigger && gsap.registerPlugin) {
|
|
gsap.registerPlugin(ScrollTrigger);
|
|
}
|
|
const showNav = gsap
|
|
.from(".js__header", {
|
|
yPercent: -200,
|
|
paused: true,
|
|
duration: 0.2,
|
|
})
|
|
.progress(1);
|
|
|
|
if (window.ScrollTrigger) {
|
|
ScrollTrigger.create({
|
|
start: "top top",
|
|
end: 99999,
|
|
onUpdate: (self) => {
|
|
self.direction === -1 ? showNav.play() : showNav.reverse();
|
|
},
|
|
});
|
|
}
|
|
} catch (e) {
|
|
console.error(e);
|
|
}
|
|
}
|
|
});
|
|
|
|
// 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 (event) {
|
|
event.stopPropagation(); // family_btn 클릭 시 이벤트 전파를 막음
|
|
$(".family_list").toggleClass("family_on");
|
|
$(".family_btn").toggleClass("family_on");
|
|
});
|
|
|
|
// 화면 아무 곳이나 클릭했을 때 family_list를 제외한 영역 클릭 시 리스트 닫기
|
|
$(document).click(function (event) {
|
|
if (
|
|
!$(event.target).closest(".family_list").length &&
|
|
!$(event.target).closest(".family_btn").length
|
|
) {
|
|
// family_list와 family_btn 외의 영역을 클릭한 경우
|
|
$(".family_list").removeClass("family_on");
|
|
$(".family_btn").removeClass("family_on");
|
|
}
|
|
});
|
|
});
|
|
|
|
// 마우스 스크롤 마크 표시하기
|
|
// 사용 클래스 : js__mouse_mark , js__mouse_area
|
|
// + TODO 진슬 추가_ addEventListener error debugging
|
|
window.onload = function () {
|
|
document.addEventListener("DOMContentLoaded", () => {
|
|
const mouseMark = document.querySelector(".js__mouse_mark");
|
|
const mouseArea = document.querySelector(".js__mouse_area");
|
|
const mouseNot = document.querySelector(".js__mouse_not");
|
|
|
|
mouseArea.addEventListener("mousemove", (e) => {
|
|
mouseMark.style.left = `${e.clientX}px`;
|
|
mouseMark.style.top = `${e.clientY}px`;
|
|
mouseMark.style.display = "flex";
|
|
});
|
|
|
|
mouseArea.addEventListener(
|
|
"mouseleave",
|
|
() => (mouseMark.style.display = "none")
|
|
);
|
|
|
|
mouseNot.addEventListener(
|
|
"mouseover",
|
|
() => (mouseMark.style.opacity = "0")
|
|
);
|
|
mouseNot.addEventListener(
|
|
"mouseleave",
|
|
() => (mouseMark.style.opacity = "1")
|
|
);
|
|
});
|
|
|
|
document.addEventListener("DOMContentLoaded", () => {
|
|
const mouseMark02 = document.querySelector(".js__mouse_mark02");
|
|
const mouseArea02 = document.querySelector(".js__mouse_area02");
|
|
const mouseNot02 = document.querySelector(".js__mouse_not02");
|
|
|
|
mouseArea02.addEventListener("mousemove", (e) => {
|
|
mouseMark02.style.left = `${e.clientX}px`;
|
|
mouseMark02.style.top = `${e.clientY}px`;
|
|
mouseMark02.style.display = "flex";
|
|
});
|
|
|
|
mouseArea02.addEventListener(
|
|
"mouseleave",
|
|
() => (mouseMark02.style.display = "none")
|
|
);
|
|
|
|
mouseNot02.addEventListener(
|
|
"mouseover",
|
|
() => (mouseMark02.style.opacity = "0")
|
|
);
|
|
mouseNot02.addEventListener(
|
|
"mouseleave",
|
|
() => (mouseMark02.style.opacity = "1")
|
|
);
|
|
});
|
|
};
|
|
|
|
// 이메일 줄바꿈
|
|
document.addEventListener("DOMContentLoaded", () => {
|
|
const emailSpan = document.getElementById("span_email");
|
|
|
|
function addBreakToEmail() {
|
|
if (!emailSpan) return;
|
|
// 요소의 width를 가져옴
|
|
const emailWidth = emailSpan.offsetWidth;
|
|
|
|
// width가 400px 이상일 때
|
|
if (emailWidth >= 250) {
|
|
let emailText = emailSpan.textContent; // 현재 이메일 텍스트
|
|
const emailParts = emailText.split("@"); // @를 기준으로 분리
|
|
|
|
if (emailParts.length === 2) {
|
|
// 유효한 이메일 형식인지 확인
|
|
emailSpan.innerHTML = `${emailParts[0]}<br>@${emailParts[1]}`; // @ 앞에 <br> 태그 추가
|
|
}
|
|
}
|
|
}
|
|
|
|
// 페이지가 로드된 후 실행
|
|
window.addEventListener("load", addBreakToEmail);
|
|
});
|
|
|
|
//refresh Token 설정 250827
|
|
async function refreshSession() {
|
|
try {
|
|
const res = await fetch("/egbim/bbs/descope_refresh_session.php", {
|
|
method: "POST",
|
|
credentials: "include",
|
|
});
|
|
const json = await res.json();
|
|
if (json.status === "ok") {
|
|
sessionStorage.setItem("sessionJwt", json.sessionJwt);
|
|
console.log("세션 갱신 완료");
|
|
} else {
|
|
console.warn("세션 갱신 실패", json);
|
|
}
|
|
} catch (e) {
|
|
console.error("갱신 에러", e);
|
|
}
|
|
}
|
|
|
|
// ✅ 주기적 호출 (예: 5분마다)
|
|
setInterval(refreshSession, 5 * 60 * 1000);
|
|
|
|
// sessionJwt 가져오기
|
|
function getSessionJwt() {
|
|
return sessionStorage.getItem("sessionJwt");
|
|
}
|
|
|
|
// API 호출 헬퍼
|
|
async function apiFetch(url, options = {}) {
|
|
// 기본 헤더
|
|
options.headers = {
|
|
...(options.headers || {}),
|
|
Authorization: "Bearer " + getSessionJwt(),
|
|
"Content-Type": "application/json",
|
|
};
|
|
options.credentials = "include"; // 서버 세션 쿠키 포함
|
|
|
|
let res = await fetch(url, options);
|
|
|
|
// ✅ 토큰 만료시 자동 갱신
|
|
if (res.status === 401 || res.status === 403) {
|
|
console.warn("토큰 만료 → refresh_session.php 호출");
|
|
|
|
const refreshRes = await fetch("/egbim/bbs/refresh_session.php", {
|
|
method: "POST",
|
|
credentials: "include",
|
|
});
|
|
|
|
if (refreshRes.ok) {
|
|
const json = await refreshRes.json();
|
|
if (json.sessionJwt) {
|
|
sessionStorage.setItem("sessionJwt", json.sessionJwt);
|
|
|
|
// Authorization 헤더 갱신 후 재시도
|
|
options.headers["Authorization"] = "Bearer " + json.sessionJwt;
|
|
res = await fetch(url, options);
|
|
} else {
|
|
alert("세션 갱신 실패 → 다시 로그인 필요");
|
|
window.location.href = "/egbim/index.php?popup=login";
|
|
}
|
|
} else {
|
|
alert("세션이 만료되었습니다. 다시 로그인해주세요.");
|
|
window.location.href = "/egbim/index.php?popup=login";
|
|
}
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
// === 탭 닫을 때 서버 세션 종료 ===
|
|
// window.addEventListener("beforeunload", function () {
|
|
// try {
|
|
// // sendBeacon은 비동기지만 브라우저 종료 시점에도 안전하게 전송됨
|
|
// navigator.sendBeacon("/egbim/skin/member/basic/descope_logout.php");
|
|
// } catch (e) {
|
|
// console.error("beforeunload logout error:", e);
|
|
// }
|
|
// });
|