	
/**************************************************************

	Script		: Validate
	Version		: 2.1
	Authors		: Samuel Birch
	Desc		: Form validation
	Licence		: Open Source MIT Licence

**************************************************************/



var Validate = new Class({

	getOptions: function(){
		return {
			validateOnBlur: true,
			errorClass: 'error',
			errorMsgClass: 'errorMessage',
			showErrorsInline: true,
			label: 'En cours de traitement...'
		};
	},

	initialize: function(form, options){
		this.setOptions(this.getOptions(), options);
		this.options.onFail = options.onFail || $empty;
		this.options.onSuccess = options.onSuccess || false;
		this.form = $(form);
		this.elements = this.form.getElements('.js');
		this.list = [];
    
		this.elements.each(function(el,i){
    if(this.options.validateOnBlur){
		el.addEvent('blur', this.validate.bind(this, el));
		}
		}.bind(this));

		this.form.addEvent('submit', function(e){
			var event = new Event(e);
			var doSubmit = true;
			this.elements.each(function(el,i){
				if(! this.validate(el)){
					event.stop();
					doSubmit = false
					this.list.include(el);
				}else{
					this.list.erase(el);
				}
			}.bind(this));

			if(doSubmit){
				if(this.options.onSuccess){
					event.stop();
					this.options.onSuccess(this.form);
				}else{
					this.form.getElement('input[type=submit]').setProperty('value',this.options.label);
				}
			}else{
				this.options.onFail(this.getList());
			}
		}.bind(this));

	},

	getList: function(){
		var list = new Element('ul');
		this.list.each(function(el,i){
			if(el.title != ''){
			var li = new Element('li').injectInside(list);
			new Element('label').setProperty('for', el.id).appendText(el.title).injectInside(li);
			}
		});
		return list;
	},

	validate: function(el){
		var valid = true;
		this.clearMsg(el);

		switch(el.type){
			case 'text':
			case 'textarea':
			case 'select-one':
				if(el.value != ''){
					if(el.hasClass('mailValue')){
						var regEmail = /^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/;
						if(el.value.toUpperCase().match(regEmail)){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'votre adresse e-mail n\'est pas valide. exemple valide: mairieconseils@caissedesdepots.fr');
						}
					}
					if(el.hasClass('codeAdherent')){
							var regNum = /^[0-9]{8}$/;
							if(el.value.match(regNum)){
								valid = true;
							}else{
								valid = false;
								this.setMsg(el, 'Votre code adhérent doit comporter 8 chiffres');
							}
					}
					
          if(el.hasClass('phoneValue')){
							var regNum = /[0]{1}[1-9]{1}([ ][0-9]{2}){4}/;
							if(el.value.match(regNum)){
								valid = true;
							}else{
								valid = false;
								this.setMsg(el, 'Votre numéro de téléphone n\'est pas valide. exemple de numéro valide: 01 58 50 75 75 ');
							}
					}

						if(el.hasClass('textValue')){
							var regNum = /[a-zA-Z]{2,}/;
							if(el.value.match(regNum)){
								valid = true;
							}else{
								valid = false;
								this.setMsg(el, 'Ce champs ne doit contenir que des lettres');
							}
						}
						
							if(el.hasClass('askTextValue')){
							var regNum = /(<.*>)/;
							if(el.value.match(regNum)){
								valid = false;
							  this.setMsg(el, 'Ce champs ne peut contenir du HTML');
							}else{
							regNum = /([a-zA-Z]){2,}\w+/;
							       if(el.value.match(regNum)){
								       if(el.value.length<2000){valid = true;}else{
									   valid = false;
									   this.setMsg(el, 'Ce champs ne peut contenir plus de 2000 caractères');}
									    }else{
								            valid = false;
								            var maxtaille = el.getProperty('maxlength');
								            if(maxtaille == undefined){
			                                           maxtaille = '2000';
		                                            }
								            this.setMsg(el, 'Ce champs doit contenir entre 3 et '+maxtaille+ ' caractères et ne prend pas en compte les caractères spéciaux');
							              }
                    }
						}

					if(el.hasClass('numValue')){
						var regNum = /^[0-9]{1,7}$/;
						if(el.value.match(regNum)){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'Ce champs doit contenir entre 1 et 7 chiffres ');
						}
					}
					
          if(el.hasClass('cpValue')){
						var regNum = /^[0-9]{5}$/;
						if(el.value.match(regNum)){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'Le code postal n\'est pas valide. exemple de code postal valide 75914');
						}
					}

				}else{
						if(el.hasClass('required')){
							valid = false;
							this.setMsg(el);
						} else {
								valid = true;
								}

				}
				break;
		}
		return valid;
	},

	setMsg: function(el, msg){
		if(msg == undefined){
			msg = el.title;
		}
		if(this.options.showErrorsInline){
			if(el.error == undefined){
				el.error = new Element('span').addClass(this.options.errorMsgClass).appendText(msg).injectAfter(el);
			}else{
				el.error.appendText(msg);
			}
			el.addClass(this.options.errorClass);
		}
	},

	clearMsg: function(el){
		el.removeClass(this.options.errorClass);
		if(el.error != undefined){
			el.error.destroy();
			el.error = undefined;
		}
	}

});

Validate.implement(new Options);
Validate.implement(new Events);
/*************************************************************/

