FormCheck = [];
/*
 * Initialize form check: add event handler
 * form = id of the form (<form id="")
 * error = id of the global error message (<div id="")
 */
initFormCheck = function(form,error) {
   FormCheck.form = document.getElementById(form) ? document.getElementById(form) : form;
   FormCheck.error = document.getElementById(error) ? document.getElementById(error) : error;
   var el = FormCheck.form.getElementsByTagName("*");
   for (var i=0;i<el.length;i++) {
      if (el[i].className && el[i].className.match("checkform")) {
         el[i].onsubmit = validateAll;
      }
      if (el[i].className && el[i].className.match("require") && !el[i].className.match("nocheck")) {
         el[i].onblur = validate;
         //el[i].onchange = validate;
      }
      if (el[i].type == "radio" || "checkbox") {
         if(!el[i].className.match("nocheck")) {
            el[i].onblur = function() {
               validate.call(this);
               return true; 
            };
         }
      }
   }
}
/*
 * Initializes form check for additional form part (activated by checkbox)
 * switcher = id of the switching checkbox (needs the state)
 * optionalpart = additional part to be or not to be displayed
 * form = id of the form (<form id="")
 * error = id of the global error message (<div id="")
 */
initOptionalCheck = function(switcher, optionalpart, form, error) {
   if(document.getElementById(form) && document.getElementById(optionalpart) && document.getElementById(error)) {
      if(switcher.checked) {
         document.getElementById(optionalpart).style.display= "block";
      } else {
         document.getElementById(optionalpart).style.display= "none";
      }
      var el = FormCheck.form.getElementsByTagName("*");
      for (var i=0;i<el.length;i++) {
         if (el[i].className && el[i].className.match("optional")) {
            if(switcher.checked) {
               el[i].onblur = validate;
            } else {
               el[i].onblur = dummy;
            }
         }
      }
   }
}
/*
 * no validation; must overwrite eventhandler
 */
dummy = function() {
   //no validation; must overwrite eventhandler
   return true;
}
/*
 * validates all input fields of the form
 */
validateAll =  function() {
   var result = "";
   var el = FormCheck.form.getElementsByTagName("*");

   for (var i=0;i<el.length;i++) {
      if (el[i].className && el[i].className.match("require")) {
         result += this.validate(el[i]);
      }
      if(document.getElementById("optionalswitch") && document.getElementById("optionalswitch").checked) {
         if (el[i].className && el[i].className.match("optional")) {
            result += this.validate(el[i]);
         }
      }
   }
    if (result.indexOf('false') > -1) {
        return false;
    }
    return true;
}


/*
 * validates one input field and returns true|false
 * obj = input object
 */
validate = function(obj) {
   var errorBackground = "#ecf0f5";
   var defaultBackground = "#fff";
   var loader = (typeof(this.nodeName)=='undefined') ? obj : this;
   var passok = true;
   var isOptional = false;
   var classItem = loader.className.split(' ');
   
   if(loader.tagName=='input' || loader.tagName=='select' || loader.tagName=='INPUT' || loader.tagName=='SELECT') {
      loader.style.background = defaultBackground;
   }
   //optional: reset default background
   if (loader.parentNode!=null && loader.parentNode.className!="form-submit") {
      loader.style.background = defaultBackground;
   }
   for (var i=0; i<classItem.length; i++) {
      if(classItem[i]=="empty") isOptional= true;
   }
   if(isOptional && loader.value=="") return true;
   
   for (var i=0; i<classItem.length; i++) {
      if(classItem[i].match("min") || classItem[i].match("max")) {
         var value= parseInt(classItem[i].substr(3));
         if(classItem[i].match("min")) {
            if(loader.value.length<value) {
               passok= false;
               break;
            }
         } else if (classItem[i].match("max")) {
            if(loader.value.length>value) {
               passok= false;
               break;
            }
         }
      } else {
         switch (classItem[i]) {
            case "notempty" :
               passok = passok && (loader.value!="");
               break;
            case "email" :
               passok = passok && (loader.value.match(/^[\w\.\-\,\+]+@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$/)!=null);
               break;
            case "num" :
               passok = passok && (loader.value.match(/^\d+$/)!=null);
               break;
            case "agree" :
               passok = passok && loader.checked;
               break;
            case "radio" :
            case "checkbox" :
               passok = passok && checkRadio.call(loader);
               break;
            case "password" :
               passok = passok && checkPassword.call(loader);
               break;
            case "nospace" :
   	         passok = passok && (loader.value.indexOf(" ")<0);
   	         break;
            case "lowercase" :
   	         loader.value= loader.value.toLowerCase();
   	         break;
            case "uppercase" :
   	         loader.value= loader.value.toUpperCase();
   	         break;
            case "nospecialchars" :
               passok = passok && (loader.value.match(/^[A-Za-z0-9]/)!=null);
               break;
            default :
               //no validation
               break;
         }
      }
   }
   if (passok != true) {
      displayWarning.call(loader,"block");
      //optional: set error background
      loader.style.background = errorBackground;
   } else {
      displayWarning.call(loader,"none");
   }
   return passok;
}
/*
 * function to submit the form
 */
formCheckSubmit = function(TEHForm) {
   displayWarning("none",FormCheck.error);
   if (validateAll()) {
      document.forms[TEHForm].submit();
   } else {
      displayWarning("block",FormCheck.error);
   }
}
/*
 * check a radio button
 */
checkRadio = function() {
   var el = FormCheck.form.getElementsByTagName("input");
   for (var i=0;i<el.length;i++) {
      if (el[i].name == this.name && el[i].checked) {
         return true;
      }
   }
   return false;
}
/*
 * check all password fields to be equal (className password and classNames must be equal)
 */
checkPassword = function() {
   var el = FormCheck.form.getElementsByTagName("input");
   for (var i=0;i<el.length;i++) {
      if (el[i].type==this.type && el[i].className==this.className) {
         if (el[i].value=="" || this.value=="" || el[i].value!=this.value) {
            el[i].style.background = "#ecf0f5";
            return false;
         } else {
            el[i].style.background = "#fff";
         }
      }
   }
   return true;
}
/*
 * displays a warning for each field (must have the same parent as the object)
 */
displayWarning = function(state, obj) {
   if (obj) {
      obj.style.display = state;
   } else {
      if (this.parentNode.childNodes.length != 0) {
         for (var i=0;i<this.parentNode.childNodes.length;i++) {
            if (this.parentNode.childNodes[i].className && this.parentNode.childNodes[i].className.match("warning")) {
               this.parentNode.childNodes[i].style.display = state;
            }
         }   
      }
   }
}


