/* $Id: formchecker.js,v 1.1.1.1 2009-06-09 12:36:34 joop Exp $ */

function Forms()
{

  function Form(form)
  {
    var errors = [];

    function doOnSubmit()
    {
      errors = [];
      var error, field;
      var labels = form.getElementsByTagName("label");
      for (var i = 0, label; label = labels[i]; i++)
      {
        field = getFieldForLabel(label);
        if (field)
        {
          trimField(field);
          error = getErrorForField(label, field);
          if (error != "") errors.push(error);
        }
      }
      // todo: custom functie met lastigere checks aanroepen
      if (errors.length > 0)
      {
        alert("Er zijn fouten gevonden in je invoer:\n\n- "+ errors.join("\n- "));
        return false;
      }
      else return true;
    }
    form.onsubmit = doOnSubmit;


    function TextArea(textarea)
    {
      var maxlengthSpan = textarea.parentNode.getElementsByTagName("span");
      if (maxlengthSpan[0]) maxlengthSpan = maxlengthSpan[0];
      else return;
      var maxlength = parseInt(maxlengthSpan.innerHTML, 10);

      function doOnChange()
      {
        if (maxlength < textarea.value.length) {
          textarea.value = textarea.value.substr(0, maxlength);
        }
        maxlengthSpan.innerHTML = "<b>"+ (maxlength - textarea.value.length) +"</b> / "+ maxlength;
      }
      if (maxlength)
      {
        textarea.onkeyup = doOnChange;
        textarea.onchange = doOnChange;
        doOnChange();
      }
    }

    function initTextAreaMaxLengths()
    {
      var textareas  = form.getElementsByTagName("textarea");
      for (var i = 0, textarea; textarea = textareas[i]; i++)
      {
        new TextArea(textarea);
      }
    }
    initTextAreaMaxLengths();

  }


  function getErrorForField(label, field)
  {
    var isRequired = fieldIsRequired(label);

    if (isRequired && ! fieldIsFilled(field)) return "'%1' is verplicht".replace("%1", getLabelText(label));

    // Als niet verplicht en checkbox dan OK
    if (! isRequired && field.type == "checkbox") return "";
    // Als niet verplicht en radiobutton dan OK
    if (! isRequired && field.type == "radio") return "";
    // Als niet verplicht en leeg dan OK
    if (! isRequired && ! fieldIsFilled(field)) return "";

    if (field.className.match(/email/) && ! field.value.match(/^[\w-\.\']{1,}\@([\da-z-]{1,}\.){1,}[\da-z-]{2,}$/i)) // 'quote om syntax-highlighting weer goed te krijgen...
      return "%1 is incorrect".replace("%1", getLabelText(label));

    return "";
  }


  function fieldIsRequired(label)
  {
    return (label.parentNode.tagName == "STRONG");
  }


  function trimField(field)
  {
    if (field.tagName == "INPUT")
    {
      if (field.type == "text" || field.type == "password") field.value = trim(field.value);
    }
    else if (field.tagName == "TEXTAREA") field.value = trim(field.value);
  }


  function fieldIsFilled(field)
  {
    if (field.tagName == "INPUT")
    {
      if (field.type == "text"      && field.value == "") return false;
      if (field.type == "password"  && field.value == "") return false;
      if (field.type == "checkbox") return checkboxIsChecked(field);
      if (field.type == "radio")    return radioIsChecked(field);
    }
    else if (field.tagName == "TEXTAREA")
    {
      if (field.value == "") return false;
    }
    else if (field.tagName == "SELECT")
    {
      if (field[field.selectedIndex].value == "") return false;
    }
    return true;
  }


  // 2007-10-10, JV : added
  function checkboxIsChecked(field)
  {
    // If one single checkbox - return checked value
    if (field.name.indexOf("[0]") < 0) return field.checked;

    var i = 0;
    var fieldName = field.name;
    var box = field.form.elements[fieldName][0];  // Het 0-de element is de checkbox, het 1-ste element de hidden input met dezelfde naam
    var isChecked = box.checked;

    while (! (box == undefined) && ! isChecked)
    {
      i++;
      fieldName = fieldName.replace(i-1, i);
      box = field.form.elements[fieldName];
      if (! (box == undefined))
      {
        box = field.form.elements[fieldName][0];
        isChecked = box.checked;
      }
    }

    return isChecked;
  } // checkboxIsChecked


  function radioIsChecked(field)
  {
    var radios = field.form.elements[field.name];
    if (radios)
    {
      for (var i = 0, radio; radio = radios[i]; i++)
        if (radio.checked) return true;
    }
    return false;
  }


  function getFieldForLabel(label)
  {
    return document.getElementById(label.htmlFor);
  }


  function getLabelText(label)
  {
    if (label.textContent) return label.textContent;
    return label.innerHTML.replace(/<[^>]+>/g, "");
  }


  for (var i = 0, form; form = document.forms[i]; i++) new Form(form);
}
new Forms();


function trim(str) { return str.replace(/\s+$/, ""); }


// Exclude options by disabling them when one ore more elements in the group are checked
function excludeOptions(group, exclude)
{
  var disabledState = false;

  for (var i = 0; i < group.length; i++)
  {
    if (document.getElementById(group[i]).checked)
    {
      disabledState = true;
      break;
    }
  }

  for (var j = 0; j < exclude.length; j++)
    document.getElementById(exclude[j]).disabled = disabledState;
} // excludeOptions

