﻿var Common = Common ? Common : {};
Common.Validation = function()
{
	var validation = {};
	validation.HasValue = function(value)
	{
		/// <summary>Checks whether the passed string value has a value - i.e. is non-empty</summary>
		/// <param name="value" type="String">string value to test</param>
		/// <returns type="Boolean" />
		return ($.trim(value).length > 0);
	};

	validation.ValidInt = function(value)
	{
		/// <summary>Checks whether the passed string value is a valid integer</summary>
		/// <param name="value" type="String">string value to test</param>
		/// <returns type="Boolean" />
		var trimmedVal = $.trim(value);
		return (trimmedVal.length > 0 && trimmedVal.match(/[^\d]/) == null);		
	};
	validation.ValidIntOrEmpty = function(value)
	{
		/// <summary>Checks whether the passed string value is a valid integer or an empty string</summary>
		/// <param name="value" type="String">string value to test</param>
		/// <returns type="Boolean" />
		return !validation.HasValue(value) || validation.ValidInt(value);
	};
	validation.ValidIntInRange = function(value, rangeMin, rangeMax)
	{
		/// <summary>Checks whether the passed string value is a valid integer between the supplied minimum and maximum values</summary>
		/// <param name="value" type="String">string value to test for valid integer</param>
		/// <returns type="Boolean" />
		return validation.ValidInt(value) && (parseInt(value) >= rangeMin && parseInt(value) <= rangeMax);
	};
	validation.ValidIntInRangeOrEmpty = function(value, rangeMin, rangeMax)
	{
		/// <summary>Checks whether the passed string value is either empty or is a valid integer between the supplied minimum and maximum values</summary>
		/// <param name="value" type="String">string value to test for valid integer</param>
		/// <returns type="Boolean" />
		return !validation.HasValue(value) || validation.ValidIntInRange(value, rangeMin, rangeMax);
	};
	validation.ValidDecimal = function(value)
	{
		/// <summary>Checks whether the passed string value is a valid decimal</summary>
		/// <param name="value" type="String">string value to test</param>
		/// <returns type="Boolean" />
		var trimmedVal = $.trim(value);
		return !isNaN(trimmedVal);		
	};
	validation.ValidDecimalOrEmpty = function(value)
	{
		/// <summary>Checks whether the passed string value is a valid decimal or an empty string</summary>
		/// <param name="value" type="String">string value to test</param>
		/// <returns type="Boolean" />
		return !validation.HasValue(value) || validation.ValidDecimal(value);
	};
	validation.ValidDate = function(value)
	{
		/// <summary>Checks whether the passed string value is a valid date</summary>
		/// <param name="value" type="String">string value to test</param>
		/// <returns type="Boolean" />
		var trimmedVal = $.trim(value);
		if (trimmedVal.length > 0)
		{
			var val = Date.parse(trimmedVal);
			return (val != null && !isNaN(val));
		}
		return false;
	};
	validation.ValidDateOrEmpty = function(value)
	{
		/// <summary>Checks whether the passed string value is a valid date or an empty string</summary>
		/// <param name="value" type="String">string value to test</param>
		/// <returns type="Boolean" />
		return !validation.HasValue(value) || validation.ValidDate(value);
	};
	validation.ValidEmail = function(value)
	{
		/// <summary>Checks whether the passed string value is a valid email address</summary>
		/// <param name="value" type="String">string value to test</param>
		/// <returns type="Boolean" />
		var email = $.trim(value);
		return (email.match(/^[a-zA-Z]['\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$/) != null)
	};
	validation.ValidEmailOrEmpty = function(value)
	{
		/// <summary>Checks whether the passed string value is a valid email address or an empty string</summary>
		/// <param name="value" type="String">string value to test</param>
		/// <returns type="Boolean" />
		return !validation.HasValue(value) || validation.ValidEmail(value);
	};
	return validation;	
}();
