
function validateCompleteForm(objForm,strErrorClass){
  return _validateInternal(objForm,strErrorClass,0);
};

function validateStandard(objForm,strErrorClass){
  return _validateInternal(objForm,strErrorClass,1);
};

function _validateInternal(form,strErrorClass,nErrorThrowType){
  var strErrorMessage="";var objFirstError=null;
  if(nErrorThrowType==0){
    strErrorMessage=(form.err)?form.err:_getLanguageText("err_form");
  };
  var fields=_GenerateFormFields(form);
  for(var i=0;i<fields.length;++i){
    var field=fields[i];
    if(!field.IsValid(fields)){
      field.SetClass(strErrorClass);
      if(nErrorThrowType==1){
        _throwError(field);
        return false;
      }else{
        if(objFirstError==null){
          objFirstError=field;
        }
        strErrorMessage=_handleError(field,strErrorMessage);
        bError=true;
      }
    }else{
      field.ResetClass();
    }
  };
  if(objFirstError!=null){
    xmsgbox.alert("안내!", strErrorMessage);
    objFirstError.element.focus();
    return false;
  };
  return true;
};

function _getLanguageText(id){
  objTextsInternal=new _jsVal_Language();
  objTexts=null;
  try{
    objTexts=new jsVal_Language();
  }catch(ignored){};
  switch(id){
    case "err_form":strResult=(!objTexts||!objTexts.err_form)?objTextsInternal.err_form:objTexts.err_form;break;
    case "err_enter":strResult=(!objTexts||!objTexts.err_enter)?objTextsInternal.err_enter:objTexts.err_enter;break;
    case "err_select":strResult=(!objTexts||!objTexts.err_select)?objTextsInternal.err_select:objTexts.err_select;break;
  };
  return strResult;
};

function _GenerateFormFields(form){
  var arr=new Array();
  for(var i=0;i<form.length;++i){
    var element=form.elements[i];
    var index=_getElementIndex(arr,element);
    if(index==-1){
      arr[arr.length]=new Field(element,form);
    }else{
      arr[index].Merge(element);
    };
  };
  return arr;
};

function _getElementIndex(arr,element){
  if(element.name){
    var elementName=element.name.toLowerCase();
    for(var i=0;i<arr.length;++i){
      if(arr[i].element.name){
        if(arr[i].element.name.toLowerCase()==elementName){
          return i;
        }
      };
    };
  }
  return -1;
};

function _jsVal_Language(){
  this.err_form="Please enter/select values for the following fields:\n\n";
  this.err_select="\"%FIELDNAME%\" 선택하세요.";
  this.err_enter="\"%FIELDNAME%\" 유효하지 않은 입력입니다.";
};

function Field(element,form){
  this.type=element.type;
  this.element=element;
  this.exclude=element.exclude||element.getAttribute('exclude');
  this.err=element.err||element.getAttribute('err');
  this.required=_parseBoolean(element.required||element.getAttribute('required'));
  this.realname=element.realname||element.getAttribute('realname');
  this.elements=new Array();
  switch(this.type){
    case "textarea":
    case "password":
    case "text":
    case "file":
      this.value=element.value;
      this.minLength=element.minlength||element.getAttribute('minlength');
      this.maxLength=element.maxlength||element.getAttribute('maxlength');
      this.regexp=this._getRegEx(element);
      this.minValue=element.minvalue||element.getAttribute('minvalue');
      this.maxValue=element.maxvalue||element.getAttribute('maxvalue');
      this.equals=element.equals||element.getAttribute('equals');
      this.callback=element.callback||element.getAttribute('callback');
      break;
    case "select-one":
    case "select-multiple":
      this.values=new Array();
      for(var i=0;i<element.options.length;++i){
        if(element.options[i].selected&&(!this.exclude||element.options[i].value!=this.exclude)){
          this.values[this.values.length]=element.options[i].value;
        }
      }

      this.min=element.min||element.getAttribute('min');
      this.max=element.max||element.getAttribute('max');
      this.equals=element.equals||element.getAttribute('equals');
      break;
    case "checkbox":
      this.min=element.min||element.getAttribute('min');
      this.max=element.max||element.getAttribute('max');
    case "radio":
      this.required=_parseBoolean(this.required||element.getAttribute('required'));
      this.values=new Array();
      if(element.checked){
        this.values[0]=element.value;
      }
      this.elements[0]=element;
      break;
  };
};

Field.prototype.Merge=function(element){
  var required=_parseBoolean(element.getAttribute('required'));
  if(required){
    this.required=true;
  };
  if(!this.err){
    this.err=element.getAttribute('err');
  };
  if(!this.equals){
    this.equals=element.getAttribute('equals');
  };
  if(!this.callback){
    this.callback=element.getAttribute('callback');
  };
  if(!this.realname){
    this.realname=element.getAttribute('realname');
  };
  if(!this.max){
    this.max=element.getAttribute('max');
  };
  if(!this.min){
    this.min=element.getAttribute('min');
  };
  if(!this.regexp){
    this.regexp=this._getRegEx(element);
  };
  if(element.checked){
    this.values[this.values.length]=element.value;
  };
  this.elements[this.elements.length]=element;
};

Field.prototype.IsValid=function(arrFields){
  switch(this.type){
    case "textarea":
    case "password":
    case "text":
    case "file":
      return this._ValidateText(arrFields);
    case "select-one":
    case "select-multiple":
    case "radio":
    case "checkbox":
      return this._ValidateGroup(arrFields);
    default:
      return true;
  };
};

Field.prototype.SetClass=function(newClassName){
  if((newClassName)&&(newClassName!="")){
    if((this.elements)&&(this.elements.length>0)){
      for(var i=0;i<this.elements.length;++i){
        if(this.elements[i].className!=newClassName){
          this.elements[i].oldClassName=this.elements[i].className;
          this.elements[i].className=newClassName;
        }
      }
    }else{
      if(this.element.className!=newClassName){
        this.element.oldClassName=this.element.className;
        this.element.className=newClassName;
      }
    };
  }
};

Field.prototype.ResetClass=function(){
  if((this.type!="button")&&(this.type!="submit")&&(this.type!="reset")){
    if((this.elements)&&(this.elements.length>0)){
      for(var i=0;i<this.elements.length;++i){
        if(this.elements[i].oldClassName){
          this.elements[i].className=this.elements[i].oldClassName;
        }else{
          this.element.className="";
        }
      }
    }else{
       if(this.elements.oldClassName){
         this.element.className=this.element.oldClassName;
       }else{
         this.element.className="";
       }
    };
  };
};


Field.prototype._getRegEx=function(element){
  regex=element.regexp||element.getAttribute('regexp')
  if(regex==null)return null;
  retype=typeof(regex);
  if(retype.toUpperCase()=="FUNCTION")
    return regex;
  else if((retype.toUpperCase()=="STRING")&&!(regex=="JSVAL_RX_EMAIL")&&!(regex=="JSVAL_RX_TEL")
    &&!(regex=="JSVAL_RX_PC")&&!(regex=="JSVAL_RX_ZIP")&&!(regex=="JSVAL_RX_MONEY")
    &&!(regex=="JSVAL_RX_CREDITCARD")&&!(regex=="JSVAL_RX_POSTALZIP"))
  {
    //nBegin=0;nEnd=0;
    //if(regex.charAt(0)=="/")nBegin=1;
    //if(regex.charAt(regex.length-1)=="/")nEnd=(regex.length-1);
    //return new RegExp(regex.slice(nBegin,nEnd));
    return new RegExp(regex);
  }else{
    return regex;
  };
};

Field.prototype._ValidateText=function(arrFields){
  if((this.required)&&(this.callback)){
    nCurId=this.element.id?this.element.id:"";
    nCurName=this.element.name?this.element.name:"";
    eval("bResult = "+this.callback+"(this, '"+nCurId+"', '"+nCurName+"', '"+this.value+"');");
    if(bResult==false){
      return false;
    };
  }else{
    if(this.required&&!this.value){
      return false;
    };
    if(this.value&&(this.minLength&&this.value.length<this.minLength)){
      this.err = this.realname+"의 길이는 " + this.minLength + "보다 길어야 합니다.";
      return false;
    };
    if(this.value&&(this.maxLength&&this.value.length>this.maxLength)){
      this.err = this.realname+"의 길이는 " + this.minLength + "와 같거나 작아야 합니다.";
      return false;
    };
    if(this.regexp){
      if(!_checkRegExp(this.regexp,this.value)){
        if(!this.required&&this.value){
          this.err = postPosition(this.realname, NOMINATIVE_CASE)+" 정해진 형식과 일치 하지 않습니다.";
          return false;
        }
        if(this.required){
          this.err = postPosition(this.realname, NOMINATIVE_CASE)+" 정해진 형식과 일치 하지 않습니다.";
          return false;
        }
      }else{
        return true;
      };
    };

    if(this.equals){
      for(var i=0;i<arrFields.length;++i){
        var field=arrFields[i];
        if((field.element.name==this.equals)||(field.element.id==this.equals)){
          if(field.element.value!=this.value){
            this.err = this.realname+"와  "+ field.realname+"의 값이 같지 않습니다.";
            return false;
          };
          break;
        };
      };
    };
    if(this.required){
      var fValue=parseFloat(this.value);
      if((this.minValue||this.maxValue)&&isNaN(fValue)){
        //this.err = this.realname+" 숫자형식이야합니다.";
        return false;
      };
      if((this.minValue)&&(fValue<this.minValue)){
        this.err = postPosition(this.realname, DESCRIPTION_CASE) +" "+ this.minValue + "보다 작을 수 없습니다.";
        return false;
      };
      if((this.maxValue)&&(fValue>this.maxValue)){
        this.err = postPosition(this.realname, DESCRIPTION_CASE) +" "+ this.maxValue + "보다 클 수 없습니다.";
        return false
      };
    };
  }
return true;
};


Field.prototype._ValidateGroup=function(arrFields){
  if(this.required&&this.values.length==0){
    return false;
  };
  if(this.required&&this.min&&this.min>this.values.length){
    return false;
  };
  if(this.required&&this.max&&this.max<this.values.length){
    return false;
  };
  return true;
};


function _handleError(field,strErrorMessage){
  var obj=field.element;
  strNewMessage=strErrorMessage+((field.realname)?field.realname:((obj.id)?obj.id:obj.name))+"\n";
  return strNewMessage;
};


function _throwError(field){
  var obj=field.element;
  switch(field.type){
    case "text":
    case "password":
    case "textarea":
    case "file":
      xmsgbox.alert("안내!", _getError(field,"err_enter"));
      try{
        obj.focus();
      }catch(ignore){}
      break;
    case "select-one":
    case "select-multiple":
    case "radio":
    case "checkbox":
      xmsgbox.alert("안내!",_getError(field,"err_select"));
      break;
  };
};


function _getError(field,str){
  var obj=field.element;
  strErrorTemp=(field.err)?field.err:_getLanguageText(str);
  idx=strErrorTemp.indexOf("\\n");
  while(idx>-1){
    strErrorTemp=strErrorTemp.replace("\\n","\n");
    idx=strErrorTemp.indexOf("\\n");
  };
  return strErrorTemp.replace("%FIELDNAME%",(field.realname)?field.realname:((obj.id)?obj.id:obj.name));
};


function _parseBoolean(value){
  return !(!value||value==0||value=="0"||value=="false");
};


function _checkRegExp(regx,value){
  switch(regx){
    case "JSVAL_RX_EMAIL":
      return((/^[_a-zA-Z0-9\-]+@[\._a-zA-Z0-9\-]+\.[a-zA-Z]{2,}/).test(value));
    case "JSVAL_RX_TEL":
      return((/^1?[\-]?\(?\d{3}\)?[\-]?\d{3}[\-]?\d{4}$/).test(value));
    case "JSVAL_RX_PC":
      return((/^[a-z]\d[a-z]?\d[a-z]\d$/i).test(value));
    case "JSVAL_RX_ZIP":
      return((/^\d{5}$/).test(value));
    case "JSVAL_RX_MONEY":
      return((/^\d+([\.]\d\d)?$/).test(value));
    case "JSVAL_RX_CREDITCARD":
      return(!isNaN(value));
    case "JSVAL_RX_POSTALZIP":
      if(value.length==6||value.length==7)
      return((/^[a-zA-Z]\d[a-zA-Z] ?\d[a-zA-Z]\d$/).test(value));
      if(value.length==5||value.length==10)
      return((/^\d{5}(\-\d{4})?$/).test(value));
      break;
    case "CORONA_RX_NUMERIC":
      return ((/^[0-9]+$/).test(value));
    case "CORONA_RX_TELEPHONE":
      return ((/^(02|031|032|033|041|042|043|051|052|053|054|055|061|062|063|064)-([0-9]{3,4})-([0-9]{4})$/).test(value));
    case "CORONA_RX_MOBILE":
      return ((/^(010|011|016|017|018|019)-([0-9]{3,4})-([0-9]){4}$/).test(value));
    case "CORONA_RX_TELEPHONEANDMOBILE":
      return ((/^(010|011|016|017|018|019|02|031|032|033|041|042|043|051|052|053|054|055|061|062|063|064)-([0-9]{3,4})-([0-9]{4})$/).test(value));
    case "CORONA_RX_EMAIL":
      return ((/^[_a-zA-Z0-9-]+@[._a-zA-Z0-9-]+.[a-zA-Z]$/).test(value));
    case "CORONA_RX_ALPHABET":
      return ((/^[a-zA-Z]$/).test(value));
    case "CORONA_RX_POSTALZIP":
      return ((/^\d{3}-\d{3}$/).test(value));
    case "CORONA_RX_JUMIN":
      return ((/^\d{6}-[1|2|3]\d{6}$/).test(value));
    case "DART_RX_KOREAN" :
      return ((/^[ㄱ-ㅣ가-힣]+$/).test(value));
    default:
      return(regx.test(value));
  };
};

var NOMINATIVE_CASE = 0;
var OBJECTIVE_CASE = 1;
var DESCRIPTION_CASE = 2;

function postPosition(str, type){
    if(type == "") type = 0;
    if(str != ""){
           var cha = str.charCodeAt(str.length -1);
           var third = ((cha - 44032) % (21*28))%28;
           if(third == 0){
                if(type == 0) str += "가";
                else if(type == 1) str += "를";
                else if(type == 2) str += "는";
            }else{
                if(type == 0) str += "이";
                else if(type == 1) str += "을";
                else if(type == 2) str += "은";
            }
        }
      return str;
  }




