function validateform(form)
{
  var index,name
  for(index=0;index<=form.elements.length-1;index++)
  {
    name=form.elements[index].name
    //valideer verplichte invoer
    if(form.elements[index].required && form.elements[index].required=="yes")
      if(validaterequired(form.elements[name])==false) return(false)
    //valideer datatype
    if(form.elements[index].datatype && elementvalue(form.elements[name])!="")
    {
      switch(form.elements[index].datatype)
      {
        case "date":
          if(validatedate(form.elements[index],form.elements[index].rangemin,form.elements[index].rangemax)==false) return(false)
          break
        case "email":
          if(validateemail(form.elements[index])==false) return(false)
          break
        case "float":
          if(validatefloat(form.elements[index],form.elements[index].rangemin,form.elements[index].rangemax)==false) return(false)
          break
        case "objectfile":
          if(validateobjectfile(form.elements[index])==false) return(false)
          break
        case "integer":
          if(validateinteger(form.elements[index],form.elements[index].rangemin,form.elements[index].rangemax)==false) return(false)
          break
        case "money":
          if(validatemoney(form.elements[index],form.elements[index].rangemin,form.elements[index].rangemax)==false) return(false)
          break
        case "telephone":
          if(validatetelephone(form.elements[index])==false) return(false)
          break
        case "time":
          if(validatetime(form.elements[index])==false) return(false)
          break
        case "url":
          if(validateurl(form.elements[index])==false) return(false)
          break
        case "zipcode":
          if(validatezipcode(form.elements[index])==false) return(false)
          break
      }
    }
  }
  return(true)
}

function validaterequired(element)
/* Deze functie valideert een verplichte invoer. */
/* element          => formulierelement          */
/* validatetequired <= false: bestaand+enabled+!hidden element en geen invoer gedaan, anders true. */
{
  var teller
  if(!element || element.disabled) return(true)
  if(element[0]) //element array 1e enabled element
  {
    for(teller=0;teller<element.length;teller++) if(!element[teller].disabled) break
    if(teller==element.length) return(true) //disabled
  }
  if(elementvalue(element)=="")
  {
    switch(elementtype(element))
    {
      case "select-one": /* list box */
        alert("Verplicht veld niet ingevuld. Alstublieft een waarde selecteren.")
        element.focus()
        break
      case "select-multiple": /* list box multiple */
        alert("Verplicht veld niet ingevuld. Alstublieft een waarde selecteren.")
        element.focus()
        break
      case "radio": /* radio button */
      case "checkbox": /* check box, check boxes */
        alert("Verplicht veld niet ingevuld. Alstublieft een waarde aanvinken.")
        if(element[0]) element[teller].focus(); else element.focus()
        break
      case "hidden": /* hidden, samengesteld element */
        if(document.all["_"+element.name+"1"]) /* samengesteld element */
        {
          if(elementtype(document.all["_"+element.name+"1"])=="select-one" || elementtype(document.all["_"+element.name+"1"])=="select-multiple") /* listboxdouble */
          {
            alert("Verplicht veld niet ingevuld. Alstublieft een waarde selecteren.")
            document.all["_"+element.name+"2"].focus()
          }
          else /* textboxarray */
          {
            alert("Verplicht veld niet ingevuld. Alstublieft een waarde invullen.")
            document.all["_"+element.name+"1"].focus()
          }
        }
        else if(document["_"+element.name]) /* html element */
        {
          alert("Verplicht veld niet ingevuld. Alstublieft een waarde invullen.")
          document["_"+element.name].setFocus()
        }
        else if(document.all["_"+element.name]) /* textboxes */
        {
          alert("Verplicht veld niet ingevuld. Alstublieft een waarde invullen.")
          document.all["_"+element.name].focus()
        }
        else return(true) /* hidden */
        break
      default: /* text box, text area, file, password */
        alert("Verplicht veld niet ingevuld. Alstublieft een waarde invullen.")
        element.focus()
    }
    return(false)
  }
  else return(true)
}

function elementvalue(element)
/* Deze functie geeft van een formulierelement de waarde. */
/* element      => formulierelement                       */
/* elementvalue <= de waarde van het formulierelement.    */
{
  var index,value=""
  /* check element type */
  switch(elementtype(element))
  {
    case "radio": /* radio button */
    case "checkbox": /* check box */
      if(element[0])
      {
        for(index=0;index<element.length;index++)
          if(!element[index].disabled && element[index].checked)
          {
            if(value!="") value+=", "
            value+=element[index].value
          }
      }
      else
        if(!element.disabled && element.checked) value=element.value
      break
    case "select-one": /* list box */
      if(!element.disabled && element.selectedIndex!=-1) value=element.options[element.selectedIndex].value
      break
    case "select-multiple": /* list box multiple */
      if(!element.disabled)
        for(index=0;index<element.options.length;index++)
          if(element.options[index].selected)
          {
            if(value!="") value+=", "
            value+=element.options[index].value
          }
      break
    case "hidden": /* hidden */
      value=element.value
      break
    case "": /* geen element */
      break
    default: /* text box, password, file, text area */
      if(!element.disabled) value=element.value
  }
  return(value)
}

function elementtype(element)
/* Deze functie geeft van een formulierelement het type. */
/* element     => formulierelement                       */
/* elementtype <= het type van het formulierelement.     */
{
  var type=""
  if(element)
    if(element[0] && element[0].type) type=element[0].type
    else type=element.type
  return(type)
}

function validatedate(element,min,max)
/* Deze functie valideert een nederlandse datum (dd-mm-jjjj).       */
/* element      => formulierelement die de te valideren datum bevat */
/* min          => minimale waarde van de datum (optioneel)         */
/* max          => maximale waarde van de datum (optioneel)         */
/* validatedate <= false: ongeldige datum, true: geldige datum.     */
{
  var match, datum, datumrange, result=false
  match=new RegExp("^([0-9]{1,2})[-]([0-9]{1,2})[-]([0-9]{4})$").exec(element.value)
  if(match)
  {
    //geldigheid
    datum=new Date(match[3],match[2]-1,match[1])
    if(match[3]==datum.getFullYear() && match[2]==datum.getMonth()+1 && match[1]==datum.getDate()) result=true
    //min
    if(typeof(min)!='undefined')
    {
      datumrange=new Date(min.split('-')[2],min.split('-')[1]-1,min.split('-')[0])
      if(datum<datumrange) result=false
    }
    //max
    if(typeof(max)!='undefined')
    {
      datumrange=new Date(max.split('-')[2],max.split('-')[1]-1,max.split('-')[0])
      if(datum>datumrange) result=false
    }
  }
  if(result==false)
  {
    if(typeof(min)=='undefined' && typeof(max)=='undefined') //geen range
      alert("Incorrecte datum ingevuld. Alstublieft een geldige nederlandse datum invullen van het formaat \"dd-mm-jjjj\".")
    else if(typeof(max)=='undefined') //alleen rangemin
      alert("Incorrecte datum ingevuld. Alstublieft een geldige nederlandse datum invullen vanaf "+min+".")
    else if(typeof(min)=='undefined') //alleen rangemax
      alert("Incorrecte datum ingevuld. Alstublieft een geldige nederlandse datum invullen t/m "+max+".")
    else //rangemin en max
      alert("Incorrecte datum ingevuld. Alstublieft een geldige nederlandse datum invullen van "+min+" t/m "+max+".")
    element.focus()
  }
  return(result)
}

function validateemail(element)
/* Deze functie valideert een e-mailadres.                                  */
/* element       => formulierelement die het te valideren e-mailadres bevat */
/* validateemail <= false: ongeldig e-mail adres, true: geldig e-mailadres. */
{
  var emailexp="[A-Za-z0-9'_&-]{1,}([.][A-Za-z0-9'_&-]{1,}){0,4}[@]([A-Za-z0-9-]{2,}[.]){1,4}[A-Za-z0-9-]{2,4}"
  var match=new RegExp("^"+emailexp+"$").exec(element.value) //zonder alias
  //var match=new RegExp("^(("+emailexp+")|([A-Za-z ]{1,}[ ][<]"+emailexp+"[>]))$").exec(element.value) //met alias
  if(!match)
  {
    alert("Incorrect e-mailadres ingevuld. Alstublieft een geldig e-mailadres invullen van het formaat \"naam@domein.land\".")
    //alert("Incorrect e-mailadres ingevuld.\nAlstublieft een geldig e-mailadres invullen van het formaat \"naam@domein.land\" of \"alias <naam@domein.land>\".")
    element.focus()
    return(false)
  }
  else return(true)
}

function validatefloat(element,min,max)
/* Deze functie valideert een numeriek getal.                                    */
/* element       => formulierelement die het te valideren numerieke getal bevat  */
/* min           => minimale waarde van het numerieke getal                      */
/* max           => maximale waarde van het numerieke getal                      */
/* validatefloat <= false: ongeldig numeriek getal, true: geldig numeriek getal. */
{
  var decimals=""
  if(new String(max).split(".").length==2) decimals=new String(max).split(".")[1].length
  var match=new RegExp("^([-]?[0-9]+([.][0-9]{1,"+decimals+"})?)$").exec(element.value)
  if(!match || parseFloat(match[1])<min || parseFloat(match[1])>max)
  {
    alert("Incorrect getal ingevuld. Alstublieft een numeriek getal invullen van "+min+" t/m "+max+".")
    element.focus()
    return(false)
  }
  else return(true)
}

function validateobjectfile(element)
/* Deze functie valideert een object bestandsnaam.                                  */
/* element            => formulierelement die de te valideren bestandsnaam bevat    */
/* validateobjectfile <= false: ongeldige bestandsnaam, true: geldige bestandsnaam. */
{
  var match=new RegExp("[.]([gG][iI][fF])|([jJ][pP][gG])|([p][h][p])|([sS][wW][fF])|([fF][lL][vV])|([wW][mM][vV])$").exec(element.value)
  if(!match)
  {
    alert("Incorrecte bestandsnaam ingevuld.\nAlstublieft een geldige bestandsnaam invullen van het formaat \"naam.gif\", \"naam.jpg\", \"naam.php\", \"naam.swf\", \"naam.flv\" of \"naam.wmv\".")
    element.focus()
    return(false)
  }
  else return(true)
}

function validateinteger(element,min,max)
/* Deze functie valideert een geheel getal.                                    */
/* element         => formulierelement die het te valideren gehele getal bevat */
/* min             => minimale waarde van het gehele getal                     */
/* max             => maximale waarde van het gehele getal                     */
/* validateinteger <= false: ongeldig geheel getal, true: geldig geheel getal. */
{
  var match=new RegExp("^([-]?[0-9.]+)$").exec(element.value)
  if(!match || match[1].replace(".","")-1+1<min || match[1].replace(".","")-1+1>max)
  {
    if(typeof(min)=='undefined' && typeof(max)=='undefined') //geen range
      alert("Incorrect getal ingevuld. Alstublieft een geheel getal invullen.")
    else if(typeof(max)=='undefined') //alleen rangemin
      alert("Incorrect getal ingevuld. Alstublieft een geheel getal invullen vanaf "+min+".")
    else if(typeof(min)=='undefined') //alleen rangemax
      alert("Incorrect getal ingevuld. Alstublieft een geheel getal invullen t/m "+max+".")
    else
      alert("Incorrect getal ingevuld. Alstublieft een geheel getal invullen van "+min+" t/m "+max+".")
    element.focus()
    return(false)
  }
  else return(true)
}

function validatemoney(element,min,max)
/* Deze functie valideert een nederlands geldbedrag.                                      */
/* element       => formulierelement die het te valideren geldbedrag bevat                */
/* min           => minimale waarde van het geldbedrag                                    */
/* max           => maximale waarde van het geldbedrag                                    */
/* validatemoney <= false: bestaand+enabled element en ongeldige geldbedrag, anders true. */
{
  var decimals="2"
  if(new String(min).split(",").length==2) decimals=new String(min).split(",")[1].length
  if(new String(max).split(",").length==2) decimals=new String(max).split(",")[1].length
  var match=new RegExp("^([-]{0,1}[0-9]{1,}([.][0-9][0-9][0-9]){0,}[,][0-9]{2,"+decimals+"})$").exec(element.value)
  if(!match || parseFloat(match[1].replace(/[.]/g,"").replace(",","."))<parseFloat(new String(min).replace(",",".")) || parseFloat(match[1].replace(/[.]/g,"").replace(",","."))>parseFloat(new String(max).replace(",",".")))
  {
    if(typeof(min)=='undefined' && typeof(max)=='undefined') //geen range
      alert("Incorrect bedrag ingevuld. Alstublieft een geldbedrag invullen van het formaat \"1.234,56\".")
    else if(typeof(max)=='undefined') //alleen rangemin
      alert("Incorrect bedrag ingevuld. Alstublieft een geldbedrag invullen vanaf "+min+".")
    else if(typeof(min)=='undefined') //alleen rangemax
      alert("Incorrect bedrag ingevuld. Alstublieft een geldbedrag invullen t/m "+max+".")
    else
      alert("Incorrect bedrag ingevuld. Alstublieft een geldbedrag invullen van "+min+" t/m "+max+".")
    element.focus()
    return(false)
  }
  else return(true)
}

function validatetelephone(element)
/* Deze functie valideert een nederlands telefoonnummer.                             */
/* value             => formulierelement die het te valideren telefoonnummer bevat   */
/* validatetelephone <= false: ongeldig telefoonnummer, true: geldig telefoonnummer. */
{
  var match=new RegExp("^[0][0-9](([-][0-9][0-9])|([0-9][-][0-9])|([0-9][0-9][-]))[0-9]{6}$").exec(element.value)
  if(!match)
  {
    alert("Incorrect telefoonnummer ingevuld. Alstublieft een 10 cijferig telefoonnummer invullen van het formaat \"netnummer-abonneenummer\".")
    element.focus()
    return(false)
  }
  else return(true)
}

function validatetime(element)
/* Deze functie valideert een tijd.                                */
/* element      => formulierelement die de te valideren tijd bevat */
/* validatetime <= false: ongeldige tijd, true: geldige tijd.      */
{
  var match=new RegExp("^([0-2][0-9])[:][0-5][0-9]$").exec(element.value)
  if(!match || match[1]-1+1>23)
  {
    alert("Incorrecte tijd ingevuld. Alstublieft een geldige tijd invullen van het formaat \"00:00\".")
    element.focus()
    return(false)
  }
  else return(true)
}

function validateurl(element)
/* Deze functie valideert een URL.                               */
/* element     => formulierelement die de te valideren URL bevat */
/* validateurl <= false: ongeldige URL, true: geldige URL.       */
{
  var server="(([A-Za-z0-9-]{2,}[.]){1,3}[A-Za-z0-9-]{2,4})|([A-Za-z0-9-]{2,})|(([0-9]{1,3}[.]){3}[0-9]{1,3})" //domein of servernaam of ipadres
  var port="([:][0-9]{1,5}){0,1}"
  var file="([/][A-Za-z0-9?&=#%$+!*'_(),. -]{1,}){0,}[/]{0,1}"
  var match=new RegExp("^http://("+server+")("+port+")("+file+")$").exec(element.value)
  if(!match)
  {
    alert("Incorrecte URL ingevuld. Alstublieft een geldig webadres invullen van het formaat \"http://subdomein.domein.land\".")
    //alert("Incorrect URL provided. Please input a valid web address of format \"http://subdomain.domain.country\".")
    element.focus()
    return(false)
  }
  else return(true)
}

function validatezipcode(element)
/* Deze functie valideert een postcode.                                   */
/* element         => formulierelement die de te valideren postcode bevat */
/* validatezipcode <= false: ongeldige postcode, true: geldige postcode.  */
{
  var match=new RegExp("^[1-9][0-9]{3}[ ][A-Za-z]{2}$").exec(element.value)
  if(!match)
  {
    alert("Incorrecte postcode ingevuld. Alstublieft een postcode invullen van het formaat \"1234 AB\".")
    element.focus()
    return(false)
  }
  else return(true)
}

