2020-10-12 14:39:23 +09:00
|
|
|
|
$(window).on("keydown", function (e) {
|
2021-11-03 15:19:08 +09:00
|
|
|
|
if (e.keyCode == 116 /*|| e.keyCode == 123*/) {
|
2021-04-12 11:18:06 +09:00
|
|
|
|
prv(); return false;
|
|
|
|
|
|
}
|
2020-10-28 15:25:13 +09:00
|
|
|
|
if (e.keyCode == 119 && typeof (save) == "function" && $("#layermessage:visible").length < 1) {
|
2020-10-12 14:39:23 +09:00
|
|
|
|
save();
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (e.keyCode == 115 && typeof (del) == "function" && $("#layermessage:visible").length < 1) {
|
|
|
|
|
|
del();
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (e.keyCode == 13 && $("#confirmbox:visible").length > 0) {
|
|
|
|
|
|
confirmok();
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (e.keyCode == 27 && $("#confirmbox:visible").length > 0) {
|
|
|
|
|
|
confirmtoggle();
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (e.keyCode == 27 && $("#layermessage:visible").length > 0) {
|
|
|
|
|
|
$(_focusitem).focus();
|
|
|
|
|
|
hidelayermsg();
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).ready(function () {
|
2025-04-03 15:07:29 +09:00
|
|
|
|
|
2020-10-12 14:39:23 +09:00
|
|
|
|
$("body").on("keydown", ".int, .intdot", function (e) {
|
2025-04-03 15:07:29 +09:00
|
|
|
|
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}).on("keyup", ".int, .intdot, input.mobile,input[type='text'],input[type='password']", function (e) {
|
|
|
|
|
|
if (($(this).hasClass("int") || $(this).hasClass("intdot") || $(this).hasClass("mobile")) && $(this).val() !== null && $(this).val() !== '' && e.keyCode != 8 && e.keyCode != 109 && e.keyCode != 189 && e.keyCode != 46 && e.keyCode != 190 && e.keyCode != 110 && e.keyCode != 109 && e.keycode != 189 && e.keyCode != 13
|
|
|
|
|
|
&& !(e.keyCode > 47 && e.keyCode < 58) && !(e.keyCode > 95 && e.keyCode < 106)) {
|
|
|
|
|
|
$(this).val($(this).val().replace(/[^0-9.-]/g, ''));
|
|
|
|
|
|
if ($(this).hasClass("int") && isNaN(parseInt($(this).val(), 10))) {
|
|
|
|
|
|
if (!$(this).hasClass("datazero")) {
|
|
|
|
|
|
$(this).val("");
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
$(this).val(0);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else if ($(this).hasClass("double") && isNaN(parseFloat($(this).val()))) {
|
|
|
|
|
|
if (!$(this).hasClass("datazero")) {
|
|
|
|
|
|
$(this).val("");
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
$(this).val(0);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if ($(this).val() == "") {
|
|
|
|
|
|
if (($(this).attr("id") || "") != "" && ($(this).attr("placeholder") || "") != "" && $("#ph_" + $(this).attr("id")).length < 1) {
|
|
|
|
|
|
var ua = window.navigator.userAgent;
|
|
|
|
|
|
var msie = ua.indexOf("MSIE ");
|
|
|
|
|
|
if (msie < 0) {
|
|
|
|
|
|
msie = ua.indexOf("Trident/");
|
|
|
|
|
|
}
|
|
|
|
|
|
if (msie > -1) {
|
|
|
|
|
|
$("label.phplaceholder").remove();
|
|
|
|
|
|
$("<label class=\"phplaceholder\" id=\"ph_" + $(this).attr("id") + "\">" + $(this).attr("placeholder") + "<label>").insertAfter($(this));
|
|
|
|
|
|
$("#ph_" + $(this).attr("id")).css("top", ($(this).position().top + 10) + 'px');
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$("label.phplaceholder").remove();
|
|
|
|
|
|
}
|
|
|
|
|
|
}).on("change", ".int, .intdot, .email, .mobile, .mobilefmt, .telfmt", function () {
|
|
|
|
|
|
if ($(this).hasClass("email")) {
|
|
|
|
|
|
$("#" + $(this).attr("data-bind")).val(vals($(this).parent().find(".emaildata" + $(this).attr("data-bind")), '@'));
|
|
|
|
|
|
}
|
|
|
|
|
|
else if ($(this).hasClass("mobile")) {
|
|
|
|
|
|
$("#" + $(this).attr("data-bind")).val(vals($(this).parent().find(".mobiledata" + $(this).attr("data-bind"))));
|
|
|
|
|
|
}
|
|
|
|
|
|
else if ($(this).hasClass("mobilefmt")) {
|
|
|
|
|
|
$(this).val(formatmobile($(this).val()));
|
|
|
|
|
|
}
|
|
|
|
|
|
else if ($(this).hasClass("telfmt")) {
|
|
|
|
|
|
$(this).val(formattel($(this).val()));
|
|
|
|
|
|
}
|
|
|
|
|
|
else if ($(this).hasClass("int") && isNaN(parseInt($(this).val(), 10))) {
|
|
|
|
|
|
if (!$(this).hasClass("datazero")) {
|
|
|
|
|
|
$(this).val("");
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
$(this).val(0);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else if ($(this).hasClass("intdot") && isNaN(parseFloat($(this).val()))) {
|
|
|
|
|
|
if (!$(this).hasClass("datazero")) {
|
|
|
|
|
|
$(this).val("");
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
$(this).val(0);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-04-03 15:07:29 +09:00
|
|
|
|
}).on("click", ".int, .intdot", function () {
|
|
|
|
|
|
$(this)[0].select();
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}).on("focus", ".int, .intdot, input[type='text'], input[type='password']", function () {
|
2025-04-03 15:07:29 +09:00
|
|
|
|
if ($(this).hasClass("int") || $(this).hasClass("intdot")) {
|
|
|
|
|
|
$(this).val($(this).val().replace(/,/gi, ''));
|
|
|
|
|
|
}
|
|
|
|
|
|
if (($(this).attr("id") || "") != "" && ($(this).attr("placeholder") || "") != "" && $("#ph_" + $(this).attr("id")).length < 1 && $(this).val() == "") {
|
|
|
|
|
|
var ua = window.navigator.userAgent;
|
|
|
|
|
|
var msie = ua.indexOf("MSIE ");
|
|
|
|
|
|
if (msie < 0) {
|
|
|
|
|
|
msie = ua.indexOf("Trident/");
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}
|
2025-04-03 15:07:29 +09:00
|
|
|
|
if (msie > -1) {
|
|
|
|
|
|
$("label.phplaceholder").remove();
|
|
|
|
|
|
$("<label class=\"phplaceholder\" id=\"ph_" + $(this).attr("id") + "\">" + $(this).attr("placeholder") + "<label>").insertAfter($(this));
|
|
|
|
|
|
$("#ph_" + $(this).attr("id")).css("top", ($(this).position().top + 10) + 'px');
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}
|
2025-04-03 15:07:29 +09:00
|
|
|
|
}
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}).on("focusout", "input.datepicker-input", function () {
|
|
|
|
|
|
var v = $(this).val().replace(/[^0-9]/g, '');
|
|
|
|
|
|
if (v.length != 8) {
|
|
|
|
|
|
$(this).val("");
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$(this).val(v.substr(0, 4) + "-" + v.substr(4, 2) + "-" + v.substr(6));
|
|
|
|
|
|
}
|
2025-04-03 15:07:29 +09:00
|
|
|
|
}).on("focusout", ".int, .intdot, input[type='text'], input[type='password']", function () {
|
2020-10-12 14:39:23 +09:00
|
|
|
|
$("label.phplaceholder").remove();
|
|
|
|
|
|
});
|
|
|
|
|
|
$('#breadcrumb dd > span').click(function () {
|
|
|
|
|
|
if ($(this).is('.on')) {
|
|
|
|
|
|
$(this).next().slideUp(300);
|
|
|
|
|
|
$(this).removeClass('on');
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$('#breadcrumb dd > ul').slideUp(300);
|
|
|
|
|
|
$('#breadcrumb dd > span').removeClass('on');
|
|
|
|
|
|
$(this).addClass('on');
|
|
|
|
|
|
$(this).next().slideDown(300);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("click", "a", function () {
|
|
|
|
|
|
if ($(this).attr("href") == "#") {
|
|
|
|
|
|
prv();
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
$("body").on("keydown", "input[type=text], input[type=password]", function (e) {
|
|
|
|
|
|
if (e.keyCode == 13) {
|
|
|
|
|
|
var index = $('input[type=text], input[type=password]').index(this) + 1;
|
|
|
|
|
|
$('input[type=text], input[type=password]').eq(index).focus();
|
|
|
|
|
|
if ($(this).closest("form").length == 1) {
|
|
|
|
|
|
if ($(this).closest("form").find("input[type=text]").length == 1) {
|
|
|
|
|
|
prv();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (($(this).attr("data-eval") || "") != "") {
|
|
|
|
|
|
eval($(this).attr("data-eval"));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}).on("click", "a.btnpage", function () {
|
|
|
|
|
|
if (!$(this).hasClass("on")) {
|
|
|
|
|
|
if ($(this).hasClass("first")) {
|
|
|
|
|
|
eval($(this).closest(".paging").attr("data-method") + "('F')");
|
|
|
|
|
|
}
|
|
|
|
|
|
else if ($(this).hasClass("prev")) {
|
|
|
|
|
|
eval($(this).closest(".paging").attr("data-method") + "('P')");
|
|
|
|
|
|
}
|
|
|
|
|
|
else if ($(this).hasClass("next")) {
|
|
|
|
|
|
eval($(this).closest(".paging").attr("data-method") + "('N')");
|
|
|
|
|
|
}
|
|
|
|
|
|
else if ($(this).hasClass("last")) {
|
|
|
|
|
|
eval($(this).closest(".paging").attr("data-method") + "('L')");
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
2025-04-03 15:07:29 +09:00
|
|
|
|
eval($(this).closest(".paging").attr("data-method") + "('" + $(this).text() + "')");
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
$('.popClose').click(function () {
|
|
|
|
|
|
$('.popWrap').css('display', 'none');
|
|
|
|
|
|
$('html, body').removeClass('lock');
|
|
|
|
|
|
});
|
2021-08-23 15:10:15 +09:00
|
|
|
|
document.oncontextmenu = disableit;
|
2020-10-12 14:39:23 +09:00
|
|
|
|
});
|
|
|
|
|
|
var _uploadeditorimageitem;
|
|
|
|
|
|
var _uploadeditorimagecallback;
|
|
|
|
|
|
var _uploadeditorimagertn;
|
|
|
|
|
|
function checkpop() {
|
|
|
|
|
|
var cpop = open("", "checkpop", '');
|
|
|
|
|
|
if (cpop == null) {
|
|
|
|
|
|
alert("팝업이 차단되어 있습니다. 차단을 해제해 주세요.");
|
|
|
|
|
|
return false;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
cpop.close();
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
function mpgPopClose(selector) {
|
|
|
|
|
|
$(selector || '.mpgPop').hide();
|
|
|
|
|
|
$('html, body').removeClass('lock');
|
|
|
|
|
|
}
|
|
|
|
|
|
function cbeditorupload() {
|
|
|
|
|
|
if (_uploadeditorimagertn.code == 1000) {
|
|
|
|
|
|
$(_uploadeditorimageitem).summernote('editor.insertImage', _uploadeditorimagertn.obj.uri);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
function uploadeditorimage(files, el, fdata, _callback, _url) {
|
|
|
|
|
|
_url = _url || '/fcommon/UploadEditorImageUrl';
|
|
|
|
|
|
_uploadeditorimagecallback = _callback;
|
|
|
|
|
|
_uploadeditorimageitem = el;
|
|
|
|
|
|
$.ajax({
|
|
|
|
|
|
data: fdata,
|
|
|
|
|
|
type: "POST",
|
|
|
|
|
|
url: _url,
|
|
|
|
|
|
cache: false,
|
|
|
|
|
|
contentType: false,
|
|
|
|
|
|
processData: false,
|
2025-04-03 15:07:29 +09:00
|
|
|
|
success: function (result) {
|
2020-10-12 14:39:23 +09:00
|
|
|
|
_uploadeditorimagertn = result;
|
|
|
|
|
|
eval(_uploadeditorimagecallback.substr(_uploadeditorimagecallback.length - 1, 1) == ")" ? _uploadeditorimagecallback : (_uploadeditorimagecallback + "()"));
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
function gologin(url, returnurl) {
|
|
|
|
|
|
url = url || '/Account/Index';
|
|
|
|
|
|
if ((returnurl || "") != "") {
|
|
|
|
|
|
url += "?ru=" + returnurl;
|
|
|
|
|
|
}
|
|
|
|
|
|
location.href = url;
|
|
|
|
|
|
}
|
|
|
|
|
|
function gopage(fid, pid, pno, a) {
|
|
|
|
|
|
fid = fid || "mform";
|
|
|
|
|
|
pid = pid || "pagenum";
|
|
|
|
|
|
$("#" + fid).find("#" + pid).val(pno);
|
|
|
|
|
|
bglayer();
|
2025-04-03 15:07:29 +09:00
|
|
|
|
$("#" + fid).submit();
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}
|
|
|
|
|
|
var _vc_cmino = 0;
|
|
|
|
|
|
var _vc_istaste = false;
|
|
|
|
|
|
var _vc_lectno = 0;
|
|
|
|
|
|
var _vc_pseq = 0;
|
|
|
|
|
|
var _vcwin;
|
|
|
|
|
|
var _vcistaste = false;
|
|
|
|
|
|
function viewcontents(cmino, istaste, lectno, pseq) {
|
|
|
|
|
|
lectno = lectno || 0;
|
|
|
|
|
|
pseq = getint(pseq);
|
|
|
|
|
|
_vc_cmino = cmino;
|
|
|
|
|
|
_vc_istaste = istaste;
|
|
|
|
|
|
_vc_lectno = lectno;
|
|
|
|
|
|
_vc_pseq = pseq;
|
|
|
|
|
|
_vcistaste = istaste;
|
|
|
|
|
|
if (ismobile()) {
|
|
|
|
|
|
confirmtoggle(true, "사용 중인 요금제에 따라 데이터 요금이 발생할 수 있습니다.", "viewcontentsok()");
|
|
|
|
|
|
} else {
|
|
|
|
|
|
viewcontentsok();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
function viewcontentsok() {
|
|
|
|
|
|
if (!_vcistaste) {
|
|
|
|
|
|
//로그인체크
|
|
|
|
|
|
capp("/focommon/isauth", {}, "cbviewcontents");
|
|
|
|
|
|
} else {
|
|
|
|
|
|
cbviewcontents();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-04-03 13:57:19 +09:00
|
|
|
|
|
|
|
|
|
|
|
2020-10-12 14:39:23 +09:00
|
|
|
|
var _cdmsisopenning = 0;
|
2025-04-03 13:57:19 +09:00
|
|
|
|
|
|
|
|
|
|
// 팝업 창 참조를 전역으로 유지
|
|
|
|
|
|
let globalPopup = null;
|
|
|
|
|
|
|
2020-10-12 14:39:23 +09:00
|
|
|
|
function cbviewcontents() {
|
2025-04-03 13:57:19 +09:00
|
|
|
|
if (_vcistaste || capResult.code == 1000) {
|
|
|
|
|
|
// 백그라운드 레이어 숨기기
|
2020-10-12 14:39:23 +09:00
|
|
|
|
$("#bglayer").hide();
|
|
|
|
|
|
_cdmsisopenning = 1;
|
2025-04-03 13:57:19 +09:00
|
|
|
|
|
|
|
|
|
|
const url = `/CDMS/Play${_vc_istaste ? "Taste" : ""}?cmino=${_vc_cmino}&ismobile=${ismobile() ? '1' : '0'}&lectno=${_vc_lectno}&pseq=${_vc_pseq}`;
|
|
|
|
|
|
|
|
|
|
|
|
// 팝업 옵션
|
|
|
|
|
|
const nWidth = 1080;
|
|
|
|
|
|
const nHeight = screen.availHeight - 100;
|
|
|
|
|
|
const nLeft = Math.round((screen.availWidth - nWidth) / 2);
|
|
|
|
|
|
const nTop = Math.round((screen.availHeight - nHeight) / 2);
|
|
|
|
|
|
|
|
|
|
|
|
const popOption = `
|
|
|
|
|
|
width=${nWidth},
|
|
|
|
|
|
height=${nHeight},
|
|
|
|
|
|
top=${nTop},
|
|
|
|
|
|
left=${nLeft},
|
|
|
|
|
|
toolbar=no,
|
|
|
|
|
|
menubar=no,
|
|
|
|
|
|
location=no,
|
|
|
|
|
|
resizable=yes,
|
|
|
|
|
|
status=yes,
|
|
|
|
|
|
scrollbars=yes`.replace(/\s+/g, '');
|
|
|
|
|
|
|
|
|
|
|
|
// 이미 팝업이 열려 있는지 확인
|
|
|
|
|
|
if (globalPopup && !globalPopup.closed) {
|
|
|
|
|
|
try {
|
|
|
|
|
|
// 1초 딜레이 적용
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
globalPopup.location.href = url; // URL 업데이트 (필요에 따라)
|
|
|
|
|
|
globalPopup.focus(); // 이미 열린 팝업 창 활성화
|
|
|
|
|
|
}, 1000);
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
console.error("기존 팝업 접근 실패: ", e);
|
|
|
|
|
|
globalPopup = null; // 접근 실패 시 참조 정리
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}
|
2025-04-03 15:07:29 +09:00
|
|
|
|
} else {
|
2025-04-03 13:57:19 +09:00
|
|
|
|
globalPopup = window.open(url, 'contentsview', popOption);
|
|
|
|
|
|
|
|
|
|
|
|
if (!globalPopup) {
|
|
|
|
|
|
msg("팝업이 차단되어 있습니다. 차단을 해제해 주세요.");
|
2020-10-12 14:39:23 +09:00
|
|
|
|
} else {
|
2025-04-03 13:57:19 +09:00
|
|
|
|
try {
|
|
|
|
|
|
globalPopup.focus(); // 포커스 이동
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
console.error("팝업 포커스 실패: ", e);
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-04-03 13:57:19 +09:00
|
|
|
|
} else {
|
|
|
|
|
|
location.href = "/Account/Index?ru=" + location.href.replace(/#/gi, '');
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2021-08-23 15:10:15 +09:00
|
|
|
|
|
2020-10-12 14:39:23 +09:00
|
|
|
|
function poppaging(id, ptc, pno) {
|
|
|
|
|
|
$("#" + id).attr("data-lastpage", 1);
|
|
|
|
|
|
if (ptc > 10) {
|
|
|
|
|
|
if (pno > 10) {
|
|
|
|
|
|
$("#" + id).append("<a href=\"#\" class=\"btnpage first\">맨앞</a>");
|
|
|
|
|
|
}
|
|
|
|
|
|
if (pno > 1) {
|
|
|
|
|
|
$("#" + id).append("<a href=\"#\" class=\"btnpage prev\">이전</a>");
|
|
|
|
|
|
}
|
|
|
|
|
|
var __lastpno = (getint(ptc / 10) + (ptc % 10 > 0 ? 1 : 0));
|
|
|
|
|
|
$("#" + id).attr("data-lastpage", __lastpno);
|
|
|
|
|
|
var pstart = getint((pno - 1) / 10) * 10 + 1;
|
|
|
|
|
|
var __paging = "<ul>";
|
|
|
|
|
|
for (var i = pstart; i < pstart + 10; i++) {
|
|
|
|
|
|
__paging += "<li class=\"" + (pno == i ? "on" : "") + "\"><a href=\"#\" class=\"btnpage \">" + i + "</a></li>";
|
|
|
|
|
|
if (i == __lastpno) {
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
$("#" + id).append(__paging + "</ul>");
|
|
|
|
|
|
if (pno < __lastpno) {
|
|
|
|
|
|
$("#" + id).append("<a class=\"btnpage next\">다음</a>");
|
|
|
|
|
|
$("#" + id).append("<a class=\"btnpage last\">맨뒤</a>");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
function mobilefmt(phoneNum) {
|
|
|
|
|
|
var regExp = /(01[016789])([1-9]{1}[0-9]{2,3})([0-9]{4})$/;
|
|
|
|
|
|
var myArray;
|
|
|
|
|
|
if (regExp.test(phoneNum)) {
|
|
|
|
|
|
myArray = regExp.exec(phoneNum);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
regExp = /(01[016789])-([1-9]{1}[0-9]{2,3})-([0-9]{4})$/;
|
|
|
|
|
|
if (regExp.test(phoneNum)) {
|
|
|
|
|
|
myArray = regExp.exec(phoneNum);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
function formatmobile(phoneNum) {
|
|
|
|
|
|
phoneNum = phoneNum.replace(/-/gi, '');
|
|
|
|
|
|
if (mobilefmt(phoneNum)) {
|
|
|
|
|
|
var rtnNum;
|
|
|
|
|
|
var regExp = /(01[016789])([1-9]{1}[0-9]{2,3})([0-9]{4})$/;
|
|
|
|
|
|
var myArray;
|
|
|
|
|
|
if (regExp.test(phoneNum)) {
|
|
|
|
|
|
myArray = regExp.exec(phoneNum); rtnNum = myArray[1] + '-' + myArray[2] + '-' + myArray[3]; return rtnNum;
|
|
|
|
|
|
} else { return phoneNum; }
|
|
|
|
|
|
} else { return phoneNum; }
|
|
|
|
|
|
}
|
|
|
|
|
|
function telfmt(phoneNum) {
|
|
|
|
|
|
var regExp;
|
|
|
|
|
|
var myArray;
|
|
|
|
|
|
if (phoneNum.length == 8) {
|
|
|
|
|
|
regExp = /([1-9]{1}[0-9]{3})([0-9]{4})$/;
|
|
|
|
|
|
if (regExp.test(phoneNum)) {
|
|
|
|
|
|
myArray = regExp.exec(phoneNum);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
regExp = /([1-9]{1}[0-9]{3})-([0-9]{4})$/;
|
|
|
|
|
|
if (regExp.test(phoneNum)) {
|
|
|
|
|
|
myArray = regExp.exec(phoneNum);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (phoneNum.length == 9) {
|
|
|
|
|
|
regExp = /([0]{1}[2]{1})([1-9]{1}[0-9]{2})([0-9]{4})$/;
|
|
|
|
|
|
if (regExp.test(phoneNum)) {
|
|
|
|
|
|
myArray = regExp.exec(phoneNum);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
regExp = /([0]{1}[2]{1})-([1-9]{1}[0-9]{2})-([0-9]{4})$/;
|
|
|
|
|
|
if (regExp.test(phoneNum)) {
|
|
|
|
|
|
myArray = regExp.exec(phoneNum);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (phoneNum.length == 10) {
|
|
|
|
|
|
if (phoneNum.substr(0, 2) == "02") {
|
|
|
|
|
|
regExp = /([0]{1}[2]{1})([1-9]{1}[0-9]{3})([0-9]{4})$/;
|
|
|
|
|
|
if (regExp.test(phoneNum)) {
|
|
|
|
|
|
myArray = regExp.exec(phoneNum);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
regExp = /([0]{1}[2]{1})-([1-9]{1}[0-9]{3})-([0-9]{4})$/;
|
|
|
|
|
|
if (regExp.test(phoneNum)) {
|
|
|
|
|
|
myArray = regExp.exec(phoneNum);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
regExp = /([0]{1}[3-9]{1}[0-9]{1})([1-9]{1}[0-9]{2})([0-9]{4})$/;
|
|
|
|
|
|
if (regExp.test(phoneNum)) {
|
|
|
|
|
|
myArray = regExp.exec(phoneNum);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
regExp = /([0]{1}[3-9]{1}[0-9]{1})-([1-9]{1}[0-9]{2})-([0-9]{4})$/;
|
|
|
|
|
|
if (regExp.test(phoneNum)) {
|
|
|
|
|
|
myArray = regExp.exec(phoneNum);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
regExp = /([0]{1}[3-9]{1}[0-9]{1})([1-9]{1}[0-9]{3})([0-9]{4})$/;
|
|
|
|
|
|
if (regExp.test(phoneNum)) {
|
|
|
|
|
|
myArray = regExp.exec(phoneNum);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
regExp = /([0]{1}[3-9]{1}[0-9]{1})-([1-9]{1}[0-9]{3})-([0-9]{4})$/;
|
|
|
|
|
|
if (regExp.test(phoneNum)) {
|
|
|
|
|
|
myArray = regExp.exec(phoneNum);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
function formattel(phoneNum) {
|
|
|
|
|
|
phoneNum = phoneNum.replace(/-/gi, '');
|
|
|
|
|
|
if (telfmt(phoneNum)) {
|
|
|
|
|
|
var rtnNum;
|
|
|
|
|
|
var regExp;
|
|
|
|
|
|
var myArray;
|
|
|
|
|
|
if (phoneNum.length == 8) {
|
|
|
|
|
|
regExp = /([1-9]{1}[0-9]{3})([0-9]{4})$/;
|
|
|
|
|
|
} else if (phoneNum.length == 9) {
|
|
|
|
|
|
regExp = /([0]{1}[2]{1})([1-9]{1}[0-9]{2})([0-9]{4})$/;
|
|
|
|
|
|
} else if (phoneNum.length == 10) {
|
|
|
|
|
|
if (phoneNum.substr(0, 2) == "02") {
|
|
|
|
|
|
regExp = /([0]{1}[2]{1})([1-9]{1}[0-9]{3})([0-9]{4})$/;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
regExp = /([0]{1}[3-9]{1}[0-9]{1})([1-9]{1}[0-9]{2})([0-9]{4})$/;
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
regExp = /([0]{1}[3-9]{1}[0-9]{1})([1-9]{1}[0-9]{3})([0-9]{4})$/;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (regExp.test(phoneNum)) {
|
|
|
|
|
|
myArray = regExp.exec(phoneNum);
|
|
|
|
|
|
if (phoneNum.length == 8) {
|
|
|
|
|
|
return myArray[1] + '-' + myArray[2];
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return myArray[1] + '-' + myArray[2] + '-' + myArray[3];
|
2025-04-03 15:07:29 +09:00
|
|
|
|
}
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return phoneNum;
|
|
|
|
|
|
}
|
|
|
|
|
|
function bindComma(v) {
|
|
|
|
|
|
var fv = v.toString().replace(/,/gi, '');
|
|
|
|
|
|
var fv2 = "";
|
|
|
|
|
|
if (fv.indexOf('.') > -1) {
|
|
|
|
|
|
if (fv.split('.')[0].length > 3) {
|
|
|
|
|
|
for (var fvi = fv.split('.')[0].length - 1; fvi > -1; fvi--) {
|
|
|
|
|
|
fv2 = fv.split('.')[0].substr(fvi, 1) + (fv2 != "" && (fv2.replace(/,/gi, '').length % 3) < 1 ? "," : "") + fv2;
|
|
|
|
|
|
}
|
|
|
|
|
|
fv = fv2 + "." + fv.split('.')[1];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (fv.length > 3) {
|
|
|
|
|
|
for (var fvi2 = fv.length - 1; fvi2 > -1; fvi2--) {
|
|
|
|
|
|
fv2 = fv.substr(fvi2, 1) + (fv2 != "" && (fv2.replace(/,/gi, '').length % 3) < 1 ? "," : "") + fv2;
|
|
|
|
|
|
}
|
|
|
|
|
|
fv = fv2;
|
|
|
|
|
|
}
|
|
|
|
|
|
return fv;
|
|
|
|
|
|
}
|
|
|
|
|
|
function gourl(url) {
|
|
|
|
|
|
location.href = url;
|
|
|
|
|
|
}
|
2025-04-03 15:07:29 +09:00
|
|
|
|
function disableit() { return false; }
|
2020-10-12 14:39:23 +09:00
|
|
|
|
function refresh() {
|
|
|
|
|
|
bglayer();
|
|
|
|
|
|
location.href = location.href.replace('#', '');
|
|
|
|
|
|
}
|
|
|
|
|
|
function getnull(v) {
|
|
|
|
|
|
return v || "";
|
|
|
|
|
|
}
|
|
|
|
|
|
function getdb(v, norpspliter, nullto) {
|
|
|
|
|
|
nullto = nullto || "";
|
|
|
|
|
|
if ((norpspliter || false)) {
|
2025-04-03 15:07:29 +09:00
|
|
|
|
return v == "0" ? "0" : (v || nullto).toString();
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}
|
|
|
|
|
|
return v == "0" ? v : (v || nullto).toString().replace(/:/gi, '').replace(/;/gi, '');
|
|
|
|
|
|
}
|
|
|
|
|
|
function getint(v) {
|
|
|
|
|
|
v = v == null ? 0 : v;
|
|
|
|
|
|
v = v.toString();
|
|
|
|
|
|
v = v.replace(/,/gi, '');
|
|
|
|
|
|
if (isNaN(parseInt(v, 10)))
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
return parseInt(v, 10);
|
|
|
|
|
|
}
|
|
|
|
|
|
function prv() { try { if (event.preventDefault) { event.preventDefault(); } } catch (ex) { try { ffEvent.preventDefault(); } catch (ex2) { var exceptionmsg = ex2; } } return false; }
|
|
|
|
|
|
function gomenu(pno, ptype, url, a, no, no2) {
|
|
|
|
|
|
no = no || 0;
|
|
|
|
|
|
setv("menupageno", pno);
|
|
|
|
|
|
setv("menupagedatakey", no);
|
|
|
|
|
|
setv("menupagedatakey2", no2);
|
|
|
|
|
|
if (ptype == 3) {
|
|
|
|
|
|
if (no > 0) {
|
|
|
|
|
|
$("#menuform").attr("action", "/Board/View").submit();
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$("#menuform").attr("action", "/Board/List").submit();
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (ptype == 5) {
|
|
|
|
|
|
eval(url);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
bglayer();
|
|
|
|
|
|
location.href = (url == '' ? '/Home/Html' : url) + ((url == '' ? '/Home/Html' : url).indexOf('?') > -1 ? '' : '?') + 'menupageno=' + pno + '&menupagedatakey=' + no + '&menupagedatakey2=' + no2;
|
|
|
|
|
|
//$("#menuform").attr("action", url == '' ? "/Home/Html" : url).submit();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
function viewlayer(pno, a, title) {
|
|
|
|
|
|
$("#mainpoptitle").text(title);
|
2025-04-03 15:07:29 +09:00
|
|
|
|
capp("/focommon/Html", { pno: pno }, "cbhtmlget");
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}
|
|
|
|
|
|
function cbhtmlget() {
|
|
|
|
|
|
$("#mainpopcont").html(capResult.obj.pagehtml);
|
|
|
|
|
|
$(".mainpopwrap").show();
|
|
|
|
|
|
}
|
|
|
|
|
|
function breadcrumb(a) {
|
|
|
|
|
|
$("#ulm1 li").addClass("hidden");
|
|
|
|
|
|
$("#ulm1 li.m" + $(a).closest("li").attr("data-pno")).removeClass("hidden");
|
|
|
|
|
|
$("#ul0span").next().slideUp(300);
|
|
|
|
|
|
$("#ul0span").removeClass('on');
|
|
|
|
|
|
$("#ul0span").text($(a).text());
|
|
|
|
|
|
$("#ul1span").text('-');
|
|
|
|
|
|
$("#ul1span").addClass('on');
|
|
|
|
|
|
$("#ul1span").next().slideDown(300);
|
|
|
|
|
|
}
|
|
|
|
|
|
function val(id) {
|
|
|
|
|
|
if ($("#" + id).length < 1) {
|
|
|
|
|
|
return "";
|
|
|
|
|
|
}
|
|
|
|
|
|
return $.trim($("#" + id).val());
|
|
|
|
|
|
}
|
|
|
|
|
|
function vals(els, sepa) {
|
|
|
|
|
|
sepa = sepa || "";
|
|
|
|
|
|
var rtn = "";
|
|
|
|
|
|
$.each(els, function (i, r) {
|
|
|
|
|
|
rtn += sepa + ($(r).val() || "");
|
|
|
|
|
|
});
|
|
|
|
|
|
return rtn == "" ? rtn : rtn.substr(sepa.length);
|
|
|
|
|
|
}
|
|
|
|
|
|
function focus(id, isel) {
|
|
|
|
|
|
isel = isel || false;
|
|
|
|
|
|
id = id || "";
|
|
|
|
|
|
if (id != "") {
|
|
|
|
|
|
if (isel) {
|
|
|
|
|
|
$(id).focus();
|
|
|
|
|
|
$([document.documentElement, document.body]).animate({
|
|
|
|
|
|
scrollTop: $(id).offset().top - (ismobile() ? 80 : 120)
|
|
|
|
|
|
}, 700);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$("#" + id).focus();
|
|
|
|
|
|
$([document.documentElement, document.body]).animate({
|
|
|
|
|
|
scrollTop: $("#" + id).offset().top - (ismobile() ? 80 : 120)
|
|
|
|
|
|
}, 700);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
var _jsislayer2, isAutoMsg, _bging, _callback, capResult, capOK, isCaping, _hideBG, _noerror;
|
|
|
|
|
|
function cap(url, formid, callback, getpost, autoMsg, noBG, jsislayer2) {
|
|
|
|
|
|
_jsislayer2 = jsislayer2 || false;
|
|
|
|
|
|
if (!isCaping) {
|
|
|
|
|
|
isAutoMsg = autoMsg || false;
|
|
|
|
|
|
_bging = noBG || false;
|
|
|
|
|
|
if (!_bging) {
|
|
|
|
|
|
ajaxing();
|
|
|
|
|
|
}
|
|
|
|
|
|
if (_jsislayer2) {
|
|
|
|
|
|
bglayer2();
|
|
|
|
|
|
}
|
|
|
|
|
|
_callback = callback;
|
|
|
|
|
|
capResult = null;
|
|
|
|
|
|
capOK = false;
|
|
|
|
|
|
isCaping = true;
|
|
|
|
|
|
clearComma();
|
|
|
|
|
|
$.ajax({
|
|
|
|
|
|
type: getpost || "post",
|
|
|
|
|
|
url: url,
|
|
|
|
|
|
data: $("#" + formid).serialize(),
|
|
|
|
|
|
success: function (r) {
|
|
|
|
|
|
isCaping = false;
|
|
|
|
|
|
capResult = r;
|
|
|
|
|
|
setcap();
|
|
|
|
|
|
}, error: function (e) {
|
|
|
|
|
|
isCaping = false;
|
|
|
|
|
|
console.log(e.responseText);
|
|
|
|
|
|
if (_jsislayer2) {
|
|
|
|
|
|
msg2("잠시 후 다시 요청해주세요.");
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
msg("잠시 후 다시 요청해주세요.");
|
|
|
|
|
|
}
|
|
|
|
|
|
}, complete: function () {
|
|
|
|
|
|
ajaxing(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
console.log("다른 작업을 처리중입니다. 잠시후 다시 작업해주세요.");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-04-03 13:57:19 +09:00
|
|
|
|
|
2021-06-14 13:52:48 +09:00
|
|
|
|
function capp(url, p, callback, getpost, autoMsg, noBG, jsislayer2, hideBG, noerror, sync) {
|
2020-10-12 14:39:23 +09:00
|
|
|
|
_jsislayer2 = jsislayer2 || false;
|
|
|
|
|
|
_noerror = noerror || false;
|
|
|
|
|
|
_hideBG = hideBG || false;
|
2025-04-03 13:57:19 +09:00
|
|
|
|
|
|
|
|
|
|
// 동기식 요청은 권장되지 않지만, 기존 코드 호환성을 위해 유지
|
|
|
|
|
|
// 단, 경고 메시지 출력
|
2021-06-14 13:52:48 +09:00
|
|
|
|
_async = !(sync || false);
|
2025-04-03 13:57:19 +09:00
|
|
|
|
if (sync) {
|
|
|
|
|
|
console.warn("동기식 Ajax 요청은 권장되지 않으며 iOS에서 문제를 일으킬 수 있습니다.");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-10-12 14:39:23 +09:00
|
|
|
|
if (!isCaping) {
|
|
|
|
|
|
isAutoMsg = autoMsg || false;
|
|
|
|
|
|
_bging = noBG || false;
|
2025-04-03 13:57:19 +09:00
|
|
|
|
|
2020-10-12 14:39:23 +09:00
|
|
|
|
if (!_bging) {
|
|
|
|
|
|
ajaxing();
|
|
|
|
|
|
}
|
2025-04-03 13:57:19 +09:00
|
|
|
|
|
2020-10-12 14:39:23 +09:00
|
|
|
|
if (_jsislayer2) {
|
|
|
|
|
|
bglayer2();
|
|
|
|
|
|
}
|
2025-04-03 13:57:19 +09:00
|
|
|
|
|
2020-10-12 14:39:23 +09:00
|
|
|
|
_callback = callback;
|
|
|
|
|
|
capResult = null;
|
|
|
|
|
|
capOK = false;
|
|
|
|
|
|
isCaping = true;
|
2025-04-03 13:57:19 +09:00
|
|
|
|
|
|
|
|
|
|
// 기존 함수 호출 유지, 존재 확인 후 실행
|
|
|
|
|
|
if (typeof clearComma === 'function') {
|
|
|
|
|
|
try {
|
|
|
|
|
|
clearComma();
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
console.error("clearComma 함수 실행 오류:", e);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Ajax 요청 설정
|
|
|
|
|
|
const ajaxSettings = {
|
2020-10-12 14:39:23 +09:00
|
|
|
|
type: getpost || "post",
|
|
|
|
|
|
url: url,
|
|
|
|
|
|
data: p,
|
beforeunload 이벤트 발생시 ajax 오류로 학습종료버튼 클릭 또는 beforeunload 이벤트 발생시
ajax : async: false 동기로 호출 하게 변경
관련함수 async 옵션추가
function golog(false, true, false, false);
function capp(url, p, callback, getpost, autoMsg, noBG, jsislayer2, hideBG, noerror, async)
2021-06-11 10:39:16 +09:00
|
|
|
|
async: _async,
|
2025-04-03 13:57:19 +09:00
|
|
|
|
timeout: _async ? 30000 : undefined, // 비동기 요청만 타임아웃 설정
|
2020-10-12 14:39:23 +09:00
|
|
|
|
success: function (r) {
|
|
|
|
|
|
isCaping = false;
|
|
|
|
|
|
capResult = r;
|
2025-04-03 13:57:19 +09:00
|
|
|
|
// iOS 호환성을 위한 추가 처리
|
|
|
|
|
|
setTimeout(function () {
|
|
|
|
|
|
setcap();
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
},
|
|
|
|
|
|
error: function (xhr, status, error) {
|
2020-10-12 14:39:23 +09:00
|
|
|
|
isCaping = false;
|
2025-04-03 13:57:19 +09:00
|
|
|
|
console.log("Ajax 오류:", status, error);
|
|
|
|
|
|
|
|
|
|
|
|
if (xhr.responseText) {
|
|
|
|
|
|
console.log("응답 내용:", xhr.responseText);
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}
|
2025-04-03 13:57:19 +09:00
|
|
|
|
|
|
|
|
|
|
// 타임아웃 오류 별도 처리
|
|
|
|
|
|
if (status === "timeout") {
|
|
|
|
|
|
if (_jsislayer2) {
|
|
|
|
|
|
alert("요청 시간이 초과되었습니다. 다시 시도해 주세요.");
|
|
|
|
|
|
} else {
|
|
|
|
|
|
alert("요청 시간이 초과되었습니다. 다시 시도해 주세요.");
|
|
|
|
|
|
}
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}
|
2025-04-03 13:57:19 +09:00
|
|
|
|
else if (!_noerror) {
|
|
|
|
|
|
if (_jsislayer2) {
|
|
|
|
|
|
alert("잠시 후 다시 요청해주세요.");
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
alert("잠시 후 다시 요청해주세요.");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
complete: function () {
|
|
|
|
|
|
// iOS에서의 지연 문제 방지를 위한 setTimeout 사용
|
|
|
|
|
|
setTimeout(function () {
|
|
|
|
|
|
ajaxing(false);
|
|
|
|
|
|
}, 0);
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}
|
2025-04-03 13:57:19 +09:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// iOS 특정 버전에서의 캐시 문제 방지
|
|
|
|
|
|
if (navigator.userAgent.match(/(iPad|iPhone|iPod)/g)) {
|
|
|
|
|
|
ajaxSettings.cache = false;
|
|
|
|
|
|
|
|
|
|
|
|
// URL에 타임스탬프 추가하여 캐시 방지
|
|
|
|
|
|
const timestamp = new Date().getTime();
|
|
|
|
|
|
ajaxSettings.url = ajaxSettings.url +
|
|
|
|
|
|
(ajaxSettings.url.indexOf('?') >= 0 ? '&' : '?') +
|
|
|
|
|
|
'_t=' + timestamp;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
$.ajax(ajaxSettings);
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}
|
2025-04-03 13:57:19 +09:00
|
|
|
|
else if (!_noerror) {
|
2020-10-12 14:39:23 +09:00
|
|
|
|
console.log("다른 작업을 처리중입니다. 잠시후 다시 작업해주세요.");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-04-03 13:57:19 +09:00
|
|
|
|
|
2020-10-12 14:39:23 +09:00
|
|
|
|
function capfile(url, data, callback, noeval, setBG, jsislayer2) {
|
2025-04-03 13:57:19 +09:00
|
|
|
|
// 로딩바 표시 추가
|
|
|
|
|
|
showLoadingImage();
|
|
|
|
|
|
|
2020-10-12 14:39:23 +09:00
|
|
|
|
noeval = noeval || false;
|
|
|
|
|
|
_jsislayer2 = jsislayer2 || false;
|
|
|
|
|
|
_setBG = setBG || false;
|
2025-04-03 13:57:19 +09:00
|
|
|
|
// 백그라운드 레이어 표시
|
2020-10-12 14:39:23 +09:00
|
|
|
|
if (_setBG) {
|
|
|
|
|
|
bglayer();
|
|
|
|
|
|
}
|
|
|
|
|
|
if (_jsislayer2) {
|
|
|
|
|
|
bglayer2();
|
|
|
|
|
|
}
|
2025-04-03 13:57:19 +09:00
|
|
|
|
// iOS 호환성을 위한 처리
|
|
|
|
|
|
// FormData 객체 확인 및 필요시 수정
|
|
|
|
|
|
if (data instanceof FormData) {
|
|
|
|
|
|
// iOS에서 FormData 디버깅을 위한 로그 (개발 중에만 사용)
|
|
|
|
|
|
console.log("FormData 항목 수:", [...data.entries()].length);
|
|
|
|
|
|
}
|
|
|
|
|
|
// 콜백 함수 실행 헬퍼
|
|
|
|
|
|
function executeCallback(result) {
|
|
|
|
|
|
// 로딩바 숨김 추가
|
|
|
|
|
|
hideLoadingImage();
|
|
|
|
|
|
|
|
|
|
|
|
if (_setBG) {
|
|
|
|
|
|
$("#bglayer").hide();
|
|
|
|
|
|
}
|
|
|
|
|
|
if (noeval) {
|
|
|
|
|
|
// 함수 객체로 직접 호출
|
|
|
|
|
|
if (typeof callback === 'function') {
|
|
|
|
|
|
callback(result);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
// 기존 방식 유지 (eval 사용)
|
|
|
|
|
|
// 보안상 권장되지 않지만 기존 코드 호환성 유지
|
|
|
|
|
|
try {
|
|
|
|
|
|
window.capResult = result; // 전역 변수로 결과 저장
|
|
|
|
|
|
if (typeof callback === 'string') {
|
|
|
|
|
|
if (callback.substr(callback.length - 1, 1) == ")") {
|
|
|
|
|
|
eval(callback);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
eval(callback + "()");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
console.error("콜백 실행 오류:", e);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2020-10-12 14:39:23 +09:00
|
|
|
|
var ajaxRequest = $.ajax({
|
|
|
|
|
|
type: "POST",
|
|
|
|
|
|
url: url,
|
|
|
|
|
|
contentType: false,
|
|
|
|
|
|
processData: false,
|
2025-04-03 13:57:19 +09:00
|
|
|
|
data: data,
|
|
|
|
|
|
timeout: 60000,
|
|
|
|
|
|
xhr: function () {
|
|
|
|
|
|
var xhr = $.ajaxSettings.xhr();
|
|
|
|
|
|
// 업로드 진행 상황 모니터링 (iOS에서 파일 업로드 진행 확인)
|
|
|
|
|
|
if (xhr.upload) {
|
|
|
|
|
|
xhr.upload.addEventListener('progress', function (e) {
|
|
|
|
|
|
if (e.lengthComputable) {
|
|
|
|
|
|
var percent = Math.round((e.loaded / e.total) * 100);
|
|
|
|
|
|
console.log("업로드 진행률: " + percent + "%");
|
|
|
|
|
|
}
|
|
|
|
|
|
}, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
return xhr;
|
|
|
|
|
|
}
|
2020-10-12 14:39:23 +09:00
|
|
|
|
});
|
2025-04-03 13:57:19 +09:00
|
|
|
|
// 에러 처리
|
|
|
|
|
|
ajaxRequest.fail(function (jqXHR, textStatus, errorThrown) {
|
|
|
|
|
|
console.error("Ajax 요청 실패:", textStatus, errorThrown);
|
|
|
|
|
|
// 타임아웃인 경우 별도 처리
|
|
|
|
|
|
if (textStatus === "timeout") {
|
|
|
|
|
|
alert("요청 시간이 초과되었습니다. 다시 시도해 주세요.");
|
|
|
|
|
|
// 로딩바 숨김 추가 (타임아웃 시)
|
|
|
|
|
|
hideLoadingImage();
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}
|
|
|
|
|
|
else {
|
2025-04-03 13:57:19 +09:00
|
|
|
|
// 기존 에러 처리 로직 유지 (하지만 에러 시 다른 처리를 권장)
|
|
|
|
|
|
executeCallback({
|
|
|
|
|
|
code: -1,
|
|
|
|
|
|
message: "요청 처리 중 오류가 발생했습니다",
|
|
|
|
|
|
error: textStatus
|
|
|
|
|
|
});
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}
|
|
|
|
|
|
});
|
2025-04-03 13:57:19 +09:00
|
|
|
|
|
2020-10-12 14:39:23 +09:00
|
|
|
|
ajaxRequest.done(function (data) {
|
2025-04-03 13:57:19 +09:00
|
|
|
|
if (data && data.code == 1000) {
|
|
|
|
|
|
executeCallback(data);
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}
|
2025-04-03 13:57:19 +09:00
|
|
|
|
else {
|
|
|
|
|
|
console.warn("서버 응답 코드가 1000이 아닙니다:", data);
|
|
|
|
|
|
executeCallback(data);
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
2025-04-03 13:57:19 +09:00
|
|
|
|
|
2020-10-12 14:39:23 +09:00
|
|
|
|
function capfileform(url, fid, callback, iseval, getpost, autoMsg, noBG, jsislayer2) {
|
|
|
|
|
|
_jsislayer2 = jsislayer2 || false;
|
|
|
|
|
|
if (!isCaping) {
|
2025-04-03 13:57:19 +09:00
|
|
|
|
// 로딩바 표시 추가
|
|
|
|
|
|
showLoadingImage();
|
|
|
|
|
|
|
2020-10-12 14:39:23 +09:00
|
|
|
|
isAutoMsg = autoMsg || false;
|
|
|
|
|
|
_bging = noBG || false;
|
2025-04-03 13:57:19 +09:00
|
|
|
|
if (!_bging) { ajaxing(); }
|
|
|
|
|
|
if (_jsislayer2) { bglayer2(); }
|
2020-10-12 14:39:23 +09:00
|
|
|
|
_callback = callback;
|
|
|
|
|
|
capResult = null;
|
|
|
|
|
|
capOK = false;
|
|
|
|
|
|
isCaping = true;
|
2025-04-03 13:57:19 +09:00
|
|
|
|
// 폼 요소 직접 참조
|
|
|
|
|
|
const form = document.getElementById(fid);
|
|
|
|
|
|
// iOS 호환성을 위한 FormData 생성 방식 개선
|
|
|
|
|
|
let formData;
|
|
|
|
|
|
try {
|
|
|
|
|
|
// 기본 FormData 생성 시도
|
|
|
|
|
|
formData = new FormData(form);
|
|
|
|
|
|
// iOS 호환성 검사 - 파일 입력 필드 확인
|
|
|
|
|
|
const fileInputs = form.querySelectorAll('input[type="file"]');
|
|
|
|
|
|
let hasFiles = false;
|
|
|
|
|
|
fileInputs.forEach(input => {
|
|
|
|
|
|
if (input.files && input.files.length > 0) {
|
|
|
|
|
|
hasFiles = true;
|
|
|
|
|
|
// 파일 입력 필드 값이 제대로 FormData에 들어갔는지 확인
|
|
|
|
|
|
const fieldName = input.name || 'file';
|
|
|
|
|
|
if (!formData.has(fieldName)) {
|
|
|
|
|
|
console.log(`iOS 호환성: 수동으로 ${fieldName} 추가`);
|
|
|
|
|
|
// 수동으로 파일 추가
|
|
|
|
|
|
for (let i = 0; i < input.files.length; i++) {
|
|
|
|
|
|
formData.append(fieldName, input.files[i]);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
// 디버깅용 로그
|
|
|
|
|
|
console.log('FormData 생성 완료:', hasFiles ? '파일 포함' : '파일 없음');
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error('FormData 생성 오류:', error);
|
|
|
|
|
|
// 대체 방식으로 FormData 생성
|
|
|
|
|
|
formData = new FormData();
|
|
|
|
|
|
// 폼 필드 수동 추가
|
|
|
|
|
|
const formElements = form.elements;
|
|
|
|
|
|
for (let i = 0; i < formElements.length; i++) {
|
|
|
|
|
|
const field = formElements[i];
|
|
|
|
|
|
const name = field.name;
|
|
|
|
|
|
if (!name) continue;
|
|
|
|
|
|
if (field.type === 'file') {
|
|
|
|
|
|
for (let j = 0; j < field.files.length; j++) {
|
|
|
|
|
|
formData.append(name, field.files[j]);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (field.type !== 'submit' && field.type !== 'button') {
|
|
|
|
|
|
formData.append(name, field.value);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// 네트워크 요청 타임아웃 설정
|
|
|
|
|
|
const ajaxTimeout = 60000; // 60초
|
2020-10-12 14:39:23 +09:00
|
|
|
|
$.ajax({
|
|
|
|
|
|
type: getpost || "post",
|
|
|
|
|
|
url: url,
|
2025-04-03 13:57:19 +09:00
|
|
|
|
data: formData,
|
2020-10-12 14:39:23 +09:00
|
|
|
|
contentType: false,
|
|
|
|
|
|
processData: false,
|
2025-04-03 13:57:19 +09:00
|
|
|
|
timeout: ajaxTimeout,
|
2020-10-12 14:39:23 +09:00
|
|
|
|
success: function (r) {
|
|
|
|
|
|
isCaping = false;
|
|
|
|
|
|
capResult = r;
|
|
|
|
|
|
setcap();
|
2025-04-03 13:57:19 +09:00
|
|
|
|
// 로딩바 숨김 추가
|
|
|
|
|
|
hideLoadingImage();
|
|
|
|
|
|
},
|
|
|
|
|
|
error: function (e) {
|
2020-10-12 14:39:23 +09:00
|
|
|
|
isCaping = false;
|
2025-04-03 13:57:19 +09:00
|
|
|
|
console.log('Ajax 오류:', e.status, e.statusText);
|
2020-10-12 14:39:23 +09:00
|
|
|
|
console.log(e.responseText);
|
2025-04-03 13:57:19 +09:00
|
|
|
|
if (e.status === 0 && e.statusText === 'timeout') {
|
|
|
|
|
|
alert("요청 시간이 초과되었습니다. 다시 시도해주세요.");
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (_jsislayer2) {
|
|
|
|
|
|
alert("개발담당자에게 문의해주세요");
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}
|
|
|
|
|
|
else {
|
2025-04-03 13:57:19 +09:00
|
|
|
|
alert("개발담당자에게 문의해주세요.");
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}
|
2025-04-03 13:57:19 +09:00
|
|
|
|
// 로딩바 숨김 추가
|
|
|
|
|
|
hideLoadingImage();
|
|
|
|
|
|
},
|
|
|
|
|
|
complete: function () {
|
2020-10-12 14:39:23 +09:00
|
|
|
|
ajaxing(false);
|
2025-04-03 13:57:19 +09:00
|
|
|
|
// complete에도 로딩바 숨김 추가 (중복 호출 방지를 위해 다른 방법 고려 가능)
|
|
|
|
|
|
hideLoadingImage();
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
console.log("다른 작업을 처리중입니다. 잠시후 다시 작업해주세요.");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-04-03 13:57:19 +09:00
|
|
|
|
|
|
|
|
|
|
function setcap() {
|
|
|
|
|
|
// 결과가 없는 경우 예외 처리
|
|
|
|
|
|
if (!capResult) {
|
|
|
|
|
|
console.error("capResult가 정의되지 않았습니다");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (capResult.code === 1000) {
|
|
|
|
|
|
capOK = true;
|
|
|
|
|
|
capResultObj = capResult.obj;
|
|
|
|
|
|
capResultMsg = capResult.msg;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 인증 관련 오류 처리
|
|
|
|
|
|
if (capResult.code == 9991) {
|
|
|
|
|
|
alert("인증시간이 초과되어 로그아웃되었습니다.");
|
|
|
|
|
|
setTimeout(function () {
|
|
|
|
|
|
location.href = '/Account/Error?code=9991';
|
|
|
|
|
|
}, 100); // iOS에서 alert 후 즉시 리디렉션 문제 방지
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (capResult.code == 9992) {
|
|
|
|
|
|
alert("로그인 정보가 일치하지 않아 다시 로그인을 진행하셔야 합니다.\n(다른 디바이스에 로그인 또는 Cookie정보를 확인할 수 없습니다.)");
|
|
|
|
|
|
setTimeout(function () {
|
|
|
|
|
|
location.href = '/Account/Error?code=9992';
|
|
|
|
|
|
}, 100); // iOS에서 alert 후 즉시 리디렉션 문제 방지
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
// 자동 메시지 처리
|
|
|
|
|
|
if (isAutoMsg) {
|
|
|
|
|
|
switch (capResult.code) {
|
|
|
|
|
|
case 1000: showOK(); break;
|
|
|
|
|
|
case 9999: alert("서버접속이 원활하지 않습니다"); break;
|
|
|
|
|
|
case 9998: alert("권한이 없는 요청입니다"); break;
|
|
|
|
|
|
case 9997: alert("권한(로그인)이 없는 요청입니다"); break;
|
|
|
|
|
|
case 9996: alert("검색된 데이터가 없습니다"); break;
|
|
|
|
|
|
case 9995: alert("적용된 데이터가 없습니다"); break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
// 개발 모드에서만 상세 로그 출력
|
|
|
|
|
|
console.log("응답 코드:", capResult.code);
|
|
|
|
|
|
console.log("응답 메시지:", capResult.msg);
|
|
|
|
|
|
if (capResult.obj) console.log("응답 데이터:", capResult.obj);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
capResultMsg = capResult.code + ": " + capResult.msg;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 콜백 함수 실행
|
|
|
|
|
|
if (_callback) {
|
|
|
|
|
|
try {
|
|
|
|
|
|
if (typeof _callback === "function") {
|
|
|
|
|
|
_callback(capResult);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (typeof _callback === "string") {
|
|
|
|
|
|
// 문자열 콜백 처리 - eval 사용을 최소화
|
|
|
|
|
|
if (_callback.indexOf(")") > -1) {
|
|
|
|
|
|
// 이미 괄호가 포함된 경우
|
|
|
|
|
|
window.setTimeout(function () {
|
|
|
|
|
|
try {
|
|
|
|
|
|
eval(_callback);
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
console.error("콜백 실행 오류:", e);
|
|
|
|
|
|
}
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
// 괄호 추가 필요
|
|
|
|
|
|
window.setTimeout(function () {
|
|
|
|
|
|
try {
|
|
|
|
|
|
eval(_callback + "()");
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
console.error("콜백 실행 오류:", e);
|
|
|
|
|
|
}
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
console.error("콜백 실행 중 오류 발생:", e);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** 로딩이미지 보여주기 */
|
|
|
|
|
|
function showLoadingImage() {
|
|
|
|
|
|
// 이미 존재하는 경우 중복 생성 방지
|
|
|
|
|
|
if (document.getElementById('custom-loading-overlay')) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 로딩 이미지 요소 생성
|
|
|
|
|
|
const loadingDiv = document.createElement('div');
|
|
|
|
|
|
loadingDiv.id = 'custom-loading-overlay';
|
|
|
|
|
|
|
|
|
|
|
|
// 인라인 스타일 대신 클래스 사용을 위한 스타일 추가
|
|
|
|
|
|
const style = document.createElement('style');
|
|
|
|
|
|
style.textContent = `
|
|
|
|
|
|
#custom-loading-overlay {
|
|
|
|
|
|
position: fixed;
|
|
|
|
|
|
top: 0;
|
|
|
|
|
|
left: 0;
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
height: 100%;
|
|
|
|
|
|
background-color: rgba(0, 0, 0, 0.5);
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
justify-content: center;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
z-index: 9999;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#custom-loading-spinner {
|
|
|
|
|
|
width: 40px;
|
|
|
|
|
|
height: 40px;
|
|
|
|
|
|
background-color: #fff;
|
|
|
|
|
|
border-radius: 100%;
|
|
|
|
|
|
-webkit-animation: sk-scaleout 1.0s infinite ease-in-out;
|
|
|
|
|
|
animation: sk-scaleout 1.0s infinite ease-in-out;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@-webkit-keyframes sk-scaleout {
|
|
|
|
|
|
0% { -webkit-transform: scale(0) }
|
|
|
|
|
|
100% { -webkit-transform: scale(1.0); opacity: 0; }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@keyframes sk-scaleout {
|
|
|
|
|
|
0% { transform: scale(0); -webkit-transform: scale(0); }
|
|
|
|
|
|
100% { transform: scale(1.0); -webkit-transform: scale(1.0); opacity: 0; }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* 애니메이션 미지원 브라우저용 대체 스타일 */
|
|
|
|
|
|
.no-animation #custom-loading-spinner {
|
|
|
|
|
|
background-color: #3498db;
|
|
|
|
|
|
border: 5px solid #f3f3f3;
|
|
|
|
|
|
}
|
|
|
|
|
|
`;
|
|
|
|
|
|
document.head.appendChild(style);
|
|
|
|
|
|
|
|
|
|
|
|
// 브라우저 애니메이션 지원 확인
|
|
|
|
|
|
const supportsAnimation = 'AnimationEvent' in window ||
|
|
|
|
|
|
'WebKitAnimationEvent' in window ||
|
|
|
|
|
|
'MozAnimationEvent' in window ||
|
|
|
|
|
|
'msAnimationEvent' in window ||
|
|
|
|
|
|
'OAnimationEvent' in window;
|
|
|
|
|
|
|
|
|
|
|
|
// 기본 로딩 스피너
|
|
|
|
|
|
const spinnerDiv = document.createElement('div');
|
|
|
|
|
|
spinnerDiv.id = 'custom-loading-spinner';
|
|
|
|
|
|
|
|
|
|
|
|
// 애니메이션을 지원하지 않는 브라우저에는 정적 스타일 적용
|
|
|
|
|
|
if (!supportsAnimation) {
|
|
|
|
|
|
loadingDiv.className = 'no-animation';
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
loadingDiv.appendChild(spinnerDiv);
|
|
|
|
|
|
document.body.appendChild(loadingDiv);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** 로딩이미지 제거 */
|
|
|
|
|
|
function hideLoadingImage() {
|
|
|
|
|
|
const loadingDiv = document.getElementById('custom-loading-overlay');
|
|
|
|
|
|
if (loadingDiv) {
|
|
|
|
|
|
// 스타일 요소도 정리
|
|
|
|
|
|
const style = document.querySelector('style[id^="custom-loading-style"]');
|
|
|
|
|
|
if (style) {
|
|
|
|
|
|
document.head.removeChild(style);
|
|
|
|
|
|
}
|
|
|
|
|
|
document.body.removeChild(loadingDiv);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-10-12 14:39:23 +09:00
|
|
|
|
function ajaxing(tf) {
|
|
|
|
|
|
if (!_jsislayer2) {
|
|
|
|
|
|
bglayer(false);
|
|
|
|
|
|
$("#bgprogress").hide();
|
|
|
|
|
|
if (tf == null || tf === true) {
|
|
|
|
|
|
bglayer();
|
|
|
|
|
|
$("#bgprogress").show();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
bglayer2(false);
|
|
|
|
|
|
if (tf == null || tf === true) {
|
|
|
|
|
|
bglayer();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
function bglayer(tf) {
|
|
|
|
|
|
if (tf == null || tf === true || (_bging && !_hideBG)) {
|
|
|
|
|
|
$("#bglayer").show();
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
$("#bglayer").hide();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
function bglayer2(tf) {
|
|
|
|
|
|
if (tf == null || tf === true) {
|
|
|
|
|
|
$("#bglayer2").show();
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
$("#bglayer2").hide();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
function clearComma() {
|
|
|
|
|
|
$.each($("input.int, input.double"), function (i, c) {
|
|
|
|
|
|
$(c).val($(c).val().replace(/,/gi, ''));
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
2025-04-03 13:57:19 +09:00
|
|
|
|
|
2020-10-12 14:39:23 +09:00
|
|
|
|
var _focusitem;
|
|
|
|
|
|
var _focusitem2;
|
|
|
|
|
|
var _okm;
|
2025-07-23 13:21:57 +09:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 사용자에게 메시지를 표시하고, 특정 동작을 수행하거나 특정 HTML 요소에 초점을 맞추는 범용 메시지 상자 함수입니다.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param {string} m - **표시할 메시지 내용**입니다. 사용자에게 보여줄 핵심 텍스트입니다.
|
|
|
|
|
|
* @param {number} [t=10] - 메시지 상자가 나타나기 전의 **지연 시간** (밀리초)입니다. 기본값은 `10` 밀리초입니다. 이 시간 후에 배경 레이어와 메시지 레이어가 표시됩니다.
|
|
|
|
|
|
* @param {boolean} [bging=false] - 메시지 상자 뒤에 **배경 레이어를 표시할지 여부**입니다. `true`로 설정하면 배경이 함께 나타납니다. 기본값은 `false`입니다.
|
|
|
|
|
|
* @param {string} [fi=""] - 메시지 확인 후 **초점을 맞출 HTML 요소의 선택자**입니다.
|
|
|
|
|
|
* - `""` (빈 문자열)인 경우: 함수 호출 시 현재 **초점이 맞춰져 있는 입력, 선택 또는 텍스트 영역 요소**에 초점을 다시 맞춥니다.
|
|
|
|
|
|
* - `"x"`인 경우: **아무 요소에도 초점을 맞추지 않습니다.**
|
|
|
|
|
|
* - 다른 유효한 선택자 (예: `"#myInput"`, `".someClass"`): 해당 선택자와 일치하는 요소에 초점을 맞춥니다.
|
|
|
|
|
|
* @param {string} [okm=""] - 메시지 상자의 "확인" 버튼 클릭 시 **실행할 JavaScript 코드** (문자열)입니다. 이 문자열은 `eval()` 함수를 통해 실행됩니다. 비어있는 문자열인 경우 `fi` 매개변수에 따라 초점 요소를 처리합니다.
|
|
|
|
|
|
* @param {number} [okmt=0] - `okm`에 코드가 있을 경우, 해당 코드를 **자동으로 실행할 지연 시간** (밀리초)입니다. 이 시간이 지나면 "확인" 버튼을 누르지 않아도 `okm`의 코드가 실행됩니다. 기본값은 `0` (즉시 실행)입니다.
|
|
|
|
|
|
* @param {boolean} [hidebtn=false] - "확인" 버튼을 **숨길지 여부**입니다. `true`로 설정하면 "확인" 버튼이 표시되지 않습니다. 기본값은 `false`입니다.
|
|
|
|
|
|
*/
|
2020-10-12 14:39:23 +09:00
|
|
|
|
function msg(m, t, bging, fi, okm, okmt, hidebtn) {
|
|
|
|
|
|
okmt = okmt || 0;
|
|
|
|
|
|
hidebtn = hidebtn || false;
|
|
|
|
|
|
_okm = okm || "";
|
|
|
|
|
|
fi = fi || "";
|
|
|
|
|
|
if (fi == "x") {
|
|
|
|
|
|
_focusitem = "";
|
|
|
|
|
|
} else {
|
|
|
|
|
|
_focusitem = fi == "" ? $("input:focus, select:focus, textarea:focus") : $(fi);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (hidebtn) {
|
|
|
|
|
|
$("#layermessage a.mainokbutton").hide();
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
$("#layermessage a.mainokbutton").unbind("click");
|
|
|
|
|
|
$("#layermessage a.mainokbutton").on("click", function () {
|
|
|
|
|
|
if (_okm == "" && _focusitem != "") {
|
|
|
|
|
|
$(_focusitem).focus();
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
eval(_okm);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
if (okm != "" && okmt > 0) {
|
|
|
|
|
|
setTimeout(function () {
|
|
|
|
|
|
eval(_okm);
|
|
|
|
|
|
}, okmt);
|
|
|
|
|
|
}
|
|
|
|
|
|
t = t || 10;
|
|
|
|
|
|
bging = bging || false;
|
|
|
|
|
|
if ($("#layermessage a.mainokbutton").length > 0) {
|
|
|
|
|
|
$("#layermessage a.mainokbutton").focus();
|
|
|
|
|
|
}
|
|
|
|
|
|
setTimeout(function () {
|
|
|
|
|
|
bglayer();
|
|
|
|
|
|
msglayer(m, bging);
|
|
|
|
|
|
}, t);
|
|
|
|
|
|
}
|
2025-07-23 13:21:57 +09:00
|
|
|
|
/**
|
|
|
|
|
|
* 사용자에게 메시지를 표시하고 확인 후 특정 HTML 요소에 초점을 다시 맞추는 보조 메시지 상자 함수입니다.
|
|
|
|
|
|
* 'msg' 함수와는 별개의 메시지 레이어(`layermessage2`)를 사용합니다.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param {string} m - **표시할 메시지 내용**입니다. 사용자에게 보여줄 핵심 텍스트입니다.
|
|
|
|
|
|
* @param {number} [t=0] - 메시지 상자가 나타나기 전의 **지연 시간** (밀리초)입니다. 기본값은 `0` 밀리초입니다. 이 시간 후에 배경 레이어와 메시지 레이어가 표시됩니다.
|
|
|
|
|
|
* @param {string} [fi=""] - 메시지 확인 후 **초점을 맞출 HTML 요소의 선택자**입니다.
|
|
|
|
|
|
* - `""` (빈 문자열)인 경우: 함수 호출 시 현재 **초점이 맞춰져 있는 입력, 선택 또는 텍스트 영역 요소**에 초점을 다시 맞춥니다.
|
|
|
|
|
|
* - 다른 유효한 선택자 (예: `"#anotherInput"`, `".usernameField"`): 해당 선택자와 일치하는 요소에 초점을 맞춥니다.
|
|
|
|
|
|
*/
|
2020-10-12 14:39:23 +09:00
|
|
|
|
function msg2(m, t, fi) {
|
|
|
|
|
|
_focusitem2 = (fi || "") == "" ? $("input:focus, select:focus, textarea:focus") : $(fi);
|
|
|
|
|
|
$("#layermessage2 a.mainokbutton2").on("click", function () {
|
|
|
|
|
|
$(_focusitem2).focus();
|
|
|
|
|
|
});
|
|
|
|
|
|
t = t || 0;
|
|
|
|
|
|
if ($("#layermessage2 a.mainokbutton2").length > 0) {
|
|
|
|
|
|
$("#layermessage2 a.mainokbutton2").focus();
|
|
|
|
|
|
}
|
|
|
|
|
|
setTimeout(function () {
|
|
|
|
|
|
bglayer2();
|
|
|
|
|
|
msglayer2(m);
|
|
|
|
|
|
}, t);
|
|
|
|
|
|
}
|
|
|
|
|
|
function msglayer(msg, bging) {
|
|
|
|
|
|
_bging = bging;
|
|
|
|
|
|
$("#layermessage div").html(msg);
|
|
|
|
|
|
$("#bglayer, #layermessage").show();
|
|
|
|
|
|
$("#layermessage a.mainokbutton").focus();
|
|
|
|
|
|
}
|
|
|
|
|
|
function msglayer2(msg) {
|
|
|
|
|
|
$("#layermessage2 div").html(msg);
|
|
|
|
|
|
$("#bglayer2, #layermessage2").show();
|
|
|
|
|
|
$("#layermessage2 a.mainokbutton2").focus();
|
|
|
|
|
|
}
|
|
|
|
|
|
function hidelayermsg() {
|
|
|
|
|
|
ajaxing(_bging);
|
|
|
|
|
|
$("#layermessage").hide();
|
|
|
|
|
|
if (!_bging) {
|
|
|
|
|
|
$("#bglayer").hide();
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
$("#bgprogress").hide();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
function hidelayermsg2() {
|
|
|
|
|
|
$("#layermessage2").hide();
|
|
|
|
|
|
$("#bglayer2").hide();
|
|
|
|
|
|
}
|
|
|
|
|
|
function popup(pop) {
|
|
|
|
|
|
$('.popWrap#' + pop).css('display', 'block');
|
|
|
|
|
|
$('html, body').addClass('lock');
|
|
|
|
|
|
}
|
|
|
|
|
|
function checkInt(id, focus, m) {
|
|
|
|
|
|
m = m || "";
|
|
|
|
|
|
if ($("#" + id).length < 1 || $.trim($("#" + id).val()) == "" || getBytes($.trim($("#" + id).val())) < 1 || getint(val(id)) == 0) {
|
|
|
|
|
|
if ($("#" + (id || focus)).length > 0) {
|
|
|
|
|
|
$("#" + (id || focus)).focus();
|
|
|
|
|
|
}
|
|
|
|
|
|
if (m != "") {
|
|
|
|
|
|
msg(m);
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
function check(id, focusid, m, ism2) {
|
|
|
|
|
|
ism2 = ism2 || false;
|
|
|
|
|
|
m = m || "";
|
|
|
|
|
|
if ($("#" + id).length < 1 || $.trim($("#" + id).val()) == "" || $.trim($("#" + id).val()) == "0" || getBytes($.trim($("#" + id).val())) < 1) {
|
|
|
|
|
|
if ($("#" + (focusid || id)).length > 0) {
|
|
|
|
|
|
if ($("#" + (focusid || id)).hasClass("datepicker-input")) {
|
|
|
|
|
|
$("#" + (focusid || id)).next("i").focus();
|
|
|
|
|
|
$("#" + (focusid || id)).next("i")[0].scrollIntoView(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
focus($("#" + (focusid || id)), true);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (m != "") {
|
|
|
|
|
|
if (ism2) {
|
|
|
|
|
|
msg2(m);
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
msg(m);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
function checkn(id, focus, m) {
|
|
|
|
|
|
m = m || "";
|
|
|
|
|
|
if ($("#" + id).length < 1 || $.trim($("#" + id).val()) === "" || getBytes($.trim($("#" + id).val())) < 1 || getint(getv(id)) < 1) {
|
|
|
|
|
|
if ($("#" + (id || focus)).length > 0) {
|
|
|
|
|
|
$("#" + (id || focus)).focus();
|
|
|
|
|
|
}
|
|
|
|
|
|
if (m != "") {
|
|
|
|
|
|
msg(m);
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
function checkrv(name) {
|
|
|
|
|
|
if ($("input[name='" + name + "']:checked").length < 1) {
|
|
|
|
|
|
$("input[name='" + name + "']").first().focus();
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
function setrv(name, val) {
|
|
|
|
|
|
$("input[name='" + name + "'][value='" + val + "']").prop("checked", true);
|
|
|
|
|
|
}
|
|
|
|
|
|
function setv(id, val) {
|
|
|
|
|
|
$("#" + id).val(val);
|
|
|
|
|
|
}
|
|
|
|
|
|
function sett(id, text) {
|
|
|
|
|
|
$("#" + id).text(text);
|
|
|
|
|
|
}
|
|
|
|
|
|
function submit(fid, t, remainpage) {
|
|
|
|
|
|
remainpage = remainpage || false;
|
|
|
|
|
|
if (!remainpage) {
|
|
|
|
|
|
$("#PageNum").val(1);
|
|
|
|
|
|
}
|
|
|
|
|
|
t = t || 10;
|
|
|
|
|
|
setTimeout(function () {
|
|
|
|
|
|
bglayer();
|
|
|
|
|
|
$("#" + (fid || "mform")).submit();
|
|
|
|
|
|
}, t);
|
|
|
|
|
|
}
|
|
|
|
|
|
function msgadmin(t) {
|
|
|
|
|
|
setTimeout('msg("운영자에게 문의해주세요.")', t || 10);
|
|
|
|
|
|
}
|
2020-10-28 10:06:43 +09:00
|
|
|
|
function isid(v) {
|
|
|
|
|
|
//영문숫자-_ , 나머지입력시 오류반환
|
2021-08-23 15:10:15 +09:00
|
|
|
|
var regExp = /^[A-Za-z0-9-_]*$/i;
|
2020-10-28 10:06:43 +09:00
|
|
|
|
var regExp2 = /[\,.=~!@#$%^&*()\[\]+|<>?:{}]/;
|
|
|
|
|
|
if (regExp.test(v) && !regExp2.test(v)) {
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
2020-10-12 14:39:23 +09:00
|
|
|
|
function isemail(v) {
|
|
|
|
|
|
//이메일 검사
|
|
|
|
|
|
var regExp = /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i;
|
|
|
|
|
|
if (regExp.test(v)) {
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
2024-06-18 17:48:17 +09:00
|
|
|
|
function isemail2(v) {
|
|
|
|
|
|
//이메일 검사
|
|
|
|
|
|
var regExp = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
|
|
|
|
|
|
if (regExp.test(v)) {
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-10-12 14:39:23 +09:00
|
|
|
|
function ispassword(v) {
|
|
|
|
|
|
var r = /^(?=.*[a-zA-Z])(?=.*[!@#$%^&~*+=-])(?=.*[0-9]).{8,20}$/;
|
|
|
|
|
|
return r.test(v);
|
|
|
|
|
|
}
|
|
|
|
|
|
function getBytes(v, nocrtrim) {
|
|
|
|
|
|
nocrtrim = nocrtrim == undefined || nocrtrim == null ? false : nocrtrim;
|
|
|
|
|
|
if (v == null) {
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
v = $.trim(v);
|
|
|
|
|
|
if (!nocrtrim) {
|
|
|
|
|
|
v = v.replace(/[\r\n]/gi, '').replace(/[\n]/gi, '');
|
|
|
|
|
|
}
|
|
|
|
|
|
var stringByteLength = 0;
|
|
|
|
|
|
stringByteLength = (function (s, b, i, c) {
|
|
|
|
|
|
for (b = i = 0; c = s.charCodeAt(i++); b += c >> 11 ? 2 : c >> 7 ? 2 : 1);
|
|
|
|
|
|
return b
|
|
|
|
|
|
})(v);
|
|
|
|
|
|
return stringByteLength;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-03-13 10:30:27 +09:00
|
|
|
|
function isRepeatedString(str) {
|
|
|
|
|
|
// 반복 문자열 검증
|
|
|
|
|
|
const len = str.length;
|
2020-10-12 14:39:23 +09:00
|
|
|
|
|
2023-03-13 10:30:27 +09:00
|
|
|
|
for (let i = 1; i < len; i++) {
|
|
|
|
|
|
if (len % i === 0) {
|
|
|
|
|
|
const pattern = str.slice(0, i).repeat(len / i);
|
|
|
|
|
|
if (pattern === str) {
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
2020-10-12 14:39:23 +09:00
|
|
|
|
|
|
|
|
|
|
|
2025-10-01 16:59:10 +09:00
|
|
|
|
var _confirmokcb;
|
|
|
|
|
|
var _confirmokcbcancel;
|
|
|
|
|
|
|
2025-07-23 13:21:57 +09:00
|
|
|
|
/**
|
|
|
|
|
|
* 확인(Confirm) 상자를 토글(표시/숨김)하고, 사용자의 응답에 따라 특정 콜백 함수를 실행합니다.
|
|
|
|
|
|
* 이 함수는 일반적으로 사용자에게 확인 메시지를 보여주고 "예" 또는 "아니오"와 같은 선택을 요구할 때 사용됩니다.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param {boolean} [b=false] - 확인 상자를 **표시할지(`true`) 숨길지(`false`) 여부**입니다. `true`면 상자가 나타나고, `false`면 상자가 사라집니다. 기본값은 `false`입니다.
|
|
|
|
|
|
* @param {string} m - 확인 상자에 **표시될 메시지 내용**입니다. 사용자에게 보여줄 질문이나 안내 텍스트입니다. (상자가 표시될 때만 유효)
|
|
|
|
|
|
* @param {string} [cb="confirmokpage()"] - 사용자가 확인 상자에서 "확인" 또는 긍정적인 응답을 선택했을 때 **실행할 JavaScript 코드** (문자열)입니다. 이 문자열은 `eval()` 함수를 통해 실행됩니다. 기본값은 `"confirmokpage()"`입니다.
|
|
|
|
|
|
* @param {string} [cbcancel=""] - 사용자가 확인 상자에서 "취소" 또는 부정적인 응답을 선택했을 때 **실행할 JavaScript 코드** (문자열)입니다. 이 문자열은 `eval()` 함수를 통해 실행됩니다. 기본값은 `""` (아무것도 실행하지 않음)입니다.
|
|
|
|
|
|
* @param {string} [top=""] - 확인 상자의 **수직(`top`) 위치를 지정하는 CSS 값** (예: `"100px"`, `"20%"`).
|
|
|
|
|
|
* - `""` (빈 문자열)인 경우: 현재 CSS 또는 기본 위치 설정에 따라 상자가 표시됩니다.
|
|
|
|
|
|
* - 유효한 CSS `top` 값인 경우: 해당 값으로 상자의 `top` 위치가 설정됩니다. 이 기능을 사용하려면 `#confirmbox` 요소의 CSS `position` 속성이 `absolute` 또는 `fixed`로 설정되어 있어야 합니다.
|
|
|
|
|
|
*/
|
|
|
|
|
|
function confirmtoggle(b, m, cb, cbcancel, top) {
|
2020-10-12 14:39:23 +09:00
|
|
|
|
b = b || false;
|
2025-07-23 13:21:57 +09:00
|
|
|
|
top = top || ''; // top 매개변수 기본값 설정
|
|
|
|
|
|
|
2020-10-12 14:39:23 +09:00
|
|
|
|
if (b) {
|
|
|
|
|
|
_confirmokcb = "";
|
|
|
|
|
|
_confirmokcbcancel = "";
|
|
|
|
|
|
_confirmokcb = cb || "confirmokpage()";
|
|
|
|
|
|
_confirmokcbcancel = cbcancel || "";
|
|
|
|
|
|
$("#confirmboxmsg").html(m);
|
2025-07-23 13:21:57 +09:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (top !== '') {
|
|
|
|
|
|
// top 위치 설정 로직 추가
|
|
|
|
|
|
$("#confirmbox").css("top", top);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// top 값이 비어있을 경우, 이전에 설정된 top 속성을 제거하여
|
|
|
|
|
|
// CSS 파일에 정의된 기본값이나 다른 스크립트에 의해 설정된 값이 적용되도록 할 수 있습니다.
|
|
|
|
|
|
$("#confirmbox").css("top", '');
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-10-12 14:39:23 +09:00
|
|
|
|
setTimeout(function () {
|
2025-07-23 13:21:57 +09:00
|
|
|
|
bglayer();
|
|
|
|
|
|
$("#confirmbox").show();
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}, 30);
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
_bging = false;
|
2025-07-23 13:21:57 +09:00
|
|
|
|
bglayer(false);
|
|
|
|
|
|
$("#confirmbox").hide();
|
|
|
|
|
|
|
|
|
|
|
|
// 숨길 때 top 속성 초기화
|
|
|
|
|
|
$("#confirmbox").css("top", '');
|
|
|
|
|
|
|
2020-10-12 14:39:23 +09:00
|
|
|
|
if (_confirmokcbcancel != "") {
|
|
|
|
|
|
if (_confirmokcbcancel.substr(_confirmokcbcancel.length - 1, 1) != ';' &&
|
|
|
|
|
|
_confirmokcbcancel.substr(_confirmokcbcancel.length - 1, 1) != ')' &&
|
|
|
|
|
|
_confirmokcbcancel.indexOf('(') < 0 &&
|
|
|
|
|
|
_confirmokcbcancel.indexOf(')') < 0) {
|
|
|
|
|
|
_confirmokcbcancel += "()";
|
|
|
|
|
|
}
|
2025-07-23 13:21:57 +09:00
|
|
|
|
|
2020-10-12 14:39:23 +09:00
|
|
|
|
eval(_confirmokcbcancel);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-07-23 13:21:57 +09:00
|
|
|
|
|
2020-10-12 14:39:23 +09:00
|
|
|
|
function confirmok() {
|
|
|
|
|
|
$("#confirmbox").hide();
|
|
|
|
|
|
if (_confirmokcb != "" &&
|
|
|
|
|
|
_confirmokcb.substr(_confirmokcb.length - 1, 1) != ';' &&
|
|
|
|
|
|
_confirmokcb.substr(_confirmokcb.length - 1, 1) != ')' &&
|
|
|
|
|
|
_confirmokcb.indexOf('(') < 0 &&
|
|
|
|
|
|
_confirmokcb.indexOf(')') < 0) {
|
2025-04-03 15:07:29 +09:00
|
|
|
|
_confirmokcb += "()";
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}
|
|
|
|
|
|
eval(_confirmokcb);
|
|
|
|
|
|
}
|
2025-10-01 16:59:10 +09:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 사용자 정의 버튼을 포함하는 확인(Confirm) 상자를 표시.
|
|
|
|
|
|
* 이 함수는 다양한 버튼 텍스트와 각각의 콜백 함수를 동적으로 생성하여 사용자에게 선택지를 제공.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param {string} message - 확인 상자에 표시될 메시지 내용.
|
|
|
|
|
|
* @param {Array<Object>} buttons - 버튼 구성을 위한 객체 배열. 각 객체는 'text'와 'callback' 속성을 포함해야 함.
|
|
|
|
|
|
* @param {string} buttons[].text - 버튼에 표시될 텍스트.
|
|
|
|
|
|
* @param {function} buttons[].callback - 버튼 클릭 시 실행될 콜백 함수.
|
|
|
|
|
|
* @param {Object} [options] - 추가 옵션 객체 (선택 사항).
|
|
|
|
|
|
* @param {string} [options.top] - 확인 상자의 수직('top') 위치를 지정하는 CSS 값 (예: "100px", "20%").
|
|
|
|
|
|
*/
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 사용자 정의 버튼을 포함하는 확인(Confirm) 상자를 표시.
|
|
|
|
|
|
* (id가 "customConfirmBox"인 DOM 요소를 사용하도록 수정됨)
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param {string} message - 확인 상자에 표시될 메시지 내용.
|
|
|
|
|
|
* @param {Array<Object>} buttons - 버튼 구성을 위한 객체 배열.
|
|
|
|
|
|
* @param {Object} [options] - 추가 옵션 객체 (선택 사항).
|
|
|
|
|
|
*/
|
|
|
|
|
|
function confirmCustom(message, buttons, options) {
|
|
|
|
|
|
// 옵션 기본값 설정
|
|
|
|
|
|
options = options || {};
|
|
|
|
|
|
buttons = buttons || [];
|
|
|
|
|
|
|
|
|
|
|
|
const confirmBox = $("#customConfirmBox");
|
|
|
|
|
|
const messageBox = $("#customConfirmBox-msg");
|
|
|
|
|
|
const buttonContainer = $("#customConfirmBox-buttons");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 1. 메시지 설정
|
|
|
|
|
|
messageBox.html(message);
|
|
|
|
|
|
|
|
|
|
|
|
// 2. 기존 버튼 모두 제거
|
|
|
|
|
|
buttonContainer.empty();
|
|
|
|
|
|
|
|
|
|
|
|
// 3. 버튼 배열을 순회하며 동적으로 버튼 생성
|
|
|
|
|
|
buttons.forEach(function (btnInfo) {
|
|
|
|
|
|
const button = $("<button type='button'></button>");
|
|
|
|
|
|
button.text(btnInfo.text);
|
|
|
|
|
|
button.on("click", function () {
|
|
|
|
|
|
confirmBox.hide();
|
|
|
|
|
|
bglayer(false);
|
|
|
|
|
|
|
|
|
|
|
|
if (typeof btnInfo.callback === 'function') {
|
|
|
|
|
|
btnInfo.callback();
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
buttonContainer.append(button);
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// 4. 위치 옵션 처리
|
|
|
|
|
|
if (options.top) {
|
|
|
|
|
|
confirmBox.css("top", options.top);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
confirmBox.css("top", '');
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 5. 확인 상자 표시
|
|
|
|
|
|
bglayer();
|
|
|
|
|
|
confirmBox.show();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-10-12 14:39:23 +09:00
|
|
|
|
window.ismobile = function () {
|
|
|
|
|
|
var check = false;
|
|
|
|
|
|
(function (a) { if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check = true; })(navigator.userAgent || navigator.vendor || window.opera);
|
|
|
|
|
|
return check;
|
|
|
|
|
|
};
|
|
|
|
|
|
function fillzero(v, padleft, len) {
|
|
|
|
|
|
v = (v || "").toString();
|
|
|
|
|
|
var v2 = v;
|
|
|
|
|
|
if (v2.length < len) {
|
|
|
|
|
|
while (v2.length < len) {
|
|
|
|
|
|
v2 = padleft ? ('0' + v2) : (v2 + '0');
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return v2;
|
|
|
|
|
|
}
|
|
|
|
|
|
function ismobilenumber(v) {
|
|
|
|
|
|
//모바일 검사
|
|
|
|
|
|
v = v.replace(/-/gi, '');
|
|
|
|
|
|
if (v.search(/[0-9]/g) < 0 || !/^[0-9]{10,11}$/.test(v)) {
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
function istelnumber(v) {
|
|
|
|
|
|
//일반전화 검사
|
|
|
|
|
|
return telfmt(v.replace(/-/gi, ''));
|
|
|
|
|
|
}
|
|
|
|
|
|
function getcheckv(name) {
|
|
|
|
|
|
var rtn = "";
|
|
|
|
|
|
$.each($("input[name='" + name + "']"), function (i, c) {
|
|
|
|
|
|
if ($(c).prop("checked")) {
|
|
|
|
|
|
rtn += "," + $(c).val();
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
return rtn == "" ? "" : rtn.substr(1);
|
|
|
|
|
|
}
|
|
|
|
|
|
function commaset(v) {
|
|
|
|
|
|
var fv = v.toString().replace(/,/gi, '');
|
|
|
|
|
|
var fv2 = "";
|
|
|
|
|
|
if (fv.indexOf('.') > -1) {
|
|
|
|
|
|
if (fv.split('.')[0].length > 3) {
|
|
|
|
|
|
for (var fvi = fv.split('.')[0].length - 1; fvi > -1; fvi--) {
|
|
|
|
|
|
fv2 = fv.split('.')[0].substr(fvi, 1) + (fv2 != "" && (fv2.replace(/,/gi, '').length % 3) < 1 ? "," : "") + fv2;
|
|
|
|
|
|
}
|
|
|
|
|
|
fv = fv2 + "." + fv.split('.')[1];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (fv.length > 3) {
|
|
|
|
|
|
for (var fvi = fv.length - 1; fvi > -1; fvi--) {
|
|
|
|
|
|
fv2 = fv.substr(fvi, 1) + (fv2 != "" && (fv2.replace(/,/gi, '').length % 3) < 1 ? "," : "") + fv2;
|
|
|
|
|
|
}
|
|
|
|
|
|
fv = fv2;
|
|
|
|
|
|
}
|
|
|
|
|
|
return fv;
|
|
|
|
|
|
}
|
|
|
|
|
|
function goremote() {
|
2021-07-01 15:35:53 +09:00
|
|
|
|
//var winl = (screen.width - 840) / 2;
|
|
|
|
|
|
//var wint = (screen.height - 410) / 2;
|
|
|
|
|
|
//var opt = 'height=410, width=840, top=' + wint + ', left=' + winl + ', scrollbars=no, location=no, noresizable';
|
|
|
|
|
|
window.open("http://939.co.kr/yicte", "_blank");
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}
|
|
|
|
|
|
function checkall(c, cssclass) {
|
|
|
|
|
|
$("input[type=checkbox]." + cssclass).prop("checked", $(c).prop("checked"));
|
2023-02-23 14:33:05 +09:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function strEnConvert(str) {
|
|
|
|
|
|
let rslt = str.replace(/&#/gi, "%26%23");
|
2025-04-03 15:07:29 +09:00
|
|
|
|
|
2023-02-23 14:33:05 +09:00
|
|
|
|
return rslt;
|
2025-10-01 16:59:10 +09:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* CapsLock 키 활성화 상태를 감지하여 사용자에게 알려주는 기능을 초기화하는 함수.
|
|
|
|
|
|
* 특정 입력 필드 또는 페이지 전역의 CapsLock 상태를 감지해 지정된 영역에 경고 메시지를 표시함.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param {string} inputSelectors - CapsLock 상태를 감지할 입력 필드의 CSS 선택자.
|
|
|
|
|
|
* 여러 개일 경우 콤마(,)로 구분 (예: '#pw, #pw2').
|
|
|
|
|
|
* 빈 문자열('')을 전달하면 페이지 전역의 CapsLock 상태를 감지함.
|
|
|
|
|
|
* @param {string} displaySelector - CapsLock 경고 메시지를 표시할 HTML 요소의 CSS 선택자 (예: '#caps-lock-area').
|
|
|
|
|
|
* @returns {void}
|
|
|
|
|
|
*/
|
|
|
|
|
|
function initCapsLockWarning(inputSelectors, displaySelector) {
|
|
|
|
|
|
const displayElement = document.querySelector(displaySelector);
|
|
|
|
|
|
if (!displayElement) {
|
|
|
|
|
|
console.error('표시할 영역을 찾을 수 없습니다:', displaySelector);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 키보드 이벤트로부터 CapsLock 상태를 확인하고, 상태에 따라 경고 메시지를 표시하거나 숨기는 내부 함수.
|
|
|
|
|
|
* @param {KeyboardEvent} event - 발생한 키보드 이벤트 객체.
|
|
|
|
|
|
* @returns {void}
|
|
|
|
|
|
*/
|
|
|
|
|
|
const checkCapsLock = (event) => {
|
|
|
|
|
|
const capsLockOn = event.getModifierState && event.getModifierState('CapsLock');
|
|
|
|
|
|
|
|
|
|
|
|
if (capsLockOn) {
|
|
|
|
|
|
displayElement.innerHTML = '<strong style="color: red;">Caps Lock 이 켜져 있습니다.</strong>' + '';
|
|
|
|
|
|
displayElement.style.display = 'block';
|
|
|
|
|
|
} else {
|
|
|
|
|
|
displayElement.innerHTML = '';
|
|
|
|
|
|
displayElement.style.display = 'none';
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
if (inputSelectors && inputSelectors.trim() !== '') {
|
|
|
|
|
|
const elements = document.querySelectorAll(inputSelectors);
|
|
|
|
|
|
if (elements.length === 0) {
|
|
|
|
|
|
console.error('입력 필드를 찾을 수 없습니다:', inputSelectors);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
elements.forEach(element => {
|
|
|
|
|
|
element.addEventListener('keyup', checkCapsLock);
|
|
|
|
|
|
element.addEventListener('keydown', checkCapsLock);
|
|
|
|
|
|
element.addEventListener('blur', () => {
|
|
|
|
|
|
displayElement.style.display = 'none';
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
} else {
|
|
|
|
|
|
window.addEventListener('keyup', checkCapsLock);
|
|
|
|
|
|
window.addEventListener('keydown', checkCapsLock);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @description 비밀번호 보이기/숨기기 기능을 초기화하는 함수.
|
|
|
|
|
|
* @param {string} targetInputSelectors - 기능을 적용할 input 요소들의 CSS 선택자 (콤마로 구분 가능)
|
|
|
|
|
|
*/
|
|
|
|
|
|
function initializePasswordToggle(targetInputSelectors) {
|
|
|
|
|
|
const passwordInputs = document.querySelectorAll(targetInputSelectors);
|
|
|
|
|
|
|
|
|
|
|
|
if (passwordInputs.length === 0) {
|
|
|
|
|
|
console.error("비밀번호 입력창을 찾을 수 없습니다:", targetInputSelectors);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
passwordInputs.forEach(passwordInput => {
|
|
|
|
|
|
const originalWidth = passwordInput.getBoundingClientRect().width;
|
|
|
|
|
|
const wrapper = document.createElement('div');
|
|
|
|
|
|
|
|
|
|
|
|
passwordInput.parentNode.insertBefore(wrapper, passwordInput);
|
|
|
|
|
|
wrapper.appendChild(passwordInput);
|
|
|
|
|
|
|
|
|
|
|
|
Object.assign(wrapper.style, {
|
|
|
|
|
|
position: 'relative',
|
|
|
|
|
|
width: `${originalWidth}px`,
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
const eyeOpenSvg = `<svg class="eye-open" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/></svg>`;
|
|
|
|
|
|
const eyeClosedSvg = `<svg class="eye-closed" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
|
|
|
|
|
|
<path d="M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.44-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l-2.9-2.9c-.6.3-1.28.44-2.01.44-2.76 0-5-2.24-5-5 0-.72.15-1.4.44-2.01L7.53 9.8C6.2 10.3 5.06 11.08 4.2 12z"/>
|
|
|
|
|
|
<path d="M12 9c1.66 0 3 1.34 3 3 0 .22-.03.44-.08.65l1.55 1.55c.67-.33 1.41-.53 2.2-.53-2.76 0-5 2.24-5 5 0-.79.2-1.53.53-2.2l-1.55-1.55c.05-.21.08-.43.08-.65 0-1.66-1.34-3-3-3z"/>
|
|
|
|
|
|
<path fill="none" stroke="currentColor" stroke-width="1.5" d="M4.27 3.27L20.73 19.73"/>
|
|
|
|
|
|
</svg>`;
|
|
|
|
|
|
const toggleButton = document.createElement('button');
|
|
|
|
|
|
|
|
|
|
|
|
toggleButton.type = 'button';
|
|
|
|
|
|
toggleButton.innerHTML = eyeOpenSvg + eyeClosedSvg;
|
|
|
|
|
|
wrapper.appendChild(toggleButton);
|
|
|
|
|
|
|
|
|
|
|
|
Object.assign(passwordInput.style, {
|
|
|
|
|
|
paddingRight: '45px',
|
|
|
|
|
|
width: '100%',
|
|
|
|
|
|
boxSizing: 'border-box'
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
Object.assign(toggleButton.style, {
|
|
|
|
|
|
position: 'absolute', top: '50%', right: '15px', transform: 'translateY(-50%)',
|
|
|
|
|
|
background: 'none', border: 'none', cursor: 'pointer',
|
|
|
|
|
|
padding: '0', width: '24px', height: '24px'
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
const eyeClosedIcon = toggleButton.querySelector('.eye-open');
|
|
|
|
|
|
const eyeOpenIcon = toggleButton.querySelector('.eye-closed');
|
|
|
|
|
|
|
|
|
|
|
|
Object.assign(eyeOpenIcon.style, { width: '100%', height: '100%', fill: '#888' });
|
|
|
|
|
|
Object.assign(eyeClosedIcon.style, { width: '100%', height: '100%', fill: '#888', display: 'none' });
|
|
|
|
|
|
|
|
|
|
|
|
toggleButton.addEventListener('click', function () {
|
|
|
|
|
|
const isPassword = passwordInput.type === 'password';
|
|
|
|
|
|
passwordInput.type = isPassword ? 'text' : 'password';
|
|
|
|
|
|
eyeOpenIcon.style.display = isPassword ? 'none' : 'block';
|
|
|
|
|
|
eyeClosedIcon.style.display = isPassword ? 'block' : 'none';
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
2020-10-12 14:39:23 +09:00
|
|
|
|
}
|