YNICTE/FO/js/site.js

1720 lines
66 KiB
JavaScript
Raw Normal View History

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*/) {
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 () {
2020-10-12 14:39:23 +09:00
$("body").on("keydown", ".int, .intdot", function (e) {
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);
}
}
}).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 () {
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
}
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
}
}
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));
}
}).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 {
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,
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();
$("#" + 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();
}
}
2020-10-12 14:39:23 +09:00
var _cdmsisopenning = 0;
// 팝업 창 참조를 전역으로 유지
let globalPopup = null;
2020-10-12 14:39:23 +09:00
function cbviewcontents() {
if (_vcistaste || capResult.code == 1000) {
// 백그라운드 레이어 숨기기
2020-10-12 14:39:23 +09:00
$("#bglayer").hide();
_cdmsisopenning = 1;
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
}
} else {
globalPopup = window.open(url, 'contentsview', popOption);
if (!globalPopup) {
msg("팝업이 차단되어 있습니다. 차단을 해제해 주세요.");
2020-10-12 14:39:23 +09:00
} else {
try {
globalPopup.focus(); // 포커스 이동
} catch (e) {
console.error("팝업 포커스 실패: ", e);
2020-10-12 14:39:23 +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];
}
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;
}
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)) {
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);
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("다른 작업을 처리중입니다. 잠시후 다시 작업해주세요.");
}
}
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;
// 동기식 요청은 권장되지 않지만, 기존 코드 호환성을 위해 유지
// 단, 경고 메시지 출력
_async = !(sync || false);
if (sync) {
console.warn("동기식 Ajax 요청은 권장되지 않으며 iOS에서 문제를 일으킬 수 있습니다.");
}
2020-10-12 14:39:23 +09:00
if (!isCaping) {
isAutoMsg = autoMsg || false;
_bging = noBG || false;
2020-10-12 14:39:23 +09:00
if (!_bging) {
ajaxing();
}
2020-10-12 14:39:23 +09:00
if (_jsislayer2) {
bglayer2();
}
2020-10-12 14:39:23 +09:00
_callback = callback;
capResult = null;
capOK = false;
isCaping = true;
// 기존 함수 호출 유지, 존재 확인 후 실행
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,
async: _async,
timeout: _async ? 30000 : undefined, // 비동기 요청만 타임아웃 설정
2020-10-12 14:39:23 +09:00
success: function (r) {
isCaping = false;
capResult = r;
// iOS 호환성을 위한 추가 처리
setTimeout(function () {
setcap();
}, 0);
},
error: function (xhr, status, error) {
2020-10-12 14:39:23 +09:00
isCaping = false;
console.log("Ajax 오류:", status, error);
if (xhr.responseText) {
console.log("응답 내용:", xhr.responseText);
2020-10-12 14:39:23 +09:00
}
// 타임아웃 오류 별도 처리
if (status === "timeout") {
if (_jsislayer2) {
alert("요청 시간이 초과되었습니다. 다시 시도해 주세요.");
} else {
alert("요청 시간이 초과되었습니다. 다시 시도해 주세요.");
}
2020-10-12 14:39:23 +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
}
};
// 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
}
else if (!_noerror) {
2020-10-12 14:39:23 +09:00
console.log("다른 작업을 처리중입니다. 잠시후 다시 작업해주세요.");
}
}
2020-10-12 14:39:23 +09:00
function capfile(url, data, callback, noeval, setBG, jsislayer2) {
// 로딩바 표시 추가
showLoadingImage();
2020-10-12 14:39:23 +09:00
noeval = noeval || false;
_jsislayer2 = jsislayer2 || false;
_setBG = setBG || false;
// 백그라운드 레이어 표시
2020-10-12 14:39:23 +09:00
if (_setBG) {
bglayer();
}
if (_jsislayer2) {
bglayer2();
}
// 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,
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
});
// 에러 처리
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 {
// 기존 에러 처리 로직 유지 (하지만 에러 시 다른 처리를 권장)
executeCallback({
code: -1,
message: "요청 처리 중 오류가 발생했습니다",
error: textStatus
});
2020-10-12 14:39:23 +09:00
}
});
2020-10-12 14:39:23 +09:00
ajaxRequest.done(function (data) {
if (data && data.code == 1000) {
executeCallback(data);
2020-10-12 14:39:23 +09:00
}
else {
console.warn("서버 응답 코드가 1000이 아닙니다:", data);
executeCallback(data);
2020-10-12 14:39:23 +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) {
// 로딩바 표시 추가
showLoadingImage();
2020-10-12 14:39:23 +09:00
isAutoMsg = autoMsg || false;
_bging = noBG || false;
if (!_bging) { ajaxing(); }
if (_jsislayer2) { bglayer2(); }
2020-10-12 14:39:23 +09:00
_callback = callback;
capResult = null;
capOK = false;
isCaping = true;
// 폼 요소 직접 참조
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,
data: formData,
2020-10-12 14:39:23 +09:00
contentType: false,
processData: false,
timeout: ajaxTimeout,
2020-10-12 14:39:23 +09:00
success: function (r) {
isCaping = false;
capResult = r;
setcap();
// 로딩바 숨김 추가
hideLoadingImage();
},
error: function (e) {
2020-10-12 14:39:23 +09:00
isCaping = false;
console.log('Ajax 오류:', e.status, e.statusText);
2020-10-12 14:39:23 +09:00
console.log(e.responseText);
if (e.status === 0 && e.statusText === 'timeout') {
alert("요청 시간이 초과되었습니다. 다시 시도해주세요.");
}
else if (_jsislayer2) {
alert("개발담당자에게 문의해주세요");
2020-10-12 14:39:23 +09:00
}
else {
alert("개발담당자에게 문의해주세요.");
2020-10-12 14:39:23 +09:00
}
// 로딩바 숨김 추가
hideLoadingImage();
},
complete: function () {
2020-10-12 14:39:23 +09:00
ajaxing(false);
// complete에도 로딩바 숨김 추가 (중복 호출 방지를 위해 다른 방법 고려 가능)
hideLoadingImage();
2020-10-12 14:39:23 +09:00
}
});
}
else {
console.log("다른 작업을 처리중입니다. 잠시후 다시 작업해주세요.");
}
}
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, ''));
});
}
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);
}
function isid(v) {
//영문숫자-_ , 나머지입력시 오류반환
2021-08-23 15:10:15 +09:00
var regExp = /^[A-Za-z0-9-_]*$/i;
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;
}
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;
}
function isRepeatedString(str) {
// 반복 문자열 검증
const len = str.length;
2020-10-12 14:39:23 +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
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) {
_confirmokcb += "()";
2020-10-12 14:39:23 +09:00
}
eval(_confirmokcb);
}
/**
* 사용자 정의 버튼을 포함하는 확인(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"));
}
function strEnConvert(str) {
let rslt = str.replace(/&#/gi, "%26%23");
return rslt;
}
/**
* 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
}