// -- 페이지 initialize 관련 함수 시작 -- //
/*
* html 페이지 로딩후 최초 실행하는 스크립트.
*/
initializeHtmlPage();
/**
* 최초 로딩시 페이지 초기 설정
*/
function initializeHtmlPage() {
var forms = document.getElementsByTagName("form");
for (var i = 0; i < forms.length; i++) {
document.forms[i].initialize = initializeHtmlForm;
document.forms[i].initialize();
}
}
/**
* 호출된 폼마다 셋팅하기.
*
initialize시 셋팅하는 정보 : 필수 요소(css), mask, letter type
*/
function initializeHtmlForm() {
this.spiderSubmit = formSubmitValidation;
this.submitStat = "false";
var elems = this.elements;
for (var i = 0; i < elems.length; i++) {
var tagName = elems[i].tagName.toLowerCase();
if (tagName == "input") {
// 필수 요소일때는 인풋창 왼쪽 위에 이미지 설정.
var nullable = elems[i].attributes['nullable'] ? elems[i].attributes['nullable'].value : "";
if (nullable == "false")
elems[i].className = "frameworkInitNullable";
// mask가 있을경우 #은 값을 의미함.
var maskForm = elems[i].attributes['maskform'] ? elems[i].attributes['maskform'].value : "";
if (maskForm != "" && maskForm != "usermask")
initSetMaskUp(elems[i]); //mask 타입(ex : ####/##/## , ####-##-## , ######-####### , ###-##-##### , ...)
// 문자 타입이 있을경우
var charType = elems[i].attributes['chartype'] ? elems[i].attributes['chartype'].value : "";
if (charType != "")
initSetLetterType(elems[i]); //문자 셋(english,korean,english+number, number, floatmoney,int)타입
// 속성이 있을경우
var disableCss = elems[i].attributes['disablecss'] ? elems[i].attributes['disablecss'].value : "";
if (disableCss != "")
initSetAttribute(elems[i]);
}
}
}
/**
* sider FrameWork의 form submit 함수
*/
function formSubmitValidation() {
//이중 서브밑 방지
if (this.submitStat != "false") {
alert("이미 submit 되었습니다.");
return false;
} else {
this.submitStat = "validating";
//기본 밸리데이션 체크 함수 호출
if (checkValidationInForm(this)) {
this.submitStat = "true";
this.submit();
return true;
} else {
this.submitStat = "false";
return false;
}
}
}
/**
* 속성에 따른 input창 상태 셋팅.
*
ex : initSetAttribute(form1.name)
* @param element : 이벤트를 셋팅할 element
*/
function initSetAttribute(element) {
var disableCss = element.attributes['disablecss'] ? element.attributes['disablecss'].value : "";
if (disableCss == "true") {
element.disabled = true;
element.className = "frameworkDisabled";
}
}
/**
* validation check 함수
* @param form : validation 검사를 할 폼.
* @return boolean
*/
function checkValidationInForm(form) {
var elements = form.elements;
for (var i = 0; i < elements.length; i++) {
// mask한 값에서 마스크 값 삭제
var maskForm = elements[i].attributes['maskform'] ? elements[i].attributes['maskform'].value : "";
var charType = elements[i].attributes['chartype'] ? elements[i].attributes['chartype'].value : "";
if (maskForm != "" || charType == "money") {
if (maskForm == "usermask")
elements[i].value = unMaskEngNum(elements[i].value);//사용자 마스크 지우기 로직.
else
elements[i].value = getOnlyNumberFormat(elements[i].value);
}
// Input Box 태그일 경우
var tagName = elements[i].tagName.toLowerCase();
var nullable = elements[i].attributes['nullable'] ? elements[i].attributes['nullable'].value : "";
var message = elements[i].attributes['message'];
var title = elements[i].title || elements[i].name;
if (tagName == "input") {
// 필수 값 체크
if (nullable == "false") {
// type이 text 또는 password일 경우
var type = elements[i].type.toLowerCase();
if (type == "text" || type == "password") {
// Value 값이 없을 경우
if (elements[i].value == "") {
alert(message || (title + "은(는) 필수 입력 사항입니다."));//alert 메세지 함수 호출
if (elements[i].className == "")
elements[i].className = "frameworkNullable";
else
elements[i].className = elements[i].className + " " + "frameworkNullable";
elements[i].select();
return false;
} else {
// 한번 validation에서 css설정이 되었을 경우 빼야 하기 때문에.
var classArray = elements[i].getAttribute("className").split(" ");
elements[i].className = removeClassName(classArray, "frameworkNullable");
}
} else if (type == "checkbox" || type == "radio") {
var checkState = false;
var elementArray = eval("forms." + elements[i].name);
for (var ct = 0; ct < elementArray.length; ct++) {
if (elementArray[ct].checked) {
checkState = true;
break;
}
}
if (!checkState) {
alert(message || (title + "은(는) 필수 선택 사항입니다."));
elements[i].focus();
return false;
}
}
}
if (elements[i].value != "") {
// 최대값 체크
var maximum = elements[i].attributes['maximum'] ? elements[i].attributes['maximum'].value : "";
if (maximum != "") {
if (!validateMaximum(maximum, elements[i].value)) {
alert(message || (title + "은(는) 정해진 최대값보다 큽니다."));
elements[i].select();
return false;
}
}
//최소값 체크
var minimum = elements[i].attributes['minimum'] ? elements[i].attributes['minimum'].value : "";
if (minimum != "") {
if (!validateMinimum(minimum, elements[i].value)) {
alert(message || (title + "은(는) 정해진 최소값보다 작습니다."));
elements[i].select();
return false;
}
}
//최대 바이트 체크
var maxByte = elements[i].attributes['maxbyte'] ? elements[i].attributes['maxbyte'].value : "";
if (maxByte != "") {
if (!validateMaxBytes(maxByte, elements[i].value)) {
var kor_cnt = Math.floor(maxByte / 2);
alert(message || (title + "은(는) 한글 " + kor_cnt + "자, 영문 " + maxByte + "자를 초과할 수 없습니다."));
elements[i].select();
return false;
}
}
}
//select 타입이 필수일때
} else if (tagName == "select") {
if (elements[i].disabled)
elements[i].disabled = false;
if (nullable == "false" && elements[i].value == "") {
alert(message || (title + "은(는) 필수 선택 사항입니다."));
elements[i].focus();
return false;
}
//textarea 타입이 필수일때
} else if(tagName == "textarea") {
if (nullable == "false" && isWhitespace(elements[i].value)) {
alert(message || (title + "은(는) 필수 입력 사항입니다."));
elements[i].value = '';
elements[i].focus();
return false;
}
}
}
return true;
}
/**
* 숫자열 마스크 씌우기
*
ex : initSetMaskUp(form1.element)
* @param element : 마스크를 셋팅할 element
*/
function initSetMaskUp(element) {
element.onkeypress = setKeyInputNumberOnly;
element.onfocus = filterGetNumberOnly;
element.onblur = setInitMaskUp;
}
/**
* 페이지 초기화시 숫자만 입력받기
*/
function setKeyInputNumberOnly() {
if (event.shiftKey == true) event.returnValue = false;
if (event.keyCode >= 48 && event.keyCode <= 57) { //숫자 키코드값
return true;
} else {
// enter, tab, backspace 방향키(앞,뒤)는 예외처리
if (event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 37 || event.keyCode == 39) {
return true;
}
event.returnValue = false;
}
return false;
}
/**
* 페이지 초기화시에 onfocus 이벤트에 할당되면 이 Elemnent에 숫자외의 문자("," , "/" , "-")는 focus시에 제거됨
*/
function filterGetNumberOnly() {
this.value = getOnlyNumberFormat(this.value);
this.select();
}
/**
* 페이지 초기화시에 마스크 설정값대로 변환하기
*/
function setInitMaskUp() {
var mask = this.attributes['maskform'] ? this.attributes['maskform'].value : "";
if (this.value != "") {
var inputValue = getOnlyNumberFormat(this.value);
for (var i = 0; i < mask.length; i++) {
if (mask.substring(i, i + 1) != "#" )
inputValue = inputValue.substring(0, i) + mask.substring(i, i + 1) + inputValue.substring(i);
}
this.value = inputValue;
}
}
/**
* 페이지 초기화시에 언어 및 숫자형 입력 및 표현 처리.
* @param element : 이벤트를 셋팅할 element
*/
function initSetLetterType(element) {
element.style.imeMode = "disabled";
var charType = element.attributes['chartype'] ? element.attributes['chartype'].value : "";
if (charType == "eng") { // 영어만
element.onkeypress = setLetterEnglishOnly;
} else if (charType == "engnum") { // 영어 + 숫자
} else if (charType == "float") { // 실수형
element.onkeypress = setLetterFloatOnly;
} else if (charType == "int") { // 정수형
element.onkeypress = setLetterInteger;
} else if (charType == "onlynum") { // 오직 숫자만
element.onkeypress = setKeyInputNumberOnly;
} else if (charType == "money") { // 정수로만 된 아주 기본적인 금액 표시
element.style.textAlign = "right";
element.onkeydown = setKeydownMoney; // 키가 눌러졌을때
element.onkeyup = setKeypressMoney; // 키를 눌렀다 놓았을때
} else if (charType == "floatmoney") { // 실수로된 아주 기본적인 금액 표시
element.style.textAlign = "right";
element.onkeydown = setKeydownFloatMoney; // 키가 눌러졌을때
element.onkeyup = setFloatMoney; // 키를 눌렀다 놓았을때
} else {
element.style.imeMode = "active";
}
}
/**
* 사용자가 지정한 마스크업 스타일중 영어,숫자 혼합인 데이타의 mask를 지울때 사용 영어,숫자 이외의 문자 제거
*
ex : unMaskEngNum(String)
* @param data : 마스크가 있는 String
* @return 구분자를 제외한 String
*/
function unMaskEngNum(data) {
var accReg = new RegExp('([a-zA-Z0-9])');
var temp = "";
for (var i = 0; i < data.length; i++) {
if (accReg.test(data.substr(i,1)))
temp += data.substr(i,1);
}
return temp;
}
/**
* 문자열에서 숫자만 빼오기 체크 로직
* ex : getOnlyNumberFormat(form1.name.value)
* @param stringValue : 변환할 String 값
*/
function getOnlyNumberFormat(stringValue) {
if (!stringValue)
return "";
var temp = "";
var result = "";
for (var index = 0; index < stringValue.length; index++) {
temp = parseInt(stringValue.charAt(index), 10);
if (temp >= 0 || temp <= 9)
result += temp;
}
return result;
}
/**
* 중첩된 css에서 해당 css만 제거
*
removeClassName(["input1","input2"],"input1")
* @param classNameArray : 설정되어 있는 class 배열. (참고로 class는 class="input1 input2" 이런식으로 중복될수 있다.
* @param className : 제거할 class명
* @return 제거할 css가 제거된 스트링값
*/
function removeClassName(classNameArray, className) {
var resultClassNames = "";
for (var i = 0; i < classNameArray.length; i++)
if (className != classNameArray[i])
resultClassNames += classNameArray[i] + " ";
return resultClassNames;
}
/**
* 키 입력시 영어만 입력받기
*/
function setLetterEnglishOnly() {
var pKey = String.fromCharCode(event.keyCode);
var eReg = /[a-zA-Z]/g;
if (pKey != "\r" && !eReg.test(pKey)) //엔터키 및 regkey가 아닐경우 리턴
event.returnValue = false;
delete eReg;
}
/**
* 키 입력시 숫자 , . , - 값만 입력받음.
*/
function setLetterFloatOnly() {
var pKey = String.fromCharCode(event.keyCode);
var floatReg = /[0-9\\.\\-]/g;
if (pKey != "\r" && !floatReg.test(pKey)) //엔터 키 및 regkey가 아닐경우 리턴
event.returnValue = false;
delete floatReg;
}
/**
* 키 입력시 숫자,- 값만 입력받음.
*/
function setLetterInteger() {
var pKey = String.fromCharCode(event.keyCode);
var intReg = /[0-9\\-]/g;
if (pKey != "\r" && !intReg.test(pKey)) //엔터 키 및 regkey가 아닐경우 리턴
event.returnValue = false;
delete intReg;
}
/**
* 페이지 초기화시 -,숫자 입력받기( - 키코드값 189)
*/
function setKeydownMoney() {
if (event.shiftKey == true)
event.returnValue = false;
if ((event.keyCode >= 48 && event.keyCode <= 57) || (event.keyCode >= 96 && event.keyCode <= 105)) { //숫자 키코드값
return true;
} else {
// enter, tab, backspace 방향키(앞,뒤),delete는 예외처리
if(event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 37 || event.keyCode == 39 || event.keyCode == 189 || event.keyCode == 46)
return true;
event.returnValue = false;
}
return false;
}
/**
* 페이지 초기화 시에 금액 형태일 경우 키 입력시 금액 형태로 전환
*/
function setKeypressMoney() {
var ev = event.srcElement;
var tempV = ev.value;
if (tempV.length > 0) {
var stat = true;
while (stat) {
if (tempV.length > 0 && tempV.substring(0, 1) == 0)
tempV = tempV.substr(1);
else
stat = false;
}
}
var moneyReg = new RegExp('(-?[0-9]+)([0-9]{3})');
tempV = tempV.replace(/\,/g, "");
while (moneyReg.test(tempV))
tempV = tempV.replace(moneyReg, '$1,$2');
ev.value = tempV;
if (event.keyCode == 9)
ev.select();
}
/**
* 실수형 금액 입력제어 스크립트. 숫자 , . , - 값만 입력받음. 소수점 두째 자리까지만 입력됨
*/
function setKeydownFloatMoney() {
if (event.shiftKey == true)
event.returnValue = false;
var floatindex = event.srcElement.value.indexOf(".");
if (floatindex != -1) {
var floatNum = event.srcElement.value.substring(floatindex + 1);
if (event.keyCode == 8)
return;
else if (floatNum.length > 1)
event.returnValue = false;
}
if ((event.keyCode >= 48 && event.keyCode <= 57) || (event.keyCode >= 96 && event.keyCode <= 105)) { //숫자 키코드값
return true;
} else {
if (event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 37 || event.keyCode == 39 || event.keyCode == 189)
return true;
else if(event.keyCode == 190 && floatindex == -1)
return;
event.returnValue = false;
}
}
/**
* 키 입력시 float 타입의 금액 형태로 전환
*/
function setFloatMoney() {
var ev = event.srcElement;
var tempV = ev.value;
var floatnum = ""
if (tempV.indexOf(".") != -1) {
floatnum = tempV.substring(tempV.indexOf("."));
tempV = tempV.substring(0,tempV.indexOf("."));
}
var moneyReg = new RegExp('(-?[0-9]+)([0-9]{3})');
tempV = tempV.replace(/\,/g, "");
while(moneyReg.test(tempV)) {
tempV = tempV.replace(moneyReg, '$1,$2');
}
ev.value = tempV + floatnum;
if (event.keyCode == 9)
ev.select();
}