/*	
	Form validation example :
	
		validationTitle =		"Some errror title";
		validationTypeFields =	
								[
									["validationType{data|length}","required{true|false}","dataType{string|number|email|phone|date|url|option|compare}","max length if validationType{int length}","field Name", "Validation title","errorClass"]
								];

*/

function Validator(warningTitle)
{
	var mValidationFieldsArray = new Array();

	this.Add = function(ValidationObject)
	{
	    if (ValidationObject.ValidationType == undefined) 
	    {
	        ValidationObject.ValidationType = 'data';
	    }
	    
	    if (ValidationObject.Required == undefined) 
	    {
	        ValidationObject.Required = true;
	    }
	    
	    if (ValidationObject.DataType == undefined) 
	    {
	        ValidationObject.DataType = 'string';
	    }

	    mValidationFieldsArray.push(new Array(ValidationObject.ValidationType, ValidationObject.Required, ValidationObject.DataType, ValidationObject.MaxLength, ValidationObject.Field, ValidationObject.FieldTitle, ValidationObject.ErrorClass));
	}
	
	this.AddObject = function(objectId, objectTitle)
	{
		var itemObject = new Object();
		
		itemObject.Field 		= objectId;
		itemObject.FieldTitle 	= objectTitle;
		
		return itemObject;
	}
		
	this.Validate = function()
	{
		var warningMessage = '';
				
		for (j=0; j < mValidationFieldsArray.length; j++) 
		{
			if (!IsFormFieldFilled(mValidationFieldsArray[j][4], mValidationFieldsArray[j][0], mValidationFieldsArray[j][1], mValidationFieldsArray[j][2], mValidationFieldsArray[j][3]))
			{
				if(mValidationFieldsArray[j][2] != "option" && mValidationFieldsArray[j][2] != "compare")
				{
					try
					{
						document.getElementById(mValidationFieldsArray[j][4]).className = mValidationFieldsArray[j][6];
					}
					catch(e)
					{
						alert('Error: Validation Object "' + mValidationFieldsArray[j][4] + '" does not exist!');
						return false;
					}
				}
				
				
				if(mValidationFieldsArray[j][2] == "compare")
				{
					var fieldItemArray = mValidationFieldsArray[j][4].split("#");
					document.getElementById(fieldItemArray[0]).className = mValidationFieldsArray[j][6];
					document.getElementById(fieldItemArray[1]).className = mValidationFieldsArray[j][6];
				}
				
				warningMessage += ' - ' + mValidationFieldsArray[j][5] + '\n';
			}
		}
		
		if (warningMessage != '') 
		{
			
			alert(warningTitle + '\n\n' + warningMessage);			
			return false;
		}
		return true;
	}
	
	function Trim(inputString)
	{
		while (inputString.substring(0,1) == ' ')
		{
			inputString = inputString.substring(1, inputString.length);
		}
		while (inputString.substring(inputString.length-1, inputString.length) == ' ')
		{
			inputString = inputString.substring(0,inputString.length-1);
		}
		return inputString;
	}
		
	function IsFormFieldFilled(formFieldId, validationType, required, dataType, maxLength)
	{
		
		if(validationType == "data")
		{
			//string|number|email|phone|date|url|option|compare
			switch(dataType)
			{
				case "string":
					
					try
					{
						if(!document.getElementById(formFieldId).disabled && required)
						{
							return (Trim(document.getElementById(formFieldId).value) != '');
						}
					}
					catch(e)
					{
						alert('Error: Object "' + formFieldId + '" does not exist!');
						return false;
					}
					
					return true;
				break;
				case "number":
					try
					{
						if(!document.getElementById(formFieldId).disabled)
						{
							if(required)
							{
								return (Trim(document.getElementById(formFieldId).value) != '' && !isNaN(Trim(document.getElementById(formFieldId).value)));
							}
							else
							{
								if(Trim(document.getElementById(formFieldId).value) != '')
								{
									return (!isNaN(Trim(document.getElementById(formFieldId).value)));
								}
							}
						}
					}
					catch(e)
					{
						alert('Error: Object "' + formFieldId + '" does not exist!');
						return false;
					}
					
					return true;
				break;
				case "email":
					try
					{
						if(!document.getElementById(formFieldId).disabled)
						{
							var emailRegxp = /^([\w]+)(.[\w]+)*@([\w]+)(.[\w]{2,5}){1,6}$/;
							
							if(required)
							{
								return (Trim(document.getElementById(formFieldId).value) != '' && emailRegxp.test(Trim(document.getElementById(formFieldId).value)));
							}
							else
							{
								if(Trim(document.getElementById(formFieldId).value) != '')
								{
									return (emailRegxp.test(Trim(document.getElementById(formFieldId).value)));
								}
							}
						}
					}
					catch(e)
					{
						alert('Error: Object "' + formFieldId + '" does not exist!');
						return false;
					}
					
					return true;
				break;
				case "date":
					try
					{
						if(!document.getElementById(formFieldId).disabled)
						{
							var dateRegExPattern = /^((((0?[1-9]|[12]\d|3[01])[\.\-\/](0?[13578]|1[02])[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|[12]\d|30)[\.\-\/](0?[13456789]|1[012])[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|1\d|2[0-8])[\.\-\/]0?2[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}))|(29[\.\-\/]0?2[\.\-\/]((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00)))|(((0[1-9]|[12]\d|3[01])(0[13578]|1[02])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|[12]\d|30)(0[13456789]|1[012])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|1\d|2[0-8])02((1[6-9]|[2-9]\d)?\d{2}))|(2902((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00))))$/;
		
							objDateField = Trim(document.getElementById(formFieldId).value);
							
							if(required)
							{
								return (Trim(document.getElementById(formFieldId).value) != '' && objDateField.match(dateRegExPattern) && objDateField.length==10 && objDateField.indexOf('/')==-1 && objDateField.indexOf('-')==-1 && objDateField.indexOf('/')==-1 && objDateField.indexOf('.')!=-1);
							}
							else
							{
								if(Trim(document.getElementById(formFieldId).value) != '')
								{
									return (objDateField.match(dateRegExPattern) && objDateField.length==10 && objDateField.indexOf('/')==-1 && objDateField.indexOf('-')==-1 && objDateField.indexOf('/')==-1 && objDateField.indexOf('.')!=-1);
								}
							}
						}
					}
					catch(e)
					{
						alert('Error: Object "' + formFieldId + '" does not exist!');
						return false;
					}
					
					return true;
				break;
				case "url":
					try
					{
						if(!document.getElementById(formFieldId).disabled)
						{
							var urlRegxp = "^http://[A-Za-z0-9-_]+\\.[A-Za-z0-9-_%&\?\/.=]+$";
							matchURL = document.getElementById(formFieldId).value.match(urlRegxp);
							
							if(required)
							{
								return (Trim(document.getElementById(formFieldId).value) != '' && matchURL != null);
							}
							else
							{
								if(Trim(document.getElementById(formFieldId).value) != '')
								{
									return (matchURL != null);
								}
							}
						}
					}
					catch(e)
					{
						alert('Error: Object "' + formFieldId + '" does not exist!');
						return false;
					}
					
					return true;
				break;
				case "option":
					try
					{
						var fieldItems  = formFieldId.split('#');
						
						for(i = 0; i < fieldItems[1]; i++)
						{
							fieldName = fieldItems[0] + "_" + i;
							if(!document.getElementById(fieldName).disabled)
							{
								if(document.getElementById(fieldName).checked)
								{
									return true;
								}
							}
							else
							{
								return true;
							}
						}
					}
					catch(e)
					{
						alert('Error: Object "' + formFieldId + '" does not exist!');
					}
					return false;
				break;
				case "compare":
					try
					{
						fieldItems = formFieldId.split("#");
						if(!document.getElementById(fieldItems[0]).disabled && !document.getElementById(fieldItems[1]).disabled && (document.getElementById(fieldItems[0]).value != '' || document.getElementById(fieldItems[1]).value != ''))
						{
							return (Trim(document.getElementById(fieldItems[0]).value) == Trim(document.getElementById(fieldItems[1]).value));
						}
						else
						{
							return true;
						}
					}
					catch(e)
					{
						alert('Error: Object "' + formFieldId + '" does not exist!');
						return false;
					}
				break;
			}		
		}
		
		if(validationType == "length")
		{
			try
			{
				if(!document.getElementById(formFieldId).disabled && document.getElementById(formFieldId).value.indexOf('#') == -1)
				{
					return (document.getElementById(formFieldId).value.length <= maxLength);
				}
			}
			catch(e)
			{
				alert('Error: Object "' + formFieldId + '" does not exist!');
				return false;
			}
			
			return true;
		}
	}
}