
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) {
        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="Please select a valid \"%FIELDNAME%\"";
    this.err_enter="Please enter a valid \"%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;
    };
    this.InitClass();
};
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.InitClass=function() {
                             if((this.elements)&&(this.elements.length>0)) {
                                 for(var i=0;i<this.elements.length;++i) {
                                 	this.elements[i].oldClassName=this.elements[i].className;
                                 }
                             } else {
                                     this.element.oldClassName=this.element.className;
                             }
                         };
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.elements[i].className="";
                                           }
                                       }
                                   } else {
                                       if(this.element.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=0;
                                  return new RegExp(regex.slice(nBegin,nEnd));
                              } 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+"('"+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)) {
                                          return false;
                                      };
                                      if(this.value&&(this.maxLength&&this.value.length>this.maxLength)) {
                                          return false;
                                      };
                                      if(this.regexp) {
                                          if(!_checkRegExp(this.regexp,this.value)) {
                                              if(!this.required&&this.value) {
                                                  return false;
                                              }
                                              if(this.required) {
                                                  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) {
                                                      return false;
                                                  };
                                                  break;
                                              };
                                          };
                                      };
                                      if(this.required) {
                                          var fValue=parseFloat(this.value);
                                          if((this.minValue||this.maxValue)&&isNaN(fValue)) {
                                              return false;
                                          };
                                          if((this.minValue)&&(fValue<this.minValue)) {
                                              return false;
                                          };
                                          if((this.maxValue)&&(fValue>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":
        alert(_getError(field,"err_enter"));
        try {
            obj.focus();
        } catch(ignore) {}
        break;
    case "select-one":
    case "select-multiple":
    case "radio":
    case "checkbox":
        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-Z0-9]{2,4})+$/).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;
    default:
            return(regx.test(value));
    };
};