/** * ************************************************ * 업무그룹명 : 공통 자바스크립트 * 서브업무명 : DOM Event 처리 * 설명 : Windows 에 입력되는 Dom Event를 처리함 * 작성자 : 김석철 (indark9@gmail.com) * 작성일 : 2007. 7. 31 오후 5:25:55 * ************************************************* */ var TYPE_NONE = 0; var TYPE_WON = 1; var TYPE_YEAR = 2; var TYPE_YEARMONTH = 3; var TYPE_DATE = 4; var TYPE_TIME = 5; var TYPE_TIMEHMS = 6; var TYPE_RESNO = 7; var TYPE_ZIPCODE = 8; var TYPE_NUMCODE = 9; var TYPE_ENGCODE = 10; var TYPE_KOR = 20; var TYPE_ENG = 21; var TYPE_NUM = 22; var TYPE_KORENG = 23; var TYPE_KORNUM = 24; var TYPE_ENGNUM = 25; var TYPE_EMAIL = 30; var TYPE_URL = 31; var TYPE_TEL = 32; /** * 전체 폼에 적용 된 포맷 형식 제거 */ function unformat() { for (i = 0; i < document.forms.length; i++) { var form = document.forms[i]; for (j = 0; j < form.elements.length; j++) { if (form.elements[j].type == "text" || form.elements[j].type == "password") form.elements[j].value = form.elements[j].value.replace(/(\,|\-)/g, ""); } } } /** * 포맷 지정 */ function __fomat() { switch (this.elementType) { case TYPE_WON : // 통화 표시 var sWon = this.value.replace(/(^(0)*|,)/g, ""); // 무의미한 0과 콤마 제거 var tWon = ""; var i; var j = 0; var tLen = sWon.length; for (i = 0; i < tLen; i++) { if (i != 0 && (i % 3 == tLen % 3)) tWon += ","; if (i < sWon.length) { tWon += sWon.charAt(i); } } this.value = tWon; break; case TYPE_YEAR : // 년도 표시 this.value = __fomatMask(this.value, "9999"); break; case TYPE_YEARMONTH : // 년도와 월 표시 this.value = __fomatMask(this.value, "9999-99"); break; case TYPE_DATE : // 년월일 표시 this.value = __fomatMask(this.value, "9999-99-99"); break; case TYPE_TIME : // 시간 표시 this.value = __fomatMask(this.value, "99:99"); break; case TYPE_TIMEHMS : // 시간 (초) 표시 this.value = __fomatMask(this.value, "99:99:99"); break; case TYPE_RESNO : // 주민번호 표시 this.value = __fomatMask(this.value, "999999-9999999"); break; case TYPE_ZIPCODE : // 우편번호 표시 this.value = __fomatMask(this.value, "999-999"); break; } } /** * 포맷 마스크 처리 * @param str 문자열 * @param mask 마스크 문자열 */ function __fomatMask(str, mask) { var sStr = str.replace(/(\$|\^|\*|\(|\)|\+|\.|\?|\\|\{|\}|\||\[|\]|-|:)/g, ""); var tStr = ""; var i; var j = 0; var tLen = sStr.length + 1 ; for (i = 0; i < sStr.length; i++) { tStr += sStr.charAt(i); j++; if (j < mask.length && mask.charAt(j) != "9") tStr += mask.charAt(j++); } return tStr; } /** * 키보드가 눌릴 경우 처리 (입력가능한 문자 처리) */ function __onkeypress() { var sKey = String.fromCharCode(event.keyCode); var sFilter; var re; switch (this.elementType) { case TYPE_WON : sFilter = "[0-9.-]"; break; case TYPE_YEAR : case TYPE_YEARMONTH : case TYPE_DATE : case TYPE_TIME : case TYPE_TIMEHMS : case TYPE_RESNO : case TYPE_ZIPCODE : sFilter = "[0-9]"; break; case TYPE_NUMCODE : sFilter = "[0-9]"; break; case TYPE_ENGCODE : sFilter = "[0-9A-Za-z]"; break; case TYPE_KOR : sFilter = "[^0-9A-Za-z ]"; break; case TYPE_ENG : sFilter = "[A-Za-z ]"; break; case TYPE_NUM : sFilter = "[0-9.-]"; break; case TYPE_KORENG : sFilter = "[^0-9 ]"; break; case TYPE_KORNUM : sFilter = "[^A-Za-z ]"; break; case TYPE_ENGNUM : sFilter = "[0-9A-Za-z ]"; break; case TYPE_EMAIL : sFilter = "[0-9a-z@.]"; break; case TYPE_URL : sFilter = "[0-9a-z:/.]"; break; case TYPE_TEL : sFilter = "[0-9]"; break; } if (sFilter) { re = new RegExp(sFilter); if (!re.test(sKey)) { event.returnValue = false; } } if (this.getAttribute("filter")) { re = new RegExp(this.getAttribute("filter")); if (!re.test(sKey)) { window.event.returnValue = false; } } if (this.elementType == TYPE_WON || this.elementType == TYPE_NUM) { // TYPE_WON, TYPE_NUM의 경우 콤마는 한개만 이용 if (sKey == "." && this.value.indexOf(".") != -1) window.event.returnValue = false; } if (this.getAttribute("keypress")) { var fn = eval(this.getAttribute("keypress")); } } /** * 키보드가 떼어질 경우 처리 */ function __onkeyup() { var nKeyCode = window.event.keyCode; if (nKeyCode == 9 || (nKeyCode >= 33 && nKeyCode <= 40) || nKeyCode == 45 || nKeyCode == 46) return; switch (this.elementType) { case TYPE_WON : insertSeperatorByWon(this, ","); break; case TYPE_YEAR : break; case TYPE_YEARMONTH : insertSeperatorByYearMonth(this, "-"); break; case TYPE_DATE : insertSeperatorByDate(this, "-"); break; case TYPE_TIME : insertSeperatorByTime(this, ":"); break; case TYPE_TIMEHMS : insertSeperatorByTimeHms(this, ":"); break; case TYPE_RESNO : insertSeperatorByResno(this, "-"); break; case TYPE_ZIPCODE : insertSeperatorByZipcode(this, "-"); break; case TYPE_NUMCODE : case TYPE_ENGCODE : case TYPE_KOR : case TYPE_ENG : case TYPE_NUM : case TYPE_KORENG : case TYPE_KORNUM : case TYPE_ENGNUM : case TYPE_EMAIL : case TYPE_URL : case TYPE_TEL : break; } if (this.getAttribute("keyup")) { var fn = eval(this.getAttribute("keyup")); } } /** * 키보드가 눌렸다 떼어진 경우 처리 */ function __onkeydown() { if (this.getAttribute("keydown")) { var fn = eval(this.getAttribute("keydown")); } } /** * 포커스를 받는 경우 처리 */ function __onfocus() { if (this.select) this.select(); if (this.getAttribute("focus")) { var fn = eval(this.getAttribute("focus")); } } /** * 포커스가 이동될 경우 처리 */ function __onblur() { if (window.event.keyCode == 9) return; var title = this.getAttribute("title") ? this.getAttribute("title") : "입력자료"; var str = ""; var sep = ""; var arr; // 범위 검사 if (this.getAttribute("range")) { var range = this.getAttribute("range").split("-"); if (range.length == 2) { str = trim(this.value); if (strlen(str) != 0 && !(strlen(str) >= range[0] && strlen(str) <= range[1])) { if (range[0] == range[1]) { window.alert(title + "은(는) " + range[0] + "자로 입력하세요."); this.focus(); } else { window.alert(title + "은(는) 최소 " + range[0] + "자, 최대 " + range[1] + "자로 입력하세요."); this.focus(); } this.value = str; this.focus(); return; } this.value = str; } } // 유효성 검사 switch (this.elementType) { case TYPE_YEAR : str = this.value; if (str != "") { if (str != "" && !(parseInt(str) >= 1900 && parseInt(str) <= 2100)) { window.alert("[" + str + "]은(는) 유효한 " + title + "이(가) 아닙니다."); this.focus(); this.value = str; return; } this.value = str; } break; case TYPE_YEARMONTH : sep = "-"; // 구분자 str = this.value; if (str != "") { arr = new Array(); arr = str.split(sep); if (arr.length != 2) { window.alert(title + "은(는) [" + sep + "]로 구분해야 합니다."); this.value = str; return; } if (!ValidYear(arr[0]) || !ValidMonth(arr[1])) { window.alert("[" + str + "]은(는) 유효한 " + title + "이(가) 아닙니다."); this.focus(); this.value = str; return; } if (arr[1].length == 1) arr[1] = "0" + arr[1]; this.value = arr[0] + sep + arr[1]; } break; case TYPE_DATE : sep = "-"; str = this.value; if (str != "") { arr = new Array(); arr = str.split(sep); if (arr.length != 3) { window.alert(title + "은(는) [" + sep + "]로 구분해야 합니다."); this.focus(); this.value = str; return; } if (!ValidDate(arr[0], arr[1], arr[2])) { window.alert("[" + str + "]은(는) 유효한 " + title + "이(가) 아닙니다."); this.focus(); this.value = str; return; } if (arr[1].length == 1) arr[1] = "0" + arr[1]; if (arr[2].length == 1) arr[2] = "0" + arr[2]; this.value = arr[0] + sep + arr[1] + sep + arr[2]; } break; case TYPE_TIME : sep = ":"; // 구분자 str = this.value; if (str != "") { arr = new Array(); arr = str.split(sep); if (arr.length != 2) { window.alert(title + "은(는) [" + sep + "]로 구분해야 합니다."); this.focus(); this.value = str; return; } if (!ValidHour(arr[0]) || !ValidMinute(arr[1])) { window.alert("[" + str + "]은(는) 유효한 " + title + "이(가) 아닙니다."); this.focus(); this.value = str; return; } if (arr[1].length == 1) arr[1] = "0" + arr[1]; this.value = arr[0] + sep + arr[1]; } break; case TYPE_TIMEHMS : sep = ":"; // 구분자 str = this.value; if (str != "") { arr = new Array(); arr = str.split(sep); if (arr.length != 3) { window.alert(title + "은(는) [" + sep + "]로 구분해야 합니다."); this.focus(); this.value = str; return; } if (!ValidHour(arr[0]) || !ValidMinute(arr[1]) || !ValidMinute(arr[2])) { window.alert("[" + str + "]은(는) 유효한 " + title + "이(가) 아닙니다."); this.focus(); this.value = str; return; } if (arr[1].length == 1) arr[1] = "0" + arr[1]; if (ar[2].length == 1) arr[2] = "0" + arr[2]; this.value = arr[0] + sep + arr[1] + sep + arr[2]; } break; case TYPE_RESNO : sep = "-"; str = this.value; if (str != "") { arr = new Array(); arr = str.split(sep); if (arr.length != 2) { window.alert(title + "은(는) [" + sep + "]로 구분해야 합니다."); this.focus(); this.value = str; return; } if (!ValidSize(arr[0], 6, 6)) { window.alert(title + "의 앞자리는 " + 6 + "자로 입력하세요."); this.focus(); this.value = str; return; } if (!ValidSize(arr[1], 7, 7)) { window.alert(title + "의 뒷자리는 " + 7 + "자로 입력하세요."); this.focus(); this.value = str; return; } var year = (parseInt(arr[0].substring(0, 2)) < 5) ? "20" : "19"; if (!ValidDate(year + arr[0].substring(0, 2), arr[0].substring(2, 4), arr[0].substring(4, 6))) { window.alert(title + "의 생년월일이 정확하지 않습니다."); this.focus(); this.value = str; return; } var hap = 0; for (var i = 0; i < 6; i++) { hap = hap + (arr[0].charAt(i) * (i + 2)); } if (!(arr[0] == "000000" && arr[1] == "0000000")) { var n1 = arr[1].charAt(0); var n2 = arr[1].charAt(1); var n3 = arr[1].charAt(2); var n4 = arr[1].charAt(3); var n5 = arr[1].charAt(4); var n6 = arr[1].charAt(5); var n7 = arr[1].charAt(6); hap += n1 * 8 + n2 * 9 + n3 * 2 + n4 * 3 + n5 * 4 + n6 * 5; hap %= 11; hap = 11 - hap; hap %= 10; if (hap != n7) { window.alert(title + "이(가) 유효하지 않습니다. 확인 후 다시 입력하세요."); this.focus(); this.value = str; return; } } this.value = str; } break; case TYPE_NONE : // TYPE_NONE의 경우 document 내의 모든 element가 해당되므로 validation 검사를 하지않는다. break; } if (this.getAttribute("blur")) { var fn = eval(this.getAttribute("blur")); } } /** * DomEvent 이용가능토록 설정 */ function enableDomEvent() { for (i = 0; i < document.forms.length; i++) { var form = document.forms[i]; for (j = 0; j < form.elements.length; j++) { switch (form.elements[j].type) { // 내장된 키워드가 있을 경우 오른쪽 정렬, 영숫자만 입력이 가능하도록 설정한다. case "password" : case "text" : if (form.elements[j].getAttribute("won") != null) { form.elements[j].elementType = TYPE_WON; form.elements[j].style.textAlign = "right"; form.elements[j].style.imeMode = "disabled"; } else if (form.elements[j].getAttribute("year") != null) { form.elements[j].elementType = TYPE_YEAR; form.elements[j].style.imeMode = "disabled"; } else if (form.elements[j].getAttribute("yearmonth") != null) { form.elements[j].elementType = TYPE_YEARMONTH; form.elements[j].style.imeMode = "disabled"; } else if (form.elements[j].getAttribute("date") != null) { form.elements[j].elementType = TYPE_DATE; form.elements[j].style.imeMode = "disabled"; } else if (form.elements[j].getAttribute("time") != null) { form.elements[j].elementType = TYPE_TIME; form.elements[j].style.imeMode = "disabled"; } else if (form.elements[j].getAttribute("timehms") != null) { form.elements[j].elementType = TYPE_TIMEHMS; form.elements[j].style.imeMode = "disabled"; } else if (form.elements[j].getAttribute("resno") != null) { form.elements[j].elementType = TYPE_RESNO; form.elements[j].style.imeMode = "disabled"; } else if (form.elements[j].getAttribute("zipcode") != null) { form.elements[j].elementType = TYPE_ZIPCODE; form.elements[j].style.imeMode = "disabled"; } else if (form.elements[j].getAttribute("kor") != null) { form.elements[j].elementType = TYPE_KOR; form.elements[j].style.imeMode = "active"; } else if (form.elements[j].getAttribute("eng") != null) { form.elements[j].elementType = TYPE_ENG; form.elements[j].style.imeMode = "disabled"; } else if (form.elements[j].getAttribute("num") != null) { form.elements[j].elementType = TYPE_NUM; form.elements[j].style.textAlign = "right"; form.elements[j].style.imeMode = "disabled"; } else if (form.elements[j].getAttribute("numcode") != null) { form.elements[j].elementType = TYPE_NUMCODE; form.elements[j].style.textAlign = "right"; form.elements[j].style.imeMode = "disabled"; } else if (form.elements[j].getAttribute("engcode") != null) { form.elements[j].elementType = TYPE_ENGCODE; form.elements[j].style.imeMode = "disabled"; } else if (form.elements[j].getAttribute("koreng") != null) { form.elements[j].elementType = TYPE_KORENG; form.elements[j].style.imeMode = "active"; } else if (form.elements[j].getAttribute("kornum") != null) { form.elements[j].elementType = TYPE_KORNUM; form.elements[j].style.imeMode = "active"; } else if (form.elements[j].getAttribute("engnum") != null) { form.elements[j].elementType = TYPE_ENGNUM; form.elements[j].style.imeMode = "disabled"; } else if (form.elements[j].getAttribute("email") != null) { form.elements[j].elementType = TYPE_EMAIL; form.elements[j].style.imeMode = "disabled"; } else if (form.elements[j].getAttribute("url") != null) { form.elements[j].elementType = TYPE_URL; form.elements[j].style.imeMode = "inactive"; } else if (form.elements[j].getAttribute("tel") != null) { form.elements[j].elementType = TYPE_TEL; form.elements[j].style.imeMode = "disabled"; } else { form.elements[j].elementType = TYPE_NONE; form.elements[j].style.imeMode = "active"; } form.elements[j].onkeypress = __onkeypress; form.elements[j].onkeyup = __onkeyup; form.elements[j].onkeydown = __onkeydown; form.elements[j].format = __fomat; form.elements[j].onfocus = __onfocus; form.elements[j].onblur = __onblur; break; default: break; } } } } /** * END OF SCRIPT */