﻿/*
 * Form Validation Check Script
 * 
 * Creator     : bugzzang ( http://bugzzang.com , bugzzang@gmail.com )
 * Create Date : 2008-05-16
 * License     : GPL
 *
 * ----------------------------------------------------------------
 * 
 * 1. script include
 *   - <script src="./bucheck.js"></script>
 * 2. form element 내에 attribute 형식으로 사용
 *   - <input type="text" name="userid" buRequire="true">
 *
 * # attribute
 * - buRequire    : 필수 입력 항목일때 사용 ( buRequire="true" )
 * - buValueType  : value 의 type 을 지정 ( buValueType="number" , [number, english, korean, numberenglish, numberenglishunderbar, email )
 * - buLabel      : alert 창에 표시할 항목명을 적어줍니다. ( buLabel="아이디" [default : name 속성] )
 * - buMinLangth  : 최소 글자수 ( buRequire="6" )
 * - buCheckCount : checkbox 의 최소 체크 수 ( buRequire="3" [default : 1] )
 * - buDropFirst  : select 의 첫번째 옵션은 seleced 로 보지 않음 ( buDropFirst="true" )
 *
 * -----------------------------------------------------------------
 *
 */


var BuCheck = function(){};

BuCheck.prototype.returnValue = {

    sMessage : '',
    oElement : null,
    bFlag    : true
}

BuCheck.prototype.setReturnValue = function( sMessage, oElement ){

    BuCheck.returnValue.sMessage = sMessage;
    BuCheck.returnValue.oElement = oElement;
}

BuCheck.prototype.trim = function( sText ){

    var pattern = /(^\s*)|(\s*$)/g;
    var sReturn = sText.replace(pattern, "");
    return sReturn;
}

BuCheck.prototype.checkForm = function( oForm ){

    var nLoopCount = oForm.elements.length;

    for(var i=0; i<nLoopCount; i++){

        var oElement = oForm.elements[i];

        var sRequire    = oElement.getAttribute('buRequire');
        var sValueType  = oElement.getAttribute('buValueType');
        var sLabel      = oElement.getAttribute('buLabel');
        var nMinLength  = oElement.getAttribute('buMinLength');
        var nCheckCount = oElement.getAttribute('buCheckCount');
        var sDropFirst  = oElement.getAttribute('buDropFirst');

        if(!sLabel){

            sLabel = oElement.name;
        }

        if(!nCheckCount){

            nCheckCount = 1;
        }

        if( sRequire && sRequire == 'true' ){

            switch( oElement.tagName ){

                case 'SELECT' :
                    var aOption  = oElement.getElementsByTagName('option');
                    var bSelected = false;

                    for(var k=0; k<aOption.length; k++){

                        if( aOption[k].selected == true ){
                            bSelected = true;
                        }
                    }

                    if(sDropFirst == 'true'){

                        if( oElement.selectedIndex == 0 ){
                            bSelected = false;
                        }
                    }

                    if(bSelected == false){
                        BuCheck.setReturnValue( sLabel + ' : 필수 선택 항목입니다.' , oElement );
                        return false;
                    }
                    break;

                case 'INPUT' :
                    switch(oElement.type.toUpperCase()){

                        case 'RADIO' :
                            var aRadio   = document.getElementsByName(oElement.name);
                            var bChecked = false;

                            for(var k=0; k<aRadio.length; k++){

                                if( aRadio[k].checked == true ){

                                    bChecked = true;
                                }
                            }

                            if(bChecked == false){

                                BuCheck.setReturnValue( sLabel + ' : 필수 선택 항목입니다.' , oElement );
                                return false;
                            }
                            break;

                        case 'CHECKBOX' :
                            var aCheckbox     = document.getElementsByName(oElement.name);
                            var nCheckedCount = 0;

                            for(var k=0; k<aCheckbox.length; k++){

                                if( aCheckbox[k].checked == true ){
                                    nCheckedCount++;
                                }
                            }

                            if(nCheckedCount < nCheckCount){

                                BuCheck.setReturnValue( sLabel + ' : ' + nCheckCount + '개 이상 선택하셔야 합니다.' , oElement );
                                return false;
                            }
                            break;

                        case 'TEXT' :
                            if( !oElement.value || BuCheck.trim(oElement.value) == '' ){

                                BuCheck.setReturnValue( sLabel + ' : 필수 입력 항목입니다.' , oElement );
                                return false;
                            }
                            break;

                        case 'FILE' :
                            if( !oElement.value || BuCheck.trim(oElement.value) == '' ){

                                BuCheck.setReturnValue( sLabel + ' : 필수 입력 항목입니다.' , oElement );
                                return false;
                            }
                            break;

                        case 'PASSWORD' :
                            if( !oElement.value || BuCheck.trim(oElement.value) == '' ){

                                BuCheck.setReturnValue( sLabel + ' : 필수 입력 항목입니다.' , oElement );
                                return false;
                            }
                            break;
                    }
                    break;

                case 'TEXTAREA' :

                default :
                    if( !oElement.value || BuCheck.trim(oElement.value) == '' ){

                        BuCheck.setReturnValue( sLabel + ' : 필수 입력 항목입니다.' , oElement );
                        return false;
                    }
                    break;
            }
        }

        if( sValueType ){

            switch( sValueType ){

                case 'number' :
                    var sPattern = /^[0-9]*$/g;
                    if( !oElement.value.match( sPattern ) ){
                        BuCheck.setReturnValue( sLabel + ' : 숫자만 입력해 주세요.' , oElement );
                        return false;
                    }
                    break;

                case 'english' :
                    var sPattern = /^[a-zA-Z]*$/g;
                    if( !oElement.value.match( sPattern ) ){
                        BuCheck.setReturnValue( sLabel + ' : 영문만 입력해 주세요.' , oElement );
                        return false;
                    }
                    break;

                case 'korean' :
                    var sPattern = /^[가-힣\x20]*$/g;
                    if( !oElement.value.match( sPattern ) ){
                        BuCheck.setReturnValue( sLabel + ' : 한글만 입력해 주세요.' , oElement );
                        return false;
                    }
                    break;

                case 'numberenglish' :
                    var sPattern = /^[0-9a-zA-Z]*$/g;
                    if( !oElement.value.match( sPattern ) ){
                        BuCheck.setReturnValue( sLabel + ' : 영문 혹은 숫자만 입력해 주세요.' , oElement );
                        return false;
                    }
                    break;

                case 'numberenglishunderbar' :
                    var sPattern = /^[0-9a-zA-Z_]*$/g;
                    if( !oElement.value.match( sPattern ) ){
                        BuCheck.setReturnValue( sLabel + ' : 영문, 숫자, "_" 만 입력해 주세요.' , oElement );
                        return false;
                    }
                    break;

                case 'email' :
                    var sPattern = /([0-9a-zA-Z_-]+)@([0-9a-zA-Z_-]+)\.([0-9a-zA-Z_-]+)/;
                    if( !oElement.value.match( sPattern ) ){
                        BuCheck.setReturnValue( sLabel + ' : 이메일 형식에 맞춰 입력해 주세요.' , oElement );
                        return false;
                    }
                    break;

                default :
                    break;
            }
        }

        if( nMinLength ){

            if( oElement.value.length < nMinLength ){

                BuCheck.setReturnValue( sLabel + ' : ' + nMinLength + '자 이상 입력하세요' , oElement );
                return false;
            }
        }
    }

    return true;
}

BuCheck.prototype.check = function( sForm ){

    var oForm       = '';
    var nSubmitType = 0;

    if( !sForm || sForm == '' ){
        oForm = document.forms[0];
    }
    else{
        oForm = document.getElementsByName( sForm )[0];
    }

    if(oForm.onsubmit){
        nSubmitType = 1;
    }
    else{
        nSubmitType = 0;
    }

    var bFlag = BuCheck.checkForm( oForm );

    if(bFlag == false){

        window.alert(BuCheck.returnValue.sMessage);
        BuCheck.returnValue.oElement.focus();
        
        if(nSubmitType == 0){
            return;
        }
        else{
            return false;
        }
    }
    else{
        if(nSubmitType == 0){
            oForm.submit();
        }
    }
}

BuCheck = new BuCheck();

function FORM_CHK(obj)
{
	BuCheck.check();
	obj.submit();
}
