(function() {
    
    var W = this;
    
    // IE problem when coremetrics scripts are loaded
    // rewrite doPostBack onDomReady
    box.dom(function() {
        W.__doPostBack = function(eventTarget, eventArgument) {
            theForm.__EVENTTARGET.value = eventTarget;
            theForm.__EVENTARGUMENT.value = eventArgument;
            theForm.submit();
        };
    });
    
    // restore link between labels and fields
    var fieldsNames = 'input,textarea,select,span';
    
    box.addClick({
        id: 'label',
        deepness: 2,
        test: function(e, element) {
            return (element.nodeName.toLowerCase() == 'label' && !box.dom(element).attr('for'));
        },
        action: function(e, element) {
            var field = $(element).prev()[0];
            if(!field || fieldsNames.indexOf(field.nodeName.toLowerCase()) == -1) {
                field = $(element).next()[0];
            }
            if(field && field.className == 'AnswerClass') {
                field = $(field).children()[0];
            }
            if(field && field.type) {
                switch(field.type) {
                    case 'text':
                    case 'password':
                    case 'select-one':
                    case 'textarea':
                        field.focus();
                        break;
                    case 'radio':
                    case 'checkbox':
                        field.click();
                        field.focus();
                        break;
                }
            }
        }
    });
    
    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="/sites/img/common/picto/error.png" />');
        }
    };
    
    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
    });
    
})();
