var Formcheck =
{
	setBirthdateHidden : function(elementDay, elementMonth, elementYears, elementHidden, delimiter)
	{
		$('#'+elementHidden).val('');

		var day       = $('#'+elementDay).val();
		var months    = $('#'+elementMonth).val();
		var years     = $('#'+elementYears).val();

		var birthDateValue = years+delimiter+months+delimiter+day;

		$('#'+elementHidden).val(birthDateValue);
	},

	validators : {
		required: function(element, context)
		{
			if (element.type == 'radio')
			{
				var radiobuttons = context[element.name];

				for (var i = 0; i < radiobuttons.length; i++)
				{
					if (radiobuttons[i].checked == true)
					{
						return true;
					}
				}

				return false;
			}
			else
			{
				return !Formcheck.isEmpty(element);
			}

			return false;
		},
		email: /^[a-zA-Z0-9][\w\.\-_]*[a-zA-Z0-9]*@[a-zA-Z0-9][\w\.\-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$/,
		zip: /^[1-9][0-9]{3}$/,
		date: /^([0-3][0-9]|[1-9])(\s|\.|:|-|\/)([0-1][0-9]|[1-9])(\s|\.|:|-|\/)([1-2][0-9][0-9][0-9]|[0-9][0-9])$/,
		phone: /(^(0[1-9][0-9]|01)[^a-z0-9]*[0-9]{3}[^a-z0-9]*[0-9]{2}[^a-z0-9]*[0-9]{2}$)|(^(00|[+]?)[1-9][0-9][^a-z0-9]*(0?|[(]0[)])([1-9][0-9]|1)[^a-z0-9]*[0-9]{3}[^a-z0-9]*[0-9]{2}[^a-z0-9]*[0-9]{2}$)/i,

		birthdate : function(element, context)
		{
			var splitter = /(\s|\.|:|-|\/)/;
			var dateList = cbSplit(element.value, splitter);
			var birthDate;

			var year  = 0;
			var month = 0;
			var day   = 0;

			year  = parseInt(dateList[0]);
			month = parseInt(dateList[2].replace(/^0+/, ''));
			day   = parseInt(dateList[4].replace(/^0+/, ''));

			var birthDate = new Date(year, month - 1, day);

			if (day != birthDate.getDate()
				|| (month-1) != birthDate.getMonth()
				|| year != birthDate.getFullYear())
			{
				return false;
			}

			var currDate  = new Date();

			if (currDate.getTime() - birthDate.getTime() < 0)
			{
				return false;
			}

			currDate.setFullYear(currDate.getFullYear() - 18);
			if (currDate.getTime() - birthDate.getTime() < 0)
			{
				return false;
			}

			currDate = new Date();
			currDate.setFullYear(1905);
			if (currDate.getTime() - birthDate.getTime() > 0)
			{
				return false;
			}

			return true;
		}
	},

	failed : 'failed',

	form : null,
	invalid : [],

	isEmpty: function(element)
	{
		var value = $(element).val();
		return ($.trim(value).length == 0 || (window.Prompt && Prompt.findValue(element.name) && Prompt.findValue(element.name).value == value));
	},

	autoCheckFields : function()
	{
		$(document).ready(function()
		{
			$('input[type=text], input[type=radio], textarea, select').focus(function() { Formcheck.clearInvalid(this); });
			$('input[type=text], input[type=radio], textarea, select').blur(function() { Formcheck.checkField(this); });
		});
	},

	checkForm : function(form)
	{
		Formcheck.form = form || document.forms[0];
		Formcheck.clearAllInvalid();

		for (var i = 0; i < Formcheck.form.elements.length; i++)
		{
			Formcheck.checkField(Formcheck.form.elements[i], false);
		}

		return (Formcheck.invalid.length == 0);
	},

	checkField : function(element, autoToggle)
	{
		var isValid = true;

		for (validator in Formcheck.validators)
		{
			if ($(element).hasClass(validator))
			{
				var validator = Formcheck.validators[validator];

				var isEmpty = Formcheck.isEmpty(element);
				var isFunction = (typeof(validator) == 'function');
				var isRegExp = ((isFunction || (typeof(validator) == 'object')) && validator.constructor.toString().match(/regexp/i));

				if (!isEmpty && isRegExp) // dont check on regular expressions if element is empty
				{
					isValid = ($(element).val()).match(validator);
				}
				else if (isFunction && !isRegExp) // in webkit, RegExp is a function, so check if it is a function, but not a RegExp
				{
					isValid = validator(element, Formcheck.form);
				}
			}

			if (!isValid)
			{
				Formcheck.setInvalid(element);
				if (autoToggle)
				{
					Formcheck.toggleValue(element);
				}

				break;
			}
		}

		if (isValid)
		{
			Formcheck.clearInvalid(element);
		}

		return isValid;
	},

	setInvalid : function(element)
	{
		Formcheck.invalid.push(element);
		$(element).addClass(Formcheck.failed);

		if (element.name)
		{
			$('.' + element.name + '_error_handler').addClass(Formcheck.failed);
		}

		if (element.id)
		{
			$('.' + element.id + '_error_handler').addClass(Formcheck.failed);
		}
	},

	clearInvalid: function(element)
	{
		$(element).removeClass(Formcheck.failed);

		if (element.name)
		{
			$('.' + element.name + '_error_handler').removeClass(Formcheck.failed);
		}

		if (element.id)
		{
			$('.' + element.id + '_error_handler').removeClass(Formcheck.failed);
		}
	},

	clearAllInvalid: function()
	{
		Formcheck.invalid = [];
	},

	toggleValue : function(element)
	{
		if (typeof(Prompt) !== 'undefined' && element.type && element.type == 'text')
		{
			$(element).val('');
			Prompt.toggleValue(element);
		}
	}
};

//Formcheck.autoCheckFields();
