// $Id: script.js,v 1.17 2008-07-23 08:16:32 jasper Exp $
// $Name:  $

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);
        }
      }
      if (errors.length > 0) {
        alert("Er zijn fouten gevonden in de 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 && maxlengthSpan[0]) maxlengthSpan = maxlengthSpan[0];
      else return;
      var maxlength = getTextContent(maxlengthSpan);
      maxlength = parseInt(maxlength, 10);

      var p = document.createElement("p");
      p.appendChild(document.createTextNode("Tekens beschikbaar: "));
      maxlengthSpan.parentNode.parentNode.replaceChild(p, maxlengthSpan.parentNode);

      var span = document.createElement("span");
      span.appendChild(document.createTextNode(maxlength - textarea.value.length));
      p.appendChild(span);
      maxlengthSpan = span;

      function doOnChange() {
        var textLength = textarea.value.length;
        if (navigator.platform.indexOf("Win") >= 0 && navigator.userAgent.indexOf("Gecko") >= 0) {
          textLength = textarea.value.replace(/\r?\n/g, "\r\n").length;
        }
        if (maxlength < textLength) {
          textarea.value = textarea.value.substr(0, maxlength);
        }
        span = document.createElement("span");
        span.appendChild(document.createTextNode(maxlength - textLength));
        maxlengthSpan.parentNode.replaceChild(span, maxlengthSpan);
        maxlengthSpan = span;
      }
      if (maxlength > 0) {
        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) {
    if (fieldIsRequired(label) && ! fieldIsFilled(field))
      return "%1 is verplicht".replace("%1", getLabelText(label));

    if (field.className.match(/postcode\-cijfers/) && ! field.value.match(/^[1-9][0-9]{3}$/i))
      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" && ! field.checked) return false;
      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;
  }


  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) {
    return getTextContent(label);
  }


  for (var i = 0, form; form = document.forms[i]; i++) new Form(form);
}
new Forms();


function trim(str) { return str.replace(/\s+$/, ""); }


function getTextContent(node) {
  if (node.textContent) return node.textContent;
  var textContent = "";
  for (var i = 0, child; child = node.childNodes[i]; i++) {
    if (child.nodeType == 3) textContent += child.nodeValue;
    else textContent += getTextContent(child);
  }
  return textContent;
}
