/**
 * @author michaeld
 */
 
	if((typeof AFL_JS == 'undefined') || (typeof AFL_JS.Common == 'undefined'))
		throw("AFL_JS.FormValidator requires the AFL JavaScript framework");

	var FV = AFL_JS.FormValidator = new Object();
	
	FV.Settings = {
		Validation: {},
		Styles: {}
	}
	
	FV.Settings.Validation = {
		emailRegexp: /^[a-z0-9,!#\$%&'\*\+\/\=\?\^_`\{\|}~-]+(\.[a-z0-9,!#\$%&'\*\+\/\=\?\^_`\{\|}~-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*\.([a-z]{2,})$/i,
		NIPRegexp: /^[0-9]{10}$/,
		PESELRegexp: /^[0-9]{11}$/,
		nbsp: 160,
		emptyString: /^\s*$/
	}
	
	FV.Settings.Styles = {
		ErrorClassName: 'field_error'
	}
	
	FV.TrimSpaces = function(sValue) {
		return sValue.replace(/^\s+|\s+$/g, '');
	}

	FV.Process = function(sMessage, sInfoId, sColorId) {
		FV.ShowError(sMessage, sInfoId);
		FV.ColorError(sColorId);
	}
	
	FV.ShowError = function(sMessage, sInfoId) {
		if(!$(sInfoId)) return;
		
		Element.show($(sInfoId));
		$(sInfoId).innerHTML = sMessage;
	}
	
	FV.ColorError = function(sColorId) {
		if(!$(sColorId)) return;
		
		Element.addClassName($(sColorId), FV.Settings.Styles.ErrorClassName);
	}
	
	FV.Restore = function(sInfoId, sColorId) {
		Element.hide($(sInfoId));
		$(sInfoId).innerHTML = String.fromCharCode(FV.Settings.Validation.nbsp);
		
		if(!$(sColorId)) return;
		Element.removeClassName($(sColorId), (FV.Settings.Styles.ErrorClassName));
	}

	FV.Validation = {
						
		Required: function(oField, sMessage, sInfoId, sColorId) {
			if(FV.Settings.Validation.emptyString.test(oField.value)) {
				FV.Process(sMessage, sInfoId, sColorId);
				return false;
			}
			return true;
		},
		
		SameAs: function(oField, oPatternField, sMessage, sInfoId, sColorId) {
			var sPattern = FV.TrimSpaces(oPatternField.value);
			var sValue = FV.TrimSpaces(oField.value);
					
			if(sPattern != sValue) {
				FV.Process(sMessage, sInfoId, sColorId);
			    return false;
			}
			return true;
		},
		
		MatchRegexp: function(oField, sRegExp, sMessage, sInfoId, sColorId) {
			if(sRegExp.test(FV.TrimSpaces(oField.value))) {
				return true;	
			}
			FV.Process(sMessage, sInfoId, sColorId);
			return false;
		},
		
		IsSelected: function(oField, sDefault, sMessage, sInfoId, sColorId) {
			if(oField.value != sDefault) {
				return true;	
			}
			FV.Process(sMessage, sInfoId, sColorId);
			return false;
		},
		
		IsChecked: function(oField, sMessage, sInfoId, sColorId) {
			if(!oField.checked) {
				FV.Process(sMessage, sInfoId, sColorId);
				return false;
			}
			return true;
		},
		
		IsLessThan: function(oField, iValue, sMessage, sInfoId, sColorId) {
			if(FV.TrimSpaces(oField.value) >= iValue) {
				FV.Process(sMessage, sInfoId, sColorId);
				return false;		
			}
			return true;
		},
		
		IsLessOrEqualTo: function(oField, iValue, sMessage, sInfoId, sColorId) {
			if(FV.TrimSpaces(oField.value) > iValue) {
				FV.Process(sMessage, sInfoId, sColorId);
				return false;		
			}
			return true;
		},
		
		IsGreaterThan: function(oField, iValue, sMessage, sInfoId, sColorId) {
			if(FV.TrimSpaces(oField.value) <= iValue) {
				FV.Process(sMessage, sInfoId, sColorId);
				return false;		
			}
			return true;
		},
		
		IsGreaterOrEqualTo: function(oField, iValue, sMessage, sInfoId, sColorId) {
			if(FV.TrimSpaces(oField.value) < iValue) {
				FV.Process(sMessage, sInfoId, sColorId);
				return false;		
			}
			return true;
		},
		
		IsShorterThan: function(oField, iValue, sMessage, sInfoId, sColorId) {
			if(FV.TrimSpaces(oField.value).length >= iValue) {
				FV.Process(sMessage, sInfoId, sColorId);
				return false;		
			}
			return true;
		},
		
		IsShorterOrEqualTo: function(oField, iValue, sMessage, sInfoId, sColorId) {
			if(FV.TrimSpaces(oField.value).length > iValue) {
				FV.Process(sMessage, sInfoId, sColorId);
				return false;		
			}
			return true;
		},
		
		IsLongerThan: function(oField, iValue, sMessage, sInfoId, sColorId) {
			if(FV.TrimSpaces(oField.value).length <= iValue) {
				FV.Process(sMessage, sInfoId, sColorId);
				return false;		
			}
			return true;
		},
		
		IsLongerOrEqualTo: function(oField, iValue, sMessage, sInfoId, sColorId) {
			if(FV.TrimSpaces(oField.value).length < iValue) {
				FV.Process(sMessage, sInfoId, sColorId);
				return false;		
			}
			return true;
		},
		
		HasLengthBetween: function(oField, iFrom, iTo, sMessage, sInfoId, sColorId) {
			var iValue = FV.TrimSpaces(oField.value).length;
			if(iValue < iFrom || iValue > iTo) {
				FV.Process(sMessage, sInfoId, sColorId);
			    return false;
			}
			return true;
		},
		
		Email: function(oField, sMessage, sInfoId, sColorId) {
			var sValue = FV.TrimSpaces(oField.value);
			if (!FV.Settings.Validation.emailRegexp.test(sValue)) {
				FV.Process(sMessage, sInfoId, sColorId);
				return false;		
			}
			return true;
		},
		
		IsOver18: function(oDay, oMonth, oYear, sMessage, sInfoId, sColorId) {
						
			var BirthDate = new Date(oYear.value, oMonth.value-1, oDay.value); //january is marked as 0 hence we are reducing the month in
			var Now = new Date();
			
			var Passed = true;
			
			if((Now.getFullYear() - BirthDate.getFullYear()) < 18) {
				var Passed = false;
			} else if((Now.getFullYear() - BirthDate.getFullYear()) == 18) {
				if(Now.getMonth() == BirthDate.getMonth()) {
					if(Now.getDate() < BirthDate.getDate()) {
						var Passed = false;
					}
				} else if(Now.getMonth() < BirthDate.getMonth()) {
					var Passed = false;
				}
			}
			
			if(!Passed) {
				FV.Process(sMessage, sInfoId, sColorId);
				return false;
			}
			return true;
		}
	}