
var joecheck_form= null;
var joecheck_elm= null;
var joecheck_checkArray=null;

var joecheck_noProblem = 0;
var joecheck_minLengthProblem = 1;
var joecheck_maxLengthProblem = 2;	
var joecheck_syntaxProblem = 3;
var joecheck_objectTypeProblem = 4;	
var joecheck_requiredProblem = 5;

var joecheck_nr_of_problems = 6;
var joecheck_nr_checked = 0;
var joecheck_checkRequired = true;
var joecheck_nr_to_check = -1;
var joecheck_general_error = "";
var joecheck_extended_check = false;
var joecheck_extended_array = null;


function joecheck_setForm(f) {
  joecheck_form = f;
  if(f) {	
    joecheck_elm=f.elements;
  } else {
    joecheck_elm = null;	
  }
}       
function joecheck_getErrorMessage(obj,nr,val) {
  var s = obj.error[nr];
  s=s.replace("%n",obj.name);
  s=s.replace("%d",obj.description);
  s=s.replace("%v",val);
  return  s;

}

function joecheck_isEmpty(val) {
   return !(val && val.length > 0);
}

function joecheck_checkFormElement(obj,name,val) {
  var err;
  err = joecheck_noProblem;

  if(joecheck_checkRequired) {
    if(obj.required) {
      if(joecheck_isEmpty(val)) {
        err=joecheck_requiredProblem; 
      } else {
        err=joecheck_checkObj(obj,val);
      }
    } else {
      if(!joecheck_isEmpty(val)) {
        err=joecheck_checkObj(obj,val);
      }
    }
  } else {
    if(!joecheck_isEmpty(val)) {
      err=joecheck_checkObj(obj,val);
    }
  }    
  joecheck_lastCheckedValue = val;
  return err;
}

function joecheck_checkForm() {
  var i,j;
  var err=joecheck_noProblem;
  var val;
  var n;
  if(joecheck_form == null) {
    joecheck_setForm(document.forms[0]);
  }
  joecheck_nr_checked = 0;
  for(i=0;i<joecheck_checkArray.length;i++) {
    n = joecheck_checkArray[i].name;
    err = joecheck_checkFormElement(joecheck_checkArray[i],n, joecheck_getFormElementValue(n));
    if(joecheck_extended_check && joecheck_extended_array) {
       for(j=0;j<joecheck_extended_array.length && err==joecheck_noProblem;j++) {
          n = joecheck_checkArray[i].name+joecheck_extended_array[j];
          err = joecheck_checkFormElement(joecheck_checkArray[i],n, joecheck_getFormElementValue(n));
       }
    }
    if(err != joecheck_noProblem) {
      alert(joecheck_getErrorMessage(joecheck_checkArray[i],err,val));
      return false;
    }
  }

//alert(joecheck_nr_to_check+":"+joecheck_nr_checked+":"+joecheck_general_error);
  if(joecheck_nr_to_check > -1) {
    if(joecheck_nr_checked < joecheck_nr_to_check && joecheck_general_error) {
       alert(joecheck_general_error);
       return false;
    }
  }

  return true;
}

function joecheck_getFormElementValue(name) {
  var value="";
  var myelm=null;
  var eltype="";
  if(joecheck_form == null) {
    joecheck_setForm(document.forms[0]);
  }
  if(!(joecheck_form && joecheck_elm && joecheck_elm[name])) {
     return null;
  }

  myelm = joecheck_elm[name]; 



  if(myelm.length && !myelm.type) {
//alert(myelm+":"+myelm.length+":"+myelm.type);
    if(myelm[0].type.indexOf("radio") != -1) {
      var i;     
      for(i=0;i<myelm.length;i++) {
        if(myelm[i].checked) {
          myelm = myelm[i];                          
          eltype = myelm.type;    
          break;
        }  
      }
    } else {
      alert("Internal - Watch out Elements have same name " + name);        
      return false; 
    }
    
  } else {

    eltype = myelm.type;    
  }                                                
  if(myelm) {
    if(eltype.indexOf("radio") != -1) {
      if(myelm.checked) {
        value= myelm.value;
      } else {                       
        value=null;
      }
      
    } else if(eltype.indexOf("checkbox") != -1) {
      if(myelm.checked) {
        value= myelm.value;
      } else {                       
        value=null;
      }
    } else if(eltype.indexOf("select") != -1) {
            value = myelm.options[myelm.options.selectedIndex].value;
      if(!value && value!='') {
//        value = myelm.options[myelm.options.selectedIndex].text;  
      }
    } else {
      value = myelm.value;
    }
  }       
  //alert("value");
  return value;	
}     
function joecheck_createObj() {
  this.error = new Array();
  this.error.length=joecheck_nr_of_problems;
  var i;
  for(i=0;i<this.error.length;i++) {
    this.error[i] = null;
  }
}
function joecheck_addCheck(obj) {
  if(joecheck_checkArray == null) {
    joecheck_checkArray = new Array();
  }
  joecheck_checkArray[joecheck_checkArray.length] = obj;
}

function joecheck_checkLengthString(obj,value) {
   if(obj.min) {
      if(obj.min > value.length) {
         return joecheck_minLengthProblem;
      }
   }
   if(obj.max) {
      if(obj.max < value.length) {
         return joecheck_maxLengthProblem;
      }
   }
   return joecheck_noProblem;
}

function joecheck_checkLengthNumber(obj,value) {
   if(obj.min) {
      if(obj.min > value) {
         return joecheck_minLengthProblem;
      }
   }
   if(obj.max) {
      if(obj.max < value) {
         return joecheck_maxLengthProblem;
      }
   }
   return joecheck_noProblem;
}
function joecheck_checkSyntaxDate(obj,value) {
      return joecheck_noProblem;
}
function joecheck_checkLengthDate(obj,value) {
      return joecheck_noProblem;
}

function joecheck_checkSyntaxEmail(value) {
     return joecheck_checkRegexp(/[-!#$%&*+\.0-9=?A-Z^_`a-z{|}~]+@[-!#$%&*+\0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&*+\.0-9=?A-Z^_`a-z{|}~]+/,value);
}

function joecheck_checkRegexp(r,value) {
   if(r.exec(value)) {
      return joecheck_noProblem;
   }  else {
      return joecheck_syntaxProblem;	
   }	
}

function joecheck_checkObj(obj, value) {
   var errorCode = joecheck_noProblem;
   var nval;

   joecheck_nr_checked++;	
//alert("checking"+obj.name+":"+value);
   if(obj.type == 'number' || obj.type=='int'  || obj.type=='integer'  || obj.type=='long') {

// geht net mit fuehrenden nullen !!
      var pval =value;
      while(pval.indexOf('0') == 0) {
        pval = pval.substring(1);
      }
      if(pval == '') pval = '0';
      nval = parseInt(pval);
      if(isNaN(nval)) {
         return joecheck_objectTypeProblem;
      }
      errorCode = joecheck_checkLengthNumber(obj,nval);
   } else if(obj.type=='float' || obj.type=='double') {
      nval = parseFloat(value);
      if(isNaN(nval)) {
         return joecheck_objectTypeProblem;
      }
      errorCode = joecheck_checkLengthNumber(obj,nval);
   } else if(obj.type == 'date' || obj.type=='time' || obj.type=='datetime') {
      errorCode = joecheck_checkSyntaxDate(obj,value);
      if(errorCode != joecheck_noProblem) {
         return errorCode;
      }
      errorCode = joecheck_checkLengthDate(obj,value);
   } else {
      errorCode = joecheck_checkLengthString(obj,value);
   }
   if(errorCode != joecheck_noProblem) {
      return errorCode;
   }
   if(obj.regexp) {
      errorCode = joecheck_checkRegexp(obj.regexp,value);
   }

   return errorCode;
}




