/**
 * jQuery Validation Plugin 1.8.1
 *
 * http://bassistance.de/jquery-plugins/jquery-plugin-validation/
 * http://docs.jquery.com/Plugins/Validation
 *
 * Copyright (c) 2011 Alex Petroni
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *  
 *  Develop for the PdlUS 2 steps i-frame
 */

/**
  * Check that name contains only letters, point, hyphen or spaces.
  *
  *
  * @name jQuery.validator.methods.namecharacters
  * @type Boolean
  * @cat Plugins/Validate/Methods
  */
jQuery.validator.addMethod(
		"namecharacters", 
		function(value, element, param) {
			value = $.trim(value);
			return this.optional(element) || value.match(/^[a-z]{2,}[-a-z.\s]*$/i);
}, jQuery.validator.format("Letters, spaces or hyphen only please."));


jQuery.validator.addMethod("alphanumericwithbasicpunc", function(value, element) {
	value = $.trim(value);
	return this.optional(element) || /^\w+[-.,()'\"\s]*/i.test(value);
}, "Letters, numbers and basic punctuation only please");  


jQuery.validator.addMethod("positiveinteger", function(value, element) {
	return this.optional(element) || /^[1-9]\d*$/.test(value);
}, "A positive  non-decimal number please");





jQuery.validator.addMethod('mobileUKnoSpaces', function(phone_number, element) {
return this.optional(element) || phone_number.length > 9 &&
phone_number.match(/^((0|\+44)7(5|6|7|8|9){1}\d{2}\d{6})$/);
}, 'Please specify a valid mobile number, no spaces');


jQuery.validator.addMethod('phoneUKnoSpaces', function(phone_number, element) {
return this.optional(element) || phone_number.length > 9 &&
phone_number.match(/^(\(?(0|\+44)[1-9]{1}\d{1,4}?\)?\d{3,4}\d{3,4})$/);
}, 'Please specify a valid phone number, no spaces');






/**
  * Return true, if the value is a valid date, for a date in ISO format dd/mm/yyyy and the age at least the minAgeAllowed
  *
  *
  * @name jQuery.validator.methods.minAgeITAFormat
  * @type Boolean
  * @cat Plugins/Validate/Methods
  */
jQuery.validator.addMethod(
		"minAgeITAFormat", 
		function(value, element, param) {
		var check = false;
		var minAgeAllowed = param;
		var re = /^\d{1,2}[\/-]\d{1,2}[\/-]\d{4}$/;
		if( re.test(value)){
			var adata = value.split(/[-\/]/);
			var dd = parseInt(adata[0],10);
			var mm = parseInt(adata[1],10);
			var yyyy = parseInt(adata[2],10);
			var birthDate = new Date(yyyy,mm-1,dd);
			
			var nowDate = new Date();
			
				
			var age = nowDate.getFullYear() - birthDate.getFullYear() - (nowDate.getMonth() < birthDate.getMonth() || (nowDate.getMonth() == birthDate.getMonth() && nowDate.getDate() < birthDate.getDate()));
			
			if(age >= minAgeAllowed)
			{
				check = true;
			}
		}	
	return this.optional(element) || check;
}, jQuery.validator.format("You must have at least {0} years to be eligible."));



/**
  * Return true, if the value is a valid date, for a date in ISO format dd/mm/yyyy and the age at least the maxAgeAllowed
  *
  *
  * @name jQuery.validator.methods.maxAgeITAFormat
  * @type Boolean
  * @cat Plugins/Validate/Methods
  */
jQuery.validator.addMethod(
		"maxAgeITAFormat", 
		function(value, element, param) {
		var check = false;
		var maxAgeAllowed = param;
		var re = /^\d{1,2}[\/-]\d{1,2}[\/-]\d{4}$/;
		if( re.test(value)){
			var adata = value.split(/[-\/]/);
			var dd = parseInt(adata[0],10);
			var mm = parseInt(adata[1],10);
			var yyyy = parseInt(adata[2],10);
			var birthDate = new Date(yyyy,mm-1,dd);
			
			var nowDate = new Date();
			
				
			var age = nowDate.getFullYear() - birthDate.getFullYear() - (nowDate.getMonth() < birthDate.getMonth() || (nowDate.getMonth() == birthDate.getMonth() && nowDate.getDate() < birthDate.getDate()));
			
			if(age <= maxAgeAllowed)
			{
				check = true;
			}
		}	
	return this.optional(element) || check;
}, jQuery.validator.format("You have to be younger as {0} years to be eligible."));



/**
  * Check the  UK posta zip code validity 
  *
  *
  * @name jQuery.validator.methods.maxAgeITAFormat
  * @type Boolean
  * @cat Plugins/Validate/Methods
  */
jQuery.validator.addMethod(
		"ukZipCode", 
		function(value, element) {
		//value = $.trim(value);
	return this.optional(element) || /^[A-Z]{1,2}[0-9R][0-9A-Z]?\s?[0-9][ABD-HJLNP-UW-Z]{2}$/i.test(value);
}, "A valid UK zip code please");  


/**
  * Return true, if the value is a valid date, for a date in  format dd/mm/yyyy
  *
  * @example jQuery.validator.methods.dateValidity("01/01/1900")
  * @result true
  *
  *
  * @example jQuery.validator.methods.dateValidity("01-01-1900")
  * @result true
  *
  * @example jQuery.validator.methods.dateValidity("01/13/1990")
  * @result false
  *
  * @example jQuery.validator.methods.dateValidity("32/12/1900")
  * @result false
  *
  * @example <input name="pippo" class="{dateValidityITAFormat:true}" />
  * @desc Declares an optional input element whose value must be a valid date.
  *
  * @name jQuery.validator.methods.dateValidityITAFormat
  * @type Boolean
  * @cat Plugins/Validate/Methods
  */
jQuery.validator.addMethod(
	"dateValidityITAFormat",
	function(value, element) {
		var check = false;
		var re = /^\d{1,2}[\/-]\d{1,2}[\/-]\d{4}$/;
		if( re.test(value)){
			var adata = value.split(/[-\/]/);
			var dd = parseInt(adata[0],10);
			var mm = parseInt(adata[1],10);
			var yyyy = parseInt(adata[2],10);
			var xdata = new Date(yyyy,mm-1,dd);
			if ( ( xdata.getFullYear() == yyyy ) && ( xdata.getMonth () == mm - 1 ) && ( xdata.getDate() == dd ) )
			{
				check = true;
			}
			else
				check = false;
		} 
		
		return this.optional(element) || check;
	}, 
	"Please enter a valid date"
);


/**
  * Return true, if the value is a future valid date, for a date in  format dd/mm/yyyy
  *
  * @example jQuery.validator.methods.dateIsInFutureITAFormat("01/01/2015")
  * @result true
  *
  *
  * @example jQuery.validator.methods.dateIsInFutureITAFormat("01-01-2015")
  * @result true
  *
  * @example jQuery.validator.methods.dateIsInFutureITAFormat("01/13/1990")
  * @result false
  *
  * @example jQuery.validator.methods.dateIsInFutureITAFormat("32/12/1900")
  * @result false
  *
  * @example <input name="pippo" class="{dateValidityITAFormat:true}" />
  * @desc Declares an optional input element whose value must be a valid date.
  *
  * @name jQuery.validator.methods.dateValidityITAFormat
  * @type Boolean
  * @cat Plugins/Validate/Methods
  */
jQuery.validator.addMethod(
	"dateIsInFutureITAFormat",
	function(value, element) {
		var check = false;
		var re = /^\d{1,2}[\/-]\d{1,2}[\/-]\d{4}$/;
		if( re.test(value)){
			var adata = value.split(/[-\/]/);
			var dd = parseInt(adata[0],10);
			var mm = parseInt(adata[1],10);
			var yyyy = parseInt(adata[2],10);
			var xdata = new Date(yyyy,mm-1,dd);
			
			var nowdata  = new Date();
			nowdata.setHours(0,0,0,0);
			
			if ( xdata >= nowdata )
			{
				check = true;
			}
			else
			{
				check = false;
			}
		} 
		return this.optional(element) || check;
	}, 
	"Date cannot be in the past."
);

/**
  * Return true, if the value is a valid date and is before the date specified date in field 'param', date specified format dd/mm/yyyy
  *
  *
  * @name jQuery.validator.methods.dateBefore
  * @type Boolean
  * @cat Plugins/Validate/Methods
  */
jQuery.validator.addMethod(
		"dateAfterITAFormat", 
		function(value, element, param) {
		var check = false;
		var dateToCompare = $(param).val();
		// if the date to compare is not set, do nothing
		if(dateToCompare == '')
		{
			return true;
		}
		
		var re = /^\d{1,2}[\/-]\d{1,2}[\/-]\d{4}$/;
		if( re.test(value) && re.test(dateToCompare)){
			var a_data = value.split(/[-\/]/);
			var a_dd = parseInt(a_data[0],10);
			var a_mm = parseInt(a_data[1],10);
			var a_yyyy = parseInt(a_data[2],10);
			
			var afterDate = new Date(a_yyyy,a_mm-1,a_dd);
			
			
			var b_data = dateToCompare.split(/[-\/]/);
			var b_dd = parseInt(b_data[0],10);
			var b_mm = parseInt(b_data[1],10);
			var b_yyyy = parseInt(b_data[2],10);
			
			var beforeDate = new Date(b_yyyy, b_mm-1, b_dd);
			
			if(beforeDate < afterDate)
			{
				
				check = true;
			}
		}	
	return this.optional(element) || check;
}, jQuery.validator.format("The date must be after {0}."));




/**
  * Return true, if the value is different as the value specified in field 'param'
  *
  *
  * @name jQuery.validator.methods.differentTo
  * @type Boolean
  * @cat Plugins/Validate/Methods
  */
jQuery.validator.addMethod(
		"differentTo", 
		function(value, element, param) {
		var check = false;
		
		var valueToCompare = $(param).val();
			
			if(value != valueToCompare)
			{
				
				check = true;
			}
			
	return this.optional(element) || check;
}, jQuery.validator.format("The element must be different as {0}."));


jQuery.validator.addMethod("nin", function(value, element) {
	return this.optional(element) || /^[A-Z]{2}\d{6}[A-Z]{1}$/i.test(value);
}, "Please specify a valid NIN");	


jQuery.validator.addMethod("bankSortCode", function(value, element) {
	return this.optional(element) || /^\d{6}$/.test(value);
}, "Please specify a valid sort code");



jQuery.validator.addMethod('dateIsNotInWeekendITAFormat', function(value, element) {
		var re = /^\d{1,2}[\/-]\d{1,2}[\/-]\d{4}$/;
		var check = false;
		if( re.test(value)){
			var adata = value.split(/[-\/]/);
			var dd = parseInt(adata[0],10);
			var mm = parseInt(adata[1],10);
			var yyyy = parseInt(adata[2],10);
			var dateToCheck = new Date(yyyy,mm-1,dd);	
			
			var weekDay = dateToCheck.getDay();
			
			if(weekDay != 0 && weekDay != 6)
			{
				check = true;
			}
		}
return this.optional(element) || check;
}, 'The date cannot be a weekend date.');
