
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 correct or enter 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');
    this.callbackerror=element.callback_error||element.getAttribute('callback_error');
    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.callbackerror){
    this.callbackerror=element.getAttribute('callback_error');
  };
  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=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){
     if (this.callbackerror){
     	eval("errResult = "+this.callbackerror+"();");
     	this.errorText=errResult;
     }
     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))+((field.errorText)?" - " +field.errorText:"")+"\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_üöäßÄÖÜ]+)*@[0-9a-zA-ZüöäßÄÖÜ]+([\.-]?[a-zA-ZüöäßÄÖÜ]+)*(\.\w{2,5})+$/).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));
  };
};

function cb_check_date_str(id,name,value){
	return isDate(value);
}
/**
 * DHTML date validation script. Courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/)
 */
// Declaring valid date character, minimum year and maximum year
var dtCh= "-";
var minYear=1900;
var maxYear=2100;
var dateError="";

function getDateError(){
	return dateError;
}

function isInteger(s){
	var i;
    for (i = 0; i < s.length; i++){   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function stripCharsInBag(s, bag){
	var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++){   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function daysInFebruary (year){
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}
function DaysArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 31
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   } 
   return this
}

function isDate(dtStr){
	var daysInMonth = DaysArray(12)
	var pos1=dtStr.indexOf(dtCh)
	var pos2=dtStr.indexOf(dtCh,pos1+1)
	var strMonth=dtStr.substring(0,pos1)
	var strDay=dtStr.substring(pos1+1,pos2)
	var strYear=dtStr.substring(pos2+1)
	strYr=strYear
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
	for (var i = 1; i <= 3; i++) {
		if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
	}
	month=parseInt(strMonth)
	day=parseInt(strDay)
	year=parseInt(strYr)
	if (pos1==-1 || pos2==-1){
		dateError= "The date format should be : mm-dd-yyyy";
		return false
	}
	if (strMonth.length<1 || month<1 || month>12){
		dateError="Invalid Month";
		return false
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		dateError="Invalid Day detected";
		return false
	}
	if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
		dateError="Please enter a valid 4 digit year between "+minYear+" and "+maxYear;
		return false
	}
	if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
		dateError="Please enter a valid date";
		return false
	}
return true
}

 

 
