

/**************************************************************



	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',

			dateFormat: 'dd/MM/yy',

			onFail: Class.empty,

			onSuccess: false,

			showErrorsInline: true,

			label: 'Attendere...'

		};

	},



	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', 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.remove(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).setText(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('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, 'Inserire un indirizzo email valido');

						}

					}

					

					if(el.hasClass('number')){

						var regNum = /[-+]?[0-9]*\.?[0-9]+/;

						if(el.value.match(regNum)){

							valid = true;

						}else{

							valid = false;

							this.setMsg(el, 'Please enter a valid number');

						}

					}

					

					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, 'Please enter a valid postcode');

						}

					}

					

					if(el.hasClass('date')){

						var d = Date.parseExact(el.value, this.options.dateFormat);

						if(d != null){

							valid = true;

						}else{

							valid = false;

							this.setMsg(el, 'Please enter a valid date in the format: '+this.options.dateFormat.toLowerCase());

						}

					}

					

				}else{

					valid = false;

					this.setMsg(el);

				}

				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(), 'Please select an option');

				}else{

					valid = true;

					this.clearMsg(rad.getLast());

				}

				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).setText(msg).injectAfter(el);

			}else{

				el.error.setText(msg);

			}

			el.addClass(this.options.errorClass);

		}

	},

	

	clearMsg: function(el){

		el.removeClass(this.options.errorClass);

		if(el.error != undefined){

			el.error.remove();

			el.error = undefined;

		}

	}

	

});



Validate.implement(new Options);

Validate.implement(new Events);





/*************************************************************/




