jQuery(function ($) {
    // IE8 checkbox hack
    // The following fixes checkboxes/radio buttons when page is loaded ..
    $('input:checkbox:checked, input:radio:checked').addClass('checked');

    $.extend(true, $.propHooks, {
        // Attach hook for $(ELEMENT).prop('checked', VALUE) calls:
        // If the value is set programmatically we need to update the visual state ..
        checked: {
            set: function (el, value) {
                if (el.checked !== value) {
                    if (el.nodeName.toLowerCase() === 'input') {
                        if (el.type === 'radio' || el.type === 'checkbox') {
                            setTimeout(function() {
                                // This is executed after jQuery has set the value ;)
                                updateVisualState(el);
                            }, 0);
                        }
                    }
                }
                return undefined; // Let jQuery do it's work ..
            }
        },
        disabled: {
            set: function (el, value) {
                if (el.nodeName.toLowerCase() === 'select' && $.fn.select2) {
                    if ($(el).data('select2') !== undefined) {
                        try {
                            $(el).select2('enable', !value);
                        } catch (e) {
                        }
                    }
                }
                return undefined; // Let jQuery do it's work ..
            }
        }
    });
    // Live-Events allow to define the behaviour once and for all (no matter whether loaded via ajax or not) ..
    $(document).on('change', 'input:checkbox,input:radio', function() {
        updateVisualState(this);
    });

    function updateVisualState(element) {
        var input = $(element);
        if (element.checked) {
            if (input.is(':radio')) {
                // Update visual state of all unchecked radios in group ..
                var selector = 'input.checked[name="' + input.attr('name') + '"]:radio';
                var form = input.closest('form');
                var otherRadios;
                if (form.length) {
                    otherRadios = form.find(selector);
                } else {
                    otherRadios = $(selector + ':not(form *)');
                }
                otherRadios.removeClass('checked').next('label').toggleClass('IE8visualHelperClass');
            }
            input.addClass('checked').next('label').toggleClass('IE8visualHelperClass');
        } else {
            input.removeClass('checked').next('label').toggleClass('IE8visualHelperClass');
        }
    }
});