/*
*	jQuery bmhFormValidation plugin
*	version 0.5.9 (08/12/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
*	08/12/2008: added ajax-captcha support
*	09/12/2008: added validate-blank, changed .required to .validate
*
*	USAGE:
*	
*	script:
*	$(document).ready(function(){
*		$('#ID OF FORM').bmhValidateForm({
*			errorClass: NAME OF ERROR CLASS, 
*			defaultErrorMsg: 'Bitte füllen Sie das Feld [field] aus'
*			captchaUrl: 'validCaptcha.cfm',
*			capthcaUrlParam: 's'
*		});
*	});
*	
*	input elements:
*	<input type="text" name="test" id="test" class="validate [validate-blank, validate-email,validate-int,validate-float,validate-number, validate-captcha]" alt="Benuztzerdefinierte Fehlermeldung" />
*
*/
(function($) {
	$.fn.bmhValidateForm = function(options) {

		var cfg = {
			defaultErrorMsg: 'Das Feld [field] muss ausgefuellt werden.',
			errorClass: '',
			captchaUrl: '',
			captchaUrlParam: 's'
		};
		cfg = $.extend(cfg, options);
		var obj = $(this[0]);
			obj = obj[0];
		
		var fields = $('#'+obj.id+' .validate');

		var isNotEmpty = function(s) {return (jQuery.trim(s) != "");};
		var isInteger = function(s){if(!isNotEmpty(s))return true;return (s.toString().search(/^-?[0-9]+$/) == 0);};
		var isFloat = function(s) {if(!isNotEmpty(s))return true;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) {if(!isNotEmpty(s))return true;return (isInteger(s) || isFloat(s));};
		var isEmail = function(s) {if(!isNotEmpty(s))return true;var emailRegEx = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;return s.match(emailRegEx);};
		var isDate = function(s) {if(!isNotEmpty(s))return true;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 isCaptcha = function(s) {if(!isNotEmpty)return true;var rv = false;if(cfg.captchaUrl != '') {$.ajax({type:'get',url: cfg.captchaUrl,data: cfg.captchaUrlParam+"="+s,async: false,success: function(msg) {var msg = eval("("+msg+")");rv = msg.valid;},error: function(){rv = false;}});}return rv;}
    
		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 blank
				if(obj.attr('class').indexOf('validate-blank') != -1) {
					error = validateField(obj,value,field,errorMsg,isNotEmpty,errors);
				}
				// check int
				if(!error && obj.attr('class').indexOf('validate-int') != -1) {
					error = validateField(obj,value,field,errorMsg,isInteger,errors);
				}
				// check float
				if(!error && obj.attr('class').indexOf('validate-float') != -1) {
					error = validateField(obj,value,field,errorMsg,isFloat,errors);
				}
				// check number
				if(!error && obj.attr('class').indexOf('validate-number') != -1) {
					error = validateField(obj,value,field,errorMsg,isNumber,errors);
				}
				// check email
				if(!error && obj.attr('class').indexOf('validate-email') != -1) {
					error = validateField(obj,value,field,errorMsg,isEmail,errors);
				}
				// check date
				if(!error && obj.attr('class').indexOf('validate-date') != -1) {
					error = validateField(obj,value,field,errorMsg,isDate,errors);
				}
				// check captcha
				if(!error && obj.attr('class').indexOf('validate-captcha') != -1) {
					error = validateField(obj,value,field,errorMsg,isCaptcha,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);
