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

    Script		: Validate
    Version		: 2.0
    Authors		: Samuel Birch
    Desc		: Form validation
    Licence		: Open Source MIT Licence

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

/**
labels
*/

if(typeof validateLabels == "undefined") {
    var validateLabels = new Array();
    validateLabels['email'] = 'Please enter a valid email address';
    validateLabels['pass'] = 'Please enter a valid passwod a-zA-Z0-9#$@._%-';
    validateLabels['number'] = 'Please enter a valid number';
    validateLabels['integer'] = 'Please enter a valid number';
    validateLabels['postcode'] = 'Please enter a valid postcode';
    validateLabels['date'] = 'Please enter a valid date in the format: ';
    validateLabels['radio'] = 'Please select an option';
    validateLabels['checkbox'] = 'Please checked this option';
    validateLabels['wait'] = 'Please wait...';
    validateLabels['submitFaild'] = 'Please enter all valid required field';
}

var Validate = new Class({

    getOptions: function(){
        return {
            validateOnBlur: true,
            errorClass: 'error',
            errorMsgClass: 'errorMessage',
            dateFormat: 'dd/MM/yy',
            onFail: Class.empty,
            onSuccess: Class.empty,
            showErrorsInline: true,
            label: validateLabels['wait'],
            onSubmitFunction: false
        };
    },

    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 && this.options.onSuccess != Class.empty){
                    event.stop();
                    this.options.onSuccess(this.form);
                }else{
                    this.form.getElement('input[type=submit]').setProperty('value',this.options.label);
                    if(this.options.onSubmitFunction) {
                        event.stop();
                    }
                }
            }else{
                this.options.onFail(this.getList());
                alert(validateLabels['submitFaild'])
            }

        }.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, validateLabels['email']);
                        }
                    }
                    if(el.hasClass('password')){
                        var regEmail = /^[a-zA-Z0-9#$@._%-]{6,20}$/;
                        if(el.value.match(regEmail)){
                            valid = true;
                        }else{
                            valid = false;
                            this.setMsg(el, validateLabels['pass']);
                        }
                    }
                    if(el.hasClass('number')){
                        var regNum = /[-+]?[0-9]*\.?[0-9]+/;
                        if(el.value.match(regNum)){
                            valid = true;
                        }else{
                            valid = false;
                            this.setMsg(el, validateLabels['number']);
                        }
                    }
                    if(el.hasClass('integer')){
                        var regNum = /[0-9]+/;
                        if(el.value.match(regNum)){
                            valid = true;
                        }else{
                            valid = false;
                            this.setMsg(el, validateLabels['integer']);
                        }
                    }
                    if(el.hasClass('postcode')){
                        var regPC = /^[a-zA-Z0-9 _-]{2,50}$/;
                        if(el.value.match(regPC)){
                            valid = true;
                        }else{
                            valid = false;
                            this.setMsg(el, validateLabels['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, validateLabels['date']+this.options.dateFormat.toLowerCase());
                        }
                    }

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

            case 'checkbox':
                if(!el.checked){
                    valid = false;
                    this.setMsg(el, validateLabels['checkbox']);
                }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(), validateLabels['radio']);
                }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);


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

