$i18n = {
	'ERR': {
		'REQUIRED': 'Bitte ergänzen Sie dieses Feld!',
		'INVALID': 'Ihre Eingabe war fehlerhaft!'
	}
};

(function($){
	jQuery.fn.validate = function(){
		var formfields = this.find("div.formfield.required");
		var errorCount = 0;
		formfields.each(function(i, el){
			if ( !jQuery(el).validateField() ) {
				errorCount++;
			}
		});
		if ( errorCount > 0 ) {
			return false;
		} else {
			return true;
		}
	}
	
	jQuery.fn.validateEvents = function(){
		var formfields = this.find("div.formfield.required");
		formfields.each(function(i, el){
			jQuery(el).children('input:text:not([disabled]), textarea, .select').bind({
				'blur': function(){
					jQuery(el).validateField();
				}
			});
		});
	}
	
	jQuery.fn.extend({
		validateField: function(){
			var el = this;
			var field = el.children('input:text:not([disabled]), textarea, select');
			var errorMessage = "";
			
			if ( field.is('input') ) {
				if ( field.val() == '' ) {
					errorMessage = $i18n.ERR.REQUIRED;
				} else if ( el.hasClass('email') && !field.val().match(/^([a-zA-Z0-9_.-])+@([a-zA-Z0-9_.-]){2,}\.([a-zA-Z]){2,4}$/) ) {
					errorMessage = $i18n.ERR.INVALID;
				}
			} else if ( field.is('select') ) {
				if ( field.find('option:selected').val() == 0 ) {
					errorMessage = $i18n.ERR.REQUIRED;
				}
			} else if ( field.is('textarea') ) {
				if ( field.val() == '' ) {
					errorMessage = $i18n.ERR.REQUIRED;
				}
			}
			
			if ( errorMessage != "" ) {
				el.addError(errorMessage, field);
				return false;
			} else {
				el.removeError(field);
			}
			return true;
		},
		addError: function(msg, child){
			var el = this;
			el.addClass('error');
			
			if ( !el.children('p.error-message').length ) {
				el.append('<p class="error-message">'+msg+'</p>');
			} else {
				el.children('p.error-message').text(msg);
			}
			
			if ( child.is('select') ) {
				child = child.next('.select');
			}
			
			child.hover(
				function(){
					var self = jQuery(this);
					self.nextAll('p.error-message').fadeIn();
				},
				function(){
					var self = jQuery(this);
					self.nextAll('p.error-message').fadeOut();
				}
			);
		},
		removeError: function(child){
			var el = this;
			el.removeClass('error');
			el.children('p.error-message').remove();
			if ( child.is('select') ) {
				child = child.next('.select');
			}
			child.unbind('mouseover mouseout');
		}
	});
})(jQuery);
