(function() {
    
    var W = this;
    
    var errorCls = 'error';
    
    var getErrorTarget = function(field) {
        if('radio' != field.type) {
            return field.getLabel();
        } else {
            return field.getElements().parent().prev();
        }
    };
    
    var addErrorIcon = function(field, target) {
        var id = field.name + 'Error';
        var img = box.dom('#' + id);
        if(img.length) {
            img.attr('alt', field.getError()).attr('title', field.getError());
        } else {
            target.prepend('<img id="' + id + '" alt="' + field.getError() + '"  title="' + field.getError() + '" src="' + l10n.errors.img + '" />');
        }
    };
    
    var addFieldError = function(e) {
        addErrorIcon(e.source, getErrorTarget(e.source).addClass(errorCls));
    };
    
    var removeFieldError = function(e) {
        box.dom('#' + e.source.name + 'Error').remove();
        getErrorTarget(e.source).removeClass(errorCls);
    };
    
    var addFormError = function(e) {
        if(e.id == 'ingredientsListingForm') {
            return;
        }
        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 {
            e.source.getElement().prepend('<div id="' + id + '" class="' + errorCls + '">' + msg + '</div>');
        }
    };
    
    var removeFormError = function(e, originalEvent) {
        box.dom('#' + e.source.id + 'Error').remove();
        var hasOriginalEvent = typeof originalEvent == 'object';
        if(hasOriginalEvent) {
            originalEvent.preventDefault();
        }
        if(e.id == 'ingredientsListingForm' && hasOriginalEvent) {
            var url = l10n.url.ingredientsListing.replace('{$code}', e.source.field('prdCode').getValue());
            window.open(url, 'FilCode', 'width=478,height=620,resizable=1,toolbar=0,scrollbars=1,status=0,menubar=0');
        } else if(hasOriginalEvent && e.source.submitName && W.__doPostBack !== undefined) {
            W.__doPostBack(e.source.submitName, '');
        }
    };
    
    // binding des évènements
    box.bind({
        //'error.form': addFormError,
        //'valid.form': removeFormError,
        'error.field': addFieldError,
        'valid.field': removeFieldError
    });
    
})();
