From 65c0da8cbcc4573ba45281037de3a214893143ad Mon Sep 17 00:00:00 2001 From: leebj Date: Wed, 21 Aug 2024 15:09:00 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B3=B5=ED=86=B5=ED=95=A8=EC=88=98,=20?= =?UTF-8?q?=EB=AC=B8=EC=9E=90=EC=97=B4=20=EA=B4=80=EB=A0=A8=20=EC=9E=90?= =?UTF-8?q?=EB=B0=94=EC=8A=A4=ED=81=AC=EB=A6=BD=ED=8A=B8=20=EC=86=8C?= =?UTF-8?q?=EC=8A=A4=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../webapp/resources/applib/js/app-support.js | 272 +++++++++++ .../webapp/resources/applib/js/cmmnUtil.js | 455 ------------------ .../resources/applib/js/string-support.js | 257 ++++++++++ 3 files changed, 529 insertions(+), 455 deletions(-) delete mode 100644 src/main/webapp/resources/applib/js/cmmnUtil.js create mode 100644 src/main/webapp/resources/applib/js/string-support.js diff --git a/src/main/webapp/resources/applib/js/app-support.js b/src/main/webapp/resources/applib/js/app-support.js index 122d209..2e7ce48 100644 --- a/src/main/webapp/resources/applib/js/app-support.js +++ b/src/main/webapp/resources/applib/js/app-support.js @@ -3,6 +3,15 @@ class AppSupport { static help(){ console.log("initDatepicker(초기화영역) : 특정 영역의 datepicker를 초기화한다."); console.log("initDetailSearchButton(초기화영역) : 특정 영역의 상세조회 버튼을 초기화한다."); + console.log("getLastOpenDialog() : 마지막으로 열린 다이얼로그 영역을 반환한다."); + console.log("getLastDialog() : 마지막으로 생성된 다이얼로그 영역을 반환한다."); + console.log("setDialogZindex() : 모달창 z-index 초기화"); + console.log("focusClose() : 모달창 닫기 버튼에 포커스"); + console.log("focusOK() : 모달창 확인 버튼에 포커스"); + console.log("customValidate(제이쿼리객체) : 커스텀 발리데이션"); + console.log("getCellDefs(th제이쿼리객체, td제이쿼리객체, [컬럼명 구하는 메소드]) : 엑셀 파일 정보 생성"); + console.log("sleep(마이크로초) : 지연 처리 함수"); + } /************************************************************************** @@ -38,4 +47,267 @@ class AppSupport { }); } + + //마지막으로 열린 다이얼로그 영역을 반환한다. + static getLastOpenDialog(){ + return $("div.modal.show").last()[0]; + } + //마지막으로 생성된 다이얼로그 영역을 반환환다. + static getLastDialog(){ + return $("div.modal").last()[0]; + } + + /************************************************************************** + * 모달창 z-index 초기화 + **************************************************************************/ + static setDialogZindex(){ + var parentDialog = AppSupport.getLastOpenDialog(); + var childDialog = AppSupport.getLastDialog(); + + if($(parentDialog).length == 0 || parentDialog == childDialog){ + return; + } + + var parentZ = $(parentDialog).css("z-index"); + $(childDialog).css("z-index", Number(parentZ)+10); + + var backdrop = $(childDialog).next(); + if(backdrop.hasClass("modal-backdrop")){ + backdrop.css("z-index", Number(parentZ)+9); + }; + } + + /************************************************************************** + * 모달창 닫기 버튼 포커스 + **************************************************************************/ + static focusClose() { + $(document).find("div.modal").last().on('shown.bs.modal', function () { + $(this).find(".btn-close").trigger('focus'); + }); + } + + /************************************************************************** + * 모달창 확인 버튼 포커스 + **************************************************************************/ + static focusOK() { + $(document).find("div.modal").last().on('shown.bs.modal', function () { + $(this).find(".modal-footer").find("button").each(function(){ + if($(this).text() == "확인"){ + $(this).trigger('focus'); + } + }); + }); + } + + + /************************************************************************** + * validation + **************************************************************************/ + static customValidate(targetArr) { + var handler = validationFailureHandler(); + for(var i=0;i setTimeout(r, ms)); + } +} + + +/************************************************************************** +* 전역함수 +**************************************************************************/ +/************************************************************************** +* 동기식 대화상자 +**************************************************************************/ +async function confirm2(msg){ + return await dialog2(msg, "confirm"); +} + +async function alert2(msg){ + return await dialog2(msg, "alert"); +} + +async function prompt2(msg){ + return await dialog2(msg, "prompt"); +} + +async function dialog2(msg, type, buttons){ + var dlgId = "dlg-" + uuid(); + var resp = await fetch(wctx.url("/webjars/html/dialog.html")); + var template = await resp.text(); + var container = "
{content}
"; + if(type == "prompt"){ + var rsn = '
'; + content = container.replace(/{content}/g, msg + rsn); + } else { + content = container.replace(/{content}/g, msg); + } + var backdropID = dlgId + "-backdrop"; + var tmpl = template.replace(/{id}/g, dlgId).replace(/{title}/g, "").replace(/{size}/, "").replace("",""); + tmpl = tmpl.replace("modal-dialog", "modal-dialog-centered modal-dialog"); + tmpl = tmpl.replace("data-bs-backdrop=\"static\"", "data-bs-backdrop=\"static\" data-bs-keyboard=\"false\""); + tmpl = tmpl.replace("text-end hidden","text-end"); + tmpl = tmpl.replace("btn-primary","btn-primary btn-ok"); + var dlg = $(tmpl).appendTo("body"); + if(type == "confirm" || type == "alert" || type == "prompt"){ + if(type == "confirm" || type == "prompt"){ + dlg.find(".modal-footer").append(''); + } + } else { + dlg.find(".modal-footer").find(".btn-ok").remove(); + + for(var i=0; i < buttons.length; i++){ + dlg.find(".modal-footer").append( + ''); + } + + } + + dlg.find(".modal-header").remove(); + dlg.find(".modal-body").html(content).fadeIn(); + dlg.on("hidden.bs.modal", function() { + $("#" + dlgId +",#" + backdropID).remove(); + }); + dlg.modal("show"); + $(".modal-backdrop").each(function() { + var backdrop = $(this); + if (!backdrop.prop("id")){ + backdrop.prop("id", backdropID); + } + }); + + AppSupport.setDialogZindex(); + + return new Promise(resolve => { + if(type == "confirm" || type == "alert" || type == "prompt"){ + if(type == "prompt"){ + dlg[0].querySelector(".btn-ok").addEventListener("click", () => { + dlg.modal("hide"); + resolve($("#rsn").val()); + }); + } else { + dlg[0].querySelector(".btn-ok").addEventListener("click", () => { + dlg.modal("hide"); + resolve(true); + }); + } + + if(type == "confirm"){ + dlg[0].querySelector(".btn-cancel").addEventListener("click", () => { + dlg.modal("hide"); + resolve(false); + }); + } + if(type == "prompt"){ + dlg[0].querySelector(".btn-cancel").addEventListener("click", () => { + dlg.modal("hide"); + resolve(null); + }); + } + } else { + dlg.find(".btn-custom").each(function(){ + this.addEventListener("click", () => { + dlg.modal("hide"); + resolve(this.dataset.key); + }); + }); + } + + }); } \ No newline at end of file diff --git a/src/main/webapp/resources/applib/js/cmmnUtil.js b/src/main/webapp/resources/applib/js/cmmnUtil.js deleted file mode 100644 index 7d6f96a..0000000 --- a/src/main/webapp/resources/applib/js/cmmnUtil.js +++ /dev/null @@ -1,455 +0,0 @@ -/************************************************************************** -* 동기식 대화상자 -**************************************************************************/ -async function confirm2(msg){ - return await dialog2(msg, "confirm"); -} - -async function alert2(msg){ - return await dialog2(msg, "alert"); -} - -async function prompt2(msg){ - return await dialog2(msg, "prompt"); -} - -async function dialog2(msg, type, buttons){ - var dlgId = "dlg-" + uuid(); - var resp = await fetch(wctx.url("/webjars/html/dialog.html")); - var template = await resp.text(); - var container = "
{content}
"; - if(type == "prompt"){ - var rsn = '
'; - content = container.replace(/{content}/g, msg + rsn); - } else { - content = container.replace(/{content}/g, msg); - } - var backdropID = dlgId + "-backdrop"; - var tmpl = template.replace(/{id}/g, dlgId).replace(/{title}/g, "").replace(/{size}/, "").replace("",""); - tmpl = tmpl.replace("modal-dialog", "modal-dialog-centered modal-dialog"); - tmpl = tmpl.replace("data-bs-backdrop=\"static\"", "data-bs-backdrop=\"static\" data-bs-keyboard=\"false\""); - tmpl = tmpl.replace("text-end hidden","text-end"); - tmpl = tmpl.replace("btn-primary","btn-primary btn-ok"); - var dlg = $(tmpl).appendTo("body"); - if(type == "confirm" || type == "alert" || type == "prompt"){ - if(type == "confirm" || type == "prompt"){ - dlg.find(".modal-footer").append(''); - } - } else { - dlg.find(".modal-footer").find(".btn-ok").remove(); - - for(var i=0; i < buttons.length; i++){ - dlg.find(".modal-footer").append( - ''); - } - - } - - dlg.find(".modal-header").remove(); - dlg.find(".modal-body").html(content).fadeIn(); - dlg.on("hidden.bs.modal", function() { - $("#" + dlgId +",#" + backdropID).remove(); - }); - dlg.modal("show"); - $(".modal-backdrop").each(function() { - var backdrop = $(this); - if (!backdrop.prop("id")){ - backdrop.prop("id", backdropID); - } - }); - - setDialogZindex(); - - return new Promise(resolve => { - if(type == "confirm" || type == "alert" || type == "prompt"){ - if(type == "prompt"){ - dlg[0].querySelector(".btn-ok").addEventListener("click", () => { - dlg.modal("hide"); - resolve($("#rsn").val()); - }); - } else { - dlg[0].querySelector(".btn-ok").addEventListener("click", () => { - dlg.modal("hide"); - resolve(true); - }); - } - - if(type == "confirm"){ - dlg[0].querySelector(".btn-cancel").addEventListener("click", () => { - dlg.modal("hide"); - resolve(false); - }); - } - if(type == "prompt"){ - dlg[0].querySelector(".btn-cancel").addEventListener("click", () => { - dlg.modal("hide"); - resolve(null); - }); - } - } else { - dlg.find(".btn-custom").each(function(){ - this.addEventListener("click", () => { - dlg.modal("hide"); - resolve(this.dataset.key); - }); - }); - } - - }); -} - -/************************************************************************** -* 모달창 z-index 초기화 -**************************************************************************/ -function setDialogZindex(){ - var parentDialog = getLastOpenDialog(); - var childDialog = getLastDialog(); - - if($(parentDialog).length == 0 || parentDialog == childDialog){ - return; - } - - var parentZ = $(parentDialog).css("z-index"); - $(childDialog).css("z-index", Number(parentZ)+10); - - var backdrop = $(childDialog).next(); - if(backdrop.hasClass("modal-backdrop")){ - backdrop.css("z-index", Number(parentZ)+9); - }; -} - -/************************************************************************** -* 모달창 닫기 버튼 포커스 -**************************************************************************/ -function focusClose() { - $(document).find("div.modal").last().on('shown.bs.modal', function () { - $(this).find(".btn-close").trigger('focus'); - }); -} - -/************************************************************************** -* 모달창 확인 버튼 포커스 -**************************************************************************/ -function focusOK() { - $(document).find("div.modal").last().on('shown.bs.modal', function () { - $(this).find(".modal-footer").find("button").each(function(){ - if($(this).text() == "확인"){ - $(this).trigger('focus'); - } - }); - }); -} - -/************************************************************************** -* validation -**************************************************************************/ -function customValidate(targetArr) { - var handler = validationFailureHandler(); - for(var i=0;i="00" && hour<="23"){ - if(minute>="00" && minute<="59"){ - if(second>="00" && second<="59"){ - return true; - } - } - } - - return false; -} - -// 날짜체크 -function isDate(str) { - - str = str.replaceAll("-",""); - - if(str.length != 8){ - return false; - } - - if (!isNumber(str, "")) { - return false; - } - - // 숫자, length 확인 - var year = str.substring(0,4); - var month = str.substring(4,6); - var day = str.substring(6,8); - - // 유효날짜 확인 - if (year>="0001" && year<="9999" && month>="01" && month<="12") { - febDays = "29"; - if ((parseInt(year,10) % 4) == 0) { - if ((parseInt(year,10) % 100) == 0 && (parseInt(year,10) % 400) != 0){ - febDays = "28"; - } - }else{ - febDays = "28"; - } - if (month=="01" && day>="01" && day<="31") return true; - if (month=="02" && day>="01" && day<=febDays) return true; - if (month=="03" && day>="01" && day<="31") return true; - if (month=="04" && day>="01" && day<="30") return true; - if (month=="05" && day>="01" && day<="31") return true; - if (month=="06" && day>="01" && day<="30") return true; - if (month=="07" && day>="01" && day<="31") return true; - if (month=="08" && day>="01" && day<="31") return true; - if (month=="09" && day>="01" && day<="30") return true; - if (month=="10" && day>="01" && day<="31") return true; - if (month=="11" && day>="01" && day<="30") return true; - if (month=="12" && day>="01" && day<="31") return true; - return false; - } - - - return false; -} - - - -/** - * 문자열이 지정한 최소길이 이상인지의 여부를 반환한다. - * @param minLen - 최소길이 - * @return 최소길이 이상인지의 여부 - */ -function isMin(str, minLen) { - return str.length >= minLen; -}; - -/** - * 문자열이 지정한 최대길이 이하인지의 여부를 반환한다. - * @param maxLen - 최대길이 - * @return 최대길이 이하인지의 여부 - */ -function isMax(str, maxLen) { - return str.length <= maxLen; -}; - -/** - * 문자열이 지정한 최소바이트수 이상인지의 여부를 반환한다. - * @param minByte - 최소바이트수 - * @return 최소바이트수 이상인지의 여부 - */ -function isMinByte(str, minByte) { - return getByte(str) >= minByte; -}; - -/** - * 문자열이 지정한 최대바이트수 이하인지의 여부를 반환한다. - * @param maxByte - 최대바이트수 - * @return 최대바이트수 이하인지의 여부 - */ -function isMaxByte(str, maxByte) { - return getByte(str) <= maxByte; -}; - - -/** - * 문자열이 영어만으로 구성되어 있는지의 여부를 반환한다. - * @param exceptChar - 추가 허용할 문자 - * @return 영어만으로 구성되어 있는지의 여부 - */ -function isEng(str, exceptChar) { - return (/^[a-zA-Z]+$/).test(str.replaceAll(exceptChar,"")) ? true : false; -}; - -/** - * 문자열이 숫자와 영어만으로 구성되어 있는지의 여부를 반환한다. - * @param exceptChar - 추가 허용할 문자 - * @return 숫자와 영어만으로 구성되어 있는지의 여부 - */ -function isEngNum(str, exceptChar) { - return (/^[0-9a-zA-Z]+$/).test(str.replaceAll(exceptChar,"")) ? true : false; -}; - -/** - * 이메일 주소의 유효성 여부를 반환한다. - * @return 유효성 여부 - */ -function isEmail(str) { - return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(str); -}; - -/************************************************************************** -* 엑셀 파일 작성 정보 생성 -**************************************************************************/ -function getCellDefs($ths, $tds, fieldGetterOption){ - var cellDefs = []; - - for(var i=0; i < $ths.length; i++){ - - var label = $ths.eq(i).text(); - label = label.replace("\n", ""); - label = label.replace("\t", ""); - label = label.replace(" ", ""); - - if(label != ""){ - - var width = $ths.eq(i).outerWidth(); - width = Math.ceil(width/10) + 2; - - var field = ""; - if(fieldGetterOption != null){ - field = fieldGetterOption($tds.eq(i)); - } else { - field = $tds.eq(i).text(); - } - - field = field.replace("{", ""); - field = field.replace("}", ""); - field = field.replace("\n", ""); - field = field.replace("\t", ""); - field = field.replace(" ", ""); - - var cellDef = { - label : label, - width : width, - field : field - }; - - cellDefs.push(cellDef); - } - - } - - return JSON.stringify(cellDefs); -} - - - -//마지막으로 열린 다이얼로그 영역을 반환한다. -function getLastOpenDialog(){ - return $("div.modal.show").last()[0]; -} -//마지막으로 생성된 다이얼로그 영역을 반환환다. -function getLastDialog(){ - return $("div.modal").last()[0]; -} - - - - - -/************************************************************************** -* 지연 -**************************************************************************/ -function sleep(ms) { - return new Promise((r) => setTimeout(r, ms)); -} - - - -/************************************************************************** -* String util -**************************************************************************/ -/** - * 문자열의 byte 길이를 반환한다. - * @return 문자열의 byte 길이 - */ -function getByte(str) { - - if ( str == null || str.length == 0 ) { - return 0; - } - var size = 0; - for ( var i=0, len=str.length ; i < len ;i++ ) { - var charCode = str.charCodeAt(i), - charSize = 0; - - if ( charCode <= 0x00007F ) { //127 - charSize = 1; - } else if ( charCode <= 0x0007FF) { //2047 - charSize = 2; - } else if ( charCode <= 0x00FFFF) { //65535 - charSize = 3; - } else { - charSize = 4; - } - size += charSize; - } - return size; -}; - - diff --git a/src/main/webapp/resources/applib/js/string-support.js b/src/main/webapp/resources/applib/js/string-support.js new file mode 100644 index 0000000..a1b1530 --- /dev/null +++ b/src/main/webapp/resources/applib/js/string-support.js @@ -0,0 +1,257 @@ +class StringSupport { + + static help(){ + console.log("snakeToCamel(문자열) : 스네이크 표기법을 카멜 표기법으로 변경한다."); + console.log("camelToKebab(문자열) : 카멜 표기법을 케밥 표기법으로 변경한다."); + console.log("escapeHTMLEntity(문자열) : HTML 엔티티 문자코드를 특수문자로 치환한다."); + console.log("isNumber(문자열,추가허용할문자) : 문자열이 숫자형인지의 여부를 반환한다."); + console.log("isDigitString(문자열) : 문자열이 숫자형문자 인지의 여부를 반환한다.(0~9만 허용)"); + console.log("isTime(문자열) : 문자열이 시간형식인지의 여부"); + console.log("isDate(문자열) : 문자열이 날짜형식인지의 여부"); + console.log("isMin(문자열,최소길이) : 문자열이 지정한 최소길이 이상인지의 여부를 반환한다."); + console.log("isMax(문자열,최대길이) : 문자열이 지정한 최대길이 이하인지의 여부를 반환한다."); + console.log("isMinByte(문자열,최소바이트수) : 문자열이 지정한 최소바이트수 이상인지의 여부를 반환한다."); + console.log("isMaxByte(문자열,최대바이트수) : 문자열이 지정한 최대바이트수 이하인지의 여부를 반환한다."); + console.log("isEng(문자열,추가허용할문자) : 문자열이 영어만으로 구성되어 있는지의 여부를 반환한다."); + console.log("isEngNum(문자열,추가허용할문자) : 문자열이 숫자와 영어만으로 구성되어 있는지의 여부를 반환한다."); + console.log("isEmail(문자열) : 이메일 주소의 유효성 여부를 반환한다."); + console.log("getByte(문자열) : 문자열의 byte 길이를 반환한다."); + } + + /** + * 스네이크 표기법을 카멜 표기법으로 변경한다. + * @return 치환된 문자열 + */ + static snakeToCamel(text){ + text = text.toLowerCase(); + var arrUnderbar = text.match(/\_[a-zA-Z]/g); + if(arrUnderbar){ + for(var j = 0; j < arrUnderbar.length; j++) { + text = text.replace(arrUnderbar[j], arrUnderbar[j].toUpperCase().replace("_", "")); + } + } + return text; + } + + /** + * 카멜 표기법을 케밥 표기법으로 변경한다. + * @return 치환된 문자열 + */ + static camelToKebab(text){ + return text.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase(); + } + + /** + * HTML 엔티티 문자코드를 특수문자로 치환한다. + * @return 치환된 문자열 + */ + static escapeHTMLEntity(str) { + if(str == undefined || str == null){ + return "" + } + + var regex = /&(amp|lt|gt|quot|#39);/g; + var chars = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'" + }; + + if(regex.test(str)) { + return str.replace(regex, (matched) => chars[matched] || matched); + } else { + return str; + } + } + + + + /** + * 문자열이 숫자형인지의 여부를 반환한다. + * @param exceptChar - 추가 허용할 문자 + * @return 숫자형여부 + */ + static isNumber(str, exceptChar) { + return (/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/).test(str.replaceAll(exceptChar,"")) ? true : false; + } + + /** + * 문자열이 숫자형문자 인지의 여부를 반환한다.(0~9만 허용) + * @param + * @return 숫자형문자 여부 + */ + static isDigitString(str) { + return (/^[0-9]+$/).test(str) ? true : false; + } + + // 시간체크 + static isTime(str) { + + str = str.replaceAll(":",""); + + if(str.length != 6){ + return false; + } + + if (!StringSupport.isNumber(str, "")) { + return false; + } + + var hour = str.substring(0,2); + var minute = str.substring(2,4); + var second = str.substring(4,6); + + if(hour>="00" && hour<="23"){ + if(minute>="00" && minute<="59"){ + if(second>="00" && second<="59"){ + return true; + } + } + } + + return false; + } + + // 날짜체크 + static isDate(str) { + + str = str.replaceAll("-",""); + + if(str.length != 8){ + return false; + } + + if (!StringSupport.isNumber(str, "")) { + return false; + } + + // 숫자, length 확인 + var year = str.substring(0,4); + var month = str.substring(4,6); + var day = str.substring(6,8); + + // 유효날짜 확인 + if (year>="0001" && year<="9999" && month>="01" && month<="12") { + febDays = "29"; + if ((parseInt(year,10) % 4) == 0) { + if ((parseInt(year,10) % 100) == 0 && (parseInt(year,10) % 400) != 0){ + febDays = "28"; + } + }else{ + febDays = "28"; + } + if (month=="01" && day>="01" && day<="31") return true; + if (month=="02" && day>="01" && day<=febDays) return true; + if (month=="03" && day>="01" && day<="31") return true; + if (month=="04" && day>="01" && day<="30") return true; + if (month=="05" && day>="01" && day<="31") return true; + if (month=="06" && day>="01" && day<="30") return true; + if (month=="07" && day>="01" && day<="31") return true; + if (month=="08" && day>="01" && day<="31") return true; + if (month=="09" && day>="01" && day<="30") return true; + if (month=="10" && day>="01" && day<="31") return true; + if (month=="11" && day>="01" && day<="30") return true; + if (month=="12" && day>="01" && day<="31") return true; + return false; + } + + + return false; + } + + + + /** + * 문자열이 지정한 최소길이 이상인지의 여부를 반환한다. + * @param minLen - 최소길이 + * @return 최소길이 이상인지의 여부 + */ + static isMin(str, minLen) { + return str.length >= minLen; + } + + /** + * 문자열이 지정한 최대길이 이하인지의 여부를 반환한다. + * @param maxLen - 최대길이 + * @return 최대길이 이하인지의 여부 + */ + static isMax(str, maxLen) { + return str.length <= maxLen; + } + + /** + * 문자열이 지정한 최소바이트수 이상인지의 여부를 반환한다. + * @param minByte - 최소바이트수 + * @return 최소바이트수 이상인지의 여부 + */ + static isMinByte(str, minByte) { + return StringSupport.getByte(str) >= minByte; + } + + /** + * 문자열이 지정한 최대바이트수 이하인지의 여부를 반환한다. + * @param maxByte - 최대바이트수 + * @return 최대바이트수 이하인지의 여부 + */ + static isMaxByte(str, maxByte) { + return StringSupport.getByte(str) <= maxByte; + } + + + /** + * 문자열이 영어만으로 구성되어 있는지의 여부를 반환한다. + * @param exceptChar - 추가 허용할 문자 + * @return 영어만으로 구성되어 있는지의 여부 + */ + static isEng(str, exceptChar) { + return (/^[a-zA-Z]+$/).test(str.replaceAll(exceptChar,"")) ? true : false; + } + + /** + * 문자열이 숫자와 영어만으로 구성되어 있는지의 여부를 반환한다. + * @param exceptChar - 추가 허용할 문자 + * @return 숫자와 영어만으로 구성되어 있는지의 여부 + */ + static isEngNum(str, exceptChar) { + return (/^[0-9a-zA-Z]+$/).test(str.replaceAll(exceptChar,"")) ? true : false; + } + + /** + * 이메일 주소의 유효성 여부를 반환한다. + * @return 유효성 여부 + */ + static isEmail(str) { + return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(str); + } + + /** + * 문자열의 byte 길이를 반환한다. + * @return 문자열의 byte 길이 + */ + static getByte(str) { + + if ( str == null || str.length == 0 ) { + return 0; + } + var size = 0; + for ( var i=0, len=str.length ; i < len ;i++ ) { + var charCode = str.charCodeAt(i), + charSize = 0; + + if ( charCode <= 0x00007F ) { //127 + charSize = 1; + } else if ( charCode <= 0x0007FF) { //2047 + charSize = 2; + } else if ( charCode <= 0x00FFFF) { //65535 + charSize = 3; + } else { + charSize = 4; + } + size += charSize; + } + return size; + } + +}