Form = function($who) {

	var $this = this;

	this.source = $who;

	this.onValidationError =
	this.onStart =
	this.onComplete = null;

	this.source.bind('submit', function(e) {

		var $continue = false;
		e.preventDefault();

		var $req = $(this).find('input[name="REQUIRED"]').val();
		var $email = $(this).find('input[name="EMAIL"]').val();

		if ($req == 'undefined' || $this.onValidationError == null)
			$continue = true;
		else {

			$req = String($req).split(',');
			$email = String($email).split(',');

			for (var i = 0; i < $req.length; i++) {

				var $el = $('*[name="VALUE_'+$req[i]+'"]');
				var $name = $('*[name="TITLE_'+$req[i]+'"]').val();

				if ($el.val() == $el.data("caption") || $el.val() == '') {

					$this.onValidationError($name, $el, 'empty field');
					return false;

				}

				if ($.inArray($req[i],$email) >= 0) {

					var $pattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
					if (!$pattern.test($el.val())) {

						$this.onValidationError($name, $el, 'invalid email');
						return false;

					}

				}

			}

			$continue = true;

		}

		if ($continue) {

			$(this).find('input[type!="hidden"], textarea').each(function() {

				if ($(this).val() == $(this).data('caption'))
					$(this).val('');

			});

			if ($this.onStart != null)
				$this.onStart();

			$.ajax({
				url: $(this).attr('action'),
				type: 'POST',
				data: $(this).serialize(),
				success: function(xml) {

				if ($this.onComplete != null)
					$this.onComplete(xml);

					$who.find('input[type!="hidden"], textarea').trigger('blur');

				}

			});

		}

	});

}
