function submitForm() {
    var f = document.getElementsByTagName("form")[0].elements;
    var submit = true;

    // load all form elements into an array
    for (var i = 0; i < f.length; i++) {
                var input_type = f[i].getAttribute("type");
                var input_value = f[i].value;
                var input_required = f[i].getAttribute("required");

                // only evaluate if all fields so far have passed validation
                // this forces submit to stay false if any of the validations
                // returened false

                // if the input is required and the field is empty
                if ((input_required) && (input_value.length == 0)) {
                    window.alert(alertRequired());

                    // focus on the field that was required but empty
                    f[i].focus();

                    // do not submit the form
                    return false;
                }

                // if the input should match the value from another element
                if (f[i].getAttribute("must_match")) {
                   var must_match_val = f[i].getAttribute("must_match");

                   for (var j = 0; j < f.length; j++) {
                       if ((f[j].name == must_match_val) && (f[i].value != f[j].value)) {
                                  window.alert("Twee velden die dezelfde waarde zouden moeten hebben, hebben dat niet! Probeer het nogmaals.");
                                  f[i].focus();
                                  return false;
                       }
                   }
                }

                if (submit) {
                    // validate all fields based on their type
                    switch (input_type) {
                               case "email":
                                   if (!chkMailField(f[i])) {
                                               submit = false;
                                   }

                                   break;

                               case "password":
                                   if (!chkFieldLength(f[i], 6)) {
                                               submit = false;
                                   }

                                   break;

                               case "url":
                                   if (!chkURLField(f[i])) {
                                               submit = false;
                                   }

                                   break;

                               case "integer":
                                   if (!chkNumberField(f[i])) {
                                               submit = false;
                                   }

                                   break;

                               case "postcode":
                                   if (!chkPostcodeField(f[i])) {
                                               submit = false;
                                   }

                                   break;

                               case "phone":
                                   if (!chkPhoneField(f[i])) {
                                               submit = false;
                                   }

                                   break;

                               case "name":
                                   if (!chkNameField(f[i])) {
                                               submit = false;
                                   }

                                   break;

                               default:
                                   break;
                    }
                }
    }

    // submit the form
    return submit;
}

function alertMsg(value) {
                return ('\'' + value + '\' is een ongeldige waarde voor dit veld. Probeer het nogmaals.');
}

function alertRequired() {
                return ('Niet alle verplichte velden zijn ingevuld. Probeer het nogmaals.');
}

function chkField(regEx, buffer, silent) {
                var re = regEx;
                if (re.test(buffer)) {
                       return true;
                } else {
                       if (!silent) {
                                      alert(alertMsg(buffer));
                       }
                       return false;
                }
}

function chkMailField(target) {
                if (target.value.length == 0) return true;

                if (chkField(/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/, target.value)) {
                       return true;
                } else {
                       target.focus();
                       return false;
                }
}

function chkNameField(target) {
                if (target.value.length == 0) return true;

                var words = target.value.split(/\s/);
                var ret = "";

                for (var i = 0; i < words.length; i++) {
                       if ((i == 0) || (i == words.length-1)) {
                                      ret += words[i].substr(0, 1).toUpperCase() + words[i].substr(1) + " ";
                       } else {
                                      ret += words[i] + " ";
                       }
                }

                target.value = trim(ret);
                return true;
}

function chkDateField(target) {
                if (target.value.length == 0) return true;
                if (chkField(/(([0-2]{1}[0-9]{1})|([3]{1}[0-1]{1}))(\-)(([0]{1}[0-9]{1})|([1]{1}[0-2]{1}))(\-)([1-2]{1})\d{3}$/, target.value)) {
                       return true;
                } else {
                       target.focus();
                       return false;
                }
}

function chkNumberField(target) {
                if (target.value.length == 0) return true;
                if (chkField(/^\d+/, target.value)) {
                       return true;
                } else {
                       target.focus();
                       return false;
                }
}

function chkPostcodeField(target) {
                if (target.value.length == 0) return true;

                // if a whitespace is omitted, insert it
                if (chkField(/(^\d{4})([a-zA-Z]{2}$)/, target.value, true)) {
                    target.value = target.value.substr(0, 4) + " " + target.value.substr(4, 2);
                }

                // if the last two letters were lowercase, convert them to upper case
                if (chkField(/([a-z]{2}$)/, target.value, true)) {
                    target.value = target.value.toUpperCase();
                }

                if (chkField(/(^\d{4})(\W{1})([A-Z]{2}$)/, target.value)) {
                       return true;
                } else {
                       target.focus();
                       return false;
                }
}

function chkPhoneField(target) {
                if (target.value.length == 0) return true;

                // if input started with a plus sign, replace with 00
                if (chkField(/(^[\+]{1})/, target.value, true)) {
                       target.value = target.value.replace(/(^[\+]{1})/, "00");
                }

                // any alphanumerics are bad
                if (!chkField(/(^[\d\s\-]*$)/, target.value)) {
                       return false;
                }

                // take out all spaces and hyphens
                target.value = target.value.replace(/\s/gi, "").replace(/\-/gi, "");

                // check for foreign phone numbers
                if ((!chkField(/(^[0]{2}[3]{1}[1]{1})/, target.value, true)) && (chkField(/(^[0]{2})/, target.value, true))) {
                                               // North America: country code is 3 digits
                                               if (chkField(/(^[0]{2}[1]{1})/, target.value, true)) {
                                                               target.value = target.value.substr(0, 3) + " " + target.value.substr(3, 3) + "-" + target.value.substr(6);
                                               } else {
                                                               // Areas with 5-digit country codes
                                                               if (chkField(/(^[0]{2}(21{1}|22{1}|23{1}|24{1}|25{1}|26{1}|29{1}|35{1}|37{1}|38{1}|42{1}|50{1}|59{1}|67{1}|68{1}|69{1}|80{1}|85{1}|87{1}|88{1}|96{1}|97{1}|99{1}))/, target.value, true)) {
                                                                              target.value = target.value.substr(0, 5) + " " + target.value.substr(5, 3) + "-" + target.value.substr(8);
                                                               } else {
                                                                              // Use a 4-digit country code
                                                               target.value = target.value.substr(0, 4) + " " + target.value.substr(4, 3) + "-" + target.value.substr(7);
                                               }
                               }

                                   return true;
                } else {
                       // number in NL, take out the excess country code
                       if (chkField(/(^[0]{2}[3]{1}[1]{1})/, target.value, true)) {
                                      target.value = target.value.replace(/(^[0]{2}[3]{1}[1]{1})/, 0);
                       }

                       // walk through the area codes
                       if (chkField(/(^[0]{1}[6]{1})/, target.value, true)) {
                                      // cell phone number
                                      target.value = target.value.substr(0, 2) + "-" + target.value.substr(2);
                       } else {
                                      var netnummers_3 = new Array("010", "013", "015", "020", "023", "024", "026", "030", "033", "034", "035", "036", "038", "040", "041", "043", "045", "046", "050", "053", "055", "058", "070", "071", "072", "073", "074", "075", "076", "077", "078", "079");
                                      var touched = false;

                                      for (var i = 0; i < netnummers_3.length; i++) {
                                                      if (target.value.substr(0, 3) == netnummers_3[i]) {
                                                                     target.value = target.value.substr(0, 3) + "-" + target.value.substr(3);
                                                                     touched = true;
                                                                     break;
                                                      }
                                      }

                                      // if not handled by the 3-digit area code redefiner
                                      if (!touched) {
                                                      target.value = target.value.substr(0, 4) + "-" + target.value.substr(4);
                                      }
                       }

                       // check for a length of 11 digits (with hyphens allowed) precisely
                       if (!chkField(/(^([\d]|[\-]){11}$)/, target.value)) {
                                      return false;
                       }
                }

                return true;
}

function chkURLField(target) {
                if ((target.value.length == 0) || (chkField(/(^[a-zA-Z]+:\/\/)/, target.value, true))) return true;

                if (chkField(/([w]{3}\.)([a-zA-Z_0-9\.\-]+)(\.)([a-z]{2,4}$)/, target.value, true)) {
                       target.value = 'http://' + target.value;
                       return true;
                } else {
                       target.focus();
                       return false;
                }
}

function chkFieldLength(target, min) {
                if (target.value.length >= min) {
                       return true;
                } else {
                       alert("Dit veld moet minimaal "+min+" tekens lang zijn en heeft er slechts "+target.value.length+". Probeer het nogmaals.");
                       target.focus();
                       return false;
                }
}

function trim(str, chars) {
                return ltrim(rtrim(str, chars), chars);
}

function ltrim(str, chars) {
                chars = chars || "\\s";
                return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}

function rtrim(str, chars) {
                chars = chars || "\\s";
                return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
} 


