/* 
	 Name 		 :  validation.js
	 Version	 :	3.2
	 By      	 : 	Cyclosport.org managed by HOTCHILLEE, MCSD
	 Date    	 : 	20/06/2002																															
	 Custom 	 :	datatypes - alpha | numeric | alphanumeric | email | sortcode | postcode | freetext | phonenumber | optiongroup
	 							mandatory - "yes" | "no"					  		  			   					
	 							minimumlength - x >0 <= "size"															
	 							maximumlength - x >0 <= "size"															
	 							description - for custom alert																	 
	 							minimumvalue  - x >= 0																			 
	 							maximumvalue - x >=0 <= minimumvalue																 
	 							leadingzero - "yes" | "no"	
*/

var centuryLower = 50;
var centuryHigher = 49;

var pattern = new Object();
var text = new Object();

pattern.alpha = /^[a-zA-Z-'\s]+$/;
text.alpha = ", should only contain letters.";
pattern.alphanumeric = /^[0-9a-zA-Z-'\s]+$|^$/;
text.alphanumeric = ", should only contain letters, numbers and space.";
pattern.numeric = /^[0-9]+$/;
text.numeric = ", number fields only allow numbers.";
pattern.postcode = /^[a-zA-Z0-9\s]+$|^$/;
text.postcode = ", field should contain a standard UK postcode, \n\r letters and numbers only.";
pattern.email = /^[a-zA-Z0-9\._-]+\@[a-zA-Z0-9\._-]+$/;
text.email = ", field should contain an address \n\r in the standard format of name@domain.type \n\r e.g. - diane.nolder@mcht.nhs.uk";
pattern.freetext = "";
text.freetext = ",field can contain anything.";
pattern.phonenumber = /^[0-9\s\(\)\+]+$/;
text.phonenumber = ", field should contain numbers, brackets, plus and space only.";
pattern.optiongroup = "";
text.optiongroup = ", please choose one of the displayed options.";
pattern.date = /(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)[0-9]{2}/;
text.date = ", date must be (dd/mm/yyyy) format.";



function validate(thisform)
{
	var valid = true;
	var el = thisform.elements;

	var optiongroupexists = false;
	var optiongroupname = "";
	var optiongroupchecked = false;
	var optiontext = false;
	var optiondesc = "";

	for(var i=0; i<el.length; i++)
	with(el[i])
	{
		var eldatatype=el[i].datatype;
		var elminlength=el[i].minimumlength;
		var elmaxlength=el[i].maximumlength;
		var elmandatory=el[i].mandatory;
		var eldesc=el[i].description;
		var elminvalue=el[i].minimumvalue;
		var elmaxvalue=el[i].maximumvalue;
		var elleadingzero=el[i].leadingzero;
	 							
		if (!eldatatype) continue;
		var elpattern = pattern[eldatatype];
		var eltext = text[eldatatype];
		var elvalue = el[i].value;
		var elname = el[i].name;
		var elempty = false;
		var elexact = false;
				
		if (elvalue == "" || elvalue=="null" || elvalue=="undefined")
		{
		   elempty = "true";
		   el[i].value = "";
		}
		 
		if (elmandatory == "yes" && elempty)
		{
			alert(eldesc + ", is a mandatory field.");
			valid = false;
			break;
		}

		
		if (eldatatype == "alpha" || eldatatype == "alphanumeric" || eldatatype=="numeric" || eldatatype=="postcode" || eldatatype=="email" || eldatatype=="phonenumber" || eldatatype=="date")
		{
		 	if (!elempty)
			{
			   valid = elpattern.test(elvalue);
			   if (!valid)
			   {
			   	  alert (eldesc + eltext);
			   	  valid = false;
			   	  break;
				}
			}
		}
		else if (eldatatype == "freetext")
		{
		 	 /* do nothing */
		}
		else if (eldatatype == "optiongroup")
		{
			if (!optiongroupexists)
			{
				optiongroupexists = true;
				optiongroupname = elname;
				optiontext = eltext;
				optiondesc = eldesc;
			}
			
			if (elname == optiongroupname)
			{
				if (el[i].checked)
				{
					optiongroupchecked = true;
				}
			}
		}

		if (elleadingzero == "yes")
		{
		   if (!elempty && (parseInt(elvalue.length,10) == 1))
		   {
		   	  el[i].value = "0" + elvalue;
			  	elvalue = el[i].value;
		   }
		}
			
		if (elminlength != "" && elminlength != "undefined")
		{
			if (!elempty && (parseInt(elvalue.length,10) < parseInt(elminlength,10)))
			{
				if (parseInt(elminlength,10) == parseInt(elmaxlength,10))
				{
				 	alert (eldesc + ", should be exactly " + elmaxlength + " long.");
				}
				else
				{
				 	alert (eldesc + ", should be no less than " + elminlength + " long.");
				}	
				valid = false;
				break;
			}
		}

		if (elvalue!="" && (elmaxlength != "" && elmaxlength != "undefined"))
		{
		 	 if (!elempty && (parseInt(elvalue.length,10) >= parseInt(elmaxlength,10)+1))
			 {
					if (parseInt(elmaxlength,10) == parseInt(elminlength,10))
					{
				  	alert (eldesc + ", should be exactly " + elmaxlength + " long.");
				  }
					else
					{
				  	alert (eldesc + ", should be no more than " + elmaxlength + " long.");
				  }	
					valid = false;
					break; 
			 }
		}
		
		if (elminvalue!="" && elminvalue !="undefined")
		{
			if (!elempty && (parseInt(elvalue,10) < parseInt(elminvalue,10)))
			{
		 	   alert (eldesc + ", should be greater than or equal to " + elminvalue);
			   valid = false;
			   break;   
		 	}
		}

		if (elmaxvalue!="" && elmaxvalue !="undefined")
		{
			if (!elempty && (parseInt(elvalue,10) > parseInt(elmaxvalue,10)))
			{
		 	   alert (eldesc + ", should be less than or equal to " + elmaxvalue);
			   valid = false;
			   break;   
		 	}
		}		
		
	}

	if (valid  && optiongroupexists)
	{
		if (!optiongroupchecked)
		{
			alert (optiondesc + " " + optiontext);
			valid = false;
		}
	}

	return valid;
		
}

function isLeapYear (idateyyyy) 
{ 
	if ( ((idateyyyy % 4)==0) && (((idateyyyy % 100)!=0) || ((idateyyyy % 400)==0)) )
	{ 
		return (true);
	} 
	else 
	{ 
		return (false);
	}
}

function validDate(datedd,datemm,dateyyyy)
{
  
  var idatedd = parseInt(datedd.value,10);
  var idatemm = parseInt(datemm.value,10);
  var idateyyyy = parseInt(dateyyyy.value,10);
  var valid = true;
  
  if (idatemm == 4 || idatemm == 6 || idatemm == 8 || idatemm == 9 || idatemm == 11)
  {
   	 if (idatedd > 30)
	 {
	   alert('Date - Day, must be less than or equal to 30.');
	   valid = false;
	 }   
  }
  
  if (idatemm == 2)
  {
   	if (isLeapYear(idateyyyy))
   	{
   		if (idatedd > 29)
	 		{
	  		alert('Date - Day, must be less or equal to 29.');
				valid = false;
  		}
  	}
  	else
  	{
  		if (idatedd > 28)
  		{
  			alert('Date - Day, must be less than or equal to 28.');
  			valid = false;
  		}
  	}
  }
  
  return valid;
  
}

function pastDate(datedd,datemm,dateyyyy)
{
  var valid = true;
  var currentDate = new Date();
  var currentMonth = currentDate.getMonth()+1;
  var currentDay = currentDate.getDate();
  var currentYear = currentDate.getFullYear();

  var idatedd = parseInt(datedd.value,10);
  var idatemm = parseInt(datemm.value,10);
  var idateyyyy = parseInt(dateyyyy.value,10);
	
  if (idateyyyy > parseInt(currentYear,10))
  {
   	 alert('Past Date - Year, must be less than or equal to ' + currentYear);
  	 valid = false;
  }
  else if (idateyyyy == parseInt(currentYear,10))
  {
   	  if (idatemm > parseInt(currentMonth,10))
  	  {
   	   	alert('Past Date - Month, must be less than or equal to ' + currentMonth);
	 	 		valid=false;
  	  }
	  	else if (idatemm == parseInt(currentMonth))
	  	{
	   	  if (idatedd >= parseInt(currentDay,10))
		  	{
		   		alert('Past Date - Day, must be less than ' + currentDay);
			 		valid=false;
		 		}
		 	}
   }
  
  return valid;
}

function futureDate(datedd,datemm,dateyyyy)
{
  var valid = true;
  var currentDate = new Date();
  var currentMonth = currentDate.getMonth()+1;
  var currentDay = currentDate.getDate();
  var currentYear = currentDate.getFullYear();

  var idatedd = parseInt(datedd.value,10);
  var idatemm = parseInt(datemm.value,10);
  var idateyyyy = parseInt(dateyyyy.value,10);

  if (idateyyyy < parseInt(currentYear,10))
  {
   	 alert('Future Date - Year, must be greater than or equal to ' + currentYear);
  	 valid = false;
  }
  else if (idateyyyy == parseInt(currentYear,10))
  {
   	  if (idatemm < parseInt(currentMonth,10))
  	  {
   	  	alert('Future Date - Month, must be greater than or equal to ' + currentMonth);
	 	 		valid=false;
  	  }
	  	else if (idatemm == parseInt(currentMonth,10))
	  	{
	   	  if (idatedd <= parseInt(currentDay,10))
		  	{
		   		alert('Future Date - Day, must be greater than ' + currentDay);
			 		valid=false;
		   	}
	  	}
   }
  
  return valid;
}

function leadingZeroOnChange(el)
{	
	if (el.value == "" || el.value == "undefined")
	{
		elempty = true;
	}
	else
	{
		elempty = false;
	}
	
	if (!elempty && (parseInt(el.value.length,10) == 1))
	{
	  el.value = "0" + el.value;
	}
}

function pastValidFrom (datemm,dateyy)
{
  var valid = true;
  var currentDate = new Date();
  var currentMonth = currentDate.getMonth()+1;
  var dcurrentYear = currentDate.getFullYear();	
  var idatemm = parseInt(datemm.value,10);
  var idateyy = parseInt(dateyy.value,10);
  
 	var scurrentYear = dcurrentYear.toString();
 	var scurrentYear = scurrentYear.substr(2,2);

  if (idateyy < parseInt(scurrentYear,10) || idateyy >= parseInt(centuryLower,10))
  {
  	valid = true;
  }
  else if (idateyy == parseInt(scurrentYear,10))
  {
  	if (idatemm > parseInt(currentMonth,10))
  	{
  		alert('Valid From - Month Must Be Less Than Or Equal To ' + currentMonth);
  		valid = false;
  	}
  	else
  	{
  		valid = true;
  	}
  }
	else
	{
  	alert('Valid From - Year Must Be <= ' + scurrentYear + ' And >= ' + centuryLower);
  	valid = false;
  }

	return valid;
}

function futureExpiryDate (datemm,dateyy)
{
  var valid = true;
  var currentDate = new Date();
  var currentMonth = currentDate.getMonth()+1;
  var dcurrentYear = currentDate.getFullYear();	
  var idatemm = parseInt(datemm.value,10);
  var idateyy = parseInt(dateyy.value,10);
  
 	var scurrentYear = dcurrentYear.toString();
 	var scurrentYear = scurrentYear.substr(2,2);

  if (idateyy > parseInt(scurrentYear,10) && idateyy <= parseInt(centuryHigher,10))
  {
  	valid = true;
  }
  else if (idateyy == parseInt(scurrentYear,10))
  {
  	if (idatemm < parseInt(currentMonth,10)) 
  	{
  		alert('Expiry Date - Month Must Be Greater Than Or Equal To ' + currentMonth);
  		valid = false;
  	}
  	else
  	{
  		valid = true;
  	}
  }
	else
	{		
		alert('Expiry Date - Year Must Be >= ' + scurrentYear + ' And <= ' + centuryHigher);
		valid = false;
	}
	  
	return valid;
}

function isZeroPayment (pounds,pence)
{
	var isZero = false;
	var amount = 0;
	
	amount += amount + parseInt(pounds.value,10);
	amount += amount + parseInt(pence.value,10);
	
	if (amount <= 0)
	{
		alert ('Amount must be greater than 0.00.');
		isZero = true;
	}
	
	return isZero;
}
