/*

EXAMPLE USAGE: 
--------------

Simple: 

validateForm($('#myform'), {
	c_name: { required: true, message: 'Please enter your name!'},
	c_mail: { required: true, email: true, message: 'Please enter valid email!'},
	c_phone: { required: false },
	c_comment: { required: true, message: 'Please enter your comment!' }
};

Full:

validateForm($('#myform'), {
	c_name: { required: true, message: 'Please enter your name!'},
	c_mail: { required: true, email: true, message: 'Please enter valid email!'},
	c_phone: { required: false },
	c_comment: { required: true, message: 'Please enter your comment!' }
}, {
	on_success: function(form) {  alert('Success!');  },
	on_error: function(form, message) {  alert('Error: ' + message);  },
	on_submit: function(form) {  alert('Submit!');  }
});

*/

(function($) {  
	var default_options = { required: true, email: false, message: 'Please fill all required fields!' };
	var default_behaviour = {
		on_success: function(form) { alert('Thank you for registering!') },
		on_error: function(form, message) { alert('Error: ' + message) },
		on_submit: function(form) { }
	}
	
	var email_reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
	
	window.validateForm = function (form, ruleset, behaviourset) {
		if(form.length < 1) {
			return false;
		}
		if ( !form.is('form') ) {
			throw 'validateForm() - Invalid argument 1';
		};
			
		form.live('submit', function() {
			var action = (form.attr('action') != '') ? form.attr('action') : window.location.href;
			var data = form.serialize();
			var behaviour = $.extend(behaviour, default_behaviour, behaviourset);
			
			try {
				$.each(ruleset, function(key, value) {
					var rules = {};
					var input = form.find('[name=' + key + ']');
					if ( input.length != 1 ) {
						throw 'validateForm() - Invalid input field name="' + key + '"';
					};
					
					$.extend(rules, default_options, value);
					
					if ( (rules.required && (input.val() == '' || input.val() == input.attr('title') )) || (rules.email && !input.val().match(email_reg) ) ) {
						input.addClass('invalid').focus();
						behaviour.on_error(form, rules.message);
						throw 'unsatisfied rules';
					} else {
						var title = $('label[for=' + input.attr('id') + ']').text();
						if ( title == '' ) { 
							throw 'No label specified for ' + key + '!'; 
						};
						data += '&' + key + '_inputtitle=' + escape(title) ;
						
						input.removeClass('invalid');
					}
				});
			} catch (exception) {
				if ( exception != 'unsatisfied rules') {
					alert(exception);
				};
				return false;
			}
			
			behaviour.on_submit(form);
			
			$.ajax({
				type: form.attr('method').toUpperCase(),
				url: action,
				data: data,
				
				success: function(data, status, request) {
					if ( data == 'ok') {
						form.find('input[type=text]:visible, textarea:visible').val('');
						behaviour.on_success(form);
					} else {
						behaviour.on_error(form, data);
					}
				},
				error: function(request, status, error) {
					behaviour.on_error(form, 'Error ' + request.status + ' "' + action + '"');
				}
			});
			
			return false;
		});
	}
	
})(jQuery);  
