/**
 * Classe permettant de gérer la validation des formulaires au niveau client en javascript :
 * 
 * @require		Mootools Core
 * @author		Mathieu Barrallon
 * @create		01/12/2011
 * 
 * @Usage :	- Pour qu'un champs soit obligatoire, lui ajouter la classe 'required'
 * 			- Pour que l'on vérifie que ce soit bien une adresse email, lui ajouter la classe 'email'
 * 			- Pour que l'on vérifie que ce soit bien un numéro de téléphone, lui ajouter la classe 'phone'
 * 
 * @Update : - 01/12/2011, ajout de 2 fonctions vérifiant le supports des nouveaux éléments et attributs HTML5 des champs 
 * 			
 */

var Formulaire = new Class({
	
	Implements : Options,
	
	forms : null,
	complete : null,
	
	options : {
		ajax : false,
		classBtnSubmit : '.submit',
		styleError : { 'border-color': '#e93d33', 'background-color': '#efb6b3' }
	},
	
	initialize : function(form, options) {
		// Initialisation des options
		this.setOptions(options);
		// Selon les paramètres on récupère un formulaire ou tous ceux de la page
		if(form==null)
			this.forms = $$('body form');
		else
			this.forms = new Array($(form));
			
		if(this.forms.length>0) {
			this.forms.each(function(form) {
				var btn = form.getElement(this.options.classBtnSubmit);

				if(btn!=null) {
					btn.addEvent('click', function() {
						this.verify(form);
						if(this.complete) {
							if(!this.options.ajax)
								form.submit();
							else
								return false;
						}
						else
							return false;
					}.bind(this));
				}
			}.bind(this));
		}
	},
	
	verify : function(form) {
		this.complete = true;
		// On récupère tous les champs du formulaire
		var inputs 	  = form.getElements('input');
		var selects	  = form.getElements('select');
		var textareas = form.getElements('textarea');
		// Vérification
		if(inputs.length>0)
			this.verifyInput(inputs);
		if(selects.length>0)
			this.verifySelect(selects);
		if(textareas.length>0)
			this.verifyTextarea(textareas);
	},
	
	verifyInput : function(inputs) {
		inputs.each(function(i) {
			switch(i.get('type')) {
				case 'radio'   : break;
				case 'checkbox': break;
				
				case 'hidden'  	:
				case 'text'   	: 
				case 'password' : 
					if(!this.check(i)) {
						this.complete = false;
					}
					break;
				case 'button'  : 
				case 'submit'  : break;
			}
		}.bind(this));
	},
	
	verifySelect : function(selects) {
		selects.each(function(s) {
			if(!this.check(s)) {
				this.complete = false;
			}
		}.bind(this));
	},
	
	verifyTextarea : function(textareas) {
		textareas.each(function(t) {
			if(!this.check(t)) {
				this.complete = false;
			}
		}.bind(this));
	},
	
	check : function(el) {
		el.erase('style');
		
		if(!this.checkRequired(el))
			return false;
		if(!this.checkEmail(el))
			return false;
		if(!this.checkPhone(el))
			return false;
		
		return true;
	},
	
	checkRequired : function(el) {
		if(el.hasClass('required')) {
			var value = el.get('value');
				value = value.clean();
				value = value.trim();
				
			if(value=="" || value < 0) {
				this.addStyleError(el);
				return false;
			}
		}
		return true;
	},
	
	checkEmail : function(el) {
		if(el.hasClass('email')) {
			var reg   = new RegExp('^[a-z0-9]+([_|\.|-]{1}[a-z0-9]+)*@[a-z0-9]+([_|\.|-]{1}[a-z0-9]+)*[\.]{1}[a-z]{2,6}$', 'i');
			var value = el.get('value');
				value = value.clean();
				value = value.trim();
		
			if(value!="" && !reg.test(value)) {
				this.addStyleError(el);
				return false;
			}
		}
		return true;
	},
	// Format : 04xxxxxxxx ou +33xxxxxxxxx
	checkPhone : function(el) {
		if(el.hasClass('phone')) {
			var reg   = new RegExp('^[0-9\+]{10,12}$', 'i');
			var value = el.get('value');
				value = value.clean();
				value = value.trim();
				
			if(value!="" && !reg.test(value)) {
				this.addStyleError(el);
				return false;
			}
		}
		return true;
	},
	
	ajaxSubmit : function( callBack ) {
		if(this.options.ajax) {
			if(this.forms.length>0) {
				this.forms.each(function(form) {
					var btn = form.getElement(this.options.classBtnSubmit);
	
					if(btn!=null) {
						btn.addEvent('click', function() {
							this.verify(form);
							if(this.complete)
								callBack();
							else
								return false;
						}.bind(this));
					}
				}.bind(this));
			}
		}
	},
	
	addStyleError : function(el) {
		el.setStyles( this.options.styleError );
	},
	
	isHtml5TagSupported : function(el){
		if (el == "[object HTMLUnknownElement]" || el == null){
			return false;
		}
		return true;
	},
	
	isHtml5AttributeSupported : function(el, attr) {
		if (!(attr in el)){
			return false;
		}
		return true;
	}
});
