/***********************************************************
 * AutoValidator
 *   Kim, Kang Seok (drkimks@tomatosystem.co.kr)
 *   yb2u (modify, yb2u@yb2u.com)
 *   zzang (modify, dgroups@tomatosystem.co.kr)
 *
 *   개정이력
 *   AutoValidation
 *   2002.11.26 version 1.1
 *   2003.01.08 version 1.2
 *   2003.01.23 version 1.3
 *   2003.01.29 version 1.4
 *   2003.02.06 version 1.5
 *   2003.03.06 version 1.6
 *   2003.05.28 version 1.6.1
 *   2004.03.22 rename AutoValidator 1.0
 *   2005.03.30 version 1.6.2
 *
 *   Tomato System
 *
 ***********************************************************/

/***********************************************************
 * Usage
 *
 *   AutoValidate(FormObject)
 *
 *   <JavaScript>
 *   if (AutoValidate(FormObject) == false)
 *       return;
 *
 *   <Tags>
 *   title="이름" kind="number" notnull="true" minlength="4" maxlength="10" number="(x,y)"
 *
 *   <kind>
 *      text (default)
 *      number
 *      numberminus
 *      float
 *      money
 *      alphanumeric
 *      korean
 *      ascii
 *      alphabet
 *      date : sep="([.]|[/]|[-]|[\s]|[\,])?"
 *      year month day : group="SameName"
 *      ssn : sep="([-]|[\s])?"
 *      ssn1 ssn2 : group="SameName"
 *      email
 *      nohanmail
 *
 *    <number>
 *     x자리수 중에서 y자리수 만큼의 소수점을 입력한다. x-y 자리수만큼 정수를 입력한다.
 * 
 *    <적용가능한 Tags>
 *    input (text/password)
 *    textarea
 *    select
 *
 ***********************************************************/

/***********************************************************
 * Configuration
 ***********************************************************/

//var isDebug = true;
var isDebug = false;
var undefined = null;

/***********************************************************/

function AutoValidate(FormObject) {

//        if (isDebug) alert('step 1');

    var varLength = FormObject.elements.length;
    for (var i = 0; i < varLength; i++) {
		
        var obj         = FormObject.elements[i];
        var value       = obj.value;
        var kind        = obj.kind;
        var group       = obj.group;
        var notnull     = obj.notnull;
        var minlength   = obj.minlength;
        var maxlength   = obj.maxlength;

		var numeric     = obj.number;

		var oneselect	= obj.oneselect;

	//	alert(oneselect + "=============" + obj.name);
     
        /******************************************
         * Not Null Check
         ******************************************/
        // 속성에 대한 Validation 체크 유무
        var blnCheckAttr = true;

        if (notnull == 'true') {
            blnCheckAttr = true;

            if (value == '') {
                return alertError(obj, 'notnull');
            }
        } else {
            if (value == '') {
                blnCheckAttr = false;
            } else {
                blnCheckAttr = true;
            }
        }

		if (oneselect == 'true')
		{
			blnCheckAttr = true;
			if (obj.selectedIndex == 0)
			{
				return alertError(obj, 'oneselect');
			}
		} else {
            if (value == '') {
                blnCheckAttr = false;
            } else {
                blnCheckAttr = true;
            }
        }

        if (blnCheckAttr) {
            /******************************************
             * Min Length Check
             ******************************************/
            if (minlength != '') {
                
                var length = getLength(value);
                if (length < minlength) {
                    return alertError(obj, 'minlength');
                }
            }

            /******************************************
             * Max Length Check
             ******************************************/
            if (maxlength != '') {
                var length = getLength(value);
                if (length > maxlength) {
                    return alertError(obj, 'maxlength');
                }
            }
			
            /******************************************
             * numeric=(x,x) Check
             * alertmessage처리의 불편에 의해 여기서 처리한다. 
             ******************************************/
			if(numeric+'' != 'undefined' && numeric != '')
			{
                var cnt=0;
                var delCnt=0;
                var flag= false;
                var sMode=obj.number

                var sValue= obj.value;
                var FirstNum = sMode.substring(1,sMode.indexOf(","));
                var LastNum =sMode.substring(sMode.indexOf(",")+1, sMode.indexOf(")"));
                var IntNum =eval(FirstNum) - eval(LastNum)

                for(j=0;j<sValue.length;j++){
                    if('.' == sValue.charAt(j)){
                        delCnt++;
                        flag= true;
                    }
                }
                if(flag){
                    var title     = obj.title;
                    
                    var endValue = sValue.substring(sValue.indexOf(".")+1, sValue.length);

                    if (delCnt>1) { 
                        return alertMessageError(obj, obj.title +'의 유효성 검사중 오류가 발생하였습니다.');
                    }

                    if (endValue && (endValue.length > eval(LastNum)) ) {
                        return alertMessageError(obj, obj.title +'은(는) 소숫점자리수('+LastNum+'자)를 초과했습니다.');
                    }
 
//                    if ((sValue.length - endValue.length) < (parseInt(FirstNum) +1)) {
                    if ((sValue.length - endValue.length-1) > IntNum) {
                        return alertMessageError(obj, obj.title +'은(는) 정수자리수('+IntNum+ '자)를 초과했습니다.');
                    }

                } else {
					//alert(':IntNum='+IntNum);
					//alert('sValue.length='+sValue.length+':eval(IntNum)='+eval(IntNum)); 
                    if (sValue.length > eval(IntNum) ) {
                        return alertMessageError(obj, obj.title +'은(는) 정수자리수('+IntNum+ '자)를 초과했습니다.');
                    }
                }
            }

            /******************************************
             * Kind Check
             *
             * Kind Type
             *   number
             *   numberminus
             *   float
             *   money
             *   alphanumeric
             *   alphabet
             *   korean (2 bytes)
             *   ascii
             *   date
             *   compareDate
             *   year month day
             *   email
             *   nohanmail
             *   ssn
             *   ssn1 ssn2
             *
             ******************************************/

            if (kind == '')
                continue;

            // 숫자 입력태그인 경우
            if (kind == 'number') {
                if (isNumber(value) == false) {
                    return alertError(obj, 'number');
                }

            // - 숫자 입력태그인 경우
            } else if (kind == 'numberminus') {
                if (isNumberMinus(value) == false) {
                    return alertError(obj, 'numberminus');
                }

            // float 입력태그인 경우
            } else if (kind == 'float') {
                if (isFloat(value) == false) {
                    return alertError(obj, 'float');
                }

            // Money 입력태그인 경우
            }  else if (kind == 'money'){
                if (isMoney(value) == false) {
                    return alertError(obj, 'money');
                }

            // 영문자 입력태그인 경우
            }  else if (kind == 'alphanumeric') {
                if (isAlphaNumeric(value) == false) {
                    return alertError(obj, 'alphanumeric');
                }

            // 영문자 입력태그인 경우
            } else if (kind == 'alphabet') {
                if (isAlphabet(value) == false) {
                    return alertError(obj, 'alphabet');
                }

            // 한글(2 bytes) 입력태그인 경우
            } else if (kind == 'korean') {
                if (isKorean(value) == false) {
                    return alertError(obj, 'korean');
                }

            // ASCII 문자만 입력받는 경우
            } else if (kind == 'ascii') {
                if (isASCII(value) == false) {
                    return alertError(obj, 'ascii');
                }

            // Email 입력 태그인 경우
            } else if (kind == 'email') {
                if (isEmail(value) == false) {
                    return alertError(obj, 'email');
                } 

            // HanMail 체크
            } else if (kind == 'Email3') {
                if (isEmail(value) == false) {
                    return alertError(obj, 'Email3');
                } 
			
		    }else if (kind == 'nohanmail') {
                if (isEmail(value) == false) {
                    return alertError(obj, 'email');
                } else if (isHanMail(value)) {
                    return alertError(obj, 'hanmail');
                }

            // HanMail 체크 - 도메인만 체크하기(아이디와 도메인을 따로 입력받을때 사용)
            } else if (kind == 'nohanmail_domain') {
				/*
                if (isEmail_domain(value) == false) {
                    return alertError(obj, 'email');
                } else 
				*/
				if (isHanMail_domain(value)) {
                    return alertError(obj, 'hanmail');
                }

            // 주민등록번호 (6+7) 입력태그인 경우
            } else if (kind == 'ssn') {
                if (isSsn(obj, value, 1) == false) {
                    return alertError(obj, 'ssn');
                }

            /************************************
             * 날짜 입력 태그
             ************************************/

            // 날짜 입력 태그인 경우 (년+월+일)
            } else if (kind == 'date') {
                if (isDate(obj, value, 1) == false) {
                    return alertError(obj, 'date');
                }
                

            // 년도 하나만 받는 경우
    //        } else if (kind == 'year') {
    //            if (checkYear(value) == false) {
    //                return alertError(obj, 'year');
    //            }

            /**
             * 날짜 입력 Check
             *
             * 년도, 월, 일이 서로다른 입력태그로 입력되는 경우
             * 년도, 월, 일을 모두 받아서 날짜 검증
             * 이름에 다음과 같은 규칙이 반드시 있어야 한다.
             * 
             * kind="year"  name="strSomeFieldNameYear"  title="등록년도" notnull="true"
             * kind="month" name="strSomeFieldNameMonth" title="등록월"   notnull="true"
             * kind="day"   name="strSomeFieldNameDay"   title="등록일"   notnull="true"
             *
             * 총 5개 날짜까지 지원한다.
             */
            } else if (kind == 'year') {
                var dateValue = getDate(FormObject, group);

                if (isDate(obj, dateValue, 3) == false) {
                    return alertError(obj, 'date');
                }
    /*
            } else if (kind == 'month') {
                var dateValue = getDate(FormObject, group);

                if (isDate(dateValue) == false) {
                    return alertError(obj, 'date');
                }
            } else if (kind == 'day') {
                var dateValue = getDate(FormObject, group);

                if (isDate(dateValue) == false) {
                    return alertError(obj, 'date');
                }
    */
            /**
             * 주민등록번호 입력 Check
             *
             * 주민등록번호 앞뒤자리가 별도의 태그로 입력되는 경우
             * 명명규칙
             * kind="ssn1" group="SameName" title="주민등록번호", notnull="true"
             * kind="ssn2" group="SameName" title="주민등록번호", notnull="true"
             */
            } else if (kind == 'ssn1') {
                var ssnValue = getSsn(FormObject, group);

                if (isSsn(obj, ssnValue, 2) == false) {
                    return alertError(obj, 'ssn');
                }
    /*
            } else if (kind == 'ssn2') {
                var ssnValue = getSsn(FormObject, group);
                
                if (isSsn(ssnValue) == false) {
                    return alertError(obj, 'ssn');
                }
    */
            } else if (kind == 'phone') {
                if (isPhoneNumber(value) == false)
                {
                    return alertError(obj, 'phone');
                }
            } 


            
            /******************************************
             * Compare
             *
             *   <Compare_Attribute>
             *      eq : Equal
             *      ne : Not Equal
             *      gt : Great Then
             *      ge : Great/Equal
             *      lt : Less Then
             *      le : Less/Equal
             *
             *   <Tags>
             *   kind="number" (Compare_Attribute)="비교대상_name"
             ******************************************/

            var eq = obj.eq;
            var ne = obj.ne;
            var gt = obj.gt;
            var ge = obj.ge;
            var lt = obj.lt;
            var le = obj.le;

            if (eq == undefined)  eq = '';
            if (ne == undefined)  ne = '';
            if (gt == undefined)  gt = '';
            if (ge == undefined)  ge = '';
            if (lt == undefined)  lt = '';
            if (le == undefined)  le = '';

            var comp2Name = '';

            if      (eq != '')  comp2Name = eq;
            else if (ne != '')  comp2Name = ne;
            else if (gt != '')  comp2Name = gt;
            else if (ge != '')  comp2Name = ge;
            else if (lt != '')  comp2Name = lt;
            else if (le != '')  comp2Name = le;

            var comp1Value;
            var comp2Value;
            var comp2Title;

            if (comp2Name != '') {
                comp2Title = FormObject[comp2Name].title;

                if (kind == "number") {
                    comp1Value = parseInt(value);
                    comp2Value = parseInt(FormObject[comp2Name].value);
                } else if (kind == "numberminus") {
                    comp1Value = parseFloat(value);
                    comp2Value = parseFloat(FormObject[comp2Name].value);
                } else if (kind == "float") {
                    comp1Value = parseFloat(value);
                    comp2Value = parseFloat(FormObject[comp2Name].value);
                } else {
                    comp1Value = value;
                    comp2Value = FormObject[comp2Name].value;
                }
            }



            if (eq != '') {
                if (comp1Value != comp2Value) {
                    return alertCompError(obj, comp2Title, 'eq');
                }
            } else if (ne != '') {
                if (comp1Value == comp2Value) {
                    return alertCompError(obj, comp2Title, 'ne');
                }
            } else if (gt != '') {
                if (comp1Value <= comp2Value) {
                    return alertCompError(obj, comp2Title, 'gt');
                }
            } else if (ge != '') {
                if (comp1Value < comp2Value) {
                    return alertCompError(obj, comp2Title, 'ge');
                }
            } else if (lt != '') {
                if (comp1Value >= comp2Value) {
                    return alertCompError(obj, comp2Title, 'lt');
                }
            } else if (le != '') {
                if (comp1Value > comp2Value) {
                    return alertCompError(obj, comp2Title, 'le');
                }
            }
        }
        
    }
}



/******************************************************
 * 메시지 & 포커스 함수
 ******************************************************/
function alertError(obj, error) {
    var title     = obj.title;
    var minlength = obj.minlength;
    var maxlength = obj.maxlength;

    //if      (error == 'notnull'     ) alert(title + '을(를) 입력해 주세요.');
	if      (error == 'notnull'     ) alert('Please input your '+title + '.');
    //else if (error == 'minlength'   ) alert(title + '을(를) ' + minlength + '자 이상 적어주세요.');
	else if (error == 'minlength'   ) alert('Please enter at least '+ minlength +' characters for User ' + title +'.');
    //else if (error == 'maxlength'   ) alert(title + '은(는) ' + maxlength + '자를 넘을 수 없습니다.');
    //else if (error == 'number'      ) alert(title + '은(는) 숫자만 입력할 수 있습니다.');
    //else if (error == 'numberminus' ) alert(title + '은(는) -와 숫자만 입력할 수 있습니다.');
    //else if (error == 'float'       ) alert(title + '은(는) - . 와 숫자만 입력할 수 있습니다.');
    //else if (error == 'money'       ) alert(title + '은(는) ,와 숫자만 입력할 수 있습니다.');
    //else if (error == 'alphanumeric') alert(title + '은(는) 알파벳과 숫자만 입력할 수 있습니다.');
    //else if (error == 'alphabet'    ) alert(title + '은(는) 알파벳만 입력할 수 있습니다.');
    //else if (error == 'korean'      ) alert(title + '은(는) 한글만 입력할 수 있습니다.');
    //else if (error == 'ascii'       ) alert(title + '은(는) 한글을 입력할 수 없습니다.');
    //else if (error == 'date'        ) alert(title + '은(는) 잘못된 날짜 입니다.');
    //else if (error == 'email'       ) alert(title + '은(는) 잘못된 이메일 주소 입니다.');
    //else if (error == 'hanmail'     ) alert(title + '에 hanmail.net 또는 daum.net은 사용하실 수 없습니다.');
    //else if (error == 'ssn'         ) alert('잘못된 주민등록번호 입니다.');
    //else if (error == 'phone'       ) alert(title + '은(는) 잘못된 전화번호 입니다.');
    //else if (error == 'oneselect'   ) alert('The ' + title + ' is required filed. Please select value.');
    else                              alert('개발자님 ' + title + '의 유효성 검사중 문제가 발생했습니다.');
	
	if(obj.type != "select-one"){
		obj.focus();
	}
    

    return false;
}

function alertMessageError(obj, errorMsg) {
    alert(errorMsg);

    obj.focus();

    return false;
}

function alertCompError(obj, comp2Title, error) {
    var comp1Title = obj.title;

    if      (error == 'eq') alert(comp1Title + '와(과) ' + comp2Title + '은(는) 같아야 합니다.'      );
    else if (error == 'ne') alert(comp1Title + '와(과) ' + comp2Title + '은(는) 같으면 안 됩니다.'   );
    else if (error == 'gt') alert(comp1Title + '은(는) ' + comp2Title + ' 보다 커야 합니다.'         );
    else if (error == 'ge') alert(comp1Title + '은(는) ' + comp2Title + ' 보다 크거나 같아야 합니다.');
    else if (error == 'lt') alert(comp1Title + '은(는) ' + comp2Title + ' 보다 작아야 합니다.'       );
    else if (error == 'le') alert(comp1Title + '은(는) ' + comp2Title + ' 보다 작거나 같아야 합니다.');
    else                    alert('개발자님 ' + comp1Title + '와(과) ' + comp2Title + '의 유효성 검사중 문제가 발생했습니다.');

    obj.focus();

    return false;
}



/******************************************************
 * 주민등록번호 체크 함수
 ******************************************************/
function isSsn(obj, value, fieldCount) {
    var sep = obj.sep;
    if (sep == undefined) {
        sep = "";
    }

    var pattern = /^([0-9][0-9][0-1][0-9][0-3][0-9])([-]|[\s])?([1-4][0-9][0-9][0-9][0-9][0-9][0-9])$/g;

    if(pattern.test(value)) {
        var ssn1 = RegExp.$1;
        var ssn2 = RegExp.$3;

        if (fieldCount == 1) {
            obj.value = ssn1 + sep + ssn2;
        }

        return checkSsn(ssn1, ssn2);
    } else {
        return false;
    }
}


/******************************************************
 * Email 체크 함수
 ******************************************************/
function isEmail(value) {
    //var pattern = /^(\w+(?:\.\w+)*)@((?:\w+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
    //                 \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
    var pattern = /^[\w-]+([\\\.]+[\w-]*)?@([\w-]+\.)+[\w-]+$/i;
    return pattern.test(value);
    return true;
}
//아래는 도메인만 체크하기 위함. - 작성중
function isEmail_domain(value) {
//    var pattern = ([\w-]+\.)+[\w-]+$/i;
//    return pattern.test(value);
    return true;
}


/******************************************************
 * Han Mail 체크 함수
 ******************************************************/
function isHanMail(value) {
    var varDomain = value.substring(value.indexOf("@")+1).toLowerCase();
    if (varDomain == "hanmail.net") return true;
    return false;
}
//아래는 도메인만 체크하기 위함.
function isHanMail_domain(value) {
    if (value == "hanmail.net" || value == "daum.net") return true;
    return false;
}

/******************************************************
 * 전화번호 체크 함수
 ******************************************************/
function isPhoneNumber(value) {
    var varField = value.split("-");
    if (varField.length < 2 || varField.length > 3)
    {
        return false;
    }
    for (var i = 0; i < varField.length; i++)
    {
        if (isNumber(varField[i]) == false) {
            return false;
        }
    }
    return true;
}

/******************************************************
 * 날짜 체크 함수
 ******************************************************/
function isDate(obj, value, fieldcount) {
    var sep = obj.sep;
    if (sep == undefined) {
        sep = "";
    }

    var pattern = /^([1-2][0-9][0-9][0-9])([.]|[/]|[-]|[\s]|[\,])?([0-1][0-9]|[1-9])([.]|[/]|[-]|[\s]|[\,])?([0-3][0-9]|[1-9])$/g;
    
    if(pattern.test(value)) {
        var year  = RegExp.$1;
        var month = RegExp.$3;
        var day   = RegExp.$5;

        if (fieldcount == 1) {
            var printMonth;
            var printDay;

            if (month.length == 1)  printMonth = "0" + month;
            else                    printMonth = month;

            if (day.length   == 1)  printDay   = "0" + day;
            else                    printDay   = day;

            obj.value = year + sep + printMonth + sep + printDay;
        }

        return checkDate(year, month, day);
    } else {
        return false;
    }
}


/******************************************************
 * 길이 체크 함수
 ******************************************************/
function getLength(value) {
    var length = 0;
    var i = 0;
    while(true) {  
        var ch = escape(value.charAt(i++));
        if ( ch == "" || ch == null ) {
            break;
        }
        length  += strCharByte(ch);
    }
    return length;
}

/******************************************************
 * 한문자가 1 byte인지 2 bytes인지 체크하는 함수
 ******************************************************/
function strCharByte(chStr) {
    if (chStr.substring(0, 2) == "%u") {
        if (chStr.substring(2,4) == "00") {
            return 1; 
        } else {
            return 2; //한글 
        }
    } else if (chStr.substring(0,1) == "%") { 
        if (parseInt(chStr.substring(1,3), 16) > 127) {
            return 2; //한글 
        } else {
            return 1; 
        }
    } else {
        return 1;
    }
}


/******************************************************
 * 숫자 check 함수
 ******************************************************/
function isNumber(value) {
    for (var i=0; i < value.length; i++) {
        if (!('0' <= value.charAt(i) && value.charAt(i) <= '9')) {
            return false;
        }
    }
    return true;
}

/******************************************************
 * - 숫자 check 함수
 ******************************************************/
function isNumberMinus(value) {
    for (var i=0; i < value.length; i++) {
        if (!(('0' <= value.charAt(i) && value.charAt(i) <= '9') || value.charAt(i) == '-')) {
            return false;
        }
    }
    return true;
}

/******************************************************
 * - . 숫자 check 함수
 ******************************************************/
function isFloat(value) {
    for (var i=0; i < value.length; i++) {
        if (!(('0' <= value.charAt(i) && value.charAt(i) <= '9') || value.charAt(i) == '-' || value.charAt(i) == '.')) {
            return false;
        }
    }
    return true;
}

/******************************************************
 * - 숫자 check 함수
 ******************************************************/
function isMoney(value) {
    for (var i=0; i < value.length; i++) {
        if (!(('0' <= value.charAt(i) && value.charAt(i) <= '9') || value.charAt(i) == ',')) {
            return false;
        }
    }
    return true;
}

/******************************************************
 * 알파벳 check 함수
 ******************************************************/
function isAlphabet(value) {
    for (var i = 0; i < value.length; i++) {
        temp = value.substring(i, i+1);
        if (value.indexOf(temp) == -1) { 
            return false; 
        } else if (!(('a' <= temp && temp < 'z') ||
                     ('A' <= temp && temp < 'Z') ||
                     (' ' == temp))) {
            return false;
        }
    }
    return true;
}

/******************************************************
 * 알파벳 + 숫자 + 확장문자(-, _) check 함수
 ******************************************************/
/*
function isExtChar(value) {
    var extchar = '-_';
    extchar.charAt(i)

    for (var i = 0; i < value.length; i++) {
        temp = value.substring(i, i+1);
        if (value.indexOf(temp) == -1) { 
            return false; 
        } else if (!(('a' <= temp && temp < 'z') ||
                     ('A' <= temp && temp < 'Z') ||
                     (' ' == temp))) {
            return false;
        }
    }
    return true;
}   
*/


/******************************************************
 * 아스키문자로만 구성되어 있는지 Check
 ******************************************************/
function isASCII(value) {
    if (value.length == 0) {
        return false;
    }

    for (var i = 0; i < value.length; i++ ) {
        // blank : 32
        // ~ : 126
        if (' ' > value.charAt(i) || value.charAt(i) > '~') {
            return false;
        }
    }
    return true;
}

/******************************************************
 * 알파벳과 숫자로 구성되어 있는지 Check
 ******************************************************/
function isAlphaNumeric(value) {
    if (value.length == 0) {
        return false;
    }

    for (var i = 0; i < value.length; i++ ) {
        if (!(('a' <= value.charAt(i) && value.charAt(i) <= 'z') ||
              ('A' <= value.charAt(i) && value.charAt(i) <= 'Z') ||
              ('0' <= value.charAt(i) && value.charAt(i) <= '9') ||
              (' ' == value.charAt(i)) )) {
            return false;
        }
    }
    return true;
}

/******************************************************
 * 한글(2byte)인지 Check
 ******************************************************/
function isKorean(value) {
    var i = 0;
    while (true) {
        var varCh = value.charAt(i++);
        if ( varCh == "" || varCh == null ) {
            break;
        } else if (varCh == ' ') {
            continue;
        } else {
            var ch = escape(varCh);
            if (ch.substring(0, 2) == "%u") {
                if (ch.substring(2, 4) == "00") {
                    return false;
                }
            } else if (ch.substring(0, 1) == "%") {
                if (parseInt(ch.substring(1, 3), 16) <= 127) {
                    return false;
                }
            } else {
                return false;
            }
        }
    }
    return true;
}

/******************************************************
 * 주민등록번호 Check 함수
 ******************************************************/
function checkSsn(first, last) {

    var a1 = first.substring(0, 1);
    var a2 = first.substring(1, 2);
    var a3 = first.substring(2, 3);
    var a4 = first.substring(3, 4);
    var a5 = first.substring(4, 5);
    var a6 = first.substring(5, 6);
    var check_digit = a1 * 2 + a2 * 3 + a3 * 4 + a4 * 5 + a5 * 6 + a6 * 7;
    var b1 = last.substring(0, 1);
    var b2 = last.substring(1, 2);
    var b3 = last.substring(2, 3);
    var b4 = last.substring(3, 4);
    var b5 = last.substring(4, 5);
    var b6 = last.substring(5, 6);
    var b7 = last.substring(6, 7);
    check_digit = check_digit + b1 * 8 + b2 * 9 + b3 * 2 + b4 * 3 + b5 * 4 + b6 * 5;

    check_digit = check_digit % 11;
    check_digit = 11 - check_digit;
    check_digit = check_digit % 10;

    if (check_digit != b7) {
        return false;
    }
    return true;
}

/******************************************************
 * 날짜 Check 함수
 ******************************************************/
function checkDate(year, month, day) {

    if (checkYear(year) == false) {
        return false;
    }

    if (checkMonth(month) == false) {
        return false;
    }

    if (checkDay(day) == false) {
        return false;
    }

    var varYear  = Number(year);
    var varMonth = Number(month);
    var varDay   = Number(day);

    if (varDay > daysInMonth[varMonth]) {
        return false;
    }

    if (varMonth == 2 && varDay > daysInFebrary(varYear)) {
        return false;
    }

    return true;
}

function checkYear(year) {
    if (year == '') {
        return false;
    }
    if (isNumber(year) == false) {
        return false;
    }
    var varYear = Number(year);
    if (varYear < 1889 || varYear > 2100) {
        return false;
    }
    return true;
}

function checkMonth(month) {
    if (month == '') {
        return false;
    }
    if (isNumber(month) == false) {
        return false;
    }
    var varMonth = Number(month);
    if (varMonth < 1 || varMonth > 12) {
        return false;
    }
    return true;
}

function checkDay(day) {
    if (day == '') {
        return false;
    }
    if (isNumber(day) == false) {
        return false;
    }
    var varDay = Number(day);
    if (varDay < 1 || varDay > 31) {
        return false;
    }
    return true;
}

var daysInMonth = new Array(13);
daysInMonth[1]  = 31;
daysInMonth[2]  = 29;
daysInMonth[3]  = 31;
daysInMonth[4]  = 30;
daysInMonth[5]  = 31;
daysInMonth[6]  = 30;
daysInMonth[7]  = 31;
daysInMonth[8]  = 31;
daysInMonth[9]  = 30;
daysInMonth[10] = 31;
daysInMonth[11] = 30;
daysInMonth[12] = 31;

function daysInFebrary(year) { 
    return (year % 4 == 0 && (!(year % 100 == 0) || (year % 400 == 0)) ? 29 : 28); 
}


/******************************************************
 * 주민등록번호의 앞6자리와 뒤7자리가 다른 필드일때, 하나로 합친 ssn 필드 생성
 ******************************************************/
function getSsn(FormObject, groupValue) {
    var varLength = FormObject.elements.length;
    var ssn1Value = "";
    var ssn2Value = "";

    for (var i = 0; i < varLength; i++) {
        var obj   = FormObject.elements[i];
        var value = obj.value;
        var kind  = obj.kind;
        var group = obj.group;
        
        if (group == groupValue) {
            if      (kind == "ssn1")  ssn1Value = value;
            else if (kind == "ssn2")  ssn2Value = value;

            if (!(ssn1Value == "" || ssn2Value == "")) {
                return ssn1Value + ssn2Value;
            }
        }
    }

    return "";
}


/******************************************************
 * 날짜의 연, 월, 일이 각각 다른 필드일때, 하나로 합친 date 필드 생성
 ******************************************************/
function getDate(FormObject, groupValue) {
    var varLength = FormObject.elements.length;
    var yearValue  = "";
    var monthValue = "";
    var dayValue   = "";

    for (var i = 0; i < varLength; i++) {
        var obj   = FormObject.elements[i];
        var value = obj.value;
        var kind  = obj.kind;
        var group = obj.group;
        
        if (group == groupValue) {
            if      (kind == "year" )  yearValue  = value;
            else if (kind == "month")  monthValue = value;
            else if (kind == "day"  )  dayValue   = value;

            if (!(yearValue == "" || monthValue == "" || dayValue == "")) {
                return yearValue + monthValue + dayValue;
            }
        }
    }

    return "";
}

/******************************************************
 * 날짜 비교 (obj1은 obj2보다 항상 이른 날짜가 들어가게 하는 체크)
 ******************************************************/
function compareDate(obj1, obj2){
    var varReturn = false;

    if (isDate(obj1, obj1.value, 1) && isDate(obj2, obj2.value, 1)) {


        var sep1 = obj1.sep;
        var sep2 = obj2.sep;

        var varField1 = "";
        var varField2 = "";

        if (sep1 == undefined || sep1 == "") {
            varField1 = obj1.value.substring(0,4)+obj1.value.substring(4,6)+obj1.value.substring(6);
        } else {
            var varObj1 = obj1.value.split(sep1);

            varField1 = varObj1[0]+varObj1[1]+varObj1[2];
        }

        if (sep2 == undefined || sep2 == "") {
            varField2 = obj2.value.substring(0,4)+obj2.value.substring(4,6)+obj2.value.substring(6);
        } else {
            var varObj2 = obj2.value.split(sep2);

            varField2 = varObj2[0]+varObj2[1]+varObj2[2];
        }

        if (Number(varField1) < Number(varField2)){
            varReturn = true;
        }

    }
    return varReturn;
}

