/*
 * The validate function has been implemented as a JQuery plugin.
 *
 * If you have an input parameter in HTML such as
 * <input id="a_parameter"></input> then you can
 * attach this validate function with the JQuery snippet
 *
 * $($('#a_parameter).validate({expression: /^[a-z]{3}/}));
 *
 * for instance. In this example, when the value of the
 * input element is not a three letter word then the
 * value 'invalid' is dynamically added to the
 * 'class' attribute.
 *
 * <input id="a_parameter" class="invalid">xy</input>
 */

(function($)
{
	$.getProblem = function(parameter, value)
	{
		if (value == '')
		{
			if (parameter.required)
			{
				return parameter.name + " is required";
			}
			else
			{
				return null;
			}
		}

		if (parameter.type)
		{
			if (parameter.type == 'integer-parameter')
			{
				if (isNaN(value))
				{
					return parameter.name + " must be a number";
				}
			}
			else if (parameter.type == 'boolean-parameter')
			{
				if (value == "yes" || value == "no")
				{
					return null;
				}
				else
				{
					return parameter.name + " must be yes or no";
				}
			}

		}

		if (parameter.minimum)
		{
			if (value < parameter.minimum)
			{
				return parameter.name + " must be at least " + parameter.minimum;
			}
		}

		if (parameter.maximum)
		{
			if (value > parameter.maximum)
			{
				return parameter.name + " must be at most " + parameter.maximum;
			}
		}

		if (parameter.size)
		{
			if (value.toString().length > parameter.size)
			{
				return parameter.name + " must be at most " + parameter.size + " characters long";
			}
		}

		if (parameter.options)
		{
			for (var index in parameter.options)
			{
				if (value.toLowerCase() == parameter.options[index].description.toLowerCase())
				{
					return null;
				}
			}

			return parameter.name + " must be one of the available options";
		}
		else if (parameter.expression)
		{
			if (value.match(parameter.expression))
			{
				return null;
			}
			else
			{
				return parameter.name + " must be recognised format";
			}
		}

		return null;
	};

	$.fn.setValid = function(valid, problem)
	{
		if (valid)
		{
			return this.removeClass("invalid").removeAttr('title');
		}
		else
		{
			return this.addClass("invalid").attr('title', problem);
		}
	};

	var validation = function(parameter)
	{
		return function()
		{
			var element = $(this);

			var problem = $.getProblem(parameter, element.val());

			if (problem == null)
			{
				element.setValid(true);
			}
			else
			{
				element.setValid(false, problem);
			}
		};
	};

	$.fn.validate = function(parameter)
	{
		return this
            .focus(validation(parameter))
            .blur(validation(parameter))
            .change(validation(parameter))
            .keyup(validation(parameter))
			.trigger('keyup');
	};
})(jQuery);

