/* Minification failed. Returning unminified contents.
(13724,25-26): run-time error JS1005: Expected '(': {
(13725,21-27): run-time error JS1009: Expected '}': return
(13725,21-27): run-time error JS1006: Expected ')': return
(13725,21-27): run-time error JS1008: Expected '{': return
(15355,33-34): run-time error JS1005: Expected '(': {
(15357,25-27): run-time error JS1006: Expected ')': if
(15357,25-27): run-time error JS1008: Expected '{': if
(15357,43): run-time error JS1004: Expected ';'
(15360,22-23): run-time error JS1195: Expected expression: )
(15364,19-23): run-time error JS1006: Expected ')': else
(15364,18): run-time error JS1004: Expected ';'
(15369,14-15): run-time error JS1195: Expected expression: )
(15370,13-14): run-time error JS1195: Expected expression: .
(15380,5-13): run-time error JS1006: Expected ')': function
(15378,6): run-time error JS1004: Expected ';'
(15380,35): run-time error JS1004: Expected ';'
(13641,22-40): run-time error JS1301: End of file encountered before function is properly closed: function (aObject)
(15438,1): run-time error JS1107: Expecting more source characters
 */
var initFollowBtns = false;

$(document).ready(function () {
    // Initialize.
    $.fn.initializeOnce();

    if (typeof Sys != "undefined" && typeof Sys.WebForms != "undefined") {
        // Initialize before AJAX call.
        Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(function (sender, arguments) {
            $.fn.initializeBeforeAJAX(arguments);
        });

        // Initialize after AJAX call.
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function (sender, arguments) {
            $.fn.initializeOnceAndAfterAJAX(arguments);

            // Error handling for barracuda policy restrictions
            if (sender._postBackSettings && sender._postBackSettings.panelsToUpdate != null) {
                if (arguments.get_error() != null) {
                    for (var i = 0; i < sender._postBackSettings.panelsToUpdate.length; i++) {
                        var updatePanel = $("#" + sender._postBackSettings.panelsToUpdate[i].split("$").join("_"));

                        updatePanel.find(".loader.update").remove();
                    }

                    $.fn.alert(settings.errors.updatePanelErrorText);
                    arguments.set_errorHandled(true);
                }
            }

            if (
                typeof sender._postBackSettings.panelsToUpdate !== "undefined" &&
                sender._postBackSettings.panelsToUpdate != null &&
                sender._postBackSettings.panelsToUpdate[0].indexOf("updateList") > -1 &&
                $(document).data("lastListItemId") !== undefined &&
                $(document).data("dontfocus") !== "true"
            ) {
                var lastListItemId = $(document).data("lastListItemId");

                if (typeof lastListItemId !== "undefined") {
                    var lastListItem = $('li[data-item-id="' + lastListItemId + '"]');

                    if (lastListItem.length > 0) {
                        var nextItem = lastListItem.next("li"),
                            focusableElem = nextItem.find(".itemTitle a");

                        if ($("#documents-v3").length > 0) focusableElem = nextItem.find(".itemImage .icon");

                        setTimeout(function () {
                            focusableElem.get(0).setAttribute("tabindex", "0");
                            focusableElem[0].focus();
                        }, 250);

                        $(document).removeData("dontfocus");
                        $(document).removeData("lastListItemId");
                    }
                }
            }

            // hCaptcha.
            if ($("#h-captcha").length > 0) {
                hCaptcha.render("h-captcha", {
                    sitekey: "4dd31292-4a91-4442-8c76-4544d33192ec",
                });
            }

            if (document.scrollToAfterAjax) {
                var scrollTarget = 0;

                if (typeof document.scrollToAfterAjax == "string") {
                    var targetScrollObject = $("#" + document.scrollToAfterAjax);

                    if (targetScrollObject.length > 0)
                        scrollTarget = targetScrollObject.offset().top - $("#top").outerHeight();
                }

                $("html, body").animate({ scrollTop: scrollTarget });
                document.scrollToTopAfterAjax = false;
            }

            if (document.body.style.cursor == "wait") document.body.style.cursor = "default";

            if ($('input[id*="_txtSearch"').length > 0 && $('input[id*="_txtSearch"').val() !== "")
                $(".searchterm.screenReaderContent").html($(".search.searched .searchterm").html());
            else $(".searchterm.screenReaderContent").empty();
        });
    }
});

$(window).on("load", function () {
    // Mett logo.
    $(".mett").setColor({ color: settings.colors.mettLogo });

    // RoyalSlider.
    $(".royalSlider").css("height", "auto");

    $.fn.initializeMaintenance();

    $.fn.initializeHelpdeskWidget();
});

$(window).on("resize", function () {
    // Spacers.
    $.fn.initializeSpacers({ resize: true });

    // Main menu.
    $("#mainMenu").initializeMainMenu();

    // Fixed path.
    $.fn.fixedPath();

    // Videos.
    $(
        "iframe[src*='youtube.com'], iframe[src*='youtube-nocookie.com'], iframe[src*='vimeo.com'], iframe[src*='bluebillywig.com'], iframe[src*='pano.autodesk.com']"
    ).setVideoFrameSize();

    // Image Maps
    $("img[usemap]").initializeImageMaps();
});

// Initialize.
$.fn.initializeOnce = function () {
    // Scroll actions.
    $(window).on("scroll", $.fn.initializeScrolling);

    $("body").on("keydown", function (e) {
        // Close shortcut menus on esc press
        if (e.keyCode == 27) {
            $("#shortcuts > li > a").removeClass("active");
            $("#shortcuts > li > .dropDown.show")
                .removeClass("show")
                .addClass("hide")
                .find("a, button")
                .last()
                .trigger("focus");
        }

        // When pressed space (32) or enter (13)
        if (e.keyCode == 32 || e.keyCode == 13) {
            var targetObject = $("[role=button]:focus");

            if (targetObject.length > 0 && (e.keyCode != 13 || targetObject.is("div"))) {
                targetObject[0].click();

                e.preventDefault();
            }
        }

        // Tab
        if (e.keyCode == 9) $("body").addClass("keyboard-user");
    });

    $("body").on("click", function (e) {
        // Determine if it's a mouse click
        if (e.detail > 0) $("body").removeClass("keyboard-user");
    });

    $("html").initializeClasses();

    // Main menu.
    $("#mainMenu").initializeMainMenu();

    // Mobile menu.
    $("#mobileSlideOut").initializeMobileMenu();

    // Anchor menu.
    $("#anchorMenu").initializeAnchorMenu();

    $("#subMenu").initializeSubMenu();

    // SubMenu which only shows active menu item
    $("#subMenu").initializeActiveItemOnlySubMenu();

    // Horizontal menu
    $("#subMenu.horizontal").initializeHorizontalSubMenu();

    // Anchor links.
    $(".editorContent a[href^='#']:not([href='#'])").initializeAnchorLinks();

    // External links.
    $(".after.icon-awesome-link-ext").initializeExternalLinks();

    // Internal page anchors.
    $(".editorContent a.anchor-link").initializeInternalPageAnchors();

    // Editorcontent tables.
    $(".editorContent table").initializeResponsiveTables();

    // Shortcuts.
    $("#shortcuts, #mobileShortcuts, #footer").initializeShortcuts();

    // Search.
    $("#top .search").initializeSearch();

    // Login.
    $("#login").initializeLogin();

    // RoyalSlider.
    $(".royalSlider").initializeRoyalSlider();

    // Path.
    $("#path").initializePath();

    // Cookie settings overlay
    $("#cookieSettingsOverlay").initializeCookieSettingsOverlay();

    // Main menu scrollable row
    $("#mainMenu > .row").calculateMainMenuDropdownPosition();

    if (settings.section.ID > 0 && settings.section.itemID > 0) $("#relatedContent").initializeRelatedContent();

    if (
        $("#events, #groups, #forms, #newsletters, #registrations, #users, #cms, #roles").length === 0 &&
        settings.section.ID > 0 &&
        settings.section.itemID > 0 &&
        $(".item.add.edit, .item.delete").length === 0 &&
        settings.section.enablePageNav
    )
        $(".item").initializePageNavigation();

    if ($("#registrations.item").length > 0) $(".item").initializeRegistrationCheckboxCheck();

    $('.userConditions .field input[type="checkbox"], .privacyStatement .field input[type="checkbox"]').on(
        "change",
        function () {
            $(".item").initializeRegistrationCheckboxCheck();
        }
    );

    if ($("html.pageType90").length > 0 && !settings.section.isAdd && !settings.section.isEdit)
        $.fn.injectMettAccessibilityParagraph();

    $("#top .logo").on("transitionend webkitTransitionEnd oTransitionEnd", function () {
        $.fn.initializeSpacers();
        $.fn.fixedPath();
    });

    $("#footer > .row .nine.columns ul").initializeFooterMenuCleanup();

    // Keep session alive for 24 hours.
    $.startKeepAlive(86400000);

    $.fn.initializeOnceAndAfterAJAX();
};

// Initialize after AJAX call.
$.fn.initializeOnceAndAfterAJAX = function (arguments) {
    // Spacers.
    $.fn.initializeSpacers();

    // Focus out of screen fix.
    $("a, button, input, [tabindex]").initializeFocus();

    // Restore focus for keyboard users.
    $.fn.restoreFocus();

    // Apply cookie settings to content.
    setTimeout(function () {
        $("body").applyCookieSettings();
    }, 200);

    // Toolbars.
    $("body").initializeToolbars();

    // Tags.
    $(".tagsInput").initializeTags();

    // Tabs.
    $(".tabs .tab:not(.hide)").initializeTabs();

    // Save.
    $(".save").initializeSave();

    // Errors.
    $(".error").initializeErrors();

    // Comments.
    $("#addComment").initializeComments();

    // Create clickable links in comments.
    $(".commentText").createClickableLinks();

    // Password checks.
    $(".passwordCheck").initializePasswordCheck();

    // Custom containers.
    $(".containerToggle").initializeCustomContainers();

    // Switchery toggles.
    $(".field").not(".noSwitchery").find("input[type=checkbox]").initializeSwitchery();

    // Powerange sliders.
    $(".field.powerange").initializePowerange();

    // Range sliders.
    $(".field .range-slider").initializeRangeSlider();

    // Portal selector.
    $(".portalSelector").initializePortalSelector();

    // Plupload.
    $(".uploader").initializePlupload();

    // Overlays.
    $(".overlay").initializeOverlays();

    // Drop down menus.
    $(".dropDownMenu").initializeDropDownMenus();

    // Tags in sections
    $(".tags[data-item-id]").initializeTagsDisplay();

    // Inline likes.
    $(".like.inline:not(.commentLike)").initializeInlineLikes();

    $("#forum.section .listAlternative").initializeForumStickies();

    // User tagging.
    $(".tagUsers").mentionTextArea();

    // Statistics.
    if ($(".statistics").length > 0) $(".statistics").initializeStatistics();

    // WCAG requirement.
    $(".button a").attr("role", "button");

    // Videos.
    setTimeout(function () {
        $(
            "iframe[src*='youtube.com'], iframe[src*='youtube-nocookie.com'], iframe[src*='vimeo.com'], iframe[src*='bluebillywig.com'], iframe[src*='pano.autodesk.com']"
        ).initializeVideoFrames();
    }, 50);

    // Image Maps
    $("img[usemap]").initializeImageMaps();

    // Polls
    $(".poll").initializePoll();

    // Keyboard Accessibility for drop downs
    $("html:not(.mobile) .dropDown").enableKeyboardAccessibility();

    // Add aria-labels to uppercase elements
    $("input [type='submit'], input [type='button'], button, .button a").addAriaLabels();

    $(".password input:password").initializePasswordVisibilityToggle();

    $.fn.initializeAccessibleHCaptcha();

    $(".pageNumber a").initializePageNumbers();

    $(".conditionsLink").parent().find("label").append("&nbsp;").append($(".conditionsLink"));
    $(".privacyLink").parent().parent().find("span").append($(".privacyLink").parent());

    if ($("#registrations.item .privacyStatement").length > 0)
        $(".privacyStatement .field.switch span:eq(0)").append($(".privacyStatement .field.switch label"));

    $("[data-total-records]").initializeTotalRecords();
};

// Initialize before AJAX call.
$.fn.initializeBeforeAJAX = function (arguments) {
    // Loader.
    $.fn.showLoader(arguments);

    // Remember focus for keyboard users
    $.fn.rememberFocus();
};

// Initialize spacers.
$.fn.initializeSpacers = function (options) {
    var defaults = {
        resize: false,
        initTopSpacer: true,
        initBottomSpacer: true,
    };

    var options = $.extend(defaults, options),
        spacers = $(this),
        cookieSettingsHeight = $("#cookieSettingsOverlayToggle:not(.hide)").outerHeight() || 0,
        cookieSpacer = $("#cookieSpacer");

    // Reset.
    if (options.initTopSpacer) $("#top").removeAttr("style");

    if (options.initBottomSpacer) $("#bottom").removeAttr("style");

    if (!options.resize) {
        // Initialize after images are loaded.
        if ($("#top .logo").length > 0 && $("#top .logo").attr("src").indexOf("?") == -1) {
            // Anti caching.
            $("#top .logo")
                .attr("src", $("#top .logo").attr("src") + "?" + new Date().getTime())
                .on("load", function () {
                    $("#spacerTop").height($("#top").height());
                });
        }

        $("#bottom .editorContent img").on("load", function () {
            $("#spacerBottom").height($("#bottom").outerHeight());
        });
    }

    if (options.initBottomSpacer && cookieSpacer.length == 0) {
        cookieSpacer = $("<div>");
        cookieSpacer.attr("id", "cookieSpacer");
        $("#bottom").append(cookieSpacer);
    }

    cookieSpacer.height(cookieSettingsHeight);

    if (options.initTopSpacer) $("#spacerTop").height($("#top").outerHeight());

    if (options.initBottomSpacer) $("#spacerBottom").height($("#bottom").outerHeight());
};

// Delayed drop down menu.
$.fn.initializeDropDownMenus = function () {
    $(this).each(function () {
        var currentObject = $(this),
            timeout = 0;

        currentObject
            .off("mouseenter")
            .off("mouseleave")
            .on("mouseenter", function () {
                if (currentObject.hasClass("delayed")) {
                    clearTimeout(timeout);

                    timeout = setTimeout(function () {
                        currentObject.addClass("expanded");
                    }, 400);
                }
            })
            .on("mouseleave", function () {
                if (currentObject.hasClass("delayed")) {
                    clearTimeout(timeout);

                    currentObject.removeClass("expanded");
                }
            });
    });
};

// Initialize toolbars & buttons.
$.fn.initializeToolbars = function () {
    var container = $(this);

    if (container.find(".toolbar").length > 0) {
        // Toolbars.
        container.find(".toolbar").each(function () {
            var toolbar = $(this),
                showToolbar = false;

            // Buttons.
            toolbar.initializeToolbarButtons();

            if (
                toolbar.find(
                    "a, input:button:not(.hide), input:submit:not(.hide), input:radio:not(.hide), input:image:not(.hide)"
                ).length > 0
            ) {
                showToolbar = true;

                // Top toolbar.
                if (toolbar.attr("id") == "toolbarTop") {
                    // Hide top toolbar on shortcuts.
                    if (settings.section.isShortcut) showToolbar = false;
                    else {
                        var dropDownMenu = toolbar.find(".dropDown"),
                            bottomToolbarSelector = "#toolbarBottom";

                        if ($("#roles.item").length > 0) {
                            // Role toolbar.
                            bottomToolbarSelector = "#toolbarBottomRoles";
                        }

                        $(bottomToolbarSelector + " .button")
                            .not(".button.save")
                            .each(function (i) {
                                var button = $(this);

                                if (i == 0) {
                                    // Remove previously copied links.
                                    dropDownMenu.find(".dropDownLink").remove();
                                }

                                if (button.find("a, input").length > 0) {
                                    // Copy bottom toolbar content to top toolbar drop down.
                                    var dropDownLink = $("<a />")
                                        .attr("href", "/")
                                        .attr("role", "option")
                                        .addClass(button.attr("class").replace("button", "dropDownLink"));

                                    if (button.find("a").length > 0) {
                                        // Link.
                                        dropDownLink.html(button.find("a").html());

                                        dropDownLink.off("click").on("click", function () {
                                            button.find("a")[0].click();

                                            return false;
                                        });
                                    } else {
                                        // Input button.
                                        dropDownLink.html(button.find("input").val());

                                        dropDownLink.off("click").on("click", function () {
                                            button.find("input").trigger("click");
                                        });
                                    }

                                    // Append link to drop down menu.
                                    dropDownMenu.append(dropDownLink);

                                    $("html:not(.mobile) .dropDown").enableKeyboardAccessibility();

                                    // Add button.
                                    if (dropDownMenu.find(".dropDownLink.add").length > 0)
                                        dropDownMenu.find(".dropDownLink.add").html(settings.buttons.addText);
                                } else {
                                    // Hide button.
                                    button.addClass("hide");
                                }
                            });

                        if (dropDownMenu.find("a").length > 0)
                            dropDownMenu.parents(".dropDownMenu").removeClass("hide");

                        toolbar.find(".toolbarWrapper").each(function () {
                            if ($(this).find("> .button:not(.hide)").length > 0) $(this).removeClass("hide");
                        });

                        if (toolbar.find(".toolbarWrapper:not(.hide)").length == 0) toolbar.addClass("hide");
                        else toolbar.removeClass("hide");

                        // Move toolbar.
                        $("#options").append(toolbar);
                    }
                }

                // Sharing toolbar.
                if (toolbar.attr("id") == "toolbarShare" || toolbar.hasClass("share")) {
                    if (settings.section.isShortcut || $(".item.add").length > 0 || $(".item.edit").length > 0)
                        showToolbar = false;
                    else {
                        // Move sharing toolbar on mobiles & tablets.
                        if ($(".touch").length > 0 && $("#right").length > 0 && $.fn.viewport().width <= 768)
                            $("#right").append(toolbar);
                    }

                    // Generate mailto link.
                    toolbar
                        .find(".button.mail a")
                        .prop(
                            "href",
                            "mailto:?subject=" + settings.various.shareMailText + "&body=" + window.location.href
                        );
                }

                // Show toolbar.
                if (showToolbar) toolbar.show();
            }
        });

        $("a, button, input, [tabindex]").initializeFocus();
    }

    // Keyboard Accessibility for drop downs
    $("html:not(.mobile) .dropDown").enableKeyboardAccessibility();
};

// Initialize toolbar buttons.
$.fn.initializeToolbarButtons = function () {
    var container = $(this);

    if (settings.section.isAdd || settings.section.isEdit) {
        // Back.
        container.find(".backToParent a").each(function () {
            var backButton = $(this);

            backButton.off("click").on("click", function () {
                var targetUrl = settings.section.parentUrl;
                var referrerField = $("[id$='_hfReferrer']");

                if (referrerField.length > 0 && trim(referrerField.val()) != "") targetUrl = trim(referrerField.val());

                document.location.href = targetUrl;

                return false;
            });

            backButton.parent().removeClass("hide").addClass("visible");
        });
    } else {
        // Don't show on default and role pages.
        if (
            settings.section.typeID != 14 &&
            settings.section.typeID != 29 &&
            settings.section.typeID != 39 &&
            settings.section.typeID != 44 &&
            settings.section.typeID != 83 &&
            !settings.section.isUser
        ) {
            // Don't show on sections.
            if (settings.section.itemID > 0) {
                // Like view only
                container.find(".likeview input:button").each(function () {
                    var likeButton = $(this),
                        likeCheckbox = likeButton.parent().find("input:checkbox");

                    if (likeCheckbox.length > 0) {
                        // Likes count.
                        likeButton.val(likeButton.parent().find("label").html());

                        if (settings.user.ID == -1) {
                            likeButton.parent().addClass("noHover");
                            likeButton.parent().removeClass("hide").addClass("visible");
                        } else likeButton.parent().removeClass("visible").addClass("hide");
                    }
                });
                // Like.
                container.find(".like input:button, .liked input:button").each(function () {
                    var likeButton = $(this),
                        likeCheckbox = likeButton.parent().find("input:checkbox"),
                        itemTitle = trim($("h1.itemTitle").text());

                    if (likeCheckbox.length > 0) {
                        // Likes count.
                        likeButton.val(likeButton.parent().find("label").html());

                        // Initial state.
                        if (likeCheckbox.is(":checked")) {
                            // Liked.
                            likeButton.parent().removeClass("like icon-heart-empty").addClass("liked icon-heart");
                            likeButton.attr("title", settings.buttons.unLikeText.replace("{0}", '"' + itemTitle + '"'));
                        }

                        likeCheckbox.off("click").on("click", function () {
                            var itemID = settings.section.itemID;

                            if (likeCheckbox.is(".comment input:checkbox")) {
                                var commentID = likeCheckbox.parents(".comment:first").attr("id");

                                if (typeof commentID != "undefined" && commentID != null && commentID.indexOf("-") > -1)
                                    itemID = commentID.split("-")[1];
                            }

                            $.ajax({
                                url: "/api/notification/SetLike",
                                data: {
                                    sectionID: settings.section.ID,
                                    contentPageID: itemID,
                                    status: likeCheckbox.is(":checked"),
                                    token: $("input[name='__RequestVerificationToken']").val(),
                                },
                            })
                                .done(function (aData) {
                                    if (typeof aData == "object" && aData.length > 0) {
                                        if (typeof aData[0].likeCount != "undefined" && aData[0].likeCount != null) {
                                            likeButton.parent().find("label").html(aData[0].likeCount);
                                            likeButton.val(aData[0].likeCount);

                                            // Inline likes.
                                            if (aData[0].contentPageID === settings.section.itemID)
                                                $(".like.inline").find(".number").html(aData[0].likeCount);
                                        }
                                    }
                                })
                                .fail(function () {
                                    $.fn.showError(arguments + ". (500.51)", "console");
                                });
                        });

                        likeButton.off("click").on("click", function () {
                            var inlineLikeButton = $(".like.inline"),
                                isComment = false;

                            if (likeButton.parents(".comment").length > 0) isComment = true;

                            // Re-initialize checkbox after update.
                            likeCheckbox = likeButton.parent().find("input:checkbox");
                            likeCheckbox.trigger("click");

                            if (likeCheckbox.is(":checked")) {
                                // Liked.
                                likeButton.parent().removeClass("like icon-heart-empty").addClass("liked icon-heart");
                                likeButton.attr(
                                    "title",
                                    settings.buttons.unLikeText.replace("{0}", '"' + itemTitle + '"')
                                );

                                if (isComment == false && inlineLikeButton.length > 0) {
                                    // Inline likes.
                                    inlineLikeButton.addClass("liked");
                                    inlineLikeButton.removeClass("icon-heart-empty").addClass("icon-heart");
                                    likeButton.attr(
                                        "title",
                                        settings.buttons.unLikeText.replace("{0}", '"' + itemTitle + '"')
                                    );
                                    inlineLikeButton.data("checked", true);
                                    inlineLikeButton
                                        .find(".screenReaderContent")
                                        .html(settings.buttons.inlineUnLikeText);
                                }
                            } else {
                                // Like.
                                likeButton.parent().removeClass("liked icon-heart").addClass("like icon-heart-empty");
                                likeButton.attr(
                                    "title",
                                    settings.buttons.likeText.replace("{0}", '"' + itemTitle + '"')
                                );

                                if (isComment == false && inlineLikeButton.length > 0) {
                                    // Inline likes.
                                    inlineLikeButton.removeClass("liked icon-heart").addClass("icon-heart-empty");
                                    likeButton.attr(
                                        "title",
                                        settings.buttons.likeText.replace("{0}", '"' + itemTitle + '"')
                                    );
                                    inlineLikeButton.data("checked", false);
                                    inlineLikeButton.find(".screenReaderContent").html(settings.buttons.inlineLikeText);
                                }
                            }

                            // Update likes count.
                            likeButton.val(likeButton.parent().find("label").html());

                            return false;
                        });

                        likeButton.parent().removeClass("hide").addClass("visible");
                    }
                });
            }

            // Follow & unfollow sections / items
            if (!initFollowBtns) {
                container.find(".follow, .following").each(function () {
                    // First load.
                    var followButton = $(this),
                        followCheckbox = followButton.find("input:checkbox");

                    if (followCheckbox.length > 0) {
                        updateFollowButton(followButton);

                        followButton.off("click").on("click", function () {
                            $.ajax({
                                url: "/api/notification/SetNotification",
                                data: {
                                    sectionID: settings.section.ID,
                                    contentPageID: settings.section.itemID,
                                    status: !followCheckbox.is(":checked"),
                                    token: $("input[name='__RequestVerificationToken']").val(),
                                },
                            })
                                .done(function (data) {
                                    // Re-initialize checkbox after update.
                                    followCheckbox.prop("checked", !followCheckbox.prop("checked"));

                                    updateFollowButton(followButton);
                                    fetchFollowersData();
                                })
                                .fail(function () {
                                    $.fn.showError(arguments + ". (500.52)", "console");
                                });
                        });

                        followButton.removeClass("hide").addClass("visible");
                    }

                    initFollowBtns = true;
                });
            }

            /* Number of followers button */
            if (container.find(".followers").length > 0) fetchFollowersData();

            // Vote & unvote.
            container.find(".vote input:button, .voted input:button").each(function () {
                var voteButton = $(this),
                    voteSubmitButton = voteButton.parents(".voting").find(".voteSubmit input");

                if (voteSubmitButton.length > 0) {
                    // Vote.
                    var vote = function () {
                        voteButton.parent().removeClass("voted").addClass("vote");
                        voteButton.val(settings.buttons.voteText).attr("title", settings.buttons.voteText);

                        $(voteButton)
                            .on("mouseenter", function () {
                                voteButton.val(settings.buttons.voteText).attr("title", settings.buttons.voteText);
                                voteButton.parent().removeClass("icon-cancel").addClass("icon-thumbs-up");
                            })
                            .on("mouseleave", function () {
                                voteButton.val(settings.buttons.voteText).attr("title", settings.buttons.voteText);
                                voteButton.parent().removeClass("icon-cancel").addClass("icon-thumbs-up");
                            });
                    };

                    // Voted.
                    var voted = function () {
                        voteButton.parent().removeClass("vote icon-thumbs-up").addClass("voted icon-check");
                        voteButton.val(settings.buttons.votedText).attr("title", settings.buttons.votedText);

                        $(voteButton)
                            .on("mouseenter", function () {
                                voteButton.val(settings.buttons.unVoteText).attr("title", settings.buttons.unVoteText);
                                voteButton.parent().removeClass("icon-check").addClass("icon-cancel");
                            })
                            .on("mouseleave", function () {
                                voteButton.val(settings.buttons.votedText).attr("title", settings.buttons.votedText);
                                voteButton.parent().removeClass("icon-cancel").addClass("icon-check");
                            });
                    };

                    // Initial state.
                    if (voteSubmitButton[0].defaultValue == settings.buttons.unVoteText) voted();

                    voteButton.off("click").on("click", function () {
                        $(this).parent().addClass("loading");
                        $(this).parent().find(".loader").removeClass("hide");

                        voteSubmitButton.trigger("click");
                    });

                    voteButton.parent().removeClass("hide").addClass("visible");
                }
            });

            // Sign up & sign off.
            container.find(".signUp input:submit, .signedUp input:submit").each(function () {
                var signUpButton = $(this);

                // Sign up.
                var signUp = function () {
                    signUpButton.parent().removeClass("signedUp").addClass("signUp");
                    signUpButton.val(settings.buttons.signUpText).attr("title", settings.buttons.signUpText);

                    $(signUpButton)
                        .on("mouseenter", function () {
                            signUpButton.val(settings.buttons.signUpText).attr("title", settings.buttons.signUpText);
                            signUpButton.parent().removeClass("icon-cancel").addClass("icon-user-add");
                        })
                        .on("mouseleave", function () {
                            signUpButton.val(settings.buttons.signUpText).attr("title", settings.buttons.signUpText);
                            signUpButton.parent().removeClass("icon-cancel").addClass("icon-user-add");
                        });
                };

                // Signed up.
                var signedUp = function () {
                    signUpButton.parent().removeClass("signUp icon-user-add").addClass("signedUp icon-check");
                    signUpButton.val(settings.buttons.signedUpText).attr("title", settings.buttons.signedUpText);

                    $(signUpButton)
                        .on("mouseenter", function () {
                            signUpButton.val(settings.buttons.signOffText).attr("title", settings.buttons.signOffText);
                            signUpButton.parent().removeClass("icon-check").addClass("icon-cancel");
                        })
                        .on("mouseleave", function () {
                            signUpButton
                                .val(settings.buttons.signedUpText)
                                .attr("title", settings.buttons.signedUpText);
                            signUpButton.parent().removeClass("icon-cancel").addClass("icon-check");
                        });
                };

                // Initial state.
                if (signUpButton.hasClass("groupUnRegister") && !signUpButton.hasClass("groupFull")) signedUp();
                else if (signUpButton.hasClass("groupFull"))
                    signUpButton.parent().removeClass("signUp icon-user-add").addClass("signedUp icon-cancel");

                signUpButton.off("click").on("click", function () {
                    if (!signUpButton.hasClass("groupFull")) {
                        if (signUpButton.hasClass("groupUnRegister")) {
                            if (signUpButton.confirm(settings.warnings.unRegisterGroupText)) signedUp();
                            else return false;
                        } else signUp();
                    }
                });
            });
        }

        // Don't show on user and role pages.
        if (
            settings.user != undefined &&
            settings.user.ID != -1 &&
            !settings.section.isUser &&
            settings.section.itemID != 46
        ) {
            // Favorite button.
            container
                .find(".favorite input:button, .favorited input:button, .favorite button, .favorited button")
                .each(function () {
                    var favoriteButton = $(this),
                        favoriteCheckbox = favoriteButton.parent().find("input:checkbox");

                    if (favoriteCheckbox.length > 0) {
                        // Initial state.
                        if (favoriteCheckbox.is(":checked")) {
                            // Favorited.
                            favoriteButton
                                .parent()
                                .removeClass("favorite icon-awesome-star-empty")
                                .addClass("favorited icon-awesome-star");
                            favoriteButton.attr("title", settings.buttons.unfavoriteText);
                            favoriteButton.attr("aria-label", settings.buttons.unfavoriteText);
                            favoriteButton.find(".screenReaderContent").text(settings.buttons.unfavoriteText);
                        }

                        favoriteCheckbox.off("click").on("click", function () {
                            $.ajax({
                                url: "/api/notification/SetFavorite",
                                data: {
                                    sectionID: settings.section.ID,
                                    contentPageID: settings.section.itemID,
                                    status: favoriteCheckbox.is(":checked"),
                                    token: $("input[name='__RequestVerificationToken']").val(),
                                },
                            })
                                .done(function () {
                                    if (favoriteCheckbox.is(":checked")) {
                                        // Show favorites in shortcuts.
                                        $("#shortcuts .favorites").parent().removeClass("hide").addClass("visible");
                                    } else {
                                        // Check of there are more favorites.
                                        $.ajax({
                                            url: "/api/notification/HasFavorites",
                                            data: {
                                                userID: settings.user.ID,
                                                token: $("input[name='__RequestVerificationToken']").val(),
                                            },
                                        }).done(function (data) {
                                            if (!data) {
                                                // Hide favorites in shortcuts.
                                                $("#shortcuts .favorites").parent().addClass("hide");
                                            }
                                        });
                                    }
                                })
                                .fail(function () {
                                    $.fn.showError(arguments + ". (500.65)", "console");
                                });
                        });

                        favoriteButton.off("click").on("click", function () {
                            // Re-initialize checkbox after update.
                            favoriteCheckbox = favoriteButton.parent().find("input:checkbox");
                            favoriteCheckbox.trigger("click");

                            if (favoriteCheckbox.is(":checked")) {
                                // Favorited.
                                favoriteButton
                                    .parent()
                                    .removeClass("favorite icon-awesome-star-empty")
                                    .addClass("favorited icon-awesome-star");
                                favoriteButton.attr("title", settings.buttons.unfavoriteText);
                                favoriteButton.attr("aria-label", settings.buttons.unfavoriteText);
                                favoriteButton.find(".screenReaderContent").text(settings.buttons.unfavoriteText);
                            } else {
                                // Favorite.
                                favoriteButton
                                    .parent()
                                    .removeClass("favorited icon-awesome-star")
                                    .addClass("favorite icon-awesome-star-empty");
                                favoriteButton.attr("title", settings.buttons.favoriteText);
                                favoriteButton.attr("aria-label", settings.buttons.favoriteText);
                                favoriteButton.find(".screenReaderContent").text(settings.buttons.favoriteText);
                            }

                            return false;
                        });

                        favoriteButton.parent().removeClass("hide").addClass("visible");
                    }
                });
        }

        // Security button.
        if (container.find(".security").length > 0) {
            var securityButton = container.find(".security"),
                securityLink = securityButton.find("a");

            if (!settings.section.isPrivate) {
                // Public page.
                securityButton.removeClass("icon-lock").addClass("icon-lock-open");
                securityLink
                    .prop("title", settings.buttons.publicPageText)
                    .html("<span>" + settings.buttons.publicPageText + "</span>");
            }

            securityLink.off("click").on("click", function () {
                document.location.href = settings.section.cmsEditUrl + "#tab=securityTab";

                return false;
            });

            securityButton.removeClass("hide").addClass("visible");
        }

        // Follow / unfollow users
        container.find(".followUser, .followingUser").each(function () {
            var userId = $(this).closest(".item").data("userid"),
                userFirstName = $(this).closest(".item").find(".firstname").text();

            $(this).initializeUserFollowButtons(userId, userFirstName);
        });

        var loadEventInfoCalled = false;

        // Event buttons (yes, no, maybe, I don't know...).
        container.find(".attend input:button").each(function () {
            var eventButton = $(this).parent(),
                eventSectionID = settings.section.ID,
                eventID = -1,
                eventAttending = -1,
                eventAttendees = -1,
                eventRecurrenceID = 0; // 0 means no recurrence item e.g. the original event

            if (eventButton.data("event-section-id") != undefined)
                eventSectionID = eventButton.data("event-section-id");

            if (eventButton.data("event-id") != undefined) eventID = eventButton.data("event-id");

            if (eventButton.data("event-attend") != undefined) eventAttending = eventButton.data("event-attend");

            if (eventButton.data("event-attendees") != undefined) eventAttendees = eventButton.data("event-attendees");

            if (eventButton.data("event-recurrence-id") != undefined)
                eventRecurrenceID = eventButton.data("event-recurrence-id");
            else eventRecurrenceID = getUrlParameter("recurrenceID");

            if (eventID > 0 && settings.user.ID > 0 && eventAttending > -1) {
                // Reset.
                var attendingButtonsContainer = container.parents(".attendingButtonsContainer");
                attendingButtonsContainer.find(".eventButtons").addClass("hide");
                attendingButtonsContainer.find(".maxAttendingReached").addClass("hide");

                container.find(".accepted").removeClass("accepted").addClass("accept");
                container.find(".maybied").removeClass("maybied").addClass("maybe");
                container.find(".denied").removeClass("denied").addClass("deny");

                // Show loader.
                container.find(".loader").show();

                if (!loadEventInfoCalled) {
                    loadEventInfoCalled = true;
                    // Check if user is invited.
                    $.ajax({
                        type: "GET",
                        url:
                            "/api/events/iseventinvitee?sectionID=" +
                            settings.section.ID +
                            "&eventID=" +
                            eventID +
                            "&userID=" +
                            settings.user.ID +
                            (eventRecurrenceID != undefined ? "&recurrenceID=" + eventRecurrenceID : "") +
                            "&token=" +
                            $("input[name='__RequestVerificationToken']").val(),
                    }).done(function (data) {
                        if (data) {
                            // Initial state.
                            $.ajax({
                                type: "GET",
                                url:
                                    "/api/events/getattendingstatus?eventID=" +
                                    eventID +
                                    "&userID=" +
                                    settings.user.ID +
                                    "&recurrenceID=" +
                                    (eventRecurrenceID != undefined ? eventRecurrenceID : "0") +
                                    "&token=" +
                                    $("input[name='__RequestVerificationToken']").val(),
                            })
                                .done(function (data) {
                                    switch (data) {
                                        // Denied.
                                        case 0:
                                            container.find(".deny").removeClass("deny").addClass("denied");
                                            container
                                                .parent()
                                                .find(".screenReaderContent")
                                                .text(settings.events.screenReaderDenied);
                                            break;

                                        // Accepted.
                                        case 1:
                                            container.find(".accept").removeClass("accept").addClass("accepted");
                                            container
                                                .parent()
                                                .find(".screenReaderContent")
                                                .text(settings.events.screenReaderAccepted);
                                            break;

                                        // Maybied.
                                        case 2:
                                            container.find(".maybe").removeClass("maybe").addClass("maybied");
                                            container
                                                .parent()
                                                .find(".screenReaderContent")
                                                .text(settings.events.screenReaderMaybied);
                                            break;
                                    }

                                    // Hide loader.
                                    attendingButtonsContainer.find(".loader").hide();

                                    // Show buttons.
                                    attendingButtonsContainer
                                        .find(".eventButtons")
                                        .removeClass("hide")
                                        .addClass("visible");
                                    attendingButtonsContainer
                                        .find(".maxAttendingReached")
                                        .addClass("hide")
                                        .removeClass("visible");
                                })
                                .fail(function () {
                                    $.fn.showError(settings.errors.generalErrorText + " (500.58)", "console");
                                });
                        } else {
                            $.ajax({
                                type: "GET",
                                url:
                                    "/api/events/geteventattendingcount?eventId=" +
                                    eventID +
                                    "&recurrenceID=" +
                                    eventRecurrenceID +
                                    "&token=" +
                                    $("input[name='__RequestVerificationToken']").val(),
                            })
                                .done(function (data) {
                                    if (data > -1 && eventAttendees > -1 && !(data < eventAttendees)) {
                                        attendingButtonsContainer
                                            .find(".eventButtons")
                                            .addClass("hide")
                                            .removeClass("visible");
                                        attendingButtonsContainer
                                            .find(".maxAttendingReached")
                                            .removeClass("hide")
                                            .addClass("visible");
                                    }
                                })
                                .fail(function () {
                                    $.fn.showError(settings.errors.generalErrorText + " (500.xx)", "console");
                                });
                        }
                    });
                }

                $(this)
                    .off("click")
                    .on("click", function () {
                        var eventAttendAll = false;

                        var sendAttendStatus = function () {
                            $.ajax({
                                url: "/api/events/attendevent",
                                data: {
                                    sectionID: eventSectionID,
                                    eventId: eventID,
                                    eventAttending: eventAttending,
                                    eventRecurrenceID: eventRecurrenceID,
                                    all: eventAttendAll,
                                    token: $("input[name='__RequestVerificationToken']").val(),
                                },
                            })
                                .done(function (data) {
                                    data = JSON.parse(data);

                                    var result = JSON.parse(data[0]["Item2"]);

                                    // Reset.
                                    container.find(".accepted").removeClass("accepted").addClass("accept");
                                    container.find(".maybied").removeClass("maybied").addClass("maybe");
                                    container.find(".denied").removeClass("denied").addClass("deny");

                                    if (!result.maxAttendeesReached) {
                                        switch (result.attendingStatus) {
                                            case "No":
                                                // Deny.
                                                eventButton
                                                    .parent()
                                                    .find(".attend.deny")
                                                    .removeClass("deny")
                                                    .addClass("denied");
                                                container
                                                    .parent()
                                                    .find(".screenReaderContent")
                                                    .text(settings.events.screenReaderDenied);
                                                break;
                                            case "Yes":
                                                // Accept.
                                                eventButton
                                                    .parent()
                                                    .find(".attend.accept")
                                                    .removeClass("accept")
                                                    .addClass("accepted");
                                                container
                                                    .parent()
                                                    .find(".screenReaderContent")
                                                    .text(settings.events.screenReaderAccepted);
                                                break;
                                            case "Maybe":
                                                // Maybe.
                                                eventButton
                                                    .parent()
                                                    .find(".attend.maybe")
                                                    .removeClass("maybe")
                                                    .addClass("maybied");
                                                container
                                                    .parent()
                                                    .find(".screenReaderContent")
                                                    .text(settings.events.screenReaderMaybied);
                                                break;
                                        }
                                    } else {
                                        var attendingButtonsContainer = container.parents(".attendingButtonsContainer");
                                        attendingButtonsContainer
                                            .find(".showEventAttendingButtons")
                                            .addClass("hide")
                                            .removeClass("visible");
                                        attendingButtonsContainer
                                            .find(".maxAttendingReached")
                                            .removeClass("hide")
                                            .addClass("visible");
                                    }

                                    // Update attendees count.
                                    if (!$(".overlayEvent .eventCounts").hasClass("alwaysHide"))
                                        $(".overlayEvent, #events.item").getEventAttendees({
                                            eventID: eventID,
                                            recurrenceID: eventRecurrenceID,
                                        });
                                })
                                .fail(function () {
                                    $.fn.showError(settings.errors.generalErrorText + " (500.59)", "console");
                                });
                        };

                        if ($(this).closest(".eventInformation.eventButtons").hasClass("has-recurrence")) {
                            $(".overlayAttendAllOrSingle").removeClass("hide");
                            $(".overlayAttendAllOrSingle .overlayItemTitle").trigger("focus");
                        } else sendAttendStatus();

                        $("#btnAttendAllRecurringEvents")
                            .off("click")
                            .on("click", function () {
                                eventAttendAll = true;

                                $(".overlayAttendAllOrSingle").addClass("hide");
                                sendAttendStatus();
                            });

                        $("#btnAttendOnlyThisEvent")
                            .off("click")
                            .on("click", function () {
                                $(".overlayAttendAllOrSingle").addClass("hide");
                                sendAttendStatus();
                            });

                        return false;
                    });
            }
        });

        // Sharing buttons.
        if (container.hasClass("share")) {
            container
                .find(".facebook a")
                .attr("href", settings.section.facebookShareUrl)
                .attr("title", settings.various.shareFacebookText)
                .attr("aria-label", settings.various.shareFacebookText);
            container
                .find(".linkedIn a")
                .attr("href", settings.section.linkedInShareUrl)
                .attr("title", settings.various.shareLinkedinText)
                .attr("aria-label", settings.various.shareLinkedinText);
            container
                .find(".twitter a")
                .attr("href", settings.section.twitterShareUrl)
                .attr("title", settings.various.shareTwitterText)
                .attr("aria-label", settings.various.shareTwitterText);
            container
                .find(".mail a")
                .attr("href", settings.section.mailToFriendUrl)
                .attr("title", settings.various.shareEmailText)
                .attr("aria-label", settings.various.shareEmailText);
            container
                .find(".rss a")
                .attr("href", settings.section.rssFeedUrl)
                .attr("title", settings.various.shareRSSText)
                .attr("aria-label", settings.various.shareRSSText);
        }
    }

    // Empty trash button.
    container.find(".emptyTrash input, .emptyTrash a").each(function () {
        var emptyTrashButton = $(this);

        emptyTrashButton.off("click").on("click", function () {
            // SectionID.
            var sectionID = settings.section.ID;

            if ($.fn.getQueryString("id") != "") sectionID = $.fn.getQueryString("id");

            if (emptyTrashButton.confirm(settings.warnings.emptyTrashText)) {
                // Loader.
                $(".trashWidget").html('<div class="loader show"></div>');

                $.ajax({
                    url: "/api/contentpages/emptyTrashcan",
                    data: {
                        sectionID: sectionID,
                        token: $("input[name='__RequestVerificationToken']").val(),
                    },
                })
                    .done(function (data) {
                        location.reload();
                    })
                    .fail(function () {
                        $.fn.showError(settings.errors.emptyTrashErrorText + " (500.64)", "console");
                    });

                return false;
            }
        });

        var trashWidget = new Widget($("#trashTabContent .mettWidget"));

        trashWidget.complete(function () {
            if ($(".noIndent").length == 0) {
                // Show button.
                emptyTrashButton.parent().removeClass("hide").addClass("visible");
                container.show();
            }
        });
    });

    // Load more items.
    container.find(".loadMore input, .loadMore a, .toolbar.paging .readMore input").each(function () {
        var button = $(this);

        button.parent(".button").removeClass("hide");

        button.on("click", function () {
            var lastItemId = $(".items .item:last-child").data("item-id");

            $(document).data("lastListItemId", lastItemId);
        });
    });

    container.find(".readMore").each(function () {
        if ($(this).find("input").length == 0 && $(this).find("a").length == 0)
            $(this).addClass("hide").removeClass("visible");
    });

    // Show more content button.
    container.find(".showMore a, .showMore input, a.showMore").each(function () {
        var button = $(this),
            buttonText = button.html(),
            buttonParent = button.parent(),
            moreContent = container.next(".more"),
            scrollToTop = false,
            hideButton = false;

        // Failover 1.
        if (moreContent.length == 0) moreContent = container.prev(".more");

        // Failover 2.
        if (moreContent.length == 0) moreContent = container.parent().find(".more");

        // Options.
        if (buttonParent.data("scroll-to-top") != undefined) scrollToTop = buttonParent.data("scroll-to-top");

        if (buttonParent.data("hide-after-toggle") != undefined) hideButton = buttonParent.data("hide-after-toggle");

        button.off("click").on("click", function () {
            if (moreContent.height() == 0) {
                // Show content.
                moreContent.stop(true).animate({ height: moreContent.find(".moreContent").height() }, 300);

                if (!hideButton) {
                    if (button.hasClass("icon-down-open-big"))
                        button.removeClass("icon-down-open-big").addClass("icon-up-open-big");

                    if (button.parent().hasClass("icon-down-open-big"))
                        button.parent().removeClass("icon-down-open-big").addClass("icon-up-open-big");

                    button.html(
                        buttonText.replace(
                            settings.buttons.showText.toLowerCase(),
                            settings.buttons.hideText.toLowerCase()
                        )
                    );
                } else buttonParent.addClass("hide").removeClass("visible");
            } else {
                // Hide content.
                moreContent.stop(true).animate({ height: 0, margin: 0 }, 150);

                if (button.hasClass("icon-up-open-big"))
                    button.removeClass("icon-up-open-big").addClass("icon-down-open-big");

                if (button.parent().hasClass("icon-up-open-big"))
                    button.parent().removeClass("icon-up-open-big").addClass("icon-down-open-big");

                button.html(
                    buttonText.replace(settings.buttons.hideText.toLowerCase(), settings.buttons.showText.toLowerCase())
                );

                if (scrollToTop) {
                    // Scroll to top.
                    $("html, body")
                        .stop(true)
                        .animate({ scrollTop: $("#scrollTop").offset().top }, 150);
                }
            }

            return false;
        });
    });

    // Show overlay button.
    container.find(".showOverlay a, .showOverlay input").each(function () {
        var button = $(this);

        button.off("click").on("click", function () {
            $(".overlay").removeClass("hide");

            return false;
        });
    });

    // Drop down toggle button.
    container.find(".button.toggleDropDown").each(function () {
        var dropDownButton = $(this),
            dropDownMenu = dropDownButton.parent().find(".dropDown"),
            showDropDownMenu = true;

        // Disable initial focus of dropDown items
        dropDownMenu.each(function () {
            $(this).find("> a").attr("tabIndex", "-1");
        });

        // Replace ugly image buttons with links.
        dropDownMenu.find("input:image").each(function (i) {
            if (i == 0) {
                // Remove previously created links.
                dropDownMenu.find(".dropDownLink").remove();
            }

            var button = $(this),
                link = $("<a/>");

            link.prop("href", "/")
                .addClass("dropDownLink " + $(button).prop("class"))
                .html($(button).prop("title"))
                .off("click")
                .on("click", function () {
                    button.trigger("click");

                    return false;
                });

            // Add link to drop down.
            button.parent().append(link.removeClass("hide"));
        });

        // Settings link in drop down menu.
        dropDownMenu
            .find(".settings")
            .off("click")
            .on("click", function () {
                document.location.href = settings.section.cmsEditUrl + "#tab=optionsTab";

                return false;
            });

        // Don't show settings drop down in add/edit pages & CMS.
        if ((settings.section.isAdd || settings.section.isEdit) && dropDownMenu.find(".settings").length > 0)
            showDropDownMenu = false;

        dropDownButton.off("click tap touchstart").on("click tap touchstart", function () {
            var theThis = $(this),
                showDropDown = true;

            // Check if drop down is already visible.
            if (dropDownMenu.hasClass("show")) showDropDown = false;

            // Hide all drop downs.
            $(".dropDown").removeClass("show");
            dropDownMenu.find("> a").attr("tabIndex", "-1");

            if (showDropDown) {
                // Show this drop down.
                dropDownMenu.toggleClass("show");
            }

            if (dropDownMenu.hasClass("show")) {
                dropDownMenu.parent().parent().addClass("active");
                dropDownButton.attr("aria-expanded", "true");

                $(document).on("click", function (event) {
                    if (
                        event.target !== theThis &&
                        event.target !== dropDownMenu &&
                        $(event.target).closest(".dropDownMenu").length == 0 &&
                        dropDownMenu.parent().parent().hasClass("active")
                    )
                        theThis.trigger("click");
                });

                $("body").on("keydown", function (e) {
                    if (e.keyCode == 27 && dropDownMenu.parent().parent().hasClass("active")) theThis.trigger("click");
                });

                dropDownMenu.find("> a").attr("tabIndex", "0");
            } else {
                dropDownMenu.parent().parent().removeClass("active");

                dropDownButton.attr("aria-expanded", "false");
            }

            return false;
        });

        if (showDropDownMenu) dropDownButton.removeClass("hide").parent().parent().addClass("visible");
    });

    // Back to previous page.
    container.find(".backToPrevious a").each(function () {
        var backButton = $(this);

        backButton.off("click").on("click", function () {
            history.back();

            return false;
        });
    });

    // Accept conditions button.
    container
        .find(".acceptConditions input:submit")
        .off("click")
        .on("click", function () {
            // Disable required fields validation in underlaying forms...
            $("form").attr("novalidate", "novalidate");
        });

    if ($("html").hasClass("threedotfive")) updateToolbarWrappers();
};

function updateFollowButton(followButton) {
    var followButtonInput = followButton.find("input"),
        followCheckbox = followButton.find("input:checkbox");

    // Follow.
    var follow = function () {
        followButton.removeClass("following icon-check").addClass("follow icon-bell");
        followButtonInput.val(settings.buttons.followText).attr("title", settings.buttons.followText);

        $(followButton)
            .on("mouseenter", function () {
                followButtonInput.val(settings.buttons.followText).attr("title", settings.buttons.followText);
                followButton.removeClass("icon-cancel").addClass("icon-check");
            })
            .on("mouseleave", function () {
                followButtonInput.val(settings.buttons.followText).attr("title", settings.buttons.followText);
                followButton.removeClass("icon-check").addClass("icon-cancel");
            });
    };

    // Following.
    var following = function () {
        followButton.removeClass("follow icon-bell").addClass("following icon-check");
        followButtonInput.val(settings.buttons.followingText).attr("title", settings.buttons.followingText);

        $(followButton)
            .on("mouseenter", function () {
                followButtonInput.val(settings.buttons.unFollowText).attr("title", settings.buttons.unFollowText);
                followButton.removeClass("icon-check").addClass("icon-cancel");
            })
            .on("mouseleave", function () {
                followButtonInput.val(settings.buttons.followingText).attr("title", settings.buttons.followingText);
                followButton.removeClass("icon-cancel").addClass("icon-check");
            });
    };

    if (followCheckbox.length > 0) {
        if (followCheckbox.is(":checked")) following();
        else follow();
    }
}

function fetchFollowersData() {
    var apiUrl = "",
        apiData = {};

    if (settings.section.itemID > 0) {
        apiUrl = "/api/notification/getcontentpagefollowerscount";
        apiData = {
            sectionID: settings.section.ID,
            contentPageID: settings.section.itemID,
            token: $("input[name='__RequestVerificationToken']").val(),
        };
    } else {
        apiUrl = "/api/notification/getsectionfollowerscount";
        apiData = {
            sectionID: settings.section.ID,
            token: $("input[name='__RequestVerificationToken']").val(),
        };
    }

    $.ajax({
        url: apiUrl,
        data: apiData,
    }).done(function (data) {
        updateFollowersInfo(data);
    });
}

function updateFollowersInfo(data) {
    var followersButton = $(".button.followers");

    if (!data || trim(data) == "") return;

    data = JSON.parse(data);

    if (typeof data != "object") return;

    // check if user is administrator or moderator
    if (settings.widgets.allowed) {
        if (followersButton.find("input").length == 0) followersButton.append('<input type="button" />');

        var followersButtonInput = followersButton.find("input"),
            followersCount = parseInt(data.followersCount);

        if (followersCount == 1)
            followersButtonInput
                .val("1 " + settings.buttons.followerText)
                .attr("title", "1 " + settings.buttons.followerText);
        else if (followersCount == 0 || followersCount > 1)
            followersButtonInput
                .val(followersCount + " " + settings.buttons.followersText)
                .attr("title", followersCount + " " + settings.buttons.followersText);

        followersButtonInput.off("click").on("click", function () {
            var apiUrl = "",
                apiData = {};

            if (settings.section.itemID > 0) {
                apiUrl = "/api/notification/getcontentpagefollowers";
                apiData = {
                    sectionID: settings.section.ID,
                    contentPageID: settings.section.itemID,
                    token: $("input[name='__RequestVerificationToken']").val(),
                };
            } else {
                apiUrl = "/api/notification/getsectionfollowers";
                apiData = {
                    sectionID: settings.section.ID,
                    token: $("input[name='__RequestVerificationToken']").val(),
                };
            }

            $.ajax({
                url: apiUrl,
                data: apiData,
            }).done(function (data) {
                $("#followersOverlay .overlayItemContent .usersList").empty();

                data = JSON.parse(data);

                $.each(data, function (i) {
                    var output = $('<div class="field lessMargin" />'),
                        userLink = $(
                            '<a href="/shortcuts/users_showprofile.aspx?userkey=' +
                                this.userId +
                                '">' +
                                this.userFullName +
                                "</a>"
                        ),
                        userCheckbox = $(
                            '<input type="checkbox" id="userCheckbox_' +
                                this.userId +
                                '" class="userCheckbox" data-id="' +
                                this.userId +
                                '" checked="checked" />'
                        ),
                        userLabel = $(
                            '<label for="userCheckbox_' + this.userId + '">' + this.userFullName + "</label>"
                        ),
                        userAvatar = $('<div class="noAvatar circle icon-user before" />');

                    if (this.userImage != "")
                        userAvatar = $('<img src="' + this.userImage + '?width=30&amp;height=30" class="avatar" />');

                    userLink = userLink.attr("data-user-id", this.userId);
                    userLabel = userLabel.attr("data-user-id", this.userId);

                    userCheckbox.on("change", function () {
                        var checkbox = $(this),
                            checked = checkbox[0].checked,
                            userID = checkbox.data("id");

                        $.ajax({
                            url: "/api/notification/SetNotification",
                            data: {
                                sectionID: settings.section.ID,
                                contentPageID: settings.section.itemID,
                                userKey: userID,
                                status: checked,
                                token: $("input[name='__RequestVerificationToken']").val(),
                            },
                        }).done(function (data) {
                            if (checked === false) {
                                checkbox.parent().find("label").addClass("disabledUser");
                            } else {
                                checkbox.parent().find("label").removeClass("disabledUser");
                            }

                            if (settings.user.ID === userID) {
                                // Update follow button state.
                                var followButton = $("#toolbarTop .button.follow, #toolbarTop .button.following");
                                followButton.find("input:checkbox").prop("checked", checked);

                                updateFollowButton(followButton);
                                fetchFollowersData();
                            }
                        });
                    });

                    output.append(userCheckbox).append(userLabel.prepend(userAvatar)).append('<div class="clear" />');
                    $("#followersOverlay .overlayItemContent .usersList").append(output);
                });

                $("#followersOverlay").find(".userCheckbox").initializeSwitchery();
                $("#followersOverlay").initializeFollowersOverlay();
                $("#followersOverlay").showFollowersOverlay({ showOverlay: true });
            });
        });
    } else {
        var followersButtonLabel = $("<p />");

        if (data.followersCount == 1) followersButtonLabel.text("1 " + settings.buttons.followerText);
        else if (data.followersCount == 0 || data.followersCount > 1)
            followersButtonLabel.text(data.followersCount + " " + settings.buttons.followersText);

        followersButton.empty();
        followersButton.append(followersButtonLabel);
    }

    followersButton.addClass("visible").removeClass("hide");

    if ($("html").hasClass("threedotfive")) updateToolbarWrappers();
}

function updateToolbarWrappers() {
    $.each($("#toolbarTop .toolbarWrapper"), function () {
        var tWrapper = $(this);

        tWrapper.find("> *").removeClass("wrapper-first-child").removeClass("wrapper-last-child");

        tWrapper.find("> *.visible:first").addClass("wrapper-first-child");
        tWrapper.find("> *.visible:last").addClass("wrapper-last-child");
    });
}

$.fn.initializeUserFollowButtons = function (userId, userFirstName) {
    // First load.
    var followButton = $(this),
        followButtonInput = $(this).find("input:button"),
        followCheckbox = followButton.parent().find("input:checkbox"),
        apiUrl = "",
        action = "";

    if (userId === settings.user.ID) $(followButton).remove();

    if (followCheckbox.length > 0) {
        // Follow.
        var follow = function () {
            followButton.removeClass("followingUser icon-check").addClass("followUser icon-bell");
            followButtonInput.val(settings.buttons.followText).attr("title", settings.buttons.followText);

            $(followButton)
                .on("mouseenter", function () {
                    followButtonInput.val(settings.buttons.followText).attr("title", settings.buttons.followText);
                    followButton.removeClass("icon-cancel").addClass("icon-check");
                })
                .on("mouseleave", function () {
                    followButtonInput.val(settings.buttons.followText).attr("title", settings.buttons.followText);
                    followButton.removeClass("icon-cancel").addClass("icon-check");
                });
        };

        // Following.
        var following = function () {
            followButton.removeClass("followUser icon-bell").addClass("followingUser icon-check");
            followButtonInput.val(settings.buttons.followingText).attr("title", settings.buttons.followingText);

            $(followButton)
                .on("mouseenter", function () {
                    followButtonInput.val(settings.buttons.unFollowText).attr("title", settings.buttons.unFollowText);
                    followButton.removeClass("icon-check").addClass("icon-cancel");
                })
                .on("mouseleave", function () {
                    followButtonInput.val(settings.buttons.followingText).attr("title", settings.buttons.followingText);
                    followButton.removeClass("icon-cancel").addClass("icon-check");
                });
        };

        // Check whether the user is followed...
        $.ajax({
            url: "/api/followers/isuserfollow",
            data: {
                userID: settings.user.ID,
                followedUserID: userId,
                token: $("input[name='__RequestVerificationToken']").val(),
            },
        }).done(function (uData) {
            if (uData == true) {
                followCheckbox.attr("checked", "checked");

                following();
            }
        });

        followCheckbox.off("click").on("click", function () {
            if (followCheckbox.is(":checked")) {
                apiUrl = "/api/followers/setuserfollow";
                action = "follow";
            } else {
                apiUrl = "/api/followers/removeuserfollow";
                action = "unfollow";
            }

            $.ajax({
                url: apiUrl,
                data: {
                    followedUserID: userId,
                    token: $("input[name='__RequestVerificationToken']").val(),
                },
            })
                .done(function () {
                    if (action == "follow") {
                        if (userFirstName !== "") {
                            var message =
                                "<h2>Je volgt vanaf nu " +
                                userFirstName +
                                "</h2><span>" +
                                userFirstName +
                                " krijgt hier een melding van en jij ontvangt notificaties van zijn/haar activiteiten.</span>";
                        } else {
                            var message =
                                "<h2>Je volgt vanaf nu deze persoon.</h2><span>Hij/zij krijgt hier een melding van en jij ontvangt notificaties van zijn/haar activiteiten.</span>";
                        }

                        $("body").showMessage({ content: message, autoHideAfter: 6000 });
                    }
                })
                .fail(function (jqXHR, textStatus, error) {
                    $.fn.showError(arguments + ". (500.52)", "console");
                });
        });

        followButtonInput.off("click").on("click", function () {
            // Re-initialize checkbox after update.
            followCheckbox = followButton.find("input:checkbox");
            followCheckbox.trigger("click");

            if (followCheckbox.is(":checked")) following();
            else follow();
        });

        followButton.removeClass("hide");
    }
};

// Initialize tabs.
$.fn.initializeTabs = function () {
    var tabs = $(this),
        container = tabs.parents(".tabs");

    // Map tab.
    if ($(".map").length > 0 && $("#mapTab").hasClass("hide")) {
        $("#mapTab").removeClass("hide");
        tabs = $(".tabs .tab:not(.hide)");
    }

    if (tabs.length > 0) {
        // Default values.
        var selectedTab = $.fn.getAnchor("tab"),
            hideEmptyTabs = true,
            isMobile = $(".touch").length > 0,
            activeTabText = $("<span >");

        activeTabText.addClass("activeTabText");

        if (container.data("tabs-hide-empty") != undefined) hideEmptyTabs = container.data("tabs-hide-empty");

        if (container.hasClass("vertical")) activeTabText.html("<br />(" + settings.various.activeTabText + ")");
        else activeTabText.html(" (" + settings.various.activeTabText + ")");

        if (settings.showAddEditTabs || settings.section.isCMSAdd || settings.section.isCMSEdit) {
            var tabsContent = $(".tabContent"),
                previousTabButton = $(".button.previousTab"),
                nextTabButton = $(".button.nextTab");

            // Fix for back button in browser.
            var tabsInterval = setInterval(function () {
                if ($(".tabs").length > 0) {
                    // Firefox fix. Sometimes this code overrides a real mouse click. Build in a skip once after click, so it works better.
                    if (globals.justClicked) {
                        globals.justClicked = false;

                        return;
                    }

                    var currentAnchor = $.fn.getAnchor("tab");

                    if (currentAnchor.length > 0) {
                        // Ugly but effective to kill a Firefox bug. When using an if statement, FF will always execute the if AND else at this point... WEIRD!
                        switch (currentAnchor) {
                            case globals.currentTabID:
                                break;

                            default:
                                $("#" + currentAnchor)
                                    .find("a")[0]
                                    .click();
                                globals.currentTabID = currentAnchor;

                                break;
                        }
                    }
                } else clearInterval(tabsInterval);
            }, 400);

            tabs.each(function (i) {
                var tab = $(this),
                    tabContent = $("#" + tab.attr("id") + "Content"),
                    harmonicaTabs = false;

                if (isMobile && tab.find(".tabContent").length == 0 && $.fn.viewport().width < 481) {
                    // Make harmonica tabs.
                    tab.append(tabContent);
                    harmonicaTabs = true;

                    $("#toolbarBottom").css("margin-top", "40px");
                }

                if (hideEmptyTabs && trim(tabContent.html()).length == 0) {
                    // Hide empty tabs (optional).
                    tab.addClass("hide");
                }

                tab.find("a")
                    .off("click")
                    .on("click", function () {
                        var tabIsActive = false;
                        globals.justClicked = true;
                        globals.currentTabID = tab.prop("id");

                        if (tab.hasClass("active")) tabIsActive = true;

                        // Hide all tabs.
                        tabs.removeClass("active").removeAttr("aria-selected");
                        tabsContent.removeClass("active");

                        if (settings.webGuidelines) tabs.find(".activeTabText").remove();

                        if (harmonicaTabs) {
                            if (!tabIsActive) {
                                // Show clicked tab.
                                tab.addClass("active").attr("aria-selected", "true");
                                tabContent.addClass("active");

                                // Scroll to tabs.
                                $("html, body")
                                    .stop(true)
                                    .animate({ scrollTop: $(".tabs").offset().top - 200 }, 150);
                            }
                        } else {
                            // Show clicked tab.
                            tab.addClass("active").attr("aria-selected", "true");
                            tabContent.addClass("active");

                            if (settings.webGuidelines) tab.find("a").append(activeTabText);
                        }

                        // Map.
                        if (tab.prop("id") == "mapTab" && selectedTab != "mapTab") {
                            // Re-initialize maps (solves hidden container problems).
                            if (typeof initializeGoogleMaps == "function") initializeGoogleMaps();

                            if (typeof initializeAtriumMaps == "function") {
                                setTimeout(function () {
                                    initializeAtriumMaps();
                                }, 1000);
                            }
                        }

                        // Re-initialize Plupload (solves hidden container problems on mobile devices).
                        if (
                            isMobile &&
                            $(".uploader").length > 0 &&
                            (tab.prop("id") == "imageTab" ||
                                tab.prop("id") == "imagesTab" ||
                                tab.prop("id") == "filesTab" ||
                                tab.prop("id") == "mediaTab")
                        )
                            $(".uploader").initializePlupload();

                        if (!isMobile) {
                            // Show or hide previous tab button.
                            if (previousTabButton != undefined) {
                                if (i > 0) {
                                    previousTabButton.find("input:button").val(
                                        trim(
                                            tabs
                                                .eq(i - 1)
                                                .find("a")
                                                .html()
                                                .replace("&amp;", "&")
                                        )
                                    );
                                    previousTabButton.removeClass("hide");
                                    previousTabButton.parents(".toolbar.paging").show();
                                } else previousTabButton.addClass("hide");
                            }

                            // Show or hide next tab button.
                            if (nextTabButton != undefined) {
                                if (i < tabs.length - 1) {
                                    if (!tabs.eq(i + 1).hasClass("hide")) {
                                        nextTabButton.find("input:button").val(
                                            trim(
                                                tabs
                                                    .eq(i + 1)
                                                    .find("a")
                                                    .html()
                                                    .replace("&amp;", "&")
                                            )
                                        );
                                        nextTabButton.removeClass("hide");
                                        nextTabButton.parents(".toolbar.paging").show();
                                    } else nextTabButton.addClass("hide");
                                } else nextTabButton.addClass("hide");
                            }
                        }

                        selectedTabID = i;

                        // Put selected tabID in hidden field if available (edit section).
                        $("#tabID").val($(".tab").eq(selectedTabID).prop("id"));

                        // Set focus to current tabContent, first focusable item.
                        if (tabContent.find(":focusable").length > 0)
                            tabContent.find(":focusable").eq(0).trigger("focus");
                    });

                // Badge count.
                if (tab.find(".badge").length > 0) {
                    if (tabContent.find(".badgeCount").length > 0)
                        tab.find(".badge").html(tabContent.find(".badgeCount").length).removeClass("hide");
                }
            });

            // Previous tab button.
            if (previousTabButton != undefined) {
                previousTabButton
                    .find("input:button")
                    .off("click")
                    .on("click", function () {
                        if (selectedTabID > 0) {
                            // Go to previous tab.
                            tabs.eq(selectedTabID - 1)
                                .find("a")[0]
                                .click();

                            // Scroll back.
                            $("html, body")
                                .stop(true)
                                .animate(
                                    { scrollTop: $("#" + tabs.eq(selectedTabID).attr("id")).offset().top - 200 },
                                    150
                                );
                        }
                    });
            }

            // Next tab button.
            if (nextTabButton != undefined) {
                nextTabButton
                    .find("input:button")
                    .off("click")
                    .on("click", function (i) {
                        if (selectedTabID < tabs.length - 1) {
                            // Go to next tab.
                            tabs.eq(selectedTabID + 1)
                                .find("a")[0]
                                .click();

                            // Scroll back.
                            $("html, body")
                                .stop(true)
                                .animate(
                                    { scrollTop: $("#" + tabs.eq(selectedTabID).attr("id")).offset().top - 200 },
                                    150
                                );
                        }
                    });
            }

            // Only show tabs if there are tabs to show.
            if ($(".tab").not(".hide").length > 0) {
                $(".tabsTitle").removeClass("hide");

                if ($.fn.viewport().width > 480) {
                    // Select tab by anchor.
                    if (selectedTab.length > 0 && $("#" + selectedTab).length > 0) {
                        // Click selected tab.
                        $("#" + selectedTab)
                            .not(".hide")
                            .find("a")[0]
                            .click();
                    } else {
                        // Click first tab.
                        $(".tab:not(.hide)")
                            .find("a")
                            .each(function (i) {
                                if (i == 0) $(this)[0].click();
                                else return false;
                            });
                    }
                }
            } else container.addClass("hide");
        } else {
            // Hide tabs and show all content.
            $(".tab, .toolbar.paging").addClass("hide");
            $(".tabs").find(".tabContent").prop("class", "");
        }
    }

    // Tab count.
    if (settings.webGuidelines && $(".tabCount").length > 0) {
        var tabCount = $(".tab").not(".hide").length + 1;

        if (tabCount == 1) $(".tabCount").html(tabCount + " " + settings.various.stepText.toLowerCase());
        else $(".tabCount").html(tabCount + " " + settings.various.stepsText.toLowerCase());
    }
};

// Initialize shortcuts.
$.fn.initializeShortcuts = function (options) {
    var defaults = {
        showFlags: false,
        countryCodes: [],
        languageRootPaths: [],
    };

    var options = $.extend(defaults, options),
        container = $(this),
        favoritesWidget = null;

    if (container.length > 0) {
        if (settings.user.ID != -1) {
            // Profile & avatar.
            if (container.find("img.avatar").length == 0) {
                // No avatar.
                container.find(".noAvatar").removeClass("hide");
            }

            // Profile.
            $("#shortcuts .avatar, #shortcuts .profile")
                .off("click")
                .on("click", function () {
                    var shortcut = $(this),
                        dropDownMenu = shortcut.parent().find(".dropDown"),
                        allDescenants = shortcut.parent().find("*");

                    if (dropDownMenu.hasClass("show")) {
                        // Hide.
                        shortcut.removeClass("active").attr("aria-expanded", "false");
                        dropDownMenu.removeClass("show").addClass("hide");

                        allDescenants.off("blur");
                    } else {
                        // Hide all other drop downs.
                        $("#mainMenu a.arrow").removeClass("icon-up-open-big").addClass("icon-down-open-big");

                        $.each($(".dropDown"), function () {
                            if ($(this).parents("#subMenu").length == 0 && $(this).parents("#toolbarTop").length == 0)
                                $(this).removeClass("show").addClass("hide");
                        });

                        $(".shortcut").removeClass("active");

                        // Show this drop down.
                        shortcut.addClass("active").attr("aria-expanded", "true");
                        dropDownMenu.removeClass("hide").addClass("show");

                        allDescenants.off("blur").on("blur", function () {
                            setTimeout(function () {
                                if (
                                    !$.contains(shortcut.parent()[0], $(":focus")[0]) &&
                                    dropDownMenu.hasClass("show")
                                ) {
                                    shortcut.trigger("click");
                                }
                            }, 40);
                        });
                    }

                    return false;
                });

            // Favorites.
            if (container.find(".favorites").length > 0) {
                container
                    .find(".favorites")
                    .off("click")
                    .on("click", function () {
                        var shortcut = $(this),
                            dropDownContent = shortcut.parent().find(".dropDown.favoritesContent"),
                            allDescenants = shortcut.parent().find("*");

                        if (shortcut.hasClass("active")) shortcut.attr("aria-expanded", "true");

                        if (!dropDownContent.hasClass("show")) {
                            if (favoritesWidget == null) {
                                // Create new favorites widget.
                                favoritesWidget = new Widget(dropDownContent.find(".mettWidget").removeClass("wait"));
                            } else {
                                // Load new favorites.
                                favoritesWidget.loadData();
                            }

                            // Hide all other drop downs.
                            $("#mainMenu a.arrow").removeClass("icon-up-open-big").addClass("icon-down-open-big");
                            $(".dropDown").removeClass("show");
                            $(".shortcut").removeClass("active");

                            // Show drop down.
                            shortcut.addClass("active").attr("aria-expanded", "true");
                            dropDownContent.addClass("show").removeClass("hide");

                            allDescenants.off("blur").on("blur", function () {
                                setTimeout(function () {
                                    if (!$.contains(shortcut.parent()[0], $(":focus")[0])) {
                                        shortcut.trigger("click");
                                    }
                                }, 40);
                            });
                        } else {
                            // Hide.
                            shortcut.removeClass("active").attr("aria-expanded", "false");
                            dropDownContent.removeClass("show").addClass("hide");

                            // Reset.
                            allDescenants.off("blur");
                        }

                        return false;
                    });

                $.ajax({
                    url: "/api/notification/HasFavorites",
                    data: {
                        userID: settings.user.ID,
                        token: $("input[name='__RequestVerificationToken']").val(),
                    },
                }).done(function (data) {
                    if (data) {
                        // Show favorites.
                        container.find(".favorites").parent().removeClass("hide");
                    }
                });
            }
        }

        // Flags.
        if (options.showFlags && options.countryCodes != undefined) {
            var flagsDropdown = null;

            if (options.countryCodes.length > 2) {
                flagsDropdownContainer = $("<div />");
                flagsDropdownContainer.addClass("languagePicker dropDownMenu");
                flagsDropdown = $("<ul />");
                flagsDropdown.addClass("dropDown");
            }

            $.each(options.countryCodes, function (i, value) {
                var language, linkLabel;

                switch (value.toLowerCase()) {
                    case "nl":
                        language = "nederlands";
                        imgName = "dutch";
                        linkLabel = settings.various.dutchLangSwitchText;
                        break;

                    case "en":
                        language = "english";
                        imgName = "english";
                        linkLabel = settings.various.englishLangSwitchText;
                        break;

                    case "de":
                        language = "deutsch";
                        imgName = "german";
                        linkLabel = settings.various.germanLangSwitchText;
                        break;

                    case "ro":
                        language = "română";
                        imgName = "romanian";
                        linkLabel = settings.various.romanianLangSwitchText;
                        break;

                    case "pl":
                        language = "polski";
                        imgName = "polish";
                        linkLabel = settings.various.polishLangSwitchText;
                        break;

                    case "es":
                        language = "español";
                        imgName = "spanish";
                        linkLabel = settings.various.spanishLangSwitchText;
                        break;

                    case "bg":
                        language = "български";
                        imgName = "bulgarian";
                        linkLabel = settings.various.bulgarianLangSwitchText;
                        break;

                    case "cn":
                        language = "漢語";
                        imgName = "chinese";
                        linkLabel = settings.various.chineseLangSwitchText;
                        break;

                    case "ua":
                        language = "Українська";
                        imgName = "ukrainian";
                        linkLabel = settings.various.ukrainianLangSwitchText;
                        break;

                    case "ru":
                        language = "Русский";
                        imgName = "russian";
                        linkLabel = settings.various.russianLangSwitchText;
                        break;
                }

                if (container.find(".shortcut.flag." + language).length == 0) {
                    // Create flag.
                    var flagContainer = $("<li />"),
                        flagLink = $("<a />")
                            .attr("aria-label", linkLabel)
                            .prop("href", "#")
                            .addClass("shortcut flag " + language)
                            .html("<span>" + language + "</span>"),
                        flagImage = $("<img />")
                            .attr("alt", linkLabel)
                            .prop(
                                "src",
                                "/communities/common/themes/mett%20responsive/images/various/flag_" + imgName + ".png"
                            ),
                        flag = flagLink.prepend(flagImage);

                    if (options.languageRootPaths[i] != undefined) {
                        flagLink.prop("href", options.languageRootPaths[i]);

                        var lang = options.languageRootPaths[i].split("/")[1];

                        if (globals.url.indexOf("/" + lang + "/") > -1) flagContainer.addClass("active");
                    }

                    if ($("html").hasClass("mobile")) {
                        if ($("#top .shortcutsContainer").length === 0) {
                            var shortcutsContainer = $("<div />");
                            shortcutsContainer.addClass("shortcutsContainer");

                            $("#top").prepend(shortcutsContainer);
                        }
                    }

                    // Append flag.
                    if (options.countryCodes.length > 2) {
                        flagContainer.append(flag);

                        if (flagContainer.hasClass("active")) {
                            flagsDropdownContainer.prepend(flagContainer.clone());
                            flagsDropdownContainer.find("> li.active a").prop("href", "#");
                        }

                        flagsDropdown.append(flagContainer);
                    } else {
                        if ($("html").hasClass("mobile")) {
                            if ($(".shortcutsContainer .flagsWrapper").length === 0) {
                                var flagsWrapper = $("<div />");
                                flagsWrapper.addClass("flagsWrapper");
                                $(".shortcutsContainer").append(flagsWrapper);
                            }

                            $(".flagsWrapper").append(flagContainer.addClass("flag").append(flag));
                        } else {
                            if ($("#shortcuts").length > 0)
                                $("#shortcuts").append(flagContainer.addClass("flag").append(flag));
                        }
                    }

                    flagLink.off("click").on("click", function () {
                        if (settings.user.ID != -1) {
                            var flagLinkSpan = flagLink.find("span");

                            flagLink.addClass("loader");
                            flagLinkSpan.text(flagLinkSpan.text() + " " + settings.various.loadingText);
                            flagLink.trigger("blur");

                            $.ajax({
                                url: "/api/user/SetUserLanguage",
                                data: {
                                    countryCode: value,
                                    token: $("input[name='__RequestVerificationToken']").val(),
                                },
                            }).always(function (data) {
                                if (options.languageRootPaths[i] == undefined) {
                                    document.location.reload();
                                    return;
                                }

                                document.location.href = options.languageRootPaths[i];
                            });

                            return false;
                        }
                    });
                }
            });

            if (options.countryCodes.length > 2) {
                if (flagsDropdownContainer.find("> li.active").length === 0)
                    flagsDropdownContainer.append(flagsDropdown.find("li:eq(0)").clone().addClass("active"));

                flagsDropdownContainer.find("> li.active").append(flagsDropdown);

                if ($("html").hasClass("mobile")) $("#top .shortcutsContainer").append(flagsDropdownContainer);
                else {
                    if ($("#shortcuts").length > 0) $("#shortcuts").append(flagsDropdownContainer);
                }

                flagsDropdownContainer
                    .find("> li.active > a")
                    .off("click")
                    .on("click", function () {
                        var dropDownMenu = $(this).parent().find(".dropDown");

                        if (dropDownMenu.hasClass("show")) dropDownMenu.removeClass("show").removeAttr("aria-expanded");
                        else dropDownMenu.attr("aria-expanded", "true").addClass("show");

                        return false;
                    });
            }
        }

        // Cookie settings.
        container
            .find(".shortcut.cookieSettings")
            .off("click")
            .on("click", function () {
                $("#cookieSettingsOverlay").initializeCookieSettingsOverlay({ showOverlay: true });
            });
    }
};

// Initialize search.
$.fn.initializeSearch = function () {
    var container = $(this);

    if (container.find("input:text").length > 0) {
        // Skip link.
        $("#skipLinkSearchField").on("click", function () {
            container.find("input:text:last").trigger("focus");

            return false;
        });

        container.find("input:text").on("blur", function () {
            removeSearchInfoContainer();
        });

        container.find("input:text").on("input", function () {
            removeSearchInfoContainer();
        });

        container.each(function () {
            var searchField = $(this).find("input:text"),
                submitButton = $(this).find("a:first, input:submit, input:button");

            // Submit button.
            if (!submitButton.parent().hasClass("button")) {
                submitButton.addClass("icon-search before");
                submitButton.attr("role", "button");

                if (submitButton.closest("#mobileSlideOut").length) {
                    var screenReaderLabel = $("<div />");
                    screenReaderLabel.addClass("screenReaderContent").text(settings.fields.searchFieldText);
                    submitButton.append(screenReaderLabel);
                }
            }

            if (container.parents("#top").length > 0) {
                submitButton.off("click").on("click", function () {
                    createSearchInfoContainer($("#top .field.search > input"));

                    var searchInfoContainer = $("#top .field.search .searchInfoContainer"),
                        searchInfoContainerText =
                            '<span class="searchInfoText">' +
                            settings.liveSearch.minimumSearchLengthText.replace(
                                "{0}",
                                settings.liveSearch.minimumSearchLength
                            ) +
                            "</span>";

                    if (
                        (trim(searchField.val()) == settings.fields.searchFieldText ||
                            trim(searchField.val()).length < 3) &&
                        !searchField.is("#users .search input")
                    ) {
                        searchInfoContainer.parent().css("overflow", "visible");
                        searchInfoContainer.stop().css({ opacity: 1, left: 0 });
                        searchInfoContainer.find(".closeButton").attr("tabindex", 0);

                        if (searchInfoContainer.find(".searchInfoText").length === 0)
                            searchInfoContainer.prepend(searchInfoContainerText);

                        return false;
                    } else {
                        searchField.showSearchAnim();

                        var encodedInput = encodeURIComponent(searchField.val());
                        document.location.href = "/shortcuts/search_search.aspx?search=" + encodedInput;

                        removeSearchInfoContainer();
                    }
                });
            } else {
                var clearButton = container.find(".clear-search-button");
                var sectionSearchText = settings.fields.sectionSearchFieldText;

                clearButton.attr("aria-label", clearButton.attr("title"));

                if (searchField.val() === "") {
                    // Reset.
                    searchField.removeClass("searched");
                    $(".sectionContent").removeClass("searchResults");

                    $(".searchterm").text("").addClass("hide");
                    clearButton.addClass("hide");
                    $(".totalRecords").removeClass("hide");
                } else {
                    if ($(".sectionContent .items").length > 0 && $(".noSearchResults").length === 0) {
                        $(".totalRecords").addClass("hide");
                        $(".searchterm").removeClass("hide");
                        $(".sectionContent").addClass("searchResults");
                    }
                    clearButton.removeClass("hide");
                }

                if (container.parent().data("search-type") != undefined) {
                    //sectionSearchText = sectionSearchText.replace("{0}", container.parent().data("search-type"));
                }

                sectionSearchText = sectionSearchText.replace("{0}", settings.fields.sectionSearchFieldItem);

                searchField.attr("title", sectionSearchText).attr("aria-label", sectionSearchText);
                container.find("label").text(sectionSearchText);

                submitButton.off("click").on("click", function () {
                    createSearchInfoContainer($(".sectionOptions .search > input"));
                    var searchInfoContainer = $(".sectionOptions .search .searchInfoContainer"),
                        searchInfoContainerText =
                            '<span class="searchInfoText">' +
                            settings.liveSearch.minimumSearchLengthText.replace(
                                "{0}",
                                settings.liveSearch.minimumSearchLength
                            ) +
                            "</span>";

                    if (
                        (searchField.val() == settings.fields.searchFieldText || searchField.val().length < 3) &&
                        !searchField.is("#users .search input")
                    ) {
                        searchInfoContainer.parent().css("overflow", "visible");
                        searchInfoContainer.stop().css({ opacity: 1, left: 0 });
                        searchInfoContainer.find(".closeButton").attr("tabindex", 0);

                        if (searchInfoContainer.find(".searchInfoText").length === 0)
                            searchInfoContainer.prepend(searchInfoContainerText);

                        return false;
                    } else {
                        searchField.showSearchAnim();

                        removeSearchInfoContainer();
                    }
                });

                searchField.on("input", function (e) {
                    if (e.target.value && !searchField.hasClass("touched")) searchField.addClass("touched");
                    else if (!e.target.value && searchField.hasClass("touched")) searchField.removeClass("touched");
                });

                clearButton.off("click").on("click", function () {
                    searchField.val("");
                    searchField.trigger("focus");

                    submitButton.trigger("click");
                    submitButton.parent().addClass("hide");

                    removeSearchInfoContainer();
                });
            }

            // Enter action.
            searchField.submitOnEnter();
        });
    } else $("#skipLinkSearchField").remove();
};

// Initialize login.
$.fn.initializeLogin = function () {
    var container = $(this);

    if (container.length > 0) {
        // Focus on email field or SSO button.
        setTimeout(function () {
            if (container.find(".ssologin").length > 0) {
                container.find(".ssologin input:button").trigger("focus");
            } else {
                container.find(".email input:text").trigger("focus");
            }
        }, 500);

        container.find(".email input:text").on("blur", function () {
            if ($(this).val().length > 0 && $(this).val().toLowerCase().indexOf("@mett.nl") > -1)
                container.find(".staySignedIn").addClass("hide");
            else container.find(".staySignedIn").removeClass("hide");
        });

        // Added on submit check because pass management tool will reset the checkboxes sometimes
        container.parents("form").submit(function () {
            if (container.find(".email input:text").val().toLowerCase().indexOf("@mett.nl") > -1)
                container.find(".staySignedIn input:checkbox").prop("checked", false).initializeSwitchery();
        });

        container.find(".password input:password").submitOnEnter();
    }
};

// Initialize errors.
$.fn.initializeErrors = function () {
    var errors = $(this);

    // Prevent flickering empty error message with Web guidelines enabled.
    $(".errorMessage").css("visibility", "visible");

    errors.each(function () {
        var error = $(this),
            errorField = error.parents(".field"),
            showError = false,
            describedInputs = errorField.find("[aria-describedby]:not(.described)");

        if (errorField.length > 0) {
            describedInputs.each(function () {
                var currentDescribedInput = $(this);
                var targetInput = currentDescribedInput;

                if (currentDescribedInput.is("span")) targetInput = currentDescribedInput.find("input:first");

                targetInput.data("describedby", currentDescribedInput.attr("aria-describedby"));
                targetInput.addClass("described");

                currentDescribedInput.removeAttr("aria-describedby");
            });

            // Date/time select & captcha error.
            if (!error.hasClass("date") && (errorField.hasClass("dateSelect") || errorField.hasClass("dateTimeSelect")))
                showError = true;

            // Add comment error.
            if (errorField.parent(".commentField").length > 0 && typeof error.attr("style") == "undefined")
                showError = true;

            // Other errors.
            if (
                typeof error.attr("style") != "undefined" &&
                error.attr("style").length > 0 &&
                (error.attr("style").indexOf("visible") > -1 ||
                    error.attr("style").indexOf("block") > -1 ||
                    error.attr("style").indexOf("inline") > -1)
            )
                showError = true;

            // Show error.
            if (showError) {
                var inputsToDescribe = errorField.find(".described");

                errorField.addClass("danger");
                errorField.find("input, textarea, select").attr("aria-invalid", "true");

                inputsToDescribe.each(function () {
                    var currentInputToDescribe = $(this),
                        errorLabelIds = currentInputToDescribe.data("describedby").split(" "),
                        describedByValue = "";

                    for (i = 0; i < errorLabelIds.length; i++) {
                        if ($("#" + errorLabelIds[i]).css("visibility") == "visible") {
                            describedByValue += " " + errorLabelIds[i];
                        }
                    }

                    currentInputToDescribe.attr("aria-describedby", trim(describedByValue));
                });

                errorField.find("input:text, input:password, textarea").on("keydown", function () {
                    inputsToDescribe.removeAttr("aria-describedby");
                    errorField.removeClass("danger");
                    errorField.find("input:text, input:password, textarea").removeAttr("aria-invalid");
                });

                errorField.find("select").on("change", function () {
                    inputsToDescribe.removeAttr("aria-describedby");
                    errorField.removeClass("danger");
                    errorField.find("select").removeAttr("aria-invalid");
                });
            }
        }
    });
};

// Initialize comments.
$.fn.initializeComments = function () {
    var container = $(this);

    if (container.length > 0) {
        if (typeof CKEDITOR !== "undefined") {
            CKEDITOR.on("instanceReady", function (evt) {
                $("#addComment .editor iframe").contents().find("body").text("");

                $("#addComment .editor label")
                    .off("click")
                    .on("click", function () {
                        for (instance in CKEDITOR.instances) {
                            var editor = CKEDITOR.instances[instance];
                            if (editor) editor.trigger("focus");
                        }
                    });
            });
        }

        if ($(".comment.edit").length > 0) {
            // Hide add comment when in comment edit mode.
            $("#addCommentContent").addClass("hide");
            $(".commentsSplitView").removeClass("hide");
            $("#commentsList").css("margin-top", 0);
        } else {
            // Show add comment after comment edit mode.
            $("#addCommentContent").removeClass("hide");

            var commentAuthorField = container.find(".commentAuthor input");

            // Author.
            if (commentAuthorField.length > 0 && $(".captcha.danger").length == 0) {
                commentAuthorField.val("");

                $("#addCommentContent .commentFieldEditor label").removeClass("hide");
            }

            // Split view (yes/no voting comments).
            if ($(".commentsSplitView").length > 0) {
                var voteCommentFieldsWrapper = $("<div />").addClass("field splitComments"),
                    voteYesCommentField = $("<div />").addClass("voteYesCommentField"),
                    voteNoCommentField = $("<div />").addClass("voteNoCommentField"),
                    voteCommentTextareaLabel = $(
                        '<strong class="voteYesCommentLabel">' + settings.fields.voteYesFieldText + "</strong>"
                    ),
                    voteCommentTextarea = $("<textarea />")
                        .attr("id", "voteYesComment")
                        .addClass("voteYesComment")
                        .attr("disabled", "disabled"),
                    voteCommentButton = $("<div />")
                        .addClass("button voteYesCommentButton info icon-comment disabled before")
                        .attr("aria-disabled", true),
                    voteCommentButtonInput = $("<input />")
                        .attr("type", "button")
                        .val(settings.buttons.addCommentText)
                        .prop("disabled", "disabled");

                // Hide default textarea and submit button.
                container
                    .find(".commentFieldEditor .field:not(.splitComments, .captcha), .commentFieldEditor #saveComment")
                    .addClass("hide");

                // Append fields.
                voteCommentButton.append(voteCommentButtonInput);
                voteCommentFieldsWrapper.append(voteYesCommentField);
                voteCommentFieldsWrapper.append(voteNoCommentField);
                voteYesCommentField.append(voteCommentTextareaLabel);
                voteYesCommentField.append(voteCommentTextarea);
                voteNoCommentField.append(
                    voteCommentTextareaLabel
                        .clone()
                        .removeClass("voteYesCommentLabel")
                        .addClass("voteNoCommentLabel")
                        .text(settings.fields.voteNoFieldText)
                );
                voteNoCommentField.append(
                    voteCommentTextarea
                        .clone()
                        .removeClass("voteYesComment")
                        .addClass("voteNoComment")
                        .attr("id", "voteNoComment")
                );
                container.find(".commentFieldEditor").prepend(voteCommentFieldsWrapper);
                container.find(".commentFieldEditor .toolbar").append(voteCommentButton);
                container
                    .find(".commentFieldEditor .toolbar")
                    .append(
                        voteCommentButton.clone().removeClass("voteYesCommentButton").addClass("voteNoCommentButton")
                    );

                setTimeout(function () {
                    CKEDITOR.replace("voteYesComment", {
                        customConfig: "/CKEditor/config_comments.js",
                    });

                    CKEDITOR.replace("voteNoComment", {
                        customConfig: "/CKEditor/config_comments.js",
                    });
                }, 250);

                // Mobile "no-split-view".
                if ($.fn.viewport().width < 480) {
                    // Small "hacks" to create acceptable mobile view.
                    $(".commentsSplitView").addClass("mobileNoSplitView");

                    voteYesCommentField.append($(".voteYesCommentButton").css("margin", "20px 0 40px 0"));
                    voteNoCommentField.append($(".voteNoCommentButton").css("margin-top", "20px"));

                    var yesVoteCommentsTitle = $("<h2 />");
                    var noVoteCommentsTitle = $("<h2 />");

                    yesVoteCommentsTitle.html(settings.eparticipation.yesVoteCommentsText);
                    noVoteCommentsTitle.html(settings.eparticipation.noVoteCommentsText);

                    $(".comment[data-type=VoteYes]:first").prepend(yesVoteCommentsTitle);
                    $(".comment[data-type=VoteNo]:first").prepend(noVoteCommentsTitle);
                }

                // Place yes/no vote comment in default comment field.
                container
                    .find(".voteYesCommentButton, .voteNoCommentButton")
                    .off("click")
                    .on("click", function () {
                        var voteCommentText = CKEDITOR.instances["voteYesComment"].getData(),
                            voteCommentType = 1;

                        if ($(this).hasClass("voteNoCommentButton")) {
                            (voteCommentText = CKEDITOR.instances["voteNoComment"].getData()), (voteCommentType = 2);
                        }

                        var targetEditor = container.find('div[id*="_ckeditor"]');

                        if (targetEditor.length > 0 && targetEditor.attr("id")) {
                            var editorName = targetEditor.attr("id").replace("cke_", "");

                            if (CKEDITOR.instances[editorName]) CKEDITOR.instances[editorName].setData(voteCommentText);
                        }

                        container.find(".commentType").val(voteCommentType);

                        $(this)
                            .addClass("disabled")
                            .attr("aria-disabled", true)
                            .find("input")
                            .prop("disabled", "disabled");
                        $(this).parent().addClass("disabled");

                        var loader = $("<div />");
                        loader.addClass("loader update");
                        loader.attr("role", "status");

                        loader.insertAfter($(this)).addClass("show");

                        setTimeout(function () {
                            container.find("#saveComment input:submit").trigger("click");
                        }, 200);
                    });

                // Show split fields.
                $(".commentsSplitView").removeClass("hide");
            }

            // Save comment (without files).
            container
                .find(".button.saveWithoutHandler input:submit")
                .off("click")
                .on("click", function () {
                    var authorNameIsValid = true;

                    // Check if author name field is present
                    if ($(".commentAuthor input").length > 0) {
                        var authorName = $(".commentAuthor input").val();

                        var regEx =
                            /<script[\s\S]*?>[\s\S]*?<\/script>|<\/script>|\/\/--|String.fromCharCode([\s\S]*?)|onload=|onerror=/gi;

                        authorNameIsValid = authorName.match(regEx) == null;
                    }

                    if (!authorNameIsValid || $.fn.CKEditorContainsXSSVulnerability()) {
                        // Error.
                        $.fn.showError(settings.errors.pageSaveErrorText + " (500.7)");

                        return false;
                    } else {
                        var errors = [];

                        if ($("#addComment .editor iframe").contents().find("body").text() == "")
                            errors.push(settings.errors.noCommentText + " (500.24)");

                        if (!$.fn.mettHCaptchaIsValid())
                            errors.push(settings.errors.invalidHCaptchaText + " (500.106)");

                        if (errors.length > 0) {
                            $.fn.showError(errors.join("<br />"));

                            return false;
                        }
                    }

                    $(this).addClass("disabled").attr("aria-disabled", true).find("input").prop("disabled", "disabled");
                    $(this).parent().addClass("disabled");

                    var loader = $("<div />");
                    loader.addClass("loader update");
                    loader.attr("role", "status");
                    loader.insertBefore($(this).parent()).addClass("show");
                });

            // Comments.
            $(".comment").each(function () {
                var comment = $(this),
                    avatar = comment.find(".commentImage");

                // Avatars.
                if (avatar.find("img").length > 0) {
                    avatar.addClass("hasAvatar");
                    avatar.find(".noAvatar").addClass("hide");
                }
            });

            // Anonymous comment toggle.
            container
                .find(".toggleAnonymousComment input:checkbox")
                .off("change")
                .on("change", function () {
                    if (container.find(".button.showMore").length > 0) {
                        if ($(this).is(":checked")) {
                            // Hide file upload (no anonymous upload allowed).
                            container.find(".button.showMore, .more").addClass("hide");

                            // Skip handler and do old school submit.
                            container.find(".button.save input:button").remove();
                            container.find(".button.save input:submit").removeClass("hide");
                        } else {
                            // Reset.
                            container.find(".button.save input:submit").removeClass("submitButton");
                            container.find(".button.showMore, .more").removeClass("hide");

                            // Re-init save with handler.
                            container.find(".button.save").initializeSave();
                        }
                    }

                    if ($(this).is(":checked"))
                        container.find(".commentAuthorCurrent .strong").text(settings.fields.commentNameText);
                    else container.find(".commentAuthorCurrent .strong").text(settings.user.fullName);

                    // Toggle current username, name/email container.
                    container.find(".containerToggle input:checkbox").trigger("change");
                });

            // Alternative name.
            container
                .find(".commentAuthor input:text")
                .off("blur")
                .on("blur", function () {
                    if (trim($(this).val()) != "") {
                        container.find(".commentAuthorCurrent .strong").text(trim($(this).val()));
                    } else {
                        container.find(".commentAuthorCurrent .strong").text(settings.fields.commentNameText);
                    }
                });

            // Init.
            container.find(".toggleAnonymousComment input:checkbox").prop("checked", false);
            container.find(".commentAuthorCurrent .strong").text(settings.user.fullName);
        }
    }
};

// Initialize save.
$.fn.initializeSave = function () {
    var container = $(this);

    container.each(function () {
        var button = $(this),
            validationGroup = "",
            handler = "",
            pluploadSubmit = false,
            pluploadRequired = false;

        // Validation group.
        if (button.data("save-validationgroup") != undefined) validationGroup = button.data("save-validationgroup");

        // Handler.
        if (button.data("save-handler") != undefined) handler = button.data("save-handler");

        // Plupload.
        if (button.data("save-plupload-submit") != undefined) pluploadSubmit = button.data("save-plupload-submit");

        if (button.data("save-plupload-required") != undefined)
            pluploadRequired = button.data("save-plupload-required");

        // Handler or Plupload.
        if (button.find(".submitButton").length == 0) {
            if (handler != "" || (pluploadSubmit && $(".uploader").length > 0)) {
                // Add dummy submit button when using handler or Plupload.
                var submitButton = $('<input type="button" />');

                if (button.find("input").length > 0) {
                    button.find("input:last").addClass("submitButton hide");
                    submitButton.val(button.find("input:last").val());
                } else {
                    button.find("a:last").addClass("submitButton hide");
                    submitButton.val(button.find("a:last").html());
                }

                button.prepend(submitButton);
            }
        }

        // Unbind previous clicks (only for buttons generated by initializeSave function).
        if (button.find("input:first, a:first").prop("onclick") == null)
            button.find("input:first, a:first").off("click");

        // Save button.
        var saveInput = button.find("input:first, a:first");

        saveInput.on("click", function () {
            if ($.fn.CKEditorContainsXSSVulnerability()) {
                // Error.
                $.fn.showError(settings.errors.pageSaveErrorText + " (500.7)");

                return false;
            } else {
                // Save.
                $(this).save({
                    validationGroup: validationGroup,
                    handler: handler,
                    pluploadRequired: pluploadRequired,
                });
            }
        });
    });
};

// Initialize password checker.
$.fn.initializePasswordCheck = function () {
    var minimumLength = 8;

    $(this).each(function () {
        var passwordField = $(this),
            passwordInput = passwordField.find("input");

        if (passwordInput.parent().hasClass("passwordRequirements")) {
            var characterCountRequirement = $(".characterRule"),
                capitalCountRequirement = $(".capitalRule"),
                numberCountRequirement = $(".numberRule"),
                specialCharacterRequirement = $(".specialCharacterRule");

            passwordInput.on("keyup", function (event) {
                var password = $(this).val(),
                    strength = getPasswordStrength(password, minimumLength),
                    charactersLeft = password.length > minimumLength ? 0 : minimumLength - password.length;

                // Reset (unless <tab> is pressed)
                if (event.which != 9) {
                    characterCountRequirement
                        .removeClass("danger success icon-check")
                        .addClass("icon-awesome-circle-thin");
                    capitalCountRequirement
                        .removeClass("danger success icon-check")
                        .addClass("icon-awesome-circle-thin");
                    numberCountRequirement
                        .removeClass("danger success icon-check")
                        .addClass("icon-awesome-circle-thin");
                    specialCharacterRequirement
                        .removeClass("danger success icon-check")
                        .addClass("icon-awesome-circle-thin");
                    passwordField.removeClass("danger success");
                    passwordInput.removeAttr("aria-invalid");
                }

                // Requirements feedback.
                if (password.length > 0) {
                    // Minimum length.
                    if (strength.hasMinimumLength)
                        characterCountRequirement
                            .addClass("success icon-check")
                            .removeClass("icon-awesome-circle-thin");

                    // Contains capital.
                    if (strength.hasCapital)
                        capitalCountRequirement.addClass("success icon-check").removeClass("icon-awesome-circle-thin");

                    // Contains number.
                    if (strength.hasNumber)
                        numberCountRequirement.addClass("success icon-check").removeClass("icon-awesome-circle-thin");

                    // Contains special caracter.
                    if (strength.hasSpecialCharacter)
                        specialCharacterRequirement
                            .addClass("success icon-check")
                            .removeClass("icon-awesome-circle-thin");
                }

                // Length feedback.
                passwordField.find(".passwordCharacters").html(charactersLeft);
                passwordField.find(".charactersLeft").removeClass("hide");
            });

            passwordInput.on("blur", function () {
                var password = $(this).val(),
                    strength = getPasswordStrength(password, minimumLength),
                    passwordOk = true;

                if (passwordInput.hasClass("cancelBlur")) {
                    passwordInput.removeClass("cancelBlur");

                    return;
                }

                // Requirements feedback.
                if (password.length > 0) {
                    // Minimum length.
                    if (!strength.hasMinimumLength) {
                        characterCountRequirement.addClass("danger icon");
                        passwordOk = false;
                    }

                    // Contains capital.
                    if (!strength.hasCapital) {
                        capitalCountRequirement.addClass("danger");
                        passwordOk = false;
                    }

                    // Contains number.
                    if (!strength.hasNumber) {
                        numberCountRequirement.addClass("danger");
                        passwordOk = false;
                    }

                    // Contains special caracter.
                    if (!strength.hasSpecialCharacter) {
                        specialCharacterRequirement.addClass("danger");
                        passwordOk = false;
                    }
                }

                // Password not strong enough.
                if (!passwordOk) {
                    // Crappy Firefox needs a timeout...
                    setTimeout(function () {
                        passwordInput.trigger("focus");
                    }, 0);

                    passwordInput.parent().addClass("danger");
                    passwordInput.attr("aria-invalid", "true");
                }
            });
        }

        passwordField.initializePasswordVisibilityToggle();
    });

    function getPasswordStrength(password, minimumLength) {
        var strength = {};
        strength.score = 0;
        strength.hasMinimumLength = false;
        strength.hasCapital = false;
        strength.hasNumber = false;
        strength.hasSpecialCharacter = false;

        // Password length > minimum length = strength +1.
        if (password.length < minimumLength) strength.score += password.length / minimumLength;
        else {
            strength.score += 1;
            strength.hasMinimumLength = true;
        }

        // Password contains uppercase character.
        if (password.match(/([A-Z])/)) strength.hasCapital = true;

        // Password contains uppercase + lowercase characters = strength + 1.
        if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)) strength.score += 1;

        // Password contains number.
        if (password.match(/([0-9])/)) strength.hasNumber = true;

        // Password contains numbers and characters = strength + 1.
        if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/)) strength.score += 1;

        // Password contains special character (excluding spaces) = strength + 1.
        if (password.match(/[\W_]/)) {
            strength.score += 1;
            strength.hasSpecialCharacter = true;
        }

        // Password contains 2 special characters (excluding spaces) = strength + 1.
        if (password.match(/[\W_].*[\W_]/)) strength.score += 1;

        return strength;
    }
};

// Initialize custom containers.
$.fn.initializeCustomContainers = function () {
    var containerToggles = $(this);

    // Container toggler.
    containerToggles.each(function () {
        var toggler = $(this),
            toggleContainerItems = toggler.data("toggle-children");

        if (!toggler.is("input:checkbox")) {
            // Control with span as parent.
            toggler = $(this).find("input:checkbox:first");
            toggleContainerItems = $(this).data("toggle-children");
        }

        var toggleParent = toggler.parents(".field"),
            container = toggleParent.next(".container");

        if (container.length == 0) {
            // Fallback.
            container = toggleParent.parent().next(".container");
        }

        // Initial state.
        if (toggler.is(":checked")) {
            if (container.data("show-when-checked") != undefined && container.data("show-when-checked"))
                container.removeClass("hide");
            else container.addClass("hide");
        }

        // Toggle.
        toggler.on("change", function () {
            // Toggle children in container (optional).
            if (toggleContainerItems != undefined) {
                var checkboxes = container.find("input:checkbox");
                checkboxes.prop("checked", toggler.is(":checked"));

                // Switchery toggles.
                if (container.find(".switchery").length > 0) {
                    // Destroy toggles.
                    container.find(".switchery").remove();

                    // Re-create toggles.
                    checkboxes.initializeSwitchery();
                }
            }

            // Toggle container.
            container.fadeIn().toggleClass("hide");

            if (toggler.parent().hasClass("toggleMap") && toggler.is(":checked")) {
                // Re-initialize maps (solves hidden container problems).
                if (typeof initializeGoogleMaps == "function") initializeGoogleMaps();

                if (typeof initializeAtriumMaps == "function") {
                    setTimeout(function () {
                        initializeAtriumMaps();
                    }, 1000);
                }
            }
        });
    });

    // Check if there are containers to show.
    $(".showIfNotEmpty").each(function () {
        if (trim($(this).html()).length > 0) $(this).removeClass("hide");
    });
};

// Initialize RoyalSlider.
$.fn.initializeRoyalSlider = function () {
    var container = $(this),
        viewport = $.fn.viewport();

    if (container.find("img").length > 0) {
        if ($(".touch").length == 0 && container.find(".imageHeight:first").length > 0) {
            var containerHeight = container.find(".imageHeight:first").val(),
                containerWidth = 0,
                aspectRatio = 1;

            if (container.find(".imageWidth:first").length > 0) {
                containerWidth = container.find(".imageWidth:first").val();
                aspectRatio = containerHeight / containerWidth;
            }

            if (container.parent().hasClass("smallSlider")) containerWidth = 1200;

            if (containerWidth > 0 && containerWidth > viewport.width) {
                containerHeight = Math.round(containerHeight / (containerWidth / viewport.width));
            } else containerHeight = Math.round(containerWidth * aspectRatio);

            // Set initial slider height (reset on window.load()).
            container.css("height", containerHeight + "px");
        }

        if (settings.colors.header != "") {
            var sliderTextOpacity = 0.7;

            if (settings.webGuidelines) sliderTextOpacity = 0.85;

            if ($("html").hasClass("threedotfive")) {
                container.find(".rsSlideContentWrapper").setColor({
                    color: settings.colors.header,
                    opacity: sliderTextOpacity,
                });
            } else {
                container.find(".rsSlideTitle, .rsSlideDescription").setColor({
                    color: settings.colors.header,
                    opacity: sliderTextOpacity,
                });
            }
        }

        if (settings.colors.header == "" && settings.webGuidelines) {
            if ($("html").hasClass("threedotfive")) {
                container.find(".rsSlideContentWrapper").setColor({
                    color: "#000",
                    opacity: 0.65,
                });
            } else {
                container.find(".rsSlideTitle, .rsSlideDescription").setColor({
                    color: "#000",
                    opacity: 0.65,
                });
            }
        }

        // Delays.
        container.find(".rsSlideTitle").attr("data-delay", settings.slider.titleDelay);
        container.find(".rsSlideDescription").attr("data-delay", settings.slider.descriptionDelay);

        // Initialize slider.
        container
            .royalSlider({
                imageScaleMode: "none",
                autoHeight: true,
                autoScaleSlider: false,
                imageAlignCenter: false,
                keyboardNavEnabled: settings.webGuidelines,
                loop: true,
                loopRewind: false,
                arrowsNav: false,
                imageScalePadding: 0,
                slidesSpacing: 0,
                autoPlay: {
                    enabled: !settings.webGuidelines,
                    stopAtAction: false,
                    pauseOnHover: true,
                    delay: settings.slider.slideDelay,
                },
            })
            .show();

        if (container.find(".rsBullet").length > 1 && $(".touch").length == 0) {
            container.find(".rsBullets").show().addClass("visible");
            container.find(".rsBullets").attr("role", "tablist");
            container.find(".rsSlide").attr("role", "tabpanel");

            container.find(".rsSlide").each(function (index) {
                var currentSlide = $(this);
                currentSlide.attr("id", "slide" + (index + 1));
            });
        }

        container.find(".rsBullet").each(function (index) {
            var currentBullet = $(this);
            var screenReaderContent = $("<div>");
            screenReaderContent.addClass("screenReaderContent");
            screenReaderContent.text(settings.slider.photoText + " " + (index + 1));

            currentBullet.attr("tabindex", 0);
            currentBullet.attr("role", "tab");
            currentBullet.attr("aria-controls", "slide" + (index + 1));
            currentBullet.attr("aria-selected", currentBullet.hasClass("rsNavSelected").toString());
            currentBullet.children("span").append(screenReaderContent);
            currentBullet.parent().attr("role", "tablist");

            currentBullet.on("keypress", function (e) {
                if (e.keyCode == 13) {
                    var slider = $(".royalSlider").data("royalSlider");
                    slider.goTo(index);
                }
            });
        });

        container.data("royalSlider").ev.on("rsAfterSlideChange", function (event) {
            container.find(".rsBullet").each(function (index) {
                var currentBullet = $(this);
                currentBullet.attr("aria-selected", currentBullet.hasClass("rsNavSelected").toString());
            });
        });

        $("html").addClass("hasSlider");
    }
};

// Initialize portalSelector.
$.fn.initializePortalSelector = function () {
    var portalSelector = $(this);

    portalSelector.off("change").on("change", function () {
        var theValue = trim(portalSelector.val());

        if (theValue != "")
            document.location.href = "http://" + theValue + "/shortcuts/users_login.aspx?norefferer=true";
    });
};

// Initialize path.
$.fn.initializePath = function () {
    var container = $(this);

    // Fixed path.
    $.fn.fixedPath();

    if (
        container.length > 0 &&
        (settings.section.isShortcut || settings.section.isCMSChild || $("#error404").length > 0)
    ) {
        // Hide path on shortcut page.
        container.find("span").addClass("hide");
    }
};

// Initialize Switchery toggles.
$.fn.initializeSwitchery = function () {
    // Don't enable Switchery with Web guidelines enabled.
    if (settings.webGuidelines || $("html").hasClass("threedotfive")) {
        return;
    }

    // Default values.
    var defaults = {
        onColor: "#64bd63",
        offColor: "#dfdfdf",
        togglerColor: "#ffffff",
        size: "default",
        speed: "0.2s",
        className: "switchery",
        disabled: false,
        disabledOpacity: 0.5,
    };

    var togglers = $(this);

    togglers.each(function () {
        var toggler = $(this),
            container = $(this).parent(),
            options = $.extend({}, defaults);

        // Destroy previous toggles.
        container.find(".switchery").remove();
        container.find("label").addClass("switcheryLabel");

        if (container.data("switchery-oncolor") != undefined) options.onColor = container.data("switchery-oncolor");

        if (container.data("switchery-offcolor") != undefined) options.offColor = container.data("switchery-offcolor");

        if (container.data("switchery-togglercolor") != undefined)
            options.togglerColor = container.data("switchery-togglercolor");

        if (container.data("switchery-size") != undefined) options.size = container.data("switchery-size");

        if (container.data("switchery-speed") != undefined) options.speed = container.data("switchery-speed");

        if (container.data("switchery-classname") != undefined)
            options.className = container.data("switchery-classname");

        if (container.data("switchery-disabled") != undefined) options.disabled = container.data("switchery-disabled");

        if (container.data("switchery-disabledopacity") != undefined)
            options.disabledOpacity = container.data("switchery-disabledopacity");

        // Create new switchery toggle.
        new Switchery(toggler[0], {
            color: options.onColor,
            secondaryColor: options.offColor,
            jackColor: options.togglerColor,
            size: options.size,
            speed: options.speed,
            className: options.className,
            disabled: options.disabled,
            disabledOpacity: options.disabledOpacity,
        });
    });

    // Make switchery keyboard accessible.
    $(".switchery").each(function () {
        var theObject = $(this),
            theLabel = theObject.nextAll("label:first");

        theObject.attr("tabindex", "0");

        // Place the label value as title attribute and content in switchery for screen readers.
        if (theLabel.length > 0 && theObject.find(".screenReaderContent").length == 0)
            theObject.append('<span class="screenReaderContent">' + theLabel.html() + "</span>");

        theObject.on("keydown", function (aEvent) {
            if (aEvent.keyCode == 13 || aEvent.keyCode == 32) {
                theObject.trigger("click");

                aEvent.preventDefault();
            }
        });
    });
};

// Initialize Powerange sliders.
$.fn.initializePowerange = function () {
    if (settings.webGuidelines) {
        // Don't enable Powerange with Web guidelines enabled.
        return;
    }

    // Default values.
    var defaults = {
        start: 0,
        minimum: 0,
        maximum: 100,
        step: null,
        className: "",
        text: "",
        decimals: false,
        hideRange: false,
        vertical: false,
        disabled: false,
        disabledOpacity: 0.5,
        multiplier: 1,
    };

    var containers = $(this);

    containers.each(function () {
        var container = $(this);

        // Destroy previous sliders.
        container.find(".range-bar, .range-value").remove();

        // Initialize.
        if (container.find("select").length > 0 && container.find("input").length == 0) {
            // Add select list compatibility to slider.
            var selectList = container.find("select:first");
            container.append('<input type="text" class="hide" />');
        }

        container.append('<span class="range-value"></span>');

        var inputField = container.find("input[type=text]:first"),
            valueField = container.find(".range-value"),
            options = $.extend({}, defaults);

        if (container.data("powerange-minimum") != undefined) options.minimum = container.data("powerange-minimum");

        if (container.data("powerange-maximum") != undefined) options.maximum = container.data("powerange-maximum");

        if (container.data("powerange-step") != undefined) options.step = container.data("powerange-step");

        if (container.data("powerange-classname") != undefined)
            options.className = container.data("powerange-classname");

        if (container.data("powerange-text") != undefined) options.text = container.data("powerange-text");

        if (container.data("powerange-decimals") != undefined) options.decimals = container.data("powerange-decimals");

        if (container.data("powerange-hiderange") != undefined)
            options.hideRange = container.data("powerange-hiderange");

        if (container.data("powerange-vertical") != undefined) options.vertical = container.data("powerange-vertical");

        if (container.data("powerange-disabled") != undefined) options.disabled = container.data("powerange-disabled");

        if (container.data("powerange-disabledopacity") != undefined)
            options.disabledOpacity = container.data("powerange-disabledopacity");

        if (container.data("powerange-multiplier") != undefined)
            options.multiplier = container.data("powerange-multiplier");

        if (selectList != undefined) {
            // Get value from select list.
            inputField.val(selectList.val() / options.multiplier);
        }

        // Set start value.
        options.start = inputField.val();

        // Fix bug in plugin (browser crashes when rendering slider in hidden tab or container).
        if (!inputField.parents(".tabContent").is(":visible")) {
            var hiddenTabContent = inputField.parents(".tabContent");
            hiddenTabContent.addClass("show invisible");
        }

        if (inputField.parents(".hide").length > 0) {
            var hiddenContainer = inputField.parents(".hide");
            hiddenContainer.addClass("invisible").removeClass("hide");
        }

        // Create new Powerange slider.
        var powerange = new Powerange(inputField[0], {
            start: options.start,
            min: options.minimum,
            max: options.maximum,
            step: options.step,
            klass: options.className,
            decimal: options.decimals,
            hideRange: options.hideRange,
            vertical: options.vertical,
            disable: options.disabled,
            disableOpacity: options.disabledOpacity,
            callback: function () {
                if (selectList != undefined) {
                    if (inputField.val() == "0") {
                        // Set first value in select list (0 or -1).
                        selectList.val(selectList.find("option:first").val());
                    } else {
                        // Set value in select list.
                        selectList.val(inputField.val() * options.multiplier);
                    }
                }

                // Show value.
                if (inputField.val() == "0") {
                    // Off.
                    valueField.html("");
                    container.find(".range-min").html(settings.various.offText);
                } else valueField.html(inputField.val() + options.text);
            },
        });

        // Store instance in data object.
        container.data("powerange", powerange);

        // Fix bug in plugin (browser crashes when rendering slider in hidden tab or container).
        if (hiddenTabContent != undefined) hiddenTabContent.removeClass("show invisible");

        if (hiddenContainer != undefined) hiddenContainer.addClass("hide").removeClass("invisible");

        // Keyboard handling
        container
            .find(".range-handle")
            .attr("tabindex", "0")
            .on("keydown", function (e) {
                if (e.keyCode == 37 || e.keyCode == 39) {
                    var currentValue = parseInt(container.find("input[type=text]").val());

                    if (e.keyCode == 39) {
                        var targetValue = currentValue + powerange.options.step;

                        if (targetValue <= powerange.options.max)
                            powerange.setStart(currentValue + powerange.options.step);
                    } else if (e.keyCode == 37) {
                        var targetValue = currentValue - powerange.options.step;

                        if (targetValue >= powerange.options.min)
                            powerange.setStart(currentValue - powerange.options.step);
                    }
                }
            });
    });
};

// Initialize range sliders.
$.fn.initializeRangeSlider = function () {
    $(this).each(function () {
        var slider = $(this).find(".range-slider__range"),
            valueLabel = $(this).find(".range-slider__value");

        slider.on("input change", function () {
            valueLabel.html($(this).val());
        });

        valueLabel.html(slider.val());
    });
};

// Initialize Plupload.
$.fn.initializePlupload = function () {
    var uploaders = $(this);

    if (uploaders.length == 0) return;

    if (
        typeof globals != "undefined" &&
        (typeof globals.pluploadFileCache == "undefined" || globals.pluploadFileCache == null)
    ) {
        globals.pluploadFileCache = {};
    }

    // Default values.
    var defaults = {
        url: "HandlerDownloadUploadDocument.ashx",
        runtimes: "html5",
        chunkSize: "1mb",
        maxFileSize: "2000mb",
        rename: false,
        dragDrop: true,
        multiSelect: true,
        imageCrop: false,
        imageWidth: settings.images.maxImageWidth,
        imageHeight: settings.images.maxImageHeight,
        allowedExtensions: "",
    };

    var options = $.extend(defaults, options),
        isMobile = $(".touch").length > 0,
        oldIE =
            typeof bowser !== "undefined" &&
            bowser != null &&
            bowser.name == "Internet Explorer" &&
            bowser.version < 10;

    // Get allowed extensions.
    $.ajax({
        url: "/api/Documents/GetAllowedExtensions",
        data: {
            token: $("input[name='__RequestVerificationToken']").val(),
        },
    })
        .done(function (data) {
            options.allowedExtensions = JSON.parse(data);

            // Continue with init.
            initUploaders();
        })
        .fail(function () {
            $.fn.showError(settings.errors.noAllowedFileExtensions + " (500.104)");
        });

    function initUploaders() {
        uploaders.each(function (i) {
            // Instance options.
            var uploader = $(this);
            var uploaderID = null;
            var container = uploader.parents(".upload");
            var tabID =
                uploader.parents(".tabContent").length > 0
                    ? uploader.parents(".tabContent").attr("id").replace("Content", "")
                    : "";
            var uploaderFileType =
                uploader.data("plupload-file-type") != undefined ? uploader.data("plupload-file-type") : "files";
            var uploaderButtonText =
                uploader.data("plupload-button-text") != undefined
                    ? uploader.data("plupload-button-text")
                    : settings.buttons.addFilesText;
            var uploaderSubmitButton =
                uploader.data("plupload-submitbutton-id") != undefined
                    ? $("#" + uploader.data("plupload-submitbutton-id") + " .submitButton")
                    : $(".save .submitButton");
            var uploaderPageType =
                uploader.data("plupload-page-type") != undefined ? uploader.data("plupload-page-type") : 0;
            var uploaderExtensionTypes =
                uploader.data("plupload-extension-types") != undefined ? uploader.data("plupload-extension-types") : "";

            // Deny all extensions by default.
            var uploaderExtensions = "";

            if (uploaderExtensionTypes != "" && options.allowedExtensions != "") {
                var extensionTypes = uploaderExtensionTypes.split(",");

                for (var j = 0; j < extensionTypes.length; j++) {
                    switch (trim(extensionTypes[j]).toLowerCase()) {
                        case "document":
                            uploaderExtensions += "," + options.allowedExtensions.document;
                            break;

                        case "image":
                            uploaderExtensions += "," + options.allowedExtensions.image;
                            break;

                        case "video":
                            uploaderExtensions += "," + options.allowedExtensions.video;
                            break;

                        case "audio":
                            uploaderExtensions += "," + options.allowedExtensions.audio;
                            break;

                        case "maplayer":
                            uploaderExtensions += "," + options.allowedExtensions.maplayer;
                            break;

                        case "image:png":
                            uploaderExtensions += ",png";
                            break;
                    }
                }
            }

            if (uploader.hasClass("single")) options.multiSelect = false;

            if (uploader.data("plupload-image-crop") != undefined && uploader.data("plupload-image-crop"))
                options.imageCrop = true;

            if (uploader.data("plupload-image-width") != undefined)
                options.imageWidth = uploader.data("plupload-image-width");

            if (uploader.data("plupload-image-height") != undefined)
                options.imageHeight = uploader.data("plupload-image-height");

            if (uploader.data("plupload-image-resize") != undefined && !uploader.data("plupload-image-resize")) {
                options.imageWidth = 6500;
                options.imageHeight = 6500;
            }

            // Mobile.
            if (isMobile) options.dragDrop = false;

            // Create new Plupload component.
            uploader
                .pluploadQueue({
                    url: options.url,
                    flash_swf_url: options.flashUrl,
                    silverlight_xap_url: options.silverlightUrl,
                    chunk_size: options.chunkSize,
                    rename: options.rename,
                    dragdrop: options.dragDrop,
                    multi_selection: options.multiSelect,
                    filters: {
                        max_file_size: options.maxFileSize,
                        mime_types: [{ title: "File types", extensions: uploaderExtensions.substring(1) }],
                    },
                    resize:
                        uploader.data("plupload-image-resize") === false
                            ? undefined
                            : {
                                  crop: options.imageCrop,
                                  width: options.imageWidth,
                                  height: options.imageHeight,
                                  quality: 100,
                              },
                    preinit: {
                        Init: function (up, info) {
                            // Check if user is logged in.
                            if (settings.user.userName == "")
                                uploader.html(
                                    '<div class="warningMessage">' + settings.warnings.pluploadNotAllowedText + "</div>"
                                );

                            uploader.find("input:file").attr("title", settings.buttons.uploadFilesText);
                            uploaderID = uploader.attr("id");

                            // Add cached files after re-initialize.
                            if (typeof uploaderID != "undefined" && uploaderID != null && uploaderID != "") {
                                var uploaderFilesCache = globals.pluploadFileCache[uploaderID];

                                // Check if uploaderFilesCache exists.
                                if (typeof uploaderFilesCache != "undefined" && uploaderFilesCache != null)
                                    up.addFile(uploaderFilesCache);
                            }
                        },

                        UploadFile: function (up, file) {
                            up.settings.multipart_params = {
                                idcontentpage:
                                    container.find(".itemID").length > 0 ? container.find(".itemID").val() : -1,
                                selectedsections:
                                    container.find(".sectionIDs").length > 0
                                        ? container.find(".sectionIDs").val()
                                        : $(".multiSelectDestinationIDs").val(),
                                uniqueBatchID:
                                    container.find(".batchID").length > 0 ? container.find(".batchID").val() : -1,
                                batchUniqueID:
                                    container.find(".batchID").length > 0 ? container.find(".batchID").val() : -1,
                                commentID:
                                    container.find(".commentID").length > 0 ? container.find(".commentID").val() : -1,
                                extractZip:
                                    container.find(".extractZip").length > 0
                                        ? container.find(".extractZip").val()
                                        : "false",
                                filetype: uploaderFileType,
                                pageType: uploaderPageType,
                                uniqueID: $.fn.getUniqueID(),
                                token: $("input[name='__RequestVerificationToken']").val(),
                            };
                        },
                    },
                    init: {
                        BeforeUpload: function () {
                            // Disable overlay close button while uploading.
                            if (uploader.parents(".overlay").length > 0) {
                                uploader.parents(".overlay").find(".button.close").addClass("hide");
                                uploader.parents(".overlay").unbind("click");
                            }
                            // Show status.
                            $(
                                ".plupload_filelist .plupload_file_status, .plupload_filelist_footer .plupload_file_status"
                            ).css("visibility", "visible");
                        },
                        FilesAdded: function (up, files) {
                            var filesToRemove = [];
                            var showFileSizeWarning = false;
                            var showFileNameLengthWarning = false;
                            var showFileNameNumericWarning = false;

                            // Check if multiple files are uploaded in single upload or filename > 150 chars.
                            for (var i = 0; i < up.files.length; i++) {
                                var file = up.files[i];

                                if (uploader.hasClass("single") && i < files.length - 1) {
                                    filesToRemove.push(file);
                                }

                                if (file.size > 100000000) {
                                    showFileSizeWarning = true;
                                }

                                if (file.name.length > 150) {
                                    filesToRemove.push(file);
                                    showFileNameLengthWarning = true;
                                }

                                // Header images can't be numeric, because of profile image ID's... (yes really)
                                if (uploaderFileType == "headerImage" && isNumeric(file.name.split(".")[0])) {
                                    filesToRemove.push(file);
                                    showFileNameNumericWarning = true;
                                }

                                if (typeof PluploadAfterFilesAdded === "function") PluploadAfterFilesAdded();
                            }

                            for (var i = 0; i < filesToRemove.length; i++) {
                                // Remove files.
                                up.removeFile(filesToRemove[i]);
                            }

                            if (up.files.length > 0) {
                                // Remove click on drag & drop field.
                                uploader.find(".plupload_filelist").off("click").removeClass("pointer");

                                // Show add button.
                                if (!uploader.hasClass("single"))
                                    uploaderButtonText = settings.buttons.addMoreFilesText;

                                $(".plupload_buttons a").html(uploaderButtonText);

                                // Badge count.
                                if (tabID != "" && $("#" + tabID).find(".badge").length > 0) {
                                    var badgeCount;

                                    if (uploader.hasClass("single")) {
                                        if (
                                            up.files.length > 0 ||
                                            $("#" + tabID + "Content").find(".badgeCount").length > 0
                                        )
                                            badgeCount = "1";
                                    } else
                                        badgeCount =
                                            $("#" + tabID + "Content").find(".badgeCount").length + up.files.length;

                                    $("#" + tabID)
                                        .find(".badge")
                                        .html(badgeCount)
                                        .removeClass("hide");
                                }
                            }

                            // Add files to cache to keep files after AJAX (if uploader has an ID).
                            if (typeof uploaderID != "undefined" && uploaderID != null && uploaderID != "")
                                globals.pluploadFileCache[uploaderID] = up.files;

                            // Warnings.
                            if (showFileSizeWarning && !uploader.data("plupload-file-size-warning")) {
                                // Show warning only once per session.
                                uploader.data("plupload-file-size-warning", "true");

                                $.fn.alert(settings.warnings.fileSizeText);
                            }

                            if (showFileNameLengthWarning) {
                                $.fn.alert(settings.warnings.fileNameLengthText);
                            }

                            if (showFileNameNumericWarning) {
                                $.fn.alert(settings.warnings.fileNameNumericText);
                            }
                        },
                        FileFiltered: function (up, file) {
                            var removeFile = false;

                            // Check if filename has unwanted characters.
                            var regEx =
                                /<script[\s\S]*?>[\s\S]*?<\/script>|<\/script>|\/\/--|String.fromCharCode([\s\S]*?)|onload=/gi;

                            if (
                                file.name.match(regEx) != null ||
                                file.name.indexOf("<") > -1 ||
                                file.name.indexOf(">") > -1
                            ) {
                                // Remove file from que.
                                up.removeFile(file);
                                $.fn.alert(settings.warnings.fileNameText);
                            }
                        },
                        FileUploaded: function (up, file, result) {
                            var uploadResult = result.response;

                            // Check if response is JSON.
                            try {
                                uploadResult = JSON.parse(result.response);
                            } catch (e) {
                                $.fn.showError(settings.errors.generalErrorText + " (500.105)");

                                return;
                            }

                            // Check if upload status response exists.
                            if (uploadResult.status == undefined) {
                                $.fn.showError(settings.errors.generalErrorText + " (500.106)");

                                return;
                            }

                            if (uploadResult.status.toLowerCase() === "error") {
                                $.fn.showError(uploadResult.message + " (500.107)");

                                return;
                            }

                            // Check if upload is OK.
                            if (uploadResult.status.toLowerCase() != "upload ok!") {
                                $.fn.showError(settings.errors.generalErrorText + " " + result.response + " (500.89)");

                                return;
                            }

                            // ContentPageID.
                            if (
                                container.find(".itemID").length > 0 &&
                                container.find(".itemID").val() == "" &&
                                uploadResult.contentPageID != 0
                            ) {
                                container.find(".itemID").val(uploadResult.contentPageID);
                            }

                            // File name.
                            if (container.find(".pluploadFileName").length > 0 && uploadResult.fileName != null) {
                                container.find(".pluploadFileName").val(uploadResult.fileName);
                            }

                            // File ID.
                            if (container.find(".pluploadFileIDs").length > 0 && uploadResult.fileId != null) {
                                if (container.find(".pluploadFileIDs").val() != "" && !uploader.hasClass("single")) {
                                    container
                                        .find(".pluploadFileIDs")
                                        .val(container.find(".pluploadFileIDs").val() + ";" + uploadResult.fileId);
                                } else {
                                    container.find(".pluploadFileIDs").val(uploadResult.fileId);
                                }
                            }

                            if (uploader.pluploadQueue().total.uploaded == uploader.pluploadQueue().files.length) {
                                var allDone = true;

                                // Add a class when all uploads for an instance are done.
                                uploader.addClass("done");

                                // Check if all uploaders are done.
                                $(".uploader").each(function () {
                                    if (!$(this).hasClass("done")) {
                                        allDone = false;

                                        return false;
                                    }
                                });

                                if (allDone) {
                                    // Return to save() function.
                                    uploaderSubmitButton.save({ afterUpload: true });
                                }
                            }
                        },
                        FilesRemoved: function (up, files) {
                            if (up.files.length == 0 && !isMobile && !oldIE) {
                                // Re-add click to open file select dialog on drag & drop field.
                                uploader
                                    .find(".plupload_filelist")
                                    .off("click")
                                    .on("click", function () {
                                        uploader.find(".plupload_add")[0].click();
                                    })
                                    .addClass("pointer");
                            }

                            // Add files to cache to keep files after AJAX (if uploader has an ID).
                            if (typeof uploaderID != "undefined" && uploaderID != null && uploaderID != "")
                                globals.pluploadFileCache[uploaderID] = up.files;

                            // Badge count.
                            if (tabID != "" && $("#" + tabID).find(".badge").length > 0) {
                                if (uploader.hasClass("single")) {
                                    if (
                                        up.files.length > 0 ||
                                        $("#" + tabID + "Content").find(".badgeCount").length > 0
                                    )
                                        $("#" + tabID)
                                            .find(".badge")
                                            .html("1")
                                            .removeClass("hide");
                                    else
                                        $("#" + tabID)
                                            .find(".badge")
                                            .html("0")
                                            .addClass("hide");
                                } else
                                    $("#" + tabID)
                                        .find(".badge")
                                        .html($("#" + tabID + "Content").find(".badgeCount").length + up.files.length)
                                        .removeClass("hide");

                                if (
                                    parseInt(
                                        $("#" + tabID)
                                            .find(".badge")
                                            .html()
                                    ) == 0
                                )
                                    $("#" + tabID)
                                        .find(".badge")
                                        .addClass("hide");
                            }
                        },
                    },
                })
                .find(".plupload_buttons")
                .addClass("button add confirm icon-plus before")
                .find("a")
                .html(uploaderButtonText);

            // Click on drag & drop field to open file select dialog.
            if (!isMobile && !oldIE) {
                uploader
                    .find(".plupload_filelist")
                    .off("click")
                    .on("click", function () {
                        uploader.find(".plupload_add")[0].click();
                    })
                    .addClass("pointer");
            }
        });
    }
};

// Initialize overlays.
$.fn.initializeOverlays = function () {
    // Reset.
    $("body").removeClass("overlayOpen");

    $(this).each(function () {
        var overlay = $(this);

        if (!overlay.hasClass("hide") && !overlay.is(":hidden")) {
            $.fn.saveLastFocus();

            // Disable scrolling.
            $("html, body").scrollTop(0);
            $("body").addClass("overlayOpen");

            // Keep tabs in overlay.
            overlay.tabGuard();

            // Focus on overlay.
            setTimeout(function () {
                if (overlay.find("input:text").length > 0) {
                    overlay.find("input:text:first").trigger("focus").trigger("select");
                } else {
                    overlay.find(".overlayItemTitle").attr("tabindex", "-1").trigger("focus");
                }
            }, 200);
        }

        // Multiple close buttons in 1 overlay, because, why not?
        overlay.find(".button.close").each(function () {
            var closeButton = $(this);

            if (closeButton.find("a").length > 0) {
                closeButton = closeButton.find("a");
            }

            if (closeButton.find("input").length > 0) {
                closeButton = closeButton.find("input");
            }

            closeButton.off("click").on("click", function () {
                // Check if there are other modals active
                if ($(".overlay.active").length <= 1) {
                    // Re-enable scrolling.
                    $("body").removeClass("overlayOpen");
                }

                // Hide overlay.
                overlay.addClass("hide").removeClass("active");

                $.fn.restoreLastFocus();

                if (closeButton.is("A")) {
                    return false;
                }
            });

            overlay.find(".overlayItemContent").on("scroll", function () {
                if ($(".overlayItemContent").scrollTop() > 0) overlay.find("h1, .toolbarBottom").addClass("scrollable");
                else overlay.find("h1, .toolbarBottom").removeClass("scrollable");
            });

            // Close overlay.
            overlay.on("keydown", function (e) {
                // Close shortcut menus on esc press
                if (e.keyCode == 27) closeButton.trigger("click");
            });

            overlay.off("click").on("click", function (event) {
                if ($(event.target).is($(this))) {
                    var closeOverlay = true;

                    if (overlay.data("close-on-click") != undefined && !overlay.data("close-on-click")) {
                        closeOverlay = false;
                    }

                    if (closeOverlay) {
                        closeButton.trigger("click");
                    }
                }
            });

            if (!overlay.hasClass("cropperOverlay") && overlay.find(".toolbarBottom").length == 0) {
                var toolbarBottom = $("<div />"),
                    continueButton = $("<div />"),
                    continueButtonInput = $("<input />");

                continueButtonInput.attr("type", "button").attr("value", settings.buttons.closeText);
                continueButton.addClass("button continue general before").append(continueButtonInput);

                continueButtonInput.off("click").on("click", function () {
                    closeButton.trigger("click");
                });

                toolbarBottom.addClass("toolbar toolbarBottom").append(continueButton);

                if (overlay.find(".overlayItemContent").length > 0)
                    toolbarBottom.insertAfter(overlay.find(".overlayItemContent"));
                else overlay.find(".overlayContent").append(toolbarBottom);
            }
        });
    });
};

// Initialize responsive videos.
$.fn.initializeVideoFrames = function () {
    $(this).each(function () {
        var videoFrame = $(this),
            titleAttr = videoFrame.attr("title"),
            videoSrc = videoFrame.attr("src");

        if (typeof videoFrame.data("aspectRatio") == "undefined" || videoFrame.data("aspectRatio") == null) {
            var videoFrameWidth = videoFrame.attr("width") | videoFrame.width(),
                videoFrameHeight = videoFrame.attr("height") | videoFrame.height();

            videoFrame.data("aspectRatio", parseFloat(videoFrameWidth) / parseFloat(videoFrameHeight));

            // Set title attribute (Web guidelines).
            if (typeof titleAttr == undefined || titleAttr == null || trim(titleAttr) == "")
                videoFrame.attr("title", "Video");
        }

        if (!videoFrame.parent().hasClass("youtube-wrapper")) videoFrame.css({ width: "100%" });

        if (settings.webGuidelines && videoSrc.indexOf("youtu") > -1) {
            if (videoSrc.indexOf("?") > -1) {
                if (videoSrc.indexOf("disablekb=0") > -1) videoSrc.replace("disablekb=0", "disablekb=1");
                else if (videoSrc.indexOf("disablekb=1") == -1) videoSrc += "&disablekb=1";
            } else videoSrc += "?disablekb=1";

            videoFrame.attr("src", videoSrc);
        }
    });

    $(this).setVideoFrameSize();
};

// Initialize Image Maps
$.fn.initializeImageMaps = function () {
    $(this).each(function () {
        var image = $(this),
            imageMap = $("map[name='" + image.attr("usemap").replace("#", "") + "']");

        if (imageMap.length == 0 || typeof image.attr("width") == "undefined" || trim(image.attr("width")) == "")
            return;

        var ratio = image.width() / image.attr("width");

        imageMap.find("area[coords]").each(function () {
            var currentArea = $(this),
                currentCoords = "";

            if (typeof currentArea.data("originalCoords") == "undefined")
                currentArea.data("originalCoords", currentArea.attr("coords"));

            currentCoords = currentArea.data("originalCoords").split(",");

            for (var i = 0; i < currentCoords.length; i++) {
                currentCoords[i] = Math.round(currentCoords[i] * ratio);
            }

            currentArea.attr("coords", currentCoords.join(","));
        });
    });
};

// Initialize element focus (Web guidelines).
$.fn.initializeFocus = function () {
    $(this).each(function () {
        var currentObject = $(this),
            headerObject = $("#top");

        // Add tabindex for anchors.
        if (
            currentObject.is("a") &&
            (typeof currentObject.attr("href") == "undefined" ||
                currentObject.attr("href") == null ||
                trim(currentObject.attr("href")) == "")
        )
            currentObject.attr("tabindex", "-1");

        if (currentObject.data("focusInitialized") != true && headerObject.length > 0) {
            currentObject.on("focus", function (e) {
                // Prevent tabbing in background of overlay.
                if ($("body").hasClass("overlayOpen") && currentObject.parents(".overlay").length == 0) {
                    var targetOverlay = $(".overlay:not(.hide), .overlay.show");

                    if (targetOverlay.length > 0) {
                        targetOverlay.find("a, button, input, [tabindex]").first().trigger("focus");

                        return;
                    }
                }

                // Added timeout because of offset calculations
                setTimeout(function () {
                    if (
                        headerObject.css("position") == "fixed" &&
                        headerObject.find(currentObject).length == 0 &&
                        $(window).scrollTop() > 0 &&
                        currentObject.offset().top < headerObject.offset().top + headerObject.height()
                    ) {
                        var difference =
                            currentObject.offset().top - (headerObject.offset().top + headerObject.height());

                        $("html, body").scrollTop($(window).scrollTop() + difference);
                    } else if (
                        currentObject.offset().top + currentObject.outerHeight() >
                        $(window).scrollTop() + $(window).height()
                    ) {
                        var targetScrollTop =
                            currentObject.offset().top + currentObject.outerHeight() - $(window).height();

                        $("html, body").scrollTop(targetScrollTop);
                    }
                }, 40);
            });

            currentObject.data("focusInitialized", true);
        }
    });
};

// Initialize anchor links.
$.fn.initializeAnchorLinks = function () {
    // Add focus to target anchor after click. Some browsers (mobile and FF) don't automatically do that.
    $(this)
        .off("click")
        .on("click", function () {
            var target = $(this).attr("href"),
                targetScrollTop = target.offset().top,
                topHeight = $("html").hasClass("threedotfive")
                    ? $("#top").outerHeight() + $("pathOptions").outerHeight()
                    : $("#top").outerHeight();

            if (target.length > 0)
                $("html, body")
                    .stop(true)
                    .animate({ scrollTop: targetScrollTop - (topHeight + 50) }, 150);

            document.location.href = document.location.href.split("#")[0] + target;

            return false;
        });
};

// Initialize external links.
$.fn.initializeExternalLinks = function () {
    var extLink = $(this),
        srcLabel = $("<span />"),
        iconSpan = $("<span />");

    srcLabel.addClass("screenReaderContent").text(settings.links.opensExternalText);
    iconSpan.addClass("after icon-awesome-link-ext").attr("aria-hidden", "true");

    extLink.removeClass("after icon-awesome-link-ext");
    extLink.append(srcLabel).append(iconSpan);
};

$.fn.initializeInternalPageAnchors = function () {
    $(".section").addClass("anchor-links");
    $(".anchor-link").parent().css({ position: "relative", "z-index": "0" });
};

$.fn.initializeResponsiveTables = function() {
    var table = $(this),
        tableHeaders = table.find("thead th"),
        tableBody = table.find("tbody"),
        tableBodyRows = tableBody.find("tr"),
        headerText = [];

    $.each(tableHeaders, function(i) {
        headerText.push($(this).text());
    });

    $.each(tableBodyRows, function(i) {
        $.each($(this).find("td"), function(i) {
            $(this).attr("data-th-label", headerText[i]);
        });
    });
};

// Initialize scrolling actions.
$.fn.initializeScrolling = function () {
    if (typeof settings.images !== "undefined") {
        // Logo scroll size.
        if (settings.images.logoScroll && $("#top .logo").length > 0 && !$("#top .logo").hasClass("noResize")) {
            if ($(document).scrollTop() > $("#shortcuts").outerHeight()) {
                $("#top, #top .logo").addClass("small");
            } else {
                $("#top, #top .logo").removeClass("small");
            }
        }
    }

    // Fixed path.
    $.fn.fixedPath();
};

// Page numbers
$.fn.initializePageNumbers = function () {
    $(this).each(function () {
        $(this).on("click", function () {
            var href = $(this).attr("href");
            var targetElementId = "";

            if (href) {
                targetElementId = /__doPostBack\(\'([^\']+)\'/.exec(href)[1];

                if (targetElementId && trim(targetElementId) != "") {
                    targetElementId = trim(targetElementId).split("$").join("_");
                    document.scrollToAfterAjax = targetElementId;

                    return;
                }
            }

            document.scrollToAfterAjax = true;
        });
    });
};

// Initialize tags.
$.fn.initializeTags = function () {
    if (!settings.section.showTags) {
        return;
    }

    var container = $(this);

    if (container.length > 0 && !container.data("tags-initialized")) {
        container.tagsInput({
            minChars: 1,
            defaultText: "",
            onAddTag: function () {
                $("#tagsTab .badge").html($("#tagsTabContent .badgeCount").length).removeClass("hide");
            },
            onRemoveTag: function () {
                if ($("#tagsTabContent .badgeCount").length > 0)
                    $("#tagsTab .badge").html($("#tagsTabContent .badgeCount").length);
                else $("#tagsTab .badge").addClass("hide");
            },
        });

        $(".addEditTags").removeClass("hide");

        container.data("tags-initialized", true);
    }
};

// Initialize inline likes.
$.fn.initializeInlineLikes = function () {
    if ($(this).length == 0) {
        return;
    }

    var itemIDs = [];

    var updateStatus = function (likeButtonToUpdate, checked) {
        if (settings.section.itemID != -1)
            likeButtonToUpdate = $(
                "#toolbarTop .button.like, #toolbarTop .button.liked, .like.inline:not(.commentLike)"
            );

        if ($(".section").length > 0)
            if ($("#forum").length > 0)
                var itemTitle = trim(
                    likeButtonToUpdate
                        .closest(".row")
                        .find("h2")
                        .text()
                        .replace(settings.documents.openFolder, "")
                        .replace(settings.documents.closeFolder, "")
                );
            else
                var itemTitle = trim(
                    likeButtonToUpdate
                        .closest(".itemContent")
                        .find(".itemTitle")
                        .text()
                        .replace(settings.documents.openFolder, "")
                        .replace(settings.documents.closeFolder, "")
                );
        else var itemTitle = trim($("h1.itemTitle").text());

        if (checked) {
            // Liked.
            likeButtonToUpdate.addClass("liked");
            likeButtonToUpdate.data("checked", true);
            likeButtonToUpdate.removeClass("icon-heart-empty").addClass("icon-heart");
            likeButtonToUpdate.attr("title", settings.buttons.unLikeText.replace("{0}", '"' + itemTitle + '"'));
            likeButtonToUpdate
                .find("input:button")
                .attr("title", settings.buttons.unLikeText.replace("{0}", '"' + itemTitle + '"'));
            likeButtonToUpdate.find(".screenReaderContent").html(settings.buttons.inlineUnLikeText);
        } else {
            // Like.
            likeButtonToUpdate.addClass("like");
            likeButtonToUpdate.data("checked", false);
            likeButtonToUpdate.removeClass("liked icon-heart").addClass("icon-heart-empty");
            likeButtonToUpdate.attr("title", settings.buttons.likeText.replace("{0}", '"' + itemTitle + '"'));
            likeButtonToUpdate
                .find("input:button")
                .attr("title", settings.buttons.likeText.replace("{0}", '"' + itemTitle + '"'));
            likeButtonToUpdate.find(".screenReaderContent").html(settings.buttons.inlineLikeText);
        }
    };

    var updatePageLikeButton = function (likeCount, checked) {
        if (settings.section.itemID != -1) {
            // Top like button.
            $("#toolbarTop .button.like input, #toolbarTop .button.liked input").val(likeCount);
            $("#toolbarTop .button.like label, #toolbarTop .button.liked label").text(likeCount);
            $("#toolbarTop .button.like input:checkbox, #toolbarTop .button.liked input:checkbox").prop(
                "checked",
                checked
            );
        }
    };

    $(this).each(function () {
        var likeButton = $(this),
            likeNumber = likeButton.find(".number"),
            itemID = isNumeric(likeButton.data("item-id")) ? likeButton.data("item-id") : settings.section.itemID,
            checked = false;

        itemIDs.push(itemID);

        var updateData = function (aData) {
            if (typeof aData == "object" && aData.length > 0) {
                if (typeof aData[0].likeCount != "undefined" && aData[0].likeCount != null) {
                    likeNumber.text(aData[0].likeCount);
                    checked = aData[0].status;

                    updatePageLikeButton(aData[0].likeCount, checked);

                    updateStatus(likeButton, checked);
                }

                likeButton.removeClass("hide").addClass("visible");
            } else likeButton.addClass("hide").removeClass("visible");
        };

        if (!isNumeric(itemID) || itemID == -1) {
            likeButton.addClass("hide");

            return;
        }

        if (settings.user.ID > 0) {
            likeButton.off("click").on("click", function () {
                checked = likeButton.data("checked") ? false : true;

                $.ajax({
                    url: "/api/notification/SetLike",
                    data: {
                        sectionID: settings.section.ID,
                        contentPageID: itemID,
                        status: checked,
                        token: $("input[name='__RequestVerificationToken']").val(),
                    },
                })
                    .done(function (aData) {
                        updateData(aData);

                        updateStatus(likeButton, checked);
                    })
                    .fail(function () {
                        likeButton.addClass("hide");
                        $.fn.showError(arguments + ". (500.86)", "console");
                    });

                return false;
            });
        } else likeButton.css({ pointerEvents: "none", cursor: "default" });
    });

    var updateAllData = function (aData) {
        if (!Array.isArray(aData)) return;

        for (var itemIndex in aData) {
            var currentItem = aData[itemIndex];
            var currentElement;
            if (typeof currentItem != "object" || typeof currentItem.likeCount != "number") continue;

            if (settings.section.itemID && settings.section.itemID > 0)
                currentElement = $(".like.inline:not(.commentLike)");
            else currentElement = $(".like.inline[data-item-id=" + currentItem.contentPageID + "]");

            currentElement.find(".number").text(currentItem.likeCount);
            updatePageLikeButton(currentItem.likeCount, currentItem.status);
            updateStatus(currentElement, currentItem.status);

            currentElement.removeClass("hide");
        }
    };

    while (itemIDs.length) {
        var currentBatch = itemIDs.splice(0, 50);

        $.ajax({
            url: "/api/notification/GetLikes",
            data: {
                sectionID: settings.section.ID,
                contentPageIDs: currentBatch.join(","),
                token: $("input[name='__RequestVerificationToken']").val(),
            },
        })
            .done(function (aData) {
                updateAllData(aData);
            })
            .fail(function () {
                $.fn.showError(arguments + ". (500.104)", "console");
            });
    }
};

$.fn.initializeForumStickies = function () {
    $.each($("#forum.section .row"), function () {
        var sticky = $(this).find(".itemInformation .sticky");

        if (sticky.text() === "Sticky") {
            sticky.removeClass("hide");
            $(this).addClass("sticky");
        }
    });
};

// Initialize maintenance message.
$.fn.initializeMaintenance = function () {
    if (document.location.href.indexOf("login.mett.nl") > -1) {
        return;
    }

    var now = new Date();

    var apiCall = {
        url: "/api/community/getcommunitymessage",
        data: {
            communityId: 432,
            token: $("input[name='__RequestVerificationToken']").val(),
        },
    };

    $.ajax(apiCall).done(function (maintenance) {
        if (!maintenance || !maintenance.EnableMessage || maintenance.Message == "") {
            return;
        }

        if (
            maintenance.ScheduleMessage &&
            (now < new Date(maintenance.MessageStartDate) || now > new Date(maintenance.MessageEndDate))
        ) {
            return;
        }

        // 0 = Moderators.
        if (maintenance.ShowMessageTo == 0 && settings.section.cmsUrl == "") {
            return;
        }

        // 1 = Authenticated users.
        if (maintenance.ShowMessageTo == 1 && (settings.user == undefined || settings.user.ID == -1)) {
            return;
        }

        // Lockdown (readonly) mode (redirect to homepage with message).
        if (maintenance.LockdownMode) {
            if (
                settings.section.isAdd ||
                settings.section.isEdit ||
                settings.section.isDelete ||
                settings.section.isCMS ||
                settings.section.isCMSAdd ||
                settings.section.isCMSEdit ||
                settings.section.isProfile ||
                (settings.section.cmsUrl != "" &&
                    globals.url.indexOf(settings.section.cmsUrl) > -1 &&
                    !settings.section.isSettings)
            ) {
                document.location.href = "/default.aspx?maintenance=true";
            }

            // Disable add, edit, delete, comment, etc. buttons.
            $(
                ".shortcut.updates, .shortcut.dropDownProfile, .shortcut.cms, .toolbar:not('.portalSelector, .savePortalSettings') a, .toolbar:not('.portalSelector') input, .sectionOptions .button.add a, .commentCount, .like, .starRating a"
            )
                .off("click")
                .on("click", function () {
                    showMessage(maintenance);

                    return false;
                });

            // Remove comment field.
            $("#addComment").html("<div class='warningMessage'>" + maintenance.Message + "</div>");
        }

        showMessage(maintenance);
    });

    function showMessage(maintenance) {
        $("body").showMessage({
            content: maintenance.Message,
            showHideButton: maintenance.ShowHideMessageButton,
            autoHideAfter: maintenance.HideAfterNSeconds,
            cookieID: "mettMaintenanceCookie_" + new Date(maintenance.MessageStartDate).getTime(),
        });
    }
};

// Initialize tags
$.fn.initializeTagsDisplay = function () {
    var tagDisplays = $(this);

    if (tagDisplays.length === 0) {
        return false;
    }

    var ajaxSettings = {
        url: "/api/contentPages/getSectionContentPagesTags",
        data: {
            sectionID: settings.section.ID,
            token: $("input[name='__RequestVerificationToken']").val(),
        },
    };

    if (tagDisplays.length == 1) {
        if (typeof tagDisplays.data("item-id") != "undefined" && tagDisplays.data("item-id") != "") {
            ajaxSettings.url = "/api/contentPages/getContentPageTags";
            ajaxSettings.data.contentPageId = tagDisplays.data("item-id");
        } else {
            return;
        }
    }

    $.ajax(ajaxSettings).done(function (data) {
        tagDisplays.each(function () {
            var currentTagDisplay = $(this);
            var itemId = currentTagDisplay.data("item-id");

            currentTagDisplay.empty();

            if (itemId > 0 && typeof data[itemId] != "undefined" && data[itemId].length > 0) {
                var clearDiv = $("<div>");
                clearDiv.addClass("clear both");

                for (var i = 0; i < data[itemId].length; i++) {
                    var currentTag = data[itemId][i];
                    var searchUrl = "/shortcuts/Search_Search.aspx?tag=" + encodeURIComponent(currentTag.Name);
                    var container = $("<span>");
                    var link = $("<a>");

                    container.addClass("tag icon-tag before");

                    link.attr("href", searchUrl);
                    link.attr("title", settings.various.findMoreWithTagText + ' "' + currentTag.Name + '"');
                    link.text(currentTag.Name);

                    container.append(link);
                    currentTagDisplay.append(container);
                }

                currentTagDisplay.append(clearDiv);

                setTimeout(function () {
                    if (currentTagDisplay.outerHeight() > 30) currentTagDisplay.parent().addClass("multiLineTags");
                }, 250);
            }
        });
    });
};

$.fn.initializeFollowersOverlay = function () {
    var followersOverlay = $(this);

    if (followersOverlay.data("initialized")) return;

    followersOverlay.data("initialized", true);
};

$.fn.showFollowersOverlay = function (options) {
    var followersOverlay = $(this);

    if (options.showOverlay) {
        $.fn.saveLastFocus();

        $("body").addClass("overlayOpen");
        followersOverlay.removeClass("hide").addClass("active");

        followersOverlay.tabGuard();

        followersOverlay
            .find("[tabindex]:not([tabindex=-1]):visible, button:visible, input:visible, a:visible")
            .first()
            .trigger("focus");
    }
};

// Cookie settings overlay.
$.fn.initializeCookieSettingsOverlay = function (options) {
    if ($.cookie == undefined) return;

    var defaults = {
        showOverlayToggle: !$.cookie(settings.cookies.ID),
        showOverlay: $.fn.getAnchor("settings") == "cookies",
    };

    var options = $.extend(defaults, options);

    if (!options.showOverlayToggle && !options.showOverlay) return;

    var cookieSettingsOverlay = $(this);
    var cookieSettingsOverlayToggle = $("#cookieSettingsOverlayToggle");

    // Overlay toggle.
    cookieSettingsOverlayToggle.off("click").on("click", function () {
        $("#cookieSettingsOverlay").initializeCookieSettingsOverlay({ showOverlay: true });
    });

    if ($("#functionalCookiesToggle").length > 0 && $("#functionalCookiesToggle")[0].disabled === true)
        $("#functionalCookiesToggle").attr("aria-disabled", "true");

    // Toggle current cookie settings in overlay.
    cookieSettingsOverlay
        .find("#analyticalCookiesToggle")
        .prop("checked", settings.cookies.allowAnalytical)
        .initializeSwitchery();
    cookieSettingsOverlay
        .find("#marketingCookiesToggle")
        .prop("checked", settings.cookies.allowMarketing)
        .initializeSwitchery();

    // Policy link in overlay.
    if ($("#footer .cookiePolicy").length > 0) {
        cookieSettingsOverlay
            .find(".cookiePolicy")
            .off("click")
            .on("click", function () {
                $("#footer .cookiePolicy a")[0].click();

                return false;
            });
    }

    // Cancel button in overlay.
    cookieSettingsOverlay
        .find(".toolbarBottom .close input:button")
        .off("click")
        .on("click", function () {
            // Re-enable scrolling.
            $("body").removeClass("overlayOpen");

            // Hide overlay.
            cookieSettingsOverlay.addClass("hide").removeClass("active");

            $.fn.restoreLastFocus();
        });

    // Save button in overlay.
    cookieSettingsOverlay
        .find(".toolbarBottom .saveCookieSettings input:button")
        .off("click")
        .on("click", function () {
            // Get settings.
            var cookieSettings = {
                functional: cookieSettingsOverlay.find("#functionalCookiesToggle").is(":checked"),
                analytical: cookieSettingsOverlay.find("#analyticalCookiesToggle").is(":checked"),
                marketing: cookieSettingsOverlay.find("#marketingCookiesToggle").is(":checked"),
            };

            // Expire 1 year from now.
            var expiryDate = new Date();
            expiryDate.setTime(expiryDate.getTime() + 3600 * 1000 * 24 * 365);

            // Store cookie settings in cookie.
            $.cookie.json = true;
            $.cookie(settings.cookies.ID, cookieSettings, { expires: expiryDate, path: "/" });

            // Log choices.
            $.ajax({
                url: "/api/application/logCookieConsent",
                data: {
                    functional: cookieSettings.functional,
                    analytical: cookieSettings.analytical,
                    marketing: cookieSettings.marketing,
                    token: $("input[name='__RequestVerificationToken']").val(),
                },
            })
                .done(function (aData) {
                    // Refresh page with new settings.
                    document.location.href = globals.url.replace("#settings=cookies", "");
                })
                .fail(function () {
                    $.fn.showError(settings.errors.cookieConsentErrorText + " (500.103)");
                });
        });

    if (options.showOverlayToggle) cookieSettingsOverlayToggle.removeClass("hide");

    if (options.showOverlay) {
        $.fn.saveLastFocus();

        $("body").addClass("overlayOpen");
        cookieSettingsOverlay.removeClass("hide").addClass("active");

        cookieSettingsOverlay.tabGuard();

        cookieSettingsOverlay
            .find("[tabindex]:not([tabindex=-1]):visible, button:visible, input:visible, a:visible")
            .first()
            .trigger("focus");
    }
};

// Apply cookie settings to content.
$.fn.applyCookieSettings = function () {
    if (settings.cookies.allowMarketing || settings.section.isAdd || settings.section.isEdit) {
        return;
    }

    // Allowed content: same domain, mett.nl, do not track parameter, etc.
    var whiteList =
        "iframe[src*=''], iframe[src*='" +
        globals.domain +
        "'], iframe[src*='mett.nl'], " +
        "iframe[src*='tik-app.nl'], iframe[src*='formdesk.nl'], iframe[src*='formdesk.com'], iframe[src*='?dnt=true'], iframe[src*='&dnt=true'], " +
        "iframe[src*='maps.arcgis.com'], iframe[src*='hcaptcha.com'], iframe[src*='geocontent.rvo.nl'], iframe[src*='rijkswaterstaat.projectatlas.app'], " +
        "iframe[src*='-infographic.dpi.nl'], iframe[src*='emaddc-monitoring-stack-dev.pub.dev.knmi.cloud'], iframe[src*='emaddc-monitoring-stack.pub.knmi.cloud'], " +
        "iframe[src*='gemeentewoudenberg.ik-doe-mee.nl'], iframe[src*='paw.da05.qabana.nl'], iframe[src*='latlong.nl'], iframe[src*='pageking.nl'], iframe[src*='sg-host.com'], " +
        "iframe[src*='brabantseinnovatiekracht.nl'], iframe[src*='toegankelijkheidsverklaring.nl'], iframe[src*='new.maptionnaire.com'], iframe[src*='waternet.omgevingswarmte.nl'], " +
        "iframe[src*='rws.projectatlas.app'], iframe[src*='regionale-energiestrategie-search.vragen.ai'], iframe[src*='energiefestival2024.we-invite.eu'], iframe[src*='hvr.nl/frames/Regelingenhulp']";

    // Blacklisted (video) content: all external domains, YouTube, Vimeo, etc.
    var blackList = "iframe[src^='http://'], iframe[src^='https://'], iframe[src^='//'], .fb-page";
    var videoBlackList = "iframe[src*='youtube.com'], iframe[src*='youtube-nocookie.com'], iframe[src*='vimeo.com']";

    // Remove unallowed content.
    $(blackList).not(whiteList).addClass("blockedContent").hide();
    $(videoBlackList).addClass("blockedVideoContent");

    $(".blockedContent").each(function () {
        var blockedContent = $(this);
        var warningMessage = $("<div />");
        var warningMessageTitle = $("<h3 />");
        var warningMessageLink = $("<a />");
        var warningMessageContent = settings.cookies.blockedContentWarning;

        warningMessageTitle.html(settings.cookies.blockedContentTitle);
        warningMessageLink.text(settings.cookies.blockedContentLink);

        // Change title and content depending on page layout.
        if (
            blockedContent.parent().hasClass("small") ||
            blockedContent.parent().hasClass("medium") ||
            blockedContent.parents(".mettCarousel")
        ) {
            warningMessageContent = "";
            warningMessageLink.text(settings.cookies.blockedContentLinkShort);
        }

        warningMessageLink
            .prop("href", "#settings=cookies")
            .off("click")
            .on("click", function (e) {
                $("#cookieSettingsOverlay").initializeCookieSettingsOverlay({ showOverlay: true });
                e.preventDefault();
                e.stopPropagation();
                return false;
            });

        warningMessage
            .prop("class", "cookieWarningMessage")
            .html(warningMessageContent)
            .prepend(warningMessageTitle)
            .append(warningMessageLink);

        if (blockedContent.parent().prop("tagName").toLowerCase() !== "body")
            $(warningMessage).insertAfter(blockedContent);

        blockedContent.parent().addClass("hasBlockedContent");
        blockedContent.remove();
    });
};

function htmlDecode(aValue) {
    return $("<div/>").html(aValue).text();
}

$.fn.initializeRelatedContent = function () {
    var relatedContent = $(this);
    if (relatedContent.length === 0) return;

    $(".itemTags").insertBefore(relatedContent);

    $.ajax({
        url: "/api/contentpages/getrelatedcontent",
        data: {
            sectionId: settings.section.ID,
            contentPageId: settings.section.itemID,
            token: $("input[name='__RequestVerificationToken']").val(),
        },
    })
        .done(function (aData) {
            if (!aData["ContentPages"] || aData["ContentPages"].length == 0) {
                relatedContent.remove();
                return;
            }

            relatedContent.removeClass("hide");

            var relatedContentContainer = $("<ul>");
            relatedContentContainer.addClass("related-content-container");

            $.each(aData["ContentPages"], function (aIndex) {
                var listIconValue = "";
                switch (this["contentpage_pagetype"]) {
                    case 3:
                        listIconValue = "icon-globe";
                        break;
                    case 5:
                        listIconValue = "icon-link";
                        break;
                    case 13:
                        listIconValue = "icon-calendar";
                        break;
                    case 18:
                        listIconValue = "icon-chat";
                        break;
                    case 34:
                        listIconValue = "icon-docs";
                        break;
                    case 50:
                        listIconValue = "icon-location";
                        break;
                    case 58:
                        listIconValue = "icon-pencil";
                        break;
                    case 65:
                        listIconValue = "icon-doc-text";
                        break;
                    case 74:
                        listIconValue = "icon-help";
                        break;
                    case 88:
                        listIconValue = "icon-info-circled";
                        break;
                    case 76:
                        listIconValue = "icon-users";
                        break;
                    default:
                        listIconValue = "icon-doc-text";
                        break;
                }

                var contentTitleLi = $("<li>");
                var contentTitleLink = $("<a>");
                contentTitleLink.attr(
                    "href",
                    "/PageByID.aspx?sectionID=" + this["CPS_SectionID"] + "&contentpageID=" + this["contentPage_id"]
                );
                contentTitleLink.addClass(listIconValue + " before auto relatedcontent_" + this["contentPage_id"]);
                contentTitleLink.text(htmlDecode(this["contentPage_title"]));
                contentTitleLi.append(contentTitleLink);
                relatedContentContainer.append(contentTitleLi);
            });

            relatedContent.append(relatedContentContainer);
        })
        .fail(function () {
            $.fn.showError(arguments + ". (500.51)", "console");
            relatedContent.remove();
        });
};

$.fn.initializePageNavigation = function () {
    $.ajax({
        url: "/api/pagenavigation/GetNavigationOptions",
        data: {
            sectionID: settings.section.ID,
            contentPageID: settings.section.itemID,
            token: $("input[name='__RequestVerificationToken']").val(),
        },
    })
        .done(function (aData) {
            var data = JSON.parse(aData),
                itemNavContainer = $('<div class="item-nav-container"></div>');

            $.each(data, function (i) {
                var itemButton;

                if (data[i][4] == "previous")
                    itemButton = $(
                        '<a href="' +
                            data[i][3] +
                            '" class="item-nav previous" title="' +
                            settings.section.goToText +
                            " '" +
                            data[i][2] +
                            '\'"><span class="icon-previous" aria-hidden="true"></span><span class="title">' +
                            data[i][2] +
                            "</span></a>"
                    );
                else if (data[i][4] == "next")
                    itemButton = $(
                        '<a href="' +
                            data[i][3] +
                            '" class="item-nav next" title="' +
                            settings.section.goToText +
                            " '" +
                            data[i][2] +
                            '\'"><span class="icon-next" aria-hidden="true"></span><span class="title">' +
                            data[i][2] +
                            "</span></a>"
                    );

                itemNavContainer.append(itemButton);
            });

            itemNavContainer.insertBefore($(".item #toolbarBottom"));
        })
        .fail(function () {
            $.fn.showError(arguments + ". (500.51)", "console");
        });
};

$.fn.initializeRegistrationCheckboxCheck = function () {
    if ($('.userConditions .field input[type="checkbox"]').is(":checked"))
        $("#conditionsState").text(settings.various.conditionsAcceptedText);
    else $("#conditionsState").text(settings.various.conditionsNotAcceptedText);

    if ($('.privacyStatement .field input[type="checkbox"]').is(":checked"))
        $("#privacyState").text(settings.various.privacyAcceptedText);
    else $("#privacyState").text(settings.various.privacyNotAcceptedText);
};

$.fn.addAriaLabels = function () {
    $(this).each(function () {
        var currentObject = $(this);

        if (typeof currentObject.attr("aria-label") == "undefined") {
            if (typeof currentObject.attr("value") != "undefined")
                currentObject.attr("aria-label", currentObject.attr("value"));
            else {
                if (currentObject.hasClass("shareBtnLink"))
                    currentObject.attr("aria-label", currentObject.attr("title"));
                else if (currentObject.data("ignore-aria-label") !== true)
                    currentObject.attr("aria-label", trim(currentObject.text()));
            }
        }
    });
};

$.fn.initializeTotalRecords = function () {
    if (!settings.section.enableTotalRecords || $(this).length === 0) return;

    $(".totalRecords").remove();

    var totalRecorsCount = $(this).data("total-records");
    if (parseInt(totalRecorsCount) === -1) return;

    var totalRecords = $("<div>");
    totalRecords.addClass("totalRecords");
    totalRecords.text(
        totalRecorsCount + " " + (totalRecorsCount === 1 ? settings.section.resultText : settings.section.resultsText)
    );

    $(".sectionContent").prepend(totalRecords);
};

$.fn.CKEditorContainsXSSVulnerability = function () {
    // Editors.
    var editors = $(".editor");

    if (editors.length > 0) {
        for (var i = 0; i < editors.length; i++) {
            // Check if all editors are initialized properly.
            if (!$(editors[i]).hasClass("ready")) return true;
        }

        if (typeof CKEDITOR != "undefined") {
            for (name in CKEDITOR.instances) {
                var data = CKEDITOR.instances[name].getData();
                var regEx =
                    /<script[\s\S]*?>[\s\S]*?<\/script>|<\/script>|\/\/--|String.fromCharCode([\s\S]*?)|onload=|onerror=/gi;

                // Check for script tag.
                if (typeof data != "undefined" && data != null && trim(data) != "" && data.match(regEx) != null)
                    return true;
            }
        }
    }

    return false;
};

$.fn.initializeAccessibleHCaptcha = function () {
    // hCaptcha.
    if ($("#h-captcha").length > 0 && $("#h-captcha .accessibilityLink").length == 0) {
        var accessibilityLink = $("<a>");
        accessibilityLink.attr("href", "https://dashboard.hcaptcha.com/signup?type=accessibility");
        accessibilityLink.attr("target", "_blank");
        accessibilityLink.addClass("accessibilityLink");
        accessibilityLink.text(settings.a11y.accessibleHCaptchaText);

        $("#h-captcha").prepend(accessibilityLink);
    }
};

$.fn.initializeHelpdeskWidget = function () {
    if (settings.various.showHelpdeskWidgetToModerators && settings.section.cmsUrl != "") {
        var helpdeskScript = document.createElement("script");
        helpdeskScript.type = "text/javascript";
        helpdeskScript.src = "https://chat.mett.nl/widget.umd.js";
        document.body.appendChild(helpdeskScript);
        helpdeskScript.onload = function () {
            var widget = document.createElement("chat-widget");

            if ($("body").hasClass("a11y-contrast")) widget.className = "contrast-mode";

            document.body.append(widget);
        };
    }
};

// Makes sure the session won't expire while filling out a form (Web guidelines).
$.startKeepAlive = function (aMaxTime) {
    window.keepAliveInterval = setInterval(function () {
        // Keep alive every 10 minutes.
        if (document.location.href.indexOf("login.mett.nl") > -1)
            $.get(document.location.href + "&preventCache=" + Date.now());
        else $.get("/shortcuts/default.aspx?preventCache=" + Date.now());
    }, 600000);

    if (typeof aMaxTime != "undefined" && aMaxTime != null && aMaxTime > 0) {
        // Stop after aMaxTime minutes.
        setTimeout(function () {
            $.stopKeepAlive();
        }, aMaxTime);
    }
};

// Stops startKeepAlive function.
$.stopKeepAlive = function () {
    if (typeof window.keepAliveInterval != "undefined" && window.keepAliveInterval != null)
        clearInterval(window.keepAliveInterval);
};

$.fn.injectMettAccessibilityParagraph = function () {
    var accessibilityParagraph =
        "<h2>Toegankelijkheid Mett</h2>" +
        '<p>Deze website maakt gebruik van het <a href="https://www.mett.nl/">Mett</a> platform. Mett laat haar online software periodiek toetsen op toegankelijkheid door onafhankelijke deskundigen en lost gevonden knelpunten duurzaam op.</p>' +
        '<p>Voor de technisch-functionele toegankelijkheid van deze website verwijzen we daarom naar de <a href="https://toegankelijkheidsrapport.swink.nl/mett-3-systeem/" target="_self" rel="noreferrer noopener">onderzoeksresultaten van ‘Mett Toegankelijk’</a>, een platform op Mett dat daar periodiek op getoetst wordt door een onafhankelijke derde partij.</p>';

    $(".sectionContent").append(accessibilityParagraph);
};

$.fn.initializePasswordVisibilityToggle = function () {
    var passwordField = $(this),
        passwordInput = passwordField.find("input"),
        passwordToggle = passwordField.find(".passwordToggle");

    passwordToggle.off("mousedown").on("mousedown", function () {
        // Cancel blur event.
        passwordInput.addClass("cancelBlur");

        if (passwordToggle.find(".before").hasClass("icon-awesome-eye")) {
            // Show password.
            passwordToggle.attr("aria-checked", "true");
            passwordToggle.find(".before").removeClass("icon-awesome-eye").addClass("icon-awesome-eye-off");
            passwordInput.attr("type", "text");
        } else {
            // Hide password.
            passwordToggle.attr("aria-checked", "false");
            passwordToggle.find(".before").removeClass("icon-awesome-eye-off").addClass("icon-awesome-eye");
            passwordInput.attr("type", "password");
        }

        setTimeout(function () {
            passwordInput.trigger("focus");
        }, 0);
    });
};

// Google Translate plugin callback.
function initializeGoogleTranslate() {
    if ($("#googleTranslatePlugin").length == 0 && typeof settings.googleTranslate !== "undefined") {
        // Create plugin container.
        var googleTranslatePlugin = $("<div />");
        googleTranslatePlugin.prop("id", "googleTranslatePlugin");

        var translateOverlay = $("<div />"),
            translateOverlayContent = $("<div />"),
            translateOverlayTitle = $("<h1 />"),
            translateOverlayHelp = $("<div />"),
            translateOverlayHelpText = $("<p />"),
            translateOverlayCloseButton = $("<a />"),
            translateOverlayCloseButtonSRC = $("<span />"),
            translateOverlayItemContent = $("<div />"),
            translateOverlayToolbar = $("<div />"),
            translateOverlayToolbarButton = $("<div />"),
            translateOverlayToolbarButtonAnchor = $("<a />"),
            translateOverlayButton = $("<li />"),
            translateOverlayButtonAnchor = $("<a />");

        translateOverlay
            .addClass("overlay translateOverlay hide")
            .attr("aria-modal", "true")
            .attr("aria-labelledby", "overlayItemTitle");
        translateOverlayContent.addClass("overlayContent");
        translateOverlayItemContent.addClass("overlayItemContent");

        translateOverlayCloseButtonSRC.addClass("screenReaderContent").text(settings.buttons.closeText);
        translateOverlayCloseButton
            .addClass("button close info icon-cancel-circled iconOnly before pointer")
            .attr("href", "#")
            .append(translateOverlayCloseButtonSRC);

        translateOverlayTitle.addClass("overlayItemTitle").text(settings.googleTranslate.translateButtonText);

        translateOverlayHelp.attr("overlayItemHeader");
        translateOverlayHelpText.text(settings.googleTranslate.translatePopupText);

        translateOverlayHelp.append(translateOverlayHelpText);

        translateOverlayItemContent.append(googleTranslatePlugin);

        translateOverlayToolbarButtonAnchor.attr("href", "#").text(settings.buttons.closeText);
        translateOverlayToolbarButton
            .addClass("button general close before")
            .append(translateOverlayToolbarButtonAnchor);
        translateOverlayToolbar
            .addClass("toolbar toolbarBottom")
            .css("display", "block")
            .append(translateOverlayToolbarButton);

        translateOverlayContent
            .append(translateOverlayCloseButton)
            .append(translateOverlayTitle)
            .append(translateOverlayHelp)
            .append(translateOverlayItemContent)
            .append(translateOverlayToolbar);

        translateOverlay.append(translateOverlayContent);

        $("body").append(translateOverlay);

        translateOverlayButtonAnchor
            .addClass("shortcut translate")
            .attr("href", "#")
            .text(settings.googleTranslate.translateButtonText);

        translateOverlayButton.append(translateOverlayButtonAnchor);

        if ($("html").hasClass("mobile")) {
            translateOverlayButtonAnchor.prepend("<br>");
            $("#mobileShortcuts li:eq(0)").append(translateOverlayButtonAnchor);
        } else {
            if (settings.googleTranslate.pluginLocation === "#top .eight.columns") {
                if ($("#shortcuts .shortcut.contact").length > 0)
                    translateOverlayButton.insertAfter($("#shortcuts .shortcut.contact").parent());
                else if ($("#shortcuts .shortcut.avatar").length > 0)
                    translateOverlayButton.insertAfter($("#shortcuts .shortcut.avatar").parent());
                else $("#shortcuts").append(translateOverlayButton);
            }
        }

        translateOverlayButtonAnchor.on("click", function () {
            $(".translateOverlay").removeClass("hide").initializeOverlays();
        });

        // Cancel button in overlay.
        translateOverlay.find(".button.close").on("click", function () {
            // Re-enable scrolling.
            $("body").removeClass("overlayOpen");

            // Hide overlay.
            translateOverlay.addClass("hide");

            $.fn.restoreLastFocus();
        });
    }

    var gTranslateLayout;

    if (typeof settings.googleTranslate !== "undefined") {
        if (window.width > 768) gTranslateLayout = google.translate.TranslateElement.InlineLayout.SIMPLE;
        else gTranslateLayout = google.translate.TranslateElement.InlineLayout.VERTICAL;

        // Initialize plugin.
        new google.translate.TranslateElement(
            {
                pageLanguage: settings.googleTranslate.pageLanguage,
                includedLanguages: settings.googleTranslate.includedLanguages,
                layout: gTranslateLayout,
            },
            "googleTranslatePlugin"
        );
    }
}

$.fn.initializeFooterMenuCleanup = function () {
    $.each($(this).find("li"), function () {
        if ($(this).find("a").length == 0) $(this).remove();
    });
};

$.fn.initializeClasses = function () {
    var html = $(this);

    // Browser.
    if (typeof bowser !== "undefined" && bowser !== null) {
        if (bowser.name !== null) html.addClass(bowser.name.toLowerCase().replace(" ", ""));

        if (typeof bowser.version === "string") {
            html.addClass(bowser.name.toLowerCase().replace(" ", "") + bowser.version.replace(".", ""));
        }
    }

    if (typeof settings != "undefined") {
        if (settings.section !== undefined) {
            // Home.
            if (settings.section.parentID == -1) {
                html.addClass("home");
            }

            // Section.
            if (settings.section.ID !== -1) {
                html.addClass("section-" + settings.section.ID);
            }

            // Item.
            if (settings.section.itemID !== -1) {
                html.addClass("item-" + settings.section.itemID);
            }
        }

        if (settings.user !== undefined && settings.user.ID > -1) {
            // Logged in.
            html.addClass("user-logged-in");
        }
    }
};

$.fn.initializePoll = function () {
    if ($("#poll_placeholder").length > 0) {
        var poll = $(".poll");
        $("#poll_placeholder").prepend(poll);
    }
};
;
// Main menu.
$.fn.initializeMainMenu = function () {
    var mainMenu = $(this);
    var maxHeight = $(window).height() - $("#top").height();
    var shortcuts = $("#shortcuts");

    maxHeight = Math.max(150, maxHeight);

    // Vertical tablet check (overrides CSS in menus.css).
    if ($(".touch").length > 0 && $.fn.viewport().width > 768) {
        mainMenu.show();
        shortcuts.show().removeClass("hide");
    }

    $.fn.initializeSecondRow(mainMenu);

    // Check if scrollbar in drop down is needed.
    mainMenu.find(".dropDown ul").each(function () {
        var dropDown = $(this);

        if (dropDown[0].scrollHeight > maxHeight)
            dropDown.parent().css({ "max-height": maxHeight, "overflow-x": "hidden", "overflow-y": "scroll" });
        else dropDown.parent().removeAttr("style");
    });

    if ($("html").hasClass("threedotfive")) mainMenu.find("li .dropDown li a").attr("tabindex", "-1");

    if (mainMenu.css("display") == "block") {
        // Initialize scrollbar if main menu is visible.
        $("body").removeClass("noScroll");
    }

    if ($("#shortcuts .shortcut.favorites").length > 0) {
        var favBtn = $("#shortcuts .shortcut.favorites");

        if (favBtn.hasClass("active")) favBtn.attr("aria-expanded", "true");
        else favBtn.attr("aria-expanded", "false");
    }

    if ($("#shortcuts .shortcut.notifications").length > 0) {
        var notificationsBtn = $("#shortcuts .shortcut.notifications");

        if (notificationsBtn.hasClass("active")) notificationsBtn.attr("aria-expanded", "true");
        else notificationsBtn.attr("aria-expanded", "false");
    }

    shortcuts.find(".shortcut.profile").attr("aria-expanded", "false");

    $("#mainMenu ul").find("a.active").attr("aria-current", "page");

    $("#mainMenu").on("keyup", function (event) {
        var keyCode = event.keyCode || event.which;

        if (keyCode == 9) {
            if ($(event.target).parent().find(".dropDown").length > 0) $(event.target).attr("aria-expanded", "true");
        }
    });
};

// Mobile menu.
$.fn.initializeMobileMenu = function () {
    var container = $(this);
    var topHeight;
    var bottomClearance;
    var menuSize;
    var mobileScroll;

    var bodyKeyDown = function (e) {
        // Close hamburger menu on esc press
        if (e.keyCode == 27) {
            $("#top .hamburger").trigger("click");
        }
    };

    // Toggle button.
    $("#top .hamburger")
        .off("click")
        .on("click", function () {
            if (!$(this).hasClass("active")) {
                topHeight = $("#top").height();

                if (!$("#cookieSettingsOverlayToggle").hasClass("hide"))
                    bottomClearance = topHeight + $("#cookieSettingsOverlayToggle").height() + 25;
                else bottomClearance = topHeight;

                menuSize = $(window).outerHeight() - bottomClearance;

                // Disable scrolling.
                $("body").addClass("noScroll");
                $("body").on("keydown", bodyKeyDown);

                $("#top .columns, #mobileSlideOut").tabGuard();

                setTimeout(function () {
                    $("#mobileSlideOut")
                        .find("[tabindex]:not([tabindex=-1]):visible, button:visible, input:visible, a:visible")
                        .first()
                        .trigger("focus");
                }, 40);

                // Show menu.
                $("#top").stop(true).animate({ height: "100%" }, 300);
                container
                    .css({ top: topHeight, height: menuSize + "px" })
                    .stop(true)
                    .fadeIn(600);
                $(this).removeClass("icon-menu").addClass("active icon-cancel").attr("aria-expanded", "true");
                $(this)
                    .find(".screenReaderContent")
                    .html(" " + settings.menu.hamburgerCollapseText);

                // Custom scrollbar.
                mobileScroll = new IScroll("#mobileSlideOut", {
                    scrollbars: true,
                    click: true,
                    mouseWheel: true,
                    interactiveScrollbars: true,
                    shrinkScrollbars: "scale",
                });
            } else {
                // Hide menu.
                topHeight = 0;

                container.stop(true).fadeOut(200);

                $("#top")
                    .stop(true)
                    .animate({ height: topHeight }, 300, null, function () {
                        $(window).resize();
                    });
                $(this).removeClass("active icon-cancel").addClass("icon-menu").attr("aria-expanded", "false");
                $(this)
                    .find(".screenReaderContent")
                    .html(" " + settings.menu.hamburgerExpandText);

                // Enable scrolling.
                $("body").removeClass("noScroll");
                $("body").off("keydown", bodyKeyDown);

                $("#top .columns, #mobileSlideOut").tabGuard({ deactivate: "true" });

                // Remove custom scrollbar.
                if (mobileScroll) mobileScroll.destroy();
            }

            return false;
        });

    // Copy sub menu to mobile menu & expandable sub menu when parent item is hidden.
    if (
        $("#defaultSubMenu").length > 0 &&
        trim($("#defaultSubMenu").html()) != "" &&
        $("#mobileMenu a[href='" + $("#defaultSubMenu .dropDown:first a:first").attr("href") + "']").length == 0 &&
        $("#expandableSubMenu a[href='" + $("#defaultSubMenu .dropDown:first a:first").attr("href") + "']").length ==
            0 &&
        !settings.section.isShortcut
    ) {
        var hiddenMenuItems = $("<li />").addClass("hiddenMenuItems");

        if ($("#path").length > 0 && $("#path a:eq(1)").length > 0)
            hiddenMenuItems.append(
                '<a href="' + $("#path a:eq(1)").attr("href") + '" class="active">' + $("#path a:eq(1)").html() + "</a>"
            );
        else hiddenMenuItems.append('<a class="active">' + settings.menu.hiddenPageText + "</a>");

        hiddenMenuItems.append(
            '<a class="arrow icon-down-open-big before" title="' +
                settings.menu.toggleSubPagesText +
                '">\n<span>' +
                settings.menu.toggleSubPagesText +
                "</span>\n</a>"
        );
        hiddenMenuItems.append($("#defaultSubMenu .dropDown:first").clone());

        // Append to mobile menu.
        $("#mobileMenu .firstRow, #expandableSubMenu .firstRow").append(hiddenMenuItems);
    }

    // Mobile menu & expandable sub menu arrows.
    $("#mobileMenu a.arrow, #expandableSubMenu a.arrow").each(function () {
        var arrow = $(this),
            menuItem = arrow.parent(),
            menuItemLink = menuItem.find("a:first");

        arrow.attr("href", menuItemLink.attr("href"));
        arrow.attr("aria-expanded", "false");
        arrow.find("span").text(settings.menu.toggleSubPagesText + " " + settings.various.ofText + " " + menuItemLink.text());
        menuItem.addClass("arrowContainer");

        arrow.off("click").on("click", function () {
            // Toggle icon.
            if (arrow.hasClass("icon-up-open-big")) {
                arrow.removeClass("icon-up-open-big").addClass("icon-down-open-big");
                arrow.attr("aria-expanded", "false");
                menuItem.removeClass("open");
            } else {
                arrow.removeClass("icon-down-open-big").addClass("icon-up-open-big");
                arrow.attr("aria-expanded", "true");
                menuItem.addClass("open");
            }

            // Toggle drop down.
            menuItem.find(".dropDown:first").slideToggle(0, function () {
                // Reinitialize custom scrollbar for new height.
                if (mobileScroll) mobileScroll.refresh();
            });

            return false;
        });

        // Open drop downs to show current page.
        if (menuItem.find("a.active").length > 0) {
            if (menuItemLink.hasClass("active")) arrow.addClass("active");

            if (arrow.hasClass("icon-down-open-big")) arrow.trigger("click");
        }
    });

    // Main menu arrows (only show on mobile devices > 768px).
    $(".touch #mainMenu").initializeMainMenuArrow($(".touch #mainMenu"), "40px");

    $("#mobileMenu a.active").attr("aria-current", "page");
};

$.fn.initializeSecondRow = function (mainMenu) {
    var i = 0;

    if ($(".secondRow").length > 0) {
        // Reset.
        mainMenu.find(".firstRow").append(mainMenu.find(".secondRow > li"));
        mainMenu.removeClass("doubleHeight");
        $(".secondRow").remove();
    }

    // Add search container width to calculation in case of RO template
    var extraOffset = $("#searchContainer").length > 0 ? $("#searchContainer").width() : 0;

    // Move last items to second row.
    while (mainMenu.find(".firstRow").width() + extraOffset > mainMenu.find(".row:first").width() && i < 100) {
        if ($(".secondRow").length == 0) $('<ul class="secondRow visible"></ul>').insertAfter($(".firstRow"));

        mainMenu.find(".secondRow").prepend(mainMenu.find(".firstRow > li:last"));

        i++;
    }

    if (i > 0) mainMenu.addClass("doubleHeight");

    // Re-init spacers.
    setTimeout(function () {
        $.fn.initializeSpacers();
    }, 100);
};

$.fn.initializeMainMenuArrow = function (elem, distance) {
    elem.find("a.arrow").each(function () {
        var arrow = $(this),
            menuItem = arrow.parent(),
            menuItemLink = menuItem.find("a:first");

        menuItemLink.css("padding-right", distance);

        if (menuItemLink.hasClass("active")) arrow.addClass("active");

        arrow.attr("href", "#");

        arrow.on("mouseenter", function () {
            if ($(this).parent().find(".dropDown").length > 0)
                $(this).parent().find("a:eq(0)").attr("aria-expanded", "true");
        });

        arrow
            .off("click")
            .on("click", function (event) {
                var showDropDown = true;

                // Check if drop down is already visible.
                if (menuItem.find(".dropDown:first").hasClass("show")) {
                    arrow.removeClass("icon-up-open-big").addClass("icon-down-open-big");
                    showDropDown = false;
                }

                // Hide all drop downs.
                $(".touch:not(.desktop) #mainMenu a.arrow, .touch:not(.desktop) #shortcuts .profile")
                    .removeClass("icon-up-open-big")
                    .addClass("icon-down-open-big");
                $(".dropDown").removeClass("show");
                $(".dropDown li a").attr("tabindex", "-1");

                if (showDropDown) {
                    // Show this drop down.
                    arrow.removeClass("icon-down-open-big").addClass("icon-up-open-big");
                    menuItem.find(".dropDown:first").toggleClass("show");
                    menuItem.find(".dropDown:first li a").removeAttr("tabindex");
                }

                return false;
            })
            .show();
    });
};

// Anchor menu.
$.fn.initializeAnchorMenu = function () {
    var anchorMenu = $(this);

    if (settings.menu.enableAnchorMenu) {
        if (anchorMenu.length > 0) {
            var anchors = $(".content a[name]").not(".pageNumber a[name]").not("a.foot-note");
            var lastSubMenuItem = $("#subMenu li:last");

            if (anchors.length > 0) {
                anchors.each(function () {
                    var anchor = $(this);
                    var anchorID = anchor.attr("id");
                    var anchorName = anchor.attr("name");

                    if (anchorID == undefined && anchorName != undefined) {
                        anchorID = anchorName;
                    }

                    if (anchorName == undefined && anchorID != undefined) {
                        anchorName = anchorID;
                    }

                    if (anchorName != undefined && anchorID != undefined) {
                        var menuItem =
                            '<li><a class="icon-forward before" href="#' + anchorID + '">' + anchorName + "</a></li>";

                        // Appand anchor menu item.
                        anchorMenu.append(menuItem);
                    }
                });
            }
        }

        if (settings.section.parentID == -1) {
            // Main menu.
            $(
                "#mainMenu ul.firstRow > li > a, #mainMenu ul.secondRow > li > a, #mobileMenu ul.firstRow > li > a, #mobileMenu ul.secondRow > li > a"
            )
                .not(".arrow")
                .each(function (i) {
                    var mainMenuItem = $(this);
                    var mainMenuItemID = mainMenuItem
                        .html()
                        .replace(/[^\w-_]/gi, "")
                        .toLowerCase();

                    // Replace with anchors.
                    if (mainMenuItemID != "home") {
                        mainMenuItem.attr("href", "#" + mainMenuItemID);
                    }

                    if ($("#" + mainMenuItemID).length > 0) {
                        mainMenuItem.off("click").on("click", function () {
                            if (mainMenuItem.parents("#mobileMenu").length > 0) {
                                // Close mobile menu.
                                $("#top .hamburger").trigger("click");
                            }

                            // Scroll to anchor.
                            $("html, body")
                                .stop(true)
                                .animate({ scrollTop: $($(this).attr("href")).offset().top - 200 }, 500);

                            return false;
                        });
                    }
                });
        }

        //  Manual scroll links.
        $(".scrollLink").each(function () {
            $(this)
                .off("click")
                .on("click", function () {
                    // Scroll to anchor.
                    $("html, body")
                        .stop(true)
                        .animate({ scrollTop: $($(this).attr("href")).offset().top - 200 }, 500);

                    return false;
                });
        });
    }
};

// App style sub menu.
$.fn.initializeAppStyleSubMenu = function () {
    var container = $(this);
    var currentMenuItem = container.find("a:not(.arrow).active:last").addClass("extraActive");
    var currentMenuItemParent = container.find(".extraActive").parent("li");
    var menuItemBack = $("<li />").addClass("hide");
    var menuItemBackLink = $("<a />").attr("href", "/").addClass("back icon-left-open-big before").html("Terug");

    // Hide all items.
    container.find("a").removeClass("active").addClass("hide");
    container.find(".dropDown").show().find("a").css("padding-left", "15px");

    // Show all items on current level.
    currentMenuItemParent.find("a:first, a.arrow:first").addClass("active");
    currentMenuItemParent.siblings().find("a:first, a.arrow:first").removeClass("hide");

    // Arrow level navigation.
    container.find("a.arrow").each(function () {
        var arrow = $(this);
        arrow.removeClass("icon-down-open-big icon-up-open-big").addClass("icon-right-open-big");

        arrow.off("click").on("click", function () {
            var currentDropDown = arrow.parent("li").find(".dropDown:first");

            // Hide all items.
            container.find("a:not(.back)").removeClass("active").addClass("hide");

            // Only show all items on current level.
            currentDropDown.find("> ul > li > a").removeClass("hide");

            // Show back link.
            menuItemBack.removeClass("hide");

            return false;
        });
    });

    // Back link.
    menuItemBackLink.off("click").on("click", function () {
        // Get items from 1 level up.
        var parentDropDown = container.find("a:not(.hide, .back):first").parents(".dropDown:first");

        // Hide all items on this level.
        parentDropDown.find("a").removeClass("active").addClass("hide");

        // Show all items 1 level up.
        parentDropDown.parents("ul:first").find("> li > a").removeClass("hide");

        if (!container.find("a:not(.back):first").hasClass("hide")) {
            // Hide back link.
            menuItemBack.addClass("hide");
        }

        return false;
    });

    container.find("ul.firstRow").prepend(menuItemBack.append(menuItemBackLink));

    if (settings.section.parentID != -1) {
        // Show back link.
        menuItemBack.removeClass("hide");
    }

    // All done!
    container.show();
};

// Admin submenu.
$.fn.initializeAdminSubMenu = function () {
    var menu = $(this);

    if (menu.length == 0) {
        // Create menu.
        var newMenu = $("<div />").prop("id", "subMenu").append($("<ul />"));
        $(".layout25-50-25 #left, .layout25-75 #left, .layout33-33-33 #left, .layout75-25 #right").append(newMenu);

        menu = $("#subMenu ul");
    }

    // Custom menu items.
    var cmsLink = $("<a />")
        .prop("href", settings.section.cmsUrl)
        .addClass("icon-flow-tree before")
        .html(settings.admin.cmsText);
    var usersLink = $("<a />")
        .prop("href", "/beheer/gebruikers/default.aspx")
        .addClass("icon-users before")
        .html(settings.admin.usersText);
    var rolesLink = $("<a />")
        .prop("href", "/beheer/rollen/default.aspx")
        .addClass("icon-awesome-users before")
        .html(settings.admin.rolesText);
    var settingsLink = $("<a />")
        .prop("href", "/beheer/instellingen/default.aspx")
        .addClass("icon-tools before")
        .html(settings.admin.settingsText);
    var statsLink = $("<a />")
        .prop("href", "/beheer/statistics/default.aspx")
        .addClass("icon-chart-bar before")
        .html(settings.admin.statisticsText);
    var mailingsLink = $("<a />")
        .prop("href", "/beheer/mailings/default.aspx")
        .addClass("icon-mail before")
        .html(settings.admin.mailingsText);
    var notificationsLink = $("<a />")
        .prop("href", "/beheer/notificaties/default.aspx")
        .addClass("icon-bell before")
        .html(settings.admin.notificationsText);
    var registrationsLink = $("<a />")
        .prop("href", "/beheer/registraties/default.aspx")
        .addClass("icon-user-add before")
        .html(settings.admin.registrationsText);
    var redirectsLink = $("<a />")
        .prop("href", "/beheer/redirects/default.aspx")
        .addClass("icon-forward before")
        .html(settings.admin.redirectsText);
    var pollsLink = $("<a />")
        .prop("href", "/beheer/polls/default.aspx")
        .addClass("icon-chart-pie before")
        .html(settings.admin.pollsText);
    var formsLink = $("<a />")
        .prop("href", "/beheer/formulieren/default.aspx")
        .addClass("icon-awesome-edit before")
        .html(settings.admin.formsText);
    var moderatorFormLink = $("<a />")
        .prop("href", "/shortcuts/formulier+beheerder/default.aspx")
        .addClass("icon-graduation-cap before")
        .html(settings.admin.moderatorFormText);
    var sslFormLink = $("<a />")
        .prop("href", "/shortcuts/formulier+ssl/default.aspx")
        .addClass("icon-lock before")
        .html(settings.admin.sslFormText);

    switch (settings.section.typeID) {
        case 28:
            usersLink.addClass("active");
            break;

        case 29:
            rolesLink.addClass("active");
            break;

        case 36:
            settingsLink.addClass("active");
            break;

        case 37:
            cmsLink.addClass("active");
            break;

        case 38:
            pollsLink.addClass("active");
            break;

        case 43:
            registrationsLink.addClass("active");
            break;

        case 45:
            mailingsLink.addClass("active");
            break;

        case 56:
            moderatorFormLink.addClass("active");
            break;

        case 61:
            sslFormLink.addClass("active");
            break;

        case 69:
            redirectsLink.addClass("active");
            break;

        case 77:
            notificationsLink.addClass("active");
            break;

        case 81:
            formsLink.addClass("active");
            break;

        case 84:
            statsLink.addClass("active");
            break;
    }

    menu.append($("<li />").append(cmsLink));
    menu.append($("<li />").append(usersLink));
    menu.append($("<li />").append(rolesLink));
    menu.append($("<li />").append(settingsLink));
    menu.append($("<li />").append(statsLink));
    menu.append($("<li />").append(mailingsLink));
    menu.append($("<li />").append(notificationsLink));
    menu.append($("<li />").append(registrationsLink));
    menu.append($("<li />").append(redirectsLink));
    menu.append($("<li />").append(pollsLink));
    menu.append($("<li />").append(formsLink));
    menu.append($("<li />").append(moderatorFormLink));
    menu.append($("<li />").append(sslFormLink));
};

$.fn.initializeHorizontalSubMenu = function () {
    var subMenu = $(this);
    var staticSubMenuContainer = $("<div>").addClass("staticSubMenuContainer");
    var horizontalContainer = subMenu.find("#defaultSubMenu");
    var total = $("#total");
    var targetColumn = null;

    if (total.hasClass("layout25-50-25") || total.hasClass("layout33-33-33") || total.hasClass("layout100"))
        targetColumn = $("#center");
    else if (total.hasClass("layout25-75")) targetColumn = $("#right");
    else if (total.hasClass("layout75-25") || total.hasClass("layout50-50")) targetColumn = $("#left");

    if (targetColumn == null || targetColumn.length == 0 || subMenu.length == 0) return;

    staticSubMenuContainer.append(subMenu);
    targetColumn.prepend(staticSubMenuContainer);

    if (subMenu.find("a.active").length > 0) {
        var activeMenuItem = subMenu.find("a.active"),
            activeMenuUl = activeMenuItem.closest("ul");

        subMenu.find("#defaultSubMenu > .dropDown > ul").remove();
        subMenu.find("#defaultSubMenu > .dropDown").append(activeMenuUl);
    }

    subMenu.find("li .dropDown").remove();
    subMenu.find("ul").css({ display: "flex" });

    var updatePosition = function () {
        if ($(window).scrollTop() > 0) {
            if (staticSubMenuContainer.offset().top < $(window).scrollTop() + $("#top").height()) {
                if (!horizontalContainer.hasClass("row")) {
                    staticSubMenuContainer.height(staticSubMenuContainer.outerHeight());
                    horizontalContainer.addClass("row");
                    subMenu.appendTo($("#top"));
                    horizontalContainer.stop().css({ opacity: 0 }).animate({ opacity: 1 }, 200);
                } else {
                    if ($(".staticSubMenuContainer #subMenu").length == 0)
                        subMenu.appendTo(staticSubMenuContainer);
                }
            } else if (horizontalContainer.hasClass("row")) {
                staticSubMenuContainer.height("auto");
                horizontalContainer.removeClass("row");
                subMenu.appendTo(staticSubMenuContainer);
                horizontalContainer.stop().css({ opacity: 0 }).animate({ opacity: 1 }, 200);
            }
        }
    };

    $(window).on("resize", updatePosition);
    $(window).on("scroll", updatePosition);
};

$.fn.initializeSubMenu = function () {
    var subMenu = $(this);

    if (subMenu.length == 0) return;

    if (!trim(subMenu.find("> div").html()).length) {
        $("#subMenuLabel").remove();
        subMenu.remove();
    }

    subMenu.find("a.active").attr("aria-current", "page");

    if (settings.menu.enableSubMenuOnTop) {
        subMenu.parent().prepend(subMenu.css("margin-bottom", "25px"));
    }
};

$.fn.initializeActiveItemOnlySubMenu = function () {
    var subMenu = $(this);

    if (subMenu.hasClass("onlyActiveItem") && subMenu.find("a.active").length > 0) {
        if ($("#subMenu ul li a.active").parent().find("> .dropDown").length > 0)
            $("#subMenu ul li a.active").parent().addClass("active-item");
        else if (subMenu.find(".dropDown").length == 1) subMenu.addClass("flatMenu");
        else $("#subMenu ul li a.active").closest(".dropDown").parent().addClass("active-item");

        if (subMenu.hasClass("flatMenu")) return;
        else if ($("#subMenu #defaultSubMenu > .dropDown > ul").find("> li.active-item").length > 0)
            $("#subMenu #defaultSubMenu > .dropDown > ul > li:not(.active-item)").remove();
        else {
            var menuSection = $("#subMenu li.active-item").closest(".dropDown").parent();

            $("#subMenu #defaultSubMenu > .dropDown > ul > li").remove();
            $("#subMenu #defaultSubMenu > .dropDown > ul").append(menuSection[0]);
        }
    }
};

// Drop down menu keyboard accessibility.
$.fn.enableKeyboardAccessibility = function () {
    $(this).each(function () {
        var dropDown = $(this);
        var parent = dropDown.parents("li:first");
        var parentButton = parent.find("> a:first, > button:first, input[type=button]:first");

        if ($("html").hasClass("touch")) {
            parent
                .find("button, input[type=button]")
                .off("click")
                .on("click", function () {
                    parent.toggleClass("focus");
                });
        }

        if (parentButton.closest("#shortcuts").length) return;
        else parentButton.attr("aria-expanded", "false");

        var onKeyUp = function (e) {
            if (e.keyCode == 27) {
                var lastSibling = dropDown.find("a:last");

                // Set focus to last sibling and then blur, so keyboard navigation will work as expected
                lastSibling.trigger("focus");
                lastSibling.trigger("blur");

                parentButton.attr("aria-expanded", "false");
                dropDown.removeClass("show");

                if ($("html").hasClass("threedotfive")) dropDown.find("li a").attr("tabindex", "-1");
            }
        };

        var onDocumentKeyUp = function (e) {
            if (e.keyCode == 27) {
                parent.addClass("hideDropDown");
            }
        };

        parent.on("mouseenter", function () {
            parent.removeClass("hideDropDown");

            $(document).off("keyup", onDocumentKeyUp).on("keyup", onDocumentKeyUp);
        });

        parent.on("mouseleave", function () {
            parent.removeClass("hideDropDown");

            $(document).off("keyup", onDocumentKeyUp);
        });

        parent.on("keyup", onKeyUp);

        if (parentButton.closest("#shortcuts").length || parentButton.closest(".dropDownMenu").length) {
            return;
        } else {
            parentButton.on("mouseenter", function () {
                parentButton.attr("aria-expanded", "true");
            });

            parentButton.on("mouseout", function () {
                parentButton.attr("aria-expanded", "false");
            });
        }

        dropDown.find("a").each(function () {
            var currentLink = $(this);

            if (currentLink.data("handlersInitialized")) {
                return;
            }

            currentLink.on("mouseenter", function () {
                parentButton.attr("aria-expanded", "true");
                currentLink.on("keyup", onKeyUp);
            });

            currentLink.on("mouseout", function () {
                parentButton.attr("aria-expanded", "false");
            });

            currentLink.on("focus", function () {
                parent.addClass("focus");
                parentButton.attr("aria-expanded", "true");
                currentLink.on("keyup", onKeyUp);
            });

            currentLink.on("blur", function () {
                parent.removeClass("focus");
                parentButton.attr("aria-expanded", "false");
                currentLink.off("keyup", onKeyUp);
            });

            currentLink.data("handlersInitialized", true);
        });
    });
};

$.fn.calculateMainMenuDropdownPosition = function () {
    $(this).on("scroll", function () {
        var scrollableRow = $(this);

        scrollableRow.find(".dropDown").css({ marginLeft: -scrollableRow.scrollLeft() });
    });
};

$.fn.initializeManualRedirect = function () {
    if (!settings.cms) return;

    var helpdeskLi = $("<li>");
    var helpdeskLink = $("<a>");

    helpdeskLink.text(settings.cms.helpdeskAndManual);
    helpdeskLink.attr({
        href: "https://academy.mett.nl/helpdeskpagina/default.aspx",
        target: "_blank",
        rel: "noreferrer",
    });

    helpdeskLi.append(helpdeskLink);
    helpdeskLi.insertAfter($(this).parent());
};

// Dynamic (multi language) menu.
function initializeDynamicMenu() {
    if ($("#login").length > 0) {
        return;
    }

    $.getScript("/communities/common/themes/mett%20responsive/includes/javascripts/framework/dynamic_menu.js").done(
        function () {
            $("#mainMenu").initializeMainMenu();

            setTimeout(function () {
                window.dispatchEvent(new Event("resize"));
                $.fn.initializeSpacers();
                $("#mainMenu ul.firstRow, #mainMenu ul.secondRow").addClass("visible");
            }, 500);
        }
    );
}
;
$(window).on("load", function () {
    // Create profile image thumbnails (window.load prevents preloading issues).
    setTimeout(function () {
        $("#users.item .itemImage").createProfileThumbnails();
    }, 500);
});

$(document).ready(function () {
    // Initialize.
    $.fn.initializeUsers();

    // Add & edit user.
    $("#users.item.add, #users.item.edit, #registrations.item").initializeAddEditUser();

    if (typeof Sys != "undefined" && typeof Sys.WebForms != "undefined") {
        // After AJAX call.
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function (sender, e) {
            $.fn.initializeUserSearchFilters();
            $.fn.initializePagingButtons();

            // Create profile image thumbnails
            setTimeout(function () {
                $("#users.item .itemImage").createProfileThumbnails();
            }, 500);
        });
    }
});

// Initialize users.
$.fn.initializeUsers = function () {
    // Inactive users.
    $("#users .item.inactive, #users.item.inactive").each(function () {
        var inactiveUser = $(this);
        var inactiveUserProfileLink = "users_adduser.aspx?userkey=" + inactiveUser.data("item-id") + "#tab=settingsTab";
        var inactiveUserLabel = $("<div />")
            .addClass("inactiveUserLabel")
            .html(settings.user.inactiveText + " ");
        var inactiveUserLabelLink = $("<a />")
            .prop("href", inactiveUserProfileLink)
            .html("(" + settings.buttons.editText.toLowerCase() + ")");

        inactiveUserLabel.append(inactiveUserLabelLink);
        inactiveUser.append(inactiveUserLabel);
    });

    // Section buttons.
    if (settings.section.isCMSChild) {
        // Import button.
        $("#users.section #toolbarBottom .button.import").removeClass("hide");
    } else {
        // View button.
        $("#users.section #toolbarBottom .button.edit").removeClass("hide");
    }

    // Re-initialize toolbars.
    $("body").initializeToolbars();

    // Profile edit button.
    if ($("#users.item.profile .toolbar .button.edit a").length > 0 && settings.user.ID > 0) {
        $("#users.item.profile .toolbar .button.edit, #users.item.profile .toolbar .button.privacy-levels").removeClass(
            "hide"
        );
        $("#users.item.profile .toolbar").show();

        // Add top buttons
        var customToolbarTop = $("<div />"),
            customToolbarWrapper = $("<div />"),
            userSettingsButton = $("<div />"),
            userSettingsButtonLink = $("<a />"),
            privacyLevelsButton = $("<div />"),
            privacyLevelsButtonLink = $("<a />");

        userSettingsButton.addClass(
            "button edit transparent edit-privacy-settings visible wrapper-first-child icon-pencil iconOnly before"
        );

        userSettingsButtonLink.attr({
            role: "button",
            href: "#",
        });
        userSettingsButtonLink
            .text(settings.various.editPrivacySettingsText)
            .attr("aria-label", settings.various.editPrivacySettingsText);

        userSettingsButton.append(userSettingsButtonLink);

        privacyLevelsButton.addClass(
            "button security transparent show-privacy-levels iconOnly before float right icon-lock visible"
        );

        privacyLevelsButtonLink.attr({
            role: "button",
            href: "#",
        });
        privacyLevelsButtonLink
            .text(settings.various.showPrivacyLevelsText)
            .attr("aria-label", settings.various.showPrivacyLevelsText);

        privacyLevelsButton.append(privacyLevelsButtonLink);

        customToolbarTop.attr("id", "toolbarTop");
        customToolbarTop.addClass("toolbar right");
        customToolbarTop.attr("style", "display: block");

        customToolbarWrapper.addClass("toolbarWrapper");

        customToolbarWrapper.append(userSettingsButton, privacyLevelsButton);
        customToolbarTop.append(customToolbarWrapper);

        $("#pathOptions #options").append(customToolbarTop);

        $("#users.item.profile .toolbar .button.privacy-levels")
            .off("click")
            .on("click", function () {
                $(".exposureLevel.hide").removeClass("hide");

                $("html, body").animate({ scrollTop: 0 }, "slow");

                $(".button.privacy-levels").addClass("privacy-settings").removeClass("privacy-levels");
                $(".button.privacy-settings a")
                    .text(settings.various.editPrivacySettingsText)
                    .attr("aria-label", settings.various.editPrivacySettingsText);

                $("#users.item.profile .toolbar .button.privacy-settings")
                    .off("click")
                    .on("click", function () {
                        var profileEditLink = $('a[id*="_lnkEditProfile"]').attr("href");

                        $.cookie("showPrivacySettings", "true", { path: "/" });

                        window.location = profileEditLink + "#tab=settingsTab";
                    });

                return false;
            });

        $("#toolbarTop .button.edit-privacy-settings")
            .off("click")
            .on("click", function () {
                var profileEditLink = $('a[id*="_lnkEditProfile"]').attr("href");

                window.location = profileEditLink + "#tab=settingsTab";

                return false;
            });

        $("#toolbarTop .button.show-privacy-levels")
            .off("click")
            .on("click", function () {
                $("#users.item.profile .toolbar .button.privacy-levels").trigger("click");

                return false;
            });
    }

    // Profile items.
    $("#users.item .profileItem").each(function () {
        var profileItem = $(this);

        profileItem.find(".profileItemContent span").each(function () {
            if ($(this).html().length > 0) {
                // Show profile item and read more button.
                $("#users.item .button.showMore").removeClass("hide");
                profileItem.removeClass("hide");

                return false;
            }
        });
    });

    // Login as user button.
    if ($("#users.item #toolbarBottom .button.login input").length > 0) {
        $("#users.item #toolbarBottom .button.login a, #toolbarTop a.login")
            .off("click")
            .on("click", function () {
                $("#toolbarBottom .button.login input").trigger("click");

                return false;
            })
            .removeClass("hide")
            .parent()
            .removeClass("hide");
    }

    // Edit user.
    if ($("#users.item.edit").length > 0) {
        // Move fields.
        $("#profileExtraInformation")
            .append($(".field.phone, .field.phone2, .field.mobile, .field.fax"))
            .append($(".field.personalTitle"))
            .append($(".field.birthDate, .field.gender, .field.showAge"))
            .append($(".field.memo"));
        $("#settingsTabContent").append($("#profileFiles"));
        if ($(".field.birthDate select[id$='Birthday_dropDay']"))
            $(".field.birthDate select[id$='Birthday_dropDay']")
                .attr("autocomplete", "bday-day")
                .attr("aria-label", $(".field.birthDate select[id$='Birthday_dropDay']").attr("title"))
                .removeAttr("title");

        if ($(".field.birthDate select[id$='Birthday_dropMonth']"))
            $(".field.birthDate select[id$='Birthday_dropMonth']")
                .attr("autocomplete", "bday-month")
                .attr("aria-label", $(".field.birthDate select[id$='Birthday_dropMonth']").attr("title"))
                .removeAttr("title");

        if ($(".field.birthDate select[id$='Birthday_dropYear']"))
            $(".field.birthDate select[id$='Birthday_dropYear']")
                .attr("autocomplete", "bday-year")
                .attr("aria-label", $(".field.birthDate select[id$='Birthday_dropYear']").attr("title"))
                .removeAttr("title");

        //Move personal links
        var personalLinks = $("#profileFiles, #profileLinks");
        personalLinks.insertAfter($("#accountTabContent").find($(".field.memo")));
        $("#imageTabContent").append($("#profileImage"));

        // Profile files.
        if ($("#extraTabContent .upload").length > 0) {
            // Move upload field.
            $("#settingsTabContent #profileFiles").prepend($("#extraTabContent .upload").parent());

            if ($("#extraTabContent input, #extraTabContent select, #extraTabContent textarea").length == 0) {
                // Hide "extra" tab if there are no more custom fields.
                $("#extraTab").addClass("hide");
            }
        }

        if ($("[id$=_pnlOverlayAccountInfo]").length > 0 && $("[id$=_pnlInputValidator]").length > 0) {
            $(".overlayItemContent").append($("[id$=_pnlInputValidator]"));
        }
    }

    // Clickable phone number on Android devices.
    if (typeof bowser !== "undefined" && bowser != null && bowser.android) {
        $("#users .phone")
            .not(".field.phone")
            .each(function () {
                var phoneNumber = $(this).html();

                $(this).html('<a href="tel:' + phoneNumber + '">' + phoneNumber + "</a>");
            });
    }

    $.fn.initializePagingButtons();
    $.fn.initializeUserSearchFilters();
};

// Create profile image thumbnails.
$.fn.createProfileThumbnails = function () {
    $(this).each(function () {
        var itemImage = $(this);
        var imageFile = itemImage.find("img");
        var editLink = $("#users.item .toolbar .button.edit a").attr("href");

        if (imageFile.length > 0) {
            itemImage.addClass("hasImage");
            itemImage.find(".noImage:first").addClass("hide");

            if (imageFile.width() > imageFile.height()) {
                itemImage.addClass("landscape");
            } else if (imageFile.width() < imageFile.height()) {
                itemImage.addClass("portrait");
            }

            // Create thumbnail.
            imageFile.nailthumb({
                preload: false,
                width: settings.images.largeAvatarWidth,
                height: settings.images.largeAvatarHeight,
                fitDirection: "center center",
                maxEnlargement: 1,
            });

            imageFile.attr("src", imageFile.attr("src"));
        } else {
            // No image.
            if (editLink != undefined && itemImage.find(".uploadImage").length > 0) {
                itemImage.find(".noImage:first").addClass("hide");
                itemImage.find(".noImage:last").removeClass("hide");
            }
        }

        if (editLink != undefined) {
            // Link to image tab.
            itemImage
                .off("click")
                .on("click", function () {
                    if (editLink.indexOf("imageTab") == -1) {
                        editLink += "#tab=imageTab";
                    }

                    document.location.href = editLink;

                    return false;
                })
                .addClass("pointer");

            itemImage.attr({ role: "button", tabindex: 0 });
        }
    });
};

// User search filters.
$.fn.initializeUserSearchFilters = function () {
    if (
        $("#users.section .searchUsers input:submit").length > 0 ||
        $("#users.section .search .button.icon-search").length > 0
    ) {
        var searchInput = $(".sectionOptions .search input:text");

        // Establishments dropdown.
        if ($(".sectionOptions .establishments").length > 0) {
            var establishmentFilter = $(".sectionOptions .establishments");

            if ($(".sectionOptions .button.applyEstablishmentsFilter").length == 0) {
                var establishmentFilterButton = $("<div />").addClass(
                        "button applyEstablishmentFilter icon-awesome-filter before float left"
                    ),
                    establishmentFilterButtonInput = $("<input />")
                        .prop("type", "button")
                        .prop("aria-label", settings.buttons.filterByEstablishmentText)
                        .val(settings.buttons.filterByText);

                establishmentFilterButtonInput.off("click").on("click", function () {
                    $(".sectionOptions .search > input:text").val("");
                    $(".sectionOptions .search > .button a")[0].click();
                });

                establishmentFilterButton.append(establishmentFilterButtonInput);
                establishmentFilterButton.insertAfter(establishmentFilter);
            }
        }

        // Sort By dropdown.
        if ($(".sectionOptions .sortBy").length > 0) {
            var sortByFilter = $(".sectionOptions .sortBy");

            sortByFilter
                .parents(".sortByWrapper")
                .find(".applySorting")
                .on("click", function () {
                    filterUsers();
                });
        }

        // Sort Order dropdown.
        if ($(".sectionOptions .sortOrder").length > 0) {
            var sortOrderFilter = $(".sectionOptions .sortOrder");

            if ($(".sectionOptions .button.applySortOrderFilter").length == 0) {
                var sortOrderFilterButton = $("<div />").addClass(
                        "button applySortOrderFilter icon-awesome-sort before float left"
                    ),
                    sortOrderFilterButtonInput = $("<input />")
                        .prop("type", "button")
                        .prop("aria-label", settings.buttons.sortByText)
                        .val(settings.buttons.sortByText);

                sortOrderFilterButtonInput.off("click").on("click", function () {
                    filterUsers();
                });

                sortOrderFilterButton.append(sortOrderFilterButtonInput);
                sortOrderFilterButton.insertAfter(sortOrderFilter);
            }
        }

        // Sort By dropdown.
        if ($(".sectionOptions .filterUserFollowing").length > 0) {
            var userFollowingFilter = $(".sectionOptions .filterUserFollowing");

            if ($(".sectionOptions .button.applyUserFollowingFilter").length == 0) {
                var userFollowingFilterButton = $("<div />").addClass(
                        "button applyUserFollowingFilter icon-awesome-filter before float left"
                    ),
                    userFollowingFilterButtonInput = $("<input />")
                        .prop("type", "button")
                        .prop("aria-label", settings.buttons.filterByText)
                        .val(settings.buttons.filterByText);

                userFollowingFilterButtonInput.off("click").on("click", function () {
                    filterUsers();
                });

                userFollowingFilterButton.append(userFollowingFilterButtonInput);
                userFollowingFilterButton.insertAfter(userFollowingFilter);
            }
        }

        if (!$(".item .sortOptions").hasClass("hide")) {
            $.each($(".item"), function () {
                $(this)
                    .find(".itemContent")
                    .css("padding-top", $(this).find(".sortOptions").height() + 10);
            });
        }

        // No results.
        if (
            $("#users.section .item:not(.noSearchResults)").length == 0 &&
            $("#users.section .item.noSearchResults").length > 0 &&
            searchInput.val() != "" &&
            searchInput.val() != settings.fields.searchFieldText
        ) {
            var selectedSearchFields = "";

            $("#searchCriteriaDropdown .selected label").each(function (i) {
                if (i > 0) selectedSearchFields += ", ";

                selectedSearchFields += $(this).html();
            });

            $(".noSearchResults").html(
                $(".noSearchResults").html().replace("{0}", searchInput.val()).replace("{1}", selectedSearchFields)
            );
        }
    }
};

function filterUsers() {
    if ($("#users.section .searchUsers input:submit").length > 0)
        $("#users.section .searchUsers input:submit")[0].click();
    else if ($("#users.section .search .button.icon-search").length > 0)
        $("#users.section .search .button.icon-search a")[0].click();
}

// User add & edit
$.fn.initializeAddEditUser = function () {
    var user = $(this);

    if (user.length === 0) return;

    if ($.cookie("showPrivacySettings") !== undefined && $.cookie("showPrivacySettings") == "true") {
        var offsetTop = $("div[id$='_ctlRegisterPrivacyForm']").offset().top - $("#top").outerHeight() - 70;

        $("html, body").stop(true).animate({ scrollTop: offsetTop }, 150);

        $.removeCookie("showPrivacySettings");
    }

    user.find(".username input:text, .email input:text").on("blur", function () {
        // Remove special characters from username.
        $(this).val($.fn.removeSpecialCharacters($(this).val(), "email"));
    });

    // Profile photo or avatar.
    user.find(".profilePhotoOrAvatar").initializeProfileImageSelect();
    user.find(".avatarList").initializeAvatarList();
};

// Display paging buttons when input.
$.fn.initializePagingButtons = function () {
    $("#users.section .toolbar.paging .button.readMore").each(function () {
        if ($(this).find("input").length > 0) {
            $(this).removeClass("hide");
            $(this).parent().show();
        }
    });
};

$.fn.initializeProfileImageSelect = function () {
    var profileImageSelect = $(this);

    if (profileImageSelect.length === 0) {
        return;
    }

    profileImageSelect.find("input:radio").on("click", function () {
        showAvatars();
    });

    function showAvatars() {
        var showAvatars =
            (settings.user.enableAvatars && profileImageSelect.find("input:radio:checked").val()) == 2 ? true : false;

        if (showAvatars) {
            $(".profilePhoto").addClass("hide");
            $(".profileAvatars").removeClass("hide");
        } else {
            $(".profileAvatars").addClass("hide");
            $(".profilePhoto").removeClass("hide");
        }
    }

    if (settings.user.enableAvatars) {
        profileImageSelect.parent().removeClass("hide");
    }

    showAvatars();
};

$.fn.initializeAvatarList = function () {
    var avatarList = $(this);

    if (avatarList.length === 0) {
        return;
    }

    var avatarSelect = avatarList.find("select");
    var removeAvatar = avatarList.find(".removeAvatar input:checkbox");

    // Generate avatars.
    avatarSelect.find("option").each(function (i) {
        var avatarContainer = $("<div />");
        var noAvatarContainer = $("<div />");
        var avatar = $("<img />");
        var avatarUrl = $(this).val();

        avatarContainer.addClass("itemImage circle small pointer");
        noAvatarContainer.addClass("noImage icon-user before");
        avatar.prop("src", avatarUrl);

        if ($(this).is(":selected")) {
            avatarContainer.addClass("selected");
        }

        avatarContainer.off("click").on("click", function () {
            avatarSelect.val(avatarUrl);

            // (De)select current avatar.
            $(".itemImage").removeClass("selected");
            avatarContainer.addClass("selected");
        });

        avatarContainer.append(noAvatarContainer);

        if (avatarUrl !== "") {
            avatarContainer.prop("title", settings.user.selectAvatarText + (i + 1));
            avatarContainer.append(avatar);
        } else {
            avatarContainer.prop("title", settings.user.deSelectAvatarText).addClass("deSelectAvatar");
        }

        avatarList.append(avatarContainer);
    });
};
;
$(window).on("load", function () {
    // Create thumbnails (window.load prevents preloading issues).
    setTimeout(function () {
        $(".section .itemImage").not(".updateImage").createModuleThumbnails();
    }, 1000);
});

$(document).ready(function () {
    // Initialize.
    $.fn.initializeModules();
    $.fn.updateCommentCount();

    if (typeof Sys != "undefined" && typeof Sys.WebForms != "undefined") {
        // After AJAX call.
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function (sender, e) {
            $.fn.initializeModules();
            $.fn.updateCommentCount();

            // Create thumbnails.
            setTimeout(function () {
                $(".section .itemImage").not(".updateImage").createModuleThumbnails();
            }, 1000);
        });
    }
});

$.fn.updateCommentCount = function () {
    if ($("html").attr("class").indexOf("item-") !== -1) {
        if ($(".ItemCommentCount").length > 0 && $("input[id$='_hidCommentCount']").length > 0) {
            var totalCommentCount = $("input[id$='_totalCommentCount']").val(),
                currentCommentCount = $("input[id$='_hidCommentCount']").val();

            $(".ItemCommentCount a").html(
                totalCommentCount +
                    '<span class="screenReaderContent"> ' +
                    (totalCommentCount == 1
                        ? settings.various.commentText.toLowerCase()
                        : settings.various.commentsText.toLowerCase()) +
                    "</span>"
            );

            if ($(".comments-title").length > 0)
                $(".comments-title").text(
                    $(".ItemCommentCount a").text() +
                        " (" +
                        currentCommentCount +
                        " " +
                        settings.various.shownText +
                        ")"
                );
        }
    }
};

// Initialize modules.
$.fn.initializeModules = function () {
    // Username in title.
    if (settings.section.showFirstNameInTitle) {
        if ($("h1.sectionTitle").length > 0 && $("h1.sectionTitle").text().indexOf("{firstName}") != -1) {
            var sectionTitle = $("h1.sectionTitle"),
                docTitle = document.title;

            if (settings.user.ID <= 0) {
                sectionTitle.text(sectionTitle.text().replace(" {firstName}", ""));
                docTitle = docTitle.replace(" firstName", "");
            } else {
                var decodedFirstName = $("<div />").html(settings.user.firstName).text();
                sectionTitle.text(sectionTitle.text().replace("{firstName}", decodedFirstName));
                docTitle = docTitle.replace("firstName", decodedFirstName);
            }

            document.title = docTitle;
        }
    }

    // Section options.
    if (
        ($(".sectionOptions").find("a, input").length > 0 &&
            $(".sectionOptions").find(".button a, .button input").length >
                $(".sectionOptions").find(".button.hide a, .button.hide input").length) ||
        $(".sectionOptions").find("select").length > 0
    ) {
        $(".sectionTitle").removeClass("moreMargin");

        // Search.
        if ($(".sectionOptions .search").length > 0) {
            $(".sectionOptions .search").initializeSearch();

            $(".sectionOptions .tagSearchLink")
                .off("click")
                .on("click", function () {
                    $(this).attr(
                        "href",
                        "/shortcuts/search_search.aspx?tag=" + $(".sectionOptions .search input:text").val()
                    );
                });

            $(".sectionOptions .search .button.icon-search").on("click", function () {
                $(this).addClass("hide");
                $(".sectionOptions .search input:text").showSearchAnim();
            });

            // No results.
            if (
                $(".sectionContent .item:not(.noSearchResults)").length == 0 &&
                $(".sectionContent .item.noSearchResults").length > 0 &&
                $(".sectionOptions .search input:text").val() != "" &&
                $(".sectionOptions .search input:text").val() != settings.fields.searchFieldText
            ) {
                var searchInput = $(".sectionOptions .search input:text");

                $(".noSearchResults").html($(".noSearchResults").html().replace("{0}", searchInput.val()));
                $(".noSearchResults").removeClass("hide").attr("role", "status");
                $(".sectionContent .paging").addClass("hide");
            }
        }

        // Sorter.
        if ($(".sectionOptions .sorter").length > 0) {
            var sorter = $(".sectionOptions .sorter"),
                sorterName = $(this).prop("name");

            sorter
                .parents(".sortByWrapper")
                .find(".applySorting input")
                .off("click")
                .on("click", function () {
                    __doPostBack(sorterName, "");
                });
            sorter
                .parents(".sortByWrapper")
                .find(".applySorting input")
                .off("click")
                .on("click", function () {
                    __doPostBack(sorterName, "");
                });
        }

        // Tag filter.
        if ($(".sectionOptions .tagFilter").length > 0) {
            var tagFilter = $(".sectionOptions .tagFilter"),
                tagFilterName = $(this).prop("name");

            if ($(".sectionOptions .button.applyTagFilter").length == 0) {
                var tagFilterButton = $("<div />").addClass("button applyTagFilter icon-awesome-filter before");
                var tagFilterButtonInput = $("<input />")
                    .prop("type", "button")
                    .prop("aria-label", settings.buttons.filterByTagText)
                    .val(settings.buttons.filterByText);

                tagFilterButtonInput.off("click").on("click", function () {
                    if (isNumeric(tagFilter.val())) __doPostBack(tagFilterName, "");
                    else document.location.href = "?filter=" + encodeURIComponent(tagFilter.val());
                });

                tagFilterButton.append(tagFilterButtonInput);
                tagFilterButton.insertAfter(tagFilter);
            }

            // Select tag filter by querystring.
            if (
                $(".section").data("tag-filter-initialized") == undefined &&
                $.fn.getQueryString("filter") != "" &&
                tagFilter.find("option:selected").val() == -1
            ) {
                var selectedTag = $.fn.getQueryString("filter").toLowerCase();
                var selectedTagValue = -1;

                tagFilter.find("option").each(function () {
                    if (selectedTagValue != -1) return;

                    if ($(this).val().toLowerCase() == selectedTag || $(this).text().toLowerCase() == selectedTag)
                        selectedTagValue = $(this).val();
                });

                if (selectedTagValue && selectedTagValue != -1 && $(this).find("option:selected") != selectedTagValue) {
                    $(".section").data("tag-filter-initialized", true);
                    tagFilter.val(selectedTagValue);
                    tagFilter.trigger("change");
                }
            }
        }

        // Category filter.
        if ($(".sectionOptions .categoryFilter").length > 0) {
            var categoryFilter = $(".sectionOptions .categoryFilter");

            if ($.fn.getQueryString("category") != "") {
                var selectedCat = $.fn.getQueryString("category");
                $(".sectionOptions .categoryFilter option[value='" + selectedCat + "']").prop("selected", true);
            }

            if ($(".sectionOptions .button.applyCategoryFilter").length == 0) {
                var categoryFilterButton = $("<div />").addClass(
                    "button applyCategoryFilter icon-awesome-filter before"
                );
                var categoryFilterButtonInput = $("<input />")
                    .prop("type", "button")
                    .prop("aria-label", settings.buttons.filterByCategoryText)
                    .val(settings.buttons.filterByText);

                categoryFilterButtonInput.off("click").on("click", function () {
                    document.location.href = "?category=" + encodeURIComponent(categoryFilter.val());
                });

                categoryFilterButton.append(categoryFilterButtonInput);
                categoryFilterButton.insertAfter(categoryFilter);
            }
        }

        $(".sectionOptions").removeClass("hide");
    }

    // View options.
    if ($(".section").length > 0) {
        var vtButton = $(".viewOptions .button.viewToggle"),
            vtButtonViewType = vtButton.data("view-type"),
            vtButtonThumbnailSize = vtButton.data("view-thumbnail-size"),
            viewTypeLabel = "",
            chosenViewType = "";

        if ($("#users.section").length > 0) {
            if (vtButtonViewType == "list-view") viewTypeLabel = settings.various.usersListCompleteText;
            else if (vtButtonViewType == "grid-view") viewTypeLabel = settings.various.usersListCompactText;
        } else if ($("#documents-v3.section").length > 0) {
            if (vtButtonViewType == "list-view") viewTypeLabel = settings.various.filesListCompleteText;
            else if (vtButtonViewType == "grid-view") viewTypeLabel = settings.various.filesListCompactText;
        }

        if ($(".section").hasClass("list-view")) {
            $(".button.viewToggle")
                .removeClass("icon-list")
                .addClass("icon-layout")
                .attr("data-view-type", "grid-view")
                .attr("data-view-thumbnail-size", "mini");

            if ($("#users.section").length > 0) {
                $(".button.viewToggle a").attr("aria-label", settings.various.usersListCompleteText);
                $(".button.viewToggle a span").text(settings.various.usersListCompleteText);
            } else if ($("#documents-v3.section").length > 0) {
                $(".button.viewToggle a").attr("aria-label", settings.various.filesListCompleteText);
                $(".button.viewToggle a span").text(settings.various.filesListCompleteText);
            }
        } else if ($(".section").hasClass("grid-view")) {
            $(".button.viewToggle")
                .removeClass("icon-layout")
                .addClass("icon-list")
                .attr("data-view-type", "list-view")
                .attr("data-view-thumbnail-size", "micro");

            if ($("#users.section").length > 0) {
                $(".button.viewToggle a").attr("aria-label", settings.various.usersListCompactText);
                $(".button.viewToggle a span").text(settings.various.usersListCompactText);
            } else if ($("#documents-v3.section").length > 0) {
                $(".button.viewToggle a").attr("aria-label", settings.various.filesListCompactText);
                $(".button.viewToggle a span").text(settings.various.filesListCompactText);
            }
        }

        if ($(".section").hasClass("grid-view")) chosenViewType = settings.various.completeListText;
        else if ($(".section").hasClass("list-view")) chosenViewType = settings.various.compactListText;

        if ($(".chosenViewLabel.screenReaderContent").length > 0)
            $(".chosenViewLabel.screenReaderContent").text(settings.events.chosenViewText + " " + chosenViewType);
        else
            $(".sectionOptions .viewOptions").prepend(
                '<span class="chosenViewLabel screenReaderContent">' +
                    settings.events.chosenViewText +
                    " " +
                    chosenViewType +
                    "</span>"
            );

        // Initialize.
        if ($(".section").hasClass(vtButtonViewType)) {
            if (typeof vtButtonThumbnailSize != "undefined") {
                if ($(".section").hasClass("list-view"))
                    $(".itemImage").removeClass("micro mini small medium large").addClass("micro");
                else if ($(".section").hasClass("grid-view"))
                    $(".itemImage").removeClass("micro mini small medium large").addClass("mini");
            }
        }

        $(".viewOptions .button.viewToggle")
            .off("click")
            .on("click", function () {
                var vtBtn = $(this);

                // Reset.
                $(".section").removeClass("grid-view list-view");

                // Set view type.
                $(".section").addClass(vtBtn.attr("data-view-type"));

                if ($(".section").hasClass("grid-view")) chosenViewType = settings.various.completeListText;
                else if ($(".section").hasClass("list-view")) chosenViewType = settings.various.compactListText;

                $(".chosenViewLabel.screenReaderContent").text(settings.events.chosenViewText + " " + chosenViewType);

                vtButtonViewType = vtBtn.attr("data-view-type");

                if (vtBtn.hasClass("icon-layout")) {
                    vtBtn.removeClass("icon-layout").addClass("icon-list");
                    vtBtn.attr("data-view-type", "list-view");
                } else {
                    vtBtn.removeClass("icon-list").addClass("icon-layout");
                    vtBtn.attr("data-view-type", "grid-view");
                }

                if ($("#users.section").length > 0) {
                    if (vtButtonViewType == "list-view") viewTypeLabel = settings.various.usersListCompleteText;
                    else if (vtButtonViewType == "grid-view") viewTypeLabel = settings.various.usersListCompactText;

                    if (vtBtn.hasClass("icon-layout")) {
                        vtBtn.attr("data-view-thumbnail-size", "mini");
                        vtButtonThumbnailSize = "mini";
                    } else {
                        vtBtn.attr("data-view-thumbnail-size", "small");
                        vtButtonThumbnailSize = "small";
                    }
                } else if ($("#documents-v3.section").length > 0) {
                    if (vtButtonViewType == "list-view") viewTypeLabel = settings.various.filesListCompleteText;
                    else if (vtButtonViewType == "grid-view") viewTypeLabel = settings.various.filesListCompactText;

                    if (vtBtn.hasClass("icon-layout")) {
                        vtBtn.attr("data-view-thumbnail-size", "micro");
                        vtButtonThumbnailSize = "micro";
                    } else {
                        vtBtn.attr("data-view-thumbnail-size", "mini");
                        vtButtonThumbnailSize = "mini";
                    }
                }

                vtBtn.find("a").attr("aria-label", viewTypeLabel);
                vtBtn.find("a .screenReaderContent").text(viewTypeLabel);

                if (typeof vtButtonThumbnailSize != "undefined") {
                    $(".itemImage").removeClass("micro mini small medium large").addClass(vtButtonThumbnailSize);

                    $(".itemImage").createModuleThumbnails();
                }

                return false;
            });

        // EP view switch.
        $(".sectionOptions .viewSwitchDropdown").attr(
            "title",
            $(".sectionOptions .viewSwitchDropdown option:selected").text()
        );

        if (
            $("div[id$='_pnleParticipationViewOptionsBar']").length > 0 &&
            $("select[id$='_ddleParticipationViewSelector']").length > 0
        )
            $("select[id$='_ddleParticipationViewSelector']").insertBefore($(".sectionViewOptions .sectionFilters"));

        if ($(".viewOptions.userSwitch").length > 0 && $(".sectionFilters").length > 0)
            $(".viewOptions.userSwitch").insertAfter($(".sectionFilters"));

        // Show search, view, sort & filter options.
        if (
            $(
                ".sectionContent .item, .sectionContent .eventItem, .sectionContent .map, #forum .sectionContent .listAlternative .row, #faq .sectionContent .list .row"
            ).length > 0
        )
            $(".sectionOptions .sectionOption").removeClass("hide");
    }

    // List items.
    $(".section .item, .section .gridItem, .section .list .row, .section .listAlternative .row").each(function () {
        var item = $(this);
        var itemLink = item.find(".itemTitle a, a.itemTitle, a.itemTitleLink");
        var itemImage = item.find(".itemImage");
        var deleteButton = item.find(".toolbar").find(".button.delete a, .button.delete input, .dropDown a.delete");

        // Search.
        if ($("#search").length > 0) {
            if (item.find(".itemTitleLink").length > 0) {
                // Hide section title.
                itemLink.eq(0).addClass("hide");

                // Show path.
                item.find(".itemPath").removeClass("hide");

                // Set item link.
                itemLink = itemLink.eq(1);

                // Check description length.
                if (item.find(".itemDescription span:first").html().length > 0)
                    item.find(".itemDescription").removeClass("hide");

                // Icon.
                var itemIcon = "icon-layout";

                if (itemLink.html().indexOf(".") > -1) {
                    // File icon.
                    itemIcon = "icon-awesome-file-" + $.fn.getFileType(itemLink.html().split(".").pop());
                }

                // Change icon.
                item.find(".itemImage .noImage").removeClass("icon-doc-text").addClass(itemIcon);
            }

            var searchTitle = item.find(".itemTitle a").not(".hide").html();
            var itemImage = item.find(".itemImage");
            //var searchTerm = getUrlParameter('search');

            item.find(".searchTitle").html(searchTitle);
            itemImage.removeAttr("title").css("cursor", "default");

            item.find(".itemDescription > p").html(
                item
                    .find(".itemDescription > p")
                    .html()
                    .replace(/<\/?([b-z]+)[^>]*>/gi, function (match, tag) {
                        return tag === "a" ? match : "";
                    })
            );
        }

        // Change image sizes, depending on chosen layout.
        if (
            $(
                ".six.columns .section, .nine.columns .section, .ten.columns .section, .eleven.columns .section, .twelve.columns .section"
            ).length == 0 &&
            itemImage.hasClass("medium")
        ) {
            // Replace medium images for small images.
            itemImage.removeClass("medium").addClass("small");
        }

        // Read more (avatar).
        if (item.find(".itemInformation .author").is("a")) {
            item.find(".itemInformation .avatar")
                .off("click")
                .on("click", function () {
                    document.location.href = item.find(".itemInformation .author").attr("href");

                    return false;
                })
                .addClass("pointer");
        }

        // Read more (description).
        if (itemLink.attr("href") != undefined) {
            var elementToClick = item.find(".itemDescription");

            if ($("#users.section").length > 0) {
                elementToClick = item;
            }

            elementToClick
                .off("click")
                .on("click", function (event) {
                    // Keep other links in container clickable.
                    if (event.target.nodeName != "A" && event.target.nodeName != "INPUT") {
                        document.location.href = itemLink.attr("href");

                        return false;
                    }
                })
                .addClass("pointer");
        }

        // Item image.
        if (itemImage.find(".toolbar .button a, .toolbar .button input").length > 0) {
            // Sign up, voting, etc.
            itemImage.removeAttr("title");
            itemImage.find(".itemImageLink").removeAttr("href").css("cursor", "default");
            itemImage.find(".noImage").addClass("hide");
            itemImage.find(".toolbar").removeClass("hide").show();
        } else {
            // Read more (image).
            if (itemLink.attr("href") != undefined) {
                itemImage
                    .off("click")
                    .on("click", function () {
                        document.location.href = itemLink.attr("href");

                        return false;
                    })
                    .addClass("pointer");
            }
        }

        // Delete buttons (with or without Webguidelines enabled).
        if (deleteButton.length > 0) {
            if (
                typeof $._data(deleteButton[0], "events") != "undefined" &&
                isArray($._data(deleteButton[0], "events").click)
            ) {
                // Delete warning.
                $._data(deleteButton[0], "events").click[0].handler = function () {
                    var recurID = $(this).parent().data("recurrence-id");

                    if ($(".sectionContent .list").length > 0)
                        var itemTitle = trim($(this).closest(".row").find(".itemTitleLink").text());
                    else var itemTitle = trim($(this).closest(".item").find(".itemTitle").text());

                    if (recurID != undefined && recurID > 0)
                        return $(this).confirm(settings.warnings.deleteRecurringItemText);
                    else
                        return $(this).confirm(
                            settings.warnings.deleteItemText
                                .replace("{0}", '"<span class="strong">' + itemTitle + '</span>"')
                                .replace("{1}", settings.cms.daysInTrash)
                        );
                };
            } else {
                // Delete warning.
                deleteButton.on("click", function () {
                    var recurID = $(this).parent().data("recurrence-id");

                    if ($(".sectionContent .list").length > 0)
                        var itemTitle = trim($(this).closest(".row").find(".itemTitleLink").text());
                    else var itemTitle = trim($(this).closest(".item").find(".itemTitle").text());

                    if (recurID != undefined && recurID > 0)
                        return $(this).confirm(settings.warnings.deleteRecurringItemText);
                    else
                        return $(this).confirm(
                            settings.warnings.deleteItemText
                                .replace("{0}", '"<span class="strong">' + itemTitle + '</span>"')
                                .replace("{1}", settings.cms.daysInTrash)
                        );
                });
            }
        }

        // Item comment fields.
        item.find(".addItemComment").initializeItemCommentFields();

        // Comment count.
        if (itemLink.attr("href") != undefined) {
            var itemTitle = trim($(this).closest(".item").find(".itemTitle").text());
            item.find(".commentCount").attr("title", settings.various.commentsOnItemText + ' "' + itemTitle + '"');

            item.find(".commentCount, .addComment, .itemCommentCount")
                .off("click")
                .on("click", function () {
                    document.location.href = itemLink.attr("href") + "#comments";

                    return false;
                });
        }

        // Sticky.
        if (item.find(".sticky").length > 0 && item.find(".sticky").html() != "")
            item.find(".icon").removeClass().addClass("icon icon-awesome-pin before");
    });

    // Comment count (item).
    if ($(".currentCommentCount input").length > 0) {
        var currentCommentCount = parseInt($(".currentCommentCount input").val()),
            totalCommentCount = parseInt(
                $(".addCommentCount").data("total-comment-count") || $(".addCommentCount").html()
            ),
            commentsText = settings.various.commentsText.toLowerCase();

        if (currentCommentCount == 1) commentsText = settings.various.commentText.toLowerCase();

        if (totalCommentCount > currentCommentCount)
            currentCommentCount = currentCommentCount + " " + settings.various.offText + " " + totalCommentCount;

        $(".addCommentCount").html(currentCommentCount).data("total-comment-count", totalCommentCount);
        $(".addCommentCountText").html(commentsText);
    }

    if ($("span[id$='_itemCommentCount']").length > 0 && $("input[id$='_hidCommentCount']").length > 0) {
        var totalCommentCount = $("span[id$='_itemCommentCount'] a").text(),
            currentShownCommentCount = $("input[id$='_hidCommentCount']").val(),
            commentCountText =
                totalCommentCount + " (" + currentShownCommentCount + " " + settings.various.shownText + ")";

        if ($("#comments").length > 0 && $(".comments-title").length == 0) {
            var commentsTitle = $("<h3 />");
            commentsTitle.addClass("comments-title");

            $("#comments").prepend(commentsTitle);
        }

        $(".comments-title").text(commentCountText);
    }

    // Updates.
    $(".widget-updates")
        .find(".update")
        .each(function () {
            $(this).createClickableLinks();
        });

    // Message.
    if ($(".showMessage").length > 0) {
        $(".showMessage").each(function () {
            var showMessage = $(this);

            if (showMessage.find("input:checkbox").is(":checked") && showMessage.data("message") != undefined)
                $("body").showMessage({ content: showMessage.data("message") });
        });
    }

    // Polls.
    $(".question[data-poll-id]").each(function () {
        var currentPoll = $(this);

        currentPoll.find("input[type='submit']").on("click", function () {
            $.fn.setPollVote(currentPoll, currentPoll.attr("data-poll-id"));
        });
    });

    // Publish date.
    if ($("#documents-v3").length === 0) $(".item, .gridItem, .timelineItem").initializeScheduledPublishDate();

    if ($("#forms.section").length > 0) $(".list .row:not(.header)").initializeScheduledPublishDate();

    // Init section filters
    if ($(".sectionFilters").length > 0) {
        $.fn.initializeSectionFilters();

        if (typeof Sys != "undefined" && typeof Sys.WebForms != "undefined") {
            // After AJAX call.
            Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function (sender, e) {
                $.fn.initializeSectionFilters();
            });
        }
    }

    $.fn.initializeListViewPaging();
};

// Create paging for Mett List Viw
$.fn.initializeListViewPaging = function () {
    $("[data-pages][data-current-page]").each(function () {
        var listView = $(this);
        var paging = listView.find(".paging");
        var pages = listView.data("pages");
        var currentPage = listView.data("current-page");
        var targetPageInput = listView.find(".targetPage");
        var pageNumberButton = listView.find(".pageNumberButton");

        var buildPageNumber = function (pageIndex) {
            var pageNumber = $("<li>");
            pageNumber.addClass("pageNumber");

            if (pageIndex === "...") {
                pageNumber.text("...");
                return pageNumber;
            }

            var pageNumberLink = $("<a>");
            pageNumberLink.attr("href", "#page_" + pageIndex);
            pageNumberLink.text(pageIndex + 1);
            pageNumberLink.attr("aria-label", settings.documents.pageText + " " + (pageIndex + 1));
            pageNumberLink.data("page-target", pageIndex);
            pageNumber.append(pageNumberLink);

            if (pageIndex === currentPage) {
                pageNumberLink.wrap("<strong>");
                pageNumberLink.attr("aria-current", "page");
            }

            pageNumberLink.on("click", function () {
                targetPageInput.val($(this).data("page-target"));
                pageNumberButton[0].click();
                return false;
            });

            return pageNumber;
        };

        if (pages < 2 || paging.length === 0 || targetPageInput.length === 0 || pageNumberButton.length === 0) return;

        if (pages <= 10) {
            for (var i = 0; i < pages; i++) {
                var pageNumber = buildPageNumber(i);
                paging.append(pageNumber);
            }
        } else {
            var pageNumbers = [];
            var startNumber = Math.max(currentPage - 6, 0);
            var endNumber = Math.min(startNumber + 9, pages - 1);

            for (var i = startNumber; i <= endNumber; i++) {
                pageNumbers.push(i);
            }

            if (pageNumbers.indexOf(1) === -1) {
                if (pageNumbers.indexOf(2) === -1) pageNumbers.unshift("...");
                else pageNumbers.unshift(1);
            }

            if (pageNumbers.indexOf(0) === -1) pageNumbers.unshift(0);

            if (pageNumbers.indexOf(pages - 2) === -1) {
                if (pageNumbers.indexOf(pages - 3) === -1) pageNumbers.push("...");
                else pageNumbers.push(pages - 2);
            }

            if (pageNumbers.indexOf(pages - 1) === -1) pageNumbers.push(pages - 1);

            for (var i = 0; i < pageNumbers.length; i++) {
                var pageNumber = buildPageNumber(pageNumbers[i]);
                paging.append(pageNumber);
            }
        }

        paging.removeClass("hide");
    });
};

// Create module image thumbnails.
$.fn.createModuleThumbnails = function () {
    $(this).each(function () {
        var itemImage = $(this);

        // Medium or small images.
        if (
            itemImage.find("img").length > 0 &&
            (itemImage.hasClass("medium") ||
                itemImage.hasClass("small") ||
                itemImage.hasClass("mini") ||
                itemImage.hasClass("micro"))
        ) {
            var img = itemImage.find("img");

            function imgLoaded() {
                if (img[0].complete) imgComplete();
                else img.on("load", imgLoaded);
            }

            function imgComplete() {
                var thumbnailWidth = 0,
                    thumbnailHeight = 0;

                itemImage.addClass("hasImage").removeClass("hide");
                itemImage.find(".noImage").addClass("hide");

                if (itemImage.data("thumbnail-width") != undefined) thumbnailWidth = itemImage.data("thumbnail-width");

                if (itemImage.data("thumbnail-height") != undefined)
                    thumbnailHeight = itemImage.data("thumbnail-height");

                // Medium.
                if (itemImage.hasClass("medium")) {
                    if (thumbnailHeight == 0) thumbnailHeight = settings.images.mediumThumbnailHeight;

                    // Create medium thumbnail.
                    itemImage.find("img").nailthumb({
                        preload: false,
                        nostyle: true,
                        height: thumbnailHeight,
                        fitDirection: "center center",
                        maxEnlargement: 1,
                    });
                }

                // Small.
                if (itemImage.hasClass("small")) {
                    if (thumbnailWidth == 0) thumbnailWidth = settings.images.smallThumbnailWidth;

                    if (thumbnailHeight == 0) thumbnailHeight = settings.images.smallThumbnailHeight;

                    // Create small thumbnail.
                    itemImage.find("img").nailthumb({
                        preload: false,
                        nostyle: true,
                        width: thumbnailWidth,
                        height: thumbnailHeight,
                        fitDirection: "center center",
                        maxEnlargement: 1,
                    });
                }

                // Mini.
                if (itemImage.hasClass("mini")) {
                    if (thumbnailWidth == 0) thumbnailWidth = settings.images.miniThumbnailWidth;

                    if (thumbnailHeight == 0) thumbnailHeight = settings.images.miniThumbnailHeight;

                    // Create mini thumbnail.
                    itemImage.find("img").nailthumb({
                        preload: false,
                        nostyle: true,
                        width: thumbnailWidth,
                        height: thumbnailHeight,
                        fitDirection: "center center",
                        maxEnlargement: 1,
                    });
                }

                // Micro
                if (itemImage.hasClass("micro")) {
                    if (thumbnailWidth == 0) thumbnailWidth = settings.images.microThumbnailWidth;

                    if (thumbnailHeight == 0) thumbnailHeight = settings.images.microThumbnailHeight;

                    // Create micro thumbnail.
                    itemImage.find("img").nailthumb({
                        preload: false,
                        nostyle: true,
                        width: thumbnailWidth,
                        height: thumbnailHeight,
                        fitDirection: "center center",
                        maxEnlargement: 1,
                    });
                }

                if (img.width() > img.height()) itemImage.addClass("landscape");
                else if (img.width() < img.height()) itemImage.addClass("portrait");

                // Fix item image alt texts
                if (
                    itemImage.parent().find(".itemTitle").find("a").length > 0 &&
                    itemImage.find(".itemImageLink").length > 0
                ) {
                    var itemTitle = trim(itemImage.parent().find(".itemTitle").text());

                    itemImage
                        .find(".nailthumb-image")
                        .attr(
                            "alt",
                            settings.section.viewItemFirstPartText +
                                " '" +
                                itemTitle +
                                "' " +
                                settings.section.viewItemLastPartText
                        );
                }
            }

            imgLoaded();
        }
    });
};

// Item comment fields.
$.fn.initializeItemCommentFields = function () {
    $(this).each(function () {
        var inputField = $(this).find("textarea");
        var submitButton = $(this).find("input:submit");

        // Reset.
        inputField.val(settings.fields.commentFieldText);

        inputField.on("focus", function () {
            if (inputField.val() == settings.fields.commentFieldText) {
                inputField.val("");
            }
        });

        inputField.on("blur", function () {
            if (inputField.val() == "") {
                inputField.stop(true);
                inputField.val(settings.fields.commentFieldText);
            }
        });

        submitButton.on("click", function () {
            var errors = [],
                commentFieldText;

            if ($("#documents-v3").length > 0) {
                var commentFieldContainer = submitButton.parent().parent().siblings(".mtaContainer");
                commentFieldText = trim(commentFieldContainer.find("textarea").val());
            } else commentFieldText = trim($("#addComment .editor iframe").contents().find("body").text());

            if (commentFieldText == "" || commentFieldText == settings.fields.commentFieldText)
                errors.push(settings.errors.noCommentText + " (500.24)");

            if (!$.fn.mettHCaptchaIsValid()) errors.push(settings.errors.invalidHCaptchaText + " (500.106)");

            if (errors.length > 0) {
                $.fn.showError(errors.join("<br />"));

                return false;
            }
        });

        // Initialize user tagging.
        if ($("#groups").length > 0 || $("#documents-v3").length > 0) inputField.mentionTextArea();
    });
};

// Scheduled publish date.
$.fn.initializeScheduledPublishDate = function () {
    var items = $(this);

    if (items === undefined || settings.section.isAdd || settings.section.isEdit) return;

    items.each(function () {
        var item = $(this),
            publishDate = item.data("date-visible"),
            publishDateFormat = "YYYY-MM-DD H:mm",
            publishDateTextFormat =
                (settings.language === "en" ? "MMMM DD, YYYY [" : "DD-MM-YYYY [") +
                settings.various.timeText +
                "] H:mm";

        if (!publishDate || publishDate === "") return;

        publishDate = trim(publishDate);

        var publishDateText = moment(publishDate, publishDateFormat).format(publishDateTextFormat);

        var itemScheduled = $("<span />");
        itemScheduled.addClass("itemScheduled");
        itemScheduled.prop("title", settings.various.scheduledItemText + " " + publishDateText);

        if (!item.hasClass("row")) itemScheduled.text(publishDateText);

        var itemImage = item.find(".itemImage");
        var itemTitle = item.find(".itemTitle");

        if (moment(publishDate, publishDateFormat) > moment()) {
            if (item.hasClass("row")) item.find(".two.columns:eq(0)").prepend(itemScheduled);
            else {
                if (itemImage.find(".image").length > 0 || itemImage.find(".noImage").length > 0) {
                    if (itemImage.hasClass("small") || itemImage.hasClass("mini") || itemImage.hasClass("micro"))
                        itemTitle.prepend(itemScheduled);
                    else itemImage.prepend(itemScheduled);
                } else itemTitle.prepend(itemScheduled);
            }
        }
    });
};

$.fn.initializeSectionFilters = function () {
    var sectionFiltersButton = document.querySelector("#sectionFiltersButton"),
        sectionFilterOptions = document.querySelector("#sectionFilterOptions");

    $(".sectionFilters > .button")
        .off("click")
        .on("click", function (e) {
            e.preventDefault();

            if ($(sectionFiltersButton).hasClass("filtersActive")) $(sectionFiltersButton).removeClass("filtersActive");
            else $(sectionFiltersButton).addClass("filtersActive");

            if ($(sectionFilterOptions).hasClass("visible")) $(sectionFilterOptions).removeClass("visible");
            else $(sectionFilterOptions).addClass("visible");

            if ($(this).hasClass("filtersActive")) {
                $(this).find("> a").attr("aria-expanded", "true");
                $(this).find("> a .screenReaderContent").text(settings.buttons.hideText.toLowerCase());

                $(document)
                    .off("click")
                    .on("click", function (event) {
                        if (
                            !sectionFilterOptions.contains(event.target) &&
                            !sectionFiltersButton.contains(event.target)
                        ) {
                            hideSectionFiltersPopup();
                        }
                    });

                $("body").on("keydown", function (e) {
                    if (e.keyCode == 27 && $(sectionFiltersButton).hasClass("filtersActive")) hideSectionFiltersPopup();
                });
            } else {
                $(this).find("> a").attr("aria-expanded", "false");
                $(this).find("> a .screenReaderContent").text(settings.buttons.showText.toLowerCase());
            }
        });

    function hideSectionFiltersPopup() {
        $("#sectionFilterOptions").removeClass("visible");
        $("#sectionFiltersButton").removeClass("filtersActive");
        $("#sectionFiltersButton > a").attr("aria-expanded", "false");
        $("#sectionFiltersButton > a .screenReaderContent").text(settings.buttons.showText.toLowerCase());
    }

    if ($(".sectionOptions .tagFilter").length === 0) {
        $(".sectionFilterOptions .tagPickerWrapper").addClass("hide");
        $(".sectionFilterOptions .tagPickerWrapper label").remove();
    }

    if ($(".sectionOptions .categoryFilter").length === 0) {
        $(".sectionFilterOptions .mapCategoryPickerWrapper").addClass("hide");
        $(".sectionFilterOptions .mapCategoryPickerWrapper label").remove();
    }

    if ($("#users.section").length > 0) {
        if ($(".sectionOptions input[id$=_txtSearchCriteria]").length === 0)
            $(".sectionFilterOptions .searchCriteriaWrapper").addClass("hide");

        if ($(".sectionOptions .filterUsers.establishments").length === 0)
            $(".sectionFilterOptions .establishmentWrapper").addClass("hide");

        if ($(".sectionOptions .filterUsers.sortBy").length === 0)
            $(".sectionFilterOptions .sortByWrapper").addClass("hide");

        if ($(".sectionOptions .filterUsers.sortOrder").length === 0)
            $(".sectionFilterOptions .sortOrderWrapper").addClass("hide");

        if ($(".sectionOptions .filterUsers.filterUserFollowing").length === 0)
            $(".sectionFilterOptions .filterUserFollowingWrapper").addClass("hide");
    }

    // Add correct 'for' params to labels
    $.each($(".sectionFilterWrapper"), function () {
        var fieldId = "";

        if ($(this).find("> select").length > 0) fieldId = $(this).find("> select").attr("id");
        else if ($(this).find("> div").length > 0) fieldId = $(this).find("> div").attr("id");

        $(this).find("> label").attr("for", fieldId);
    });

    // Check if there are filters active
    var countActiveFilters = 0;
    $.each($(".sectionFilterWrapper select"), function () {
        if ($(this)[0].selectedIndex !== 0 && !$(this)[0].id.includes("_ddlSorter")) countActiveFilters++;
    });

    if (countActiveFilters > 0) {
        // show number of active filters in button
        $(".sectionFilters > .button a").html(
            settings.various.sectionFilterButtonText +
                ' <span class="badge" aria-live="polite">' +
                countActiveFilters +
                '<span class="screenReaderContent">' +
                settings.various.filtersActiveText +
                "</span></span>"
        );
        $(".sectionFilters").css("min-width", "205px");

        // show reset link above filters
        if ($("#sectionFilterOptions .resetFilters").length === 0) {
            var resetFilterContainer = $("<div />").addClass("resetSectionFilters");
            var resetFiltersLink = $("<a />").addClass("resetFilters button transparent icon-cancel before");

            resetFiltersLink.prop("href", "#");
            resetFiltersLink.text(settings.buttons.resetFiltersLinkText);

            resetFiltersLink.off("click").on("click", function (event) {
                $.each($(".sectionFilterWrapper select"), function () {
                    // prevent filter select change events
                    $(this).off("change");

                    // reset filter selects
                    $(this)[0].selectedIndex = 0;

                    // clear url params and reload window
                    var clean_uri = location.protocol + "//" + location.host + location.pathname;
                    window.history.replaceState({}, document.title, clean_uri);
                    location.reload();
                });

                if ($(".section .searchUsers input:submit").length > 0)
                    $(".section .searchUsers input:submit")[0].click();
                else if ($(".section .search .button.icon-search").length > 0) {
                    $(".section .search .button.icon-search a")[0].click();
                    $(".section .search .searchInfoContainer").addClass("hide");
                }

                event.preventDefault();
            });

            resetFilterContainer.append(resetFiltersLink);
            $("#sectionFilterOptions").prepend(resetFilterContainer);
        }
    }

    // All done. Show filters.
    if ($(".sectionFilters select, .selectFilters .customDropDown").length > 0 && $(".mapOnly").length === 0) {
        $(".sectionFilters").removeClass("hide");
    }
};
;
var mettWidgets;
var mettWidgetsLoading = [];

String.prototype.replaceVar = function (aKey, aValue) {
    // Replace template script tags to prevent XSS
    var theValue = aValue.toString().split("[%#").join("[ %#").split("%]").join("% ]");

    var escape = function (input) {
        var output = input;

        output = output
            .split("'")
            .join("\\'")
            .split("&#39")
            .join("\\&#39")
            .replace(/(\r\n|\n|\r)/gm, " ");

        return output;
    };

    var theString = this.split("[*escape:" + aKey + "*]").join(escape(theValue));
    theString = theString.split("[*encode:" + aKey + "*]").join(htmlEncode(theValue));
    theString = theString.split("[*escape-encode:" + aKey + "*]").join(htmlEncode(escape(theValue)));
    theString = theString.split("[*nl2br:" + aKey + "*]").join(theValue.replace(/(\r\n|\n|\r)/gm, "<br />"));
    theString = theString.split("[*closeTags:" + aKey + "*]").join(closeTags(theValue));

    return theString.split("[*" + aKey + "*]").join(theValue);
};

String.prototype.clearVars = function () {
    var theRegEx = new RegExp(
        "\\[\\*(escape:){0,1}(nl2br:){0,1}(encode:){0,1}(escape-encode:){0,1}(closeTags:){0,1}(?:[.a-z0-9_-]|\\[|\\])*\\*\\]",
        "gi"
    );

    return this.replace(theRegEx, "");
};

String.prototype.replaceEach = function (aKey, aValue) {
    var theRegEx = new RegExp(
        "\\[\\%Each(?:\\s*)\\[\\*" + aKey + "\\*](?:\\s*)\\%\\]([\\w\\W\\s\\S]*?)\\[\\%EndEach\\%\\]",
        "gi"
    );

    var theResult = this;
    var replacement = "";

    while ((theMatch = theRegEx.exec(this)) != null) {
        for (var i = 0; i < aValue.length; i++) {
            replacement += theMatch[1]
                .split("[*this.")
                .join("[*" + aKey + "[" + i.toString() + "].")
                .split("[*this*]")
                .join("[*" + aKey + "[" + i.toString() + "]*]");
        }

        theResult = theResult.replace(theMatch[0], replacement);
    }

    return theResult;
};

String.prototype.clearEaches = function () {
    var returnString = this;
    var theStartRegEx = new RegExp(
        "\\[\\%Each(?:\\s*)\\[\\*([^\\*]*)\\*](?:\\s*)\\%\\]([\\w\\W\\s\\S]*?)\\[\\%EndEach\\%\\]",
        "gi"
    );

    returnString = returnString.replace(theStartRegEx, "");

    return returnString;
};

String.prototype.replaceScripts = function () {
    var theRegEx = new RegExp("\\[\\%\\#(.*?)\\%\\]", "gi");

    var theResult = this;

    while ((theMatch = theRegEx.exec(this)) != null) {
        theResult = theResult.replace(
            theMatch[0],
            eval(htmlDecode(theMatch[1].split("&#39;").join("\\&#39;").split("\\\\&#39;").join("\\&#39;")))
        );
    }

    // Needs a .toString()
    // Because when there are no matches, it will be a Primitive String Array in stead of string
    return theResult.toString();
};

Date.prototype.getWeek = function () {
    var d = new Date(+this);
    d.setHours(0, 0, 0, 0);
    d.setDate(d.getDate() + 4 - (d.getDay() || 7));
    return Math.ceil(((d - new Date(d.getFullYear(), 0, 1)) / 8.64e7 + 1) / 7);
};

$(document).ready(function () {
    mettWidgets = $(".mettWidget").not(".wait");

    if (!$("body").hasClass("overlayOpen")) {
        mettWidgets.each(function () {
            // Now you can always get the class by doing $("#myWidget").data("class");
            $($(this).data("class", new Widget($(this))));
        });
    }

    // Initialize after AJAX call.
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function (sender, arguments) {
        if (!$("body").hasClass("overlayOpen")) {
            mettWidgets = $(".mettWidget").not(".wait");

            mettWidgets.each(function () {
                if (typeof $(this).data("class") == "undefined" || $(this).data("class") == null)
                    $($(this).data("class", new Widget($(this))));
            });
        }
    });
});

function Widget(aObject) {
    var theReturnObject = {
        //mBaseUrl: "/api/widget/GetWidgetByCategoryID",
        mBaseUrl: "/api/widget/",
        mObject: null,
        mUrl: null,
        mTemplate: null,
        mItemTemplate: null,
        mNoItemTemplate: null,
        mTemplateVariables: {},
        mApiVariables: {},
        mAutoRefresh: false,
        mRefreshTimeout: null,
        mTemplateCache: {},
        mInitialTopN: 0,
        mLastData: null,
        mCompleteHandlers: [],
        mIsCompleted: false,
        readyToLoadHandler: null,
        delayedLoadInterval: null,

        init: function (aObject) {
            this.mObject = aObject;

            if (this.prepareTemplate() == false) return;

            // Remove unsuported twitter widgets
            if (this.apiVar("type") == "twitter" && this.apiVar("twitterType") == "query") {
                this.mObject.remove();
                return;
            }

            var uniqueID = guid();
            this.apiVar("uniqueID", uniqueID);

            this.mObject.attr("data-uniqueID", uniqueID);
            this.mObject.addClass("rs_skip");

            if (this.mInitialTopN == 0 && typeof this.apiVar("topn") != "undefined")
                this.mInitialTopN = parseInt(this.apiVar("topn"));

            if (this.apiVar("autoHide") == true) this.mObject.hide();

            //if(this.apiVar("autoRefresh") == true)
            //	this.mAutoRefresh = true;

            if (typeof this.apiVar("week") == "undefined" || this.apiVar("week") == null)
                this.apiVar("week", new Date().getWeek());

            if (typeof this.apiVar("month") == "undefined" || this.apiVar("month") == null)
                this.apiVar("month", new Date().getMonth() + 1);

            if (typeof this.apiVar("year") == "undefined" || this.apiVar("year") == null)
                this.apiVar("year", new Date().getFullYear());

            this.loadTemplate();
        },

        //	Getter/setter for a Template var based on key
        templateVar: function (aKey, aValue) {
            if (aValue == null) return this.mTemplateVariables[aKey];

            this.mTemplateVariables[aKey] = aValue;

            return this;
        },

        //	Getter/setter for a API var based on key
        apiVar: function (aKey, aValue) {
            if (aValue == null) return this.mApiVariables[aKey];

            this.mApiVariables[aKey] = aValue;

            return this;
        },

        loadData: function (aHideLoader, aCallback, aForceTemplateReload) {
            var theThis = this;
            clearTimeout(this.mRefreshTimeout);

            if (aHideLoader != true) {
                var theWidgetObject = this.mTemplate.clone();

                theWidgetObject.find(".itemTemplate, .noItemTemplate").remove();

                this.mObject.html(theWidgetObject);
                this.replaceVars();
            }

            if (this.apiVar("type") == "twitter") {
                // can only be called before Twitter is done :'(
                if (typeof aCallback == "function") aCallback(theTwitterObject);

                theThis.onLoad(null, aHideLoader, aForceTemplateReload);
            } else {
                var theUrl = this.buildUrl();
                var dataType = "json";

                if (theUrl == "") return;

                if (this.apiVar("type") == "rss") var dataType = "xml";

                this.onReadyToLoad(function () {
                    mettWidgetsLoading.push(theThis.apiVar("uniqueID"));
                    $.ajax({ url: theUrl, dataType: "json" }).done(function (data) {
                        theThis.onLoad(data, aHideLoader, aForceTemplateReload);

                        mettWidgetsLoading.splice(mettWidgetsLoading.indexOf(theThis.apiVar("uniqueID")), 1);

                        if (typeof aCallback == "function") aCallback(data);
                    });
                });
            }
        },

        loadWhenNeeded: function () {
            if (!this.readyToLoadHandler || !this.shouldLoad())
                return;

            this.onReadyToLoad();
        },

        onReadyToLoad: function (handler) {
            var theThis = this;

            if (handler) {
                if (this.shouldLoad()) {
                    handler();
                } else {
                    this.readyToLoadHandler = handler;
                    $(window).on("DOMContentLoaded load resize scroll", function () {
                        theThis.loadWhenNeeded();
                    });

                    clearInterval(theThis.delayedLoadInterval);

                    this.delayedLoadInterval = setInterval(function () {
                        if (mettWidgetsLoading.length > 0)
                            return;

                        theThis.onReadyToLoad();
                    }, 1000);
                }

                return;
            }

            clearInterval(theThis.delayedLoadInterval);

            if (!this.readyToLoadHandler)
                return;

            this.readyToLoadHandler();
            this.readyToLoadHandler = null;
        },

        shouldLoad: function () {
            var offset = this.mObject.offset();

            if (offset && offset.top - 200 < $(window).height() + $(window).scrollTop())
                return true;
        },

        buildUrl: function () {
            var theUrl = this.mBaseUrl;

            // URL exceptions
            switch (this.apiVar("type")) {
                case "updates":
                case "notifications":
                    theUrl += "GetWidgetUpdates";
                    break;
                case "profilenotifications":
                    theUrl += "GetProfileNotificationsWidget";
                    break;
                case "profilefavorites":
                case "favorites":
                    theUrl += "GetProfileFavoritesWidget";
                    break;
                case "webservice":
                    theUrl += "GetWebserviceApps";
                    break;
                case "birthdays":
                    theUrl += "GetBirthDayWidget";
                    break;
                case "groups":
                    theUrl += "GetWidgetGroups";
                    break;
                case "users":
                    if (this.mApiVariables["showOnlyFollowingUsers"]) theUrl += "GetWidgetFollowers";
                    else if (this.mApiVariables["showOnlyFollowedUsers"]) theUrl += "GetWidgetFollowing";
                    else theUrl += "GetWidgetUsers";
                    break;
                case "rss":
                    if (
                        typeof this.apiVar("url") != "undefined" &&
                        this.apiVar("url") != null &&
                        trim(this.apiVar("url")) != ""
                    )
                        theUrl =
                            "/api/proxy?url=" +
                            encodeURIComponent(this.apiVar("urlProtocol") + this.apiVar("url")) +
                            "&proxyToken=" +
                            generatetUniqueProxyToken() +
                            "&callType=" +
                            this.apiVar("type");
                    else return "";
                    break;
                case "roles":
                    theUrl += "GetWidgetRoles";
                    break;
                case "statistics":
                    theUrl += "GetWidgetStatistics";
                    break;
                case "faq":
                    theUrl += "GetWidgetFAQ";
                    break;
                case "nestedcomments":
                    theUrl += "GetNestedComments";
                    break;
                default:
                    theUrl += "GetWidgetByCategoryID";
                    break;
            }

            // API variable exeptions
            switch (this.apiVar("type")) {
                case "comments":
                    this.apiVar("itemType", 1);
                    break;
                case "events":
                    this.apiVar("itemType", 13);
                    break;
            }

            if (this.apiVar("type") != "rss") {
                theUrl += theUrl.indexOf("?") == -1 ? "?" : "";
                theUrl += this.objectToQueryString(this.mApiVariables).toString();
            }

            theUrl += theUrl.indexOf("?") > -1 ? "&" : "?";
            theUrl += "preventCache=" + new Date().getTime().toString();

            if (theUrl.indexOf("&token") == -1) {
                theUrl += "&token=" + $("input[name='__RequestVerificationToken']").val();
            }

            theUrl += "&loggingId=" + settings.section.ID;

            return theUrl;
        },

        onLoad: function (aResult, aHideLoader, aForceTemplateReload) {
            var theThis = this;
            var theObject = aResult;
            var theWidgetObject = this.mTemplate.clone();
            var theItemsString = "";
            var theNoItemsString = "";
            var theItemIndex = 0;

            if (this.apiVar("type") == "rss") {
                if (typeof theObject == "undefined" || theObject == null) return;

                var theRSSObject = [];
                var theTopN = 5;

                if (typeof theThis.apiVar("topn") != "undefined" && theThis.apiVar("topn") != null)
                    theTopN = parseInt(theThis.apiVar("topn"));

                $($.parseXML(theObject))
                    .find("item")
                    .each(function () {
                        var theCurrentItem = {};

                        $(this)
                            .children()
                            .each(function () {
                                if (this.nodeName != "pubDate") theCurrentItem[this.nodeName] = $(this).text();
                                else theCurrentItem[this.nodeName] = $(this).text().replace(/-/g, "/");
                            });

                        theRSSObject.push(theCurrentItem);
                    });

                theRSSObject.sort(function (item1, item2) {
                    var d1 = new Date(item1.pubDate);
                    var d2 = new Date(item2.pubDate);

                    if (
                        theThis.apiVar("orderBy") === "contentPage_dateVisible DESC" ||
                        theThis.apiVar("orderBy") === ""
                    ) {
                        if (d2.getTime() > d1.getTime()) return 1;
                        if (d2.getTime() < d1.getTime()) return -1;
                    } else if (theThis.apiVar("orderBy") === "contentPage_dateVisible ASC") {
                        if (d2.getTime() < d1.getTime()) return 1;
                        if (d2.getTime() > d1.getTime()) return -1;
                    }
                });

                theObject = theRSSObject.slice(0, theTopN);
            }

            if (this.apiVar("type") == "twitter") {
                if (settings.cookies.allowMarketing) {
                    if ($("#twitterWidgetInclude").length === 0)
                        $("head").append('<script id="twitterWidgetInclude" src="https://platform.twitter.com/widgets.js" charset="utf-8" defer></script>');

                    this.replaceVars();
                } else
                    $(".widget-twitter .noCookieTemplate").removeClass("hide");

                setTimeout(function() {
                    $(".widget-twitter .loadingTemplate").remove();
                }, 1000);
            } else {
                if (typeof theObject == "undefined" || theObject == null) return;

                if (
                    aHideLoader &&
                    !aForceTemplateReload &&
                    JSON.stringify(this.mLastData) === JSON.stringify(theObject)
                ) {
                    if (this.mAutoRefresh) {
                        clearTimeout(this.mRefreshTimeout);
                        this.mRefreshTimeout = setTimeout(function () {
                            theThis.loadData(true);
                        }, settings.widgets.autoRefreshInterval);
                    }

                    return;
                }

                if (theObject.length > 0) {
                    for (var theCurrentItemKey in theObject) {
                        if (this.apiVar("type") == "updates" && theObject[theCurrentItemKey].ItemType == 92)
                            theObject[theCurrentItemKey].Url = window.location.host + "/" + theObject[theCurrentItemKey].Url;

                        var theCurrentItemTemplate = this.mItemTemplate;
                        theCurrentItemTemplate = this.replaceArrayVarsRecursive(
                            theCurrentItemTemplate,
                            theObject[theCurrentItemKey],
                            ""
                        );
                        theCurrentItemTemplate = this.replaceItemVarsRecursive(
                            theCurrentItemTemplate,
                            theObject[theCurrentItemKey],
                            ""
                        );
                        theCurrentItemTemplate = theCurrentItemTemplate.replaceVar("itemIndex", theItemIndex);
                        theCurrentItemTemplate = theCurrentItemTemplate.clearEaches();
                        theCurrentItemTemplate = theCurrentItemTemplate.clearVars();
                        theCurrentItemTemplate = theCurrentItemTemplate.replaceScripts();
                        theCurrentItemTemplate = $(theCurrentItemTemplate).attr(
                            "data-widget-item-index",
                            theItemIndex
                        )[0].outerHTML;

                        theItemsString += theCurrentItemTemplate;

                        theItemIndex++;
                    }

                    if (this.apiVar("autoHide") == true) this.mObject.show();
                } else {
                    if (this.mNoItemTemplate != null) theNoItemsString = this.mNoItemTemplate;

                    if (this.apiVar("autoHide") == true) this.mObject.hide();
                }

                if (theItemsString != "") $(theItemsString).insertAfter(theWidgetObject.find(".itemTemplate"));

                if (theNoItemsString != "") $(theNoItemsString).insertAfter(theWidgetObject.find(".noItemTemplate"));

                theWidgetObject.find(".itemTemplate, .noItemTemplate, .loadingTemplate").remove();

                this.mObject.html(theWidgetObject);
                this.apiVar("count", theObject.length);
                this.replaceVars();

                if (this.apiVar("type") == "birthdays") {
                    this.setWeekButtons();
                    this.setMonthButtons();
                    this.setYearButtons();
                }

                this.mLastData = theObject;
            }

            if (this.mAutoRefresh) {
                clearTimeout(this.mRefreshTimeout);
                this.mRefreshTimeout = setTimeout(function () {
                    theThis.loadData(true);
                }, settings.widgets.autoRefreshInterval);
            }

            if (
                typeof theThis.apiVar("topn") != "undefined" &&
                theObject != null &&
                theObject.length >= parseInt(theThis.apiVar("topn"))
            ) {
                // Show more button.
                this.mObject
                    .find(".button.showMoreItems input, .button.showMoreItems a")
                    .off("click")
                    .on("click", function () {
                        var onLoad = function () {
                            var firstNewItemIndex = theThis.apiVar("topn") - theThis.mInitialTopN;
                            var targetItem = theThis.mObject.find("[data-widget-item-index=" + firstNewItemIndex + "]");

                            if (targetItem.is("a, button, input[type=button], input[type=submit], input[type=reset]")) {
                                targetItem.trigger("focus");
                                return;
                            }

                            targetItem
                                .find("a, button, input[type=button], input[type=submit], input[type=reset]")
                                .trigger("focus");
                        };

                        theThis.apiVar("topn", parseInt(theThis.apiVar("topn")) + theThis.mInitialTopN);
                        theThis.loadData(true, onLoad, true);

                        $(
                            '<div class="loader show" role="status"><span class="screenReaderContent">' +
                                settings.buttons.savingText +
                                "</span></div>"
                        ).insertAfter($(this).parents(".button").first().hide());

                        return false;
                    });

                if (
                    this.mObject.find(".button.restore").length > 0 &&
                    $("#updatesTabContent.tabContent.active").length === 0
                ) {
                    if (this.mObject.find(".button.showMoreItems input").length > 0) {
                        this.mObject.find(".button.showMoreItems input").val(settings.buttons.showMoreTrashItemsText);
                    } else {
                        this.mObject.find(".button.showMoreItems a").html(settings.buttons.showMoreTrashItemsText);
                    }
                }

                this.mObject.find(".button.showMoreItems").parents(".toolbar").removeClass("hide");
            } else this.mObject.find("ul").addClass("toolbarHidden");

            this.mObject.find("input[type=checkbox][data-widget-setting]").each(function () {
                var theObject = $(this);

                if (trim(theObject.attr("data-widget-setting")) == "") return;

                theObject.prop("checked", theThis.apiVar(theObject.attr("data-widget-setting")) == true);

                theObject.on("change", function () {
                    theThis.apiVar(theObject.attr("data-widget-setting"), theObject.is(":checked"));
                    theObject
                        .parent()
                        .html(
                            '<div class="loader show" role="status"><span class="screenReaderContent">' +
                                settings.buttons.savingText +
                                "</span></div>"
                        );
                    theThis.loadData(true, null, true);
                });

                theObject.parent().removeClass("hide");
            });

            // Internet Explorer meuk (fixes nasty checked="checked" bug).
            if ($(".internetexplorer").length > 0) {
                this.mObject.find("input[type=checkbox]").each(function () {
                    if ($(this).data("checked") != undefined) {
                        // Re-initialize checkbox after clone action in processTemplate function.
                        $(this).prop("checked", true);
                    }
                });
            }

            // Switchery.
            this.mObject.find(".field").not(".noSwitchery").find("input[type=checkbox]").initializeSwitchery();

            if (settings.userDialog.instance != null) settings.userDialog.instance.init();

            if (this.mObject.find(".mettCarousel").length > 0)
                this.mObject.find(".mettCarousel").carousel().data("carousel").fitSliderHeight();

            $("a, button, input, [tabindex]").initializeFocus();

            // Create clickable links in updates.
            theThis.mObject
                .find(".updateDescription")
                .not(".updateType-1")
                .each(function () {
                    $(this).createClickableLinks();
                });

            // Restore page button.
            theThis.mObject
                .find(".button.restorePage input")
                .off("click")
                .on("click", function () {
                    if (
                        $(this).confirm(settings.warnings.restorePageTrashText) &&
                        $(this).data("restore-id") != undefined
                    ) {
                        $.ajax({
                            url: "/api/Sections/restoreSection",
                            data: {
                                restoreID: $(this).data("restore-id"),
                                token: $("input[name='__RequestVerificationToken']").val(),
                            },
                        })
                            .done(function () {
                                theThis.loadData();
                            })
                            .fail(function () {
                                $.fn.showError(settings.errors.generalErrorText + " (500.66)", "console");
                            });
                    }
                });

            // Restore item button.
            theThis.mObject
                .find(".button.restoreItem input")
                .off("click")
                .on("click", function () {
                    if (
                        $(this).confirm(settings.warnings.restoreItemTrashText) &&
                        $(this).data("restore-id") != undefined &&
                        $(this).data("item-type") != undefined
                    ) {
                        $.ajax({
                            url: "/api/ContentPages/restoreItem",
                            data: {
                                restoreID: $(this).data("restore-id"),
                                itemType: $(this).data("item-type"),
                                token: $("input[name='__RequestVerificationToken']").val(),
                            },
                        })
                            .done(function () {
                                theThis.loadData();
                            })
                            .fail(function () {
                                $.fn.showError(settings.errors.generalErrorText + " (500.67)", "console");
                            });
                    }
                });

            // Delete page button.
            theThis.mObject
                .find(".button.deletePage input")
                .off("click")
                .on("click", function () {
                    if (
                        $(this).confirm(settings.warnings.deletePageTrashText) &&
                        $(this).data("delete-id") != undefined
                    ) {
                        $.ajax({
                            url: "/api/Sections/deleteSection",
                            data: {
                                deleteID: $(this).data("delete-id"),
                                token: $("input[name='__RequestVerificationToken']").val(),
                            },
                        })
                            .done(function () {
                                theThis.loadData();
                            })
                            .fail(function () {
                                $.fn.showError(settings.errors.generalErrorText + " (500.68)", "console");
                            });
                    }
                });

            // Delete item button.
            theThis.mObject
                .find(".button.deleteItem input")
                .off("click")
                .on("click", function () {
                    if (
                        $(this).confirm(settings.warnings.deleteItemTrashText) &&
                        $(this).data("delete-id") != undefined &&
                        $(this).data("item-type") != undefined
                    ) {
                        $.ajax({
                            url: "/api/ContentPages/deleteItem",
                            data: {
                                deleteID: $(this).data("delete-id"),
                                itemType: $(this).data("item-type"),
                                token: $("input[name='__RequestVerificationToken']").val(),
                            },
                        })
                            .done(function () {
                                theThis.loadData();
                            })
                            .fail(function () {
                                $.fn.showError(settings.errors.generalErrorText + " (500.69)", "console");
                            });
                    }
                });

            // Accept group invitation button.
            theThis.mObject.find(".button.invite.accept input").off("click").on("click", function() {
                if ($(this).parent().data("group-id") != undefined) {
                    $.ajax({
                        url: "/api/user/acceptgroupnotificationregistrationlink",
                        data: {
                            userId: settings.user.ID,
                            groupRoleId: $(this).parent().data("group-id"),
                            token: $("input[name='__RequestVerificationToken']").val(),
                        },
                    }).done(function() {
                        theThis.loadData();
                    }).fail(function() {
                        $.fn.showError(settings.errors.generalErrorText + " (500.68)", "console");
                    });
                }
            });

            // Deny group invitation button.
            theThis.mObject.find(".button.invite.delete input").off("click").on("click", function() {
                if ($(this).parent().data("group-id") != undefined) {
                    $.ajax({
                        url: "/api/user/declinegroupnotificationregistrationlink",
                        data: {
                            userId: settings.user.ID,
                            groupRoleId: $(this).parent().data("group-id"),
                            token: $("input[name='__RequestVerificationToken']").val(),
                        },
                    }).done(function () {
                        theThis.loadData();
                    }).fail(function () {
                        $.fn.showError(settings.errors.generalErrorText + " (500.69)", "console");
                    });
                }
            });

            // Sort favorite up or down.
            theThis.mObject.find(".button.favoriteUp input, .button.favoriteDown input").each(function (i) {
                var button = $(this);

                button.off("click").on("click", function () {
                    if (
                        (button.data("section-id") != undefined || button.data("item-id") != undefined) &&
                        button.data("sort-id") != undefined &&
                        button.data("sort-up") != undefined
                    ) {
                        $.ajax({
                            url: "/api/Notification/SortFavorite",
                            data: {
                                sectionID: button.data("section-id"),
                                contentPageID: button.data("item-id"),
                                sortID: button.data("sort-id"),
                                up: button.data("sort-up"),
                                token: $("input[name='__RequestVerificationToken']").val(),
                            },
                        })
                            .done(function () {
                                theThis.loadData();
                            })
                            .fail(function () {
                                $.fn.showError(settings.errors.generalErrorText + " (500.70)", "console");
                            });
                    }
                });

                // Don't show first up button.
                if (i != 0 && button.parent().hasClass("favoriteUp")) {
                    button.parent().removeClass("hide");
                }

                // Don't show last down button.
                if (
                    i != theThis.mObject.find(".button.favoriteUp input, .button.favoriteDown input").length - 1 &&
                    button.parent().hasClass("favoriteDown")
                ) {
                    button.parent().removeClass("hide");
                }
            });

            // Toggle notifications (in profile).
            theThis.mObject.find(".toggleNotifications").on("change", function () {
                var checkbox = $(this);

                if (checkbox.data("section-id") != undefined || checkbox.data("item-id") != undefined) {
                    $.ajax({
                        url: "/api/Notification/SetNotification",
                        data: {
                            sectionID: checkbox.data("section-id"),
                            contentPageID: checkbox.data("item-id"),
                            status: checkbox.is(":checked"),
                            token: $("input[name='__RequestVerificationToken']").val(),
                        },
                    })
                        .done(function () {
                            checkbox.parent().toggleClass("deleted");
                        })
                        .fail(function () {
                            $.fn.showError(settings.errors.generalErrorText + " (500.71)", "console");
                        });
                }
            });

            // Toggle favorite (in profile).
            theThis.mObject.find(".toggleFavorite").on("change", function () {
                var checkbox = $(this);

                if (checkbox.data("section-id") != undefined || checkbox.data("item-id") != undefined) {
                    $.ajax({
                        url: "/api/Notification/SetFavorite",
                        data: {
                            sectionID: checkbox.data("section-id"),
                            contentPageID: checkbox.data("item-id"),
                            status: checkbox.is(":checked"),
                            token: $("input[name='__RequestVerificationToken']").val(),
                        },
                    })
                        .done(function () {
                            checkbox.parent().toggleClass("deleted");

                            if (checkbox.parents(".widget").find(".field").not(".deleted").length == 0) {
                                // Hide favorites in shortcuts.
                                $("#shortcuts .favorites").parent().addClass("hide");
                            } else {
                                // Show favorites in shortcuts.
                                $("#shortcuts .favorites").parent().removeClass("hide");
                            }
                        })
                        .fail(function () {
                            $.fn.showError(settings.errors.generalErrorText + " (500.72)", "console");
                        });
                }
            });

            theThis.mObject.find(".after.icon-awesome-link-ext").each(function() {
                var extLink = $(this),
                    srcLabel = $("<span />"),
                    iconSpan = $("<span />");

                srcLabel.addClass("screenReaderContent").text(settings.links.opensExternalText);
                iconSpan.addClass("after icon-awesome-link-ext").attr("aria-hidden", "true");

                extLink.removeClass("after icon-awesome-link-ext");
                extLink.append(srcLabel).append(iconSpan);
            });

            // Re-initialize toolbars.
            theThis.mObject.initializeToolbars();

            // Apply cookie settings.
            $("body").applyCookieSettings();

            setWidgetImages(theThis.mObject);

            $.fn.initializeSpacers({ initTopSpacer: false });

            this.complete();
        },

        prepareTemplate: function () {
            var theTempVars;

            if (this.mObject.find(".settings").length > 0) {
                theTempVars = this.mObject.find(".settings").text();

                this.mApiVariables = this.settingsToObject(theTempVars);

                // Template and Api Variables are now initially the same
                this.mTemplateVariables = this.mApiVariables;
            }

            return true;
        },

        loadTemplate: function () {
            var theThis = this;

            if (typeof this.apiVar("skin") != "undefined" && trim(this.apiVar("skin")) != "")
                var theTemplateType = trim(this.apiVar("skin"));
            else var theTemplateType = trim(this.apiVar("type"));

            if (typeof theTemplateType == "undefined" || theTemplateType == null || theTemplateType == "")
                theTemplateType = "items";

            if (typeof this.apiVar("template") != "undefined" && trim(this.apiVar("template")) != "")
                theTemplateType += "_" + trim(this.apiVar("template"));

            if (
                settings.user.follow &&
                settings.user.ID != -1 &&
                this.apiVar("type") == "users" &&
                (this.apiVar("showOnlyFollowedUsers") == "1" || this.apiVar("showOnlyFollowingUsers") == "1")
            )
                theTemplateType = "users_follow_list";

            if (
                typeof settings.widgets.templateCache[theTemplateType] != "undefined" &&
                settings.widgets.templateCache[theTemplateType] != null
            ) {
                this.mTemplate = settings.widgets.templateCache[theTemplateType];
                this.processTemplate();
            } else if (
                typeof settings.widgets.loadingTemplates[theTemplateType] != "undefined" &&
                settings.widgets.loadingTemplates[theTemplateType] != null
            ) {
                settings.widgets.loadingTemplates[theTemplateType].onload(function () {
                    theThis.mTemplate = settings.widgets.templateCache[theTemplateType];
                    theThis.processTemplate();
                });
            } else {
                settings.widgets.loadingTemplates[theTemplateType] = {
                    mAllCallbacks: [],
                    onload: function (aCallback) {
                        if (typeof aCallback == "function") this.mAllCallbacks.push(aCallback);
                        else {
                            for (var i = 0; i < this.mAllCallbacks.length; i++) {
                                this.mAllCallbacks[i]();
                            }
                        }
                    },
                };

                $.ajax({
                    url: "/HandlerWidgetTemplate.ashx?type=" + theTemplateType,
                })
                    .done(function (aData) {
                        theThis.mTemplate = $(aData);

                        settings.widgets.templateCache[theTemplateType] = theThis.mTemplate;
                        settings.widgets.loadingTemplates[theTemplateType].onload();

                        theThis.processTemplate();
                    })
                    .fail(function (aData) {
                        $.fn.showError(settings.errors.widgetErrorText + " ('" + aData + "') (500.43)", "console");
                    });
            }
        },

        processTemplate: function () {
            if (this.apiVar("type") != "twitter" && this.mTemplate.find(".itemTemplate").length == 0) return;

            // Internet Explorer meuk (fixes nasty checked="checked" bug).
            if ($(".internetexplorer").length > 0) {
                this.mTemplate.find(".itemTemplate input[type=checkbox]").each(function () {
                    if ($(this).is(":checked")) {
                        $(this).attr("data-checked", true);
                    }
                });
            }

            this.mItemTemplate = $("<div />")
                .append(this.mTemplate.find(".itemTemplate").clone().removeClass("itemTemplate"))
                .html();

            if (this.mTemplate.find(".noItemTemplate").length > 0)
                this.mNoItemTemplate = $("<div />")
                    .append(this.mTemplate.find(".noItemTemplate").clone().removeClass("noItemTemplate"))
                    .html();

            this.loadData();
        },

        settingsToObject: function (aSettingsString) {
            var theSettingsObject = JSON.parse(aSettingsString);
            var theReturnObject = {};

            for (var theSettingsTab in theSettingsObject) {
                $.extend(theReturnObject, theSettingsObject[theSettingsTab]);
            }

            return theReturnObject;
        },

        queryStringToObject: function (aQueryString) {
            var theReturnObject = {};

            theQueryString = aQueryString;
            theQueryString = theQueryString.split("&amp;");

            var theCurrentVar;

            for (i = 0; i < theQueryString.length; i++) {
                theCurrentVar = theQueryString[i].split("=");

                theReturnObject[theCurrentVar[0]] = decodeURIComponent(theCurrentVar[1]);
            }

            return theReturnObject;
        },

        objectToQueryString: function (aObject) {
            if (aObject == null) return "";

            var theReturnString = "";

            for (var theCurrentKey in aObject) {
                if (theReturnString != "") theReturnString += "&";

                theReturnString += theCurrentKey + "=" + encodeURIComponent(aObject[theCurrentKey]);
            }

            return theReturnString;
        },

        replaceArrayVarsRecursive: function (aCurrentItemTemplate, aObject, aVarPrefix) {
            var theCurrentItemTemplate = aCurrentItemTemplate;

            for (var theCurrentVar in aObject) {
                if (Array.isArray(aObject[theCurrentVar])) {
                    theCurrentItemTemplate = theCurrentItemTemplate.replaceEach(
                        aVarPrefix + theCurrentVar,
                        aObject[theCurrentVar]
                    );
                } else if (typeof aObject[theCurrentVar] == "object")
                    theCurrentItemTemplate = this.replaceArrayVarsRecursive(
                        theCurrentItemTemplate,
                        aObject[theCurrentVar],
                        aVarPrefix + theCurrentVar + "."
                    );
            }

            return theCurrentItemTemplate;
        },

        replaceItemVarsRecursive: function (aCurrentItemTemplate, aObject, aVarPrefix) {
            var theCurrentItemTemplate = aCurrentItemTemplate;

            for (var theCurrentVar in aObject) {
                if (Array.isArray(aObject[theCurrentVar])) {
                    theCurrentItemTemplate = theCurrentItemTemplate.replaceVar(
                        aVarPrefix + theCurrentVar + ".length",
                        aObject[theCurrentVar].length.toString()
                    );

                    for (var i = 0; i < aObject[theCurrentVar].length; i++) {
                        theCurrentItemTemplate = this.replaceItemVarsRecursive(
                            theCurrentItemTemplate,
                            aObject[theCurrentVar][i],
                            aVarPrefix + theCurrentVar + "[" + i.toString() + "]."
                        );
                    }
                } else if (typeof aObject[theCurrentVar] == "object")
                    theCurrentItemTemplate = this.replaceItemVarsRecursive(
                        theCurrentItemTemplate,
                        aObject[theCurrentVar],
                        aVarPrefix + theCurrentVar + "."
                    );
                else
                    theCurrentItemTemplate = theCurrentItemTemplate.replaceVar(
                        aVarPrefix + theCurrentVar,
                        aObject[theCurrentVar].toString()
                    );
            }

            for (var theVarKey in this.mTemplateVariables) {
                theCurrentItemTemplate = theCurrentItemTemplate.replaceVar(
                    theVarKey,
                    this.mTemplateVariables[theVarKey]
                );
            }

            return theCurrentItemTemplate;
        },

        replaceVars: function () {
            if (this.mTemplateVariables == null) return;

            this.mObject.find(".widgetRemove").remove();

            if (settings.colors.widgetBackgroundColor != "transparent" &&
                settings.colors.widgetBackgroundColor != "#FFFFFF" &&
                settings.colors.widgetBackgroundColor != "#00000000") {
                this.mObject.addClass("colored-bg");
            }

            if (this.mObject.html() != undefined) {
                var theHtml = this.mObject.html();

                for (var theVarKey in this.mTemplateVariables) {
                    theHtml = theHtml.replaceVar(theVarKey, this.mTemplateVariables[theVarKey]);
                }

                theHtml = theHtml.clearVars();
                theHtml = theHtml.replaceScripts();

                this.mObject.html(theHtml);
                this.mObject.find(".widgetRemove").remove();
            }
        },

        setMonthButtons: function () {
            var theThis = this;
            var theNextMonth = this.getMonth("next");
            var thePreviousMonth = this.getMonth("previous");

            this.mObject
                .find(".nextMonth")
                .html(getMonthName(theNextMonth))
                .on("click", function () {
                    theThis.apiVar("month", theNextMonth);
                    theThis.templateVar("month", theNextMonth);
                    theThis.loadData();

                    if (theNextMonth == 1) theThis.apiVar("year", parseInt(theThis.apiVar("year")) + 1);

                    theNextMonth = theThis.getMonth("next");
                    thePreviousMonth = theThis.getMonth("previous");

                    $(this).html(getMonthName(theNextMonth));
                    theThis.mObject.find(".previousMonth").html(getMonthName(thePreviousMonth));

                    return false;
                });

            this.mObject
                .find(".previousMonth")
                .html(getMonthName(thePreviousMonth))
                .on("click", function () {
                    theThis.apiVar("month", thePreviousMonth);
                    theThis.templateVar("month", thePreviousMonth);
                    theThis.loadData();

                    if (thePreviousMonth == 12) theThis.apiVar("year", parseInt(theThis.apiVar("year")) - 1);

                    theNextMonth = theThis.getMonth("next");
                    thePreviousMonth = theThis.getMonth("previous");

                    $(this).html(getMonthName(thePreviousMonth));
                    theThis.mObject.find(".nextMonth").html(getMonthName(theNextMonth));

                    return false;
                });
        },

        setWeekButtons: function () {
            var theThis = this;
            var theNextWeek = this.getWeek("next");
            var thePreviousWeek = this.getWeek("previous");

            this.mObject
                .find(".nextWeek")
                .html("Week " + theNextWeek)
                .on("click", function () {
                    theThis.apiVar("week", theNextWeek);
                    theThis.templateVar("week", theNextWeek);
                    theThis.loadData();

                    if (theNextWeek == 1) theThis.apiVar("year", parseInt(theThis.apiVar("year")) + 1);

                    theNextWeek = theThis.getWeek("next");
                    thePreviousWeek = theThis.getWeek("previous");

                    $(this).html("Week " + theNextWeek);
                    theThis.mObject.find(".previousWeek").html("Week " + thePreviousWeek);

                    return false;
                });

            this.mObject
                .find(".previousWeek")
                .html("Week " + thePreviousWeek)
                .on("click", function () {
                    theThis.apiVar("week", theNextWeek);
                    theThis.templateVar("week", thePreviousWeek);
                    theThis.loadData();

                    if (thePreviousWeek == 53) theThis.apiVar("year", parseInt(theThis.apiVar("year")) - 1);

                    theNextWeek = theThis.getWeek("next");
                    thePreviousWeek = theThis.getWeek("previous");

                    $(this).html("Week " + thePreviousWeek);
                    theThis.mObject.find(".nextWeek").html("Week " + theNextWeek);

                    return false;
                });
        },

        setYearButtons: function () {
            var theThis = this;
            var theNextYear = this.apiVar("year") + 1;
            var thePreviousYear = this.apiVar("year") - 1;

            this.mObject.find(".nextYear").on("click", function () {
                theThis.apiVar("year", theNextYear);
                theThis.templateVar("year", theNextYear);
                theThis.loadData();

                theNextYear = theThis.apiVar("year") + 1;
                thePreviousYear = theThis.apiVar("year") - 1;

                return false;
            });

            this.mObject.find(".previousYear").on("click", function () {
                theThis.apiVar("year", thePreviousYear);
                theThis.templateVar("year", thePreviousYear);
                theThis.loadData();

                theNextYear = theThis.apiVar("year") + 1;
                thePreviousYear = theThis.apiVar("year") - 1;

                return false;
            });
        },

        getWeek: function (aDirection) {
            var theCurrentWeek = this.apiVar("week");

            if (aDirection == "previous") {
                if (theCurrentWeek == 1) return 53;
                else return theCurrentWeek - 1;
            } else {
                if (theCurrentWeek == 53) return 1;
                else return theCurrentWeek + 1;
            }
        },

        getMonth: function (aDirection) {
            var theCurrentMonth = this.apiVar("month");

            if (aDirection == "previous") {
                if (theCurrentMonth == 1) return 12;
                else return theCurrentMonth - 1;
            } else {
                if (theCurrentMonth == 12) return 1;
                else return theCurrentMonth + 1;
            }
        },

        unbind: function (aEventName) {
            if (typeof aEventName == "string" && trim(aEventName) != "") {
                switch (aEventName) {
                    case "complete":
                        this.mCompleteHandlers = [];
                        break;
                }
            }

            return this;
        },

        // Handlers
        complete: function (aHandler) {
            if (typeof aHandler == "undefined") {
                this.mIsCompleted = true;

                for (var theIndex in this.mCompleteHandlers) {
                    this.mCompleteHandlers[theIndex](this, "complete");
                }
            } else if (typeof aHandler == "function") {
                this.mCompleteHandlers.push(aHandler);

                if (this.mIsCompleted) aHandler(this, "complete");
            }

            return this;
        },
    };

    theReturnObject.init(aObject);
    return theReturnObject;
}

function htmlEncode(aValue) {
    return $("<div/>").text(aValue).html();
}

function htmlDecode(aValue) {
    return $("<div/>").html(aValue).text();
}

function getMonthName(aMonthNumber, aShort) {
    var theMonthNames = [
        [
            "",
            "januari",
            "februari",
            "maart",
            "april",
            "mei",
            "juni",
            "juli",
            "augustus",
            "september",
            "oktober",
            "november",
            "december",
        ],
        [
            "",
            "January",
            "February",
            "March",
            "April",
            "May",
            "June",
            "July",
            "August",
            "September",
            "October",
            "November",
            "December",
        ],
    ];

    var theShortMonthNames = [
        ["", "jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"],
        ["", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
    ];

    var theDesiredLanuage = settings.language == "en" ? 1 : 0;

    if (aShort) return theShortMonthNames[theDesiredLanuage][aMonthNumber];

    return theMonthNames[theDesiredLanuage][aMonthNumber];
}

function setWidgetImages(aObject) {
    // Carousel image size, depending on layout and item count per slide.
    if (aObject.find(".mettCarousel").length > 0 && aObject.parents(".three.columns").length > 0) {
        if (
            aObject.find(".mettCarousel").data("item-width") != undefined &&
            aObject.find(".mettCarousel").data("item-width") != "100%"
        ) {
            // Replace small images for mini images.
            aObject.find(".itemImage.small, .updateImage.small").removeClass("small").addClass("mini");
        }
    }

    // Create thumbnail.
    aObject
        .find(".updateImage img")
        .not(".nailthumb-image")
        .each(function () {
            var theImageObject = $(this);

            setTimeout(function () {
                setCurrentWidgetImage(theImageObject, aObject);
            }, 1000);
        });
}

function setCurrentWidgetImage(aObject, aParentWidget) {
    if (aObject.height() > 0) {
        var thumbnailHeight = settings.images.widgetImageHeight;

        // Thumbnail size.
        if (aObject.parents(".small").length > 0 || aObject.parents(".mini").length > 0) {
            thumbnailHeight = settings.images.smallThumbnailHeight;
        }

        var parentObject = aObject.parent();
        var targetObject = aObject;

        if (parentObject.is("a") && parentObject.height() > 0) {
            targetObject = parentObject;
            thumbnailHeight = parentObject.height();
        }

        targetObject.nailthumb({
            preload: false,
            nostyle: true,
            height: thumbnailHeight,
            fitDirection: "center center",
            maxEnlargement: 1,
        });

        if (aParentWidget[0].children[0].classList.contains("widget-items")) {
            var parentContainer = aObject.parents(".updateImage");

            if (aObject.width() > aObject.height()) {
                parentContainer.addClass("landscape");

                if (aObject[0].naturalWidth < parentContainer.width()) parentContainer.addClass("contained");
            } else if (aObject.width() < aObject.height()) {
                parentContainer.addClass("portrait");

                if (aObject[0].naturelHeight < parentContainer.height()) parentContainer.addClass("contained");
            }
        }

        if (typeof aParentWidget != "undefined" && aParentWidget != null && aParentWidget.is("#bottom .mettWidget")) {
            $(window).resize();
        }

        if (aParentWidget[0].firstChild.className.indexOf("widget-users") > -1) {
            $.each(aParentWidget.find(".itemImage"), function () {
                var itemImage = $(this),
                    img = itemImage.find("img");

                if (img.length > 0) {
                    if (img.width() > img.height()) itemImage.addClass("landscape");
                    else if (img.width() < img.height()) itemImage.addClass("portrait");
                }
            });
        }
    } else {
        setTimeout(function () {
            setCurrentWidgetImage(aObject, aParentWidget);
        }, 200);
    }
}

function guid() {
    var s4 = function () {
        return Math.floor((1 + Math.random()) * 0x10000)
            .toString(16)
            .substring(1);
    };

    return s4() + s4() + "-" + s4() + "-" + s4() + "-" + s4() + "-" + s4() + s4() + s4();
}

function closeTags(html) {
    var excludedTags = ["meta", "img", "br", "hr", "input"];
    var theOpenRegEx = RegExp("<([a-z]+)(?:s[^<]*?[^/]>|>)", "gi");
    var theCloseRegEx = RegExp("</([a-z]+)\\s*>", "gi");
    var openedtags = [];
    var closedtags = [];
    var theMatch;

    html = html.replace(/<[^>]*$/, "");

    while ((theMatch = theOpenRegEx.exec(html)) != null) {
        if (excludedTags.indexOf(theMatch[1].toLowerCase()) == -1) openedtags.push(theMatch[1]);
    }

    while ((theMatch = theCloseRegEx.exec(html)) != null) {
        closedtags.push(theMatch[1]);
    }

    if (openedtags.length == closedtags.length) return html;

    openedtags = openedtags.reverse();

    for (var i = 0; i < openedtags.length; i++) {
        var index = closedtags.indexOf(openedtags[i]);
        if (index == -1) {
            html += "</" + openedtags[i] + ">";
        } else {
            closedtags.splice(index, 1);
        }
    }

    return html;
}
;
$(document).ready(function () {
    $(".mettCarousel").carousel();
});

$.fn.carousel = function () {
    $(this).each(function () {
        if (typeof $(this).data("carousel") == "undefined" || $(this).data("carousel") == null)
            $(this).data("carousel", new Carousel($(this)));
    });

    return $(this);
};

var Carousel = function (aObject) {
    var theReturnObject = {
        mCarouselObject: null,
        mCarouselMask: null,
        mCarouselContainer: null,
        mCarouselControlsContainer: null,
        mCarouselItems: null,
        mButtonLeft: null,
        mButtonRight: null,
        mButtonPlayPause: null,
        mCalculatedMargin: 0,
        mIsAnimating: false,
        mItemsInitInterval: 0,
        mFitSliderHeight: false,
        mAutoHeight: false,
        mAutoHeightIsAnimating: false,
        mSlideshow: false,
        mSlideshowAutoPlay: true,
        mSlideshowDelay: 4000,
        mSlideshowTimeout: 0,
        mInitComplete: false,
        mItemWidth: null,
        mResizeTimeout: 0,
        mInterval: 0,
        mCompleteHandlers: [],

        init: function (aObject) {
            var theThis = this;

            this.mCarouselObject = aObject;
            this.mCarouselObject.css("-webkit-user-select", "none");
            this.mCarouselObject.css("-moz-user-select", "none");
            this.mCarouselObject.css("-ms-user-select", "none");
            this.mCarouselObject.css("-o-user-select", "none");
            this.mCarouselObject.css("user-select", "none");

            // Scales the height to the height of the tallest item
            if (this.mCarouselObject.attr("data-fit-slider-height") == "true") this.mFitSliderHeight = true;

            // Scales the height to the height of the current item
            if (this.mCarouselObject.attr("data-auto-height") == "true") this.mAutoHeight = true;

            // Adds pause/play button and auto play
            if (this.mCarouselObject.attr("data-slideshow") == "true") this.mSlideshow = true;

            // You can kill the auto play \o/
            if (this.mCarouselObject.attr("data-auto-play") == "false") this.mSlideshowAutoPlay = false;

            // Set item width
            if (
                typeof this.mCarouselObject.attr("data-item-width") != "undefined" &&
                this.mCarouselObject.attr("data-item-width") != null
            )
                this.mItemWidth = this.mCarouselObject.attr("data-item-width");

            // Sets the delay before the next animation
            if (
                this.mCarouselObject.attr("data-delay") != null &&
                parseInt(this.mCarouselObject.attr("data-delay")) > 0
            )
                this.mSlideshowDelay = parseInt(this.mCarouselObject.attr("data-delay"));

            if (
                this.mCarouselObject.css("position") != "absolute" &&
                this.mCarouselObject.css("position") != "relative"
            )
                this.mCarouselObject.css("position", "relative");

            this.mCarouselObject.css("z-index", "100");

            this.createContainer();

            this.mCarouselContainer.find(".insertSlide").remove();
            this.mCarouselItems = this.mCarouselContainer.children();
            this.mCarouselItems.css({ float: "left" });
            this.mCarouselItems.css("white-space", "normal");

            $(window).on("resize", function () {
                theThis.onResize();
            });

            theThis.onResize();

            if (this.mCarouselItems.length < 2 || !this.canRotate()) {
                clearTimeout(this.mSlideshowTimeout);
                clearInterval(this.mItemsInitInterval);
                clearInterval(this.mInterval);
                return;
            } else if (this.mCarouselObject.width() <= 0) this.delayedInit();
            else this.resumeInit();
        },

        delayedInit: function () {
            var theThis = this;

            if (this.mCarouselObject.width() > 0) this.resumeInit();
            else
                setTimeout(function () {
                    theThis.delayedInit();
                }, 100);
        },

        resumeInit: function () {
            var theThis = this;

            clearInterval(this.mInterval);
            this.mInterval = setInterval(function () {
                theThis.onInterval();
            }, 100);

            if (
                this.mCarouselContainer.width() -
                    parseInt($(this.mCarouselContainer.get(0).lastElementChild).css("marginRight")) -
                    11 <=
                this.mCarouselObject.width()
            )
                return;

            this.onResize();

            this.initItems();

            if (this.canRotate()) this.initButtons();

            this.addListeners();

            if (this.mSlideshow) this.initSlideshow();

            this.fitSliderHeight();

            this.mInitComplete = true;

            this.onResize();

            this.complete();
        },

        canRotate: function () {
            if ($.fn.viewport().width > 768 && this.mItemWidth != null && this.mItemWidth.indexOf("%") > -1)
                return parseInt(this.mItemWidth) * this.mCarouselItems.length > 101;
            else return true;
        },

        createContainer: function () {
            this.mCarouselMask = $('<div class="carouselMask" />');
            this.mCarouselContainer = $('<div class="carouselContainer" />');

            this.mCarouselContainer.css("position", "absolute");
            this.mCarouselContainer.css("height", "100%");
            this.mCarouselContainer.css("white-space", "nowrap");

            this.mCarouselMask.css("position", "relative");
            this.mCarouselMask.css("width", "100%");
            this.mCarouselMask.css("height", "100%");
            this.mCarouselMask.css("overflow", "hidden");

            this.mCarouselObject.wrapInner(this.mCarouselContainer);
            this.mCarouselObject.wrapInner(this.mCarouselMask);

            this.mCarouselContainer = this.mCarouselObject.find(".carouselContainer");
            this.mCarouselMask = this.mCarouselObject.find(".carouselMask");

            this.updateContainerWidth();
        },

        updateContainerWidth: function () {
            var theContainerWidth = 0;
            this.mCarouselContainer.children().each(function () {
                theContainerWidth += $(this).outerWidth(true);
            });

            this.mCarouselContainer.css("width", theContainerWidth + 10 + "px");
        },

        initItems: function () {
            var theThis = this;

            // Bugfix to be sure items can be initialized
            if (this.mCarouselItems.length > 1) {
                var theCheckPosition = this.mCarouselItems.eq(1).position();

                if (theCheckPosition.left <= 0) {
                    if (this.mItemsInitInterval == 0) {
                        clearInterval(theThis.mItemsInitInterval);
                        theThis.mItemsInitInterval = setInterval(function () {
                            theThis.initItems();
                        }, 100);
                    }

                    return;
                }
            }

            clearInterval(theThis.mItemsInitInterval);

            this.mCarouselContainer.children().each(function () {
                var theCurrentItem = $(this);

                var thePosition = theCurrentItem.position();

                theCurrentItem.css("left", thePosition.left + "px");
                theCurrentItem.data("targetLeft", thePosition.left);
            });

            this.mCarouselContainer.children().each(function () {
                var theCurrentItem = $(this);

                theCurrentItem.css("position", "absolute");
            });

            this.calculateMargin();
        },

        initButtons: function () {
            this.mCarouselControlsContainer = $("<div />");
            this.mCarouselControlsContainer.addClass("carouselControls");

            // Previous.
            this.mButtonLeft = $("<a />").attr("href", "#").addClass("control previous icon-left before hide");
            this.mButtonLeft.html('<div class="screenReaderContent">' + settings.various.previousSlideText + "</div>");
            this.mButtonLeft.appendTo(this.mCarouselControlsContainer);

            // Play & pause.
            this.mButtonPlayPause = $("<a />").attr("href", "#").addClass("control play icon-play before hide");
            this.mButtonPlayPause.html(
                '<div class="screenReaderContent">' + settings.various.playCarouselText + "</div>"
            );
            this.mButtonPlayPause.appendTo(this.mCarouselControlsContainer);

            // Next.
            this.mButtonRight = $("<a />").attr("href", "#").addClass("control next icon-right before hide");
            this.mButtonRight.html('<div class="screenReaderContent">' + settings.various.nextSlideText + "</div>");
            this.mButtonRight.appendTo(this.mCarouselControlsContainer);

            // Append container.
            this.mCarouselControlsContainer.appendTo(this.mCarouselObject);
        },

        toggleButtons: function () {
            var theTotalWidth = 0;

            this.mCarouselContainer.children().each(function () {
                theTotalWidth += $(this).outerWidth();
            });

            if (this.mButtonLeft != null && theTotalWidth > this.mCarouselMask.outerWidth()) {
                this.mButtonLeft.removeClass("hide");
                this.mButtonRight.removeClass("hide");
            } else if (this.mButtonLeft != null) {
                this.mButtonLeft.removeClass("hide");
                this.mButtonRight.removeClass("hide");
            }
        },

        initSlideshow: function () {
            var theThis = this;

            if (this.mButtonPlayPause == null) return;

            this.mButtonPlayPause
                .on("click", function () {
                    var theObject = theThis.mButtonPlayPause;

                    if (theObject.hasClass("pause")) theThis.pause();
                    else theThis.play();

                    return false;
                })
                .removeClass("hide");

            if (this.mSlideshowAutoPlay) {
                this.mButtonPlayPause.removeClass("play icon-play").addClass("pause icon-pause");
                this.mButtonPlayPause.html(
                    '<div class="screenReaderContent">' + settings.various.pauseCarouselText + "</div>"
                );

                this.setSlideshowTimeout();
            } else {
                this.pause();
            }
        },

        pause: function () {
            if (this.mButtonPlayPause != null) {
                this.mButtonPlayPause.removeClass("pause icon-pause").addClass("play icon-play");
                this.mButtonPlayPause.html(
                    '<div class="screenReaderContent">' + settings.various.playCarouselText + "</div>"
                );
            }

            this.mSlideshow = false;

            clearTimeout(this.mSlideshowTimeout);
        },

        play: function () {
            if (this.mButtonPlayPause != null) {
                this.mButtonPlayPause.removeClass("play icon-play").addClass("pause icon-pause");
                this.mButtonPlayPause.html(
                    '<div class="screenReaderContent">' + settings.various.pauseCarouselText + "</div>"
                );
            }

            this.mSlideshow = true;

            clearTimeout(this.mSlideshowTimeout);
            this.setSlideshowTimeout();
        },

        setSlideshowTimeout: function () {
            var theThis = this;

            clearTimeout(this.mSlideshowTimeout);

            this.mSlideshowTimeout = setTimeout(function () {
                theThis.animateTo();
            }, this.mSlideshowDelay);
        },

        animateTo: function (
            aDirection // aDirection: "previous" or "next" ("next" is default)
        ) {
            clearTimeout(this.mSlideshowTimeout);

            if (this.mIsAnimating || this.mCarouselItems.length < 2) return;

            var theThis = this;

            this.mIsAnimating = true;

            var theLast = this.mCarouselContainer.children().last();
            var theFirst = this.mCarouselContainer.children().first();

            var thePosition;

            this.calculateMargin();

            if (aDirection == "previous") {
                thePosition = theFirst.position().left - theLast.width() - this.mCalculatedMargin;

                theLast.css("left", thePosition + "px");
                theLast.data("targetLeft", thePosition);
                this.mCarouselContainer.prepend(theLast);

                this.mCarouselItems.each(function () {
                    var theCurrentItem = $(this);

                    theCurrentItem.data(
                        "targetLeft",
                        theCurrentItem.data("targetLeft") +
                            (theThis.mCarouselContainer.children().first().width() + theThis.mCalculatedMargin)
                    );

                    theCurrentItem.animate({ left: theCurrentItem.data("targetLeft") }, 300, function () {
                        theThis.mIsAnimating = false;

                        if (theThis.mSlideshow) theThis.setSlideshowTimeout();

                        theThis.checkSlidesVisibility();
                    });
                });

                if (theThis.mAutoHeight && theLast != null && theLast.height() > 0) {
                    var theTargetHeight = theLast.height();

                    if (theThis.mCarouselControlsContainer != null)
                        theTargetHeight += theThis.mCarouselControlsContainer.height();

                    theThis.mCarouselObject
                        .animate({ height: Math.ceil(targetHeight) }, 300)
                        .css("overflow", "visible");
                }
            } else {
                var theNextItem = theFirst;

                this.mCarouselItems.each(function () {
                    var theCurrentItem = $(this);

                    theCurrentItem.data(
                        "targetLeft",
                        theCurrentItem.data("targetLeft") - (theNextItem.width() + theThis.mCalculatedMargin)
                    );

                    theCurrentItem.animate({ left: theCurrentItem.data("targetLeft") }, 300, function () {
                        thePosition = theLast.position().left + theLast.width() + theThis.mCalculatedMargin;

                        theFirst.css("left", thePosition + "px");
                        theFirst.data("targetLeft", thePosition);
                        theThis.mCarouselContainer.append(theFirst);

                        if (theThis.mSlideshow) theThis.setSlideshowTimeout();

                        theThis.mIsAnimating = false;

                        theThis.checkSlidesVisibility();
                    });
                });

                if (theThis.mAutoHeight) {
                    var theTargetHeight = theThis.mCarouselContainer.children().eq(1).height();

                    if (theThis.mCarouselControlsContainer != null)
                        theTargetHeight += theThis.mCarouselControlsContainer.height();

                    theThis.mCarouselObject
                        .animate({ height: Math.ceil(targetHeight) }, 200)
                        .css("overflow", "visible");
                }
            }
        },

        checkSlidesVisibility: function () {
            var carouselRect = $(this.mCarouselObject)[0].getBoundingClientRect(),
                carouselLeftBounds = [Math.floor(carouselRect.left), Math.ceil(carouselRect.left)],
                carouselRightBounds = [Math.floor(carouselRect.right), Math.ceil(carouselRect.right)];

            this.mCarouselItems.each(function () {
                var slideRect = $(this)[0].getBoundingClientRect(),
                    slideLeftFloor = Math.floor(slideRect.left),
                    slideLeftCeil = Math.ceil(slideRect.left),
                    slideRightFloor = Math.floor(slideRect.right),
                    slideRightCeil = Math.ceil(slideRect.right);

                const between = (x, min, max) => {
                    return x >= min && x <= max;
                };

                if (
                    (between(
                        slideLeftFloor,
                        Math.min.apply(Math, carouselLeftBounds) - 1,
                        Math.max.apply(Math, carouselRightBounds) + 1
                    ) ||
                        between(
                            slideLeftCeil,
                            Math.min.apply(Math, carouselLeftBounds) - 1,
                            Math.max.apply(Math, carouselRightBounds) + 1
                        )) &&
                    (between(
                        slideRightFloor,
                        Math.min.apply(Math, carouselLeftBounds) - 1,
                        Math.max.apply(Math, carouselRightBounds) + 1
                    ) ||
                        between(
                            slideRightCeil,
                            Math.min.apply(Math, carouselLeftBounds) - 1,
                            Math.max.apply(Math, carouselRightBounds) + 1
                        ))
                ) {
                    $(this).removeAttr("aria-hidden");
                    $(this).find("a").removeAttr("tabindex");
                } else {
                    $(this).attr("aria-hidden", "true");
                    $(this).find("a").attr("tabindex", "-1");
                }
            });
        },

        fitSliderHeight: function () {
            if (this.mFitSliderHeight && !this.mAutoHeightIsAnimating) {
                var theThis = this,
                    theTallestHeight = 0,
                    theTallestOuterHeight = 0,
                    theAllItemsInitialized = true;

                this.mCarouselContainer.children().each(function () {
                    // Check if current item is initialized
                    if ($(this).width() < 1) {
                        theAllItemsInitialized = false;
                        return;
                    }

                    if ($(this).outerHeight() > theTallestOuterHeight) theTallestOuterHeight = $(this).outerHeight();

                    if ($(this).innerHeight() > theTallestHeight) theTallestHeight = $(this).innerHeight();
                });

                if (theAllItemsInitialized) {
                    var targetHeight = theTallestOuterHeight;
                    var heightToCheck = parseInt(this.mCarouselObject[0].style.height);

                    if (
                        this.mCarouselControlsContainer &&
                        this.mCarouselControlsContainer.outerHeight() &&
                        $("html.ios").length === 0
                    ) {
                        targetHeight += this.mCarouselControlsContainer.outerHeight();
                        heightToCheck -= this.mCarouselControlsContainer.outerHeight();
                    }

                    if (Math.ceil(theTallestOuterHeight) != Math.ceil(heightToCheck)) {
                        this.mAutoHeightIsAnimating = true;

                        this.mCarouselObject
                            .animate({ height: Math.ceil(targetHeight) }, 200, function () {
                                theThis.mAutoHeightIsAnimating = false;
                            })
                            .css("overflow", "visible");

                        // Re-initialze spacers.
                        $.fn.initializeSpacers({ resize: true });
                    }

                    if ($("html").hasClass("threedotfive")) {
                        var itemHeight = Math.ceil(theTallestHeight);

                        this.mCarouselContainer.children().each(function () {
                            if (parseInt($(this).find(".contentBlock").css("min-height")) != itemHeight)
                                $(this).find(".contentBlock").css({ "min-height": itemHeight });
                        });
                    }
                } else {
                    setTimeout(function () {
                        theThis.fitSliderHeight();
                    }, 100);
                }
            }
        },

        calculateMargin: function () {
            if (this.mCarouselContainer.children().length > 1)
                this.mCalculatedMargin =
                    this.mCarouselContainer.children().eq(1).position().left -
                    (this.mCarouselContainer.children().first().position().left +
                        this.mCarouselContainer.children().first().width());
            else return 0;
        },

        onInterval: function () {
            var theThis = this;

            if (this.mInitComplete && !this.mIsAnimating) {
                if (this.mAutoHeight && !this.mAutoHeightIsAnimating) {
                    var theTargetObject = theThis.mCarouselContainer.children().first();

                    if (Math.ceil(theTargetObject.height()) != Math.ceil(theThis.mCarouselObject.height())) {
                        var theTargetHeight = theTargetObject.outerHeight();

                        if (theThis.mCarouselControlsContainer != null)
                            theTargetHeight += theThis.mCarouselControlsContainer.outerHeight();

                        this.mAutoHeightIsAnimating = true;

                        this.mCarouselObject
                            .animate({ height: Math.ceil(targetHeight) }, 200, function () {
                                theThis.mAutoHeightIsAnimating = false;
                            })
                            .css("overflow", "visible");
                    }
                }
            }

            this.fitSliderHeight();
        },

        onResize: function () {
            var theThis = this;

            if (theThis.mItemWidth != null) {
                clearTimeout(this.mResizeTimeout);
                this.mResizeTimeout = setTimeout(function () {
                    if (theThis.mItemWidth.indexOf("%") > -1) {
                        if ($.fn.viewport().width > 768)
                            theThis.mCarouselItems.outerWidth(
                                Math.round(theThis.mCarouselObject.width() * (parseFloat(theThis.mItemWidth) / 100))
                            );
                        else theThis.mCarouselItems.outerWidth(Math.round(theThis.mCarouselObject.width()));
                    } else theThis.mCarouselItems.outerWidth(parseInt(theThis.mItemWidth));

                    theThis.mCarouselItems
                        .find(
                            "iframe[src*='youtube.com'], iframe[src*='vimeo.com'], iframe[src*='demediahub.nl'], iframe[src*='pano.autodesk.com']"
                        )
                        .setVideoFrameSize();

                    theThis.mCarouselItems.css({ position: "relative", left: "auto" });
                    theThis.updateContainerWidth();

                    theThis.mCarouselContainer.children().each(function () {
                        $(this).find(".contentBlock").css("min-height", "0");
                    });

                    if (!theThis.mInitComplete) theThis.resumeInit();
                    else {
                        theThis.initItems();

                        theThis.fitSliderHeight();

                        theThis.toggleButtons();
                    }

                    theThis.checkSlidesVisibility();
                }, 200);
            }
        },

        addListeners: function () {
            var theThis = this;

            if (this.mButtonLeft != null) {
                this.mButtonLeft.on("click", function (e) {
                    e.preventDefault();

                    theThis.clearSelection();

                    theThis.animateTo("previous");
                });
            }

            if (this.mButtonRight != null) {
                this.mButtonRight.on("click", function (e) {
                    e.preventDefault();

                    theThis.clearSelection();

                    theThis.animateTo("next");
                });
            }
        },

        clearSelection: function () {
            if (window.getSelection) {
                if (window.getSelection().empty) {
                    // Chrome
                    window.getSelection().empty();
                } else if (window.getSelection().removeAllRanges) {
                    // Firefox
                    window.getSelection().removeAllRanges();
                }
            } else if (document.selection) {
                // IE?
                document.selection.empty();
            }
        },

        setDelay: function (aDelay) {
            this.mSlideshowDelay = parseInt(aDelay);

            if (this.mSlideshow) this.setSlideshowTimeout();
        },

        autoPlay: function (aBool) {
            var theThis = this;

            // Make sure it will be done after inti
            if (!this.mInitComplete) {
                setTimeout(function () {
                    theThis.autoPlay(aBool);
                }, 40);
                return;
            }

            if (typeof aBool == "undefined" || aBool == null) return this.mSlideshowAutoPlay;

            this.mSlideshowAutoPlay = aBool;

            if (aBool) this.play();
            else this.pause();

            return this;
        },

        // Handlers
        complete: function (aHandler) {
            var theThis = this;

            if (typeof aHandler == "undefined") {
                for (var theIndex in this.mCompleteHandlers) {
                    this.mCompleteHandlers[theIndex](this, "complete");
                }
            } else if (typeof aHandler == "function") {
                this.mCompleteHandlers.push(aHandler);

                if (this.mInitComplete) aHandler(this, "complete");
            }

            return this;
        },
    };

    theReturnObject.init(aObject);

    return theReturnObject;
};
;
$(document).ready(function () {
    // Initialize.
    $.fn.initializeAddEdit();

    if (settings.section.isAdd || settings.section.isEdit) $.initializeAddEditLayout();

    if (typeof Sys != "undefined" && typeof Sys.WebForms != "undefined") {
        // After AJAX call.
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function (sender, e) {
            $.fn.initializeAddEdit();
        });
    }
});

$(window).on("load", function () {});

// Initialize add & edit.
$.fn.initializeAddEdit = function () {
    // Editors.
    $(".editor").initializeEditors();

    // Count characters.
    $(".characterCount").initializeCountCharacters();

    // Date time select.
    $(".field.dateTimeSelect").initializeDateSelect();

    // CMS.
    $.initializeCMSAddEdit();

    // Newsletters.
    $("#newsletters.add").initializeNewslettersAddEdit();

    // Events.
    $("#events.add").initializeEventsAddEdit();

    // Registrations.
    $("#registrations.add").initializeRegistrationsAddEdit();

    // Links.
    $("#links.add").initializeLinksAddEdit();

    // Pano Platform.
    $("#cms .field.isPano").initializePanoPlatformAddEdit();

    // Item add & edit.
    $(".item.add, .item.edit, #html.section.edit").initializeItemAddEdit();

    // Item delete.
    $("#item.item.delete").initializeItemDelete();

    // Redirects.
    $("#redirects.add").initializeRedirects();

    // Color pickers
    if ($(".field.txtColorPicker").length > 0) {
        if ($('div[id$="_ctlContentImageLabel"]').length > 0 && $('input[id$="_txtContentImageLabel"]').val() == "") {
            var btnBgColor = settings.buttons.primaryButtonBGColor;
            $('input[id$="_txtLabelBackgroundColor"]').data("colorpicker-default-color", btnBgColor).val(btnBgColor);
        }

        initializeColorPickers();

        $(".txtColorPicker").on("keypress", function (event) {
            if (event.which == "13") event.preventDefault();
        });
    }

    if ($("html").hasClass("threedotfive"))
        $(".field.header-link-text").removeClass("hide");
};

// Add & edit layout.
$.initializeAddEditLayout = function () {
    // Always show add & edit page in 25 - 75 layout.
    $("#left, #center, #right").each(function () {
        var column = $(this).parents(".columns:first");

        if ($(this).find(".section.add, .section.edit, .item.add, .item.edit, #error404").length > 0)
            column.attr("class", "nine columns");
        else column.attr("class", "hide");
    });

    $(".poll").addClass("hide");
    $("#content .contentRow").removeClass("fullscreen").prepend('<div class="three columns" />');

    // Re-initialize sliders.
    $(".field.powerange").initializePowerange();

    //Add item title to document.title
    if (settings.section.isEdit) {
        var itemTitle = "",
            docTitle = document.title;

        if ($("html").hasClass("pageType73"))
            // Vragen
            itemTitle = $('textarea[id$="_txtBriefDescription"]').val();
        else if ($("html").hasClass("pageType12"))
            // Agenda
            itemTitle = $('input[id$="_txtEventTitle"]').val();
        else if ($("html").hasClass("pageType87"))
            // FAQ
            itemTitle = $('input[id$="_txtQuestion"]').val();
        else if ($("html").hasClass("pageType8"))
            // Beeldbank
            itemTitle = $('input[id$="_txtPhotoTitle"]').val();
        else {
            if ($('input[id$="_txtTitle"]').length > 0) itemTitle = $('input[id$="_txtTitle"]').val();
        }

        if (itemTitle != "") {
            if (settings.section.showFirstNameInTitle && itemTitle.indexOf("{firstName}") > -1)
                itemTitle = itemTitle.replace("{firstName}", settings.user.firstName);

            docTitle = docTitle.replace("wijzigen", "'" + itemTitle + "' wijzigen");
            document.title = docTitle;
        }
    }
};

// Editors.
$.fn.initializeEditors = function () {
    var editors = $(this);

    if (editors.length > 0) {
        // CKEditor configuration.
        editors.find("textarea").each(function (i) {
            // Check if editor is ready.
            CKEDITOR.config.language = settings.language;

            if (typeof CKFinder !== "undefined") CKFinder.setupCKEditor(null, "/ckfinder/");
        });

        if ($("#html.section").length > 0) {
            // Left column editor.
            if ($(".leftEditor").length > 0) $("#leftContentEditor").removeClass("hide");

            // Right column editor.
            if ($(".rightEditor").length > 0) $("#rightContentEditor").removeClass("hide");
        }

        CKEDITOR.on("instanceReady", function() {
            $(".cke_button:not(.cke_button_disabled)").each(function() {
                $(this).removeAttr("tabindex");
            });
        });
    }
};

// Count and limit remaning characters.
$.fn.initializeCountCharacters = function () {
    var characterCounts = $(this);

    characterCounts.each(function () {
        var charCount = $(this),
            inputField = charCount.parent(),
            maximumCharacters = charCount.val(),
            charactersLeft = inputField.find(".charactersLeft");

        if (inputField.find("textarea").length > 0) inputField = inputField.find("textarea:first");
        else inputField = inputField.find("input:text:first");

        var inputCountLeft = maximumCharacters - $("<div>").text(inputField.val()).html().length;

        // Write number of remaining characters in field label.
        charactersLeft.find(".count").html(inputCountLeft);

        if (inputCountLeft < 1) addCharLimitReachedText(charactersLeft);

        checkTextWarningLevel(inputField, inputCountLeft);

        inputField.on("keyup", function () {
            var valueLength = $("<div>").text(inputField.val()).html().length;

            maximumCharacters = charCount.val();
            inputCountLeft = maximumCharacters - valueLength;

            checkTextWarningLevel(inputField, inputCountLeft);

            if (valueLength >= maximumCharacters) {
                // Trim characters if maximum is reached.
                inputField.val(inputField.val().substring(0, maximumCharacters));
                charactersLeft.find(".count").html(0);

                addCharLimitReachedText(charactersLeft);
            } else {
                // Update number of remaining characters.
                charactersLeft.find(".count").html(inputCountLeft);

                if (charactersLeft.find(".screenReaderContent.limitReached").length > 0)
                    charactersLeft.find(".screenReaderContent.limitReached").remove();
            }
        });
    });

    function addCharLimitReachedText(charactersLeft) {
        if (charactersLeft.find(".screenReaderContent.limitReached").length == 0) {
            var charsLeftText = $("<span />");
            charsLeftText.addClass("screenReaderContent limitReached");
            charsLeftText.html(settings.warnings.charLimitReachedText);

            charactersLeft.append(charsLeftText);
        }
    }

    function checkTextWarningLevel(inputField, inputCountLeft) {
        if (inputCountLeft <= 5) inputField.addClass("warning");
        else if (inputField.hasClass("warning")) inputField.removeClass("warning");
    }
};

// Initialize date time select.
$.fn.initializeDateSelect = function () {
    var selectedDate = $.fn.getQueryString("date");

    $(this).each(function () {
        var theObject = $(this);

        var theDayObject = theObject.find("select[name$='$dropDay']");
        var theMonthObject = theObject.find("select[name$='$dropMonth']");
        var theYearObject = theObject.find("select[name$='$dropYear']");
        var theHourObject = theObject.find("select[name$='$dropHour']");
        var theMinuteObject = theObject.find("select[name$='$dropMinute']");

        theDayObject.addClass("day");
        theMonthObject.addClass("month");
        theYearObject.addClass("year");
        theHourObject.addClass("hour");
        theMinuteObject.addClass("minute");

        checkLastDayOfTheMonth(theDayObject, theMonthObject, theYearObject);

        $(theObject).on("change", "#" + theMonthObject.attr("id"), function () {
            checkLastDayOfTheMonth(theDayObject, theMonthObject, theYearObject);
        });

        $(theObject).on("change", "#" + theYearObject.attr("id"), function () {
            checkLastDayOfTheMonth(theDayObject, theMonthObject, theYearObject);
        });

        if (
            selectedDate != "" &&
            selectedDate.split("-").length == 3 &&
            (theObject.hasClass("startDate") || theObject.hasClass("endDate"))
        ) {
            // Select date.
            var selectedYear = selectedDate.split("-")[0].replace(/^0+/, "");
            var selectedMonth = selectedDate.split("-")[1].replace(/^0+/, "");
            var selectedDay = selectedDate.split("-")[2].replace(/^0+/, "");

            theDayObject.val(selectedDay);
            theMonthObject.val(selectedMonth);
            theYearObject.val(selectedYear);

            // Trigger errors or warnings if needed.
            setTimeout(function () {
                theDayObject.trigger("change");
            }, 0);
        }
    });

    function checkLastDayOfTheMonth(dayObj, monthObj, yearObj) {
        var theLastDayInMonth = 31;

        if (monthObj.val() > 0 && yearObj.val() > 0)
            theLastDayInMonth = new Date(yearObj.val(), monthObj.val(), 0).getDate();

        dayObj.find("option").each(function () {
            var theOptionObject = $(this);

            if (parseInt(theOptionObject.attr("value")) > theLastDayInMonth) {
                theOptionObject.hide();

                if (parseInt(dayObj.val()) == parseInt(theOptionObject.attr("value"))) dayObj.val(0);
            } else theOptionObject.show();
        });
    }

    // Date pickers.
    if (settings.datePicker && !settings.webGuidelines) $(this).initializeDateTimePickers();
    else $(this).find(".day, .month, .year, .hour, .minute").show(); // Failover (old skool drop downs).
};

// Initialize date/time (range) pickers.
$.fn.initializeDateTimePickers = function (options) {
    if (!settings.datePicker || settings.webGuidelines) return;

    $(this)
        .each(function () {
            var dateTimeField = $(this);
            var autoUpdate = dateTimeField.hasClass("dateTimeSelect");
            var dataOptions = dateTimeField.data("daterangepicker-options");

            dateTimeField.addClass("dateTimePicker icon-calendar before");

            var defaults = {
                autoApply: autoUpdate,
                autoUpdateInput: autoUpdate,
                singleDatePicker: true,
                showWeekNumbers: false,
                showDropdowns: false,
                hideButtons: autoUpdate,
                timePicker: true,
                timePicker24Hour: true,
                timePickerSeconds: false,
                timePickerIncrement: 15,
                format: autoUpdate ? "D MMMM YYYY [" + settings.various.timeText + "] HH:mm" : "D MMMM YYYY",
                pastDate: true,
            };

            var options = $.extend(defaults, options, dataOptions);

            if (!options.pastDate) options.minDate = new Date();

            var day = dateTimeField.find(".day").val() > 0 ? dateTimeField.find(".day").val() : moment().format("D");
            var month =
                dateTimeField.find(".month").val() > 0 ? dateTimeField.find(".month").val() : moment().format("M");
            var year =
                dateTimeField.find(".year").val() > 0 ? dateTimeField.find(".year").val() : moment().format("YYYY");
            var minYear = dateTimeField.find(".year option:eq(1)").val();
            var maxYear = dateTimeField.find(".year option:last").val();
            var hour = dateTimeField.find(".hour").length > 0 ? dateTimeField.find(".hour").val() : "0";
            var minute = dateTimeField.find(".minute").length > 0 ? dateTimeField.find(".minute").val() : "0";

            if (parseInt(hour) == -1) hour = 0;
            if (parseInt(minute) == -1) minute = 0;

            if (parseInt(day) < 10) day = "0" + day;

            if (parseInt(month) < 10) month = "0" + month;

            if (parseInt(hour) < 10) hour = "0" + hour;

            if (parseInt(minute) < 10) minute = "0" + minute;

            var isoStartDate = year + "-" + month + "-" + day + "T" + hour + ":" + minute;
            var isoEndDate = isoStartDate;

            if (dateTimeField.find(".dateTimeOutput").length == 0) {
                // Create new output field.
                var dateTimeOutput = $("<input />").prop("type", "text").addClass("dateTimeOutput");
                dateTimeOutput.appendTo(dateTimeField);
            }

            // Set output field start value manually.
            if (
                !autoUpdate &&
                dateTimeField.find(".day").val() != 0 &&
                dateTimeField.find(".month").val() != 0 &&
                dateTimeField.find(".year").val() != 0
            )
                dateTimeField.find(".dateTimeOutput").val(moment(isoStartDate).format(options.format));

            // Init.
            dateTimeField.find(".dateTimeOutput").daterangepicker(
                {
                    parentEl: dateTimeField,
                    autoApply: options.autoApply,
                    autoUpdateInput: options.autoUpdateInput,
                    singleDatePicker: options.singleDatePicker,
                    showWeekNumbers: options.showWeekNumbers,
                    showDropdowns: options.showDropdowns,
                    timePicker: options.timePicker,
                    timePicker24Hour: options.timePicker24Hour,
                    timePickerSeconds: options.timePickerSeconds,
                    timePickerIncrement: options.timePickerIncrement,
                    startDate: moment(isoStartDate).format(options.format), // ISO 8601 format
                    endDate: moment(isoEndDate).format(options.format), // ISO 8601 format
                    minDate: options.minDate
                        ? options.minDate
                        : moment(minYear + "-01-01T00:00").format(options.format), // ISO 8601 format
                    maxDate: moment(maxYear + "-12-31T00:00").format(options.format), // ISO 8601 format
                    buttonClasses: options.hideButtons ? "hide" : "button",
                    applyButtonClasses: "general",
                    cancelButtonClasses: "",
                    locale: {
                        format: options.format,
                        applyLabel: settings.statistics.applyText,
                        cancelLabel: settings.statistics.cancelText,
                        daysOfWeek: [
                            settings.various.daysShortSunday,
                            settings.various.daysShortMonday,
                            settings.various.daysShortTuesday,
                            settings.various.daysShortWednesday,
                            settings.various.daysShortThursday,
                            settings.various.daysShortFriday,
                            settings.various.daysShortSaturday,
                        ],
                        monthNames: [
                            settings.various.monthsShortJanuary,
                            settings.various.monthsShortFebruary,
                            settings.various.monthsShortMarch,
                            settings.various.monthsShortApril,
                            settings.various.monthsShortMay,
                            settings.various.monthsShortJune,
                            settings.various.monthsShortJuly,
                            settings.various.monthsShortAugust,
                            settings.various.monthsShortSeptember,
                            settings.various.monthsShortOctober,
                            settings.various.monthsShortNovember,
                            settings.various.monthsShortDecember,
                        ],
                    },
                },
                function (startDate, endDate) {
                    if (autoUpdate) {
                        var day = startDate.format("D");
                        var month = startDate.format("M");
                        var year = startDate.format("YYYY");
                        var hour = startDate.format("H");
                        var minute = startDate.format("m");

                        // Set date selects.
                        dateTimeField.find(".day").val(day).trigger("change");
                        dateTimeField.find(".month").val(month).trigger("change");
                        dateTimeField.find(".year").val(year).trigger("change");
                        dateTimeField.find(".hour").val(hour).trigger("change");
                        dateTimeField.find(".minute").val(minute).trigger("change");

                        // Update linked end date (used for events).
                        if (dateTimeField.hasClass("startDate")) $(".field.endDate").initializeDateTimePickers();
                    }
                }
            );

            // Check if minDate is higher than curent set date in controls
            if (options.minDate && moment(options.minDate).isAfter(isoStartDate)) {
                if (autoUpdate) {
                    var momentMinDate = moment(options.minDate);
                    var day = momentMinDate.format("D");
                    var month = momentMinDate.format("M");
                    var year = momentMinDate.format("YYYY");
                    var hour = momentMinDate.format("H");
                    var minute = momentMinDate.format("m");

                    // Set date selects.
                    dateTimeField.find(".day").val(day).trigger("change");
                    dateTimeField.find(".month").val(month).trigger("change");
                    dateTimeField.find(".year").val(year).trigger("change");
                    dateTimeField.find(".hour").val(hour).trigger("change");
                    dateTimeField.find(".minute").val(minute).trigger("change");

                    // Update linked end date (used for events).
                    if (dateTimeField.hasClass("startDate")) $(".field.endDate").initializeDateTimePickers();
                }
            }
        })
        .on("show.daterangepicker", function (e, picker) {
            var dateTimeField = $(this);
            var dateRangePicker = dateTimeField.find(".daterangepicker");

            // Always enable timepicker, but hide with CSS when not needed (workaround for bug in datepicker).
            if (!dateTimeField.hasClass("dateTimeSelect")) {
                // Hide timepicker, so calendar always hides 'onblur' instead of 'onclick'.
                dateRangePicker.find(".calendar-time").addClass("hide");
            }

            // Show button container.
            if (dateRangePicker.find(".drp-buttons .button").length > 0) dateRangePicker.find(".drp-buttons").show();
        })
        .on("apply.daterangepicker", function (e, picker) {
            var dateTimeField = $(this);
            var day = picker.startDate.format("D");
            var month = picker.startDate.format("M");
            var year = picker.startDate.format("YYYY");

            // Set date selects.
            dateTimeField.find(".day").val(day).trigger("change");
            dateTimeField.find(".month").val(month).trigger("change");
            dateTimeField.find(".year").val(year).trigger("change");

            // Output value.
            dateTimeField.find(".dateTimeOutput").val(picker.startDate.format(picker.locale.format));
        })
        .on("cancel.daterangepicker", function (e, picker) {});
};

// Newsletters add & edit.
$.fn.initializeNewslettersAddEdit = function () {
    var container = $(this),
        sendToAllCbx = $('input[name*="chkSendMailingToAllUsersInSelectedRoles"]');

    if (sendToAllCbx.is(":checked")) sendToAllCbx.closest(".field").addClass("switched");
    else sendToAllCbx.closest(".field").removeClass("switched");

    $('input[name*="chkSendMailingToAllUsersInSelectedRoles"]').on("change", function () {
        if ($(this).is(":checked")) $(this).closest(".field").addClass("switched");
        else $(this).closest(".field").removeClass("switched");
    });

    // Count service mail receivers.
    container
        .find(".button.count")
        .off("click")
        .on("click", function () {
            $.fn.setMultiSelectsData();
        });

    // Save as new template button.
    $(".templateToolbar .button.saveAsNewTemplate input:submit").on("click", function () {
        // Show warning when saving as a new template.
        if (!$(this).confirm(settings.warnings.saveNewTemplateText)) {
            $("#toolbarBottom").find(".loader").hide();
            $("#toolbarBottom").find(".button").show();

            return false;
        }
    });

    // Save template button.
    $("#toolbarBottom .button.saveTemplate input:submit").on("click", function () {
        // Show warning when saving as the current template.
        if (!$(this).confirm(settings.warnings.saveTemplateText)) {
            $("#toolbarBottom").find(".loader").hide();
            $("#toolbarBottom").find(".button").show();

            return false;
        }
    });

    // Send button.
    $("#toolbarBottom .button.send input:submit").on("click", function () {
        var warningMessage = "";

        if (settings.user.ID != $(".newsletterSender select").val() && $(".rolesSelect .selected").length > 0) {
            // Multiple warnings.
            warningMessage += "1. " + settings.warnings.differentSenderText + "<br />";
            warningMessage += "2. " + settings.warnings.rolesSelectedText;

            if ($('input[name*="chkSendMailingToAllUsersInSelectedRoles"]').is(":checked"))
                warningMessage += "<br />3. " + settings.warnings.sendNewsletterToAllUsersText;
        } else if (settings.user.ID != $(".newsletterSender select").val()) {
            // Show warning when sending from another email address.
            warningMessage += settings.warnings.differentSenderText;

            if ($('input[name*="chkSendMailingToAllUsersInSelectedRoles"]').is(":checked"))
                warningMessage = "1. " + warningMessage + "<br />2. " + settings.warnings.sendNewsletterToAllUsersText;
        } else if ($(".rolesSelect .selected").length > 0) {
            // Show warning when sending to roles.
            warningMessage += settings.warnings.rolesSelectedText;

            if ($('input[name*="chkSendMailingToAllUsersInSelectedRoles"]').is(":checked"))
                warningMessage = "1. " + warningMessage + "<br />2. " + settings.warnings.sendNewsletterToAllUsersText;
        }

        if (warningMessage != "" && !$(this).confirm(warningMessage)) {
            $("#toolbarBottom").find(".loader").hide();
            $("#toolbarBottom").find(".button").show();

            return false;
        }
    });

    // Back button.
    if ($(".toolbar .backToMain").length > 0) {
        $(".toolbar .backToMain a")
            .off("click")
            .on("click", function () {
                window.location.href = globals.url.substring(0, globals.url.lastIndexOf("/"));

                return false;
            });
    }

    // Update progress bar.
    if (container.find(".progress").length > 0) {
        $(".stopTask")
            .off("click")
            .on("click", function () {
                $.ajax({
                    type: "GET",
                    url: "/api/longrunningtasks/stopTask",
                    data: {
                        taskid: $.fn.getQueryString("taskid"),
                        token: $("input[name='__RequestVerificationToken']").val(),
                    },
                }).done(function (data) {});

                $(this).off("click").css({ opacity: 0.3 });

                return false;
            });

        function updateProgress() {
            var url =
                "/api/longrunningtasks/GetTaskByID?taskid=" +
                $.fn.getQueryString("taskid") +
                "&token=" +
                $("input[name='__RequestVerificationToken']").val() +
                "&preventCache=" +
                Date.now();

            $.getJSON(url, function (data) {
                var task = data[0];

                // Update progressbar.
                $(".progress").updateProgressBar({ progress: task.progressPercentage });

                if (task.statusID == 999) {
                    // An error has occured, show error message and restart button.
                    $(".errorMessage").removeClass("hide");
                    $(".restartTask").removeClass("hide");
                } else if (task.statusID == 998) {
                    // Show restart button if the task is stopped by user.
                    $(".stopTask").addClass("hide");
                    $(".restartTask").removeClass("hide");
                } else if (task.progressPercentage < 100) {
                    // Do recursive loop while task is being executed.
                    $(".stopTask").removeClass("hide");
                    $(".restartTask").addClass("hide");

                    setTimeout(updateProgress, 1000);
                }

                // Hide restart- and stop button if the task is 100%.
                if (task.progressPercentage == 100) $(".stopTask, .restartTask").addClass("hide");
            });
        }

        // Initialize progress bar.
        setTimeout(updateProgress, 1000);
    }
};

// CMS add & edit.
$.initializeCMSAddEdit = function () {
    var isAdd = $("#cms.add").length > 0;
    var isEdit = $("#cms.edit").length > 0;

    // Add or edit page.
    if (isAdd || isEdit) {
        var pageName = $("#generalTabContent .pageName input:text");
        var pageTitle = $("#generalTabContent .pageTitle input:text");
        var pageMenuTitle = $("#generalTabContent .pageMenuTitle input:text");
        var pageDescription = $("#generalTabContent .pageDescription textarea");

        // Copy value from page name to other fields.
        pageTitle.on("blur", function () {
            if (pageTitle.val().length != 0) {
                if (pageName.val().length == 0) pageName.val(pageTitle.val()).trigger("keyup").trigger("blur");

                if (pageMenuTitle.val().length == 0) pageMenuTitle.val(pageTitle.val()).trigger("keyup");

                if (pageDescription.val().length == 0) pageDescription.val(pageTitle.val()).trigger("keyup");
            }
        });

        pageName.on("blur", function () {
            // Remove special characters from page name.
            if (pageName.val().length != 0) {
                pageName.val($.fn.replaceSpecialCharacters(pageName.val()).toLowerCase());
                pageName.val($.fn.removeSpecialCharacters(pageName.val()).toLowerCase());
            }
        });

        // Page type selection.
        $("#generalTabContent .pageTypes").initializeCMSPageTypes();

        // Theme selection.
        $("#appearanceTabContent .themes").initializeCMSThemes();

        // Layout selection.
        $("#appearanceTabContent .layouts").initializeCMSLayouts();

        // Header edit.
        $(
            "#appearanceTabContent .headers .toolbar .button.cancel a, #appearanceTabContent .headers .toolbar .button.save a"
        ).on("click", function () {
            $(this).parent().find("input").trigger("click");

            return false;
        });

        // Comment, voting & rating rights.
        $("#securityTabContent").append(
            $("#optionsTabContent .commentRights, #optionsTabContent .votingRights, #optionsTabContent .ratingRights")
        );

        // Comment rights.
        $("#optionsTabContent .commentOptions .containerToggle").on("click", function () {
            $("#securityTabContent .commentRights").toggleClass("hide");
        });

        // Voting rights.
        $("#optionsTabContent .votingOptions .containerToggle").on("click", function () {
            $("#securityTabContent .votingRights").toggleClass("hide");
        });

        // Rating rights.
        $("#optionsTabContent .ratingOptions .containerToggle").on("click", function () {
            $("#securityTabContent .ratingRights").toggleClass("hide");
        });

        // Security buttons.
        $("#optionsTabContent .button.security").on("click", function () {
            $("#securityTab a")[0].click();

            return false;
        });

        // Notifications.
        $("#optionsTabContent .followOptions")
            .insertAfter($("#notificationTabContent .notificationOptions legend:first"))
            .removeClass("hide");

        $("#notificationTabContent .notificationCenter")
            .off("click")
            .on("click", function () {
                document.location.href = settings.section.parentUrl.replace(
                    "/default.aspx",
                    "/notificaties/default.aspx"
                );

                return false;
            });
    }

    // Add page.
    if (isAdd) {
        // Initialize.
        $.fn.toggleCMSModuleOptions();

        $("#generalTabContent .pageType select").on("change", function () {
            // Toggle module options.
            $.fn.toggleCMSModuleOptions({
                pageTypeID: parseInt($(this).val()),
            });
        });

        // Copy rights.
        $("#generalTabContent .button.copyRights input:submit")
            .off("click")
            .on("click", function () {
                // Remove save warning.
                window.onbeforeunload = null;
                $(window).data("beforeunload", window.onbeforeunload);
            });

        if ($("#securityTabContent").length > 0) {
            $("#securityTabContent .copyRights .field")
                .append($("#generalTabContent .button.copyRights").removeClass("hide"))
                .parent()
                .removeClass("hide");
            $("#securityTabContent .viewRights legend").removeClass("lessMargin");
        }
    }

    // Edit page.
    if (isEdit) {
        // Toggle module options.
        $.fn.toggleCMSModuleOptions({
            pageTypeID: parseInt($("#optionsTabContent .pageTypeID input").val()),
        });

        // Headers.
        $(".headers .button.add").parent().removeClass("hide");

        // Anti caching after crop.
        $(".headers .image.cropper").each(function () {
            $(this).attr("src", $(this).attr("src") + "?preventCache=" + new Date().getTime());
        });

        // Map.
        if ($(".map").length > 0) {
            $("#mapTabContent").append($(".mapOptions"));

            // Map module, so always show map.
            if ($("#mapTabContent .toggleMap").length == 0)
                $("#mapTabContent .mapOptions .mapContainer").removeClass("hide");

            // Temp.
            if ($(".shortcut.admin").length > 0)
                $("#mapTabContent .mapOptions .mapType").parents(".field").removeClass("hide");
        }

        // Message after votes delete.
        if ($(".votesDeleted").length > 0 && $(".votesDeleted").html().trim().length > 0)
            $("body").showMessage({ content: $(".votesDeleted").html() });

        // Message after ratings delete.
        if ($(".ratingsDeleted").length > 0 && $(".ratingsDeleted").html().trim().length > 0)
            $("body").showMessage({ content: $(".ratingsDeleted").html() });

        // Events display type.
        $("#optionsTabContent .eventOptions .eventsDisplayType select")
            .off("change")
            .on("change", function () {
                if ($(this).val() == "calendar")
                    $("#optionsTabContent .eventOptions .calendarView").removeClass("hide");
                else $("#optionsTabContent .eventOptions .calendarView").addClass("hide");
            });
    }
};

// Toggle module options in CMS.
$.fn.toggleCMSModuleOptions = function (options) {
    // Default values.
    var defaults = {
        pageTypeID: 14,
    };

    var options = $.extend(defaults, options);

    // Initialize.
    $("#contentTabContent #contentEditor").addClass("hide");
    $("#appearanceTabContent .layout .layoutColumn33").parent().addClass("hide");
    $(
        "#optionsTabContent .sorter select:first option[value='Voting'], #optionsTabContent .sorter select:first option[value='Rating'], #optionsTabContent .powerBiOptions"
    ).addClass("hide");
    $("#securityTabContent .addRights, #securityTabContent .deleteRights").removeClass("hide");
    $(
        "#optionsTabContent .itemCountOptions, #optionsTabContent .sortingOptions, #optionsTabContent .likeOptions, #optionsTabContent .notificationOptions, #optionsTabContent .tagOptions, #optionsTabContent .commentOptions, #optionsTabContent .tagOptions, #optionsTabContent .authorOptions"
    ).removeClass("hide");

    // Comment rights.
    if ($("#optionsTabContent .commentOptions .containerToggle input[type=checkbox]").is(":checked"))
        $("#securityTabContent .commentRights").removeClass("hide");

    // Voting rights.
    if ($("#optionsTabContent .votingOptions .toggleVoting input[type=checkbox]").is(":checked"))
        $("#securityTabContent .votingRights").removeClass("hide");

    // Rating rights.
    if ($("#optionsTabContent .ratingOptions .containerToggle input[type=checkbox]").is(":checked"))
        $("#securityTabContent .ratingRights").removeClass("hide");

    // Sorting.
    $("#optionsTabContent .sorter select:first").initializeSortingLabels();

    $("#optionsTabContent .sorter select:first").on("change", function () {
        $(this).initializeSortingLabels();
    });

    // Specific page type options.
    switch (options.pageTypeID) {
        // Links.
        case 4:
            $("#optionsTabContent .commentOptions").addClass("hide");

            break;

        // Documents.
        case 6:
            // Manual sorting.
            var manualSortingToggle = $("#optionsTabContent .sortingOptions .manualSorting input:checkbox");
            var manualSortingWarning = $("#optionsTabContent .sortingOptions .manualSortingWarning");
            var sortingContainer = $("#optionsTabContent .sortingOptions .container");
            var showFoldersToggle = $("#optionsTabContent .documentOptions .downloadsFolders input:checkbox:first");
            var hasMultipleFolders = $("#optionsTabContent .documentOptions .downloadsMultipleFolders input:checkbox");

            showFoldersToggle.off("click").on("click", function () {
                checkManualSorting();
            });

            function checkManualSorting() {
                if (!showFoldersToggle.is(":checked") && hasMultipleFolders.is(":checked")) {
                    // Disable manual sorting and show warning when there are multiple folders and folders are hibbem.
                    manualSortingToggle.prop("checked", false).prop("disabled", true);
                    manualSortingWarning.removeClass("hide");
                    sortingContainer.removeClass("hide");
                } else {
                    manualSortingToggle.prop("disabled", false);
                    manualSortingWarning.addClass("hide");
                }
            }

            checkManualSorting();

            break;

        // Default, updates (welcome) & Power BI page.
        case 14:
        case 39:
        case 86:
        case 90:
            $("#contentTabContent #contentEditor").removeClass("hide");
            $("#appearanceTabContent .layout .layoutColumn33").parent().removeClass("hide");
            $(
                "#securityTabContent .addRights, #securityTabContent .deleteRights, #securityTabContent .commentRights, #securityTabContent .votingRights, #securityTabContent .ratingRights, #notificationTab"
            ).addClass("hide");
            $(
                "#optionsTabContent .itemCountOptions, #optionsTabContent .sortingOptions, #optionsTabContent .likeOptions, #optionsTabContent .notificationOptions, #optionsTabContent .tagOptions, #optionsTabContent .commentOptions, #optionsTabContent .authorOptions"
            ).addClass("hide");

            if ($(".registrationOptions").length > 0) $(".registrationOptions legend").addClass("lessMargin");
            else $(".menuPathOptions legend").addClass("lessMargin");

            // Hide next button on options tab.
            if ($("#optionsTab.active").length > 0) $(".nextTab").addClass("hide");

            // Power BI options.
            if (options.pageTypeID == 86) $("#optionsTabContent .powerBiOptions").removeClass("hide");

            break;

        // Forum.
        case 17:
            break;

        // Users.
        case 28:
            $(
                "#optionsTabContent .sortingOptions, #optionsTabContent .likeOptions, #optionsTabContent .commentOptions, #optionsTabContent .tagOptions, #optionsTabContent .authorOptions"
            ).addClass("hide");

            break;

        // Registrations.
        case 43:
            $(
                "#optionsTabContent .sortingOptions, #optionsTabContent .registrationOptions, #optionsTabContent .commentOptions, #optionsTabContent .authorOptions, #optionsTabContent .likeOptions"
            ).addClass("hide");

            break;

        // eParticipation.
        case 64:
            $(
                "#optionsTabContent .sorter select:first option[value='Voting'], #optionsTabContent .sorter select:first option[value='Rating']"
            ).removeClass("hide");
            $(
                "#optionsTabContent .allowAuthorUpdate, #optionsTabContent .allowAuthorDelete, .overlayContent .showLayerInLegend"
            ).addClass("hide");
            $("#optionsTabContent .showDate").before($("#optionsTabContent .eParticipationAuthorOptions .field"));

            function toggleYesNoVoting() {
                if ($("#optionsTabContent .toggleYesNoVoting input[type=checkbox]").is(":checked")) {
                    // Hide comment file upload and unlimited votes.
                    $("#optionsTabContent .toggleEnableDocumentsWithComments, #optionsTabContent .toggleUnlimitedVotes")
                        .parents(".field")
                        .addClass("hide");
                    $("#optionsTabContent .numberOfVotes").addClass("hide");

                    // Disable comment documents.
                    $("#optionsTabContent .toggleEnableDocumentsWithComments input[type=checkbox]")
                        .prop("checked", false)
                        .initializeSwitchery();

                    // Enable unlimited votes.
                    $("#optionsTabContent .toggleUnlimitedVotes input[type=checkbox]")
                        .prop("checked", true)
                        .initializeSwitchery();
                } else {
                    $("#optionsTabContent .toggleEnableDocumentsWithComments, #optionsTabContent .toggleUnlimitedVotes")
                        .parents(".field")
                        .removeClass("hide");
                }
            }

            $("#optionsTabContent .toggleYesNoVoting input[type=checkbox]")
                .off("change")
                .on("change", function () {
                    var checked = $(this).prop("checked"),
                        exportLink = $("<a />");

                    exportLink
                        .attr("href", "javascript:$('.button.export input')[0].trigger('click');")
                        .html(settings.warnings.editFormExportText);

                    if (!$(this).confirm(settings.warnings.editFormChangeText + " " + exportLink.get(0).outerHTML))
                        checked = !checked;
                    else $.fn.ePartiTypeSwitch(checked);

                    $(this).prop("checked", checked).initializeSwitchery();

                    toggleYesNoVoting();
                });

            toggleYesNoVoting();

            break;

        // FAQ.
        case 73:
        case 74:
            $("#mapTab").addClass("hide");

            if ($(".button.nextTab input:button").val() == "Kaart") $(".button.nextTab").addClass("hide");

            break;
    }
};

// Events add & edit.
$.fn.initializeEventsAddEdit = function () {
    var container = $(this),
        showWarning = false;

    if (container.length > 0) {
        var allDayCheckbox = container.find(".allDay input:checkbox");

        function getDate(field) {
            var returnValue;

            if (field.find("select").length > 2) {
                // Add time.
                var returnValue = new Date(
                    parseInt(field.find("select:eq(2)").val()),
                    parseInt(field.find("select:eq(1)").val() - 1),
                    parseInt(field.find("select:eq(0)").val()),
                    parseInt(field.find("select:eq(3)").val()),
                    parseInt(field.find("select:eq(4)").val())
                );
            } else {
                var returnValue = new Date(
                    parseInt(field.find("select:eq(2)").val()),
                    parseInt(field.find("select:eq(1)").val() - 1),
                    parseInt(field.find("select:eq(0)").val())
                );
            }

            return returnValue;
        }

        if (allDayCheckbox.is(":checked")) {
            if (!settings.webGuidelines)
                container
                    .find(
                        ".startDate .day, .startDate .month, .startDate .year, .startDate .hour, .startDate .minute, .endDate .day, .endDate .month, .endDate .year, .endDate .hour, .endDate .minute"
                    )
                    .addClass("hide");
            else
                container
                    .find(".startDate .hour, .startDate .minute, .endDate .hour, .endDate .minute")
                    .addClass("hide");

            container
                .find(".startDate, .endDate")
                .removeClass("dateTimeSelect")
                .addClass("dateSelect")
                .initializeDateTimePickers();
        }

        // Toggle time selects.
        allDayCheckbox.on("change", function () {
            if ($(this).is(":checked")) {
                if (!settings.webGuidelines)
                    container
                        .find(
                            ".startDate .day, .startDate .month, .startDate .year, .startDate .hour, .startDate .minute, .endDate .day, .endDate .month, .endDate .year, .endDate .hour, .endDate .minute"
                        )
                        .addClass("hide");
                else
                    container
                        .find(".startDate .hour, .startDate .minute, .endDate .hour, .endDate .minute")
                        .addClass("hide");

                container
                    .find(".startDate, .endDate")
                    .removeClass("dateTimeSelect")
                    .addClass("dateSelect")
                    .initializeDateTimePickers();
            } else {
                container.find(".startDate, .endDate").removeClass("dateSelect").addClass("dateTimeSelect");

                setTimeout(function () {
                    if (!settings.webGuidelines)
                        container
                            .find(
                                ".startDate .day, .startDate .month, .startDate .year, .startDate .hour, .startDate .minute, .endDate .day, .endDate .month, .endDate .year, .endDate .hour, .endDate .minute"
                            )
                            .removeClass("hide");
                    else
                        container
                            .find(".startDate .hour, .startDate .minute, .endDate .hour, .endDate .minute")
                            .removeClass("hide");

                    container.find(".startDate, .endDate").initializeDateTimePickers();
                }, 300);
            }
        });

        // Date/time checks.
        $(".startDate select, .endDate select").each(function (i) {
            var currentDate = new Date();
            var startDate = $(".startDate");
            var endDate = $(".endDate");
            var originalStartDateValue = getDate(startDate);
            var originalEndDateValue = getDate(endDate);

            $(this)
                .off("change")
                .on("change", function () {
                    // Reset.
                    startDate.removeClass("warning");
                    endDate.removeClass("danger");
                    endDate.find("select").removeAttr("aria-invalid");

                    // Link start/end date/time.
                    if ($(this).parents(".startDate").length > 0)
                        endDate.find("select:eq(" + i + ")").val($(this).val());

                    // Start & end date.
                    var startDateValue = getDate(startDate);
                    var endDateValue = getDate(endDate);

                    // Warning.
                    if (startDateValue.getTime() < currentDate.getTime()) startDate.addClass("warning");

                    // Error.
                    if (endDateValue.getTime() < startDateValue.getTime()) endDate.addClass("danger");
                    endDate.find("select").attr("aria-invalid", "true");

                    if (
                        settings.section.isEdit &&
                        (originalStartDateValue.getTime() != startDateValue.getTime() ||
                            originalEndDateValue.getTime() != endDateValue.getTime())
                    )
                        showWarning = true;
                    else showWarning = false;
                });
        });

        // Show warning when editing an event.
        $(".toolbarBottom .button.save input:submit").on("click", function (event) {
            var warningMessage = "";

            if (showWarning && $(".rolesSelect .selected").length > 0) {
                // Multiple warnings.
                warningMessage += "1. " + settings.warnings.eventEditInvitesText + "<br />";
                warningMessage += "2. " + settings.warnings.rolesSelectedText;
            } else {
                // Event edit.
                if (showWarning) warningMessage = settings.warnings.eventEditInvitesText;

                // Show warning when sending to roles.
                if ($(".rolesSelect .selected").length > 0) warningMessage += settings.warnings.rolesSelectedText;
            }

            if (warningMessage != "" && !$(this).confirm(warningMessage)) {
                $(".toolbarBottom").find(".loader").hide();
                $(".toolbarBottom").find(".button").show();

                return false;
            } else {
                if (showWarning) {
                    // Logging.
                    $.ajax({
                        method: "GET",
                        url: "/api/events/logEventChanged",
                        data: {
                            sectionID: settings.section.ID,
                            eventID: settings.section.itemID,
                            token: $("input[name='__RequestVerificationToken']").val(),
                        },
                    });
                }
            }
        });
    }
};

// Registrations add & edit.
$.fn.initializeRegistrationsAddEdit = function () {
    var registration = $(this);
    if (registration.length === 0)
        return;
    
    // Page after registration.
    if (registration.find(".enableExternalPage input:checkbox").is(":checked")) {
        registration.find(".internalPage").addClass("hide");
        registration.find(".externalPage").removeClass("hide");
        $("#toggleExternalPage").attr("checked", true).initializeSwitchery();
    } else {
        registration.find(".externalPage").addClass("hide");
        registration.find(".internalPage").removeClass("hide");
    }

    $("#toggleExternalPage").on("change", function () {
        registration.find(".enableExternalPage input:checkbox").trigger("click");
    });

    // Enable email repeat/validation field in required fields multiselect, to make it optional.
    var requiredFieldsInterval = setInterval(function () {
        if ($(".multiSelect.requiredFields .options li").length > 0) {
            $(".multiSelect.requiredFields .options li").each(function () {
                if ($(this).text().toLowerCase() == settings.fields.emailConfirmFieldText.toLowerCase()) {
                    $(this).removeClass("disabled");
                }
            });

            clearInterval(requiredFieldsInterval);
        }
    }, 100);
};

// Links add & edit.
$.fn.initializeLinksAddEdit = function () {
    var link = $(this);

    if (link.length > 0) {
        var linkSections = $("#linkSections");
        var linkSectionID = $(".linkSectionID");
        var linkItems = $("#linkItems");
        var linkItemID = $(".linkItemID");
        var linkURL = $(".linkURL");

        if (link.find(".field .linkType").val() == 0) {
            // Internal link.
            linkURL.parent().addClass("hide");

            // Section select.
            if (linkSections.length > 0) {
                linkSections.empty();
                linkSections.append('<option value="">' + settings.links.selectSectionText + "</option>");

                // Get sections.
                $.ajax({
                    type: "GET",
                    url:
                        "/api/pageTree/childrenOf?section_id=home&token=" +
                        $("input[name='__RequestVerificationToken']").val() +
                        "&preventCache=" +
                        new Date().getTime().toString(),
                })
                    .done(function (data) {
                        $.each(data, function (i) {
                            if (this.section_name != "Shortcuts") {
                                var prefix = "";

                                if (i != 0) {
                                    var depth = this.Url.split("/").length;

                                    for (var i = 1; i < depth; i++) {
                                        prefix += "&nbsp;&nbsp;&nbsp;&nbsp;";
                                    }
                                }

                                var option = $(
                                    '<option data-pagetype="' +
                                        this.section_pageType +
                                        '" value="' +
                                        this.section_id +
                                        '">' +
                                        prefix +
                                        this.section_name +
                                        "</option>"
                                );

                                if (linkSectionID.val() == this.section_id) option.prop("selected", true);

                                linkSections.append(option);
                            }
                        });

                        // Initialize.
                        linkSections.trigger("change");
                    })
                    .fail(function () {
                        $.fn.showError(settings.errors.getSectionsErrorText + " (500.45)");
                    });

                // Select section.
                linkSections.on("change", function () {
                    // Get content items (if available).
                    if (linkSections.val() != "") {
                        $.ajax({
                            type: "GET",
                            url:
                                "/api/pageTree/contentPagesOf?section_id=" +
                                linkSections.val() +
                                "&pageType=" +
                                linkSections.find(":selected").data("pagetype") +
                                "&token=" +
                                $("input[name='__RequestVerificationToken']").val() +
                                "&preventCache=" +
                                new Date().getTime().toString(),
                        })
                            .done(function (data) {
                                if (data.length > 0) {
                                    linkItems.empty();
                                    linkItems.append('<option value="">' + settings.links.selectItemText + "</option>");

                                    $.each(data, function (i) {
                                        var theTitle =
                                            (this.contentPage_parentID != -1 ? "&nbsp;&nbsp;&nbsp;&nbsp;" : "") +
                                            this.contentPage_title;

                                        if (theTitle != "") {
                                            var option = $(
                                                '<option value="' + this.contentPage_id + '">' + theTitle + "</option>"
                                            );

                                            if (linkItemID.val() == this.contentPage_id) option.prop("selected", true);

                                            linkItems.append(option);
                                        }
                                    });

                                    // Show content items.
                                    linkItems.parent().removeClass("hide");
                                } else {
                                    // Hide content items.
                                    linkItems.parent().addClass("hide");
                                    linkItems.empty();
                                }
                            })
                            .fail(function () {
                                $.fn.showError(settings.errors.getItemsErrorText + " (500.46)");
                            });

                        // Place selected section in hidden field.
                        linkSectionID.val(linkSections.val());
                    } else {
                        // Reset.
                        linkItems.parent().addClass("hide");
                        linkItems.empty();
                        linkSectionID.val("");
                        linkItemID.val("");
                    }
                });

                // Select item.
                linkItems.on("change", function () {
                    // Place selected item in hidden field. Or reset
                    if (linkItems.val() != "") linkItemID.val(linkItems.val());
                    else linkItemID.val("");
                });
            }
        } else {
            // External link.
            linkSectionID.val("");
            linkItemID.val("");
            linkURL.parent().removeClass("hide");
        }
    }
};

// Initialize fancy page type selection.
$.fn.initializeCMSPageTypes = function () {
    var pageTypes = $(this);

    // Add.
    if (pageTypes.find("select option").length > 1) {
        pageTypes
            .find("select option")
            .not("select option:first")
            .each(function () {
                var pageType = $(this);
                var pageTypePreview = $('<div class="module icon-pagetype-' + pageType.val() + ' before" />');

                pageTypePreview.attr("data-pagetype-id", pageType.val());
                pageTypePreview.html("<br />" + pageType.html());

                // Page type selection.
                pageTypePreview.off("click").on("click", function () {
                    $(".module").removeClass("selected");
                    pageTypePreview.addClass("selected");

                    // Select page type in drop down list.
                    pageTypes.find("select").val(pageTypePreview.data("pagetype-id")).trigger("change");

                    if ($(".item.add").length > 0) {
                        $(".pageTypeID input").val(pageType.val());
                        $(".pageTypeName input").val(pageType.html());
                    }
                });

                // Place default page first.
                if (pageType.val() == 14) pageTypePreview.insertBefore(pageTypes.find(".module:first"));
                else pageTypes.append(pageTypePreview);
            });

        $(".pageType").removeClass("hide");
    }

    // Edit.
    if ($(".pageTypeID input").val() != "" && $(".pageTypeName input").val() != "") {
        var pageTypePreview = $(
            '<div class="module icon-pagetype-' + $(".pageTypeID input").val() + ' selected before" />'
        );
        pageTypePreview.html("<br />" + $(".pageTypeName input").val());

        $(".pageType").append(pageTypePreview).removeClass("hide");
    }
};

$.fn.initializeCMSThemes = function () {
    var themes = $(this);
    var skins = themes.find(".skins select");
    var styles = themes.find(".styles select");

    // Select default stylesheet when changing a skin.
    skins.off("change").on("change", function () {
        var selectedSkin = $(this).find("option:selected").val();

        if (selectedSkin !== "") {
            styles.val(selectedSkin + "/Styles/default.css");
        } else {
            // Inherit.
            styles.val("");
        }
    });
};

// Initialize fancy layout selection.
$.fn.initializeCMSLayouts = function () {
    var layouts = $(this);

    if (layouts.find(".layout").length == 0) {
        layouts.find("select option").each(function () {
            var option = $(this);
            var optionValue = option.val();
            var layout = $('<div class="layout" />');

            // Only show fullscreen & content only layouts to admins.
            if (
                (optionValue.indexOf("fullscreen") > -1 || optionValue.indexOf("content_only") > -1) &&
                !settings.user.isAdmin
            ) {
                return true;
            }

            if (optionValue != "" && optionValue.match(/25|33|50|75|100/)) {
                var columns = optionValue
                    .substring(optionValue.lastIndexOf("/") + 1, optionValue.indexOf(".ascx"))
                    .split(" - ");

                $.each(columns, function (i, columnValue) {
                    // Create new column.
                    var column = $('<div class="layoutColumn" />').addClass("layoutColumn" + columnValue);
                    columnValue = columnValue
                        .replace("25", "1/4")
                        .replace("33", "1/3")
                        .replace("75", "3/4")
                        .replace("100", "1/1");

                    if (columns.length == 2) columnValue = columnValue.replace("50", "1/2");
                    else columnValue = columnValue.replace("50", "2/4");

                    // Append column to layout.
                    layout.append(column.html(columnValue));
                });
            } else {
                // Old or custom layouts.
                var column = $('<div class="layoutColumn layoutColumn100" />');
                columnValue = optionValue;

                if (columnValue == "") columnValue = settings.cms.inheritLayoutText;
                else
                    columnValue = columnValue.substring(columnValue.lastIndexOf("/") + 1, columnValue.indexOf(".ascx"));

                // Append column to layout.
                layout.append(column.html(columnValue));
            }

            // Check if layout is selected.
            if (optionValue == layouts.find("select option:selected").val()) layout.addClass("selected");

            // Append layout.
            layouts.find(".field").append(layout.attr("data-layout", optionValue));

            // Layout selection.
            layout.off("click").on("click", function () {
                layouts.find(".layout").removeClass("selected");
                layout.addClass("selected");

                // Select layout in drop down list.
                layouts.find("select").val(layout.data("layout"));
            });
        });
    }
};

// Load CMS page name drop down content.
$.fn.loadCMSPageNameDropdown = function (aCallbackFunction) {
    $.ajax({
        url: "/api/variable/GetVariable",
        data: {
            name: "PanoTourLocation",
            sectionID: $("[id$=_ddlPanoPages]").val(),
            token: $("input[name='__RequestVerificationToken']").val(),
        },
    })
        .done(function (aVarData) {
            var tourPath = aVarData[0].Value;

            if (tourPath == "undefined") {
                $.fn.alert(settings.errors.panoWrongConfiguration);

                return;
            }

            $.ajax({ url: tourPath + "tour.js" })
                .done(function (aData) {
                    eval(aData);

                    if (typeof VIADrupsteen.Tour == "function") {
                        var theTour = VIADrupsteen.Tour(tourPath);
                        var allLocations = theTour.photoManager.getAllLocations();

                        var theLocations = [[settings.cms.panoPageLocationPlaceholder, ""]];

                        for (var theIndex in allLocations) {
                            var theUniqueId =
                                "_" + $("[id$='_ddlPanoPages']").val() + "_pano_" + allLocations[theIndex].id;
                            var theAvailableLength = 50 - theUniqueId.length;
                            var theLocationName = allLocations[theIndex].name.replace(/[^0-9a-z-_\s]/gi, "");
                            theLocationName = theLocationName.substr(0, theAvailableLength);

                            theLocations.push([allLocations[theIndex].name, theLocationName + theUniqueId]);
                        }

                        $("input[id$='_txtName']").createDropDown(theLocations, null, true);

                        $("[id$='_txtName_dropDown']").on("change", function () {
                            var theSelectedText = $(this).find("option:selected").text();
                            var thePanoPageText = $("[id$='_ddlPanoPages']").find("option:selected").text();

                            $("[id$='_txtTitle']").val(theSelectedText);
                            $("[id$='_txtMenuTitle']").val(theSelectedText);
                            $("[id$='_txtDescription']").val(thePanoPageText + ": " + theSelectedText);
                            $("input[id$='_txtName']").trigger("change").trigger("blur");
                        });
                    }

                    if (typeof aCallbackFunction == "function") aCallbackFunction();
                })
                .fail(function () {
                    if (typeof aCallbackFunction == "function") aCallbackFunction();
                    else $.fn.showError(settings.errors.generalErrorText + " (500.56)", "console");
                });
        })
        .fail(function () {
            if (typeof aCallbackFunction == "function") aCallbackFunction();
            else $.fn.showError(settings.errors.generalErrorText + " (500.63)", "console");
        });
};

// Disable parent sections in CMS.
$.fn.disableCMSParentSections = function () {
    var theSelectedPanoPageID = $("[id$='_ddlPanoPages']").val();
    var theDropParentSections = $("[id$='_dropParentSections']");
    var theTargetParentSection = theDropParentSections.find("option[value='" + theSelectedPanoPageID + "']");
    var theMatchText = theTargetParentSection.html().match(/^(?:\&nbsp\;)*/)[0] + "&nbsp;";
    var theMatchEnded = false;

    theDropParentSections.find("option:first").nextAll().hide();

    theTargetParentSection
        .show()
        .nextAll()
        .filter(function () {
            if (!theMatchEnded && $(this).html().indexOf(theMatchText) > -1) return true;

            theMatchEnded = true;

            return false;
        })
        .show();
};

// Pano Platform add & edit.
$.fn.initializePanoPlatformAddEdit = function () {
    if ($(this).length > 0) {
        var theIntitialNameValue = $("[id$='_txtName']").val();
        var resetValues = true;
        var theRegExp = /_([0-9]{1,})_pano_([0-9-]{1,})(?:_([0-9]{1,})){0,1}$/gi;

        if (trim(theIntitialNameValue) != "") {
            resetValues = false;

            var theResult = theRegExp.exec(theIntitialNameValue);

            if (theResult != null) {
                thePanoPlatformID = theResult[1];
                theLocationID = theResult[2];
                //theTrack = theResult[3];

                $.fn.loadCMSPageNameDropdown(function () {
                    $("[id$='_ddlPanoPages']").val(thePanoPlatformID);
                    $("[id$='_txtName_dropDown']").val(theLocationID);
                    $("[id$='_chkIsPanoPage']").trigger("click");
                });
            }
        }

        $.fn.togglePanoPlatform($("[id$='_chkIsPanoPage']"), resetValues);

        $("[id$='_chkIsPanoPage']").on("change", function () {
            $.fn.togglePanoPlatform($(this), true);
        });

        $("[id$=_ddlPanoPages]").on("change", function () {
            $.fn.loadCMSPageNameDropdown();
            $.fn.disableCMSParentSections();
        });
    }
};

// Toggle Pano Platform in CMS.
$.fn.togglePanoPlatform = function (aObject, aResetValues) {
    if (aObject.length == 0) return;

    if (aObject.is(":checked")) {
        $.fn.loadCMSPageNameDropdown(function () {
            $(".field.pageType").addClass("hide");
            $("[id$='_ddlPageTypes']").val("73");
            $("[id$='_txtName']").hide();
            $("[id$='_txtName_dropDown']").show();
            $(".field.pageName label").html(settings.cms.panoPageLocationText + " *");
            $.fn.disableCMSParentSections();
        });
    } else {
        $(".field.pageType").removeClass("hide");

        $("[id$='_txtName']").show();
        $("[id$='_txtName_dropDown']").hide();
        $(".field.pageName label").html(settings.cms.pageNameText + " *");
        $("[id$='_dropParentSections'] option").show();

        if (aResetValues) {
            $("[id$='_txtName']").val("");
            $("[id$='_ddlPageTypes']").val("");
        }
    }
};

// Item add & edit.
$.fn.initializeItemAddEdit = function () {
    var container = $(this);

    if (container.length > 0 && $(".noWarning").length == 0) {
        $("input:text, input:password, textarea").on("keyup", function () {
            globals.pageChanged = true;
        });
    }
};

// Item delete.
$.fn.initializeItemDelete = function () {
    var container = $(this);

    container
        .find(".button.save a")
        .off("click")
        .on("click", function () {
            if (
                container.find(".field.roleUsersDelete input:checkbox").is(":checked") &&
                !$(this).confirm(settings.warnings.deleteRoleUsersText)
            )
                return false;
        });
};

// Initialize redirects.
$.fn.initializeRedirects = function () {
    var container = $(this);
    var sourceURL = container.find(".sourceURL");

    if (sourceURL.length > 0 && sourceURL.val() == "https://") sourceURL.val(globals.domain);
};

// Initialize sorting labels.
$.fn.initializeSortingLabels = function () {
    var sorterAsc = $("#optionsTabContent .sorter select:last option[value='asc']");
    var sorterDesc = $("#optionsTabContent .sorter select:last option[value='desc']");

    switch ($(this).val()) {
        case "Date Published":
        case "Date Created":
        case "Date Updated":
            sorterAsc.text(settings.sorter.dateAscText);
            sorterDesc.text(settings.sorter.dateDescText);
            break;
        case "Title":
            sorterAsc.text(settings.sorter.titleAscText);
            sorterDesc.text(settings.sorter.titleDescText);
            break;
        case "Voting":
            sorterAsc.text(settings.sorter.votingAscText);
            sorterDesc.text(settings.sorter.votingDescText);
            break;
        case "Rating":
            sorterAsc.text(settings.sorter.ratingAscText);
            sorterDesc.text(settings.sorter.ratingDescText);
            break;
    }
};

function initializeColorPickers() {
    $(".field.txtColorPicker").each(function () {
        var inputFieldWrapper = $(this),
            inputField = inputFieldWrapper.find("input");

        const newPickr = document.createElement("div");
        inputFieldWrapper.append(newPickr);

        const pickr = new Pickr({
            el: newPickr,
            default: inputField.data("colorpicker-default-color"),
            theme: "nano",
            lockOpacity: false,
            swatches: null,
            components: {
                preview: true,
                opacity: true,
                hue: true,
                interaction: {
                    hex: false,
                    rgba: false,
                    hsva: false,
                    input: true,
                    cancel: false,
                    clear: true,
                    save: true,
                },
            },
        })
            .on("init", (pickr) => {
                pickr.setColor(inputField.val());
            })
            .on("clear", (pickr) => {
                // clear pickr color
                inputField.val("");
            })
            .on("save", (color) => {
                if (color == null) return;

                inputField.val(color.toHEXA().toString(0));

                if (inputFieldWrapper.closest(".settingsField").hasClass("fontSettings"))
                    inputFieldWrapper
                        .closest(".settingsField")
                        .find(".settingsPreview > *")
                        .css("color", color.toHEXA().toString(0));
                else if (inputFieldWrapper.closest(".settingsField").hasClass("topSettings")) {
                    if (inputFieldWrapper.closest("div").attr("id") == "topBackgroundColor")
                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview .top")
                            .css("background-color", color.toHEXA().toString(0));
                    else if (inputFieldWrapper.closest("div").attr("id") == "topTextColor")
                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview .top .shortcuts li > *")
                            .css("color", color.toHEXA().toString(0));
                    else if (inputFieldWrapper.closest("div").attr("id") == "topSliderTitleColor") {
                        var colorVal = color.toHEXA().toString(0),
                            rgbVal = $.fn.hexToRGB(colorVal),
                            rgbaString = rgbVal["R"] + ", " + rgbVal["G"] + ", " + rgbVal["B"] + ", .65";

                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview .rsContent > *")
                            .css("background-color", "rgba(" + rgbaString.toString() + ")");
                    }
                } else if (inputFieldWrapper.closest(".settingsField").hasClass("menuSettings")) {
                    if (inputFieldWrapper.closest("div").attr("id") == "mainMenuColor")
                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview .mainMenu, .settingsPreview .mainMenu ul li")
                            .css("background-color", color.toHEXA().toString(0));
                    else if (inputFieldWrapper.closest("div").attr("id") == "mainMenuHoverColor") {
                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview .mainMenu ul li")
                            .on("mouseenter", function () {
                                $(this).css("background-color", color.toHEXA().toString(0));
                            })
                            .on("mouseleave", function () {
                                $(this).css(
                                    "background-color",
                                    $(this).closest(".settingsField").find("#mainMenuColor input").val()
                                );
                            });
                    } else if (inputFieldWrapper.closest("div").attr("id") == "mainMenuTextColor")
                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview .mainMenu ul li a")
                            .css("color", color.toHEXA().toString(0));
                    else if (inputFieldWrapper.closest("div").attr("id") == "mainMenuTextHoverColor") {
                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview .mainMenu ul li a")
                            .on("mouseenter", function () {
                                $(this).css("color", color.toHEXA().toString(0));
                            })
                            .on("mouseleave", function () {
                                $(this).css(
                                    "color",
                                    $(this).closest(".settingsField").find("#mainMenuTextColor input").val()
                                );
                            });
                    }
                } else if (inputFieldWrapper.closest(".settingsField").hasClass("footerSettings")) {
                    if (inputFieldWrapper.closest("div").attr("id") == "bottomBackgroundColor")
                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview .bottom")
                            .css("background-color", color.toHEXA().toString(0));
                    else if (inputFieldWrapper.closest("div").attr("id") == "bottomTextColor")
                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview .shortcut")
                            .css("color", color.toHEXA().toString(0));
                    else if (inputFieldWrapper.closest("div").attr("id") == "mettLogoColor")
                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview .logo .mett-logo path")
                            .css("fill", color.toHEXA().toString(0));
                } else if (inputFieldWrapper.closest(".settingsField").hasClass("linkSettings")) {
                    if (inputFieldWrapper.closest("div").attr("id") == "linksColor")
                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview a")
                            .css("color", color.toHEXA().toString(0));
                    else if (inputFieldWrapper.closest("div").attr("id") == "linksHoverColor") {
                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview a")
                            .on("mouseenter", function () {
                                $(this).css("color", color.toHEXA().toString(0));
                            })
                            .on("mouseleave", function () {
                                $(this).css("color", $(this).closest(".settingsField").find("#linksColor input").val());
                            });
                    }
                } else if (
                    inputFieldWrapper.closest(".settingsField").hasClass("widgetSettings") ||
                    inputFieldWrapper.closest(".settingsField").hasClass("boxSettings")
                ) {
                    if (inputFieldWrapper.closest("div").attr("id") == "widgetBackgroundColor")
                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview > *")
                            .css("background-color", color.toHEXA().toString(0));
                    else if (inputFieldWrapper.closest("div").attr("id") == "widgetBorderColor")
                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview > *")
                            .css("border-color", color.toHEXA().toString(0));
                    else if (inputFieldWrapper.closest("div").attr("id") == "boxBackgroundColor")
                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview > *")
                            .css("background-color", color.toHEXA().toString(0));
                    else if (inputFieldWrapper.closest("div").attr("id") == "boxBorderColor")
                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview > *")
                            .css("border-color", color.toHEXA().toString(0));
                } else if (inputFieldWrapper.closest(".settingsField").hasClass("buttonSettings")) {
                    if (inputFieldWrapper.closest("div").hasClass("buttonColor")) {
                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview > .button:not(.outline)")
                            .css({
                                "background-color": color.toHEXA().toString(0),
                                "border-color": color.toHEXA().toString(0),
                            });
                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview > .button.outline")
                            .css({ "background-color": "transparent", "border-color": color.toHEXA().toString(0) });
                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview > .button.outline > *")
                            .attr("style", "color: " + color.toHEXA().toString(0) + " !important");
                    } else if (inputFieldWrapper.closest("div").hasClass("buttonHoverColor")) {
                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview > .button:not(.outline)")
                            .on("mouseenter", function () {
                                $(this).css("background-color", color.toHEXA().toString(0));
                                $(this).css("border-color", color.toHEXA().toString(0));
                            })
                            .on("mouseleave", function () {
                                $(this).css(
                                    "background-color",
                                    $(this).closest(".settingsField").find(".buttonColor input").val()
                                );
                                $(this).css(
                                    "border-color",
                                    $(this).closest(".settingsField").find(".buttonColor input").val()
                                );
                            });

                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview > .button.outline")
                            .on("mouseenter", function () {
                                $(this).css(
                                    "background-color",
                                    $(this).closest(".settingsField").find(".buttonColor input").val()
                                );
                            })
                            .on("mouseleave", function () {
                                $(this).css("background-color", "transparent");
                                $(this).css(
                                    "border-color",
                                    $(this).closest(".settingsField").find(".buttonColor input").val()
                                );
                            });
                    } else if (inputFieldWrapper.closest("div").hasClass("buttonTextColor")) {
                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview > .button:not(.outline) > *")
                            .attr("style", "color: " + color.toHEXA().toString(0) + " !important");
                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview > .button.outline > *")
                            .attr(
                                "style",
                                "color: " +
                                    $(this).closest(".settingsField").find(".buttonColor input").val() +
                                    " !important"
                            );
                    } else if (inputFieldWrapper.closest("div").hasClass("buttonHoverTextColor")) {
                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview > .button:not(.outline)")
                            .on("mouseenter", function () {
                                $(this)
                                    .find("> *")
                                    .attr("style", "color: " + color.toHEXA().toString(0) + " !important");
                            })
                            .on("mouseleave", function () {
                                $(this)
                                    .find("> *")
                                    .attr(
                                        "style",
                                        "color: " +
                                            $(this).closest(".settingsField").find(".buttonTextColor input").val() +
                                            " !important"
                                    );
                            });

                        inputFieldWrapper
                            .closest(".settingsField")
                            .find(".settingsPreview > .button.outline")
                            .on("mouseenter", function () {
                                $(this).find("> *").attr("style", "color: #fff !important");
                            })
                            .on("mouseleave", function () {
                                $(this)
                                    .find("> *")
                                    .attr(
                                        "style",
                                        "color: " +
                                            $(this).closest(".settingsField").find(".buttonColor input").val() +
                                            " !important"
                                    );
                            });
                    }
                }

                pickr.hide();
            });
    });
}
;
$(document).ready(function () {
    // Initialize.
    $.fn.initializeForms();

    if (typeof Sys != "undefined" && typeof Sys.WebForms != "undefined") {
        // After AJAX call.
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function (sender, e) {
            $.fn.initializeForms();
        });
    }
});

// Initialize forms.
$.fn.initializeForms = function () {
    // Editor forms.
    $("#forms.item").initializeEditorForms();

    // Editor forms section.
    $("#forms.section").initializeEditorFormsSection();

    // Editor form results.
    $("#forms.results").initializeEditorFormResults();

    // Editor form add & edit.
    $("#forms.add").initializeEditorFormsAddEdit();

    // Custom (old) forms.
    $("#customForm").initializeCustomForms();

    // Required fields in registration.
    $(".content").checkRequiredFields();
};

// Initialize editor forms.
$.fn.initializeEditorForms = function () {
    var form = $(this);

    if (form.length > 0 && !form.hasClass("results")) {
        // Required fields text.
        form.find(".itemHeader .help").insertBefore(form.find(".field:first"));

        // Labels
        form.find("label").prop("contenteditable", false);

        // "Other" options.
        form.find(".field .answer input.other").each(function () {
            var element = $(this);
            var field = element.parents(".checkboxGroup, .radioGroup");
            var elementValueLabel = $("<label>");
            var elementValueInput = $("<input />");

            elementValueLabel
                .attr("for", element.prop("id") + "_value")
                .addClass("hide screenReaderContent")
                .html(settings.forms.otherInput);

            elementValueInput
                .attr("type", "text")
                .attr("id", element.prop("id") + "_value")
                .addClass("hide otherValue");

            // Append "other" field and label.
            element.parents(".answer").append(elementValueLabel);
            element.parents(".answer").append(elementValueInput);

            // Toggle "other" input field.
            element.off("click").on("click", function () {
                if (element.prop("type") == "radio") {
                    elementValueLabel.removeClass("hide");
                    elementValueInput.removeClass("hide");
                } else {
                    elementValueInput.val("");
                    elementValueLabel.toggleClass("hide");
                    elementValueInput.toggleClass("hide");
                }

                elementValueInput.trigger("focus");
            });

            // Hide "other" input field when another radio button is clicked.
            field
                .find(".answer input:radio")
                .not(".other")
                .off("click")
                .on("click", function () {
                    // Reset.
                    elementValueInput.val("");
                    elementValueLabel.addClass("hide");
                    elementValueInput.addClass("hide");
                });
        });

        // Required select field.
        form.find(".field select:required").each(function () {
            var option = $("<option />").attr("selected", "selected").val("").text(settings.various.selectAnOption);

            // Add "select option option" (phun intended).
            option.prependTo($(this));
        });

        // Save and/or send form.
        form.find(".toolbar .button.saveSend input")
            .off("click")
            .on("click", function () {
                var toolbar = $(this).parents(".toolbar");
                var errorContainer = form.find(".errorMessage");
                var errorMessage = "";
                var results = [];

                // Reset errors.
                errorContainer.addClass("hide").find("ul").remove();
                $.each(form.find(".field.danger"), function () {
                    $(this).removeClass("danger");
                    $(this).find("input, textarea, select").removeAttr("aria-invalid");
                });
                form.find(".errorLabel").remove();

                // Show loader.
                toolbar.find(".button").hide();
                toolbar.find(".loader").show();

                var formDate = $('input[id$="hfFormDate"]').val();
                var submitAnonymous = $("[id$=chkSubmitAnonymous]").is(":checked");
                var receiveCopy = $("[id$=chkReceiveFormCopy]").is(":checked");
                var anonymousEmail = $("input[id$=txtCopyEmail]").val();

                form.find(".field input, .field select, .field textarea")
                    .not(".otherValue")
                    .each(function () {
                        var element = $(this);
                        var field = element.parents(".field");
                        var status = element.validateEditorFormField();
                        var result = {};

                        if (status == "OK") {
                            element.removeAttr("aria-describedby");

                            switch (element.prop("type")) {
                                case "select-one":
                                case "select-multiple":
                                    element.find("option").each(function () {
                                        var option = $(this);
                                        result = {};

                                        result.fieldGuid = element.data("guid");
                                        result.optionGuid = option.data("guid");
                                        result.value = option.val();
                                        result.selected = option.is(":selected");
                                        results.push(result);
                                    });
                                    break;

                                case "checkbox":
                                case "radio":
                                    result.fieldGuid = element.parents(".checkboxGroup, .radioGroup").data("guid");
                                    result.optionGuid = element.data("guid");

                                    if (element.hasClass("other")) {
                                        // Get value from "other" input field.
                                        result.value = element.parents(".answer").find("input:text").val();
                                    } else {
                                        result.value = element.val();
                                    }

                                    result.selected = element.is(":checked");
                                    results.push(result);
                                    break;

                                default:
                                    result.fieldGuid = element.data("guid");
                                    result.value = element.val();
                                    result.name = element.attr("name");
                                    results.push(result);
                                    break;
                            }
                        } else {
                            if (!field.hasClass("danger")) {
                                // Error handling.
                                var error = $("<li />");
                                var errorLabel = element.data("label");
                                var errorId = "errorLabel-" + Math.round(1000 * Math.random());

                                if (element.is(":checkbox") || element.is(":radio")) {
                                    errorLabel = field.data("label");
                                }

                                if (status == "required") {
                                    errorLabel += " " + settings.errors.isRequiredText;
                                } else {
                                    errorLabel += " " + settings.errors.isInvalidText;

                                    if (element.attr("type") == "email") errorLabel += settings.forms.emailSuggestion;
                                    if (element.attr("type") == "tel") errorLabel += settings.forms.telSuggestion;
                                }

                                error.html(errorLabel.replace(/\?/gi, ""));

                                if (errorMessage == "") {
                                    errorMessage = $("<ul />");
                                }

                                // Add error to error message.
                                errorMessage.append(error);

                                // Highlight field.
                                field.addClass("danger");
                                field.find("input, textarea, select").attr("aria-invalid", "true");
                                field.append('<div class="clear"></div>');

                                element.attr("aria-describedby", errorId);

                                field.append(
                                    $(
                                        '<div id="' +
                                            errorId +
                                            '" class="errorLabel screenReaderContent">' +
                                            errorLabel +
                                            "</div>"
                                    )
                                );
                            }
                        }
                    });

                // Check captcha.
                if (!$.fn.mettHCaptchaIsValid()) {
                    var error = $("<li />"),
                        errorLabel = settings.errors.invalidHCaptchaText,
                        errorId = "errorLabel-" + Math.round(1000 * Math.random());

                    error.append(errorLabel);

                    if (errorMessage == "") errorMessage = $("<ul />");

                    // Add error to error message.
                    errorMessage.append(error);

                    $("#h-captcha").attr("aria-describedby", errorId);

                    $("#h-captcha").append(
                        $('<div id="' + errorId + '" class="errorLabel screenReaderContent">' + errorLabel + "</div>")
                    );

                    $(".field.captcha").addClass("danger");
                }

                if (errorMessage == "" && results.length > 0) {
                    // Post results to API.
                    //console.log(JSON.stringify(results));
                    form.submitEditorForm(results, formDate, submitAnonymous, receiveCopy, anonymousEmail);
                } else {
                    // Show error.
                    errorMessage.appendTo(errorContainer);
                    errorContainer.removeClass("hide").attr("role", "alert");

                    // Hide loader.
                    toolbar.find(".loader").hide();
                    toolbar.find(".button").show();

                    // Scroll to error message and add focus.
                    $("html, body")
                        .stop(true)
                        .animate({ scrollTop: errorContainer.offset().top - 200 }, 150);
                    errorContainer.get(0).setAttribute("tabindex", "0");
                    errorContainer.trigger("focus");
                }
            });

        if (
            !form.hasClass("add") &&
            !form.hasClass("edit") &&
            $.fn.getQueryString("submitted") != "true" &&
            $(".formWarning").length == 0
        ) {
            // Warning.
            window.onbeforeunload = function () {
                return settings.warnings.leavePageText;
            };

            $(window).data("beforeunload", window.onbeforeunload);
        }
    }
};

// Initialize editor forms section.
$.fn.initializeEditorFormsSection = function () {
    var formsSection = $(this);

    formsSection.find(".list .row").each(function () {
        // Delete form.
        $(this)
            .find(".delete")
            .off("click")
            .on("click", function () {
                var itemTitle = trim($(this).closest(".row").find(".itemTitleLink").text());

                if (
                    !$(this).confirm(
                        settings.warnings.deleteFormWarningText.replace(
                            "{0}",
                            '"<span class="strong">' + itemTitle + '</span>"'
                        )
                    )
                ) {
                    return false;
                }
            });
    });
};

// Initialize editor form results.
$.fn.initializeEditorFormResults = function () {
    var formResults = $(this);
    var formResultOverlay = formResults.find(".overlayFormResult");

    formResults.find(".list .row").each(function () {
        var row = $(this);

        // Show result.
        row.find(".showResult")
            .off("click")
            .on("click", function () {
                // Open overlay.
                row.showEditorFormResult();

                return false;
            });
    });

    // Print button in overlay.
    formResultOverlay
        .find(".button.print input:button")
        .off("click")
        .on("click", function () {
            var printContent = "";

            $("body, .overlayFormResult").addClass("hide");
            $("html").append('<div class="printContent" />');

            $(".overlayItemContent")
                .find(".field")
                .each(function () {
                    var field = $(this);
                    var label = field.find("label:first, .question:first");
                    var value = "";

                    if (label.length > 0) {
                        field
                            .find("input, select, textarea")
                            .not("input[type=hidden]")
                            .each(function () {
                                var element = $(this);

                                if (element.is(":checkbox") || element.is(":radio")) {
                                    // Checkbox & radio button.
                                    if (element.is(":checked")) {
                                        if (value == "") {
                                            // First checked value.
                                            value = element.val();
                                        } else {
                                            // Append value.
                                            value += "," + element.val();
                                        }
                                    }
                                } else {
                                    value = element.val();
                                }
                            });

                        printContent += "<p><strong>" + label.html() + "</strong><br />" + value + "</p>";
                    }
                });

            // Fill hidden div.
            $(".printContent").append(printContent);

            window.print();

            $("body").removeClass("hide");
            $(".printContent").remove();

            setTimeout(function () {
                formResultOverlay.find(".button.close").trigger("click");
            }, 50);
        });
};

// Initialize editor forms add & edit.
$.fn.initializeEditorFormsAddEdit = function () {
    var form = $(this);

    if (form.length > 0) {
        if (globals.url.indexOf("_edit") > -1) {
            // Set moderation status variable token and update it every minute
            form.setModerationStatusToken();
            window.setInterval(function () {
                form.setModerationStatusToken();
            }, 60000);
        }

        // Save, send or save & send.
        $(".field.purpose select").on("change", function () {
            if ($(this).val() == "1" || $(this).val() == "4") {
                $(".field.send").addClass("hide");
            } else {
                if ($(".field.sendTo input").val() == "") {
                    $(".field.sendTo input").val("naam@domein.nl");
                }

                $(".field.send").removeClass("hide");
            }
        });

        $(".field.purpose select").trigger("change");

        // Send to field.
        $(".field.sendTo input")
            .off("click")
            .on("click", function () {
                if ($(this).val() == "naam@domein.nl") {
                    $(this).val("");
                }
            });

        $(".field.sendTo input")
            .off("blur")
            .on("blur", function () {
                if ($(this).val() == "") {
                    $(this).val("naam@domein.nl");
                }
            });

        // Edit form.
        if (globals.url.indexOf("_edit") > -1) {
            $.ajax({
                method: "GET",
                url: "/api/form/hasResults",
                data: {
                    sectionID: settings.section.ID,
                    contentPageID: settings.section.itemID,
                    token: $("input[name='__RequestVerificationToken']").val(),
                },
            })
                .done(function (data) {
                    data = JSON.parse(data);

                    if (data.status) {
                        // Save warning.
                        form.find("#toolbarBottom .button.save input:submit").on("click", function () {
                            var exportLink = $("<a />");
                            var exportHref = $(".button.export a").prop("href");
                            exportLink.attr("href", exportHref).html(settings.warnings.editFormExportText);

                            if (
                                editorChanged($(".formFields textarea")) &&
                                window.initialFieldIds.toString() != $.fn.getFieldIds().toString()
                            ) {
                                $(".resetValues").val("true");

                                if (
                                    !$(this).confirm(
                                        settings.warnings.editFormWarningText + " " + exportLink.get(0).outerHTML
                                    )
                                ) {
                                    $("#toolbarBottom .loader").hide();
                                    $("#toolbarBottom .button.save").show();

                                    return false;
                                }
                            } else {
                                $(".resetValues").val("");
                            }
                        });
                    } else {
                        $(".resetValues").val("true");
                    }
                })
                .fail(function () {
                    $.fn.showError(settings.errors.formResultNotFound + " (500.84)", "console");
                });
        }

        $.fn.setInitialFieldIds();
    }
};

$.fn.setInitialFieldIds = function () {
    if (!CKEDITOR || $(".formFields textarea").length == 0 || !CKEDITOR.instances[$(".formFields textarea").attr("id")])
        return;

    if (CKEDITOR.instances[$(".formFields textarea").attr("id")].instanceReady) {
        window.initialFieldIds = $.fn.getFieldIds();
    } else {
        CKEDITOR.instances[$(".formFields textarea").attr("id")].on("instanceReady", function () {
            window.initialFieldIds = $.fn.getFieldIds();
        });
    }
};

$.fn.getFieldIds = function () {
    var fieldIds = [],
        ckDocument = null;

    if (!CKEDITOR || $(".formFields textarea").length == 0 || !CKEDITOR.instances[$(".formFields textarea").attr("id")])
        return fieldIds;

    ckDocument = $(CKEDITOR.instances[$(".formFields textarea").attr("id")].document.$);

    ckDocument.find(".field, .field *, [data-guid]").each(function () {
        if ($(this).data("guid")) fieldIds.push($(this).data("guid"));
        if ($(this).attr("id")) fieldIds.push($(this).attr("id"));
        if ($(this).attr("name")) fieldIds.push($(this).attr("name"));
    });

    return fieldIds;
};

// Validate editor form field.
$.fn.validateEditorFormField = function () {
    var element = $(this);
    var field = element.parents(".field");
    var status = "OK";

    if (element.length > 0) {
        // Check if element is required.
        if (element.is(":required")) {
            // Check if value is empty.
            if (trim(element.val()) == "") {
                status = "required";
            }

            // Check if at least 1 checkbox or radiobutton in group is checked.
            if ((element.is(":checkbox") || element.is(":radio")) && field.find("input:checked").length == 0) {
                status = "required";
            }
        }

        // Check if element value is not empty.
        if (element.val() !== "") {
            // Check if element is valid.
            if (
                status == "OK" &&
                (element.prop("type") == "email" || element.prop("type") == "tel" || element.prop("type") == "url") &&
                !$.fn.fieldValidator(element.prop("type"), element.val())
            ) {
                status = "invalid";
            }
        }
    }

    // E-mail validator.
    if (element.hasClass("emailValidator") && $("#forms.item .email").length > 0) {
        if (!compareFormFieldValue($("#forms.item .email"), element)) {
            status = "invalid";
        }
    }

    return status;
};

// Save and/or send editor form.
$.fn.submitEditorForm = function (results, formDate, submitAnonymous, receiveCopy, anonymousEmail) {
    var data = new FormData();
    var formAttachment = $(".formAttachment");

    data.append("sectionID", settings.section.ID);
    data.append("contentPageID", settings.section.itemID);
    data.append("userID", settings.user.ID);
    data.append("fieldJson", JSON.stringify(results));
    data.append("formDate", formDate);
    data.append("submitAnonymous", submitAnonymous);
    data.append("receiveCopy", receiveCopy);
    data.append("anonymousEmail", anonymousEmail);
    data.append("token", $("input[name='__RequestVerificationToken']").val());

    if (formAttachment.length > 0 && formAttachment[0].files && formAttachment[0].files.length > 0) {
        data.append("formAttachment", formAttachment[0].files[0]);
    }

    $.ajax({
        method: "POST",
        url: "/api/form/parseValues",
        contentType: false,
        processData: false,
        data: data,
    })
        .done(function (data) {
            if (JSON.parse(data).result == "200") {
                var form = $("form");
                var queryStringCharacter = "?";

                if (form.attr("action").indexOf("?") > -1) {
                    queryStringCharacter = "&";
                }

                // Remove warning.
                window.onbeforeunload = null;
                $(window).data("beforeunload", window.onbeforeunload);

                // Submit form (resets all fields).
                form.attr("action", form.attr("action") + queryStringCharacter + "submitted=true");
                form[0].submit();
            } else if (JSON.parse(data).result == "409") {
                $.fn.showError(settings.errors.formEditedDuringSubmit);

                // Override default continue/close buttons.
                $(".alertOverlay .button.continue input:button, .alertOverlay .button.close")
                    .off("click")
                    .on("click", function () {
                        window.onbeforeunload = null;
                        $(window).data("beforeunload", window.onbeforeunload);

                        document.location.reload();

                        return false;
                    });
            } else if (JSON.parse(data).result == "410") {
                $.fn.showError(settings.errors.formAttachmentFilesize);

                // Hide loader.
                $(".toolbar").find(".loader").hide();
                $(".toolbar").find(".button").show();
            } else {
                $.fn.showError(settings.errors.formNotSubmittedText + " (500.82)", "console");
            }
        })
        .fail(function () {
            $.fn.showError(settings.errors.formNotSubmittedText + " (500.82)", "console");
        });
};

// Get submitted editor form result.
$.fn.showEditorFormResult = function () {
    $.ajax({
        method: "GET",
        url: "/api/form/showResult",
        data: {
            submitGuid: $(this).data("submitguid"),
            sectionID: settings.section.ID,
            contentPageID: settings.section.itemID,
            userID: settings.user.ID,
            token: $("input[name='__RequestVerificationToken']").val(),
        },
    })
        .done(function (data) {
            var formData = $("<div/>").html(data).contents();

            formData.find("input").each(function () {
                var element = $(this);

                // Disable elements.
                element.prop("disabled", true);

                // "Other" options.
                if (element.hasClass("other") && element.is(":checked")) {
                    var elementValueInput = $("<input />");
                    elementValueInput
                        .attr("type", "text")
                        .attr("id", element.prop("id") + "_value")
                        .val(element.val());

                    // Append input field with value.
                    element.parents(".answer").append(elementValueInput);
                }
            });

            // Show result in overlay.
            $(".overlayFormResult").find(".overlayItemContent").html(formData);
            $(".overlayFormResult").removeClass("hide").initializeOverlays();
        })
        .fail(function () {
            $.fn.showError(settings.errors.formResultNotFound + " (500.83)", "console");
        });
};

// Initialize custom (old) forms.
$.fn.initializeCustomForms = function () {
    var customForm = $(this);

    if (customForm.length > 0) {
        // Moderator form.
        $(".field.allUsers select").on("change", function () {
            $(".field.allUsers input:text").val(
                globals.domain + "/shortcuts/users_adduser.aspx?userkey=" + $(this).val()
            );
        });

        $(".field.training select").on("change", function () {
            if ($(this).val() == "Ja") {
                $(".field.confirm")
                    .removeClass("hide")
                    .find("input:checkbox")
                    .prop("checked", false)
                    .trigger("change")
                    .initializeSwitchery();
            } else {
                $(".field.confirm").addClass("hide").find("input:checkbox").prop("checked", false).trigger("change");
                $("#toolbarBottom").removeClass("hide");
            }
        });

        $(".field.confirm input:checkbox").on("change", function () {
            if ($(this).is(":checked")) {
                $("#toolbarBottom").removeClass("hide");
            } else {
                $("#toolbarBottom").addClass("hide");
            }
        });

        // SSL form.
        if (location.protocol != "https:") {
            $(".field.domain input").val(location.hostname);
        }

        $(".field.ssltype select").on("change", function () {
            if ($(".field.ssltype select").val() == "PKI") {
                $(".field.requester select").val("De klant");
                $(".field.requester").addClass("hide");
            } else {
                $(".field.requester select").val("De klant");
                $(".field.requester").removeClass("hide");
            }
        });

        $(".field.owner select").on("change", function () {
            if ($(".field.owner select").val() == "Mett") {
                $(".field.ICTManager input, .field.ICTManagerMail input").val("");
                $(".field.ICTManager, .field.ICTManagerMail").addClass("hide");
            } else {
                $(".field.ICTManager, .field.ICTManagerMail").removeClass("hide");
            }
        });

        $(".field.domain input").on("blur", function () {
            var matches = $(this)
                .val()
                .match(/(www.)?([a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,10})(\/\S*)?/i);
            var selectedDomain = matches && matches[2];

            if (selectedDomain == null) {
                if ($(this).val() != "") {
                    $(this).parent(".field").addClass("danger");
                    $(this).attr("aria-invalid", "true");
                }

                selectedDomain = "ongeldigdomein.nl";
            } else {
                $(this).val(selectedDomain);
                $(this).parent(".field").removeClass("danger");
                $(this).removeAttr("aria-invalid");
            }

            $(".field.domainEmail select option").each(function () {
                var rootDomain = selectedDomain.split(".");

                $(this).html($(this).val() + rootDomain.slice(-2).join("."));
            });

            $(".field.domainEmail select").trigger("change");
        });

        $(".field.domainEmail select").on("change", function () {
            $(".field.domainEmail input:text").val($(this).find("option:selected").html());
        });

        // Moderator & SSL form.
        $(".field.currentUser input").val(settings.user.fullName + " (" + settings.user.email + ")");

        // Initialize.
        $(".field.allUsers select, .field.training select").trigger("change");
        $(".field.domain input").trigger("blur");
        $(".field.owner select, .field.requester select, .field.domainEmail select").trigger("change");
    }
};

// Check required fields and add asterisk.
$.fn.checkRequiredFields = function () {
    if ($(".field").length === 0) return;

    $.each($(".field"), function () {
        var field = $(this);

        if (field.hasClass("hide") || field.parents(".hide").length > 0 || field.find(".required").length > 0) return;

        if (field.find("> label").data("required") === true)
            field
                .find("> label")
                .html(trim(field.find("> label").html() + '<span class="required" aria-hidden="true"> *</span>'));
    });
};

$.fn.setModerationStatusToken = function () {
    $.ajax({
        url: "/api/contentPages/SetModerationStatus",
        data: {
            contentPageID: settings.section.itemID,
            moderationStatus: true,
            userID: settings.user.ID,
            token: $("input[name='__RequestVerificationToken']").val(),
        },
    });
};

$.fn.mettHCaptchaIsValid = function () {
    if ($(".captcha").length == 0) {
        return true;
    }

    var arguments = { IsValid: true };
    mettHCaptchaClientValidator(null, arguments);
    return arguments.IsValid;
};

function mettCheckboxClientValidator(source, arguments) {
    var dataControlToValidate = $(source).data("control-to-validate");

    if (dataControlToValidate) {
        dataControlToValidate = dataControlToValidate.split(",");

        for (var i = 0; i < dataControlToValidate.length; i++) {
            var controlToValidate = $("#" + dataControlToValidate[i]);

            if (
                controlToValidate.is(":checkbox:checked") ||
                (controlToValidate.is(":text") && trim(controlToValidate.val()) != "")
            ) {
                var groupLabel = $("#" + dataControlToValidate[0])
                    .parents(".field:first")
                    .prev(":has(label):not(:has(:checkbox)), h2");
                groupLabel.find(".dangerClear").remove();
                groupLabel.removeClass("danger");
                groupLabel.find("input").removeAttr("aria-invalid");

                for (var j = 0; j < dataControlToValidate.length; j++) {
                    var controlToValidate = $("#" + dataControlToValidate[j]);

                    controlToValidate.parents(".field:first").find(".dangerClear").remove();
                    controlToValidate.parents(".field:first").removeClass("danger");
                    controlToValidate.removeAttr("aria-invalid");
                }
                return;
            }
        }

        if (dataControlToValidate.length > 0) {
            var groupLabel = $("#" + dataControlToValidate[0])
                .parents(".field:first")
                .prev(":has(label):not(:has(:checkbox)), h2");
            groupLabel.find(".dangerClear").remove();
            groupLabel.addClass("danger").append('<div class="dangerClear clear"></div>');
            groupLabel.find("input").attr("aria-invalid", "true");

            for (var i = 0; i < dataControlToValidate.length; i++) {
                var controlToValidate = $("#" + dataControlToValidate[i]);

                controlToValidate.parents(".field:first").find(".dangerClear").remove();
                controlToValidate
                    .parents(".field:first")
                    .addClass("danger")
                    .append('<div class="dangerClear clear"></div>');
                controlToValidate.attr("aria-invalid", "true");
            }
        }

        arguments.IsValid = false;
    }
}

function mettCKEditorClientValidator(source, arguments) {
    var dataControlToValidate = $(source).data("control-to-validate");

    if (dataControlToValidate) {
        var controlToValidate = $("#" + dataControlToValidate);
        var parentField = controlToValidate.parents(".field:first");

        if (controlToValidate.is("textarea")) {
            var instanceId = controlToValidate.attr("id");
            var ckEditorInstance = CKEDITOR.instances[instanceId];

            if (ckEditorInstance) {
                var ckEditorData = ckEditorInstance.getData();

                if (trim($(ckEditorData).text()) != "") {
                    controlToValidate.parents(".field:first").find(".dangerClear").remove();
                    controlToValidate.parents(".field:first").removeClass("danger");
                    controlToValidate.removeAttr("aria-invalid");

                    return;
                }
            }
        }

        parentField.find(".dangerClear").remove();
        parentField.addClass("danger").append('<div class="dangerClear clear"></div>');
        parentField.find("input").attr("aria-invalid", "true");
        arguments.IsValid = false;
    }
}

function mettHCaptchaClientValidator(source, arguments) {
    if (hcaptcha && hcaptcha.getResponse() === "") arguments.IsValid = false;
}

function mettEndDateClientValidator(source, arguments) {
    function getDate(field, allDay) {
        var returnValue;

        if (!allDay && field.find("select").length > 3) {
            // Add time.
            var returnValue = new Date(
                parseInt(field.find("select:eq(2)").val()),
                parseInt(field.find("select:eq(1)").val() - 1),
                parseInt(field.find("select:eq(0)").val()),
                parseInt(field.find("select:eq(3)").val()),
                parseInt(field.find("select:eq(4)").val())
            );
        } else {
            var returnValue = new Date(
                parseInt(field.find("select:eq(2)").val()),
                parseInt(field.find("select:eq(1)").val() - 1),
                parseInt(field.find("select:eq(0)").val())
            );
        }

        return returnValue;
    }

    var dataControlToValidate = $(source).data("control-to-validate");
    var dataStartDateControl = $(source).data("start-date-control");
    var dataAllDayControl = $(source).data("all-day-control");
    var dataActivatedControl = $(source).data("activated-control");

    if (dataControlToValidate && dataStartDateControl) {
        var controlToValidate = $("#" + dataControlToValidate);
        var startDateControl = $("#" + dataStartDateControl);
        var allDayControl = null;
        var allDay = false;

        if (dataAllDayControl) {
            allDayControl = $("#" + dataAllDayControl);
            allDay = allDayControl.is(":checked");
        }

        if (dataActivatedControl) {
            var activatedControl = $("#" + dataActivatedControl);
            if (activatedControl.length === 0 || !activatedControl.is(":checked")) {
                controlToValidate.parents(".field:first").find(".dangerClear").remove();
                controlToValidate.parents(".field:first").removeClass("danger");
                controlToValidate.removeAttr("aria-invalid");
                return;
            }
        }

        var startDateValue = getDate(startDateControl, allDay);
        var endDateValue = getDate(controlToValidate, allDay);

        var parentField = controlToValidate.parents(".field:first");

        if (endDateValue.getTime() < startDateValue.getTime()) {
            parentField.find(".dangerClear").remove();
            parentField.addClass("danger").append('<div class="dangerClear clear"></div>');
            parentField.find("input").attr("aria-invalid", "true");
            arguments.IsValid = false;

            return;
        }
    }

    controlToValidate.parents(".field:first").find(".dangerClear").remove();
    controlToValidate.parents(".field:first").removeClass("danger");
    controlToValidate.removeAttr("aria-invalid");
}

function compareFormFieldValue(field1, field2) {
    if (field1.length === 0 || field2.length === 0) {
        return;
    }

    if (field1.val() === "" || field2.val() === "") {
        return;
    }

    return trim(field1.val().toLowerCase()) === trim(field2.val().toLowerCase());
}
;
$.fn.initializeStatistics = function () {
    if (typeof settings.statistics.instance == "undefined" || settings.statistics.instance == null)
        settings.statistics.instance = new StatisticsManager();

    $(".statistics")
        .off("click")
        .on("click", function () {
            var theObject = $(this);
            var theHref = theObject.parents(".row:first").find("a:first").attr("href");

            if (typeof theHref != "undefined" && theHref != null && trim(theHref) != "") {
                var theContentPageID = theHref.replace(/\/(?:[^\/]*\/)*([0-9]+)\.aspx.*/gi, "$1");

                if (!isNaN(theContentPageID)) settings.statistics.instance.load(parseInt(theContentPageID));
            }

            return false;
        });
};

var StatisticRowTypes = {
    Text: 0,
    DateTime: 1,
    Tags: 2,
    DateChart: 3,
};

var StatisticsManager = function () {
    var theReturnObject = {
        mOverlay: null,
        mOverlayContent: null,
        mOverlayItemTitle: null,
        mOverlayItemContent: null,
        mOverlayStatisticsTable: null,
        mBarToolTip: null,

        init: function () {
            this.createOverlay();
        },

        createOverlay: function () {
            var theThis = this;

            this.mOverlay = $("<div>");
            this.mOverlay.addClass("overlay statisticsOverlay");
            this.mOverlay.css({ opacity: 0 });
            this.mOverlay.on("click", function (aEvent) {
                if (aEvent.target == this) theThis.hideOverlay();
            });

            this.mOverlayContent = $("<div>");
            this.mOverlayContent.addClass("overlayContent");

            var theCloseButton = $(
                '<a href="#" class="button close info icon-cancel-circled iconOnly before pointer"><span class="screenReaderContent">' +
                    settings.buttons.closeText +
                    "</span></a>"
            );

            this.mOverlayItemTitle = $("<h1>");
            this.mOverlayItemTitle.addClass("overlayItemTitle");

            this.mOverlayItemContent = $("<div>");
            this.mOverlayItemContent.addClass("overlayItemContent");

            this.mOverlayContent.append(theCloseButton);
            this.mOverlayContent.append(this.mOverlayItemTitle);
            this.mOverlayContent.append(this.mOverlayItemContent);
            this.mOverlay.append(this.mOverlayContent);
        },

        showOverlay: function (aHideLoader) {
            if ($(".statisticsOverlay").length == 0) $("body").prepend(this.mOverlay);

            this.mOverlay.removeClass("hide").addClass("active");
            this.mOverlay.initializeOverlays();

            if (!aHideLoader) {
                this.mOverlayItemTitle.html("");
                this.mOverlayItemContent.html('<div class="loader show" />');
            }

            this.mOverlay.stop(true).animate({ opacity: 1 }, 200);
        },

        hideOverlay: function () {
            var theThis = this;

            this.mOverlay.stop(true).animate({ opacity: 0 }, 200, function () {
                theThis.mOverlay.addClass("hide");
            });
        },

        load: function (aContentPageID) {
            if (aContentPageID < 1) return;

            var theThis = this;

            this.showOverlay();

            $.ajax({
                url: "/api/contentPages/getStatistics",
                data: {
                    sectionID: settings.section.ID,
                    contentPageID: aContentPageID,
                    token: $("input[name='__RequestVerificationToken']").val(),
                },
            })
                .done(function (aData) {
                    theThis.onLoad(aData);
                })
                .fail(function () {
                    theThis.hideOverlay();

                    console.log(arguments);
                });
        },

        onLoad: function (aData) {
            if (aData.Rows.length == 0) {
                this.hideOverlay();
                return;
            }

            this.mOverlayItemTitle.html(settings.statistics.titlePrefix + " " + aData.Title);

            this.mOverlayStatisticsTable = $("<div>");
            this.mOverlayStatisticsTable.addClass("statisticsTable");
            this.mOverlayStatisticsTable.addClass("list");

            for (var theIndex in aData.Rows) {
                switch (aData.Rows[theIndex].Type) {
                    case StatisticRowTypes.DateChart:
                        this.insertDateChartRow(aData.Rows[theIndex], theIndex % 2 == 1);
                        break;
                    case StatisticRowTypes.Tags:
                        this.insertTagsRow(aData.Rows[theIndex], theIndex % 2 == 1);
                        break;
                    case StatisticRowTypes.DateTime:
                        this.insertDateRow(aData.Rows[theIndex], theIndex % 2 == 1);
                        break;
                    case StatisticRowTypes.Text:
                    default:
                        this.insertTextRow(aData.Rows[theIndex], theIndex % 2 == 1);
                        break;
                }
            }

            this.mOverlayItemContent.html(this.mOverlayStatisticsTable);
        },

        insertTextRow: function (aRow, aAlternate, aRowType) {
            var theTitleCellWidth = "four";
            var theContentCellWidth = "eight";

            var theTitleRow = $("<div>");
            theTitleRow.addClass("row");

            if (aAlternate) theTitleRow.addClass("alternate");

            var theContentRow = theTitleRow;

            switch (aRowType) {
                case "full":
                    theTitleCellWidth = "twelve";
                    theContentCellWidth = "twelve";
                    theContentRow = theTitleRow.clone();
                    break;
            }

            var theTitleCell = $("<div>");
            theTitleCell.addClass(theTitleCellWidth);
            theTitleCell.addClass("columns");
            theTitleCell.addClass("strong");
            theTitleCell.html(aRow.Title + ":");

            var theContentCell = $("<div>");
            theContentCell.addClass(theContentCellWidth);
            theContentCell.addClass("columns");
            theContentCell.html(aRow.Content);

            theTitleRow.append(theTitleCell);
            theContentRow.append(theContentCell);

            this.mOverlayStatisticsTable.append(theTitleRow);

            if (!theContentRow.is(theTitleRow)) this.mOverlayStatisticsTable.append(theContentRow);
        },

        insertDateRow: function (aRow, aAlternate) {
            var theDate = new Date(aRow.Content.replace("T", " "));

            aRow.Content = this.getDateFormatted(theDate);

            this.insertTextRow(aRow, aAlternate);
        },

        insertTagsRow: function (aRow, aAlternate) {
            var theTags = aRow.Content[0];
            aRow.Content = "";

            for (var theIndex in theTags) {
                aRow.Content +=
                    '<span class="tag icon-tag before"><a href="/shortcuts/Search_Search.aspx?tag=' +
                    encodeURIComponent(theTags[theIndex].Name) +
                    '">' +
                    theTags[theIndex].Name +
                    "</a></span>";
            }

            this.insertTextRow(aRow, aAlternate);
        },

        insertDateChartRow: function (aRow, aAlternate) {
            var theThis = this;
            var theChartDays = 30;
            var theMaxValue = 0;
            var theCurrentDate = new Date();
            var theChartDate = new Date();
            var theChart = $("<div>");
            theChart.addClass("statisticsChart");

            var theBarContainer = $("<div>");
            theBarContainer.addClass("barContainer");

            var theYScale = $("<div>");
            theYScale.addClass("yScale");

            var theYScaleValue = $("<div>");
            theYScale.append(theYScaleValue);
            theBarContainer.append(theYScale);

            var theChartXScale = $("<div>");
            theChartXScale.addClass("xScale");

            for (var theKey in aRow.Content) {
                theMaxValue = Math.max(theMaxValue, aRow.Content[theKey]);
            }

            theYScaleValue.html(theMaxValue);

            theChartDate.setDate(theChartDate.getDate() - theChartDays + 1);

            while (theChartDate <= theCurrentDate) {
                var theKey =
                    theChartDate.getFullYear() +
                    "-" +
                    (theChartDate.getMonth() + 1 < 10 ? "0" : "") +
                    (theChartDate.getMonth() + 1) +
                    "-" +
                    (theChartDate.getDate() < 10 ? "0" : "") +
                    theChartDate.getDate() +
                    "T00:00:00";
                var theValue = aRow.Content[theKey];
                var theWidth = 100 / theChartDays;
                var theCurrentBar = $("<div>");
                theCurrentBar.addClass("bar");
                theCurrentBar.css({ height: 0, width: theWidth - 1 + "%" });

                if (typeof theValue == "number") {
                    theCurrentBar.css({ height: (theValue / theMaxValue) * 100 + "%" });
                    //theCurrentBar.append(theValue);

                    theCurrentBar.data("barData", {
                        date: new Date(theChartDate),
                        value: theValue,
                        prefix: aRow.ContentPrefix,
                    });
                    theCurrentBar;
                    on("mouseover", function () {
                        theThis.onBarMouseOver($(this));
                    }).on("mouseleave", function () {
                        theThis.onBarMouseOut();
                    });
                }

                var theCurrentXScaleValue = $("<div>");
                theCurrentXScaleValue.css({ width: theWidth + "%" });

                if (theChartDate.getDate() % 5 == 1) theCurrentXScaleValue.html(theChartDate.getDate());

                theChartXScale.append(theCurrentXScaleValue);
                theBarContainer.append(theCurrentBar);

                theChartDate.setDate(theChartDate.getDate() + 1);
            }

            theChart.append(theBarContainer);
            theChart.append(theChartXScale);

            aRow.Content = theChart;
            this.insertTextRow(aRow, aAlternate, "full");
        },

        onBarMouseOver: function (aObject) {
            if (typeof this.mBarToolTip == "undefined" || this.mBarToolTip == null) {
                this.mBarToolTip = $(".barTooltip");

                if (this.mBarToolTip.length == 0) {
                    this.mBarToolTip = $("<div>");
                    this.mBarToolTip.addClass("barTooltip");
                    this.mBarToolTip.hide();
                    $("body").append(this.mBarToolTip);
                }
            }

            var theBarData = aObject.data("barData");
            var theOffset = aObject.offset();
            var theParentOffset = aObject.parent().offset();
            var theDateContainer = $("<div>");
            theDateContainer.addClass("date");
            theDateContainer.html(this.getDateFormatted(theBarData.date));

            var theValueContainer = $("<div>");
            theValueContainer.addClass("value");
            theValueContainer.html("");

            if (typeof theBarData.prefix != "undefined" && theBarData.prefix != null && trim(theBarData.prefix) != "")
                theValueContainer.append(theBarData.prefix + " ");

            theValueContainer.append(theBarData.value);

            this.mBarToolTip.html(theDateContainer);
            this.mBarToolTip.append(theValueContainer);

            var theTargetLeft = theOffset.left - this.mBarToolTip.outerWidth();

            if (theTargetLeft < theParentOffset.left) theTargetLeft = theOffset.left + aObject.outerWidth();

            this.mBarToolTip.css({ left: theTargetLeft, top: theOffset.top - this.mBarToolTip.outerHeight() });
            this.mBarToolTip.show();
        },

        onBarMouseOut: function () {
            this.mBarToolTip.hide();
        },

        getDateFormatted: function (aDate, aIncludeTime) {
            var theReturnValue = aDate.getDate() + " " + getMonthName(aDate.getMonth() + 1) + " " + aDate.getFullYear();

            if (aIncludeTime)
                theReturnValue +=
                    " " +
                    settings.various.timeText +
                    " " +
                    aDate.getHours() +
                    ":" +
                    (aDate.getMinutes() < 10 ? "0" : "") +
                    aDate.getMinutes();

            return theReturnValue;
        },
    };

    theReturnObject.init();

    return theReturnObject;
};
;
$(document).ready(function () {
    var updatesWidget = null;
    var currentNotificationGuid = "";

    // Updates count.
    $("#top .badge").getNewUpdatesCount({ lastCheck: settings.widgets.lastUpdatesCheck.format("yyyy-MM-ddTHH:mm:ss") });

    // Notifications shortcut.
    $("#top .shortcut.notifications, #top .shortcut.badge")
        .off("click")
        .on("click", function () {
            var shortcut = $(this);
            var allDescenants = shortcut.parent().find("*");
            var dropDownContent = shortcut.parent().find(".dropDown.notificationsContent");
            var maxHeight = $(window).height() - $("#top").height();

            if (maxHeight === 0) {
                maxHeight = $(document).height() - 200;
            }

            if (shortcut.hasClass("active")) shortcut.attr("aria-expanded", "true");

            if (!dropDownContent.hasClass("show")) {
                if (updatesWidget === null) {
                    // Create new updates widget.
                    updatesWidget = new Widget(dropDownContent.find(".mettWidget").removeClass("wait"));
                } else if (settings.user.updatesCount > 0) {
                    // Load new updates.
                    updatesWidget.loadData();
                }

                updatesWidget.complete(function () {
                    // Make updates clickable.
                    dropDownContent.find("li").each(function () {
                        var update = $(this);

                        if (update.find("a").length > 0) {
                            update
                                .off("click")
                                .on("click", function (e) {
                                    if (e.target.nodeName !== "A") {
                                        update.find("a").not("a[data-user-id]:first")[0].click();

                                        return false;
                                    }
                                })
                                .addClass("pointer");
                        } else if (
                            typeof update.attr("data-url") !== "undefined" &&
                            update.attr("data-url") !== null &&
                            trim(update.attr("data-url")) !== ""
                        ) {
                            update
                                .off("click")
                                .on("click", function (e) {
                                    document.location.href = update.attr("data-url");
                                })
                                .addClass("pointer");
                        }
                    });

                    // Check if scrollbar in drop down is needed.
                    if (dropDownContent.height() > maxHeight) {
                        dropDownContent.css({
                            "max-height": maxHeight,
                            "overflow-x": "hidden",
                            "overflow-y": "scroll",
                        });
                    } else {
                        dropDownContent.removeAttr("style");
                    }

                    allDescenants = shortcut.parent().find("*");
                    allDescenants.off("blur").on("blur", function () {
                        setTimeout(function () {
                            if (!$.contains(shortcut.parent()[0], $(":focus")[0])) {
                                shortcut.trigger("click");
                            }
                        }, 40);
                    });
                });

                // Hide all other drop downs.
                $("#mainMenu a.arrow").removeClass("icon-up-open-big").addClass("icon-down-open-big");
                $(".dropDown:not(.subMenuDropDown)").removeClass("show").addClass("hide");
                $(".shortcut").removeClass("active");

                // Show drop down.
                shortcut.addClass("active").attr("aria-expanded", "true");
                dropDownContent.addClass("show").removeClass("hide");

                // Reset.
                if (settings.user.updatesCount > 0) {
                    //$("#top .badge").css({opacity: 0}).html(0);
                    $.fn.setLastUpdatesCheck();
                }

                allDescenants = shortcut.parent().find("*");
                allDescenants.off("blur").on("blur", function () {
                    setTimeout(function () {
                        if (!$.contains(shortcut.parent()[0], $(":focus")[0])) {
                            shortcut.trigger("click");
                        }
                    }, 40);
                });
            } else {
                // Hide.
                shortcut.removeClass("active").attr("aria-expanded", "false");
                dropDownContent.removeClass("show").addClass("hide");

                // Reset.
                dropDownContent.find(".mettWidget ul li.new").removeClass("new");
                allDescenants = shortcut.parent().find("*");
                allDescenants.off("blur");
            }

            return false;
        });
});

// Get new updates count.
$.fn.getNewUpdatesCount = function (opts) {
    var defaults = {
        lastCheck: null,
    };

    var options = $.extend(defaults, opts);

    if ($(this).length > 0 && !settings.section.isCMS) {
        var container = $(this);
        var updatesCountURL = "/api/widget/CountNewUpdates?preventCache=" + new Date().getTime().toString();

        if (options.lastCheck !== null) {
            updatesCountURL = "/api/widget/CountNewUpdates?lastDate=" + options.lastCheck;
        }

        // Get count.
        $.ajax({
            url: updatesCountURL,
            data: {
                token: $("input[name='__RequestVerificationToken']").val(),
            },
        })
            .done(function (data) {
                if (data > 0) {
                    container.setNewUpdatesCount(data);
                }
            })
            .fail(function () {
                $.fn.showError(settings.errors.updatesCountErrorText + " (500.38)", "console");
            });
    }
};

// Set new updates count (for updates badge).
$.fn.setNewUpdatesCount = function (count) {
    if ($(this).length > 0 && count > 0) {
        // Audio notification.
        if (settings.user.enableUpdatesAudio) {
            if (typeof globals.audioElement === "undefined") {
                globals.audioElement = document.createElement("audio");
                globals.audioElement.setAttribute(
                    "src",
                    "/communities/common/themes/mett%20responsive/audio/notification.mp3"
                );
            } else if (count > settings.user.updatesCount) {
                // Play notification.
                globals.audioElement.play();
            }
        }

        // Set updates count.
        settings.user.updatesCount = count;

        // Write updates count.
        //$(this).html(count).stop().css({opacity: 0}).animate({opacity: 1}, 300);
        $("#welcome .newUpdatesCount").html(count);
    }
};

// Set date of last updates check.
$.fn.setLastUpdatesCheck = function () {
    // Reset updates count.
    settings.user.updatesCount = 0;

    $.ajax({
        url: "/api/widget/SetLastUpdatesCheck",
        data: {
            token: $("input[name='__RequestVerificationToken']").val(),
        },
    }).fail(function () {
        $.fn.showError(settings.errors.updatesDateErrorText + " (500.39)", "console");
    });
};
;
$(document).ready(function () {
    if ($(".nestedComments").length === 0) return;

    if (typeof CKEDITOR === "undefined" || !CKEDITOR) {
        window.CKEDITOR_BASEPATH = "/ckeditor/";
        $("head").append('<script src="/ckeditor/ckeditor.js?t=C6HH5UF" type="text/javascript"></script>');
    }

    $(".nestedComments").each(function () {
        if (typeof $(this).data("nestedComments") == "undefined" || $(this).data("nestedComments") == null)
            $(this).data("nestedComments", new NestedComments($(this)));
    });
});

var NestedComments = function (aObject) {
    var commentsContainer;
    var bestAnswerContainer;
    var addCommentEditorContainer;
    var completeHandlers = [];
    var commentsLoadedHandlers = [];
    var initialized = false;
    var sortOrder;
    var contentPageTitle = "";
    var contentPageAuthorId = -1;
    var mayComment = false;
    var enableLikes = false;
    var mentionUsers = [];
    var editDeleteOwnComments = false;
    var autoFollow = false;
    var allowFiles = false;
    var allowAnonymous = false;
    var allowBestAnswer = false;
    var allowReport = false;
    var userLoggedIn = false;
    var captchaTarget = null;

    function init() {
        if (!settings.section || !settings.section.itemID || settings.section.itemID < 1) {
            aObject.addClass("hide");
            return;
        }

        commentsContainer = aObject.find(".commentsContainer");
        bestAnswerContainer = aObject.find(".bestAnswerContainer");

        contentPageTitle = aObject.data("content-page-title");
        contentPageAuthorId = aObject.data("content-page-author-id");
        mayComment = aObject.data("may-comment");
        enableLikes = aObject.data("enable-likes");
        editDeleteOwnComments = aObject.data("edit-delete-own-comments");
        autoFollow = aObject.data("auto-follow");
        allowFiles = aObject.data("allow-files");
        allowAnonymous = aObject.data("allow-anonymous");
        allowBestAnswer = aObject.data("allow-best-answer");
        allowReport = aObject.data("allow-report");
        userLoggedIn = settings.user && settings.user.ID > 0;

        setCommentCount("");

        initSorting();
        loadComments();
        loadMentionUsers();
    }

    function initSorting() {
        var sortOrderSelect = aObject.find(".commentsSortOrder");
        sortOrder = sortOrderSelect.val();

        sortOrderSelect.change(function () {
            sortOrder = sortOrderSelect.val();
            loadComments();
            buildEditor();
        });
    }

    function loadComments(highlightCommentId) {
        allComments = [];

        destroyDynamicEditor();
        bestAnswerContainer.empty();

        commentsContainer.html(buildLoader());

        if (addCommentEditorContainer) addCommentEditorContainer.addClass("hide");

        $.ajax({
            url: "/api/Comments/GetComments",
            data: {
                sectionId: settings.section.ID,
                contentPageId: settings.section.itemID,
                token: $('input[name="__RequestVerificationToken"]').val(),
                sortOrder: sortOrder,
            },
        })
            .done(function (data) {
                try {
                    data = JSON.parse(data);
                } catch {
                    return onLoadCommentsError();
                }

                if (!Array.isArray(data)) return onLoadCommentsError();

                setCommentCount(countComments(data));

                buildComments(data);

                commentsLoaded(highlightCommentId);
            })
            .fail(function () {
                onLoadCommentsError();
            });
    }

    function countComments(comments) {
        var count = 0;

        count += comments.length;

        for (var index in comments) {
            var currentComment = comments[index];

            if (currentComment.CommentChildren && currentComment.CommentChildren.length > 0)
                count += countComments(currentComment.CommentChildren);
        }

        return count;
    }

    function commentsLoaded(highlightCommentId) {
        commentsContainer.find(".dropDownMenu").initializeDropDownMenus();

        if (addCommentEditorContainer) addCommentEditorContainer.removeClass("hide");

        if (!initialized) {
            initialized = true;

            deeplinkComment();
            theReturnObject.complete();

            buildEditor();
            buildCaptcha();
        }

        aObject.initializeToolbars();

        if (highlightCommentId && highlightCommentId > 0) highlightComment(highlightCommentId);

        if (settings.userDialog.instance != null) settings.userDialog.instance.init();

        theReturnObject.commentsLoaded();
    }

    function deeplinkComment() {
        if (document.location.href.indexOf("#") === -1 || document.location.href.indexOf("comment-") === -1) return;

        if (document.location.href.indexOf("#") > document.location.href.indexOf("comment-")) return;

        var commentId = document.location.href.split("#")[1];
        commentId = commentId.split("comment-")[1];
        commentId = commentId.split("&")[0];
        commentId = trim(commentId);

        if (commentId === "" || isNaN(commentId)) return;

        highlightComment(parseInt(commentId));
    }

    function setCommentCount(commentCount) {
        $(".comments .addCommentCount").text(commentCount);
    }

    function findBestAnswer(children) {
        if (!allowBestAnswer) return;

        if (!children) children = allComments;

        for (var index in children) {
            var currentComment = children[index];

            if (currentComment.BestAnswer === true) return currentComment;

            if (currentComment.CommentChildren && currentComment.CommentChildren.length > 0) {
                var bestAnswerChild = findBestAnswer(currentComment.CommentChildren);

                if (bestAnswerChild) return bestAnswerChild;
            }
        }
    }

    function findCommentRecursive(commentId, children) {
        if (!children) children = allComments;

        for (var index in children) {
            var currentComment = children[index];

            if (currentComment.CommentId === commentId) return currentComment;

            if (currentComment.CommentChildren && currentComment.CommentChildren.length > 0)
                return findCommentRecursive(commentId, currentComment.CommentChildren);
        }
    }

    function expandChildCommentsRecursive(commentId) {
        var targetComment = findCommentRecursive(commentId);
        var currentParent = targetComment;
        var allParents = [targetComment];

        if (!targetComment) return;

        while (currentParent.ParentCommentId > 0) {
            currentParent = findCommentRecursive(currentParent.ParentCommentId);
            allParents.unshift(currentParent);
        }

        for (var index in allParents) {
            $(
                "#comment-" +
                    allParents[index].CommentId +
                    " > .commentContent > .childComments > .comment > .loadMoreComments"
            ).click();
        }
    }

    function highlightComment(commentId) {
        var targetCommentContainer = $("#comment-" + commentId);

        if (targetCommentContainer.length === 0) {
            expandChildCommentsRecursive(commentId);

            targetCommentContainer = $("#comment-" + commentId);

            if (targetCommentContainer.length === 0) return;
        }

        targetCommentContainer.focus();
        targetCommentContainer.css({
            boxShadow: "inset 0px 80px 67px -64px rgba(28,184,0,0)",
        });

        setTimeout(function () {
            targetCommentContainer.css({
                boxShadow: "inset 0px 80px 67px -64px rgba(28,184,0,.3)",
            });
        }, 40);

        setTimeout(function () {
            targetCommentContainer.css({
                boxShadow: "inset 0px 80px 67px -64px rgba(28,184,0,0)",
            });
        }, 2000);
    }

    function loadMentionUsers() {
        if (!mayComment) return;

        $.ajax({
            url: "/api/user/GetCommentersByPermissionsJson",
            data: {
                sectionID: settings.section.ID,
                contentPageID: settings.section.itemID,
                token: $('input[name="__RequestVerificationToken"]').val(),
            },
        }).done(function (data) {
            mentionUsers = JSON.parse(data);
        });
    }

    function destroyDynamicEditor() {
        commentsContainer.find(".editMode").removeClass("editMode");

        if (!CKEDITOR.instances.dynamicCommentEditor) return;

        CKEDITOR.instances.dynamicCommentEditor.destroy();
        $(".dynamicCommentEditorContainer").remove();
    }

    function destroyAddEditor() {
        if (!CKEDITOR.instances.addCommentEditor) return;

        CKEDITOR.instances.addCommentEditor.destroy();
        $(".addCommentEditorContainer").remove();
    }

    function buildEditor(replyComment, editComment) {
        if (!mayComment) return;

        var commentId;
        // Check if editor already exists for current reply or edit comment
        if (replyComment || editComment) {
            commentId = replyComment ? replyComment.CommentId : editComment.CommentId;

            var currentContainer = commentsContainer.find("[data-target-comment-id=" + commentId + "]");
            if (
                (replyComment && currentContainer.hasClass("reply")) ||
                (editComment && currentContainer.hasClass("edit"))
            ) {
                CKEDITOR.instances.dynamicCommentEditor.focus();

                var range = CKEDITOR.instances.dynamicCommentEditor.createRange();
                range.moveToElementEditEnd(range.root);
                CKEDITOR.instances.dynamicCommentEditor.getSelection().selectRanges([range]);
                return;
            }
        }

        var commentEditorContainer = $("<div>");
        commentEditorContainer.addClass("commentEditorContainer");

        var editor = $("<textarea>");
        editor.addClass("hide");

        var editorId;

        if (replyComment || editComment) {
            destroyDynamicEditor();
            editorId = "dynamicCommentEditor";
            commentEditorContainer.addClass("dynamicCommentEditorContainer");
            commentEditorContainer.attr("data-target-comment-id", commentId);
        } else {
            destroyAddEditor();
            editorId = "addCommentEditor";
            commentEditorContainer.addClass("addCommentEditorContainer");
            addCommentEditorContainer = commentEditorContainer;
        }

        editor.attr("id", editorId);

        var editorField = $("<div>");
        editorField.addClass("field editor");

        var editorLabel = $("<label>");
        editorLabel.attr("for", editorId);
        editorLabel.text(settings.fields.commentFieldText + "*");

        var clear = $("<div>");
        clear.addClass("clear");

        var buttonToolbar = $("<div>");
        buttonToolbar.addClass("addCommentToolbar toolbar show");

        var showPluploadButtonWrapper = $("<div>");
        showPluploadButtonWrapper.addClass("button icon-doc-text transparent before showPlupload showMore");
        showPluploadButtonWrapper.attr("data-hide-after-toggle", true);

        var showPluploadButton = $("<input>");
        showPluploadButton.attr("type", "button");
        showPluploadButton.val(settings.nestedComments.addFileText);

        var commentButtonWrapper = $("<div>");
        commentButtonWrapper.addClass("button info icon-comment before addComment");

        var commentButton = $("<button>");
        commentButton.attr("type", "button");
        commentButton.text(settings.nestedComments.commentText);

        if (editComment) commentButton.text(settings.buttons.editText);

        if (replyComment || editComment) {
            var cancelButtonWrapper = $("<div>");
            cancelButtonWrapper.addClass("button delete icon-cancel-circled before cancelComment");

            var cancelButton = $("<button>");
            cancelButton.attr("type", "button");
            cancelButton.text(settings.buttons.cancelText);
            cancelButton.click(function () {
                destroyDynamicEditor();
                return false;
            });

            cancelButtonWrapper.append(cancelButton);
            buttonToolbar.append(cancelButtonWrapper);
        }

        showPluploadButtonWrapper.append(showPluploadButton);
        commentButtonWrapper.append(commentButton);

        if (userLoggedIn) buttonToolbar.append(showPluploadButtonWrapper);

        buttonToolbar.append(commentButtonWrapper);

        var plupload = buildPlupload();

        editorField.append(editorLabel);
        editorField.append(clear);
        editorField.append(editor);

        commentEditorContainer.append(editorField);
        commentEditorContainer.append(plupload);
        commentEditorContainer.append(buttonToolbar);

        if (replyComment) {
            // Only 1 level deep
            var targetCommentId =
                replyComment.ParentCommentId > 0 ? replyComment.ParentCommentId : replyComment.CommentId;

            var targetComment = commentsContainer.find("[data-comment-id=" + targetCommentId + "]");
            var childComments = targetComment.find("> .commentContent > .childComments");

            if (childComments.length == 0) {
                childComments = $("<div>").addClass("childComments");
                targetComment.find(".commentContent").append(childComments);
            }

            // If reply to comment, auto tag author
            if (replyComment.CommentAuthor) {
                var filteredUsers = mentionUsers.filter(function (item) {
                    return item.UserId == replyComment.CommentAuthor.UserId;
                });

                if (filteredUsers.length > 0)
                    editor.val(
                        '<p><span class="strong commentMention" contenteditable="false"><a data-user-id="' +
                            replyComment.CommentAuthor.UserId +
                            '" data-cke-saved-href="/shortcuts/Users_ShowProfile.aspx?userkey=' +
                            replyComment.CommentAuthor.UserId +
                            '" href="/shortcuts/Users_ShowProfile.aspx?userkey=' +
                            replyComment.CommentAuthor.UserId +
                            '">' +
                            replyComment.CommentAuthor.Fullname +
                            "</a></span></p>"
                    );
                else
                    editor.val(
                        '<p><span class="strong commentMention" contenteditable="false">' +
                            replyComment.CommentAuthor.Fullname +
                            "</span></p>"
                    );
            }

            commentEditorContainer.prepend(buildAnonymous(replyComment));

            if (sortOrder === "desc") childComments.prepend(commentEditorContainer);
            else childComments.append(commentEditorContainer);

            commentEditorContainer.addClass("reply");
        } else if (editComment) {
            var targetComment = commentsContainer.find("[data-comment-id=" + editComment.CommentId + "]");
            editor.val(editComment.CommentText);

            targetComment.addClass("editMode");
            targetComment.find("> .commentContent").prepend(commentEditorContainer);

            commentEditorContainer.addClass("edit");
        } else {
            commentEditorContainer.prepend(buildAnonymous());

            if (sortOrder === "desc") commentEditorContainer.insertAfter(bestAnswerContainer);
            else commentEditorContainer.insertAfter(commentsContainer);
        }

        if ($("#" + editorId).length > 0) {
            if (plupload && plupload.length > 0) {
                plupload.find(".uploader").initializePlupload();
            }

            var ckEditor = CKEDITOR.replace(editorId, {
                customConfig: "/CKEditor/config_comments.js",
                startupFocus: replyComment || editComment,
                on: {
                    instanceReady: function (event) {
                        if (!event.editor) return;

                        if (!replyComment && !editComment) return;

                        var range = event.editor.createRange();
                        range.moveToElementEditEnd(range.root);
                        event.editor.getSelection().selectRanges([range]);
                        event.editor.insertText(" ");
                    },
                },
            });

            commentButton.click(function () {
                if (trim(ckEditor.getData()) === "") {
                    $.fn.showError(settings.nestedComments.commentFieldEmptyText);
                    return;
                }

                if (!userLoggedIn && typeof hcaptcha !== "undefined" && hcaptcha.getResponse() === "") {
                    showCaptchaOverlay(this);
                    return;
                }

                buttonToolbar.html(buildLoader());

                if (editComment) {
                    sendEditComment(ckEditor, editComment, plupload);
                    return false;
                }

                if (autoFollow) $("#toolbarTop .follow").click();

                addComment(ckEditor, replyComment, plupload);

                return false;
            });

            commentEditorContainer.initializeToolbars();
        }
    }

    function buildAnonymous(replyComment) {
        if (!allowAnonymous && userLoggedIn) return;

        var commentAuthorChanged = function () {
            if (userLoggedIn && !toggle.prop("checked")) {
                commentAuthor.text(settings.user && settings.user.fullName ? settings.user.fullName : "Anoniem");
                return;
            }

            if (trim(commentAuthorInput.val()) === "") {
                commentAuthor.text(settings.fields.commentNameText);
                return;
            }

            commentAuthor.text(trim(commentAuthorInput.val()));
        };

        var anomynousContainer = $("<div>");
        anomynousContainer.addClass("anomynousContainer");

        var commentAuthorContainer = $("<div>");
        commentAuthorContainer.addClass("field lessMargin commentAuthorCurrent");
        commentAuthorContainer.text(settings.nestedComments.commentLikText);

        var commentAuthor = $("<span>");
        commentAuthor.addClass("strong anonymousAuthor");
        commentAuthor.text(
            settings.user && settings.user.fullName ? settings.user.fullName : settings.fields.commentNameText
        );

        var toggleField = $("<div>");
        toggleField.addClass("field lessMargin switch");

        var toggleContainer = $("<span>");
        toggleContainer.addClass("toggleAnonymousComment containerToggle");
        toggleContainer.initializeCustomContainers();

        var toggle = $("<input>");
        toggle.attr({
            id: replyComment ? "replyAnonymousToggle" : "anonymousToggle",
            type: "checkbox",
        });
        toggle.change(commentAuthorChanged);

        var toggleLabel = $("<label>");
        toggleLabel.attr({
            for: replyComment ? "replyAnonymousToggle" : "anonymousToggle",
            "data-toggle-children": true,
        });
        toggleLabel.text(settings.nestedComments.otherNameText);

        var optionsContainer = $("<div>");
        if (userLoggedIn) {
            optionsContainer.addClass("container hide");
            optionsContainer.attr("data-show-when-checked", true);
        }

        var commentAuthorField = $("<div>");
        commentAuthorField.addClass("field commentAuthor");

        var commentAuthorLabel = $("<label>");
        commentAuthorLabel.attr("for", replyComment ? "replyAnonymousName" : "anonymousName");
        commentAuthorLabel.text(settings.nestedComments.nameText);

        var commentAuthorHelp = $("<p>");
        commentAuthorHelp.addClass("help");
        commentAuthorHelp.text(settings.nestedComments.anonymousText);

        var commentAuthorInput = $("<input>");
        commentAuthorInput.attr({
            id: replyComment ? "replyAnonymousName" : "anonymousName",
            type: "text",
            autocomplete: "nickname",
        });
        commentAuthorInput.keyup(commentAuthorChanged);
        commentAuthorInput.change(commentAuthorChanged);

        var commentEmailField = $("<div>");
        commentEmailField.addClass("field commentAuthor");

        var commentEmailLabel = $("<label>");
        commentEmailLabel.attr("for", replyComment ? "replyAnonymousEmail" : "anonymousEmail");
        commentEmailLabel.text(settings.nestedComments.emailAddressText);

        var commentEmailHelp = $("<p>");
        commentEmailHelp.addClass("help");
        commentEmailHelp.text(settings.nestedComments.leaveEmailText);

        var commentEmailInput = $("<input>");
        commentEmailInput.attr({
            id: replyComment ? "replyAnonymousEmail" : "anonymousEmail",
            type: "text",
            autocomplete: "email",
        });

        toggleContainer.append(toggle);
        if (userLoggedIn) toggleContainer.append(toggleLabel);

        toggleField.append(toggleContainer);

        commentAuthorField.append(commentAuthorLabel);
        commentAuthorField.append(commentAuthorHelp);
        commentAuthorField.append(commentAuthorInput);

        commentEmailField.append(commentEmailLabel);
        commentEmailField.append(commentEmailHelp);
        commentEmailField.append(commentEmailInput);

        optionsContainer.append(commentAuthorField);
        optionsContainer.append(commentEmailField);

        commentAuthorContainer.append(commentAuthor);

        anomynousContainer.append(commentAuthorContainer);
        anomynousContainer.append(toggleField);
        anomynousContainer.append(optionsContainer);

        setTimeout(function () {
            toggle.initializeSwitchery();
            toggleContainer.initializeCustomContainers();
        }, 40);

        return anomynousContainer;
    }

    function buildComments(data) {
        allComments = data;
        commentsContainer.empty();

        for (var index in data) {
            commentsContainer.append(buildComment(data[index]));
        }

        buildBestAnswer(findBestAnswer());
    }

    function buildComment(comment) {
        var commentContainer = $("<div>");
        commentContainer.addClass("comment");
        commentContainer.attr("id", "comment-" + comment.CommentId);
        commentContainer.attr("data-comment-id", comment.CommentId);
        commentContainer.attr("data-parent-comment-id", comment.ParentCommentId);
        commentContainer.attr("data-best-answer", allowBestAnswer ? comment.BestAnswer : false);
        commentContainer.attr("tabindex", 0);

        var commentContent = $("<div>");
        commentContent.addClass("commentContent");

        commentContent.append(buildAuthor(comment));
        commentContent.append(buildCommentText(comment));
        commentContent.append(buildFileList(comment));
        commentContent.append(buildToolbar(comment));
        commentContent.append(buildItemOptions(comment));
        commentContent.append(buildCommentChildren(comment));

        commentContainer.append(buildAvatar(comment.CommentAuthor));
        commentContainer.append(commentContent);

        return commentContainer;
    }

    function buildCommentChildren(comment, expanded) {
        if (!comment.CommentChildren || comment.CommentChildren.length === 0) return;

        var childComments = $("<div>");
        childComments.addClass("childComments");

        for (var index in comment.CommentChildren) {
            if (!expanded) {
                if (
                    (sortOrder === "desc" && index > 1) ||
                    (sortOrder === "asc" && index < comment.CommentChildren.length - 2)
                )
                    continue;
            }

            childComments.append(buildComment(comment.CommentChildren[index]));
        }

        if (!expanded && comment.CommentChildren.length > 2) {
            if (sortOrder === "asc") childComments.prepend(buildLoadMoreButton(comment));
            if (sortOrder === "desc") childComments.append(buildLoadMoreButton(comment));
        }

        if (expanded && settings.userDialog.instance != null) {
            setTimeout(function () {
                settings.userDialog.instance.init();
            }, 40);
        }

        setTimeout(function () {
            childComments.find(".dropDownMenu").initializeDropDownMenus();
            childComments.initializeToolbars();
        }, 40);

        return childComments;
    }

    function buildLoadMoreButton(comment) {
        var loadMoreButtonContainer = $("<div>");
        loadMoreButtonContainer.addClass("comment loadMoreCommentsContainer");

        var loadMoreButton = $("<a>");
        loadMoreButton.attr({
            href: "#loadMoreComments",
            role: "button",
        });
        loadMoreButton.addClass("loadMoreComments textButton inline before");
        loadMoreButton.addClass(sortOrder === "asc" ? "icon-up-open" : "icon-down-open");
        loadMoreButton.text(
            settings.nestedComments.showMoreCommentsText.replace("{0}", comment.CommentChildren.length - 2)
        );

        loadMoreButton.click(function () {
            var targetChildCommentsContainer = $(this).parents(".childComments:first");
            targetChildCommentsContainer.empty();
            targetChildCommentsContainer.append(buildCommentChildren(comment, true));
            return false;
        });

        loadMoreButtonContainer.append(loadMoreButton);
        return loadMoreButtonContainer;
    }

    function buildAvatar(author) {
        var avatarContainer = $("<div>");
        avatarContainer.addClass("commentImage");

        if (author && author.Avatar && author.Avatar.indexOf("/?") == -1) {
            avatarContainer.addClass("hasAvatar");

            var avatar = $("<img>");
            avatar.addClass("avatar");
            avatar.attr("alt", "Profielfoto");
            avatar.attr("data-user-id", author.UserId);
            avatar.attr("src", author.Avatar);
            avatarContainer.append(avatar);
        } else {
            var avatar = $("<div>");
            avatar.addClass("shortcut avatar noAvatar circle icon-user before");
            avatarContainer.append(avatar);
        }

        return avatarContainer;
    }

    function buildAuthor(comment) {
        var author = comment.CommentAuthor;

        var itemInformation = $("<div>");
        itemInformation.addClass("commentInformation");

        var authorContainer = $("<div>");
        authorContainer.addClass("author");

        var bestAnswerTextContainer = $("<span>");
        bestAnswerTextContainer.addClass("bestAnswerText icon-check before");
        bestAnswerTextContainer.html(settings.nestedComments.bestAnswerByText + "&nbsp;");

        if (author) {
            authorContainer.attr("data-user-id", author.UserId);
            authorContainer.text(authorContainer.text() + author.Fullname);
        } else {
            authorContainer.text(authorContainer.text() + settings.fields.commentNameText);
        }

        var dateContainer = $("<span>");
        dateContainer.addClass("fullDate icon-calendar before");
        dateContainer.text(moment(comment.CreatedDate).format("DD-MM-YYYY [" + settings.various.timeText + "] H:mm"));

        authorContainer.prepend(bestAnswerTextContainer);
        itemInformation.append(authorContainer);
        itemInformation.append(dateContainer);
        itemInformation.append($("<div>").addClass("clear"));

        return itemInformation;
    }

    function buildCommentText(comment) {
        var commentTextContainer = $("<div>");
        commentTextContainer.addClass("commentText clear");
        commentTextContainer.html(comment.CommentText);

        return commentTextContainer;
    }

    function buildToolbar(comment) {
        var toolbarContainer = $("<div>");
        toolbarContainer.addClass("toolbar show commentOptions");

        toolbarContainer.append(buildLikeButton(comment));
        toolbarContainer.append(buildBestAnswerButtons(comment));
        toolbarContainer.append(buildReplyButton(comment));

        return toolbarContainer;
    }

    function buildLikeButton(comment) {
        if (!enableLikes) return;

        var button = $("<span>");

        if (userLoggedIn) {
            button = $("<a>");
            button.attr({
                role: "button",
                href: "#like",
            });

            button.click(function () {
                var hasLiked = !button.hasClass("liked");
                var newNumber = parseInt(buttonNumber.text());

                newNumber += hasLiked ? 1 : -1;
                buttonNumber.text(newNumber);

                if (hasLiked) button.addClass("liked icon-heart").removeClass("icon-heart-empty");
                else button.addClass("icon-heart-empty").removeClass("liked icon-heart");

                likeComment(comment, hasLiked);

                return false;
            });
        }

        button.addClass("commentLike like inline icon-heart-empty before");
        button.attr("data-item-id", comment.CommentId);

        if (comment.LikedByUser) button.addClass("liked icon-heart").removeClass("icon-heart-empty");

        var buttonNumber = $("<span>");
        buttonNumber.addClass("number");
        buttonNumber.text(comment.LikeCount);

        var screenReaderContent = $("<span>");
        screenReaderContent.addClass("screenReaderContent");
        screenReaderContent.text(" " + settings.buttons.inlineLikeText);

        button.append(buttonNumber);
        button.append(screenReaderContent);

        return button;
    }

    function buildBestAnswerButtons(comment) {
        if (!allowBestAnswer) return;

        if (
            !settings.user ||
            (!settings.user.isAdmin && !settings.user.isModerator && settings.user.ID !== contentPageAuthorId)
        )
            return;

        var markButton = $("<a>");
        markButton.attr({
            role: "button",
            href: "#BestAnswer",
        });
        markButton.addClass("markBestAnswer textButton inline icon-check before");
        markButton.text(settings.nestedComments.markBestAnswerText);

        markButton.click(function () {
            commentsContainer.find("[data-best-answer=true]").attr("data-best-answer", "false");
            commentsContainer.find("[data-comment-id=" + comment.CommentId + "]").attr("data-best-answer", true);

            buildBestAnswer(comment);
            markBestAnswer(comment, true);

            return false;
        });

        return markButton;
    }

    function buildReplyButton(comment) {
        if (!mayComment) return;

        var button = $("<a>");
        button.attr({
            role: "button",
            href: "#Reply",
        });
        button.addClass("reply textButton inline icon-reply before");
        button.attr("data-item-id", comment.CommentId);
        button.text(settings.nestedComments.commentToText);

        button.click(function () {
            buildEditor(comment);

            return false;
        });

        return button;
    }

    function buildItemOptions(comment) {
        var itemOptions = $("<div>");
        itemOptions.addClass("itemOptions");

        var toolbar = $("<div>");
        toolbar.addClass("toolbarWrapper toolbar right show");

        // Ellipsis menu is now only used for report inappropiate comment
        if (allowReport && userLoggedIn) {
            var ellipsisMenu = $("<ul>");
            ellipsisMenu.addClass("dropDownMenu");

            var ellipsisMenuLi = $("<li>");

            var ellipsisMenuMenuButton = $("<button>");
            ellipsisMenuMenuButton.addClass("button toggleDropDown transparent icon-awesome-ellipsis iconOnly before");
            ellipsisMenuMenuButton.attr("aria-expanded", "false");
            ellipsisMenuMenuButton.attr("type", "button");

            var ellipsisDropDown = $("<div>");
            ellipsisDropDown.addClass("dropDown");

            if (comment.CommentAuthor)
                ellipsisMenuMenuButton.attr(
                    "aria-label",
                    settings.nestedComments.optionsForCommentText + comment.CommentAuthor.Fullname
                );
            else ellipsisMenuMenuButton.attr("aria-label", settings.nestedComments.optionsForThisCommentTex);

            ellipsisDropDown.append(buildEllipsisLinks(comment));
            ellipsisMenuLi.append(ellipsisMenuMenuButton);
            ellipsisMenuLi.append(ellipsisDropDown);
            ellipsisMenu.append(ellipsisMenuLi);
            toolbar.append(ellipsisMenu);
        }

        if (
            settings.user &&
            (settings.user.isAdmin ||
                settings.user.isModerator ||
                (editDeleteOwnComments && settings.user.ID === comment.CommentAuthor.UserId))
        ) {
            var cogMenu = $("<ul>");
            cogMenu.addClass("dropDownMenu");

            var cogMenuLi = $("<li>");

            var cogMenuMenuButton = $("<button>");
            cogMenuMenuButton.addClass("button toggleDropDown transparent icon-cog iconOnly before");
            cogMenuMenuButton.attr("aria-expanded", "false");
            cogMenuMenuButton.attr("type", "button");

            if (comment.CommentAuthor)
                cogMenuMenuButton.attr(
                    "aria-label",
                    settings.nestedComments.optionsForCommentText + comment.CommentAuthor.Fullname
                );
            else cogMenuMenuButton.attr("aria-label", settings.nestedComments.optionsForThisCommentTex);

            var cogDropDown = $("<div>");
            cogDropDown.addClass("dropDown");

            cogDropDown.append(buildItemOptionLinks(comment));
            cogMenuLi.append(cogMenuMenuButton);
            cogMenuLi.append(cogDropDown);
            cogMenu.append(cogMenuLi);
            toolbar.append(cogMenu);
        }

        if (toolbar.children().length > 0) itemOptions.append(toolbar);

        return itemOptions;
    }

    function buildItemOptionLinks(comment) {
        var deleteLink = $("<a>");
        var returnLinks = deleteLink;

        if (comment.CommentAuthor)
            deleteLink.attr("aria-label", settings.nestedComments.deleteCommentOfText + comment.CommentAuthor.Fullname);
        else deleteLink.attr("aria-label", settings.nestedComments.deleteThisCommentText);
        deleteLink.attr("href", "#");
        deleteLink.addClass("deleteComment icon-trash before");
        deleteLink.text(settings.various.deleteText);

        deleteLink.click(function (e) {
            e.preventDefault();

            var confirmMessage = settings.nestedComments.shureToRemoveText;

            if (comment.CommentAuthor)
                confirmMessage = settings.nestedComments.shureRoRemoveOfText.replace(
                    "{0}",
                    comment.CommentAuthor.Fullname
                );

            if ($(this).confirm(confirmMessage)) deleteComment(comment);

            return false;
        });

        var editLink = $("<a>");

        if (comment.CommentAuthor)
            editLink.attr("aria-label", settings.nestedComments.removeCommentOfText + comment.CommentAuthor.Fullname);
        else editLink.attr("aria-label", settings.nestedComments.editThisCommentText);

        editLink.attr("href", "#");
        editLink.addClass("editComment icon-pencil before");
        editLink.text(settings.buttons.editText);

        editLink.click(function () {
            buildEditor(undefined, comment);
            return false;
        });

        returnLinks = returnLinks.add(editLink);

        return returnLinks;
    }

    function buildEllipsisLinks(comment) {
        if (!allowReport) return;

        var reportLink = $("<a>");
        var returnLinks = reportLink;

        if (comment.CommentAuthor)
            reportLink.attr("aria-label", settings.nestedComments.reportCommentOfText + comment.CommentAuthor.Fullname);
        else reportLink.attr("aria-label", settings.nestedComments.reportThisCommentText);
        reportLink.attr("href", "#");
        reportLink.addClass("reportComment icon-flag before");
        reportLink.text(settings.nestedComments.reportText);

        reportLink.click(function (e) {
            e.preventDefault();

            buildReportComment(comment);

            return false;
        });

        return returnLinks;
    }

    function buildBestAnswer(comment) {
        if (!allowBestAnswer) return;

        bestAnswerContainer.empty();

        if (!comment) return;

        var bestAnswer = $("<div>");
        bestAnswer.addClass("bestAnswer comment");
        bestAnswer.attr("data-comment-id", comment.CommentId);
        bestAnswer.attr("data-parent-comment-id", comment.ParentCommentId);

        var commentContent = $("<div>");
        commentContent.addClass("commentContent");

        var showBestAnswerLink = $("<a>");
        showBestAnswerLink.addClass("showBestAnswer");
        showBestAnswerLink.attr("href", "#comment-" + comment.CommentId);
        showBestAnswerLink.text(settings.nestedComments.showOriginalText);
        showBestAnswerLink.click(function () {
            highlightComment(comment.CommentId);

            return false;
        });

        var author = comment.CommentAuthor;
        var itemInformation = $("<div>");
        itemInformation.addClass("commentInformation");

        var authorContainer = $("<div>");
        authorContainer.addClass("author");

        var toolbar = $("<div>");
        toolbar.addClass("toolbar show");

        var removeButton = $("<a>");
        removeButton.attr({
            role: "button",
            href: "#BestAnswer",
        });
        removeButton.addClass("removeBestAnswer textButton clearBoth inline icon-cancel before");
        removeButton.text(settings.nestedComments.deleteBestAnswerText);

        removeButton.click(function () {
            commentsContainer.find("[data-best-answer=true]").attr("data-best-answer", "false");

            buildBestAnswer();
            markBestAnswer(comment, false);

            return false;
        });

        var bestAnswerTextContainer = $("<span>");
        bestAnswerTextContainer.addClass("bestAnswerText icon-check before");
        bestAnswerTextContainer.html(settings.nestedComments.bestAnswerByText + "&nbsp;");

        if (author) {
            authorContainer.attr("data-user-id", author.UserId);
            authorContainer.text(author.Fullname);
        } else {
            authorContainer.text(settings.fields.commentNameText);
        }

        authorContainer.prepend(bestAnswerTextContainer);
        itemInformation.append(authorContainer);
        itemInformation.append($("<div>").addClass("clear"));

        commentContent.append(itemInformation);
        commentContent.append(buildCommentText(comment));
        commentContent.append(buildFileList(comment));
        commentContent.append(showBestAnswerLink);

        toolbar.append(removeButton);

        bestAnswer.append(commentContent);

        if (
            settings.user &&
            (settings.user.isAdmin || settings.user.isModerator || settings.user.ID === contentPageAuthorId)
        )
            bestAnswer.append(toolbar);

        bestAnswerContainer.append(bestAnswer);
    }

    function deleteComment(comment) {
        var deleteCommentFailed = function () {
            $.fn.showError(settings.nestedComments.deleteCommentErrorText);
        };

        $.ajax({
            url: "/api/Comments/DeleteComment",
            data: {
                sectionId: settings.section.ID,
                commentId: comment.CommentId,
                contentPageId: settings.section.itemID,
                token: $('input[name="__RequestVerificationToken"]').val(),
            },
        })
            .done(function (data) {
                if (data !== "Comment deleted") {
                    deleteCommentFailed();
                    return;
                }

                var commentElement = commentsContainer.find("[data-comment-id=" + comment.CommentId + "]");

                if (commentElement.siblings(".comment").length == 0)
                    commentElement.parents(".childComments:first").remove();

                commentElement.css({
                    height: commentElement.outerHeight(),
                    overflow: "hidden",
                    transition: "opacity 0.3s, height 0.2s 0.2s",
                });

                setTimeout(function () {
                    commentElement.css({
                        opacity: 0,
                        height: 0,
                        minHeight: 0,
                    });
                }, 40);

                commentElement.on("transitionend", function () {
                    commentElement.remove();
                });
            })
            .fail(function () {
                deleteCommentFailed();
            });
    }

    function markBestAnswer(comment, isBestAnswer) {
        if (!allowBestAnswer || !comment) return;

        var markBestAnswerFailed = function () {
            $.fn.showError(settings.nestedComments.reportCommentErrorText);
        };

        $.ajax({
            url: "/api/Comments/BestAnswer",
            data: {
                sectionId: settings.section.ID,
                contentPageId: settings.section.itemID,
                commentId: comment.CommentId,
                bestAnswer: isBestAnswer,
                token: $('input[name="__RequestVerificationToken"]').val(),
            },
        })
            .done(function (data) {
                if (data !== "Comment selected as best answer") markBestAnswerFailed();
            })
            .fail(function () {
                markBestAnswerFailed();
            });
    }

    function likeComment(comment, hasLiked) {
        if (!comment) return;

        $.ajax({
            url: "/api/Comments/LikeComment",
            data: {
                sectionId: settings.section.ID,
                commentId: comment.CommentId,
                like: hasLiked,
                token: $('input[name="__RequestVerificationToken"]').val(),
            },
        }).done(function () {});
    }

    function buildLoader() {
        var loader = $("<div>");
        loader.addClass("loader show");
        loader.attr("role", "status");

        var screenReaderContent = $("<span>");
        screenReaderContent.addClass("screenReaderContent");
        screenReaderContent.text(settings.buttons.savingText);

        loader.append(screenReaderContent);

        return loader;
    }

    function buildReportComment(comment) {
        if (!allowReport) return;

        var overlay = $("<div>");
        overlay.addClass("overlay");
        overlay.attr({
            id: "reportCommentOverlay",
            "aria-modal": true,
            role: overlay,
        });
        overlay.click(function (e) {
            if (e.target === overlay[0]) removeReportComment();
        });

        var closeButtonSRC = $("<span>");
        closeButtonSRC.addClass("screenReaderContent");
        closeButtonSRC.text(settings.nestedComments.closeReportText);

        var closeButton = $("<a>");
        closeButton.attr("role", "button");
        closeButton.attr("href", "#closeReportOverlay");
        closeButton.addClass("button close info icon-cancel-circled iconOnly before pointer");
        closeButton.append(closeButtonSRC);
        closeButton.click(function () {
            removeReportComment();
            return false;
        });

        var heading = $("<h1>");
        heading.addClass("overlayItemTitle");
        heading.text(settings.nestedComments.reportCommentText);

        var description = $("<p>");
        description.text(settings.nestedComments.reportHelpText);

        var helpText = $('<p class="help">');
        helpText.text(settings.various.requiredFieldsText);

        var explanationLabel = $("<label>");
        explanationLabel.attr("for", "reportCommentExplanation");
        explanationLabel.text(settings.nestedComments.explanationText + "*");

        var explanationField = $("<textarea>");
        explanationField.attr("id", "reportCommentExplanation");

        var explanationContainer = $("<div>");
        explanationContainer.addClass("field");
        explanationContainer.append(explanationLabel);
        explanationContainer.append(explanationField);

        var toolbar = $("<div>");
        toolbar.addClass("toolbar toolbarBottom show");

        var cancelButton = $("<input>");
        cancelButton.attr("type", "button");
        cancelButton.val(settings.buttons.cancelText);
        cancelButton.click(function () {
            removeReportComment();
        });

        var cancelButtonWrapper = $("<div>");
        cancelButtonWrapper.addClass("button close delete icon-cancel-circled before");
        cancelButtonWrapper.append(cancelButton);

        var sendButton = $("<input>");
        sendButton.attr("type", "button");
        sendButton.val(settings.nestedComments.sendText);
        sendButton.click(function () {
            if (trim(explanationField.val()) == "") {
                $.fn.showError(settings.nestedComments.emptyExplanationText);
                return false;
            }

            reportComment(comment, explanationField.val());
            toolbar.html(buildLoader());
        });

        var sendButtonWrapper = $("<div>");
        sendButtonWrapper.addClass("button general icon-envelope before");
        sendButtonWrapper.append(sendButton);

        toolbar.append(cancelButtonWrapper);
        toolbar.append(sendButtonWrapper);

        var itemContent = $("<div>");
        itemContent.addClass("overlayItemContent");
        itemContent.append(description);
        itemContent.append(helpText);
        itemContent.append(explanationContainer);

        var overlayContent = $("<div>");
        overlayContent.addClass("overlayContent");
        overlayContent.append(closeButton);
        overlayContent.append(heading);
        overlayContent.append(itemContent);
        overlayContent.append(toolbar);

        overlay.append(overlayContent);
        $("#total").append(overlay);
    }

    function buildPlupload() {
        if (!allowFiles || !userLoggedIn) return;

        var more = $("<div>");
        more.addClass("more");

        var moreContent = $("<div>");
        moreContent.addClass("moreContent");

        var uploadContainer = $("<div>");
        uploadContainer.addClass("upload");

        var uploader = $("<div>");
        uploader.addClass("uploader medium");
        uploader.attr({
            "data-plupload-file-type": "commentfiles",
            "data-plupload-extension-types": "image, document",
        });

        var hiddenContainer = $("<div>");
        hiddenContainer.addClass("hide");

        var fileIds = $("<input>");
        fileIds.attr("type", "text");
        fileIds.addClass("pluploadFileIDs");

        var batchId = $("<input>");
        batchId.attr("type", "text");
        batchId.addClass("batchID");
        batchId.val(uuidv4());

        var itemId = $("<input>");
        itemId.attr("type", "text");
        itemId.addClass("itemID");
        itemId.val(settings.section.itemID);

        var commentId = $("<input>");
        commentId.attr("type", "text");
        commentId.addClass("commentID");

        hiddenContainer.append(fileIds);
        hiddenContainer.append(batchId);
        hiddenContainer.append(itemId);
        hiddenContainer.append(commentId);

        uploadContainer.append(uploader);
        uploadContainer.append(hiddenContainer);

        moreContent.append(uploadContainer);
        more.append(moreContent);

        return more;
    }

    function buildFileList(comment) {
        if (!comment.CommentFiles || comment.CommentFiles.length === 0) return;

        var filesContainer = $("<div>");
        filesContainer.addClass("commentFileList");

        for (var index in comment.CommentFiles) {
            var currentFile = comment.CommentFiles[index];
            filesContainer.append(buildFile(comment, currentFile));
        }

        return filesContainer;
    }

    function buildFile(comment, currentFile) {
        var file = $("<div>");
        file.attr({
            id: "commentFile_" + currentFile.FileId,
        });
        file.addClass("commentFile icon-doc-text before clear");

        var fileLink = $("<a>");
        fileLink.attr("href", "/shortcuts/handlerdownloadfiles.ashx?commentFileId=" + currentFile.FileId);
        fileLink.text(currentFile.FileName);

        var deleteFileButton = $("<div>");
        deleteFileButton.addClass("deleteFile button delete transparent icon-cancel iconOnly before");

        var deleteFileButtonInput = $("<input>");
        deleteFileButtonInput.attr({
            "aria-label": settings.nestedComments.deleteFileText + currentFile.FileName,
            title: settings.nestedComments.deleteFileText + currentFile.FileName,
            type: "image",
            src: "/communities/common/themes/mett%20responsive/images/various/transparent.png",
        });
        deleteFileButtonInput.click(function () {
            deleteFile(comment, currentFile);
            return false;
        });

        deleteFileButton.append(deleteFileButtonInput);

        file.append(fileLink);
        file.append(deleteFileButton);

        return file;
    }

    function buildCaptcha() {
        if (userLoggedIn) return;

        if ($("[src*=hcaptcha]").length === 0)
            $("head").append('<script src="//hcaptcha.com/1/api.js&hl=' + settings.language + '"></script>');

        var overlay = $("<div>");
        overlay.addClass("overlay hide");
        overlay.attr({
            id: "captchaOverlay",
            "aria-modal": true,
            role: overlay,
        });
        overlay.click(function (e) {
            if (e.target === overlay[0]) hideCaptchaOverlay();
        });

        var closeButtonSRC = $("<span>");
        closeButtonSRC.addClass("screenReaderContent");
        closeButtonSRC.text(settings.nestedComments.closeReportText);

        var closeButton = $("<a>");
        closeButton.attr("role", "button");
        closeButton.attr("href", "#closeReportOverlay");
        closeButton.addClass("button close info icon-cancel-circled iconOnly before pointer");
        closeButton.append(closeButtonSRC);
        closeButton.click(function () {
            hideCaptchaOverlay();
            return false;
        });

        var heading = $("<h1>");
        heading.addClass("overlayItemTitle");
        heading.text(settings.nestedComments.captchaText);

        var description = $("<p>");
        description.text(settings.nestedComments.captchaHelpText);

        var captchaId = "h-captcha";
        var captcha = $("<div>");
        captcha.addClass("h-captcha");
        captcha.attr({
            id: captchaId,
            "data-sitekey": "4dd31292-4a91-4442-8c76-4544d33192ec",
        });

        var toolbar = $("<div>");
        toolbar.addClass("toolbar toolbarBottom show");

        var sendButton = $("<input>");
        sendButton.attr("type", "button");
        sendButton.val(settings.nestedComments.sendText);
        sendButton.click(function () {
            if (hcaptcha.getResponse() == "") {
                $.fn.showError(settings.nestedComments.emptyCaptchaText);
                return false;
            }

            captchaTarget.click();
            hideCaptchaOverlay();
        });

        var sendButtonWrapper = $("<div>");
        sendButtonWrapper.addClass("button general icon-envelope before");
        sendButtonWrapper.append(sendButton);

        var itemContent = $("<div>");
        itemContent.addClass("overlayItemContent");
        itemContent.append(description);
        itemContent.append(captcha);

        var overlayContent = $("<div>");
        overlayContent.addClass("overlayContent");

        toolbar.append(sendButtonWrapper);

        overlayContent.append(closeButton);
        overlayContent.append(heading);
        overlayContent.append(itemContent);
        overlayContent.append(toolbar);

        overlay.append(overlayContent);
        $("#total").append(overlay);

        setTimeout(function () {
            hcaptcha.render(captchaId, {
                sitekey: "4dd31292-4a91-4442-8c76-4544d33192ec",
            });

            $.fn.initializeAccessibleHCaptcha();
        }, 500);
    }

    function hideCaptchaOverlay() {
        $("#captchaOverlay").addClass("hide");

        captchaTarget.focus();
    }

    function showCaptchaOverlay(target) {
        var overlay = $("#captchaOverlay");

        captchaTarget = target;
        overlay.removeClass("hide");
        overlay.tabGuard();
        overlay.find("[tabindex]:not([tabindex=-1]):visible, button:visible, input:visible, a:visible").first().focus();
    }

    function uuidv4() {
        return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) =>
            (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)
        );
    }

    function deleteFile(comment, file) {
        if (!comment || !file) return;

        var deleteFileFailed = function () {
            $.fn.showError(settings.nestedComments.deleteFileErrorText);
        };

        $.ajax({
            url: "/api/Comments/DeleteCommentFile",
            data: {
                sectionId: settings.section.ID,
                commentId: comment.CommentId,
                fileId: file.FileId,
                token: $('input[name="__RequestVerificationToken"]').val(),
            },
        })
            .done(function (data) {
                if (data != "Comment file deleted") {
                    deleteFileFailed();
                    return;
                }

                $("#commentFile_" + file.FileId).remove();
            })
            .error(function () {
                deleteFileFailed();
            });
    }

    function removeReportComment() {
        $("#reportCommentOverlay").remove();
    }

    function reportComment(comment, explanationText) {
        if (!allowReport || !comment) return;

        if (trim(explanationText).length === 0) return;

        $.ajax({
            url: "/api/Comments/InapropriateComment",
            data: {
                sectionId: settings.section.ID,
                contentPageId: settings.section.itemID,
                commentId: comment.CommentId,
                explanationText: explanationText,
                token: $('input[name="__RequestVerificationToken"]').val(),
            },
        })
            .done(function () {
                $.fn.alert(settings.nestedComments.reportThanksText);
                removeReportComment();
            })
            .error(function () {
                $.fn.showError(settings.nestedComments.reportErrorText);
                removeReportComment();
            });
    }

    function sendEditComment(ckEditor, editComment, plupload) {
        var commentText = ckEditor.getData();
        var pluploader;

        if (!editComment) return;

        if (trim(commentText).length === 0) return;

        if (plupload && plupload.length > 0) pluploader = plupload.find(".uploader").pluploadQueue();

        var sendEditCommentFailed = function () {
            $.fn.showError(settings.nestedComments.changeCommentErrorText);
        };

        $.ajax({
            method: "POST",
            url: "/api/Comments/UpdateComment",
            data: {
                sectionId: settings.section.ID,
                contentPageId: settings.section.itemID,
                contentPageTitle: contentPageTitle,
                commentId: editComment.CommentId,
                commentText: commentText,
                token: $('input[name="__RequestVerificationToken"]').val(),
            },
        })
            .done(function (data) {
                if (data !== "Comment updated") {
                    sendEditCommentFailed();
                    return;
                }

                if (pluploader) {
                    pluploader.bind("UploadComplete", function () {
                        pluploader.destroy();

                        loadComments(editComment.CommentId);
                    });

                    plupload.find(".commentID").val(editComment.CommentId);
                    pluploader.start();
                } else {
                    loadComments(editComment.CommentId);
                }
            })
            .fail(function () {
                sendEditCommentFailed();
            });
    }

    function addComment(ckEditor, replyComment, plupload) {
        var commentText = ckEditor.getData();
        var pluploader;
        var isAnonymous = false;
        var anonymousName = "";
        var anonymousEmail = "";
        var replyUserId = -1;
        var replyCommentId = -1;

        if (plupload && plupload.length > 0) pluploader = plupload.find(".uploader").pluploadQueue();

        if (trim(commentText).length === 0) return;

        var parentCommentId = -1;
        if (replyComment) {
            replyUserId = replyComment.CommentAuthor ? replyComment.CommentAuthor.UserId : -1;
            replyCommentId = replyComment.CommentId;

            if (replyComment.ParentCommentId > 0) parentCommentId = replyComment.ParentCommentId;
            else parentCommentId = replyComment.CommentId;
        }

        var addCommentFaild = function (type) {
            if (type === "captcha") {
                $.fn.showError(settings.nestedComments.captchaErrorText);
                return;
            }

            $.fn.showError(settings.nestedComments.addCommentErrorText);
        };

        if (allowAnonymous || !userLoggedIn) {
            if (userLoggedIn)
                isAnonymous = replyComment
                    ? $("#replyAnonymousToggle").is(":checked")
                    : $("#anonymousToggle").is(":checked");

            anonymousName = replyComment ? trim($("#replyAnonymousName").val()) : trim($("#anonymousName").val());
            anonymousEmail = replyComment ? trim($("#replyAnonymousEmail").val()) : trim($("#anonymousEmail").val());

            if (anonymousName === "") anonymousName = settings.fields.commentNameText;
        }

        $.ajax({
            method: "POST",
            url: "/api/Comments/AddComment",
            data: {
                sectionId: settings.section.ID,
                contentPageId: settings.section.itemID,
                contentPageTitle: contentPageTitle,
                commentText: commentText,
                parentCommentId: parentCommentId,
                isAnonymous: isAnonymous || !userLoggedIn,
                anonymousName: anonymousName,
                anonymousEmail: anonymousEmail,
                replyUserId: replyUserId,
                replyCommentId: replyCommentId,
                captcha: $("#h-captcha").length > 0 ? hcaptcha.getResponse() : undefined,
                token: $('input[name="__RequestVerificationToken"]').val(),
            },
        })
            .done(function (data) {
                if (isNaN(data)) {
                    addCommentFaild();
                    return;
                }

                var newCommentId = parseInt(data);

                ckEditor.setData("");

                if (pluploader) {
                    pluploader.bind("UploadComplete", function () {
                        try {
                            pluploader.destroy();
                        } catch { }

                        if (!replyComment) buildEditor();

                        loadComments(newCommentId);
                    });

                    plupload.find(".commentID").val(newCommentId);
                    pluploader.start();
                } else {
                    if (!replyComment) buildEditor();

                    loadComments(newCommentId);
                }
            })
            .fail(function (data) {
                if (data.responseJSON === "Captcha invalid") {
                    addCommentFaild("captcha");
                    return;
                }

                addCommentFaild();
            });
    }

    function onLoadCommentsError() {
        var errorText = $("<p>");
        errorText.text(settings.nestedComments.getCommentsErrorText);

        var reloadLink = $("<a>");
        reloadLink.attr({
            role: "button",
            href: "#Reload",
            "aria-label": settings.nestedComments.getCommentsRetryText,
        });
        reloadLink.addClass("reloadComments textButton clearBoth inline icon-ccw before");
        reloadLink.text(settings.nestedComments.tryAgainText);
        reloadLink.click(function () {
            loadComments();
            return false;
        });

        var errorContainer = $("<div>");
        errorContainer.addClass("errorContainer comment center");
        errorContainer.append(errorText);
        errorContainer.append(reloadLink);

        commentsContainer.html(errorContainer);
    }

    var theReturnObject = {
        commentsLoaded: function (aHandler) {
            if (aHandler) {
                commentsLoadedHandlers.push(aHandler);

                return;
            }

            for (var index in commentsLoadedHandlers) {
                commentsLoadedHandlers[index]();
            }
        },

        complete: function (aHandler) {
            if (aHandler) {
                completeHandlers.push(aHandler);

                if (initialized) aHandler();

                return;
            }

            for (var index in completeHandlers) {
                completeHandlers[index]();
            }
        },
    };

    init();

    return theReturnObject;
};
;
