function validate(form) {

	for (var i = 0; i < form.elements.length; i++ ) {
		var el = form.elements[i];
		if (el.tagName == "FIELDSET") continue;
		el.value = el.value.strip();

        var required = el.getAttribute("REQUIRED");
		var minimum = el.getAttribute("MINIMUM");
		var maximum = el.getAttribute("MAXIMUM");
		var option = el.getAttribute("OPTION");
		var confirm = el.getAttribute("CONFIRM");
		var glue = el.getAttribute("GLUE");
        var pattern = el.getAttribute("PATTERN");

        if(el.type != "checkbox" && el.type != "radio"){

            if (required != null) {
                if (el.value == null || el.value == "") {
                    return doError(el, appMessage.NO_BLANK);
                }
            }

            if (minimum != null) {
				var temp = new String(el.value);
                if (temp.bytes() < parseInt(minimum)) {
                    return doError(el, appMessage.TOO_SHORT.replace("{n}", minimum));
                }
            }

            if (maximum != null && el.value != "") {
                var len = 0;
                if (el.value.bytes() > parseInt(maximum)) {
                    return doError(el, appMessage.TOO_LONG.replace("{n}", maximum));
                }
            }

            if (confirm && (el.value != form.elements[confirm].value)) return doError(el, appMessage.NOT_MATCH);


            if (option != null && el.value != "") {
                if (el.getAttribute('SPAN') != null) {
                    var _value = new Array();
                    for (span=0; span<el.getAttribute('SPAN');span++ ) {
                        _value[span] = form.elements[i+span].value;
                    }
                    var value = _value.join(glue == null ? '' : glue);
                    if (!checkPattern(value,option,pattern)) return doError(el, appMessage.INVALID);
                } else {
                    if (!checkPattern(el.value,option,pattern)) return doError(el, appMessage.INVALID);
                }
            }

        }else{

            if(required != null || minimum != null || maximum != null){

                var checkCnt = 0;

                var temp = form[el.name];
                for(var k=0;k<temp.length;k++){
                    if(temp[k].checked)
                        checkCnt++;
                }

                if(required != null && checkCnt == 0)
                    return doError(el, appMessage.NO_BLANK);

                if(minimum != null && checkCnt < minimum)
                    return doError(el, appMessage.TOO_LITTLE.replace("{n}", minimum));

                if(maximum != null && checkCnt > maximum)
                    return doError(el, appMessage.TOO_MANY.replace("{n}", maximum));

                i += (temp.length-1);

            }

        }

	}

	return true;
}



function doError(el, type, action) {

	var name = (hname = el.getAttribute("HNAME")) ? hname : el.getAttribute("NAME");

	alert(type.replace("{name}", name));
	if (action == "sel") {
		el.select();
	} else if (action == "del")	{
		el.value = "";
	}
	if(el.type == "text" || el.type == "password")el.focus();
	return false;
}	



// 형식 체크
function checkPattern(val, pattName, custPatt) {

    switch(pattName){

        case "SSN":
            return checkSSN(val);

        case "Custom":
            var reg = new RegExp(custPatt);
            if(!reg.test(val))
                return false;

            break;

        default:
            var regNum =/^[0-9]+$/;
            var regPhone =/^[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}$/;
            var regPostno =/^[0-9]{3}-[0-9]{3}$/;
            var regMail =/^[\._a-zA-Z0-9-]+@[._a-zA-Z0-9-]+\.[a-zA-Z]+$/;
            var regDomain =/^[.a-zA-Z0-9-]+.[a-zA-Z]+$/;
            var regUrl =/^[.a-zA-Z0-9-]+.[a-zA-Z]+$/;
            var regAlpha =/^[a-zA-Z]+$/;
            var regEnglishName =/^[a-zA-Z\s]+$/;
            var regHost =/^[a-zA-Z-]+$/;
            var regHangul =/[가-힣]/;
            var regHangulEng =/[가-힣a-zA-Z]/;
            var regHangulOnly =/^[가-힣]*$/;
            var regId = /^[a-zA-Z]{1}[a-zA-Z0-9_-]{4,30}$/;
            var regDate =/^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}$/;

            if(!eval("reg"+ pattName).test(val))
                return false;

    }

    return true;

}


function checkSSN(ssn) {

    // 주민번호의 형태와 7번째 자리(성별) 유효성 검사
    fmt = /^\d{6}-[123456]\d{6}$/;
    if (!fmt.test(ssn)) {
        return false;
    }

    // 날짜 유효성 검사
    birthYear = (["1", "2", "5", "6"].include(ssn.charAt(7))) ? "19" : "20";
    birthYear += ssn.substr(0, 2);
    birthMonth = ssn.substr(2, 2) - 1;
    birthDate = ssn.substr(4, 2);
    birth = new Date(birthYear, birthMonth, birthDate);

    if ( birth.getYear() % 100 != ssn.substr(0, 2) || birth.getMonth() != birthMonth || birth.getDate() != birthDate) {
        return false;
    }

    // Check Sum 코드의 유효성 검사
	if(["1", "2", "3", "4"].include(ssn.charAt(7))){
		buf = new Array(13);
		for (i = 0; i < 6; i++) buf[i] = parseInt(ssn.charAt(i));
		for (i = 6; i < 13; i++) buf[i] = parseInt(ssn.charAt(i + 1));

		multipliers = [2,3,4,5,6,7,8,9,2,3,4,5];
		for (i = 0, sum = 0; i < 12; i++) sum += (buf[i] *= multipliers[i]);

		if ((11 - (sum % 11)) % 10 != buf[12]) {
			return false;
		}
	}

    return true;

}



function populate(year, month, day) {

    timeA = new Date(year.options[year.selectedIndex].text, month.options[month.selectedIndex].value,1);
    timeDifference = timeA - 86400000;
    timeB = new Date(timeDifference);
    var daysInMonth = timeB.getDate();

    day.options.length = daysInMonth.length;
    for (var i = 0; i < daysInMonth; i++) {
        day.options[i] = new Option(i+1, i+1);
    }

}


function setYears(selectBox, years) {

    for (var i = 0; i < years.length; i++) {
        selectBox.options[i] = new Option(years[i], years[i]);
    }

}

function setMonths(selectBox, months) {

    for (var i = 0; i < months.length; i++) {
        selectBox.options[i] = new Option(months[i], months[i]);
    }

}


function txtLengthIndicator(objTarget, objDisplayer){

	objDisplayer.value = (objTarget.value.bytes() + " bytes");

}



function keyFilter_onlyNumbers(e){

    var event = e ? e : window.event;

    var pattern = /[0-9]|\x09|\x08|[\x61-\x6a]|[\x25-\x28]/;
    if(!pattern.test(String.fromCharCode(event.keyCode)))
        return false;

}