//### validation rules ###//
/*
  Easy Function Reference - BASED ON rc_formValidtor to mimic via JS...

  checkNotEmpty($field, $msg='', $allowNull) - // essentialy does any data exist
  checkIsNumeric($field, $msg='', $allowNull) - // make sure that the data is a number
**  checkLength($field, $min, $max, $msg='', $allowNull) - //
**  checkIdentical($field, $field2, $msg='', $allowNull) - // used for testing against dual passwords or email entry
  checkIsValidEmail($field, $msg='', $allowNull) - // email validation only regex not MX records
  checkIsText($field, $msg='', $allowNull) - // not needed as alphanumrec is the same sort of thing
  checkIsAlphabetic($field, $msg='', $allowNull) - // same as checkIsNumeric but text only no special characters
  checkIsDigit($field, $msg='', $allowNull) - // same as checkIsNumeric but 0-9 only
  checkIsAlphanum($field, $msg='', $allowNull) - // essentially no special characters
**  checkPassword($field, $field2, $min, $max, $msg='', $allowNull)
**  checkIsOfValues($field, $validValues, $msg='', $allowNull)
**  checkIsWithinRange($field, $min, $max, $msg='', $allowNull)
**  checkIsSmallerThan($field, $value, $msg='', $allowNull)
**  checkIsGreaterThan($field, $value, $msg='', $allowNull)
  checkDateFormat($field, $format, $seperator='-', $msg='', $allowNull) - // checks date via regex dd/mm/yyyy only

** ones not done as yet,

*/

// event like listener for validation
function validDocEL(){
 $(".req1").blur( function() {  // if label has class validate and an input field
	 var v = $(this).attr("id"); // get ID to validate
	 var vr = $(this).attr("class"); // get all rules for input field
	inputCheck(v,vr) } );

	$(".req1").change( function() {  // capture input on change
	 var v = $(this).attr("id");
	 var vr = $(this).attr("class"); // get all rules for input field
	inputCheck(v,vr) } );
}



function validDoc(){
	 var formValidated = true;
	 $(".req1").each(function(i){  // if label has class validate and an input field
	  var v = $(this).attr("id"); // get ID to validate
	  var vr = $(this).attr("class"); // get all rules for input field
	  if(inputCheck(v,vr) == false){
	    //alert(inputCheck(v,vr));
	    formValidated = false;
	  }} );	
	
	if(formValidated == false){
	 // ThickBox pop up custom modal
	  $("#errorHere").removeClass("noDisplay");  
		//$("#customDialog h1").text("Form Errors Found");
	  //$("#customDialog .text").text("Please Check: Sorry we found an error/s, can you please check and correct all items marked in red.");
	  //tb_show('SORRY WE FOUND SOME ERRORS', '#TB_inline?height=200&width=335&inlineId=customDialog&modal=true', null);
	  //$("#TB_window").css({ border: "0", background:"transparent" });
	  return false;
	}
}


// used to pretest if the field is required and to split class data into usable items
function inputCheck(v,vr){
 var returnVar = true;
 rules = vr.split(" "); // array all classes at space
 $.each(rules, function(i, n){ // check all class values being 'rules'
  var doVal = n.search(/vr#/); // for each rule check for validation trigger vr#
   if(doVal != -1){ // if vr# exists run next pass to find rules
	   r = n.split("#"); // split at # to find all rules
	   rules = r[1];
	   // check to see if required exists...
	   if(r[1].search(/req/) != -1){
	     req = true;
	   }else{
	     req = false;
	   }
    if(validCheck(v,req,rules) == false){
      returnVar = false;
    }
   }
  }
 );
 return returnVar;
}

// the validator checks validation rules for the field sent
function validCheck(v,req,rules){	
	ru = rules.split(":"); // split at : to find an exact rule
	if(ru.length == 1 && req==true){ // check for just required value - find out how many items are in the array ru.lenght
	  return checkNotEmpty(v);
	}else if(ru[0] == 'email' || ru[1] == 'email'){ // email check
	  return checkIsValidEmail(v,req);
	}else if(ru[0] == 'phone'){
	  return phoneNumber(v,req,ru[1],ru[2]);
	}else if(ru[1] == 'phone'){
	  return phoneNumber(v,req,ru[2],ru[3]);
	}else if(ru[0] == 'number'){
	  return checkIsNumeric(v,req,ru[1],ru[2]);
	}else if(ru[1] == 'number'){
	  return checkIsNumeric(v,req,ru[2],ru[3]);
	}else if(ru[0] == 'numericString'){
	  return checkIsNumericString(v,req,ru[1],ru[2]);
	}else if(ru[1] == 'numericString'){
	  return checkIsNumericString(v,req,ru[2],ru[3]);
	}else if(ru[0] == 'date' || ru[1] == 'date'){ // email check
	  return checkDateFormat(v,req);
	}else if(ru[0] == 'alpha' || ru[1] == 'alpha'){ // email check
	  return checkIsAlphanum(v,req);
	}else if(ru[0] == 'string'){
	  return checkStringLength(v,req,ru[1],ru[2]);
	}else if(ru[1] == 'string'){
	  return checkStringLength(v,req,ru[2],ru[3]);
	}else if(ru[0] == 'digit' || ru[1] == 'digit'){ // email check
	  return checkIsDigit(v,req);
	}else if(ru[0] == 'alphab' || ru[1] == 'alphab'){ // email check
		return checkIsAlphabetic(v,req);
	}else{ 
		if (ru[0] == 'checkbox' || ru[1] == 'checkbox'){	
			return checkIsChecked(v, req);
		}	
	
		return false;
	}
} // end validCheck

function checkStringLength(v, req, minlen, maxlen)
{
	val = document.getElementById(v).value;
	if(val == ''){ // check if this is a required field
		if(req) {
			return failure(v, 'A password is required');
		} else {
			return successFalse(v);
		}
	}
	
	if(minlen) {
		if(val.length < minlen) {
			return failure(v, 'Minimum length required is ' + minlen);
		}
	}

	if(maxlen) {
		if(val.length > maxlen) {
			return failure(v, 'Maximum length required is ' + maxlen);
		}
	}

	return success(v);
}

// basic does this exist data
function checkNotEmpty(v){
 var fielddata = document.getElementById(v).value;
 var data = $.trim(fielddata);
 var m = 'This field is required'; // message for this error
  if(data==null || data==""){
		  return failure(v,m);
	 }else{
		  return success(v);
	 }
}


//Checks if a checkbox has been checked
function checkIsChecked(v,req) {
  var data=document.getElementById(v).checked;
  var m = 'This is required';
  if (!data) 
  	return failure(v, m);
  else
  	return success(v);
  
 }
  

// numbers only including .
function checkIsNumeric(v,req,minExclusive,maxExclusive) {
  var data=document.getElementById(v).value;
  var data=$.trim(data).replace(/[a-zA-Z ,\$\-]+/g,'');

  if(req==true && data == '' || data == null){ // check if this is a required field
    var m = 'A number is required'; // message for this error
	   return failure(v,m);
  }
  
  if(data != ''){
		if((typeof minExclusive != 'undefined') && minExclusive !== null) {
			if(data <= minExclusive) {
				return failure(v,'The value for this field must be greater than ' + minExclusive);
			}
		}

		if((typeof maxExclusive != 'undefined') && maxExclusive !== null) {
			if(data >= maxExclusive) {
				return failure(v,'The value for this field must be lesser than ' + maxExclusive);
			}
		}

		document.getElementById(v).value = data;
	   return success(v);
  }
  
  if(data == '' && req == false){
    document.getElementById(v).value = data;
	   return successFalse(v);
  }

   var m = 'Expecting numbers only please correct'; // message for this error
   return failure(v,m);
}

function checkIsNumericString(v,req,minLength,maxLength) {
  var data=document.getElementById(v).value;
  var data=$.trim(data).replace(/[a-zA-Z ,\$\-]+/g,'');

  if(req==true && data == '' || data == null){ // check if this is a required field
    var m = 'A number is required'; // message for this error
	   return failure(v,m);
  }
  
  if(data != ''){
		if((typeof minLength != 'undefined') && minLength !== null) {
			if(data.length < minLength) {
				return failure(v,'You must type at least ' + minLength + ' characters');
			}
		}

		if((typeof maxLength != 'undefined') && maxLength !== null) {
			if(data.length >= maxLength) {
				return failure(v,'You must type at least ' + maxLength + ' characters');
			}
		}

		document.getElementById(v).value = data;
	   return success(v);
  }
  
  if(data == '' && req == false){
    document.getElementById(v).value = data;
	   return successFalse(v);
  }

   var m = 'Expecting numbers only please correct'; // message for this error
   return failure(v,m);
}

// phone number data
function phoneNumber(v,req,minLength,maxLength){

	if(!minLength) {
		minLength = 8;
	}

	if(!maxLength) {
		maxLength = 15;
	}

	var tnumber=$.trim(document.getElementById(v).value);
	//var telnr = /^\+?[0-9 ()-.]+[0-9]?$/;
	var telnr = /^\+?[0-9\-\.]+$/;
	if(tnumber == ''){ // check if this is a required field
		if(req==true) {
			var m = 'A phone number is required'; // message for this error
			return failure(v,m);
		}

		return successFalse(v);
	}

	if(tnumber != '' && telnr.test(tnumber)){
		if(tnumber.length >= minLength && tnumber.length <= maxLength){
		    return success(v);
		}

		var m = 'The phone number must have at least ' + minLength + 
			' digits and at most ' + maxLength + ' digits.'; // message for this error
		return failure(v,m);
	}

	var m = 'Phone number must include area code and no space For e.g. 0755912833'; // message for this error
	return failure(v,m);
}

/*
function checkDateFormat(v,req){
	  var dateE=$.trim(document.getElementById(v).value);
	  var dateChar=/(0[1-9]|[12][0-9]|3[01])+\/(0[1-9]|1[012])+\/(19|20)\d\d/;
	  if(req==true && dateE == ''){ // check if this is a required field
	    var m = 'A date is required'; // message for this error
		   return failure(v,m);
	  }else if(dateE != '' && dateChar.test(dateE) || req==false && dateChar.test(dateE)){
		   return success(v);
	  }else if(dateE == '' && req == false){
		   return successFalse(v);
	  }else{
	    var m = 'Not a valid date format, expecting dd/mm/yyyy. Please use pop up selector or re-type'; // message for this error
		   return failure(v,m);
	  }
}
*/

function checkDateFormat(v,req){
	var dateE=$.trim(document.getElementById(v).value);

	if(dateE == ''){ // check if this is a required field
		if(req) {
			return failure(v, 'A date is required');
		} else {
			return successFalse(v);
		}
	}

	parts = dateE.split('/');
	d = parts[0]; 
	m = parts[1]; 
	y = parts[2];
	if(	
		(d > 0 && d < 32) && 
		(m > 0 && m < 13) &&
		(y > 1900 && y < 2100)
	) {
		return success(v);
	}

	var m = 'Not a valid date format, expecting dd/mm/yyyy. Please use pop up selector or re-type'; // message for this error
	return failure(v,m);
}

// check is alphanumeric
function checkIsAlphanum(v,req){
	  var dataA=$.trim(document.getElementById(v).value);
	  var dateChar=/^[a-z0-9]+$/i;
	  if(req==true && dataA == ''){ // check if this is a required field
	    var m = 'Some input is required'; // message for this error
		   return failure(v,m);
	  }else if(dataA != '' && dateChar.test(dataA) || req==false && dateChar.test(dataA)){
		   return success(v);
	  }else if(dataA == '' && req == false){
		   return successFalse(v);
	  }else{
	    var m = 'Please use numbers or text only, no special characters like (.,)*&^ etc...'; // message for this error
		   return failure(v,m);
	  }
}

// check is digit
function checkIsDigit(v,req){
	  var dataA=$.trim(document.getElementById(v).value);
	  var dateChar=/^[0-9]+$/;
	  if(req==true && dataA == ''){ // check if this is a required field
	    var m = 'Some input is required'; // message for this error
		   return failure(v,m);
	  }else if(dataA != '' && dateChar.test(dataA) || req==false && dateChar.test(dataA)){
		   return success(v);
	  }else if(dataA == '' && req == false){
		    return successFalse(v);
	  }else{
	    var m = 'Please use numbers only, no special characters like (.,)*&^ etc... or text a-z'; // message for this error
		   return failure(v,m);
	  }
}

// check is alphabetic
function checkIsAlphabetic(v,req){
	  var dataA=$.trim(document.getElementById(v).value);
	  var dateChar=/^[a-z]+$/i;
	  if(req==true && dataA == ''){ // check if this is a required field
     var m = 'Some input is required'; // message for this error
		   return failure(v,m);
	   }else if(dataA != '' && dateChar.test(dataA) || req==false && dateChar.test(dataA)){
      return success(v);
	   }else if(dataA == '' && req == false){
		    return successFalse(v);
	   }else{
	     var m = 'Please use a-z or A-Z only, and no special characters like (.,)*&^ etc...'; // message for this error
		    return failure(v,m);
	   }
}

// email check
function checkIsValidEmail(v,req){
	  var emaile=$.trim(document.getElementById(v).value);
	  var emailchar=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
	  if(req==true && emaile == ''){ // check if this is a required field
	    var m = 'An email address is required'; // message for this error
		   return failure(v,m);
	  }else if(emaile != '' && emailchar.test(emaile) || req==false && emailchar.test(emaile)){
		   return success(v);
	  }else if(emaile == '' && req == false){
 		 return successFalse(v);
	  }else{
	    var m = 'Not a valid email address'; // message for this error
		   return failure(v,m);
	  }

}


// failure details, change class and add comments
function failure(v,m){ var fail = true;$('#' + v).css({"border":"1px solid #CC0000"});$('#' + v).addClass("failApp"); $('#sta_' + v).addClass("failApp");$('#sta_' + v).removeClass("successApp");$('#' + v).removeClass("successApp");$('#' + v + '_msg').css({display:"block"}); $('#' + v + '_msg').html(m);return false;}
// success details, display green for go class
function success(v){$('#' + v).css({"border":"1px solid #79A450"});$('#' + v).removeClass("failApp");$('#sta_' + v).removeClass("failApp");$('#' + v).removeClass("error-php");$('#sta_' + v).addClass("successApp");$('#' + v).addClass("successApp");$('#' + v + '_msg').css({display:"none"});return true;}
// success false is a success without requiring a tick
function successFalse(v){$('#' + v).removeClass("failApp");$('#sta_' + v).removeClass("failApp");$('#sta_' + v).removeClass("successApp");$('#' + v).removeClass("successApp");$('#' + v + '_msg').css({display:"none"});return true;}

//### end validation rules ###//




//### common functions ###//

function getKeyCode(e)
{
	if (window.event) {
		return window.event.keyCode;
	}

	return e ? e.which : null;
}

function keyRestrict(e, validchars)
{
	key = getKeyCode(e);

	if(key == null || key == 0 || key == 8 || key == 9 || key == 13 || key == 27 ) {
		return true;
	}

	keychar = String.fromCharCode(key).toLowerCase();
	validchars = validchars.toLowerCase();

	if(validchars.indexOf(keychar) != -1) {
		return true;
	}

	return false;
}


