
/**************************************************************

	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: 'INVALID',
			SuccessClass : "VALID",
			errorMsgClass: 'errorMessage',
			dateFormat: 'dd/MM/yy',
			onFail: new Class,
			onSuccess: false,
			
			showErrorsInline: true,
			label: 'Ok'
		};
	},

	initialize: function(form, options){
		this.setOptions(this.getOptions(), options);
		
		this.form = $(form);
		this.elements = this.form.getElements('.required');
		
		this.list = [];
		
		this.elements.each(function(el,i){
			if(this.options.validateOnBlur){
				el.addEvent('blur', 
				function (e) {
					
					if(! this.validate(el)) {
						//alert(el.getAttribute("class"));
						//if (!el.hasClass(this.options.errorClass))
						{
							el.addClass(this.options.errorClass);
							el.removeClass("required");
							el.removeClass(this.options.SuccessClass);
							//el.setProperty('class',this.options.errorClass);
						}
						//alert(el.getAttribute("class"));
					}else{
						el.addClass(this.options.SuccessClass);
						el.removeClass("required");
						el.removeClass(this.options.errorClass);
						if ($('span'+el.getAttribute("name")) != undefined)
						{
							$('span'+el.getAttribute("name")).destroy();
						}
						
					}
					
				}.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);
					//el.setProperty('class',this.options.errorClass);
					el.removeClass(this.options.SuccessClass);
					el.addClass(this.options.errorClass);
				}else{
					//this.list.remove(el);
					//el.setProperty('class',this.options.SuccessClass);
					el.removeClass(this.options.errorClass);
					el.addClass(this.options.SuccessClass);
				}
			}.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).setText(el.title).injectInside(li);
			}
		});
		return list;
	},
	
	validate: function(el){
		var valid = true;
		this.clearMsg(el);
		
		switch(el.type){
			case 'text':
			case 'textarea':
			case 'password':
				/*if(el.hasClass('annon_texte')){
					var getimage = new Request.HTML({
						url:'/ajax/set_verif_duplicate_content.php',
						data:"annon_texte="+el.value,
						evalScripts:true,
						onSuccess: function(html){
							
						}
					}).send();
					
				}*/
			
				if(el.value != ''){
					if(el.hasClass('email')){
						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, 'Veuillez entrer une adresse email valide');
						}
					}
					
					if(el.hasClass('number')){
						if(el.value == '' && el.hasClass('canBeEmpty')){
							valid = true;
						}
						else
						{
							//var regNum = /[-+]?[0-9]*\.?[0-9]+/;
							var regNum = /^[-+]?\d+(\.\d+)?$/;
							if(el.value.match(regNum)){
								valid = true;
							}else{
								valid = false;
								this.setMsg(el, 'Veuillez entrer un nombre');
							}
						}
					}
					
					if(el.hasClass('positive')){
						var regPos = /[0-9]*/;
						if(el.value.match(regPos)){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'Veuillez entrer un numero positif');
						}
					}
					
					if(el.hasClass('postcode')){
						var regPC = /^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$/
						if(el.value.match(regPC)){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'Veuillez entrer un code postal valide');
						}
					}
					
					if(el.hasClass('date')){
						var d = Date.parseExact(el.value, this.options.dateFormat);
						if(d != null){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'Veuillez entrer une date au format: '+this.options.dateFormat.toLowerCase());
						}
					}
					
					
					
					
				}else if(el.value == '' && el.hasClass('canBeEmpty')){
					valid = true;
				}else{
					valid = false;
					this.setMsg(el);
				}
				break;
			case 'select-one':
				if(el.value!=-1 && el.value!=0 && el.value!=null)
					valid = true;
				else
					valid = false;
			break;
			case 'checkbox':
				if(!el.checked){
					valid = false;
					this.setMsg(el);
				}else{
					valid = true;
				}
				break;
			
			case 'radio':
				var rad = $A(this.form[el.name]);
				var ok = false;
				rad.each(function(e,i){
					if(e.checked){
						ok = true;
					}
				});
				if(!ok){
					valid = false;
					this.setMsg(rad.getLast(), 'Veuillez choisir une option');
				}else{
					valid = true;
					this.clearMsg(rad.getLast());
				}
				break;
				
		}
		return valid;
	},
	
	setMsg: function(el, msg){
		if(msg == undefined){
			//msg = el.title;
			msg = 'Champs requis';
		}
		if(this.options.showErrorsInline){
			
			if($("span"+el.getAttribute("name")) == undefined){
				
				el.error = new Element('span').addClass(this.options.errorMsgClass).set('text',(msg))
				.injectAfter(el).setAttribute("id","span"+el.getAttribute("name"));
				
			}else{
				$("span"+el.getAttribute("name")).set('text',(msg));
			}
			el.addClass(this.options.errorClass);
		}
	},
	
	clearMsg: function(el){
		el.removeClass(this.options.errorClass);
		if($("span"+el.getAttribute("name")) != undefined){
			/*el.error.remove();*/
			
			$("span"+el.getAttribute("name")).destroy();
		}
	},
	onFail: function (el){
		
	}
});

Validate.implement(new Options);
Validate.implement(new Events);


/*************************************************************/

