//  FRONTOFFICE JS:  FORM_VALIDATE.JS
//
//  07-JUL-2011   DevRef:3883  lbuijsma
//  -- use extjs validation when convert form is used
//

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 hasClass(ele,cls) {
  return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
}			  

function submitForm(){formSubmit = true;}

// validateAndSend
function validateAndSend() {
  if(!validateOn) {
    findForm();
	validateOn=true;
  }
  // generate errormessage
  if(hasClass(formInitObj, 'x-form')) {
	for(a=0; a < frm_array.length; a++) {
		var htmldomform = frm_array[a][1];
		if(formInitObj==htmldomform) {
            if (!frm_array[a][0].isValid()) {document.getElementById('error_message').innerHTML = '<p style="color:'+errorColor+';">'+errorMessage+'</p>'; return;} else {frm_array[a][0].submit(); return;} 
		}
	}
  } else {  
	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;

  // generate errormessage
  if(hasClass(formname, 'x-form')) {
	for(a=0; a < frm_array.length; a++) {
		var htmldomform = frm_array[a][1];
		if(formname==htmldomform) {
            if (!frm_array[a][0].isValid()) {document.getElementById('error_message').innerHTML = '<p style="color:'+errorColor+';">'+errorMessage+'</p>'; return false;} else {frm_array[a][0].submit(); return false;} 
		}
	}	
  } else { 
    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;
}

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