var formValidation = function( options ) {
	options = options || {};
	options.class = options.class || "";
	options.tags = options.tags || {};
	options.messages = options.messages || {};
	
	var _required = "";
	var _mail = "";
	var _number = "";
	
	var _msg_required = "";
	var _msg_mail = "";
	var _msg_number = "";
		
	if( options.class != "" ) {
		
		jQuery.each( options.tags,  function ( key, value ) {
			if( key == "required" )
			  _required = value;
			if( key == "mail" )
        _mail = value;
      if( key == "number" )
        _number = value;
		});
		
		jQuery.each( options.messages,  function ( key, value ) {
      if( key == "required" )
        _msg_required = value;
      if( key == "mail" )
        _msg_mail = value;
      if( key == "number" )
        _msg_number = value;
    });
    
    function isValidEmail(email, required) {
    	required = required || true; 
      
    	if ( email == null) {
        if (required) 
          return false;
        return true;
      }

      if ( email.length == 0 ) {  
        if ( required )
          return false;
        return true;
      }

      if ( !allValidChars( email ) ) 
        return false;  

      if ( email.indexOf("@") < 1 ) 
        return false;
      else if ( email.lastIndexOf(".") <= email.indexOf("@") ) 
        return false;
      else if ( email.indexOf("@") == email.length )
        return false;
      else if ( email.indexOf("..") >=0 )
        return false;
      else if ( email.indexOf(".") == email.length ) 
        return false;
        
      return true;
    }

    
    function allValidChars( email ) {
      var parsed = true;   
      var validchars = "abcdefghijklmnopqrstuvwxyz0123456789@.-_";
    
      for (var i=0; i < email.length; i++) {
        var letter = email.charAt(i).toLowerCase();
    
        if (validchars.indexOf(letter) != -1)    
          continue;
    
        parsed = false;
        break;    
      }    
      return parsed;
    }
				
		function validate( form ) {
			var result = true;
			if( _required != "" ) {
        form.find( "." + _required ).each( function () {      	
        	if( jQuery(this).val() != undefined && ( jQuery(this).is('input') || jQuery(this).is('textarea') ) && jQuery(this).val() == "" ) {
        		var msg = _msg_required.replace( "%s", jQuery(this).prev("label").find("span.validatorText").text() );
        		if( _msg_required == "custom" )
        		  var msg = jQuery(this).next("span.validatorMsg").text();
            if( msg != "" )
        		  alert( msg );
        		jQuery(this).focus();
        		result = false;
        		return false;
        	}
        	else if( _mail != "" && jQuery(this).val() != undefined && jQuery(this).hasClass( _mail ) && ( jQuery(this).is('input') || jQuery(this).is('textarea') ) && !isValidEmail( jQuery(this).val() ) ) {
        		var msg = _msg_mail;
            if( _msg_mail == "custom" )
              var msg = jQuery(this).next("span.validatorMsg").text();
            if( msg != "" )
              alert( msg );
            jQuery(this).val('@');
            jQuery(this).focus();
            result = false;
            return false;
        	}
        });
      }

      return result;
    }
		
		jQuery( "." + options.class ).each( function ( index ){
		  var form = jQuery(this);
		  form.submit( function ( event ) {
		  	return validate( form );
		  });
		  
		  form.find( "span.validatorMsg" ).hide();
		  form.find( "." + _number ).keypress( function ( event ) {
		    if( ( event.keyCode > 7 && event.keyCode < 10 ) || 
		        event.keyCode == 13 ||
		        ( event.keyCode > 36 && event.keyCode < 41 ) ||
		        event.keyCode == 46 ||
		        ( event.which > 47 && event.which < 59 ) 
		        ) {
		    	return true;
		    }
		    if( _msg_number != "" )
		      alert( _msg_number );
		    return false;
		  });
		});
	}
};