var AjaxFormValidator=Class.create();
AjaxFormValidator.prototype={
    form:'',
    url:'',
    additionalParams:'',
    errorDisplay:'inline',
    errorDiv:'errorDiv',
    errors:'',
    callback:null,
    initialize:function(form,url,additionalParams){
        this.form=$(form);
        this.url=url;
        var cuerpoDiv=$$('body');
        cuerpoDiv[0].insert('<div id="waitingProcess_container"></div><div id="waitingProcess_image"></div>')
    },
    validate:function(additionalparams){
        if(!additionalparams)additionalparams='';
        var params=Form.serialize(this.form)+additionalparams;
        var myAjax=new Ajax.Request(this.url,
                {method:'post',
                parameters:params,
                onSuccess:this.processForm.bind(this)}
        );
        return false
    },
    processForm:function(req){
        var errors=eval('('+req.responseText+')');
        this.errors=errors;
        if(errors==''){
            this.form.submit()
        }else{
            switch(this.errorDisplay){
                case'none':
                    break;
                case'inline':
                    this.showErrorsInline(errors);
                    break;
                case'div':
                    this.showErrorsDiv(errors);
                    break;
                default:
                    this.showErrorsAlert(errors)
            }
            var waitingProcess=$$('div#waitingProcess_container');
            waitingProcess[0].remove();
            var waitingProcess=$$('div#waitingProcess_image');
            waitingProcess[0].remove();
            if(this.callback){
                this.callback()
            }
        }
    },
    showErrorsAlert:function(errors){
        var errorString='';
        errors.each(function(error){
            if(error.error)errorString+=error.field+': '+error.error+'\n'});
            alert(errorString)
    },
    showErrorsInline:function(errors){
        var s=$$('li.error');
        s.each(function(node){
            node.remove()}
        );
        for(var field in errors){
            var content=eval('errors.'+field);
            if(content==''){
                if($(field)){
                    $(field).removeClassName('ko');
                    $(field).addClassName('ok')}
            }else{
                if($(field)){
                    $(field).removeClassName('ok');
                    $(field).addClassName('ko');
                    var a=$(field).ancestors();
                    for(var msg in content){
                        $(a[0]).insert('<li class="error">'+eval('content.'+msg)+'</li>')
                    }
                }
            }
        }
    },
    showErrorsDiv:function(errors){
        for(var field in errors){
            var content=eval('errors.'+field);
            if(content==''){
                if($(field)){
                    $(field).removeClassName('ko');
                    $(field).addClassName('ok')
                }
            }else{
                if($(field)){
                    $(field).removeClassName('ok');
                    $(field).addClassName('ko');
                    for(var msg in content){
                        $(this.errorDiv).update('<li class="error">'+eval('content.'+msg)+'</li>')
                    }
                }
            }
        }
    }
}

