/*
*	jQuery bmhFormValidation plugin
*	version 0.5.7 (31/10/2008)
*	@requires jQuery (http://jquery.com)
*
*
*	changelog:
*	31/10/2008: created bmhFormValidation;
*	31/10/2008: added custom error message support through the inputs alt tag
*	31/10/2008: added config option defaultErrorMsg
*	31/10/2008: added support for textareas
*	31/10/2008: added int, float and number validation
*	05/11/2008: added date validation
*
*	USAGE:
*	
*	script:
*	$(document).ready(function(){
*		$('#ID OF FORM').bmhValidateForm({
*			errorClass: NAME OF ERROR CLASS, 
*			defaultErrorMsg: 'Bitte füllen Sie das Feld [field] aus'
*		});
*	});
*	
*	input elements:
*	<input type="text" name="test" id="test" class="required [validate-email,validate-int,validate-float,validate-number]" alt="Benuztzerdefinierte Fehlermeldung" />
*
*/
(function($) {
	$.fn.bmhValidateForm = function(options) {

		var cfg = {
			defaultErrorMsg: 'Das Feld [field] muss ausgefuellt werden.',
			errorClass: ''
		};
		cfg = $.extend(cfg, options);
		var obj = $(this[0]);
			obj = obj[0];
		
		var fields = $('#'+obj.id+' .required');
		
		var isInteger = function(s){return (s.toString().search(/^-?[0-9]+$/) == 0);};
		var isFloat = function(s) {return ((s.match (/^[+-]?[0-9]*[,][0-9]+$/) && s.match (/^[+-]?[0-9]+[,][0-9]*$/)) || (s.match (/^[+-]?[0-9]*[.][0-9]+$/) && s.match (/^[+-]?[0-9]+[.][0-9]*$/)));};
		var isNumber = function(s) {return (isInteger(s) || isFloat(s));};
		var isEmail = function(s) {var emailRegEx = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;return s.match(emailRegEx);};
		var isDate = function(s) {var s_a = s.split('.');var dd = s_a[0];var mm = s_a[1];var yy = s_a[2];var dt = new Date(yy, mm-1, dd);if (isNaN(dt)) return false;return (dt.getFullYear()==yy && dt.getMonth()==mm-1 && dt.getDate()==dd);}
		var isNotEmpty = function(s) {return (jQuery.trim(s) != "");};
		
		
		var validateField = function(obj,value,field,errorMsg,valFunction,errors) {
			if(!valFunction(value)) {
				obj.toggleClass(cfg.errorClass);
				if(errorMsg != "") {
					errors.push('- '+errorMsg+'\n');
				} else {
					errors.push('- '+ cfg.defaultErrorMsg.replace('[field]',field)+'\n');
				}
				return true;
			}
			return false;
		}
		
		
		var validateForm = function() {
			var errors = [];
			
			fields.each(function() {
				var obj = $(this);
				var value = obj.attr('value');
				var field = obj.attr('name');
					field = field.charAt(0).toUpperCase()+field.substring(1,field.length);
				var error = false;
				var errorMsg = obj.attr('alt') || "";
				
				obj.removeClass(cfg.errorClass);
				
				
				// check required
				
				error = validateField(obj,value,field,errorMsg,isNotEmpty,errors);

				if(!error) {
					// check int
					if(obj.attr('class').indexOf('validate-int') != -1) {
						error = validateField(obj,value,field,errorMsg,isInteger,errors);
					}
					// check float
					if(obj.attr('class').indexOf('validate-float') != -1) {
						error = validateField(obj,value,field,errorMsg,isFloat,errors);
					}
					// check number
					if(obj.attr('class').indexOf('validate-number') != -1) {
						error = validateField(obj,value,field,errorMsg,isNumber,errors);
					}
					// check email
					if(obj.attr('class').indexOf('validate-email') != -1) {
						error = validateField(obj,value,field,errorMsg,isEmail,errors);
					}
					// check date
					if(obj.attr('class').indexOf('validate-date') != -1) {
						error = validateField(obj,value,field,errorMsg,isDate,errors);
					}

				}
			});
			return errors;
		};
		
		return this.each(function(){
			$(this).submit(function(e){
				var error = validateForm();
				if(error.length != 0) {
					alert('Folgende Fehler sind aufgetreten:\n'+error.join(''));
					e.preventDefault();
				}
			});
		});
	};
})(jQuery);
