/*******************************************
 *	
 *	Validation Logic for all controls.
 *
 *******************************************/
function validation( formName )
{
	var frm 					= document.forms[ formName ]; // Form Name that contains controls.
	this.IsEmpty				= validateEmpty;
	this.IsEmptyCombo			= validateEmptyCombo;
	this.IsNumeric 				= validateNumeric;
	this.IsNumericWithDecimal 	= validateNumericWithDecimal;
	this.IsEmail 				= validateEmail;
	this.IsEmptySec				= validateComboSec;
	this.IsDate 				= validateDate;
	this.IsEmptyDate 			= validateEmptyDate;
	this.IsDayMonth 			= validateDayMonth;
	this.IsEmptyDayMonth		= validateEmptyDayMonth;
	this.IsMonthYear			= validateMonthYear;
	this.IsEmptyMonthYear		= validateEmptyMonthYear;
	this.Message 				= "Following Fields must be provided with specific values!";
	var msg 					= this.Message;
	function validateEmpty ( controls ) 
	/****************************************
	 *
	 * Validate Empty Inputs.
	 *
	 ****************************************/
	{
		var ctrl = "";
		var bol = false;
		for ( var i = 0; i < controls.length; i++ )
		{
			ctrl = frm[ controls[i][0] ].value;
			if ( ctrl == "" )
			{
				msg += "\n\t* '"+controls[i][1]+ "' can't be left empty.";
				writeMessage( msg );
				bol = true;
			}
		}
		if ( bol ) 
		{
			window.scroll(0,0);
			return 0;
		}
		else return 1;
	}
	function validateEmptyCombo ( controls ) 
	/****************************************
	 *
	 * Validate Empty Combo.
	 *
	 ****************************************/
	{
		var ctrl = "";
		var bol = false;
		for ( var i = 0; i < controls.length; i++ )
		{
			ctrl = frm[ controls[i][0] ].value;
			if ( ctrl == 0 )
			{
				msg += "\n\t* '"+controls[i][1]+ "' can't be left empty.";
				writeMessage( msg );
				bol = true;
			}
		}
		if ( bol ) 
		{
			window.scroll(0,0);
			return 0;
		}
		else return 1;
	}
		
	function validateNumeric ( controls )
	/****************************************
	 *
	 * Validate Numeric Inputs.
	 *
	 ****************************************/
	{
		var re = /^\s*\d+$/ // Regular Expression For Validating Numeric Input 
		var ctrl = "";
		var bol = false;
		for ( var i = 0; i < controls.length; i++ )
		{
			ctrl = frm[ controls[i][0] ].value;
			if ( ctrl != "" )
			{
				if ( !re.test( ctrl ) )
				{
					msg += "\n\t* '"+controls[i][1]+ "' can be a number only. i.e. 2349.";
					writeMessage( msg );
					bol = true;
				}
			}
		}
		if ( bol ) 
		{
			window.scroll(0,0);
			return 0;
		}
		else return 1;
	}
	
	function validateNumericWithDecimal ( controls )
	/****************************************
	 *
	 * Validate Numeric(With a decimal) Inputs.
	 *
	 ****************************************/
	{
		var re = /^([0-9]*\.)?[0-9]+$/ // Regular Expression For Validating Numeric Input With Decimal
		var ctrl = "";
		var bol = false;
		for ( var i = 0; i < controls.length; i++ )
		{
			ctrl = frm[ controls[i][0] ].value;
			if ( ctrl != "" )
			{
				if ( !re.test( ctrl ) )
				{
					msg += "\n\t* '"+controls[i][1]+ "' can be a decimal number only. i.e. 2349.00";
					writeMessage( msg );
					bol = true;
				}
			}
		}
		if ( bol ) 
		{
			window.scroll(0,0);
			return 0;
		}
		else return 1;
	}
	
	function validateComboSec ( controls )
	/****************************************
	 *
	 * Validate In a pair of combo if any one of them is blank.
	 *
	 ****************************************/
	{
		var FName, SName, Name;
		var bol = false;
		for ( var i = 0; i < controls.length; i++ )
		{
			FName =  frm[ controls[i][0] ].value;
			SName = frm[ controls[i][1] ].value;
			Name = controls[i][2];
			
			if ( FName != 0 || SName != 0 )
			{
				if( FName == 0)
				{
					msg += "\n\t* '" + Name + "', Should be Selected.";
					writeMessage( msg );
					bol = true;
				}
				if (SName == 0) 
				{
					msg += "\n\t* '" + Name + "', Should be Selected.";
					writeMessage( msg );
					bol = true;
				}
			}
		}
		if ( bol ) 
		{
			window.scroll(0,0);
			return 0;
		}
		else return 1;
	}
	function validateDate ( controls )
	/****************************************
	 *
	 * Validate Date Inputs.
	 *
	 ****************************************/
	{
		var d, m, y, name;
		var bol = false;
		for ( var i = 0; i < controls.length; i++ )
		{
			d = frm[ controls[i][0] ].value;
			m = frm[ controls[i][1] ].value;
			y = frm[ controls[i][2] ].value;
			name = controls[i][3];
			
			if ( d != 0 || m != 0 || y != 0 ) 
			{
				if (d == 0 ) 
				{
					msg += "\n\t* '" + name + "', Day can't be left blank.";
					writeMessage( msg );
					bol = true;
				}
				
				if (m == 0) 
				{
					msg += "\n\t* '" + name + "', Month can't be left blank.";
					writeMessage( msg );
					bol = true;
				}
				
				if (y == 0) 
				{
					msg += "\n\t* '" + name + "', Year can't be left blank.";
					writeMessage( msg );
					bol = true;
				}
				
				if ( ( m == 4 || m == 6 || m == 9 || m == 11 ) && (d > 30) ) 
				{
					msg += "\n\t* '" + name + "', This Month can have maximum 30 days.";
					writeMessage( msg );
					bol = true;		
				}	
				else 
			    {
					if ( m == 2 )
					{
						if ( ( y % 4 ) != 0 ) 
						{
							if ( d > 28 ) 
							{
								msg += "\n\t* '" + name + "', This february can't have more than 28 days.";
								writeMessage( msg );
								bol = true;					
							}
						}
						else 
						{ 
							if ( d > 29 ) 
							{
								msg += "\n\t* '" + name + "', This february can't have more than 29 days.";
								writeMessage( msg );
								bol = true;									
							}
						}
					}
				}	
			}
		}
		if ( bol ) 
		{
			window.scroll(0,0);
			return 0;
		}
		else return 1;
	}
	
	function validateEmptyDate ( controls )
	/****************************************
	 *
	 * Validate Date Inputs.
	 *
	 ****************************************/
	{
		var d, m, y, name;
		var bol = false;
		for ( var i = 0; i < controls.length; i++ )
		{
			d = frm[ controls[i][0] ].value;
			m = frm[ controls[i][1] ].value;
			y = frm[ controls[i][2] ].value;
			name = controls[i][3];
			
			if (d == 0 ) 
			{
				msg += "\n\t* '" + name + "', Day can't be left blank.";
				writeMessage( msg );
				bol = true;
			}
			
			if (m == 0) 
			{
				msg += "\n\t* '" + name + "', Month can't be left blank.";
				writeMessage( msg );
				bol = true;
			}
			
			if (y == 0) 
			{
				msg += "\n\t* '" + name + "', Year can't be left blank.";
				writeMessage( msg );
				bol = true;
			}
			
			if ( ( m == 4 || m == 6 || m == 9 || m == 11 ) && (d > 30) ) 
			{
				msg += "\n\t* '" + name + "', This Month can have maximum 30 days.";
				writeMessage( msg );
				bol = true;		
			}	
			else 
			{
				if ( m == 2 )
				{
					if ( ( y % 4 ) != 0 ) 
					{
						if ( d > 28 ) 
						{
							msg += "\n\t* '" + name + "', This february can't have more than 28 days.";
							writeMessage( msg );
							bol = true;					
						}
					}
					else 
					{ 
						if ( d > 29 ) 
						{
							msg += "\n\t* '" + name + "', This february can't have more than 29 days.";
							writeMessage( msg );
							bol = true;									
						}
					}
				}
			}	
		}
		if ( bol ) 
		{
			window.scroll(0,0);
			return 0;
		}
		else return 1;
	}
	
	function validateDayMonth ( controls )
	/****************************************
	 *
	 * Validate DayMonth Inputs.
	 * This function takes an array as Parameter.
	 * This array contains 3 columns.
	 * Day, Month, and visible date name. 
	 * As in birth date we don't validate 'Year'. So 
	 * leave year.
	 *
	 ****************************************/
	{
		var d, m, name;
		var bol = false;
		for ( var i = 0; i < controls.length; i++ )
		{
			d = frm[ controls[i][0] ].value;
			m = frm[ controls[i][1] ].value;
			name = controls[i][2];
			
			if ( d != 0 || m != 0 ) 
			{
				if (d == 0 ) 
				{
					msg += "\n\t* '" + name + "', Day can't be left blank.";
					writeMessage( msg );
					bol = true;
				}
				if (m == 0) 
				{
					msg += "\n\t* '" + name + "', Month can't be left blank.";
					writeMessage( msg );
					bol = true;
				}
				if ( ( m == 4 || m == 6 || m == 9 || m == 11 ) && (d > 30) ) 
				{
					msg += "\n\t* '" + name + "', This Month can have maximum 30 days.";
					writeMessage( msg );
					bol = true;		
				}	
				else 
			    {
					if ( m == 2 && d > 29 ) 
					{
						msg += "\n\t* '" + name + "', February can have maximum 29 days.";
						writeMessage( msg );
						bol = true;					
					}
				}	
			}
		}
		if ( bol ) 
		{
			window.scroll(0,0);
			return 0;
		}
		else return 1;
	}
	
	function validateEmptyDayMonth ( controls )
	/****************************************
	 *
	 * Validate DayMonth Inputs.
	 * This function takes an array as Parameter.
	 * This array contains 3 columns.
	 * Day, Month, and visible date name. 
	 * As in birth date we don't validate 'Year'. So 
	 * leave year.
	 *
	 ****************************************/
	{
		var d, m, name;
		var bol = false;
		for ( var i = 0; i < controls.length; i++ )
		{
			d = frm[ controls[i][0] ].value;
			m = frm[ controls[i][1] ].value;
			name = controls[i][2];
			
			if (d == 0 ) 
			{
				msg += "\n\t* '" + name + "', Day can't be left blank.";
				writeMessage( msg );
				bol = true;
			}
			if (m == 0) 
			{
				msg += "\n\t* '" + name + "', Month can't be left blank.";
				writeMessage( msg );
				bol = true;
			}
			if ( ( m == 4 || m == 6 || m == 9 || m == 11 ) && (d > 30) ) 
			{
				msg += "\n\t* '" + name + "', This Month can have maximum 30 days.";
				writeMessage( msg );
				bol = true;		
			}	
			else 
			{
				if ( m == 2 && d > 29 ) 
				{
					msg += "\n\t* '" + name + "', February can have maximum 29 days.";
					writeMessage( msg );
					bol = true;					
				}
			}	
		}
		if ( bol ) 
		{
			window.scroll(0,0);
			return 0;
		}
		else return 1;
	}
	
	function validateMonthYear ( controls )
	/****************************************
	 *
	 * Validate MonthYear Inputs.
	 * This function takes an array as Parameter.
	 * This array contains 3 columns.
	 * Month, Year, and visible date name. 
	 *
	 ****************************************/
	{
		var m, y, name;
		var bol = false;
		for ( var i = 0; i < controls.length; i++ )
		{
			m = frm[ controls[i][0] ].value;
			y = frm[ controls[i][1] ].value;
			name = controls[i][2];
			
			if ( m != 0 || y != 0 ) 
			{
				if (m == 0 ) 
				{
					msg += "\n\t* '" + name + "', Month can't be left blank.";
					writeMessage( msg );
					bol = true;
				}
				if (y == 0) 
				{
					msg += "\n\t* '" + name + "', Year can't be left blank.";
					writeMessage( msg );
					bol = true;
				}
			}
		}
		if ( bol ) 
		{
			window.scroll(0,0);
			return 0;
		}
		else return 1;
	}
	
	function validateEmptyMonthYear ( controls )
	/****************************************
	 *
	 * Validate MonthYear Inputs.
	 * This function takes an array as Parameter.
	 * This array contains 3 columns.
	 * Month, Year, and visible date name. 
	 *
	 ****************************************/
	{
		var m, y, name;
		var bol = false;
		for ( var i = 0; i < controls.length; i++ )
		{
			m = frm[ controls[i][0] ].value;
			y = frm[ controls[i][1] ].value;
			name = controls[i][2];
			
			if (m == 0 ) 
			{
				msg += "\n\t* '" + name + "', Month can't be left blank.";
				writeMessage( msg );
				bol = true;
			}
			if (y == 0) 
			{
				msg += "\n\t* '" + name + "', Year can't be left blank.";
				writeMessage( msg );
				bol = true;
			}
		}
		if ( bol ) 
		{
			window.scroll(0,0);
			return 0;
		}
		else return 1;
	}
	
	function validateEmail( controls ) 
	/************************************************
	 *
	 * Accounts for email with country appended
	 * does not validate that email contains valid URL
	 * type (.com, .gov, etc.) or valid country suffix.
	 *
	 *************************************************/
	{
		var re  = /^[a-z]+(([a-z_0-9]*)|([a-z_0-9]*\.[a-z_0-9]+))*@([a-z_0-9\-]+)((\.[a-z]{3})|((\.[a-z]{2})+)|(\.[a-z]{3}(\.[a-z]{2})+))$/;
		var bol = false;
		var ctrl;
		for ( var i = 0; i < controls.length; i++ )
		{
			ctrl = frm[ controls[i][0] ].value;
			
			if ( ctrl != "" )
			{
				if ( !re.test( ctrl ) )
				{
					msg += "\n\t* '"+controls[i][1]+ "' is not valid.";
					writeMessage( msg );
					bol = true;
				}
			}
		}
		if ( bol ) 
		{
			window.scroll(0,0);
			return 0;
		}
		else return 1;
	}
	
	function writeMessage( textMessage )
	{
		if ( document.getElementById('lblMessage').innerText ) 
		{
			document.getElementById('lblMessage').innerText = textMessage;
		}
		else
		{
			while ( textMessage.indexOf('\n\t') != -1 )	
			{
				textMessage = textMessage.replace("\n\t","<br>&nbsp;&nbsp;&nbsp;&nbsp;");	
			}
			document.getElementById('lblMessage').innerHTML = textMessage;
		}
	}
}
