function getObjectArray(name, array) {
  var reg = new RegExp("^" + name + "\\[(.+?)\\](.*)");
  var objlist = new Object;
  for(key in array) {
     if (key == name) objlist[name] = array[key];
     else {
       var match = reg.exec(key);
       if (match) objlist[match[1] + match[2]] = array[key];
     }
  }
  return objlist;
}
function hashToNumArray(ElementHash) {
  var returnArray = Array();
  for (var ElementKey in ElementHash) returnArray[returnArray.length] = ElementHash[ElementKey];
  return returnArray;
}
function checkCount(ElementList) {
  var checkedCount = 0;
  for(var index = 0; index < ElementList.length; index++) {
    var Element = ElementList[index];
    if (Element.checked) checkedCount++;
  }
  return checkedCount;
}
function IsEmpty(aTextField) {
  if ((aTextField.value.length==0) || (aTextField.value==null)) {
    return true;
  }
  else {
    return false;
  }
}
function fM(number, length) {
  number = number.toString();
  var diff = length - number.length;
  for(var i = 0; i < diff; i++) number = "0" + number;
  return number;
}
function formatDate(dateObj, format) {
  var dateStr = new Array();
  var value = "";
  for(var index = 0; index < 3; index++) {
    var variable = format.substring(index, index + 1);
    if (variable == "d") value = fM(dateObj.getDate(), 2);
    else if (variable == "m") value = fM(dateObj.getMonth() + 1, 2);
    else if (variable == "y") value = dateObj.getFullYear();
    else value = ""; dateStr[index] = value;
  }
  return dateStr.join("/");
}
function validDate(dateStr, format) {
  var reg = new RegExp("([0-9]+)[/-]([0-9]+)[/-]([0-9]+)");
  var dateValues = new Object;
  var match = reg.exec(dateStr);
  if (!match) return false;
  for(var index = 0; index < 3; index++) {
    var variable = format.substring(index, index + 1);
    dateValues[variable] = match[index + 1];
  }
  var myDate = new Date();
  if (match) {
    if (dateValues["y"] < 25) dateValues["y"] = 2000 + parseInt(dateValues["y"]);
    else if (dateValues["y"] < 1900) dateValues["y"] = 1900 + parseInt(dateValues["y"]);
    myDate.setFullYear(dateValues["y"], dateValues["m"] - 1, dateValues["d"]);
    if ((myDate.getMonth() == dateValues["m"] - 1) && (myDate.getDate() == dateValues["d"]))
    return formatDate(myDate, format);
  }
  return false;
}
function validEmail(email) {
  var reg = new RegExp("^([A-Za-z0-9]([\\.\\-_][^\\.\\-_]|[A-Za-z0-9])*)@([A-Za-z0-9]([\\.\\-][^\\.\\-]|[A-Za-z0-9])*\\.[A-Za-z]{2,4})$");
  return reg.exec(email);
}
function showAlertAndFocus(isError, alertTextFieldname, focusElement) {
  var extraInfo = new Array();
  if (typeof(isError) != "string") {
    extraInfo = isError; isError = extraInfo.shift();
  }
  var errorText = "";
  /* 17     =is verplicht */
  /* 18     =Field */
  /* 19     =requires at least one select option */
  /* 20     =at least */
  /* 21     =a maximum of  */
  /* 22     =options must be selected */
  /* 23     =a maximum of one field may be selected */
  /* 24     =a selection must be made */
  /* 25     =a valid date is required */
  /* 26     =a valid email address is required */
  switch (isError) {
    case "errorEmpty":
      errorText = "\"" + alertTextFieldname + "\" is required";
      break;
    case "errorLessChecked":
      if (extraInfo[0] == 1) errorText = "Field \"" + alertTextFieldname + "\": requires at least one select option"; /* 19     =requires at least one select option */
      else errorText = "Field \"" + alertTextFieldname + "\": at least "+extraInfo[0]+" options must be selected";
      break;
    case "errorMaxChecked":
      if (extraInfo[0] == 1) errorText = "Field \"" + alertTextFieldname + "\": a maximum of one field may be selected";
      else errorText = "Field \"" + alertTextFieldname + "\": a maximum of "+extraInfo[0]+" options must be selected";
      break;
    case "errorSelectEmpty":
      errorText = "Field \"" + alertTextFieldname + "\": a selection must be made";
      break;
    case "errorInvalidDate":
      errorText = "Field \"" + alertTextFieldname + "\": a valid date is required (dd/mm/yyyy or dd-mm-yyyy)";
      break;
    case "errorInvalidEmail":
      errorText = "Field \"" + alertTextFieldname + "\": a valid email address is required";
      break;
  }
  alert(errorText);
  focusElement.focus();
}

function DummycheckFormElements(form, checkinfo) {
  form.submit();
}

function checkFormElements(form, checkInfo) {
  var elementList = new Object;
  for(var elementCounter = 0; elementCounter < form.length; elementCounter++) {
    var element = form.elements[elementCounter];
    if (typeof elementList[element.name] == "undefined") elementList[element.name] = element;
    else elementList[element.name + "[" + elementCounter + "]"] = element;
  }
  var mailElements = getObjectArray("mail", elementList);
  for(var i = 0; i < checkInfo.length; i++) {
    var requiredInfo = checkInfo[i];
    if (typeof(requiredInfo) == "string") requiredFieldName = requiredInfo;
    else requiredFieldName = requiredInfo[0];
    var requiredElement = getObjectArray(requiredFieldName, mailElements);
    var ElementsByNumIndex = hashToNumArray(requiredElement);
    if (ElementsByNumIndex.length != 0) {
      var FirstElementInList = ElementsByNumIndex[0];
      var isError = false;
      switch (FirstElementInList.type.toLowerCase()) {
        case "checkbox":
          var minCount = 1;
          var maxCount = 0;
          switch (requiredInfo.length) {
            case 3: maxCount = requiredInfo[2];
            case 2: minCount = requiredInfo[1];
          }
          var checkedCount = checkCount(ElementsByNumIndex);
          if ((checkedCount == 0) && (ElementsByNumIndex.length == 1)) isError = "errorEmpty";
          else if (checkedCount < minCount) isError = Array("errorLessChecked", minCount);
          else if ((maxCount != 0) && (checkedCount > maxCount)) isError = Array("errorMaxChecked", maxCount);
          break;
        case "radio":
          var checkedCount = checkCount(ElementsByNumIndex);
          if (checkedCount == 0) isError = "errorEmpty";
          break;
        case "select-one":
          if (FirstElementInList.options[FirstElementInList.selectedIndex].value == -1) isError = "errorSelectEmpty";
          break;
        case "text": case "textarea": case "password":
          if (IsEmpty(FirstElementInList)) isError = "errorEmpty";
          else if (requiredInfo.length == 2) {
            var newdate = "";
            if (requiredInfo[1] == "date")
              if (!(newdate = validDate(FirstElementInList.value,"dmy"))) isError = "errorInvalidDate";
              else FirstElementInList.value = newdate;
            else if (requiredInfo[1] == "email")
              if (!validEmail(FirstElementInList.value)) isError = "errorInvalidEmail";
          }
          break;
      }
      if (isError) {
        showAlertAndFocus(isError, requiredFieldName, FirstElementInList);
        return false;
      }
    }
  }
  form.submit();
}

