﻿function validationCallback(formSelector, result, validationMessage, isBlurEvent)
{
	var validationId = formSelector + '_msg';
	
	if (isBlurEvent)
		return;
		
	if (isBlurEvent && jQuery('#' + formSelector).hasClass('hasDatepicker'))
		return;
	
	if (!result)
	{
		var ul = jQuery('.validationerrors ul');

		if (!ul.length)
		{
			ul = jQuery('<ul></ul>');
			jQuery('.validationerrors').append(ul);
		}
		
		if (!jQuery('.validationerrors ul li#' + validationId).length)
			jQuery(ul).append('<li id="' + validationId + '">' + validationMessage + '</li>');
			
		jQuery('.validationerrors').show();
		jQuery('html, body').animate({scrollTop:0}, 'fast');
		repositionButtons(0);
		
	}
	else
	{	
		if (jQuery('.validationerrors ul li#' + validationId).length)
			jQuery('.validationerrors ul li#' + validationId).remove();
	}
}

function addValidationTrigger(triggerSelector)
{
	if (!jQuery('.validationerrors ul li').length)
		jQuery('.validationerrors').hide();

	jQuery(triggerSelector).bind('click', function()
	{
		var validationResult = validator.validate();

		if (!validationResult)
		{
			jQuery('.validationerrors').show();

			return false;
		}
	});
}

var Validator = new JS.Class({
	initialize: function(validationRules, validateOnBlur, validationFailedCallback) {
		this.validationRules = validationRules;
		this.validationFailedCallback = validationFailedCallback;
		this.validateOnBlur = validateOnBlur;
		
		this.fields = {};
		
		for (var i = 0; i < validationRules.length; i++)
		{
			this.fields[validationRules[i].formSelector] = validationRules[i];
			
			if (validateOnBlur)
			{
				jQuery('[name=' + validationRules[i].formSelector + ']').bind('blur', { field : this.validationRules[i], validator : this }, function(e)
				{
					//setTimeout(function(field, validator)
					//{
					//	if (field.isEnabled)
					//		validator.validateField(e.data.field, true);
					//}, 100, e.data.field, e.data.validator);
					
					if (e.data.field.isEnabled)
						e.data.validator.validateField(e.data.field, true);
				});
			}
		}
	},
	
	validate: function()
	{
		this.hasErrors = false;
	
		var validationMessages = {};
	
		for (key in this.fields)
		{
			var field = this.fields[key];
			
			if (field.isEnabled)
				this.validateField(field, false);
		}
		
		return !this.hasErrors;
	},
	
	validateField: function(field, isBlurEvent)
	{	
		var validationMessages = {};
	
		var result = field.isValid();
		
		if (!result)
			this.hasErrors = true;
				
		if (this.validationFailedCallback)
			this.validationFailedCallback(field.formSelector, result, field.validationMessage, isBlurEvent);
	},
	
	getValidationField: function(formSelector)
	{
		for (key in this.fields)
		{
			var field = this.fields[key];
			
			if (field.formSelector == formSelector)
				return field;
		}
		
		return null;
	}
});

var ValidationField = new JS.Class({
	initialize: function(formSelector, validationMessage, ruleSet) {
		this.formSelector = formSelector;
		this.validationMessage = validationMessage;
		this.ruleSet = ruleSet;
		this.isEnabled = true;
	},
	
	isValid: function()
	{
		var elem = jQuery('#' + this.formSelector);
				
		if (!elem.length)
			elem = jQuery('input[name=' + this.formSelector + ']');
			
		if (!elem.length)
			return;
		
		var value = '';
		
		if (elem.length > 1)
		{
			for (var i = 0; i < elem.length; i++)
			{
				var currentElem = jQuery(elem[i]);
				
				if (currentElem.is(':checked'))
				{
					if (value.length)
						value = value + ',' + currentElem.val();
					
					value = value + currentElem.val();
				}
			}
		}
		else	
			value = elem.val();
	
		for (var i = 0; i < this.ruleSet.length; i++)
		{
			var rule = this.ruleSet[i];
			
			if (!rule.isValid(value))
				return false;
		}
		
		return true;
	}
});

var RegExValidator = new JS.Class({
	initialize: function(pattern) {	
		this.pattern = new RegExp(pattern, 'gim');
	},
	
	isValid: function(value)
	{
		return value.match(this.pattern);
	}
});

var ValueValidator = new JS.Class({
	initialize: function(validationNumber) {
		this.validationNumber = validationNumber;
	},
	
	isValid: function(value)
	{
		var valueAsNumber = Number(value);
		
		return this.isValidAsNumber(valueAsNumber);
	}
});

var EqualsValidator = new JS.Class(ValueValidator, {
	isValidAsNumber: function(value)
	{	
		return value == this.validationNumber;
	}
});

var NotEqualsValidator = new JS.Class(ValueValidator, {
	isValidAsNumber: function(value)
	{	
		return value != this.validationNumber;
	}
});

var LessThanValidator = new JS.Class(ValueValidator, {
	isValidAsNumber: function(value)
	{	
		return value < this.validationNumber;
	}
});

var GreaterThanValidator = new JS.Class(ValueValidator, {
	isValidAsNumber: function(value)
	{	
		return value > this.validationNumber;
	}
});

var GreaterOrEqualValidator = new JS.Class(ValueValidator, {
	isValidAsNumber: function(value)
	{	
		return value >= this.validationNumber;
	}
});

var LessOrEqualValidator = new JS.Class(ValueValidator, {	
	isValidAsNumber: function(value)
	{	
		return value <= this.validationNumber;
	}
});