/**
 * Walidacja dla systemu obsługi formularzy Fasic_Form.
 * Sposób wykorzystania:
 * 
 * $('form').fasicForm({
 *    callbackBefore: function($form) {
 *       // wyczyść poprzednie informacje o błędach					
 *    },					
 *    callback: function(field, message) {
 *       // pokaż informacje o błędzie 'message' dla pola 'field'       
 *       return true; // zwróć false jeżeli chcesz pobrać tylko pierwszy błąd		
 *    },
 *    callbackAfter: function($form, isValid) {
 *       if(! isValid && sprawdz_poprawnosc_wg_uznania()) return false; // formularz nie jest poprawny
 *       return true; // formularz jest poprawny - wyslij go
 *    } 
 * }); 
 * 
 * @version 1.0
 * @copyright webprogramming.pl
 * @author Szymon Szczepaniak  
 */
jQuery.fn.extend({
	
	/**
	 * Inicjowanie walidacji dla formularza.
	 * 
	 * Domyślnie reguły walidacji są pobierane z elementu o klasie fasicValidation znajdującym się wewnątrz formularza.
	 * 
	 */
	fasicForm: function(setts) {
		// domyślne wartości
		setts = $.extend({}, {
			validationElement: '.fasicValidation',
			callback: function() {},
			callbackBefore: function() {},
			callbackAfter: function($form, isValid) {return isValid;}
		}, setts);		
		
		// dla wszystkich obiektów
		return $(this).each(function() {
			var $this = $(this);
			// obiekt nie jest formularzem 
			if(! $this.is('form')) {
				return;
			}
			// pobierz reguły walidacji dla formularza
			var rules = false;
			try {
				rules = $(setts.validationElement, $this).html();
				eval('rules = ' + rules);
			} catch (e) { }			
			
			// zainicjuj walidacje formularza
			if(typeof rules == 'object') {
				// gdy formularz jest wysyłany
				$this.submit(function() {
					var checkers  = $(this).fasicFormRules;
					var checkNext = true;
					var isError   = false;
					
					// uruchom callback - walidacja się zaczyna
					setts.callbackBefore($(this));			 
					$.each(rules, function(field, validators) {
						var value = $('[@name=' + field + ']').val();
						// dla każdego walidatora dla pola
						$.each(validators, function() {
							// sprawdź poprawność danych
							if(! checkers[this.name](value)) {
								isError = true;
								// zgłoś wystąpienie błędu oraz pozwól na zakończenie dalszego sprawdzania
								if(! setts.callback(field, this.error)) {
									checkNext = false;
								}
							}
							return checkNext;
						});						
						return checkNext;
					});
					// jeżeli wystąpił błąd nie wysyłaj formularza
					return setts.callbackAfter($(this), !isError);
				});
			}
		})
	},
	
	/**
	 * Dostępne walidatory.
	 * Nazwa metody odpowiada końcówce nazwy klasy PHP, na przykład:
	 * Fasic_Form_Validator_Email -> email
	 * 
	 * Po dodaniu walidatora po stronie serwera musimy dodać 
	 * odpowiednią metodę do tej klasy.
	 */	
	fasicFormRules: {
	
	    /**
		 */
		required: function(value) {
			return (value != undefined) && (value != '');					
		},
	
		/**
		 */
		email: function(value) {
			var regex = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;

			return (value == '') || regex.test(value);
		}
	}
});