(function($) {
    $(function() {
        var cacheTimeSec = 30;
        var timestamp = new Date().getTime();
        var cacheTimestamp = timestamp - (timestamp % (cacheTimeSec * 1000));

        var docBody = $('body');
        var extendedNavigationPanel = $("#navbar-extended-nav");
        var extendedSearchPanel = $("#navbar-extended-search");

        // Load navigation content on click ..
        var navigationTriggers = $('.nav-main-menu ul li.topNavigationItem').on('click', function clickHandler() {
            var trigger = $(this).off('click', clickHandler); // Don't trigger this twice ..
            var contentId = trigger.data('content-id');
            var container = $('#' + trigger.data('mainnav-target'));
            loadElementContent(container, cacheTimestamp, contentId, initCloseButtonsMenu, function() {
                // Error -> Try to load next time ..
                trigger.on('click', clickHandler);
            });
        }).click(function(e) {
            e.preventDefault();
            /* Opens or closes meta menu area */
            if ($(this).hasClass("active")) {
                navigationTriggers.removeClass("active");
                // Adapt position of content depending on display state of meta menu
                if (extendedNavigationPanel.is(':visible')) {
                    docBody.animate({paddingTop: (parseFloat(docBody.css('padding-top'))-439)+"px"}, 500);
                }
                extendedNavigationPanel.slideUp(function() {
                    $('.nav-main-menu').find('.bottom-border, .navbar-header').removeClass("nav-menu-state-extended");
                });
            } else {
                navigationTriggers.removeClass("active");
                $(this).addClass("active");
                if (!extendedNavigationPanel.is(':visible')) {
                    // Adapt position of content depending on display state of meta menu
                    docBody.animate({paddingTop: (parseFloat(docBody.css('padding-top'))+439)+"px"}, 500);
                }
                extendedNavigationPanel.slideDown();
                $('.nav-main-menu').find('.bottom-border, .navbar-header').addClass("nav-menu-state-extended");
            }
            $(".navbar .navbar-menu").hide();
            $("#" + $(this).data("mainnav-target")).show();

        });

        // Load search content on click ..
        $('#toggle-extended-search-btn').on('click', function searchClickHandler() {
            var trigger = $(this).off('click', searchClickHandler); // Don't trigger this twice ..
            var term = 'searchTerm=' + $('#searchKeywordInput').val();
            loadElementContent(extendedSearchPanel, cacheTimestamp, 'extendedsearch', initCloseButtonsSearch, function() {
                // Error -> Try to load next time ..
                trigger.on('click', searchClickHandler);
            }, term);
        }).click(function() {
            /* Opens or closes extended search area */
            if (!extendedSearchPanel.is(':visible')) {
                docBody.animate({paddingTop: (parseFloat(docBody.css('padding-top'))+465)+"px"}, 500, function(){
                    extendedSearchPanel.addClass("ieOverflow");
                    $("#toggle-extended-search-btn").find("span").removeClass("glyphicon-chevron-down").addClass("glyphicon-chevron-up");
                    $(".navbar-fixed-top").css("position","absolute");
                    $(window).scrollTop(1);
                });
            } else {
                extendedSearchPanel.removeClass("ieOverflow");
                docBody.animate({paddingTop: (parseFloat(docBody.css('padding-top'))-465)+"px"}, 500, function(){
                    $(".navbar-fixed-top").css("position","fixed");
                    $("#toggle-extended-search-btn").find("span").removeClass("glyphicon-chevron-up").addClass("glyphicon-chevron-down");
                });
            }
            $("#searchTerm").val($("#searchKeywordInput").val());
            extendedSearchPanel.slideToggle(function(){
                $("#searchTerm").focus();
            });
        });

        function initCloseButtonsSearch() {
            extendedSearchPanel.find(".btn-close").click(function(e) {
                e.preventDefault(); // Make sure # (Hash) is not added to URL ..
                extendedSearchPanel.removeClass("ieOverflow");
                docBody.animate({paddingTop: (parseFloat(docBody.css('padding-top'))-465)+"px"}, 500);
                $(this).closest('.navbar-menu-extended').slideUp(400,function(){
                    //reset position after closing extended search
                    $(".navbar-fixed-top").css("position","fixed");

                    $("#toggle-extended-search-btn").find("span").addClass("glyphicon-chevron-down");
                });
                $( "ul.nav.navbar-nav.meta-nav li" ).removeClass("active");
            });
        }

        //mobile topNavigation
        $("#topNavSelect").on('change', function () {
            var strActionType = $(this).val().substring(0, $(this).val().indexOf(":"));
            switch (strActionType) {
                case "flyout":
                    var contentId = $(this).val().split(":")[1];
                    $("[data-content-id=" + contentId + "]").trigger("click");
                    break;
                case "theme":
                    var theme = $(this).val().split(":")[1];
                    if (theme == "dayTheme") {
                        $(".mobileDayTheme").addClass("glyphicon-ok");
                        $(".mobileNightTheme").removeClass("glyphicon-ok");
                    } else {
                        $(".mobileNightTheme").addClass("glyphicon-ok");
                        $(".mobileDayTheme").removeClass("glyphicon-ok");
                    }
                    $("#color-theme-toggle").trigger("click");
                    break;
                default: // -> "Link" ..
                    window.location.href = $(this.options[this.selectedIndex]).data('url');
                    break;
            }
        });
        ///mobile topNavigation
    });

    function loadElementContent(container, cacheTimestamp, contentId, successCallback, errorCallback, additionaParams) {
        if (additionaParams) {
            additionaParams = '&' + additionaParams;
        } else {
            additionaParams = '';
        }
        container.addClass('loading');
        container.load(Application.contextPath() + "/navigation/flyout/" + contentId + "?decorator=empty&no_cache=" + cacheTimestamp + additionaParams, function (response, status) {
            if ('success' === status) {
                successCallback(container);
            } else {
                errorCallback && errorCallback();
            }
            container.removeClass('loading');
        });
    }

    /**
     * As the content is loaded per Ajax we have to initialise inner functionality as content ist loaded
     */
     function initCloseButtonsMenu(container) {
        var docBody = $('body');
        container.find(".btn-close").click(function(e) {
            e.preventDefault();
            docBody.animate({paddingTop: (parseFloat(docBody.css('padding-top'))-439)+"px"}, 500);
            $(this).closest('.navbar-menu-extended').slideUp();
            $( "ul.nav.navbar-nav.meta-nav li" ).removeClass("active")
        });
    }

    window.EasyNavigation = {
        reloadNavigationContent: function(navigationElement) {
            var cacheTimestamp = new Date().getTime();
            var contentId = navigationElement.data('content-id');
            var container = $('#' + navigationElement.data('mainnav-target'));
            loadElementContent(container, cacheTimestamp, contentId, initCloseButtonsMenu);
        }
    }
})(jQuery);