
/**************************************************************
 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,
			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 = [];
        
        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();
                        }
                    }
                    
                }
                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.getParent().setStyles({
				'position': 'relative',
				'z-index': 0
			});
            el.addClass(this.options.errorClass);
        }
    },
    
    clearMsg: function(el){
        el.removeClass(this.options.errorClass);
        if ($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();
		}
	}
    
});


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

