// ----------------------------------
// FORM VALIDATION
// Copyright 2008 - Hireserve BV
// ----------------------------------

// v1.0   12/3/2008 lb

var formname;
var validateOn=false;
var reqChecked=null;
var message = '';
var correctMessage = 'All required fields have been entered. You can send the form now.';
var correctColor = '#009900';
var errorMessage = 'Please check all fields marked red. They are not entered correctly.';
var errorColor = '#ff4324';

var validations = new Array(new validationFunction("required", requiredF, initRequiredF),
              new validationFunction("isnumeric", isnumericF),
              new validationFunction("isemail", isemailF),
              new validationFunction("isdate", isdateF));


function submitForm(){formSubmit = true;}

// validateAndSend
function validateAndSend() {
  if(!validateOn) {findForm();validateOn=true;}
  message = validateForm(formInitObj);
  if(message == "" && formSubmit == true) {
    if(document.getElementById("loaderContainer")) document.getElementById("loaderContainer").style.display='none';
    formInitObj.submit();
  }
  else if(message == "" && formSubmit == false) {
    if(!document.getElementById('error_message')){
      null;
    } else {
      document.getElementById('error_message').innerHTML = '<p style="color:'+correctColor+';">'+correctMessage+'</p>';
    }
  } else {
    formSubmit = false;
    if(!document.getElementById('error_message')) {
      null;
    } else {
      document.getElementById('error_message').innerHTML = '<p style="color:'+errorColor+';">'+errorMessage+'</p>';
    }
  }
}

// initValidateAndSend
function initValidateAndSend(e) {
  formSubmit = true;
  // find form element
  if(e.parentNode.nodeName == 'FORM') {formname = e.parentNode;}
  if(e.parentNode.parentNode.nodeName == 'FORM') {formname = e.parentNode.parentNode;}
  if(e.parentNode.parentNode.parentNode.nodeName == 'FORM') {formname = e.parentNode.parentNode.parentNode;}
  initForm(formname);
  validateOn = true;

  // init
  // initForm(formname);
  // alert(formname.getAttribute('name'));

  // generate errormessage
  message = validateForm(formname);

  if(message == "" && formSubmit == true) {
    if(document.getElementById("loaderContainer")) document.getElementById("loaderContainer").style.display='none';
    formInitObj.submit();
  }
  else if(message == "" && formSubmit == false) {
    if(!document.getElementById('error_message')){
      null;
    } else {
      document.getElementById('error_message').innerHTML = '<p style="color:'+correctColor+';">'+correctMessage+'</p>';
    }
  } else {
    formSubmit = false;
    if(!document.getElementById('error_message')) {
      null;
    } else {
      document.getElementById('error_message').innerHTML = '<p style="color:'+errorColor+';">'+errorMessage+'</p>';
    }
  }
}


function keypressed () { if(message.length > 0) validateAndSend(); }
document.onkeyup = keypressed;
document.onclick = keypressed;


// **************************************************************************************************
// VALIDATE FORM INITIALIZE
//

function findForm() {
  if(!document.getElementsByTagName) return false;
  if(typeof(sendForm) == "undefined") {
    var forms = document.getElementsByTagName('FORM');
    for(var i=0; i<forms.length; i++) {
      formname = forms[i].getAttribute('name');
      eval('initForm(document.forms.'+formname+')');
      validateOn=true;
    }
  } else {
    eval('initForm(document.forms.'+sendForm+')');
    validateOn=true;
  }
}

function initForm(fObj){
  formInitObj = fObj;
}

// **************************************************************************************************


// **************************************************************************************************
// VALIDATE FORM CORE PROCEDURE
// 1) loop through all form fields
// 2) read class(es)
// 3) per class we check for a validation implementation, if available we test the value
// 4) per validationtest and field we test for invalidity, once invalid we know enough and
//    dont need any other validation

function validateForm(fObj) {

  for(var i=0;i<validations.length;i++) {
    if(validations[i].initialize!=null) validations[i].initialize();
  }
  var sError="";

// ** 1) loop through all form fields
  for(var i=0;i<fObj.length;i++) {
    var fField = fObj[i];
    if(fField.type!="submit") {
// ** 2) read class(es)
      var sClasses = fField.className.split(" ");
// ** 3) per class we check for a validation implementation, if available we test the value
      for(var u=0;u<sClasses.length;u++) {
        var callback = getValidationByName(sClasses[u]);
        if(callback!=null) {
// ** 4) per validationtest and field we test for invalidity, once invalid we know enough and dont need any other validation
          if(!callback(fField)) {
            sError+=" [" + getErrorMessage(fField) + "] ";
            fField.style.background = "#FFCCCC";
            break;
          }else{
            fField.style.background = "#FFFFFF";
          }
        }
      }
    }
  }
  if(sError!="") {
    return "\n\n"+sError;
  } else {
    return '';
  }
}
// **************************************************************************************************



// **************************************************************************************************
// VALIDATE FORM FUNCTIONS
//

function requiredF(field) {
  // ** 1) check simple fields first: if text or checkbox
  var bRes = ((field.type=="text"||field.type=="password"||field.type=="textarea"||field.type=="file") && field.value!="" && validateNotEmpty(field.value))||(field.type=="checkbox" && field.checked && field.checked==true);
  // ** 2) check radiobutton because they can be part of a group
  if(field.type=="radio") {
    for(var i=0;i<reqChecked.length;i++) {
    if(reqChecked[i]==field.name) return true;
  }
    reqChecked[reqChecked.length]=field.name;
    for(var i=0;i<field.form.length;i++) {
    if(field.form[i].name==field.name && field.form[i].type=="radio" && field.form[i].checked) return true;
  }
  }
  if(field.type=="select-one"||field.type=="select-multiple") {
    for(var i=(field.type=="select-one"?1:0);i<field.length;i++) {
    if(field[i].selected) return true;
  }
  }
  return bRes;
}

function initRequiredF() {
  reqChecked = new Array();
}

function isnumericF(field) {
  return (!field.value || !isNaN(field.value));
}

function isemailF(field) {
  return (!field.value || field.value.search(/^[\w-\.]+@[\w-\.]+\.\w+$/)>-1);
}

function isdateF(field) {
  var RegExPattern = /^(?=\d)(?:(?!(?:(?:0?[5-9]|1[0-4])(?:\.|-|\/)10(?:\.|-|\/)(?:1582))|(?:(?:0?[3-9]|1[0-3])(?:\.|-|\/)0?9(?:\.|-|\/)(?:1752)))(31(?!(?:\.|-|\/)(?:0?[2469]|11))|30(?!(?:\.|-|\/)0?2)|(?:29(?:(?!(?:\.|-|\/)0?2(?:\.|-|\/))|(?=\D0?2\D(?:(?!000[04]|(?:(?:1[^0-6]|[2468][^048]|[3579][^26])00))(?:(?:(?:\d\d)(?:[02468][048]|[13579][26])(?!\x20BC))|(?:00(?:42|3[0369]|2[147]|1[258]|09)\x20BC))))))|2[0-8]|1\d|0?[1-9])([-.\/])(1[012]|(?:0?[1-9]))\2((?=(?:00(?:4[0-5]|[0-3]?\d)\x20BC)|(?:\d{4}(?:$|(?=\x20\d)\x20)))\d{4}(?:\x20BC)?)(?:$|(?=\x20\d)\x20))?((?:(?:0?[1-9]|1[012])(?::[0-5]\d){0,2}(?:\x20[aApP][mM]))|(?:[01]\d|2[0-3])(?::[0-5]\d){1,2})?$/;
  return (!field.value || field.value.search(RegExPattern)>-1);
}

function validationFunction(name, callback, init) {
  this.name = name;
  this.callback = callback;
  this.initialize = init;
}

function getValidationByName(name){
  for(var i=0;i<validations.length;i++)
    if(validations[i].name==name) return validations[i].callback;
  return null;
}

// remove leading and trailing spaces
function trimAll( strValue ) {
  var objRegExp = /^(\s*)$/;
  //check for all spaces
  if(objRegExp.test(strValue)) {
    strValue = strValue.replace(objRegExp, '');
    if( strValue.length == 0) return strValue;
  }
  //remove leading and trailing whitespace characters
  objRegExp = /^(\s*)([\W\w]*)(\b\s*$)/;
  if(objRegExp.test(strValue)) {
    strValue = strValue.replace(objRegExp, '$2');
  }
  return strValue;
}

// validate string is not all blank (whitespace) characters
function validateNotEmpty(strValue) {
   var strTemp = strValue;
   strTemp = trimAll(strTemp);
   if(strTemp.length > 0){
     return true;
   }
   return false;
}

// generate error message
function getErrorMessage(field){
  var lblErrMsg = document.getElementById((field.type=="radio"?field.name:field.id) + "ErrorMessage");
  if(lblErrMsg!=null) return lblErrMsg.innerHTML;
}

// **************************************************************************************************