2014년 9월 23일 화요일

[js] validation

function js_validateForm_fw(formObj) {
 this.form = formObj;            // 대상폼 폼
 checkAll(formObj) ;  
}

// 전체 폼 체크
function checkAll(formObj) {

    return this.checkAllInput(formObj) && this.checkAllSelect(formObj) && this.checkAllTextarea(formObj);
}

function checkAllInput(formObj) {
 this.form = formObj;
    for (var i=0; i< this.form.elements.length; i++) {
        if (this.form.elements[i].tagName == "INPUT") {
         if (this.form.elements[i].type != "hidden"){
          if ( !this.checkObject(this.form.elements[i])) return false;
         }
        }        
    }
    return true;
}
function checkAllSelect () {
    for (var i=0; i< this.form.elements.length; i++) {
        if (this.form.elements[i].tagName == "SELECT") {
            if ( !this.checkObject(this.form.elements[i])) return false;
        }
    }
    return true;
}

function checkAllTextarea() {
    for (var i=0; i< this.form.elements.length; i++) {
        if (this.form.elements[i].tagName == "TEXTAREA") {
            if ( !this.checkObject(this.form.elements[i])) return false;
        }
    }
    return true;
}
// 하나의 입력항목에 대한 체크
function checkObject (eleObj) {
    // var lio = eleObj.name.lastIndexOf(":");
    // id를 있다면 ID 기반으로 없다면 name 기반으로 옵션 체크를 한다.
    var splitName = (isNullObject(eleObj.id) ? eleObj.name.split(":") : eleObj.id.split(":") );
    var objValue  = eleObj.value;
    this.message = new Dictionary();
    this.message.put(   "m"       , "을 입력해주십시오.");
    this.message.put(   "/"       , "입력값이 지정된 형식과 일치 하지 않습니다.");
    this.message.put(   "f"       , "입력값이 실수형이 아닙니다.");
    this.message.put(   "i"       , "은 숫자를입력해 주십시오.");
    this.message.put(   "l"       , "입력값이 Long형이 아닙니다.");
    this.message.put(   "H"       , "입력값은 한글을 포함할 수 없습니다.");
    this.message.put(   "h"       , "입력값은 한글이 포함되어 있지 않습니다.");
    this.message.put(   "e"       , "Email 형식이 올바르지 않습니다.");
    this.message.put(   "y"       , "년도 형식이 올바르지 않습니다.");
    this.message.put(   "d"       , "날짜형식이 올바르지 않습니다.");
    if (splitName.length > 1) {
        // 해당 Object의 validation값 체크
        var objValidationFlag = true;

        for ( var j = 1; j < splitName.length ; j++) {
            switch (splitName[j].charAt(0) ) {
                // 필수 입력 처리
                case "m":
                    objValidationFlag = isMandatory(objValue);
                    break;

                // Regular 항목 체크
                case "/":
                    objValidationFlag = isEmpty(objValue) ? true : isSearch(objValue, splitName[j]);
                    break;

                // Float 체크
                case "f":
                    objValidationFlag = isEmpty(objValue) ? true : isFloat(objValue);
                    break;

                // Int 체크
                case "i":
                    objValidationFlag = isEmpty(objValue) ? true : isInt(objValue);
                    break;

                // Long 체크
                case "l":
                    objValidationFlag = isEmpty(objValue) ? true : isLong(objValue);
                    break;

                // 한글이 포함되어 있는가 검사
                case "h":
                    objValidationFlag = isEmpty(objValue) ? true : isHangul(objValue);
                    break;

                // 한글이 포함되어 있지 않은가 체크
                case "H":
                    objValidationFlag = isEmpty(objValue) ? true : !isHangul(objValue);
                    break;

                // Email 체크
                case "e":
                    objValidationFlag = isEmpty(objValue) ? true : isEmail(objValue);
                    break;

                // 년도체크
                case "y":
                    objValidationFlag = isEmpty(objValue) ? true : isYear(objValue);
                    break;
                   
                // 날짜체크
                case "d":
                    objValidationFlag = isEmpty(objValue) ? true : isDate(objValue);
                    break;                      
            }
           
            if(!objValidationFlag) {
                var msg = "[" + (isNullObject(eleObj.alt) ? splitName[0] : eleObj.alt) + "]";
                msg += "\n" + this.message.get(splitName[j].charAt(0));
                alert(msg);
                try{eleObj.focus();} catch (e) {}
                return false;  
            }
        }

        // 존재하는가 체크
        var intendedObj = document.getElementsByName(splitName[0])[0];
        if (isNullObject(intendedObj)) {
            // input 타입의 새로운 객체 생성
            var newObj = document.createElement("input");
            newObj.type  = "hidden";
            newObj.name  = splitName[0];
            newObj.id    = splitName[0];
            newObj.value = objValue

            this.form.appendChild(newObj);
        } else {
            // TODO: 동일 이름의 객체가 두개 이상일 수 있다.
            // - 지금은 하나만 만든다.
            intendedObj.value = objValue
        }
       
    }

    return true;
}
function check_m(el) {
    return isMandatory(el) ;
}

function isMandatory(el) {
    return (el == "" || el == null) ? false : true;
}

function isSearch(el, pattern) {
    eval("var fm = " + pattern + ";");
    var p = el.search(fm);
    return (p == -1 ? false : true);  
}

function isFloat(el) {
    if (isNaN(parseFloat(el))) {
        return false;
    }
    return true;
}

function isInt(el) {
    if (isNaN(parseInt(el)) ||
        (parseInt(el) != parseFloat(el))) {
        return false;
    }
    return true;
}

function isLong( el) {
    return isInt(el);
}

function isNullObject(el){
    return (el == "undefined" || el==null) ? true : false;
}

function isEmpty(el){
    return ( el == null  || el == "" ) ? true : false;
}

function isEmail(el) {
    var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i

    return (el.search(filter) == -1 ? false : true);
}

// 한글 체크하는것이 아니라 유니코드체크하는것이네.. 쩝.. ^^;;
// 머 크게 문제는 없겠지...
function isHangul(el) {
    return (escape(el).search(/%u/i) == -1 ? false : true );
}

function trim(str){
     return str.replace(/(^\s*)|(\s*$)/ig, "");
 }

function isYear(str) {
    return isSearch(str, "/^\d{0,4}$/i");      // <- /^\d{4}$/i
}

function isDate(str) {
    return isSearch(str, "/^(\d{1,4})\\/((0[1-9])|(1[0-2]))\\/((0[1-9])|([1-2][0-9])|(3[0-1]))$/i");
}



function Dictionary () {
    this.nodeObject = new Object();
    this.count=0;


    this.put = function (key, value) {
        obj = this.nodeObject;
        this.searchFlag = 0;

        var addFlag = true;
        for(var n in obj) {
            if(n == key) {
                obj[key] = value;
                addFlag = false;
            }
        }

        if(addFlag) {
            obj[key] = value;
            this.count++;
        }
    }

    this.get = function(key) {
        obj = this.nodeObject;

        return obj[key];
    }

    this.keys = function(){
        return this.nodeObject;
    }

    this.del = function(key){
        this.put(key, null);
        this.count--;
    }
   
    this.size = function(){
        return this.count;
    }
}

댓글 없음:

댓글 쓰기