/*------------------------------------------*/
/* customised control validators */
/*------------------------------------------*/
function StyleChangingRequiredFieldValidator_Verify(control)
{
	var controlToValidate = document.getElementById(control.controltovalidate);
	
	if ( controlToValidate != null )
	{
		if (controlToValidate.tagName == "INPUT" || controlToValidate.tagName == "SELECT" || controlToValidate.tagName == "TEXTAREA")
		{
			var controlToChange = document.getElementById(control.controltochange);
			if (controlToValidate.value.trim().length==0 )
			{
				controlToChange.className=control.changecssclass;
				return false;
			}
			else
			{
				controlToChange.className=control.originalcssclass;
				return true;
			}
		}
	}
	return true;
}
function StyleChangingRegularExpressionValidator_Verify(control)
{
	var controlToValidate = document.getElementById(control.controltovalidate);
	if (controlToValidate != null)
	{
		if (controlToValidate.tagName == "INPUT" || controlToValidate.tagName == "TEXTAREA")
		{
			var controlToChange = document.getElementById(control.controltochange);
			if (controlToValidate.value.trim().length > 0)
			{
				var validationExpression = new RegExp(control.validationexpression);
				if (!controlToValidate.value.match(validationExpression))
				{
					controlToChange.className=control.changecssclass;
					return false;
				}
				else
				{
					controlToChange.className=control.originalcssclass;
					return true;
				}
			}
		}
	}
	return true;
}
function StyleChangingCompareValidator_Verify(control)
{
	var controlToValidate = document.getElementById(control.controltovalidate);
	if ( controlToValidate != null )
	{
		if (controlToValidate.value.length > 0)
		{
			var controlToChange = document.getElementById(control.controltochange);
			var controlToCompare = document.getElementById(control.controltocompare);
			if ( controlToValidate.value != controlToCompare.value)
			{
				controlToChange.className=control.changecssclass;
				return false;
			} 
			else
			{
				controlToChange.className=control.originalcssclass;
				return true;
			}
		}
	}
	return true;
}
function StyleChangingCheckBoxValidator_Verify(control)
{
    var controlToValidate = document.getElementById(control.controltovalidate);
    if ( controlToValidate != null )
	{
		var controlToChange = document.getElementById(control.controltochange);
		if ( controlToValidate.checked==false )
		{
			controlToChange.className=control.changecssclass;
			return false;
		}
		else
		{
			controlToChange.className=control.originalcssclass;
			return true;
		}
    }	    
}
function StyleChangingCustomValidator_Verify(control)
{
	var controlToValidate = document.getElementById(control.controltovalidate);
	if ( controlToValidate != null )
	{
		var controlToChange = document.getElementById(control.controltochange);
		var clientValidationFunction = control.clientvalidationfunction;
		
		var args = {Value:controlToValidate.value,IsValid:true};
		var isValid = eval(clientValidationFunction)(control,args);
		
		if ( isValid == false || args.IsValid == false )
		{
			controlToChange.className=control.changecssclass;
			return false;
		}
		else
		{
			controlToChange.className=control.originalcssclass;
			return true;
		}
	}
	return true;
}

/*------------------------------------------*/
/* Client-side custom validator functions*/
/*------------------------------------------*/
function validateDateOfBirth(source, arguments)
{
	var dateOfBirthDropDown = document.getElementById("PersonalDetailsControl1_DateOfBirthDropDown");
	var monthOfBirthDropDown = document.getElementById("PersonalDetailsControl1_MonthOfBirthDropDown");
	var yearOfBirthDropDown = document.getElementById("PersonalDetailsControl1_YearOfBirthDropDown");

	var day = dateOfBirthDropDown.selectedIndex;
	var month = monthOfBirthDropDown.selectedIndex;
	var year = yearOfBirthDropDown.value;
	if ((dateOfBirthDropDown.value.length > 0) && (monthOfBirthDropDown.value.length > 0) && (yearOfBirthDropDown.value.length > 0))
	{
		try
		{
			arguments.IsValid=(day>0 && (day<=[,31,28,31,30,31,30,31,31,30,31,30,31][month] || (day==29 && month==2 && year%4==0 && (year%100>0 || year%400==0))));;
		}
		catch(e)
		{
			return (day>0 && (day<=[,31,28,31,30,31,30,31,31,30,31,30,31][month] || (day==29 && month==2 && year%4==0 && (year%100>0 || year%400==0))));;			
		}
	}
}

//if user has switch/solo, they must provide either start date or issue number
function validateCardType(source, arguments)
{
	var cardTypeDropDown = document.getElementById("CardDetailsControl1_CardTypeDropDown");
	
	if (cardTypeDropDown.options[cardTypeDropDown.selectedIndex].value == "Switch/Solo")
	{
		var validFromMonthDropDown = document.getElementById("CardDetailsControl1_ValidFromMonthDropDown");
		var validFromYearDropDown = document.getElementById("CardDetailsControl1_ValidFromYearDropDown");
		var issueNumberTextBox = document.getElementById("CardDetailsControl1_IssueNumberTextBox");
		
		var hasValidFrom = (validFromMonthDropDown.selectedIndex != 0 && validFromYearDropDown.selectedIndex != 0);
		var hasIssueNumber = (issueNumberTextBox.value != "");
		try
		{
			arguments.IsValid=(hasValidFrom || hasIssueNumber);
		}
		catch(e)
		{
			return (hasValidFrom || hasIssueNumber);
		}
	}
}
function validateCardNumber(source, arguments)
{
	var cardNumberTextBox = document.getElementById("CardDetailsControl1_CardNumberTextBox");
	var cardNumber = cardNumberTextBox.value;
	
	if (cardNumber.length > 0)
	{
		// validate length
		if (isNaN(cardNumber) || cardNumber.length < 16 || cardNumber.length > 19)
		{
			try
			{
				arguments.IsValid=false;
			}
			catch(e)
			{
				return false;
			}
		}
		
		// validate mod10 checksum
		var digits = new Array(cardNumber.length);
		for (var i = 0; i < cardNumber.length; i++)
		{
			digits[i] = parseInt(cardNumber.substring(i, i + 1));
		}

		for (var i = (cardNumber.length % 2); i < cardNumber.length; i += 2)
		{
			var check = digits[i] * 2;
			if (check >= 10)
			{
				digits[i] = check - 9;
			}
			else
			{
				digits[i] = check;
			}
		}

		var checksum = 0;
		for (var i = 0; i < cardNumber.length; i++)
		{
			checksum += digits[i];
		}

		try
		{
			arguments.IsValid=((checksum % 10) == 0);;
		}
		catch(e)
		{
			return ((checksum % 10) == 0);;
		}
	}
}
//valid from date must be not be in the future
function validateValidFrom(source, arguments)
{
	var validFromMonthDropDown = document.getElementById("CardDetailsControl1_ValidFromMonthDropDown");
	var validFromYearDropDown = document.getElementById("CardDetailsControl1_ValidFromYearDropDown");
	if ((validFromMonthDropDown.value.length > 0) && (validFromYearDropDown.value.length > 0))
	{	
		var month = parseInt(validFromMonthDropDown.options[validFromMonthDropDown.selectedIndex].value);
		var year = parseInt(validFromYearDropDown.options[validFromYearDropDown.selectedIndex].value);
		var now = new Date();
		try
		{
			arguments.IsValid=(!isNaN(month) && !isNaN(year) && (year < now.getFullYear() || (year == now.getFullYear() && month <= (now.getMonth() + 1))));
		}
		catch(e)
		{
			return (!isNaN(month) && !isNaN(year) && (year < now.getFullYear() || (year == now.getFullYear() && month <= (now.getMonth() + 1))));
		}
	}
}
//expiry date must not be in the past
function validateExpiry(source, arguments)
{
	var expiryMonthDropDown = document.getElementById("CardDetailsControl1_ExpiryMonthDropDown");
	var expiryYearDropDown = document.getElementById("CardDetailsControl1_ExpiryYearDropDown");
	if ((expiryMonthDropDown.value.length > 0) && (expiryYearDropDown.value.length > 0))
	{	
		var month = parseInt(expiryMonthDropDown.options[expiryMonthDropDown.selectedIndex].value);
		var year = parseInt(expiryYearDropDown.options[expiryYearDropDown.selectedIndex].value);
		var now = new Date();
		try
		{
			arguments.IsValid=(!isNaN(month) && !isNaN(year) && (year > now.getFullYear() || (year == now.getFullYear() && month >= (now.getMonth() + 1))));
		}
		catch(e)
		{
			return (!isNaN(month) && !isNaN(year) && (year > now.getFullYear() || (year == now.getFullYear() && month >= (now.getMonth() + 1))));
		}	
	}
}

