

/*
 *	Simple Form Validator plugin for jQuery
 *	by Haragei.com
 *	Dual licensed under the MIT (MIT-LICENSE.txt)
 *	and GPL (GPL-LICENSE.txt) licenses.

*/

(function($){

	var validator, default_options;

	$.fn.validator = function(options) {

		var opts = $.extend({}, default_options, options);

		return $(this).each(function(){

			validator.call($(this), $.metadata ? $.extend({}, opts, $(this).metadata()) : opts);
		});
	};

	default_options = $.fn.validator.defaults = {

		stopAtFirst: false,
		selector: ':text,textarea',
		messageClass: 'message',

		type: {

			required: {

				isvalid: function(input){ return !input.is('textarea.empty') && !!input.val().length; },
				message: 'This is required field'
			},

			email: {

				isvalid: function(input){ return !!input.val().match(/^[\w\-.\+]+@[\w.\-]+\.[a-z]{2,6}$/i); },
				message: 'Invalid e-mail address'
			}
		}
	};

	var dataName = 'validation-failed';

	validator = function(options) {

		if (!this.is('form')) return;

		var inputs = this.find(options.selector).each(function() {

			var input = $(this).focus(function() {

				var old_val;

				if (typeof(old_val = input.data(dataName)) != "undefined") {

					input
						.val(inputs.is('textarea.empty') ? old_val : '')
						.removeData(dataName)
						.removeClass(options.messageClass);
				}
			});
		});

		this.submit(function(e) {

			var valid = true;

			inputs.each(function(){

				var input = $(this), value, invalid = typeof(value = input.data(dataName)) != 'undefined';

				if (!invalid) value = input.val();

				for (var type in options.type) {

					if (input.is('.' + type)) {

						if (invalid || !options.type[type].isvalid(input)) {

							input
								.addClass(options.messageClass)
								.data(dataName, value)
								.val(options.type[type].message);

							valid = false;

							if (options.stopAtFirst) return false;	// break;

							break;
						}
					}
				}
			});


			if (!valid) e.preventDefault();

			return valid;
		});
	}

})(jQuery);
