(function() {
    
    var W = this, errorCls = 'error';
    
    var addFormError = function(e) {
        var id = e.source.id + 'Error';
        var msg = '<p>' + e.source.msg + '</p>';
        var error = box.dom('#' + id);
        if(error.length) {
            error.html(msg);
        } else {
            error = e.source.getElement().prepend('<div id="' + id + '" class="' + errorCls + '">' + msg + '</div>');
        }
        error.attr('tabindex', '-1').focus();
    };
    
    var removeFormError = function(e) {
        box.dom('#' + e.source.id + 'Error').empty();
    };
    
    var getErrorTarget = function(field) {
        if('select' == field.type && 'birthdate' == field.getElement().getBoxDatas('group')) {
            return field.getElement().parent().prevAll('span.legend');
        } else if('radio' != field.type) {
            return field.getLabel();
        } else {
            return field.getElements().parent().parent().prev();
        }
    };
    
    var addErrorMsg = function(field, target) {
        var baseId = field.getElement() ? (field.getElement().getBoxDatas('group') || field.name) : field.name;
        var id = baseId + 'Error';
        var msg = box.dom('#' + id);
        if(msg.length) {
            msg.html(field.getError());
        } else {
            target.append('<em id="' + id + '">' + field.getError() + '</em>');
        }
    };
    
    var addFieldError = function(e) {
        addErrorMsg(e.source, getErrorTarget(e.source).addClass(errorCls));
    };
    
    var removeFieldError = function(e) {
        var baseId = (e.source.type == 'select' ? e.source.getElement().getBoxDatas('group') : e.source.name) || e.source.name;
        box.dom('#' + baseId + 'Error').remove();
		while (box.dom('#' + baseId + 'Error').length > 0)
			box.dom('#' + baseId + 'Error').remove();
        getErrorTarget(e.source).removeClass(errorCls).unbind();
    };
    
    box.bind({
        'submit.form': function(e, domEvent) {
            if(e.valid === true) {
                removeFormError(e);
            } else if(e.valid === false && domEvent) {
                addFormError(e);
            }
        },
        'error.field': addFieldError,
        'valid.field': removeFieldError,
        
        'beforeopen.field.select': function(e) {
            var t = e.source.getReplaced()[0];
            while(t) {
                if(t.className && t.className.indexOf('boxBlue') > -1) {
                    box.dom('body').addClass('blueFauxOptions');
                    break;
                }
                t = t.parentNode;
            }
        },
        'close.field.select': function(e) {
            box.dom('body').removeClass('blueFauxOptions');
        }
    });
    
})();