var Util = {
    validateAndSubmit: function(el) { //- v0.5
        var frm = $(el) || $(document.forms[el]);
        if(!frm) return;

        if(frm.nodeName != 'FORM') {
            frm = frm.up('form');
        }
        if(!frm) return;

        $$('div[id*=-invalid], span[id*=-invalid]').each(function(el) {
            if(!el.innerHTML) {
                el.innerHTML = 'This field is not valid';
                el.hide();
            }
        });

        frm.onsubmit = function() {
            return false;
        };


        var isValid = true;
        var requiredFields = frm.select('input.required, select.required, textarea.required');
        requiredFields.each(function(el){
            var id = el.identify();
//            console.log('#'+id+'-invalid');
            var msg = $$('#'+id+'-invalid, .'+id+'-invalid');
            if(msg.length) {
                if(!el.getValue()) {
                    el.addClassName('invalid');
                    isValid = false;
                    msg.invoke('show');
                }
                else{
                    el.removeClassName('invalid');
                    msg.invoke('hide');
                }
            }
        });

        var passwds = $$('input[type=password]');
        var msg = $$('#password-invalid, .password-invalid');
//        console.log(passwds[0].getValue()+' != '+passwds[1].getValue());
        if(passwds.length == 2 && (passwds[0].getValue() != passwds[1].getValue())) {
            isValid = false;
            passwds[0].addClassName('invalid');
            msg.invoke('show');
        }
        else{
            if(passwds[0]) {
                passwds[0].removeClassName('invalid');
                msg.invoke('hide');
            }
        }

        var emailFields = frm.select('input[name*=email]');
        emailFields.each(function(el) {
            var id = el.identify();
            var msg = $$('#'+id+'-invalid, .'+id+'-invalid');
            if(msg.length) {
                if(!/^([\w]+)(.[\w]+)*@([\w-]+\.){1,5}([A-Za-z]){2,4}$/i.test(el.getValue())) {
                    el.addClassName('invalid');
                    isValid = false;
                    msg.invoke('show');
                }
                else{
                    el.removeClassName('invalid');
                    msg.invoke('hide');
                }
            }
        });

        if(isValid){
            $$('.invalid-msg').invoke('hide');

            if(el.type == 'submit') {
                frm.submit();
            }
            else {
                frm.request({
                    onComplete: function(t) {
                        var msg = $('confirmation-msg');
                        if(msg) {
                            if(msg.offsetParent != frm.offsetParent) {
                                frm.offsetParent.appendChild(msg);
                            }
                            var heightAdjust = 14;
                            msg.setStyle({
                                position: 'absolute',
                                zIndex: '1000',
                                top: (frm.offsetTop+heightAdjust) + 'px',
                                left: (frm.offsetLeft-1) + 'px', //-minus 1 for ie
                                width: frm.offsetWidth + 'px',
                                height: (frm.offsetHeight-heightAdjust) + 'px',
                                backgroundColor: '#ffffff'
                            });
        //                        msg.setOpacity(0.7);
                            msg.appear();
                        }
                    }
                });
            }
        }
        else {
            $$('#invalid-msg').invoke('appear');
        }
    }
}
