(function($, jsf) {
    
     // Call bootstrapify after document is loaded
    $(document).ready(function() {
        var data = {};
        data.status = "success";
        bootstrapifyAll(data);
    });
    
    // Call bootstrapify after Ajax is done
    jsf.ajax.addOnEvent(bootstrapifyAll);
    
    // http://javaevangelist.blogspot.de/2014/02/jsf-22-tip-of-day-using-jsf-ajax-events.html
    function bootstrapifyAll(data) {
        if (data.status === "success") {
            bootstrapifyMessages();
            bootstrapifyFormErrors();
            bootstrapifyInputDate();
            bootstrapifyTooltip();
            bootstrapifyPopover();
            customChipAutocomplete();
        }
    }

    function bootstrapifyMessages() {
        $('form .jsf-message').changeElementType("div");
        $('form .jsf-message li').changeElementType("div");
    }
    
    $.fn.changeElementType = function(newType) {
        var newElements = [];

        $(this).each(function() {
            var attrs = {};

            $.each(this.attributes, function(idx, attr) {
                attrs[attr.nodeName] = attr.nodeValue;
            });

            var newElement = $("<" + newType + "/>", attrs).append($(this).contents());

            $(this).replaceWith(newElement);

            newElements.push(newElement);
        });

        return $(newElements);
    };

    // <h:message for="<id>" styleClass="has-error" /> 
    function bootstrapifyFormErrors() {
        $(".input-error").parent().addClass("has-error");
    }

    function bootstrapifyInputDate() {
        $(".date").attr("placeholder", "tt.mm.jjjj");
    }
    
    function bootstrapifyTooltip() {
        $( ".toolTip" ).attr( "data-toggle", "tooltip" );
        $("[data-toggle='tooltip']").tooltip({
            trigger: "click hover",
            container: "body"
        });
    }

    function bootstrapifyPopover() {
        $("[data-toggle='popover']").popover({
            trigger: "click hover",
            container: "body"
        });
    }

    function customChipAutocomplete() {
        var base = $('.media-artists');
        if(!base.length) {
            return;
        }
        var input = $('.artist-input', base);
        var inputHeight = input.outerHeight();
        var inputWidth = input.outerWidth();
        var badgesHeight = $('.badges', base).outerHeight();
        var badgesWidth = $('.badges', base).outerWidth();
        var labelInput = $('.artist-input', base);
        var changed = 0;
        var paddingBase = 6;
        var paddingTop = paddingBase;
        var paddingLeft = 12;
        var paddingRight = 27;
        var height = inputHeight;
        var pWidth = badgesWidth/inputWidth;
        if(pWidth > 0) {
            changed = 1;
            if(pWidth < .8) {
                paddingLeft = badgesWidth;
            } else {
                paddingLeft = paddingBase*2;
                paddingRight = paddingBase*2;
                paddingTop = badgesHeight;
                height = 34 + badgesHeight;
            }
        }
        labelInput.css({
            'height': height + 'px',
            'padding-top': paddingTop + 'px',
            'padding-left': paddingLeft + 'px',
            'padding-right': paddingRight + 'px'
        });
        // wait until elements are rendered
        if(!changed && $('.badge', base).length) {
            setTimeout(customChipAutocomplete,500)
        }
    }

})(jQuery, jsf);