/**************************************************************
 Script			: Validate
 Version		: 2.1
 Authors		: Samuel Birch
 Desc			: Form validation
 Licence		: Open Source MIT Licence
 Modded:		: A. Boutmouzzar (abdellah@3wkom.net)
 **************************************************************/
var Validate = new Class({

	//implements
	Implements: [Options, Events],

	getOptions: function(){
		return {
			validateOnBlur: true,
			errorClass: 'error',
			errorMsgClass: 'errorMessage',
			dateFormat: 'dd/MM/yy',
			onFail: {},
			onSuccess: false,
			showErrorsInline: true,
			label: false,
			abAutoValidate: true,
			abUseAlerts: false,
			langId: 1
		};
	},

	initialize: function(form, options){
		this.setOptions(this.getOptions(), options);

		this.lang_id = this.options.lang_id;
		this.setLocaleMsg(this.lang_id);

		this.form = $(form);
		this.elements = this.form.getElements('.required');

		this.list = [];

		if(this.options.abAutoValidate) {
			this.elements.each(function(el, i){
				if (this.options.validateOnBlur) {
					el.addEvent('blur', this.validate.bind(this, el));
					el.addEvent('click', function(){
						if ($type(el.getParent().getElement('span.' + this.options.errorMsgClass)) == 'element') {
							el.getParent().getElement('span.' + this.options.errorMsgClass).destroy();
						}
					}.bind(this));
				}
			}.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 {
						if (this.options.label) {
							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 'password':
			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, this.msgInvalidEmail);
							el.highlight();
						}
					}

					if (el.hasClass('number')) {
						var regNum = /[-+]?[0-9]*\.?[0-9]+/;
						if (el.value.match(regNum)) {
							valid = true;
						}
						else {
							valid = false;
							this.setMsg(el, this.msgInvalidNumber);
							el.highlight();
						}
					}

					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, this.msgInvalidZip);
							el.highlight();
						}
					}

					if (el.hasClass('date')) {
						var d = Date.parseExact(el.value, this.options.dateFormat);
						if (d != null) {
							valid = true;
						}
						else {
							valid = false;
							this.setMsg(el, this.msgInvalidDate);
							el.highlight();
						}
					}

					if (el.hasClass('noZero')) {
						if (el.value > 0) {
							valid = true;
						}
						else {
							valid = false;
							this.setMsg(el, this.msgRequiredField);
							el.highlight();
						}
					}

				}
				else {
					valid = false;
					this.setMsg(el, this.msgRequiredField);
					el.highlight();
				}
				break;

			case 'checkbox':
				if (!el.checked) {
					valid = false;
					this.setMsg(el);
					el.highlight();
				}
				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(), this.msgRequiredOption);
					el.highlight();
				}
				else {
					valid = true;
					this.clearMsg(rad.getLast());
				}
				break;

		}
		return valid;
	},

	setMsg: function(el, msg){
		if (msg == undefined) {
			msg = el.title;
		}
		if (this.options.showErrorsInline) {
			elParent = el.getParent();
			errorClass = this.options.errorMsgClass;
			if ($type(el.getParent().getElement('span.' + this.options.errorMsgClass.toString())) != 'element') {
				new Element('span').addClass(this.options.errorMsgClass).set('text', msg).injectAfter(el).set('tween', {
					duration: 3000
				}).tween('opacity', [1, 0]);
			}
			else {
				el.getElement(this.options.errorMsgClass).set('text', msg).set('tween', {
					duration: 3000
				}).tween('opacity', [1, 0]);
			}
			el.addClass(this.options.errorClass);
		}
		if (this.options.abUseAlerts) {
			alert(msg);
		}
	},

	clearMsg: function(el){
		el.removeClass(this.options.errorClass);
		if ($chk(el.getParent()) && $type(el.getParent().getElement('span.' + this.options.errorMsgClass)) == 'element') {
			el.getParent().getElement('span.' + this.options.errorMsgClass).destroy();
		}
	},

	setLocaleMsg: function(lang_id){
		lang_id = lang_id || 1;
		switch (lang_id) {
			case 2:
				this.msgRequiredField = 'Required field';
				this.msgRequiredOption = 'Please choose an option';
				this.msgInvalidEmail = 'Please type a valid email address';
				this.msgInvalidNumber = 'Please type in a valid number';
				this.msgInvalidZip = 'Please type in a valid zip code';
				this.msgInvalidDate = 'Please type in a date in this format: ' + this.options.dateFormat.toLowerCase();
				break;

			case 3:
				this.msgRequiredField = 'Required field';
				this.msgRequiredOption = 'Please choose an option';
				this.msgInvalidEmail = 'Please type a valid email address';
				this.msgInvalidNumber = 'Please type in a valid number';
				this.msgInvalidZip = 'Please type in a valid zip code';
				this.msgInvalidDate = 'Please type in a date in this format: ' + this.options.dateFormat.toLowerCase();
				break;

			case 1:
			default:
				this.msgRequiredField = 'Ce champs est requis';
				this.msgRequiredOption = 'Veuillez choisir une option';
				this.msgInvalidEmail = 'Veuillez entrer une adresse email valide';
				this.msgInvalidNumber = 'Veuillez entrer un nombre';
				this.msgInvalidZip = 'Veuillez entrer un code postal valide';
				this.msgInvalidDate = 'Veuillez entrer une date au format: ' + this.options.dateFormat.toLowerCase();
		}
	}

});

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

