$(function() {
    // Validacion
    var url = '/'+controller+'/validate'+accion;
    var formulario = "form";

    function doValidation(id) {
        $.post(url, $(formulario).serialize(), function(resp) {
            if (id != null) {
                if (id == "captcha") {
                    id += "-input";
                }
                $("#"+id).parent().find('.errors').remove();
                $("#"+id).parent().append(getErrorHtml(resp[id], id));
            } else {
                $(":input").not(":file, :submit").each(function() {
                    var elem = $(this).attr('id');
                    if (elem == "captcha-input") {
                        elem = "captcha";
                    }
                    $(this).parent().find('.errors').remove();
                    $(this).parent().append(getErrorHtml(resp[elem], elem));
                });
                if ($(".errors > li").size() > 0) {
                    alert('Existen errores en el formulario. Por favor, corrígelos antes de continuar.');
                } else {
                    $(formulario).unbind('submit');
                    $(formulario).submit();
                }
            }
        },'json');
    }

    function getErrorHtml(formErrors , id) {
        var o = '<ul id="errors-'+id+'" class="errors">';
        for(errorKey in formErrors) {
            o += '<li>' + formErrors[errorKey] + '</li>';
        }
        o += '</ul>';
        return o;
    }

    $(":input").not(":file, :submit, :checkbox, :hidden").blur(function() {
        var formElementId = $(this).parent().parent().children('label').attr('for');
        doValidation(formElementId);
    });

    $(formulario).submit(function() {
        doValidation(null);
        return false;
    });
});
