﻿/*
* 프로그램ID : HCC_Validation
* 프로그램명 : 유효성 검사
* 설      명 : 페이지 입력값에 대한 유효성 검사를 수행하는 스크립트.
* 최초작성자 : ST, 김보성
* 최초작성일 : 2010-04-13(화)
* 최종수정자 : 
* 최종수정일 : 
* 변경  내용 : 2010-04-13 최초 개발
*/


// 함 수 명	: validateForm()	
// 설 명	: 유효성 체크 로직
// 전달인수	: None
// 반 환 값	: None
function validateForm(arrObjDesc) {
    for (var i = 0; i < arrObjDesc.length; i++) {
        for (var j = 0; j < arrObjDesc[i].length; j++) {
            var objForm = document.all[arrObjDesc[i][j][0]];
            if (validateData(objForm, arrObjDesc[i][j][1], arrObjDesc[i][j][2]) == false) {
                if (objForm.type != "hidden" && objForm.disabled == false) {
                    objForm.focus();
                }
                event.returnValue = false;
                return false;
            }
        }
    }

    return true;
}

function validateFormNoEvent(arrObjDesc) {
    for (var i = 0; i < arrObjDesc.length; i++) {
        for (var j = 0; j < arrObjDesc[i].length; j++) {
            var objForm = document.all[arrObjDesc[i][j][0]];
            if (validateData(objForm, arrObjDesc[i][j][1], arrObjDesc[i][j][2]) == false) {
                if (objForm.type != "hidden" && objForm.disabled == false) {
                    objForm.focus();
                }
                return false;
            }
        }
    }

    return true;
}

function validateData(objValue, strValidateStr, strError) {
    var epos = strValidateStr.search("=");
    var command = "";
    var cmdvalue = "";

    if (epos >= 0) {
        command = strValidateStr.substring(0, epos);
        cmdvalue = strValidateStr.substr(epos + 1);
    }
    else {
        command = strValidateStr;
    }

    switch (command) {
        // 필수 입력  
        case "req":
        case "required":
            {
                var tp = objValue.value.replace(/\s/g, '');
                if (eval(tp.length) == 0) {
                    alert(strError);
                    return false;
                }
                break;
            }
            // 최대 길이 제한
        case "maxlen":
        case "maxlength":
            {
                if (eval(objValue.value.length) > eval(cmdvalue)) {
                    alert(strError);
                    return false;
                }
                break;
            }
            // 최소 길이 제한
        case "minlen":
        case "minlength":
            {
                if (eval(objValue.value.length) < eval(cmdvalue) && eval(objValue.value.length) != eval(0)) {
                    alert(strError);
                    return false;
                }
                break;
            }
            // 길이 고정 ( 주민등록번호는 무조건 13자리 이어야 한다.)
        case "equallen":
        case "equallength":
            {
                if (eval(objValue.value.length) != eval(cmdvalue)) {
                    alert(strError);
                    return false;
                }
                break;
            }
            // 값 비교 (비밀번호와 비밀번호 확인은 같은 값이어야 한다.)
        case "equalvalue":
            {
                if (objValue.value != document.all[cmdvalue].value) {
                    alert(strError);
                    return false;
                }
                break;
            }
            // 값 비교 (equalString=100 입력된값은 100과 같으면 에러. )
        case "equalString":
            {
                if (objValue.value == cmdvalue + "") {
                    alert(strError);
                    objValue.focus();
                    return false;
                }
                break;
            }
            // 영문만 입력 가능     
        case "eng":
        case "english":
            {
                var charpos = objValue.value.search("[^A-Za-z]");
                if (objValue.value.length > 0 && charpos >= 0) {
                    alert(strError);
                    return false;
                }
                break;
            }
            // 숫자만 입력 가능
        case "num":
        case "numeric":
            {
                var charpos = objValue.value.search("[^0-9\]");
                if (objValue.value.length > 0 && charpos >= 0) {
                    alert(strError);
                    return false;
                }
                break;
            }
            // 숫자, 소수점 숫자만 입력 가능
        case "float":
            {
                var count = 0;
                var numbers = objValue.value.split('.');
                for (count = 0; count < numbers.length; count++) {
                    var charpos = numbers[count].search("[^0-9\]");
                    if (numbers[count].length > 0 && charpos >= 0) {
                        alert(strError);
                        return false;
                    }
                }

                break;
            }
        case "NumComma":
            {
                var chars = ",0123456789";

                for (var inx = 0; inx < objValue.value.length; inx++) {
                    if (chars.indexOf(objValue.value.charAt(inx)) == -1)
                        return false;
                }
                return true;

                break;
            }
            // 0 , 0.00, 0.00.001(.이 여러개 나옴) 등 입력 불가능(숫자)
        case "NoZeroNum":
            {
                var objNumberI = objValue.value;
                objNumberI = objNumberI.replace('.', ''); //가장 처음 나오는 .만 지운다.

                //숫자 인지 검사            
                var charpos = objNumberI.search("[^0-9\]");
                if (objNumberI.length > 0 && charpos >= 0) {
                    alert(strError);
                    return false;
                }

                objNumberI = objNumberI.replace(/0/g, ''); //문자열에 0이 들어있으면 모두 지운다.
                if (objNumberI == '') {
                    alert(strError);
                    objValue.focus();
                    return false;
                }
                break;
            }
            // 날짜만 입력 가능
        case "date":
            {
                var objDate = objValue.value;
                if (objDate != "" && !validateDate(objDate)) {
                    alert(strError);
                    objValue.focus();
                    return false;
                }
                break;
            }
            // 한글만 입력 가능
        case "han":
        case "hangul":
            {
                var charpos = objValue.value.search("[^ㄱ-힣]");
                if (objValue.value.length > 0 && charpos >= 0) {
                    alert(strError);
                    return false;
                }
                break;
            }
            // 영문 또는 숫자만 입력 가능
        case "engnum":
        case "engnumeric":
            {
                var charpos = objValue.value.search("[^A-Za-z0-9]");
                if (objValue.value.length > 0 && charpos >= 0) {
                    alert(strError);
                    return false;
                }
                break;
            }
            // 한글, 숫자 입력 가능
        case "hannum":
        case "hangulnumeric":
            {
                var charpos = objValue.value.search("[^????-9]");
                alert(charpos);
                if (objValue.value.length > 0 && charpos >= 0) {
                    alert(strError);
                    objValue.select();
                    objValue.focus();
                    return false;
                }
                break;
            }
            // 한글, 영문 입력 가능
        case "hanalpha":
        case "hangulalphabetic":
            {
                var charpos = objValue.value.search("[^?????Za-z]");
                if (objValue.value.length > 0 && charpos >= 0) {
                    alert(strError);
                    return false;
                }
                break;
            }
            // 한글, 영문, 숫자 입력 가능
        case "hanengnum":
        case "hangulenglishnumeric":
            {
                var charpos = objValue.value.search("[^?????Za-z0-9]");
                if (objValue.value.length > 0 && charpos >= 0) {
                    alert(strError);
                    return false;
                }
                break;
            }
            // 특정 정규식  
        case "regexp":
            {
                if (objValue.value.length > 0) {
                    if (!objValue.value.match(cmdvalue)) {
                        alert(strError);
                        return false;
                    }
                }
                break;
            }
            // 이메일 주소
        case "email":
            {
                if (!validateEmailv2(objValue.value)) {
                    alert(strError);
                    return false;
                }
                break;
            }
            // 특정 값보다 작으면
        case "lt":
        case "lessthan":
            {
                if (isNaN(objValue.value)) {
                    return false;
                }
                if (eval(objValue.value) >= eval(cmdvalue)) {
                    alert(strError);
                    return false;
                }
                break;
            }
            // 특정 값보다 크면
        case "gt":
        case "greaterthan":
            {
                if (isNaN(objValue.value)) {
                    return false;
                }
                if (eval(objValue.value) <= eval(cmdvalue)) {
                    alert(strError);
                    return false;
                }
                break;
            }

            // 선택되지 않은 경우 (리스트 박스)
        case "dontselect":
            {
                if (objValue.selectedIndex == null) {
                    return false;
                }
                if (objValue.selectedIndex == eval(cmdvalue)) {
                    alert(strError);
                    return false;
                }
                break;
            }
            // 이미지 파일만 가능
        case "CheckImgFile":
            {
                if (objValue.value.length > 0) {
                    var index = objValue.value.lastIndexOf(".");
                    var strExt = objValue.value.substr(index);

                    if (strExt.toLowerCase() != ".jpg" && strExt.toLowerCase() != ".gif" && strExt.toLowerCase() != ".png") {
                        alert(strError)
                        return false;
                    }
                }
                break;
            }
            // 선택되지 않은경우
        case "checked":
            {
                if (objValue.checked == false) {
                    alert(strError);
                    return false;
                }
                break;
            }
            // 리스트박스에 값이 하나도 없는 경우
        case "listbox":
            {
                if (objValue.all[0] == null) {
                    alert(strError);
                    return false;
                }
                break;
            }
            // 아이피 주소
        case "ipaddress":
            {
                if (objValue.value != "") {
                    var ipaddress = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;
                    var check = ipaddress.exec(objValue.value);

                    if (!check) {
                        alert(strError);
                        return false;
                    }
                }
                break;
            }
            // 포트
        case "port":
            {
                var port = /^(6553[0-5]|655[0-2][0-9]|65[0-4][0-9][0-9]|6[0-4][0-9][0-9][0-9]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9])$/;
                var check = port.exec(objValue.value);

                if (!check) {
                    alert(strError);
                    return false;
                }
                break;
            }
            // URL
        case "url":
            {
                var ser = "http://";
                var str = objValue.value.toLowerCase();

                if (str == "")
                    return true;


                if (str.search(ser) == -1) {
                    alert(strError)
                    return false;
                }
                else {
                    return true;
                }
                break;
            }
        case "bytemaxlen":
            {
                if (eval(GetByte(objValue.value)) > eval(cmdvalue)) {
                    alert(strError);
                    return false;
                }
                break;
            }
        case "selectedindex":
            {   
                if (cmdvalue != "-1") {
                    if (objValue[cmdvalue].selected == true) {
                        alert(strError);
                        return false;
                    }
                }
                break;
            }
    }
    return true;
}



/*
'-------------------------------------------------------------------------------------------------------------------------------------------
' 날짜 유효성 체크 함수
validateDate('20050101');
'-------------------------------------------------------------------------------------------------------------------------------------------
*/

var numb = '0123456789';
var mth = new Array('', 'january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december');
var day = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

function isValid(parm, val) {
    if (parm == "")
        return true;
    for (i = 0; i < parm.length; i++) {
        if (val.indexOf(parm.charAt(i), 0) == -1)
            return false;
    }
    return true;
}

function isNum(parm) {
    return isValid(parm, numb);
}

// 날짜 체크 함수
function validateDate(v_date) {
    v_date = v_date.replaceAll('/', '');
    v_date = v_date.replaceAll('-', '');
    v_date = v_date.replaceAll('.', '');

    if (v_date.length != 8)
        return false;

    if (!isNumberOnly(v_date))
        return false;

    if (!(isDate(v_date.substr(0, 4), v_date.substr(4, 2), v_date.substr(6, 2)))) return false;

    return true;
}

// 정확한 날짜형 체크 함수
function isDate(yyyy, mm, dd) {
    yyyy = parseInt(yyyy, 10);
    mm = parseInt(mm, 10);
    dd = parseInt(dd, 10);
    d = new Date(yyyy, mm - 1, dd);
    if (d == "NaN") return false;
    if (yyyy == d.getFullYear() && mm == d.getMonth() + 1 && dd == d.getDate()) return true;
    return false;
}

// 숫자값 체크 함수
function isNumberOnly(v_int) {
    for (var i = 0; i < v_int.length; i++) {
        if ((v_int.charAt(i) < '0') || (v_int.charAt(i) > '9')) return false;
    }
    return true;
}

// ReplaceAll 함수
String.prototype.replaceAll = function () {
    return this.split(arguments[0]).join(arguments[1])
}



// 함 수 명	: ChkCurrency()
// 설    명 : Focus가 떠날때 숫자인지 비교한다.
//            Control의 onblue 시에 사용한다.
//            mode가 true이면 ,를 사용하고 false이면 ,를 사용하지 않는다.
function ChkCurrency(str, mode) {
    var tmpVal = str;
    var pointIndex;
    var negative = ""; // 부호 처리

    if (tmpVal.substr(0, 1) == "-") {
        negative = "-"; // -부호 입력 여부 확인
    }

    while (tmpVal.search(/\./) != -1)
        tmpVal = tmpVal.replace(/\./, "");

    while (tmpVal.search(/[^0-9\.]/) != -1)		// 잘못된 문자열 제거
        tmpVal = tmpVal.replace(/[^0-9\.]/, "");

    if (tmpVal != "" && mode == true) {
        tmpVal = formatNumbers(tmpVal)
    }

    return negative + tmpVal;
}

// 함 수 명	: ChkFloat()
// 설    명 : 소숫점 입력 유효성 검사
//            100을 넘을 수 없으며, 소수점 2째 자리까지 허용
function ChkFloat(objValue) {
    var count = 0;
    var numbers = objValue.value.split('.');
    var tmpVal1 = "";
    var tmpVal2 = "";
    var retValue = "";

    if (numbers.length < 3) {
        for (count = 0; count < numbers.length; count++) {
            switch (count) {
                case 0: tmpVal1 = ChkCurrency(numbers[count], false); break;
                case 1: tmpVal2 = ChkCurrency(numbers[count], false); break;
            }
        }

        if (tmpVal1.length > 0 && tmpVal2.length == 0) {
            // 정수부만 입력했을 경우
            retValue = tmpVal1 + ".00";
        }
        else if (tmpVal1.length == 0 && tmpVal2.length == 0) {
            return "";
        }
        else {
            // 실수부 입력을 세자리 이상 입력했을 경우 2자리를 제외한 나머지는 삭제
            if (tmpVal2.length > 2) {
                tmpVal2 = tmpVal2.substr(0, 2);
            }

            if (tmpVal1.length == 0) {
                tmpVal1 = 0;
            }

            retValue = tmpVal1 + "." + tmpVal2;
        }

        if (retValue > 100) {
            alert("입력값은 100을 초과할 수 없습니다.");
            objValue.focus();
            return "";
        }
        else {
            return retValue;
        }

    }
    else {
        alert("잘못된 입력값 입니다.");
        objValue.focus();
        return "";
    }
}

// 함 수 명	: OverChkFloat()
// 설    명 : 소숫점 입력 유효성 검사
//            소수점 2째 자리까지 허용
function OverChkFloat(objValue) {
    var count = 0;
    var numbers = objValue.value.split('.');
    var tmpVal1 = "";
    var tmpVal2 = "";
    var retValue = "";

    if (numbers.length < 3) {
        for (count = 0; count < numbers.length; count++) {
            switch (count) {
                case 0: tmpVal1 = ChkCurrency(numbers[count], false); break;
                case 1: tmpVal2 = ChkCurrency(numbers[count], false); break;
            }
        }

        if (tmpVal1.length > 0 && tmpVal2.length == 0) {
            // 정수부만 입력했을 경우
            retValue = tmpVal1 + ".00";
        }
        else if (tmpVal1.length == 0 && tmpVal2.length == 0) {
            retValue = "";
        }
        else {
            // 실수부 입력을 세자리 이상 입력했을 경우 2자리를 제외한 나머지는 삭제
            if (tmpVal2.length > 2) {
                tmpVal2 = tmpVal2.substr(0, 2);
            }

            if (tmpVal1.length == 0) {
                tmpVal1 = 0;
            }

            retValue = tmpVal1 + "." + tmpVal2;
        }
    }
    else {
        alert("잘못된 입력값 입니다.");
        objValue.focus();
        retValue = "";
    }

    return retValue;
}

//숫자가 아닌 값들은 제거한다.
function RemoveLiteral(field) {
    var strNumber = "";

    for (i = 0; i < field.length; i++) {
        if ((parseInt(field.slice(i, i + 1), 10) >= 0 && parseInt(field.slice(i, i + 1), 10) <= 9)) {
            strNumber += field.slice(i, i + 1);
        }
    }

    return strNumber;
}

// 숫자형 세자리마다 ','를 찍어준다.
function formatNumbers(value) {
    var returnVal;
    var tmpVal;
    var headCnt;

    tmpVal = value;

    headCnt = (tmpVal.length) % 3; // 앞자리 수

    if (headCnt > 0) {
        returnVal = tmpVal.substr(0, headCnt);
        tmpVal = tmpVal.substr(headCnt, tmpVal.length - headCnt);
    }
    else
        returnVal = "";

    while (tmpVal.length > 0) {
        returnVal += (returnVal == "" ? "" : ",");
        returnVal += tmpVal.substr(0, 3);
        tmpVal = tmpVal.substr(3, tmpVal.length - 3);
    }

    //음수인 경우 -,111,111과 같이 넘어오는 것을 -111,111형식으로 바꾸어주기 위함.	
    if ((returnVal.substr(0, 1) == "-") && (returnVal.substr(1, 1) == ",")) {
        returnVal = "-" + returnVal.substr(2, returnVal.length - 2);
    }

    return returnVal;
}


// 텍스트 입력 문자 길이 제한
// 초과된 문자열은 삭제 한다.
function CheckLentghStrgin(item, itemlength) {
    if (item.value.length > itemlength) {
        alert("최대 입력 길이(" + itemlength + "자)를 초과하였습니다. 초과된 문자열은 삭제됩니다.");
        item.value = item.value.substring(0, itemlength);
        return false;
    }

    return true;
}





// Email 포맷 
function validateEmailv2(email) {
    if (email.length <= 0) {
        return true;
    }
    var splitted = email.match("^(.+)@(.+)$");
    if (splitted == null) return false;
    if (splitted[1] != null) {
        var regexp_user = /^\"?[\w-_\.]*\"?$/;
        if (splitted[1].match(regexp_user) == null)
            return false;
    }
    if (splitted[2] != null) {
        var regexp_domain = /^[\w-\.]*\.[A-Za-z]{2,4}$/;
        if (splitted[2].match(regexp_domain) == null) {
            var regexp_ip = /^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
            if (splitted[2].match(regexp_ip) == null) return false;
        }
        return true;
    }
    return false;
}

